From 2564192888738a77de544de1f85f241aa07b2ee5 Mon Sep 17 00:00:00 2001 From: Olivia Linden Date: Sun, 12 Mar 2023 15:21:08 +0100 Subject: [PATCH 1/7] test --- .../tutorial01-stm32-pio-01-02_files_olivia/readme | 1 + 1 file changed, 1 insertion(+) create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_files_olivia/readme diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_files_olivia/readme b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_files_olivia/readme new file mode 100644 index 0000000..892e0d5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_files_olivia/readme @@ -0,0 +1 @@ +# hihi From b9f27efa4fd42986662d936a1aa8f6492d1ddc88 Mon Sep 17 00:00:00 2001 From: Olivia Linden Date: Sat, 18 Mar 2023 13:17:02 +0100 Subject: [PATCH 2/7] add FreeRTOS assignment to git --- .../.gitignore | 8 + .../.metadata/.lock | 0 .../.metadata/.log4j.xml | 18 + .../2.1.500.202211100823 | 0 .../FreeRTOS_LED.1679135758468.pdom | Bin 0 -> 4128768 bytes .../FreeRTOS_LED.language.settings.xml | 1 + .../org.eclipse.cdt.make.core/specs.c | 1 + .../org.eclipse.cdt.make.core/specs.cpp | 1 + .../spec.c | 0 .../spec.cpp | 0 .../39/30e46b3185c5001d13d6fe58f0709e0f | 229 + .../3e/e05e38db7ac5001d13d6fe58f0709e0f | 4 + .../48/c0c0109d80c5001d13d6fe58f0709e0f | 226 + .../52/80848b7d7ec5001d13d6fe58f0709e0f | 226 + .../52/a059856480c5001d13d6fe58f0709e0f | 226 + .../57/00b38daf78c5001d13d6fe58f0709e0f | 3 + .../5c/e082ac857ec5001d13d6fe58f0709e0f | 226 + .../73/9026441f7cc5001d13d6fe58f0709e0f | 250 + .../8f/709053d17ac5001d13d6fe58f0709e0f | 4 + .../9/a06a581285c5001d13d6fe58f0709e0f | 236 + .../a1/90e171dc80c5001d13d6fe58f0709e0f | 232 + .../a5/70e720af78c5001d13d6fe58f0709e0f | 2 + .../bd/7075fe0d7cc5001d13d6fe58f0709e0f | 327 + .../bd/a0bac3217ec5001d13d6fe58f0709e0f | 250 + .../f2/a03d30fb7dc5001d13d6fe58f0709e0f | 249 + .../ff/b0366ba17fc5001d13d6fe58f0709e0f | 226 + .../.indexes/1/ce/ce/c5/ae/properties.index | Bin 0 -> 180 bytes .../FreeRTOS_LED/.indexes/af/history.index | Bin 0 -> 142 bytes .../.indexes/bf/c4/properties.index | Bin 0 -> 134 bytes .../.indexes/d5/7a/c4/properties.index | Bin 0 -> 172 bytes .../FreeRTOS_LED/.indexes/properties.index | Bin 0 -> 348 bytes .../.projects/FreeRTOS_LED/.location | Bin 0 -> 103 bytes .../.projects/FreeRTOS_LED/.markers.snap | Bin 0 -> 365 bytes .../.projects/FreeRTOS_LED/.syncinfo.snap | Bin 0 -> 96 bytes .../.root/.indexes/properties.index | Bin 0 -> 61 bytes .../.root/.markers.snap | Bin 0 -> 112 bytes .../.safetable/org.eclipse.core.resources | Bin 0 -> 1645 bytes .../org.eclipse.core.resources/0.snap | Bin 0 -> 62814 bytes .../com.st.stm32cube.ide.mcu.ide.oss.prefs | 2 + ...rg.eclipse.cdt.core.prj-FreeRTOS_LED.prefs | 16 + .../org.eclipse.cdt.debug.core.prefs | 2 + .../org.eclipse.cdt.managedbuilder.core.prefs | 3 + .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.debug.core.prefs | 6 + .../.settings/org.eclipse.debug.ui.prefs | 3 + .../org.eclipse.launchbar.core.prefs | 7 + .../.settings/org.eclipse.ui.navigator.prefs | 2 + .../.settings/org.eclipse.ui.prefs | 2 + .../.settings/org.eclipse.ui.workbench.prefs | 8 + .../.settings/org.eclipse.urischeme.prefs | 2 + .../launchConfigurationHistory.xml | 23 + .../org.eclipse.e4.workbench/workbench.xmi | 1957 ++ .../org.eclipse.ui.ide/dialog_settings.xml | 6 + .../org.eclipse.ui.workbench/workingsets.xml | 4 + .../.metadata/version.ini | 3 + .../FreeRTOS_LED/.cproject | 182 + .../FreeRTOS_LED/.gitmodules | 6 + .../FreeRTOS_LED/.mxproject | 27 + .../FreeRTOS_LED/.project | 32 + .../.settings/language.settings.xml | 25 + .../.settings/stm32cubeide.project.prefs | 5 + .../FreeRTOS_LED/CMakeLists.txt | 208 + .../FreeRTOS_LED/Core/Inc/FreeRTOSConfig.h | 140 + .../FreeRTOS_LED/Core/Inc/main.h | 83 + .../Core/Inc/stm32f4xx_hal_conf.h | 490 + .../FreeRTOS_LED/Core/Inc/stm32f4xx_it.h | 64 + .../FreeRTOS_LED/Core/Src/freertos.c | 74 + .../FreeRTOS_LED/Core/Src/main.c | 229 + .../FreeRTOS_LED/Core/Src/stm32f4xx_hal_msp.c | 148 + .../FreeRTOS_LED/Core/Src/stm32f4xx_it.c | 187 + .../FreeRTOS_LED/Core/Src/syscalls.c | 176 + .../FreeRTOS_LED/Core/Src/sysmem.c | 79 + .../FreeRTOS_LED/Core/Src/system_stm32f4xx.c | 747 + .../Core/Startup/startup_stm32f446retx.s | 535 + .../FreeRTOS_LED/Debug/Core/Src/freertos.d | 72 + .../FreeRTOS_LED/Debug/Core/Src/freertos.o | Bin 0 -> 1106000 bytes .../FreeRTOS_LED/Debug/Core/Src/freertos.su | 1 + .../FreeRTOS_LED/Debug/Core/Src/main.d | 88 + .../FreeRTOS_LED/Debug/Core/Src/main.o | Bin 0 -> 1125976 bytes .../FreeRTOS_LED/Debug/Core/Src/main.su | 7 + .../Debug/Core/Src/stm32f4xx_hal_msp.d | 54 + .../Debug/Core/Src/stm32f4xx_hal_msp.o | Bin 0 -> 1090100 bytes .../Debug/Core/Src/stm32f4xx_hal_msp.su | 3 + .../Debug/Core/Src/stm32f4xx_it.d | 74 + .../Debug/Core/Src/stm32f4xx_it.o | Bin 0 -> 1106616 bytes .../Debug/Core/Src/stm32f4xx_it.su | 7 + .../FreeRTOS_LED/Debug/Core/Src/subdir.mk | 45 + .../FreeRTOS_LED/Debug/Core/Src/syscalls.d | 1 + .../FreeRTOS_LED/Debug/Core/Src/syscalls.o | Bin 0 -> 76916 bytes .../FreeRTOS_LED/Debug/Core/Src/syscalls.su | 18 + .../FreeRTOS_LED/Debug/Core/Src/sysmem.d | 1 + .../FreeRTOS_LED/Debug/Core/Src/sysmem.o | Bin 0 -> 46588 bytes .../FreeRTOS_LED/Debug/Core/Src/sysmem.su | 1 + .../Debug/Core/Src/system_stm32f4xx.d | 53 + .../Debug/Core/Src/system_stm32f4xx.o | Bin 0 -> 1083604 bytes .../Debug/Core/Src/system_stm32f4xx.su | 2 + .../Core/Startup/startup_stm32f446retx.d | 2 + .../Core/Startup/startup_stm32f446retx.o | Bin 0 -> 7284 bytes .../FreeRTOS_LED/Debug/Core/Startup/subdir.mk | 27 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d | 54 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o | Bin 0 -> 1097424 bytes .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su | 27 + .../Src/stm32f4xx_hal_cortex.d | 54 + .../Src/stm32f4xx_hal_cortex.o | Bin 0 -> 1100620 bytes .../Src/stm32f4xx_hal_cortex.su | 32 + .../Src/stm32f4xx_hal_dma.d | 54 + .../Src/stm32f4xx_hal_dma.o | Bin 0 -> 1095296 bytes .../Src/stm32f4xx_hal_dma.su | 15 + .../Src/stm32f4xx_hal_dma_ex.d | 54 + .../Src/stm32f4xx_hal_dma_ex.o | Bin 0 -> 1092460 bytes .../Src/stm32f4xx_hal_dma_ex.su | 4 + .../Src/stm32f4xx_hal_exti.d | 54 + .../Src/stm32f4xx_hal_exti.o | Bin 0 -> 1086716 bytes .../Src/stm32f4xx_hal_exti.su | 9 + .../Src/stm32f4xx_hal_flash.d | 54 + .../Src/stm32f4xx_hal_flash.o | Bin 0 -> 1090936 bytes .../Src/stm32f4xx_hal_flash.su | 17 + .../Src/stm32f4xx_hal_flash_ex.d | 54 + .../Src/stm32f4xx_hal_flash_ex.o | Bin 0 -> 1093972 bytes .../Src/stm32f4xx_hal_flash_ex.su | 22 + .../Src/stm32f4xx_hal_flash_ramfunc.d | 54 + .../Src/stm32f4xx_hal_flash_ramfunc.o | Bin 0 -> 1082908 bytes .../Src/stm32f4xx_hal_flash_ramfunc.su | 4 + .../Src/stm32f4xx_hal_gpio.d | 54 + .../Src/stm32f4xx_hal_gpio.o | Bin 0 -> 1088444 bytes .../Src/stm32f4xx_hal_gpio.su | 8 + .../Src/stm32f4xx_hal_pwr.d | 54 + .../Src/stm32f4xx_hal_pwr.o | Bin 0 -> 1089492 bytes .../Src/stm32f4xx_hal_pwr.su | 17 + .../Src/stm32f4xx_hal_pwr_ex.d | 54 + .../Src/stm32f4xx_hal_pwr_ex.o | Bin 0 -> 1087908 bytes .../Src/stm32f4xx_hal_pwr_ex.su | 9 + .../Src/stm32f4xx_hal_rcc.d | 54 + .../Src/stm32f4xx_hal_rcc.o | Bin 0 -> 1094736 bytes .../Src/stm32f4xx_hal_rcc.su | 14 + .../Src/stm32f4xx_hal_rcc_ex.d | 54 + .../Src/stm32f4xx_hal_rcc_ex.o | Bin 0 -> 1100468 bytes .../Src/stm32f4xx_hal_rcc_ex.su | 12 + .../Src/stm32f4xx_hal_tim.d | 54 + .../Src/stm32f4xx_hal_tim.o | Bin 0 -> 1079400 bytes .../Src/stm32f4xx_hal_tim.su | 0 .../Src/stm32f4xx_hal_tim_ex.d | 54 + .../Src/stm32f4xx_hal_tim_ex.o | Bin 0 -> 1079408 bytes .../Src/stm32f4xx_hal_tim_ex.su | 0 .../Src/stm32f4xx_hal_uart.d | 54 + .../Src/stm32f4xx_hal_uart.o | Bin 0 -> 1139088 bytes .../Src/stm32f4xx_hal_uart.su | 61 + .../STM32F4xx_HAL_Driver/Src/subdir.mk | 72 + .../FreeRTOS_LED/Debug/FreeRTOS_LED.elf | Bin 0 -> 1237148 bytes .../FreeRTOS_LED/Debug/FreeRTOS_LED.list | 8005 ++++++++ .../FreeRTOS_LED/Debug/FreeRTOS_LED.map | 4459 +++++ .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d | 38 + .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o | Bin 0 -> 127384 bytes .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su | 56 + .../FreeRTOS/Source/CMSIS_RTOS/subdir.mk | 27 + .../Third_Party/FreeRTOS/Source/croutine.d | 22 + .../Third_Party/FreeRTOS/Source/croutine.o | Bin 0 -> 55704 bytes .../Third_Party/FreeRTOS/Source/croutine.su | 0 .../FreeRTOS/Source/event_groups.d | 28 + .../FreeRTOS/Source/event_groups.o | Bin 0 -> 90888 bytes .../FreeRTOS/Source/event_groups.su | 11 + .../Third_Party/FreeRTOS/Source/list.d | 18 + .../Third_Party/FreeRTOS/Source/list.o | Bin 0 -> 75632 bytes .../Third_Party/FreeRTOS/Source/list.su | 5 + .../Source/portable/GCC/ARM_CM4F/port.d | 20 + .../Source/portable/GCC/ARM_CM4F/port.o | Bin 0 -> 65768 bytes .../Source/portable/GCC/ARM_CM4F/port.su | 13 + .../Source/portable/GCC/ARM_CM4F/subdir.mk | 27 + .../FreeRTOS/Source/portable/MemMang/heap_4.d | 20 + .../FreeRTOS/Source/portable/MemMang/heap_4.o | Bin 0 -> 84020 bytes .../Source/portable/MemMang/heap_4.su | 8 + .../Source/portable/MemMang/subdir.mk | 27 + .../Third_Party/FreeRTOS/Source/queue.d | 24 + .../Third_Party/FreeRTOS/Source/queue.o | Bin 0 -> 110612 bytes .../Third_Party/FreeRTOS/Source/queue.su | 30 + .../FreeRTOS/Source/stream_buffer.d | 22 + .../FreeRTOS/Source/stream_buffer.o | Bin 0 -> 99848 bytes .../FreeRTOS/Source/stream_buffer.su | 22 + .../Third_Party/FreeRTOS/Source/subdir.mk | 45 + .../Third_Party/FreeRTOS/Source/tasks.d | 26 + .../Third_Party/FreeRTOS/Source/tasks.o | Bin 0 -> 130588 bytes .../Third_Party/FreeRTOS/Source/tasks.su | 52 + .../Third_Party/FreeRTOS/Source/timers.d | 26 + .../Third_Party/FreeRTOS/Source/timers.o | Bin 0 -> 79620 bytes .../Third_Party/FreeRTOS/Source/timers.su | 0 .../FreeRTOS_LED/Debug/makefile | 98 + .../FreeRTOS_LED/Debug/objects.list | 34 + .../FreeRTOS_LED/Debug/objects.mk | 9 + .../FreeRTOS_LED/Debug/sources.mk | 31 + .../Device/ST/STM32F4xx/Include/stm32f446xx.h | 15981 ++++++++++++++++ .../Device/ST/STM32F4xx/Include/stm32f4xx.h | 301 + .../ST/STM32F4xx/Include/system_stm32f4xx.h | 104 + .../CMSIS/Device/ST/STM32F4xx/LICENSE.txt | 6 + .../Drivers/CMSIS/Include/cmsis_armcc.h | 865 + .../Drivers/CMSIS/Include/cmsis_armclang.h | 1869 ++ .../Drivers/CMSIS/Include/cmsis_compiler.h | 266 + .../Drivers/CMSIS/Include/cmsis_gcc.h | 2085 ++ .../Drivers/CMSIS/Include/cmsis_iccarm.h | 935 + .../Drivers/CMSIS/Include/cmsis_version.h | 39 + .../Drivers/CMSIS/Include/core_armv8mbl.h | 1918 ++ .../Drivers/CMSIS/Include/core_armv8mml.h | 2927 +++ .../Drivers/CMSIS/Include/core_cm0.h | 949 + .../Drivers/CMSIS/Include/core_cm0plus.h | 1083 ++ .../Drivers/CMSIS/Include/core_cm1.h | 976 + .../Drivers/CMSIS/Include/core_cm23.h | 1993 ++ .../Drivers/CMSIS/Include/core_cm3.h | 1941 ++ .../Drivers/CMSIS/Include/core_cm33.h | 3002 +++ .../Drivers/CMSIS/Include/core_cm4.h | 2129 ++ .../Drivers/CMSIS/Include/core_cm7.h | 2671 +++ .../Drivers/CMSIS/Include/core_sc000.h | 1022 + .../Drivers/CMSIS/Include/core_sc300.h | 1915 ++ .../Drivers/CMSIS/Include/mpu_armv7.h | 270 + .../Drivers/CMSIS/Include/mpu_armv8.h | 333 + .../Drivers/CMSIS/Include/tz_context.h | 70 + .../FreeRTOS_LED/Drivers/CMSIS/LICENSE.txt | 201 + .../Inc/Legacy/stm32_hal_legacy.h | 4014 ++++ .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 297 + .../Inc/stm32f4xx_hal_cortex.h | 407 + .../Inc/stm32f4xx_hal_def.h | 210 + .../Inc/stm32f4xx_hal_dma.h | 802 + .../Inc/stm32f4xx_hal_dma_ex.h | 102 + .../Inc/stm32f4xx_hal_exti.h | 366 + .../Inc/stm32f4xx_hal_flash.h | 425 + .../Inc/stm32f4xx_hal_flash_ex.h | 1063 + .../Inc/stm32f4xx_hal_flash_ramfunc.h | 76 + .../Inc/stm32f4xx_hal_gpio.h | 325 + .../Inc/stm32f4xx_hal_gpio_ex.h | 1590 ++ .../Inc/stm32f4xx_hal_pwr.h | 427 + .../Inc/stm32f4xx_hal_pwr_ex.h | 340 + .../Inc/stm32f4xx_hal_rcc.h | 1459 ++ .../Inc/stm32f4xx_hal_rcc_ex.h | 7111 +++++++ .../Inc/stm32f4xx_hal_tim.h | 2146 +++ .../Inc/stm32f4xx_hal_tim_ex.h | 354 + .../Inc/stm32f4xx_hal_uart.h | 884 + .../Inc/stm32f4xx_ll_bus.h | 2105 ++ .../Inc/stm32f4xx_ll_cortex.h | 637 + .../Inc/stm32f4xx_ll_dma.h | 2868 +++ .../Inc/stm32f4xx_ll_exti.h | 954 + .../Inc/stm32f4xx_ll_gpio.h | 981 + .../Inc/stm32f4xx_ll_pwr.h | 985 + .../Inc/stm32f4xx_ll_rcc.h | 7096 +++++++ .../Inc/stm32f4xx_ll_system.h | 1711 ++ .../Inc/stm32f4xx_ll_usart.h | 2521 +++ .../Inc/stm32f4xx_ll_utils.h | 307 + .../Drivers/STM32F4xx_HAL_Driver/LICENSE.txt | 6 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 615 + .../Src/stm32f4xx_hal_cortex.c | 502 + .../Src/stm32f4xx_hal_dma.c | 1305 ++ .../Src/stm32f4xx_hal_dma_ex.c | 313 + .../Src/stm32f4xx_hal_exti.c | 547 + .../Src/stm32f4xx_hal_flash.c | 775 + .../Src/stm32f4xx_hal_flash_ex.c | 1347 ++ .../Src/stm32f4xx_hal_flash_ramfunc.c | 172 + .../Src/stm32f4xx_hal_gpio.c | 533 + .../Src/stm32f4xx_hal_pwr.c | 571 + .../Src/stm32f4xx_hal_pwr_ex.c | 600 + .../Src/stm32f4xx_hal_rcc.c | 1122 ++ .../Src/stm32f4xx_hal_rcc_ex.c | 3784 ++++ .../Src/stm32f4xx_hal_tim.c | 7621 ++++++++ .../Src/stm32f4xx_hal_tim_ex.c | 2428 +++ .../Src/stm32f4xx_hal_uart.c | 3751 ++++ .../FreeRTOS_LED/FreeRTOS_LED.ioc | 184 + .../FreeRTOS_LED/FreeRTOS_LED.launch | 77 + .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c | 1727 ++ .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h | 1026 + .../Third_Party/FreeRTOS/Source/LICENSE | 18 + .../Third_Party/FreeRTOS/Source/croutine.c | 353 + .../FreeRTOS/Source/event_groups.c | 753 + .../FreeRTOS/Source/include/FreeRTOS.h | 1295 ++ .../FreeRTOS/Source/include/StackMacros.h | 133 + .../FreeRTOS/Source/include/atomic.h | 414 + .../FreeRTOS/Source/include/croutine.h | 720 + .../Source/include/deprecated_definitions.h | 279 + .../FreeRTOS/Source/include/event_groups.h | 757 + .../FreeRTOS/Source/include/list.h | 412 + .../FreeRTOS/Source/include/message_buffer.h | 803 + .../FreeRTOS/Source/include/mpu_prototypes.h | 160 + .../FreeRTOS/Source/include/mpu_wrappers.h | 189 + .../FreeRTOS/Source/include/portable.h | 199 + .../FreeRTOS/Source/include/projdefs.h | 124 + .../FreeRTOS/Source/include/queue.h | 1655 ++ .../FreeRTOS/Source/include/semphr.h | 1140 ++ .../FreeRTOS/Source/include/stack_macros.h | 129 + .../FreeRTOS/Source/include/stream_buffer.h | 859 + .../FreeRTOS/Source/include/task.h | 2543 +++ .../FreeRTOS/Source/include/timers.h | 1309 ++ .../Third_Party/FreeRTOS/Source/list.c | 198 + .../Source/portable/GCC/ARM_CM4F/port.c | 775 + .../Source/portable/GCC/ARM_CM4F/portmacro.h | 243 + .../FreeRTOS/Source/portable/MemMang/heap_4.c | 492 + .../Third_Party/FreeRTOS/Source/queue.c | 2945 +++ .../FreeRTOS/Source/stream_buffer.c | 1263 ++ .../Third_Party/FreeRTOS/Source/tasks.c | 5310 +++++ .../Third_Party/FreeRTOS/Source/timers.c | 1127 ++ .../FreeRTOS_LED/STM32F446RETX_FLASH.ld | 185 + .../FreeRTOS_LED/STM32F446RETX_RAM.ld | 185 + .../FreeRTOS_LED/croutine.c | 363 + .../FreeRTOS_LED/event_groups.c | 778 + .../FreeRTOS_LED/include/FreeRTOS.h | 1440 ++ .../FreeRTOS_LED/include/StackMacros.h | 34 + .../FreeRTOS_LED/include/atomic.h | 419 + .../FreeRTOS_LED/include/croutine.h | 753 + .../include/deprecated_definitions.h | 281 + .../FreeRTOS_LED/include/event_groups.h | 783 + .../FreeRTOS_LED/include/list.h | 503 + .../FreeRTOS_LED/include/message_buffer.h | 856 + .../FreeRTOS_LED/include/mpu_prototypes.h | 264 + .../FreeRTOS_LED/include/mpu_wrappers.h | 184 + .../FreeRTOS_LED/include/portable.h | 238 + .../FreeRTOS_LED/include/projdefs.h | 122 + .../FreeRTOS_LED/include/queue.h | 1722 ++ .../FreeRTOS_LED/include/semphr.h | 1193 ++ .../FreeRTOS_LED/include/stack_macros.h | 137 + .../FreeRTOS_LED/include/stdint.readme | 58 + .../FreeRTOS_LED/include/stream_buffer.h | 913 + .../FreeRTOS_LED/include/task.h | 3118 +++ .../FreeRTOS_LED/include/timers.h | 1369 ++ .../FreeRTOS_LED/list.c | 226 + .../FreeRTOS_LED/manifest.yml | 4 + .../portable/ARMClang/Use-the-GCC-ports.txt | 2 + .../FreeRTOS_LED/portable/ARMv8M/ReadMe.txt | 11 + .../portable/ARMv8M/copy_files.py | 152 + .../portable/ARMv8M/non_secure/ReadMe.txt | 11 + .../portable/ARMv8M/non_secure/port.c | 1261 ++ .../portable/GCC/ARM_CM23/portasm.c | 478 + .../portable/GCC/ARM_CM23/portmacro.h | 71 + .../portable/GCC/ARM_CM23_NTZ/portasm.c | 381 + .../portable/GCC/ARM_CM23_NTZ/portmacro.h | 71 + .../portable/GCC/ARM_CM33/portasm.c | 470 + .../portable/GCC/ARM_CM33/portmacro.h | 66 + .../portable/GCC/ARM_CM33_NTZ/portasm.c | 365 + .../portable/GCC/ARM_CM33_NTZ/portmacro.h | 66 + .../portable/GCC/ARM_CM55/portmacro.h | 71 + .../portable/GCC/ARM_CM85/portmacro.h | 71 + .../portable/IAR/ARM_CM23/portasm.s | 391 + .../portable/IAR/ARM_CM23/portmacro.h | 78 + .../portable/IAR/ARM_CM23_NTZ/portasm.s | 310 + .../portable/IAR/ARM_CM23_NTZ/portmacro.h | 78 + .../portable/IAR/ARM_CM33/portasm.s | 353 + .../portable/IAR/ARM_CM33/portmacro.h | 78 + .../portable/IAR/ARM_CM33_NTZ/portasm.s | 262 + .../portable/IAR/ARM_CM33_NTZ/portmacro.h | 78 + .../portable/IAR/ARM_CM55/portmacro.h | 83 + .../portable/IAR/ARM_CM85/portmacro.h | 83 + .../portable/ARMv8M/non_secure/portasm.h | 114 + .../ARMv8M/non_secure/portmacrocommon.h | 311 + .../portable/ARMv8M/secure/ReadMe.txt | 11 + .../GCC/ARM_CM23/secure_context_port.c | 99 + .../GCC/ARM_CM33/secure_context_port.c | 97 + .../IAR/ARM_CM23/secure_context_port_asm.s | 88 + .../IAR/ARM_CM33/secure_context_port_asm.s | 86 + .../ARMv8M/secure/context/secure_context.c | 351 + .../ARMv8M/secure/context/secure_context.h | 135 + .../portable/ARMv8M/secure/heap/secure_heap.c | 454 + .../portable/ARMv8M/secure/heap/secure_heap.h | 66 + .../portable/ARMv8M/secure/init/secure_init.c | 106 + .../portable/ARMv8M/secure/init/secure_init.h | 54 + .../ARMv8M/secure/macros/secure_port_macros.h | 140 + .../portable/BCC/16BitDOS/Flsh186/port.c | 245 + .../portable/BCC/16BitDOS/Flsh186/prtmacro.h | 98 + .../portable/BCC/16BitDOS/PC/port.c | 289 + .../portable/BCC/16BitDOS/PC/prtmacro.h | 98 + .../portable/BCC/16BitDOS/common/portasm.h | 88 + .../portable/BCC/16BitDOS/common/portcomn.c | 121 + .../FreeRTOS_LED/portable/CCS/ARM_CM3/port.c | 663 + .../portable/CCS/ARM_CM3/portasm.asm | 145 + .../portable/CCS/ARM_CM3/portmacro.h | 171 + .../FreeRTOS_LED/portable/CCS/ARM_CM4F/port.c | 688 + .../portable/CCS/ARM_CM4F/portasm.asm | 172 + .../portable/CCS/ARM_CM4F/portmacro.h | 165 + .../portable/CCS/ARM_Cortex-R4/port.c | 313 + .../portable/CCS/ARM_Cortex-R4/portASM.asm | 230 + .../portable/CCS/ARM_Cortex-R4/portmacro.h | 118 + .../portable/CCS/MSP430X/data_model.h | 54 + .../FreeRTOS_LED/portable/CCS/MSP430X/port.c | 188 + .../portable/CCS/MSP430X/portext.asm | 160 + .../portable/CCS/MSP430X/portmacro.h | 144 + .../FreeRTOS_LED/portable/CMakeLists.txt | 994 + .../portable/CodeWarrior/ColdFire_V1/port.c | 184 + .../CodeWarrior/ColdFire_V1/portasm.S | 131 + .../CodeWarrior/ColdFire_V1/portmacro.h | 113 + .../portable/CodeWarrior/ColdFire_V2/port.c | 148 + .../CodeWarrior/ColdFire_V2/portasm.S | 131 + .../CodeWarrior/ColdFire_V2/portmacro.h | 112 + .../portable/CodeWarrior/HCS12/port.c | 238 + .../portable/CodeWarrior/HCS12/portmacro.h | 203 + .../portable/Common/mpu_wrappers.c | 2541 +++ .../portable/GCC/ARM7_AT91FR40008/port.c | 239 + .../portable/GCC/ARM7_AT91FR40008/portISR.c | 234 + .../portable/GCC/ARM7_AT91FR40008/portmacro.h | 256 + .../GCC/ARM7_AT91SAM7S/AT91SAM7X256.h | 2731 +++ .../GCC/ARM7_AT91SAM7S/ioat91sam7x256.h | 4698 +++++ .../GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c | 51 + .../GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h | 4558 +++++ .../portable/GCC/ARM7_AT91SAM7S/port.c | 214 + .../portable/GCC/ARM7_AT91SAM7S/portISR.c | 228 + .../portable/GCC/ARM7_AT91SAM7S/portmacro.h | 250 + .../portable/GCC/ARM7_LPC2000/port.c | 222 + .../portable/GCC/ARM7_LPC2000/portISR.c | 216 + .../portable/GCC/ARM7_LPC2000/portmacro.h | 227 + .../portable/GCC/ARM7_LPC23xx/port.c | 234 + .../portable/GCC/ARM7_LPC23xx/portISR.c | 219 + .../portable/GCC/ARM7_LPC23xx/portmacro.h | 250 + .../portable/GCC/ARM_CA53_64_BIT/port.c | 519 + .../portable/GCC/ARM_CA53_64_BIT/portASM.S | 432 + .../portable/GCC/ARM_CA53_64_BIT/portmacro.h | 212 + .../portable/GCC/ARM_CA53_64_BIT_SRE/port.c | 459 + .../GCC/ARM_CA53_64_BIT_SRE/portASM.S | 421 + .../GCC/ARM_CA53_64_BIT_SRE/portmacro.h | 197 + .../FreeRTOS_LED/portable/GCC/ARM_CA9/port.c | 570 + .../portable/GCC/ARM_CA9/portASM.S | 324 + .../portable/GCC/ARM_CA9/portmacro.h | 209 + .../FreeRTOS_LED/portable/GCC/ARM_CM0/port.c | 633 + .../portable/GCC/ARM_CM0/portmacro.h | 125 + .../portable/GCC/ARM_CM23/non_secure/port.c | 1261 ++ .../GCC/ARM_CM23/non_secure/portasm.c | 478 + .../GCC/ARM_CM23/non_secure/portasm.h | 114 + .../GCC/ARM_CM23/non_secure/portmacro.h | 71 + .../GCC/ARM_CM23/non_secure/portmacrocommon.h | 311 + .../GCC/ARM_CM23/secure/secure_context.c | 351 + .../GCC/ARM_CM23/secure/secure_context.h | 135 + .../GCC/ARM_CM23/secure/secure_context_port.c | 99 + .../GCC/ARM_CM23/secure/secure_heap.c | 454 + .../GCC/ARM_CM23/secure/secure_heap.h | 66 + .../GCC/ARM_CM23/secure/secure_init.c | 106 + .../GCC/ARM_CM23/secure/secure_init.h | 54 + .../GCC/ARM_CM23/secure/secure_port_macros.h | 140 + .../GCC/ARM_CM23_NTZ/non_secure/port.c | 1261 ++ .../GCC/ARM_CM23_NTZ/non_secure/portasm.c | 381 + .../GCC/ARM_CM23_NTZ/non_secure/portasm.h | 114 + .../GCC/ARM_CM23_NTZ/non_secure/portmacro.h | 71 + .../ARM_CM23_NTZ/non_secure/portmacrocommon.h | 311 + .../FreeRTOS_LED/portable/GCC/ARM_CM3/port.c | 761 + .../portable/GCC/ARM_CM3/portmacro.h | 247 + .../portable/GCC/ARM_CM33/non_secure/port.c | 1261 ++ .../GCC/ARM_CM33/non_secure/portasm.c | 470 + .../GCC/ARM_CM33/non_secure/portasm.h | 114 + .../GCC/ARM_CM33/non_secure/portmacro.h | 66 + .../GCC/ARM_CM33/non_secure/portmacrocommon.h | 311 + .../GCC/ARM_CM33/secure/secure_context.c | 351 + .../GCC/ARM_CM33/secure/secure_context.h | 135 + .../GCC/ARM_CM33/secure/secure_context_port.c | 97 + .../GCC/ARM_CM33/secure/secure_heap.c | 454 + .../GCC/ARM_CM33/secure/secure_heap.h | 66 + .../GCC/ARM_CM33/secure/secure_init.c | 106 + .../GCC/ARM_CM33/secure/secure_init.h | 54 + .../GCC/ARM_CM33/secure/secure_port_macros.h | 140 + .../GCC/ARM_CM33_NTZ/non_secure/port.c | 1261 ++ .../GCC/ARM_CM33_NTZ/non_secure/portasm.c | 365 + .../GCC/ARM_CM33_NTZ/non_secure/portasm.h | 114 + .../GCC/ARM_CM33_NTZ/non_secure/portmacro.h | 66 + .../ARM_CM33_NTZ/non_secure/portmacrocommon.h | 311 + .../portable/GCC/ARM_CM3_MPU/port.c | 921 + .../portable/GCC/ARM_CM3_MPU/portmacro.h | 309 + .../FreeRTOS_LED/portable/GCC/ARM_CM4F/port.c | 839 + .../portable/GCC/ARM_CM4F/portmacro.h | 245 + .../portable/GCC/ARM_CM4_MPU/port.c | 1044 + .../portable/GCC/ARM_CM4_MPU/portmacro.h | 414 + .../portable/GCC/ARM_CM55/non_secure/port.c | 1261 ++ .../GCC/ARM_CM55/non_secure/portasm.c | 470 + .../GCC/ARM_CM55/non_secure/portasm.h | 114 + .../GCC/ARM_CM55/non_secure/portmacro.h | 71 + .../GCC/ARM_CM55/non_secure/portmacrocommon.h | 311 + .../GCC/ARM_CM55/secure/secure_context.c | 351 + .../GCC/ARM_CM55/secure/secure_context.h | 135 + .../GCC/ARM_CM55/secure/secure_context_port.c | 97 + .../GCC/ARM_CM55/secure/secure_heap.c | 454 + .../GCC/ARM_CM55/secure/secure_heap.h | 66 + .../GCC/ARM_CM55/secure/secure_init.c | 106 + .../GCC/ARM_CM55/secure/secure_init.h | 54 + .../GCC/ARM_CM55/secure/secure_port_macros.h | 140 + .../GCC/ARM_CM55_NTZ/non_secure/port.c | 1261 ++ .../GCC/ARM_CM55_NTZ/non_secure/portasm.c | 365 + .../GCC/ARM_CM55_NTZ/non_secure/portasm.h | 114 + .../GCC/ARM_CM55_NTZ/non_secure/portmacro.h | 71 + .../ARM_CM55_NTZ/non_secure/portmacrocommon.h | 311 + .../portable/GCC/ARM_CM7/ReadMe.txt | 18 + .../portable/GCC/ARM_CM7/r0p1/port.c | 829 + .../portable/GCC/ARM_CM7/r0p1/portmacro.h | 249 + .../portable/GCC/ARM_CM85/non_secure/port.c | 1261 ++ .../GCC/ARM_CM85/non_secure/portasm.c | 470 + .../GCC/ARM_CM85/non_secure/portasm.h | 114 + .../GCC/ARM_CM85/non_secure/portmacro.h | 71 + .../GCC/ARM_CM85/non_secure/portmacrocommon.h | 311 + .../GCC/ARM_CM85/secure/secure_context.c | 351 + .../GCC/ARM_CM85/secure/secure_context.h | 135 + .../GCC/ARM_CM85/secure/secure_context_port.c | 97 + .../GCC/ARM_CM85/secure/secure_heap.c | 454 + .../GCC/ARM_CM85/secure/secure_heap.h | 66 + .../GCC/ARM_CM85/secure/secure_init.c | 106 + .../GCC/ARM_CM85/secure/secure_init.h | 54 + .../GCC/ARM_CM85/secure/secure_port_macros.h | 140 + .../GCC/ARM_CM85_NTZ/non_secure/port.c | 1261 ++ .../GCC/ARM_CM85_NTZ/non_secure/portasm.c | 365 + .../GCC/ARM_CM85_NTZ/non_secure/portasm.h | 114 + .../GCC/ARM_CM85_NTZ/non_secure/portmacro.h | 71 + .../ARM_CM85_NTZ/non_secure/portmacrocommon.h | 311 + .../FreeRTOS_LED/portable/GCC/ARM_CR5/port.c | 596 + .../portable/GCC/ARM_CR5/portASM.S | 318 + .../portable/GCC/ARM_CR5/portmacro.h | 204 + .../portable/GCC/ARM_CRx_No_GIC/port.c | 320 + .../portable/GCC/ARM_CRx_No_GIC/portASM.S | 265 + .../portable/GCC/ARM_CRx_No_GIC/portmacro.h | 182 + .../portable/GCC/ATMega323/port.c | 427 + .../portable/GCC/ATMega323/portmacro.h | 110 + .../portable/GCC/AVR32_UC3/exception.S | 327 + .../portable/GCC/AVR32_UC3/port.c | 464 + .../portable/GCC/AVR32_UC3/portmacro.h | 696 + .../portable/GCC/AVR_AVRDx/README.md | 1 + .../portable/GCC/AVR_Mega0/README.md | 1 + .../portable/GCC/CORTUS_APS3/port.c | 146 + .../portable/GCC/CORTUS_APS3/portmacro.h | 153 + .../portable/GCC/ColdFire_V2/port.c | 135 + .../portable/GCC/ColdFire_V2/portasm.S | 121 + .../portable/GCC/ColdFire_V2/portmacro.h | 112 + .../FreeRTOS_LED/portable/GCC/H8S2329/port.c | 304 + .../portable/GCC/H8S2329/portmacro.h | 139 + .../FreeRTOS_LED/portable/GCC/HCS12/port.c | 238 + .../portable/GCC/HCS12/portmacro.h | 247 + .../portable/GCC/IA32_flat/ISR_Support.h | 128 + .../portable/GCC/IA32_flat/port.c | 687 + .../portable/GCC/IA32_flat/portASM.S | 275 + .../portable/GCC/IA32_flat/portmacro.h | 292 + .../portable/GCC/MCF5235/readme.md | 2 + .../portable/GCC/MSP430F449/port.c | 329 + .../portable/GCC/MSP430F449/portmacro.h | 128 + .../portable/GCC/MicroBlaze/port.c | 330 + .../portable/GCC/MicroBlaze/portasm.s | 198 + .../portable/GCC/MicroBlaze/portmacro.h | 127 + .../portable/GCC/MicroBlazeV8/port.c | 452 + .../GCC/MicroBlazeV8/port_exceptions.c | 283 + .../portable/GCC/MicroBlazeV8/portasm.S | 329 + .../portable/GCC/MicroBlazeV8/portmacro.h | 370 + .../portable/GCC/MicroBlazeV9/port.c | 490 + .../GCC/MicroBlazeV9/port_exceptions.c | 283 + .../portable/GCC/MicroBlazeV9/portasm.S | 376 + .../portable/GCC/MicroBlazeV9/portmacro.h | 375 + .../FreeRTOS_LED/portable/GCC/NiosII/port.c | 209 + .../portable/GCC/NiosII/port_asm.S | 140 + .../portable/GCC/NiosII/portmacro.h | 110 + .../portable/GCC/PPC405_Xilinx/FPU_Macros.h | 46 + .../portable/GCC/PPC405_Xilinx/port.c | 261 + .../portable/GCC/PPC405_Xilinx/portasm.S | 383 + .../portable/GCC/PPC405_Xilinx/portmacro.h | 119 + .../portable/GCC/PPC440_Xilinx/FPU_Macros.h | 46 + .../portable/GCC/PPC440_Xilinx/port.c | 261 + .../portable/GCC/PPC440_Xilinx/portasm.S | 383 + .../portable/GCC/PPC440_Xilinx/portmacro.h | 119 + .../portable/GCC/RISC-V/Documentation.url | 5 + ...freertos_risc_v_chip_specific_extensions.h | 108 + ...freertos_risc_v_chip_specific_extensions.h | 69 + ...freertos_risc_v_chip_specific_extensions.h | 69 + ...freertos_risc_v_chip_specific_extensions.h | 69 + .../chip_specific_extensions/readme.txt | 23 + .../FreeRTOS_LED/portable/GCC/RISC-V/port.c | 203 + .../portable/GCC/RISC-V/portASM.S | 384 + .../portable/GCC/RISC-V/portContext.h | 192 + .../portable/GCC/RISC-V/portmacro.h | 191 + .../portable/GCC/RISC-V/readme.txt | 23 + .../portable/GCC/RL78/isr_support.h | 127 + .../FreeRTOS_LED/portable/GCC/RL78/port.c | 212 + .../FreeRTOS_LED/portable/GCC/RL78/portasm.S | 81 + .../portable/GCC/RL78/portmacro.h | 122 + .../FreeRTOS_LED/portable/GCC/RX100/port.c | 701 + .../portable/GCC/RX100/portmacro.h | 150 + .../portable/GCC/RX100/readme.txt | 72 + .../FreeRTOS_LED/portable/GCC/RX200/port.c | 436 + .../portable/GCC/RX200/portmacro.h | 145 + .../FreeRTOS_LED/portable/GCC/RX600/port.c | 389 + .../portable/GCC/RX600/portmacro.h | 145 + .../portable/GCC/RX600/readme.txt | 72 + .../FreeRTOS_LED/portable/GCC/RX600v2/port.c | 433 + .../portable/GCC/RX600v2/portmacro.h | 145 + .../portable/GCC/RX600v2/readme.txt | 72 + .../portable/GCC/RX700v3_DPFPU/port.c | 622 + .../portable/GCC/RX700v3_DPFPU/portmacro.h | 187 + .../portable/GCC/RX700v3_DPFPU/readme.txt | 72 + .../FreeRTOS_LED/portable/GCC/STR75x/port.c | 198 + .../portable/GCC/STR75x/portISR.c | 183 + .../portable/GCC/STR75x/portmacro.h | 142 + .../portable/GCC/TriCore_1782/port.c | 542 + .../portable/GCC/TriCore_1782/portmacro.h | 174 + .../portable/GCC/TriCore_1782/porttrap.c | 282 + .../portable/IAR/78K0R/ISR_Support.h | 83 + .../FreeRTOS_LED/portable/IAR/78K0R/port.c | 226 + .../portable/IAR/78K0R/portasm.s26 | 139 + .../portable/IAR/78K0R/portmacro.h | 146 + .../portable/IAR/ARM_CA5_No_GIC/port.c | 301 + .../portable/IAR/ARM_CA5_No_GIC/portASM.h | 114 + .../portable/IAR/ARM_CA5_No_GIC/portASM.s | 177 + .../portable/IAR/ARM_CA5_No_GIC/portmacro.h | 163 + .../FreeRTOS_LED/portable/IAR/ARM_CA9/port.c | 440 + .../portable/IAR/ARM_CA9/portASM.h | 116 + .../portable/IAR/ARM_CA9/portASM.s | 178 + .../portable/IAR/ARM_CA9/portmacro.h | 210 + .../FreeRTOS_LED/portable/IAR/ARM_CM0/port.c | 498 + .../portable/IAR/ARM_CM0/portasm.s | 132 + .../portable/IAR/ARM_CM0/portmacro.h | 128 + .../portable/IAR/ARM_CM23/non_secure/port.c | 1261 ++ .../IAR/ARM_CM23/non_secure/portasm.h | 114 + .../IAR/ARM_CM23/non_secure/portasm.s | 391 + .../IAR/ARM_CM23/non_secure/portmacro.h | 78 + .../IAR/ARM_CM23/non_secure/portmacrocommon.h | 311 + .../IAR/ARM_CM23/secure/secure_context.c | 351 + .../IAR/ARM_CM23/secure/secure_context.h | 135 + .../ARM_CM23/secure/secure_context_port_asm.s | 88 + .../IAR/ARM_CM23/secure/secure_heap.c | 454 + .../IAR/ARM_CM23/secure/secure_heap.h | 66 + .../IAR/ARM_CM23/secure/secure_init.c | 106 + .../IAR/ARM_CM23/secure/secure_init.h | 54 + .../IAR/ARM_CM23/secure/secure_port_macros.h | 140 + .../IAR/ARM_CM23_NTZ/non_secure/port.c | 1261 ++ .../IAR/ARM_CM23_NTZ/non_secure/portasm.h | 114 + .../IAR/ARM_CM23_NTZ/non_secure/portasm.s | 310 + .../IAR/ARM_CM23_NTZ/non_secure/portmacro.h | 78 + .../ARM_CM23_NTZ/non_secure/portmacrocommon.h | 311 + .../FreeRTOS_LED/portable/IAR/ARM_CM3/port.c | 664 + .../portable/IAR/ARM_CM3/portasm.s | 104 + .../portable/IAR/ARM_CM3/portmacro.h | 208 + .../portable/IAR/ARM_CM33/non_secure/port.c | 1261 ++ .../IAR/ARM_CM33/non_secure/portasm.h | 114 + .../IAR/ARM_CM33/non_secure/portasm.s | 353 + .../IAR/ARM_CM33/non_secure/portmacro.h | 78 + .../IAR/ARM_CM33/non_secure/portmacrocommon.h | 311 + .../IAR/ARM_CM33/secure/secure_context.c | 351 + .../IAR/ARM_CM33/secure/secure_context.h | 135 + .../ARM_CM33/secure/secure_context_port_asm.s | 86 + .../IAR/ARM_CM33/secure/secure_heap.c | 454 + .../IAR/ARM_CM33/secure/secure_heap.h | 66 + .../IAR/ARM_CM33/secure/secure_init.c | 106 + .../IAR/ARM_CM33/secure/secure_init.h | 54 + .../IAR/ARM_CM33/secure/secure_port_macros.h | 140 + .../IAR/ARM_CM33_NTZ/non_secure/port.c | 1261 ++ .../IAR/ARM_CM33_NTZ/non_secure/portasm.h | 114 + .../IAR/ARM_CM33_NTZ/non_secure/portasm.s | 262 + .../IAR/ARM_CM33_NTZ/non_secure/portmacro.h | 78 + .../ARM_CM33_NTZ/non_secure/portmacrocommon.h | 311 + .../FreeRTOS_LED/portable/IAR/ARM_CM4F/port.c | 701 + .../portable/IAR/ARM_CM4F/portasm.s | 150 + .../portable/IAR/ARM_CM4F/portmacro.h | 207 + .../portable/IAR/ARM_CM4F_MPU/port.c | 837 + .../portable/IAR/ARM_CM4F_MPU/portasm.s | 264 + .../portable/IAR/ARM_CM4F_MPU/portmacro.h | 369 + .../portable/IAR/ARM_CM55/non_secure/port.c | 1261 ++ .../IAR/ARM_CM55/non_secure/portasm.h | 114 + .../IAR/ARM_CM55/non_secure/portasm.s | 353 + .../IAR/ARM_CM55/non_secure/portmacro.h | 83 + .../IAR/ARM_CM55/non_secure/portmacrocommon.h | 311 + .../IAR/ARM_CM55/secure/secure_context.c | 351 + .../IAR/ARM_CM55/secure/secure_context.h | 135 + .../ARM_CM55/secure/secure_context_port_asm.s | 86 + .../IAR/ARM_CM55/secure/secure_heap.c | 454 + .../IAR/ARM_CM55/secure/secure_heap.h | 66 + .../IAR/ARM_CM55/secure/secure_init.c | 106 + .../IAR/ARM_CM55/secure/secure_init.h | 54 + .../IAR/ARM_CM55/secure/secure_port_macros.h | 140 + .../IAR/ARM_CM55_NTZ/non_secure/port.c | 1261 ++ .../IAR/ARM_CM55_NTZ/non_secure/portasm.h | 114 + .../IAR/ARM_CM55_NTZ/non_secure/portasm.s | 262 + .../IAR/ARM_CM55_NTZ/non_secure/portmacro.h | 83 + .../ARM_CM55_NTZ/non_secure/portmacrocommon.h | 311 + .../portable/IAR/ARM_CM7/ReadMe.txt | 18 + .../portable/IAR/ARM_CM7/r0p1/port.c | 689 + .../portable/IAR/ARM_CM7/r0p1/portasm.s | 152 + .../portable/IAR/ARM_CM7/r0p1/portmacro.h | 210 + .../portable/IAR/ARM_CM85/non_secure/port.c | 1261 ++ .../IAR/ARM_CM85/non_secure/portasm.h | 114 + .../IAR/ARM_CM85/non_secure/portasm.s | 353 + .../IAR/ARM_CM85/non_secure/portmacro.h | 83 + .../IAR/ARM_CM85/non_secure/portmacrocommon.h | 311 + .../IAR/ARM_CM85/secure/secure_context.c | 351 + .../IAR/ARM_CM85/secure/secure_context.h | 135 + .../ARM_CM85/secure/secure_context_port_asm.s | 86 + .../IAR/ARM_CM85/secure/secure_heap.c | 454 + .../IAR/ARM_CM85/secure/secure_heap.h | 66 + .../IAR/ARM_CM85/secure/secure_init.c | 106 + .../IAR/ARM_CM85/secure/secure_init.h | 54 + .../IAR/ARM_CM85/secure/secure_port_macros.h | 140 + .../IAR/ARM_CM85_NTZ/non_secure/port.c | 1261 ++ .../IAR/ARM_CM85_NTZ/non_secure/portasm.h | 114 + .../IAR/ARM_CM85_NTZ/non_secure/portasm.s | 262 + .../IAR/ARM_CM85_NTZ/non_secure/portmacro.h | 83 + .../ARM_CM85_NTZ/non_secure/portmacrocommon.h | 311 + .../portable/IAR/ARM_CRx_No_GIC/port.c | 317 + .../portable/IAR/ARM_CRx_No_GIC/portASM.s | 248 + .../portable/IAR/ARM_CRx_No_GIC/portmacro.h | 182 + .../portable/IAR/ATMega323/port.c | 340 + .../portable/IAR/ATMega323/portmacro.h | 113 + .../portable/IAR/ATMega323/portmacro.s90 | 246 + .../portable/IAR/AVR32_UC3/exception.s82 | 340 + .../portable/IAR/AVR32_UC3/port.c | 435 + .../portable/IAR/AVR32_UC3/portmacro.h | 684 + .../portable/IAR/AVR32_UC3/read.c | 123 + .../portable/IAR/AVR32_UC3/write.c | 133 + .../portable/IAR/AVR_AVRDx/port.c | 301 + .../portable/IAR/AVR_AVRDx/porthardware.h | 129 + .../portable/IAR/AVR_AVRDx/portmacro.h | 109 + .../portable/IAR/AVR_AVRDx/portmacro.s90 | 255 + .../portable/IAR/AVR_Mega0/port.c | 299 + .../portable/IAR/AVR_Mega0/porthardware.h | 116 + .../portable/IAR/AVR_Mega0/portmacro.h | 109 + .../portable/IAR/AVR_Mega0/portmacro.s90 | 249 + .../portable/IAR/AtmelSAM7S64/AT91SAM7S64.h | 1914 ++ .../IAR/AtmelSAM7S64/AT91SAM7S64_inc.h | 1812 ++ .../portable/IAR/AtmelSAM7S64/AT91SAM7X128.h | 2715 +++ .../IAR/AtmelSAM7S64/AT91SAM7X128_inc.h | 2446 +++ .../portable/IAR/AtmelSAM7S64/AT91SAM7X256.h | 2715 +++ .../IAR/AtmelSAM7S64/AT91SAM7X256_inc.h | 2446 +++ .../portable/IAR/AtmelSAM7S64/ISR_Support.h | 106 + .../IAR/AtmelSAM7S64/lib_AT91SAM7S64.h | 3265 ++++ .../IAR/AtmelSAM7S64/lib_AT91SAM7X128.h | 4558 +++++ .../IAR/AtmelSAM7S64/lib_AT91SAM7X256.h | 4558 +++++ .../portable/IAR/AtmelSAM7S64/port.c | 260 + .../portable/IAR/AtmelSAM7S64/portasm.s79 | 89 + .../portable/IAR/AtmelSAM7S64/portmacro.h | 112 + .../portable/IAR/AtmelSAM9XE/ISR_Support.h | 105 + .../portable/IAR/AtmelSAM9XE/port.c | 257 + .../portable/IAR/AtmelSAM9XE/portasm.s79 | 61 + .../portable/IAR/AtmelSAM9XE/portmacro.h | 115 + .../portable/IAR/LPC2000/ISR_Support.h | 106 + .../FreeRTOS_LED/portable/IAR/LPC2000/port.c | 318 + .../portable/IAR/LPC2000/portasm.s79 | 77 + .../portable/IAR/LPC2000/portmacro.h | 114 + .../FreeRTOS_LED/portable/IAR/MSP430/port.c | 174 + .../portable/IAR/MSP430/portasm.h | 85 + .../portable/IAR/MSP430/portext.s43 | 107 + .../portable/IAR/MSP430/portmacro.h | 134 + .../portable/IAR/MSP430X/data_model.h | 64 + .../FreeRTOS_LED/portable/IAR/MSP430X/port.c | 183 + .../portable/IAR/MSP430X/portext.s43 | 139 + .../portable/IAR/MSP430X/portmacro.h | 143 + .../portable/IAR/RISC-V/Documentation.url | 5 + ...freertos_risc_v_chip_specific_extensions.h | 69 + .../chip_specific_extensions/readme.txt | 23 + .../FreeRTOS_LED/portable/IAR/RISC-V/port.c | 241 + .../portable/IAR/RISC-V/portASM.s | 393 + .../portable/IAR/RISC-V/portContext.h | 177 + .../portable/IAR/RISC-V/portmacro.h | 179 + .../portable/IAR/RISC-V/readme.txt | 23 + .../FreeRTOS_LED/portable/IAR/RL78/port.c | 210 + .../FreeRTOS_LED/portable/IAR/RL78/portasm.s | 84 + .../portable/IAR/RL78/portmacro.h | 228 + .../FreeRTOS_LED/portable/IAR/RX100/port.c | 517 + .../portable/IAR/RX100/port_asm.s | 152 + .../portable/IAR/RX100/portmacro.h | 151 + .../portable/IAR/RX100/readme.txt | 72 + .../FreeRTOS_LED/portable/IAR/RX600/port.c | 194 + .../portable/IAR/RX600/port_asm.s | 160 + .../portable/IAR/RX600/portmacro.h | 140 + .../portable/IAR/RX600/readme.txt | 72 + .../portable/IAR/RX700v3_DPFPU/port.c | 568 + .../portable/IAR/RX700v3_DPFPU/portmacro.h | 196 + .../portable/IAR/RX700v3_DPFPU/readme.txt | 72 + .../FreeRTOS_LED/portable/IAR/RXv2/port.c | 202 + .../FreeRTOS_LED/portable/IAR/RXv2/port_asm.s | 201 + .../portable/IAR/RXv2/portmacro.h | 145 + .../FreeRTOS_LED/portable/IAR/RXv2/readme.txt | 72 + .../portable/IAR/STR71x/ISR_Support.h | 106 + .../FreeRTOS_LED/portable/IAR/STR71x/port.c | 259 + .../portable/IAR/STR71x/portasm.s79 | 77 + .../portable/IAR/STR71x/portmacro.h | 122 + .../portable/IAR/STR75x/ISR_Support.h | 106 + .../FreeRTOS_LED/portable/IAR/STR75x/port.c | 238 + .../portable/IAR/STR75x/portasm.s79 | 64 + .../portable/IAR/STR75x/portmacro.h | 113 + .../portable/IAR/STR91x/ISR_Support.h | 106 + .../FreeRTOS_LED/portable/IAR/STR91x/port.c | 422 + .../portable/IAR/STR91x/portasm.s79 | 61 + .../portable/IAR/STR91x/portmacro.h | 115 + .../portable/IAR/V850ES/ISR_Support.h | 150 + .../FreeRTOS_LED/portable/IAR/V850ES/port.c | 184 + .../portable/IAR/V850ES/portasm.s85 | 316 + .../portable/IAR/V850ES/portasm_Fx3.s85 | 336 + .../portable/IAR/V850ES/portasm_Hx2.s85 | 351 + .../portable/IAR/V850ES/portmacro.h | 136 + .../Keil/See-also-the-RVDS-directory.txt | 1 + .../FreeRTOS_LED/portable/MPLAB/PIC18F/port.c | 616 + .../portable/MPLAB/PIC18F/portmacro.h | 113 + .../portable/MPLAB/PIC18F/stdio.h | 0 .../portable/MPLAB/PIC24_dsPIC/port.c | 334 + .../MPLAB/PIC24_dsPIC/portasm_PIC24.S | 93 + .../MPLAB/PIC24_dsPIC/portasm_dsPIC.S | 107 + .../portable/MPLAB/PIC24_dsPIC/portmacro.h | 112 + .../portable/MPLAB/PIC32MEC14xx/ISR_Support.h | 215 + .../portable/MPLAB/PIC32MEC14xx/port.c | 346 + .../portable/MPLAB/PIC32MEC14xx/port_asm.S | 349 + .../portable/MPLAB/PIC32MEC14xx/portmacro.h | 250 + .../portable/MPLAB/PIC32MX/ISR_Support.h | 192 + .../portable/MPLAB/PIC32MX/port.c | 335 + .../portable/MPLAB/PIC32MX/port_asm.S | 269 + .../portable/MPLAB/PIC32MX/portmacro.h | 202 + .../portable/MPLAB/PIC32MZ/ISR_Support.h | 433 + .../portable/MPLAB/PIC32MZ/port.c | 373 + .../portable/MPLAB/PIC32MZ/port_asm.S | 769 + .../portable/MPLAB/PIC32MZ/portmacro.h | 213 + .../FreeRTOS_LED/portable/MSVC-MingW/port.c | 700 + .../portable/MSVC-MingW/portmacro.h | 163 + .../FreeRTOS_LED/portable/MemMang/ReadMe.url | 5 + .../FreeRTOS_LED/portable/MemMang/heap_1.c | 152 + .../FreeRTOS_LED/portable/MemMang/heap_2.c | 362 + .../FreeRTOS_LED/portable/MemMang/heap_3.c | 94 + .../FreeRTOS_LED/portable/MemMang/heap_4.c | 537 + .../FreeRTOS_LED/portable/MemMang/heap_5.c | 594 + .../portable/MikroC/ARM_CM4F/port.c | 894 + .../portable/MikroC/ARM_CM4F/portmacro.h | 190 + .../Paradigm/Tern_EE/large_untested/port.c | 240 + .../Paradigm/Tern_EE/large_untested/portasm.h | 77 + .../Tern_EE/large_untested/portmacro.h | 107 + .../portable/Paradigm/Tern_EE/small/port.c | 220 + .../portable/Paradigm/Tern_EE/small/portasm.h | 73 + .../Paradigm/Tern_EE/small/portmacro.h | 108 + .../portable/RVDS/ARM7_LPC21xx/port.c | 292 + .../portable/RVDS/ARM7_LPC21xx/portASM.s | 125 + .../portable/RVDS/ARM7_LPC21xx/portmacro.h | 151 + .../portable/RVDS/ARM7_LPC21xx/portmacro.inc | 92 + .../FreeRTOS_LED/portable/RVDS/ARM_CA9/port.c | 481 + .../portable/RVDS/ARM_CA9/portASM.s | 175 + .../portable/RVDS/ARM_CA9/portmacro.h | 164 + .../portable/RVDS/ARM_CA9/portmacro.inc | 121 + .../FreeRTOS_LED/portable/RVDS/ARM_CM0/port.c | 616 + .../portable/RVDS/ARM_CM0/portmacro.h | 125 + .../FreeRTOS_LED/portable/RVDS/ARM_CM3/port.c | 772 + .../portable/RVDS/ARM_CM3/portmacro.h | 266 + .../portable/RVDS/ARM_CM4F/port.c | 864 + .../portable/RVDS/ARM_CM4F/portmacro.h | 265 + .../portable/RVDS/ARM_CM4_MPU/port.c | 1043 + .../portable/RVDS/ARM_CM4_MPU/portmacro.h | 427 + .../portable/RVDS/ARM_CM7/ReadMe.txt | 18 + .../portable/RVDS/ARM_CM7/r0p1/port.c | 850 + .../portable/RVDS/ARM_CM7/r0p1/portmacro.h | 269 + .../portable/Renesas/RX100/port.c | 647 + .../portable/Renesas/RX100/port_asm.src | 42 + .../portable/Renesas/RX100/portmacro.h | 152 + .../portable/Renesas/RX100/readme.txt | 72 + .../portable/Renesas/RX200/port.c | 325 + .../portable/Renesas/RX200/port_asm.src | 42 + .../portable/Renesas/RX200/portmacro.h | 142 + .../portable/Renesas/RX200/readme.txt | 72 + .../portable/Renesas/RX600/port.c | 330 + .../portable/Renesas/RX600/port_asm.src | 42 + .../portable/Renesas/RX600/portmacro.h | 143 + .../portable/Renesas/RX600/readme.txt | 72 + .../portable/Renesas/RX600v2/port.c | 365 + .../portable/Renesas/RX600v2/port_asm.src | 42 + .../portable/Renesas/RX600v2/portmacro.h | 143 + .../portable/Renesas/RX600v2/readme.txt | 72 + .../portable/Renesas/RX700v3_DPFPU/port.c | 591 + .../Renesas/RX700v3_DPFPU/port_asm.src | 42 + .../Renesas/RX700v3_DPFPU/portmacro.h | 186 + .../portable/Renesas/RX700v3_DPFPU/readme.txt | 72 + .../portable/Renesas/SH2A_FPU/ISR_Support.inc | 75 + .../portable/Renesas/SH2A_FPU/port.c | 272 + .../portable/Renesas/SH2A_FPU/portasm.src | 151 + .../portable/Renesas/SH2A_FPU/portmacro.h | 140 + .../portable/Rowley/ARM7/readme.txt | 1 + .../portable/Rowley/MSP430F449/port.c | 173 + .../portable/Rowley/MSP430F449/portasm.h | 81 + .../portable/Rowley/MSP430F449/portext.asm | 103 + .../portable/Rowley/MSP430F449/portmacro.h | 133 + .../FreeRTOS_LED/portable/SDCC/Cygnal/port.c | 425 + .../portable/SDCC/Cygnal/portmacro.h | 116 + .../portable/Softune/MB91460/__STD_LIB_sbrk.c | 55 + .../portable/Softune/MB91460/port.c | 322 + .../portable/Softune/MB91460/portmacro.h | 110 + .../portable/Softune/MB96340/__STD_LIB_sbrk.c | 55 + .../portable/Softune/MB96340/port.c | 510 + .../portable/Softune/MB96340/portmacro.h | 117 + .../portable/Tasking/ARM_CM4F/port.c | 269 + .../portable/Tasking/ARM_CM4F/port_asm.asm | 237 + .../portable/Tasking/ARM_CM4F/portmacro.h | 133 + .../ThirdParty/CDK/T-HEAD_CK802/port.c | 151 + .../ThirdParty/CDK/T-HEAD_CK802/portasm.S | 127 + .../ThirdParty/CDK/T-HEAD_CK802/portmacro.h | 160 + .../.github/CODE_OF_CONDUCT.md | 4 + .../.github/CONTRIBUTING.md | 70 + .../.github/SECURITY.md | 5 + .../.github/pull_request_template.md | 16 + .../CCS/C2000_C28x/README.md | 19 + .../CCS/C2000_C28x/port.c | 172 + .../CCS/C2000_C28x/portasm.asm | 316 + .../CCS/C2000_C28x/portmacro.h | 103 + .../GCC/MSP430FR5969/port.c | 317 + .../GCC/MSP430FR5969/portmacro.h | 132 + ...freertos_risc_v_chip_specific_extensions.h | 210 + .../GCC/TriCore_38xa/port.c | 573 + .../GCC/TriCore_38xa/port.h | 42 + .../GCC/TriCore_38xa/portmacro.h | 175 + .../GCC/TriCore_38xa/porttrap.c | 281 + .../GCC/TriCore_38xa/readme.txt | 1 + .../Community-Supported-Ports/LICENSE | 1 + .../Community-Supported-Ports/README.md | 19 + .../Z88DK/Z180/port.c | 283 + .../Z88DK/Z180/portmacro.h | 431 + .../Z88DK/Z180/readme.md | 13 + .../GCC/ARC_EM_HS/arc_freertos_exceptions.c | 52 + .../GCC/ARC_EM_HS/arc_freertos_exceptions.h | 46 + .../ThirdParty/GCC/ARC_EM_HS/arc_support.s | 522 + .../ThirdParty/GCC/ARC_EM_HS/freertos_tls.c | 240 + .../portable/ThirdParty/GCC/ARC_EM_HS/port.c | 301 + .../ThirdParty/GCC/ARC_EM_HS/portmacro.h | 158 + .../GCC/ARC_v1/arc_freertos_exceptions.c | 52 + .../GCC/ARC_v1/arc_freertos_exceptions.h | 46 + .../ThirdParty/GCC/ARC_v1/arc_support.s | 322 + .../portable/ThirdParty/GCC/ARC_v1/port.c | 296 + .../ThirdParty/GCC/ARC_v1/portmacro.h | 148 + .../portable/ThirdParty/GCC/ARM_TFM/README.md | 80 + .../GCC/ARM_TFM/os_wrapper_freertos.c | 98 + .../portable/ThirdParty/GCC/ATmega/port.c | 768 + .../ThirdParty/GCC/ATmega/portmacro.h | 157 + .../portable/ThirdParty/GCC/ATmega/readme.md | 86 + .../Posix/FreeRTOS-simulator-for-Linux.url | 5 + .../portable/ThirdParty/GCC/Posix/port.c | 583 + .../portable/ThirdParty/GCC/Posix/portmacro.h | 135 + .../GCC/Posix/utils/wait_for_event.c | 104 + .../GCC/Posix/utils/wait_for_event.h | 46 + ...-for-info-on-official-MIT-license-port.txt | 6 + .../portable/ThirdParty/GCC/RP2040/.gitignore | 2 + .../ThirdParty/GCC/RP2040/CMakeLists.txt | 51 + .../GCC/RP2040/FreeRTOS_Kernel_import.cmake | 61 + .../portable/ThirdParty/GCC/RP2040/LICENSE.md | 23 + .../portable/ThirdParty/GCC/RP2040/README.md | 42 + .../GCC/RP2040/idle_task_static_memory.c | 52 + .../GCC/RP2040/include/freertos_sdk_config.h | 73 + .../ThirdParty/GCC/RP2040/include/portmacro.h | 151 + .../GCC/RP2040/include/rp2040_config.h | 70 + .../ThirdParty/GCC/RP2040/library.cmake | 69 + .../GCC/RP2040/pico_sdk_import.cmake | 66 + .../portable/ThirdParty/GCC/RP2040/port.c | 876 + .../GCC/Xtensa_ESP32/FreeRTOS-openocd.c | 27 + .../include/FreeRTOSConfig_arch.h | 134 + .../GCC/Xtensa_ESP32/include/port_systick.h | 20 + .../GCC/Xtensa_ESP32/include/portbenchmark.h | 52 + .../GCC/Xtensa_ESP32/include/portmacro.h | 570 + .../GCC/Xtensa_ESP32/include/xt_asm_utils.h | 75 + .../GCC/Xtensa_ESP32/include/xtensa_api.h | 30 + .../GCC/Xtensa_ESP32/include/xtensa_config.h | 154 + .../GCC/Xtensa_ESP32/include/xtensa_context.h | 30 + .../GCC/Xtensa_ESP32/include/xtensa_rtos.h | 242 + .../GCC/Xtensa_ESP32/include/xtensa_timer.h | 167 + .../ThirdParty/GCC/Xtensa_ESP32/port.c | 568 + .../ThirdParty/GCC/Xtensa_ESP32/port_common.c | 159 + .../GCC/Xtensa_ESP32/port_systick.c | 174 + .../ThirdParty/GCC/Xtensa_ESP32/portasm.S | 701 + .../GCC/Xtensa_ESP32/portmux_impl.h | 100 + .../GCC/Xtensa_ESP32/portmux_impl.inc.h | 195 + .../GCC/Xtensa_ESP32/xtensa_context.S | 712 + .../ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c | 75 + .../Xtensa_ESP32/xtensa_loadstore_handler.S | 549 + .../GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c | 75 + .../GCC/Xtensa_ESP32/xtensa_vector_defaults.S | 235 + .../GCC/Xtensa_ESP32/xtensa_vectors.S | 2067 ++ .../portable/ThirdParty/KnownIssues.md | 7 + .../.github/CODE_OF_CONDUCT.md | 4 + .../.github/CONTRIBUTING.md | 70 + .../.github/SECURITY.md | 5 + .../.github/pull_request_template.md | 16 + .../GCC/AVR_AVRDx/port.c | 393 + .../GCC/AVR_AVRDx/porthardware.h | 221 + .../GCC/AVR_AVRDx/portmacro.h | 267 + .../GCC/AVR_Mega0/port.c | 393 + .../GCC/AVR_Mega0/porthardware.h | 183 + .../GCC/AVR_Mega0/portmacro.h | 267 + .../Partner-Supported-Ports/LICENSE | 1 + .../Partner-Supported-Ports/README.md | 20 + .../portable/ThirdParty/README.md | 51 + .../portable/ThirdParty/XCC/Xtensa/Makefile | 98 + .../portable/ThirdParty/XCC/Xtensa/port.c | 208 + .../portable/ThirdParty/XCC/Xtensa/portasm.S | 601 + .../ThirdParty/XCC/Xtensa/portbenchmark.h | 51 + .../portable/ThirdParty/XCC/Xtensa/portclib.c | 230 + .../ThirdParty/XCC/Xtensa/portmacro.h | 210 + .../ThirdParty/XCC/Xtensa/porttrace.h | 49 + .../ThirdParty/XCC/Xtensa/readme_xtensa.txt | 764 + .../ThirdParty/XCC/Xtensa/xtensa_api.h | 128 + .../ThirdParty/XCC/Xtensa/xtensa_config.h | 188 + .../ThirdParty/XCC/Xtensa/xtensa_context.S | 631 + .../ThirdParty/XCC/Xtensa/xtensa_context.h | 356 + .../ThirdParty/XCC/Xtensa/xtensa_init.c | 71 + .../ThirdParty/XCC/Xtensa/xtensa_intr.c | 138 + .../ThirdParty/XCC/Xtensa/xtensa_intr_asm.S | 185 + .../XCC/Xtensa/xtensa_overlay_os_hook.c | 76 + .../ThirdParty/XCC/Xtensa/xtensa_rtos.h | 239 + .../ThirdParty/XCC/Xtensa/xtensa_timer.h | 165 + .../ThirdParty/XCC/Xtensa/xtensa_vectors.S | 1925 ++ .../portable/WizC/PIC18/Drivers/Tick/Tick.c | 139 + .../WizC/PIC18/Drivers/Tick/isrTick.c | 79 + .../portable/WizC/PIC18/Install.bat | 172 + .../portable/WizC/PIC18/addFreeRTOS.h | 54 + .../FreeRTOS_LED/portable/WizC/PIC18/port.c | 318 + .../portable/WizC/PIC18/portmacro.h | 424 + .../portable/oWatcom/16BitDOS/Flsh186/port.c | 247 + .../oWatcom/16BitDOS/Flsh186/portmacro.h | 111 + .../portable/oWatcom/16BitDOS/PC/port.c | 303 + .../portable/oWatcom/16BitDOS/PC/portmacro.h | 113 + .../oWatcom/16BitDOS/common/portasm.h | 111 + .../oWatcom/16BitDOS/common/portcomn.c | 141 + .../FreeRTOS_LED/portable/readme.txt | 20 + .../FreeRTOS_LED/queue.c | 3087 +++ .../FreeRTOS_LED/sbom.spdx | 1561 ++ .../FreeRTOS_LED/stream_buffer.c | 1427 ++ .../FreeRTOS_LED/tasks.c | 5429 ++++++ .../FreeRTOS_LED/timers.c | 1124 ++ 1002 files changed, 402926 insertions(+) create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.gitignore create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.lock create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.log4j.xml create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/version.ini create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.cproject create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.gitmodules create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.mxproject create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.project create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/language.settings.xml create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/stm32cubeide.project.prefs create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/CMakeLists.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/FreeRTOSConfig.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/main.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_hal_conf.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/freertos.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_hal_msp.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/syscalls.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/sysmem.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/system_stm32f4xx.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Startup/startup_stm32f446retx.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/subdir.mk create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.elf create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.list create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/makefile create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.mk create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/sources.mk create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_armcc.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_armclang.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_compiler.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_gcc.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_iccarm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_version.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mbl.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mml.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0plus.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm1.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm23.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm3.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm33.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm4.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm7.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc000.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc300.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv7.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv8.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/tz_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/LICENSE.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.ioc create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.launch create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/LICENSE create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/croutine.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/list.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/task.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/list.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/queue.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/tasks.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/timers.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_FLASH.ld create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_RAM.ld create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/croutine.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/event_groups.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/FreeRTOS.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/StackMacros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/atomic.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/croutine.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/deprecated_definitions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/event_groups.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/list.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/message_buffer.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_prototypes.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_wrappers.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/portable.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/projdefs.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/queue.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/semphr.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stack_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stdint.readme create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stream_buffer.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/task.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/timers.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/list.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/manifest.yml create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMClang/Use-the-GCC-ports.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/ReadMe.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/copy_files.py create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/ReadMe.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/ReadMe.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/macros/secure_port_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/prtmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/prtmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portcomn.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portasm.asm create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portasm.asm create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portASM.asm create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/data_model.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portext.asm create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CMakeLists.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Common/mpu_wrappers.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portISR.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portISR.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portISR.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portISR.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portASM.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portASM.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context_port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_port_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context_port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_port_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context_port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_port_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/ReadMe.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context_port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_port_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portASM.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portASM.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/exception.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_AVRDx/README.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_Mega0/README.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portASM.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MCF5235/readme.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port_exceptions.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port_exceptions.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port_asm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/FPU_Macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/FPU_Macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/Documentation.url create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portASM.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portContext.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/isr_support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portISR.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/porttrap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portasm.s26 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_port_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_port_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_port_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/ReadMe.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_port_macros.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portASM.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.s90 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/exception.s82 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/read.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/write.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/porthardware.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.s90 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/porthardware.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.s90 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portasm.s79 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portasm.s79 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portasm.s79 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portext.s43 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/data_model.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portext.s43 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/Documentation.url create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portASM.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portContext.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portasm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port_asm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port_asm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port_asm.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portasm.s79 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portasm.s79 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portasm.s79 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm.s85 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Fx3.s85 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Hx2.s85 create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Keil/See-also-the-RVDS-directory.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/stdio.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port_asm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port_asm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/ISR_Support.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port_asm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/ReadMe.url create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_1.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_2.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_3.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_4.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_5.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portASM.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.inc create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portASM.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.inc create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/ReadMe.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port_asm.src create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port_asm.src create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port_asm.src create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port_asm.src create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port_asm.src create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/ISR_Support.inc create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portasm.src create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/ARM7/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portext.asm create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/__STD_LIB_sbrk.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/__STD_LIB_sbrk.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port_asm.asm create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/LICENSE create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/README.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_support.s create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/README.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/readme.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/.gitignore create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/CMakeLists.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/LICENSE.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/README.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/library.cmake create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/KnownIssues.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/LICENSE create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/README.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/README.md create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/Makefile create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portasm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portbenchmark.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portclib.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/porttrace.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_api.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_config.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_init.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/Tick.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/isrTick.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Install.bat create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/addFreeRTOS.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/port.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/portmacro.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portasm.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portcomn.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/readme.txt create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/queue.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/sbom.spdx create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/stream_buffer.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/tasks.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/timers.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.gitignore b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.gitignore new file mode 100644 index 0000000..36df4e6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.gitignore @@ -0,0 +1,8 @@ +# Ignore all .log files +*.log + +# Ignore the build directory +build/ + +# Ignore files in the temp directory +temp/* \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.lock b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.lock new file mode 100644 index 0000000..e69de29 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.log4j.xml b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.log4j.xml new file mode 100644 index 0000000..5e79a17 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.log4j.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 new file mode 100644 index 0000000..e69de29 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom new file mode 100644 index 0000000000000000000000000000000000000000..2ebb9db05825d3d088301e02f4146a80d0c6f597 GIT binary patch literal 4128768 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 z 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%0AXA_N>@Awx=lnIhjto%9`%x9yr)4$ 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�cU0ad%(W(7A*WmkK7xV|2wl0RQDi)Sz61avI7q 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%0AxCS! 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%0DC);p(T`Uki}SXAMc=ht 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

-H{YWX{zLu;k6-h)#`#f< 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

5^-sTcj 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 VR}1`VfnP1~s|9|wz<=8U{|`D-cD(=q literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml new file mode 100644 index 0000000..69004fd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp @@ -0,0 +1 @@ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c new file mode 100644 index 0000000..e69de29 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp new file mode 100644 index 0000000..e69de29 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f new file mode 100644 index 0000000..130d916 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f @@ -0,0 +1,229 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); +void blinkaled(void); + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + } + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the blinkaled thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + blinkaled(); + } + /* USER CODE END StartTask02 */ +} + +/* + * Function: blinkled + * Blinks an LED connected to GPIOA Pin 5 by setting it high for 1 second and then low for 1 second. + * Parameters: None + * Returns: None + */ +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f new file mode 100644 index 0000000..1a527d4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f @@ -0,0 +1,4 @@ +635E684B79701B039C64EA45C3F84D30=2B8A1A14D46119CD49E4AAC54D250F3F +66BE74F758C12D739921AEA421D593D3=1 +DC22A860405A8BF2F2C095E5B6529F12=F90B087FDAEC68C8F01B9C0344FA7B26 +eclipse.preferences.version=1 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f new file mode 100644 index 0000000..2d72519 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f @@ -0,0 +1,226 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; + + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); +void blinkaled(void); +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the blinkaled thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + blinkaled(); + } + /* USER CODE END StartTask02 */ +} + +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f new file mode 100644 index 0000000..ead6c3e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f @@ -0,0 +1,226 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; + + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the BlinkLED thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END StartTask02 */ +} + +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f new file mode 100644 index 0000000..d19980e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f @@ -0,0 +1,226 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; + + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); +void blinkaled(void); +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the BlinkLED thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + blinkaled(); + } + /* USER CODE END StartTask02 */ +} + +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f new file mode 100644 index 0000000..2b4222f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f @@ -0,0 +1,3 @@ +635E684B79701B039C64EA45C3F84D30=2B8A1A14D46119CD49E4AAC54D250F3F +DC22A860405A8BF2F2C095E5B6529F12=F90B087FDAEC68C8F01B9C0344FA7B26 +eclipse.preferences.version=1 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f new file mode 100644 index 0000000..b0633dd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f @@ -0,0 +1,226 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; + + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); +void blinkaled(void) +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the BlinkLED thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END StartTask02 */ +} + +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f new file mode 100644 index 0000000..c8f66ab --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f @@ -0,0 +1,250 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART2_UART_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(BlinkLED, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(BlinkLED), NULL); + + /* USER CODE BEGIN RTOS_THREADS */ + /* add threads, ... */ + /* USER CODE END RTOS_THREADS */ + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the BlinkLED thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END StartTask02 */ +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f new file mode 100644 index 0000000..65407d2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f @@ -0,0 +1,4 @@ +635E684B79701B039C64EA45C3F84D30=2B8A1A14D46119CD49E4AAC54D250F3F +66BE74F758C12D739921AEA421D593D3=0 +DC22A860405A8BF2F2C095E5B6529F12=F90B087FDAEC68C8F01B9C0344FA7B26 +eclipse.preferences.version=1 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f new file mode 100644 index 0000000..9e878b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f @@ -0,0 +1,236 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + + + + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; + + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); +void blinkaled(void); +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the blinkaled thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + blinkaled(); + } + /* USER CODE END StartTask02 */ +} + +/* + * Function: blinkled + * Blinks an LED connected to GPIOA Pin 5 by setting it high for 1 second and then low for 1 second. + * Parameters: None + * Returns: None + */ +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f new file mode 100644 index 0000000..978b55f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f @@ -0,0 +1,232 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; + + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); +void blinkaled(void); +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the blinkaled thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + blinkaled(); + } + /* USER CODE END StartTask02 */ +} + +/* + * Function: blinkled + * Blinks an LED connected to GPIOA Pin 5 by setting it high for 1 second and then low for 1 second. + * Parameters: None + * Returns: None + */ +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f new file mode 100644 index 0000000..000a47c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f @@ -0,0 +1,2 @@ +635E684B79701B039C64EA45C3F84D30=2B8A1A14D46119CD49E4AAC54D250F3F +eclipse.preferences.version=1 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f new file mode 100644 index 0000000..1d5839e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f @@ -0,0 +1,327 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART2_UART_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); + +/* 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_USART2_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* USER CODE BEGIN RTOS_MUTEX */ + /* add mutexes, ... */ + /* USER CODE END RTOS_MUTEX */ + + /* USER CODE BEGIN RTOS_SEMAPHORES */ + /* add semaphores, ... */ + /* USER CODE END RTOS_SEMAPHORES */ + + /* USER CODE BEGIN RTOS_TIMERS */ + /* start timers, add new ones, ... */ + /* USER CODE END RTOS_TIMERS */ + + /* USER CODE BEGIN RTOS_QUEUES */ + /* add queues, ... */ + /* USER CODE END RTOS_QUEUES */ + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(BlinkLED, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(BlinkLED), NULL); + + /* USER CODE BEGIN RTOS_THREADS */ + /* add threads, ... */ + /* USER CODE END RTOS_THREADS */ + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief USART2 Initialization Function + * @param None + * @retval None + */ +static void MX_USART2_UART_Init(void) +{ + + /* USER CODE BEGIN USART2_Init 0 */ + + /* USER CODE END USART2_Init 0 */ + + /* USER CODE BEGIN USART2_Init 1 */ + + /* USER CODE END USART2_Init 1 */ + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the BlinkLED thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END StartTask02 */ +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f new file mode 100644 index 0000000..1dccd52 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f @@ -0,0 +1,250 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the BlinkLED thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END StartTask02 */ +} + +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f new file mode 100644 index 0000000..ae202cb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f @@ -0,0 +1,249 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(BlinkLED, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(BlinkLED), NULL); + + /* USER CODE BEGIN RTOS_THREADS */ + /* add threads, ... */ + /* USER CODE END RTOS_THREADS */ + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the BlinkLED thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END StartTask02 */ +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f new file mode 100644 index 0000000..eb85064 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f @@ -0,0 +1,226 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" + +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; + + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); +void blinkaled(void); +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* 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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the BlinkLED thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END StartTask02 */ +} + +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..62e27d1afbd10204bce40768a077b4c6de2f3e91 GIT binary patch literal 180 zcmYj~K@Ng25JjgRz&m(>>C&AWqKOM4Y1tFfPGFKs$xMmi_A0n=`CtBj-vEGti>*1v zM6X^*Z9B5WuIZ($_9jHGeR%8hB7tmG`@8Qp5}wN1WyKN90nS+lq>y-4!iABiLNfIU mg$C9lD>~B6agAKExF3e&o*T(CeIDWTFAA}IWwcGO+N*Cgh(7KB literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index new file mode 100644 index 0000000000000000000000000000000000000000..eecac729730b414258e749e7ccaaea439c8e2782 GIT binary patch literal 142 zcmZQ#U|?WmP}SEfPAw_P%u6rUFD}V7HcBo{O3h43)hj5<&q_@$0n({y#SAPD;w)}g z9c7RezV9Lx@&b!9Z0=oOfuz1LA0l4xTmeP=dLBd^ E0Ktwpr~m)} literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..98c80568c4846681768165cd98c5d0470275c905 GIT binary patch literal 134 zcmYj}!3~2z3HkWwos;@5WX_QKprli`BrvqgLM``kE~q<8P++<^jGb;-JTWNana=`n_;} Ft0yX?E$9FM literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..75c8d1321f349bc3ecb0ed924be9ec345eaba05a GIT binary patch literal 172 zcmYj}O$x#=5QQfmz&m(>3ACbX@dp&&HW9uty7O0b4H}l64#+;lRj!BIz54LLJ8> k6IK-cAeN3TCok0x!!qZa_&|~-SpAD^n`Rk(FSyUs5A(=7l>h($ literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index new file mode 100644 index 0000000000000000000000000000000000000000..d1fd784f83227410c5cf44fcebce17592b7d556f GIT binary patch literal 348 zcmcJLyG{c!5Je|Z3OWkXq{<(R_K{6O4M~MSBJ{{RzE~D(JMtsq^Vua8^hh(^y)#E= zMnto57js&MXc#isa{`ObEFpsKlw^CsL+~Hgl&G=|o(>Wmr#y~p8!0{5YOs^S#us+V zD+ApZJLvJqRAhXCHTq(>soJio>P^*5e~E6+I=E-$K46uRb@2{~JD{)1>vtG^PQ`W$UcCf3>}2^U1@lPK>IuLwsw;D`VA7k`p(D_L&b literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location new file mode 100644 index 0000000000000000000000000000000000000000..91641515bd0b35eafeec5484f277c9bad57819a4 GIT binary patch literal 103 zcmZ?R*xjhShe1S2b=vdAllRFnn1=>=>g%Uv=A>HbJ6q|87N-^!>nCTV=Edu~q!wqF m6{V&Ih4=@<8Sy@@E(|E(K*aCQU}FP6_f+pLKL!8;A|bp0 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap new file mode 100644 index 0000000000000000000000000000000000000000..644ad1391f0e05ccebfd478e60141744c396e913 GIT binary patch literal 365 zcmZ?R*xjhShe1S2b=vdAllRFnFfcGNIP1F=rKSdj_y@=PxVq@O6lIpB78UCUhxi&B zxtUZ{#CtgU#6v{&J@b4AUi_-N{lXEf) zic|HHQ%dxb^NUjTN)n5+8Q2*(it|g0l2biXm>HOzT|yW*lQR;Ff=htLFflNQ1TyfH z7N-`ureu~RCgr384P^((yXK{UWP$o~Q;Ule(^HulBqAar6oNDIOLI~bl2R3lQ%e*| z@)ZmW3>Y{HiZb(yGD|9fT7b^t%E`=2^()OyN-Y8jNOe literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap new file mode 100644 index 0000000000000000000000000000000000000000..a7ddbe1e8f8cbc85b7bfedce1e161c54dc9a4ec5 GIT binary patch literal 112 bcmZ?R*xjhShe1S2b=vdAllRFv(3lSZSraca literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 0000000000000000000000000000000000000000..244ce710ad559d78fbc1c281fdf3a6435765d79e GIT binary patch literal 1645 zcmZ?R*xjhShe1S2b=vdAllRFf=Oz}Hq!uZZBqrsg@^UE$CzdGqCKf3eS|}JAS{a*K z8CWVfyM`zj85kM!awX@aCKkD*=9DDH=NF~xr6%WO78IxI6{Y6pm!#??=NF~gmK2o& z&B38CB{iuuU9U6~zpCVv5~9sQvhzU1@6TYb1%B?S-d%pofh4b*7>pRNngV0hWF*9@ nk(Gg|m7&qd@T#GOmFbAct43DF2398KBO_Lg&8!SfhpJZrYj{$t literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap new file mode 100644 index 0000000000000000000000000000000000000000..95e0a0ce0320f79b901b58db2788981fea2a1b91 GIT binary patch literal 62814 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 jPTNrgu-)7LeQ)IZ-F@#p^m!l>JU literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs new file mode 100644 index 0000000..3a4957f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +project_presentation/setHierarchicalMode=false diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs new file mode 100644 index 0000000..04a9943 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs @@ -0,0 +1,16 @@ +eclipse.preferences.version=1 +indexer/indexAllFiles=true +indexer/indexAllHeaderVersions=false +indexer/indexImportLocation=.settings/cdt-index.zip +indexer/indexOnOpen=false +indexer/indexUnusedHeadersWithAlternateLang=false +indexer/indexUnusedHeadersWithDefaultLang=true +indexer/indexerId=org.eclipse.cdt.core.fastIndexer +indexer/preferenceScope=1 +indexer/skipFilesLargerThanMB=8 +indexer/skipImplicitReferences=false +indexer/skipIncludedFilesLargerThanMB=16 +indexer/skipMacroReferences=false +indexer/skipReferences=false +indexer/skipTypeReferences=false +indexer/useHeuristicIncludeResolution=true diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 0000000..223c6da --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.cDebug.default_source_containers=\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..0034346 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +properties/FreeRTOS_LED.null.1952820776/com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.2035201402=com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1184093496\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.275352082\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.410072319\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.2035201402\=rebuildState\\\=false\\r\\nrcState\\\=0\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.1778957708\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.747388847\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.757687573\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.1954281256\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.211825696\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.1719641685\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.895004507\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.1557844165\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.1327966449\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1991386638\=rebuildState\\\=false\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.19634405\=rebuildState\\\=false\\r\\n\r\n +properties/FreeRTOS_LED.null.1952820776/com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1371127318=com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.1862772896\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.500725064\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.2062737092\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.1090821029\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.1052243524\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.209396598\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.1347839790\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1237873921\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.1167514624\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1536122474\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.517645456\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.1929400325\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.717823738\=rebuildState\\\=true\\r\\n\r\ncom.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.648111467\=rebuildState\\\=true\\r\\n\r\n diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..dffc6b5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +version=1 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 0000000..c8e90d4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,6 @@ +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.debug.gdbjtag.launchConfigurationType=org.eclipse.cdt.debug.gdbjtag.core.dsfLaunchDelegate,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.applicationLaunchType=org.eclipse.cdt.dsf.gdb.launch.localCLaunch,debug,;org.eclipse.cdt.cdi.launch.localCLaunch,run,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.remoteApplicationLaunchType=org.eclipse.rse.remotecdt.dsf.debug,debug,; +eclipse.preferences.version=1 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 0000000..f83fb63 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\r\n\r\n +preferredTargets=org.eclipse.cdt.debug.ui.toggleCBreakpointTarget,org.eclipse.cdt.debug.ui.toggleCDynamicPrintfTarget\:org.eclipse.cdt.debug.ui.toggleCBreakpointTarget| diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs new file mode 100644 index 0000000..50c820f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs @@ -0,0 +1,7 @@ +LaunchTargetManager/org.eclipse.launchbar.core.launchTargetType.local,Local/arch=x86_64 +LaunchTargetManager/org.eclipse.launchbar.core.launchTargetType.local,Local/name=Local +LaunchTargetManager/org.eclipse.launchbar.core.launchTargetType.local,Local/os=win32 +configDescList=org.eclipse.cdt.dsf.gdb.gdbRemotedescriptorType\:FreeRTOS_LED +eclipse.preferences.version=1 +org.eclipse.cdt.dsf.gdb.gdbRemotedescriptorType\:FreeRTOS_LED/activeLaunchMode=run +org.eclipse.cdt.dsf.gdb.gdbRemotedescriptorType\:FreeRTOS_LED/activeLaunchTarget=null\:--- diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs new file mode 100644 index 0000000..69a2299 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.ui.navigator.ProjectExplorer.filterActivation=\:org.eclipse.ui.navigator.resources.filters.startsWithDot\:org.eclipse.cdt.ui.navigator.filters.AnonymousStructFilter\:org.eclipse.ui.navigator.resources.nested.HideTopLevelProjectIfNested\:org.eclipse.ui.navigator.resources.nested.HideFolderWhenProjectIsShownAsNested\:org.eclipse.cdt.ui.navigator.filters.ForwardDeclarationFilter\: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 0000000..08076f2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +showIntro=false diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 0000000..83ca6f6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,8 @@ +UIActivities.org.eclipse.cdt.debug.dsfgdbActivity=true +eclipse.preferences.version=1 +org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_BG_END=255,255,255 +org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_BG_START=255,255,255 +org.eclipse.ui.workbench.ACTIVE_NOFOCUS_TAB_TEXT_COLOR=16,16,16 +org.eclipse.ui.workbench.ACTIVE_TAB_BG_END=255,255,255 +org.eclipse.ui.workbench.ACTIVE_TAB_BG_START=255,255,255 +org.eclipse.ui.workbench.INACTIVE_TAB_BG_START=242,242,242 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs new file mode 100644 index 0000000..855d634 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +processedSchemes=,eclipse+command,eclipse+mpc diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 0000000..a1adbe6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 0000000..e2d90ba --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,1957 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + + + + + topLevel + + + + + persp.actionSet:com.st.stm32cube.ide.mcu.informationcenter.actionSet3 + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.text.quicksearch.actionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.cdt.ui.SearchActionSet + persp.actionSet:org.eclipse.cdt.ui.CElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.cdt.ui.CView + persp.viewSC:org.eclipse.ui.views.PropertySheet + persp.viewSC:org.eclipse.ui.views.TaskList + persp.newWizSC:org.eclipse.cdt.ui.wizards.ConvertToMakeWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewMakeFromExisting + persp.newWizSC:org.eclipse.cdt.ui.wizard.project + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFolderCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewSourceFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewHeaderFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewFileCreationWizard + persp.newWizSC:org.eclipse.cdt.ui.wizards.NewClassCreationWizard + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.perspSC:org.eclipse.team.ui.TeamSynchronizingPerspective + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.cdt.ui.buildConfigActionSet + persp.actionSet:org.eclipse.cdt.ui.NavigationActionSet + persp.actionSet:org.eclipse.cdt.ui.OpenActionSet + persp.actionSet:org.eclipse.cdt.ui.CodingActionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.presentation + persp.showIn:org.eclipse.cdt.ui.includeBrowser + persp.showIn:org.eclipse.cdt.ui.CView + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.cdt.ui.includeBrowser + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.newWizSC:com.st.stm32cube.common.projectcreation.ui.stm32projectwizard + persp.newWizSC:com.st.stm32cube.common.projectcreation.ui.stm32projectfromiocwizard + persp.viewSC:org.eclipse.cdt.make.ui.views.MakeView + persp.actionSet:org.eclipse.cdt.make.ui.makeTargetActionSet + persp.showIn:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.viewSC:org.eclipse.cdt.codan.internal.ui.views.ProblemDetails + persp.viewSC:com.st.stm32cube.ide.mcu.buildanalyzer.view + persp.viewSC:com.st.stm32cube.ide.mcu.stackanalyzer.stackanalyzer.view + persp.viewSC:com.st.stm32cube.ide.mcu.sfrview + + + + View + categoryTag:General + + + View + categoryTag:C/C++ + + + View + categoryTag:General + + + + + + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:Make + + + + + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + + + View + categoryTag:C/C++ + + + View + categoryTag:C/C++ + + + + + + + + + persp.actionSet:com.st.stm32cube.ide.mcu.informationcenter.actionSet3 + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.text.quicksearch.actionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.cdt.ui.buildConfigActionSet + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.newWizSC:com.st.stm32cube.common.projectcreation.ui.stm32projectwizard + persp.newWizSC:com.st.stm32cube.common.projectcreation.ui.stm32projectfromiocwizard + + + + View + categoryTag:General + + + + + + + + + View + categoryTag:Device Configuration Tool + + + + + + + + + + View + categoryTag:Help + + + View + categoryTag:General + + + View + categoryTag:Help + + + + + + + View + categoryTag:Help + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Help + + + + org.eclipse.e4.primaryDataStack + EditorStack + active + noFocus + + + Editor + removeOnHide + com.st.stm32cube.common.mx.startCubeMx + + + + Editor + removeOnHide + org.eclipse.cdt.ui.editor.CEditor + active + + + + Editor + removeOnHide + org.eclipse.cdt.ui.editor.CEditor + + + + Editor + removeOnHide + org.eclipse.cdt.ui.editor.CEditor + + + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:General + + + + + + View + categoryTag:Make + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:C/C++ + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:C/C++ + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Device Configuration Tool + + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + Draggable + + + toolbarSeparator + + + + Draggable + + + Draggable + + + Draggable + + + Draggable + + + toolbarSeparator + + + + Draggable + + + + Draggable + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + TrimStack + Draggable + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + removeOnHide + + + + + View + categoryTag:Device Configuration Tool + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:SWV + + + + + View + categoryTag:SWV + + + + + View + categoryTag:SWV + + + + + View + categoryTag:SWV + + + + + View + categoryTag:SWV + + + + + View + categoryTag:SWV + + + + + View + categoryTag:Debug + + + + + View + categoryTag:FreeRTOS + + + + + View + categoryTag:FreeRTOS + + + + + View + categoryTag:FreeRTOS + + + + + View + categoryTag:FreeRTOS + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:ThreadX + + + + + View + categoryTag:ThreadX + + + + + View + categoryTag:ThreadX + + + + + View + categoryTag:ThreadX + + + + + View + categoryTag:ThreadX + + + + + View + categoryTag:ThreadX + + + + + View + categoryTag:ThreadX + + + + + View + categoryTag:ThreadX + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Make + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:General + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + View + categoryTag:Debug + + + + + View + categoryTag:Help + + + + + View + categoryTag:Connections + + + + + View + categoryTag:General + + + + + View + categoryTag:Version Control (Team) + + + + + View + categoryTag:Version Control (Team) + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + glue + move_after:PerspectiveSpacer + SHOW_RESTORE_MENU + + + move_after:Spacer Glue + HIDEABLE + SHOW_RESTORE_MENU + + + glue + move_after:SearchField + SHOW_RESTORE_MENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml new file mode 100644 index 0000000..35be43f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml @@ -0,0 +1,6 @@ + +

+
+ +
+
diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 0000000..d57254a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/version.ini b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/version.ini new file mode 100644 index 0000000..49433ed --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/version.ini @@ -0,0 +1,3 @@ +#Sat Mar 18 11:32:46 CET 2023 +org.eclipse.core.runtime=2 +org.eclipse.platform=4.23.0.v20220308-0310 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.cproject b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.cproject new file mode 100644 index 0000000..c2acbda --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.cproject @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.gitmodules b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.gitmodules new file mode 100644 index 0000000..aaa2390 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.gitmodules @@ -0,0 +1,6 @@ +[submodule "ThirdParty/FreeRTOS-Kernel-Partner-Supported-Ports"] + path = portable/ThirdParty/Partner-Supported-Ports + url = https://github.com/FreeRTOS/FreeRTOS-Kernel-Partner-Supported-Ports +[submodule "ThirdParty/FreeRTOS-Kernel-Community-Supported-Ports"] + path = portable/ThirdParty/Community-Supported-Ports + url = https://github.com/FreeRTOS/FreeRTOS-Kernel-Community-Supported-Ports diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.mxproject b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.mxproject new file mode 100644 index 0000000..7327952 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.mxproject @@ -0,0 +1,27 @@ +[PreviousLibFiles] +LibFiles=Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_usart.h;Middlewares\Third_Party\FreeRTOS\Source\include\croutine.h;Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h;Middlewares\Third_Party\FreeRTOS\Source\include\event_groups.h;Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h;Middlewares\Third_Party\FreeRTOS\Source\include\list.h;Middlewares\Third_Party\FreeRTOS\Source\include\message_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_prototypes.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h;Middlewares\Third_Party\FreeRTOS\Source\include\portable.h;Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h;Middlewares\Third_Party\FreeRTOS\Source\include\queue.h;Middlewares\Third_Party\FreeRTOS\Source\include\semphr.h;Middlewares\Third_Party\FreeRTOS\Source\include\stack_macros.h;Middlewares\Third_Party\FreeRTOS\Source\include\StackMacros.h;Middlewares\Third_Party\FreeRTOS\Source\include\stream_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\task.h;Middlewares\Third_Party\FreeRTOS\Source\include\timers.h;Middlewares\Third_Party\FreeRTOS\Source\include\atomic.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.h;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F\portmacro.h;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c;Middlewares\Third_Party\FreeRTOS\Source\croutine.c;Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;Middlewares\Third_Party\FreeRTOS\Source\list.c;Middlewares\Third_Party\FreeRTOS\Source\queue.c;Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;Middlewares\Third_Party\FreeRTOS\Source\tasks.c;Middlewares\Third_Party\FreeRTOS\Source\timers.c;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F\port.c;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_usart.h;Middlewares\Third_Party\FreeRTOS\Source\include\croutine.h;Middlewares\Third_Party\FreeRTOS\Source\include\deprecated_definitions.h;Middlewares\Third_Party\FreeRTOS\Source\include\event_groups.h;Middlewares\Third_Party\FreeRTOS\Source\include\FreeRTOS.h;Middlewares\Third_Party\FreeRTOS\Source\include\list.h;Middlewares\Third_Party\FreeRTOS\Source\include\message_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_prototypes.h;Middlewares\Third_Party\FreeRTOS\Source\include\mpu_wrappers.h;Middlewares\Third_Party\FreeRTOS\Source\include\portable.h;Middlewares\Third_Party\FreeRTOS\Source\include\projdefs.h;Middlewares\Third_Party\FreeRTOS\Source\include\queue.h;Middlewares\Third_Party\FreeRTOS\Source\include\semphr.h;Middlewares\Third_Party\FreeRTOS\Source\include\stack_macros.h;Middlewares\Third_Party\FreeRTOS\Source\include\StackMacros.h;Middlewares\Third_Party\FreeRTOS\Source\include\stream_buffer.h;Middlewares\Third_Party\FreeRTOS\Source\include\task.h;Middlewares\Third_Party\FreeRTOS\Source\include\timers.h;Middlewares\Third_Party\FreeRTOS\Source\include\atomic.h;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.h;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F\portmacro.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f446xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; + +[PreviousUsedCubeIDEFiles] +SourceFiles=Core\Src\main.c;Core\Src\freertos.c;Core\Src\stm32f4xx_it.c;Core\Src\stm32f4xx_hal_msp.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c;Middlewares\Third_Party\FreeRTOS\Source\croutine.c;Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;Middlewares\Third_Party\FreeRTOS\Source\list.c;Middlewares\Third_Party\FreeRTOS\Source\queue.c;Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;Middlewares\Third_Party\FreeRTOS\Source\tasks.c;Middlewares\Third_Party\FreeRTOS\Source\timers.c;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F\port.c;Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;Core\Src\system_stm32f4xx.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c;Middlewares\Third_Party\FreeRTOS\Source\croutine.c;Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;Middlewares\Third_Party\FreeRTOS\Source\list.c;Middlewares\Third_Party\FreeRTOS\Source\queue.c;Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;Middlewares\Third_Party\FreeRTOS\Source\tasks.c;Middlewares\Third_Party\FreeRTOS\Source\timers.c;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F\port.c;Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;Core\Src\system_stm32f4xx.c;;;Middlewares\Third_Party\FreeRTOS\Source\croutine.c;Middlewares\Third_Party\FreeRTOS\Source\event_groups.c;Middlewares\Third_Party\FreeRTOS\Source\list.c;Middlewares\Third_Party\FreeRTOS\Source\queue.c;Middlewares\Third_Party\FreeRTOS\Source\stream_buffer.c;Middlewares\Third_Party\FreeRTOS\Source\tasks.c;Middlewares\Third_Party\FreeRTOS\Source\timers.c;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS\cmsis_os.c;Middlewares\Third_Party\FreeRTOS\Source\portable\MemMang\heap_4.c;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F\port.c; +HeaderPath=Drivers\STM32F4xx_HAL_Driver\Inc;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;Middlewares\Third_Party\FreeRTOS\Source\include;Middlewares\Third_Party\FreeRTOS\Source\CMSIS_RTOS;Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM4F;Drivers\CMSIS\Device\ST\STM32F4xx\Include;Drivers\CMSIS\Include;Core\Inc; +CDefines=USE_HAL_DRIVER;STM32F446xx;USE_HAL_DRIVER;USE_HAL_DRIVER; + +[PreviousGenFiles] +AdvancedFolderStructure=true +HeaderFileListSize=4 +HeaderFiles#0=..\Core\Inc\FreeRTOSConfig.h +HeaderFiles#1=..\Core\Inc\stm32f4xx_it.h +HeaderFiles#2=..\Core\Inc\stm32f4xx_hal_conf.h +HeaderFiles#3=..\Core\Inc\main.h +HeaderFolderListSize=1 +HeaderPath#0=..\Core\Inc +HeaderFiles=; +SourceFileListSize=4 +SourceFiles#0=..\Core\Src\freertos.c +SourceFiles#1=..\Core\Src\stm32f4xx_it.c +SourceFiles#2=..\Core\Src\stm32f4xx_hal_msp.c +SourceFiles#3=..\Core\Src\main.c +SourceFolderListSize=1 +SourcePath#0=..\Core\Src +SourceFiles=; + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.project b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.project new file mode 100644 index 0000000..929aa37 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.project @@ -0,0 +1,32 @@ + + + FreeRTOS_LED + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.st.stm32cube.ide.mcu.MCUProjectNature + com.st.stm32cube.ide.mcu.MCUCubeProjectNature + org.eclipse.cdt.core.cnature + com.st.stm32cube.ide.mcu.MCUCubeIdeServicesRevAev2ProjectNature + com.st.stm32cube.ide.mcu.MCUAdvancedStructureProjectNature + com.st.stm32cube.ide.mcu.MCUSingleCpuProjectNature + com.st.stm32cube.ide.mcu.MCURootProjectNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/language.settings.xml b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/language.settings.xml new file mode 100644 index 0000000..d35b802 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/stm32cubeide.project.prefs b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/stm32cubeide.project.prefs new file mode 100644 index 0000000..e0008a6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/stm32cubeide.project.prefs @@ -0,0 +1,5 @@ +635E684B79701B039C64EA45C3F84D30=2B8A1A14D46119CD49E4AAC54D250F3F +66BE74F758C12D739921AEA421D593D3=1 +8DF89ED150041C4CBC7CB9A9CAA90856=F90B087FDAEC68C8F01B9C0344FA7B26 +DC22A860405A8BF2F2C095E5B6529F12=F90B087FDAEC68C8F01B9C0344FA7B26 +eclipse.preferences.version=1 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/CMakeLists.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/CMakeLists.txt new file mode 100644 index 0000000..5b048d2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/CMakeLists.txt @@ -0,0 +1,208 @@ +cmake_minimum_required(VERSION 3.15) + +# User is responsible to set two mandatory options: +# FREERTOS_CONFIG_FILE_DIRECTORY +# FREERTOS_PORT +# +# User can choose which heap implementation to use (either the implementations +# included with FreeRTOS [1..5] or a custom implementation ) by providing the +# option FREERTOS_HEAP. If the option is not set, the cmake will default to +# using heap_4.c. + +# Absolute path to FreeRTOS config file directory +set(FREERTOS_CONFIG_FILE_DIRECTORY "" CACHE STRING "Absolute path to the directory with FreeRTOSConfig.h") + +if(NOT FREERTOS_CONFIG_FILE_DIRECTORY) + message(FATAL_ERROR " FreeRTOSConfig.h file directory not specified. Please specify absolute path to it from top-level CMake file:\n" + " set(FREERTOS_CONFIG_FILE_DIRECTORY CACHE STRING \"\")\n" + " or from CMake command line option:\n" + " -DFREERTOS_CONFIG_FILE_DIRECTORY='/absolute_path/to/FreeRTOSConfig.h/directory'") +elseif(NOT EXISTS ${FREERTOS_CONFIG_FILE_DIRECTORY}/FreeRTOSConfig.h) + message(FATAL_ERROR " FreeRTOSConfig.h file not found in the directory specified (${FREERTOS_CONFIG_FILE_DIRECTORY})\n" + " Please specify absolute path to it from top-level CMake file:\n" + " set(FREERTOS_CONFIG_FILE_DIRECTORY CACHE STRING \"\")\n" + " or from CMake command line option:\n" + " -DFREERTOS_CONFIG_FILE_DIRECTORY='/absolute_path/to/FreeRTOSConfig.h/directory'") +endif() + +# Heap number or absolute path to custom heap implementation provided by user +set(FREERTOS_HEAP "4" CACHE STRING "FreeRTOS heap model number. 1 .. 5. Or absolute path to custom heap source file") + +# FreeRTOS port option +set(FREERTOS_PORT "" CACHE STRING "FreeRTOS port name") + +if(NOT FREERTOS_PORT) + message(FATAL_ERROR " FREERTOS_PORT is not set. Please specify it from top-level CMake file (example):\n" + " set(FREERTOS_PORT GCC_ARM_CM4F CACHE STRING \"\")\n" + " or from CMake command line option:\n" + " -DFREERTOS_PORT=GCC_ARM_CM4F\n" + " \n" + " Available port options:\n" + " BCC_16BIT_DOS_FLSH186 - Compiller: BCC Target: 16 bit DOS Flsh186\n" + " BCC_16BIT_DOS_PC - Compiller: BCC Target: 16 bit DOS PC\n" + " CCS_ARM_CM3 - Compiller: CCS Target: ARM Cortex-M3\n" + " CCS_ARM_CM4F - Compiller: CCS Target: ARM Cortex-M4 with FPU\n" + " CCS_ARM_CR4 - Compiller: CCS Target: ARM Cortex-R4\n" + " CCS_MSP430X - Compiller: CCS Target: MSP430X\n" + " CODEWARRIOR_COLDFIRE_V1 - Compiller: CoreWarrior Target: ColdFire V1\n" + " CODEWARRIOR_COLDFIRE_V2 - Compiller: CoreWarrior Target: ColdFire V2\n" + " CODEWARRIOR_HCS12 - Compiller: CoreWarrior Target: HCS12\n" + " GCC_ARM_CA9 - Compiller: GCC Target: ARM Cortex-A9\n" + " GCC_ARM_CA53_64_BIT - Compiller: GCC Target: ARM Cortex-A53 64 bit\n" + " GCC_ARM_CA53_64_BIT_SRE - Compiller: GCC Target: ARM Cortex-A53 64 bit SRE\n" + " GCC_ARM_CM0 - Compiller: GCC Target: ARM Cortex-M0\n" + " GCC_ARM_CM3 - Compiller: GCC Target: ARM Cortex-M3\n" + " GCC_ARM_CM3_MPU - Compiller: GCC Target: ARM Cortex-M3 with MPU\n" + " GCC_ARM_CM4_MPU - Compiller: GCC Target: ARM Cortex-M4 with MPU\n" + " GCC_ARM_CM4F - Compiller: GCC Target: ARM Cortex-M4 with FPU\n" + " GCC_ARM_CM7 - Compiller: GCC Target: ARM Cortex-M7\n" + " GCC_ARM_CM23_NONSECURE - Compiller: GCC Target: ARM Cortex-M23 non-secure\n" + " GCC_ARM_CM23_SECURE - Compiller: GCC Target: ARM Cortex-M23 secure\n" + " GCC_ARM_CM23_NTZ_NONSECURE - Compiller: GCC Target: ARM Cortex-M23 non-trustzone non-secure\n" + " GCC_ARM_CM33_NONSECURE - Compiller: GCC Target: ARM Cortex-M33 non-secure\n" + " GCC_ARM_CM33_SECURE - Compiller: GCC Target: ARM Cortex-M33 secure\n" + " GCC_ARM_CM33_NTZ_NONSECURE - Compiller: GCC Target: ARM Cortex-M33 non-trustzone non-secure\n" + " GCC_ARM_CM33_TFM - Compiller: GCC Target: ARM Cortex-M33 non-secure for TF-M\n" + " GCC_ARM_CM55_NONSECURE - Compiller: GCC Target: ARM Cortex-M55 non-secure\n" + " GCC_ARM_CM55_SECURE - Compiller: GCC Target: ARM Cortex-M55 secure\n" + " GCC_ARM_CM55_NTZ_NONSECURE - Compiller: GCC Target: ARM Cortex-M55 non-trustzone non-secure\n" + " GCC_ARM_CM55_TFM - Compiller: GCC Target: ARM Cortex-M55 non-secure for TF-M\n" + " GCC_ARM_CM85_NONSECURE - Compiller: GCC Target: ARM Cortex-M85 non-secure\n" + " GCC_ARM_CM85_SECURE - Compiller: GCC Target: ARM Cortex-M85 secure\n" + " GCC_ARM_CM85_NTZ_NONSECURE - Compiller: GCC Target: ARM Cortex-M85 non-trustzone non-secure\n" + " GCC_ARM_CM85_TFM - Compiller: GCC Target: ARM Cortex-M85 non-secure for TF-M\n" + " GCC_ARM_CR5 - Compiller: GCC Target: ARM Cortex-R5\n" + " GCC_ARM_CRX_NOGIC - Compiller: GCC Target: ARM Cortex-Rx no GIC\n" + " GCC_ARM7_AT91FR40008 - Compiller: GCC Target: ARM7 Atmel AT91R40008\n" + " GCC_ARM7_AT91SAM7S - Compiller: GCC Target: ARM7 Atmel AT91SAM7S\n" + " GCC_ARM7_LPC2000 - Compiller: GCC Target: ARM7 LPC2000\n" + " GCC_ARM7_LPC23XX - Compiller: GCC Target: ARM7 LPC23xx\n" + " GCC_ATMEGA323 - Compiller: GCC Target: ATMega323\n" + " GCC_AVR32_UC3 - Compiller: GCC Target: AVR32 UC3\n" + " GCC_COLDFIRE_V2 - Compiller: GCC Target: ColdFire V2\n" + " GCC_CORTUS_APS3 - Compiller: GCC Target: CORTUS APS3\n" + " GCC_H8S2329 - Compiller: GCC Target: H8S2329\n" + " GCC_HCS12 - Compiller: GCC Target: HCS12\n" + " GCC_IA32_FLAT - Compiller: GCC Target: IA32 flat\n" + " GCC_MICROBLAZE - Compiller: GCC Target: MicroBlaze\n" + " GCC_MICROBLAZE_V8 - Compiller: GCC Target: MicroBlaze V8\n" + " GCC_MICROBLAZE_V9 - Compiller: GCC Target: MicroBlaze V9\n" + " GCC_MSP430F449 - Compiller: GCC Target: MSP430F449\n" + " GCC_NIOSII - Compiller: GCC Target: NiosII\n" + " GCC_PPC405_XILINX - Compiller: GCC Target: Xilinx PPC405\n" + " GCC_PPC440_XILINX - Compiller: GCC Target: Xilinx PPC440\n" + " GCC_RISC_V - Compiller: GCC Target: RISC-V\n" + " GCC_RISC_V_PULPINO_VEGA_RV32M1RM - Compiller: GCC Target: RISC-V Pulpino Vega RV32M1RM\n" + " GCC_RL78 - Compiller: GCC Target: Renesas RL78\n" + " GCC_RX100 - Compiller: GCC Target: Renesas RX100\n" + " GCC_RX200 - Compiller: GCC Target: Renesas RX200\n" + " GCC_RX600 - Compiller: GCC Target: Renesas RX600\n" + " GCC_RX600_V2 - Compiller: GCC Target: Renesas RX600 v2\n" + " GCC_RX700_V3_DPFPU - Compiller: GCC Target: Renesas RX700 v3 with DPFPU\n" + " GCC_STR75X - Compiller: GCC Target: STR75x\n" + " GCC_TRICORE_1782 - Compiller: GCC Target: TriCore 1782\n" + " GCC_ARC_EM_HS - Compiller: GCC Target: DesignWare ARC EM HS\n" + " GCC_ARC_V1 - Compiller: GCC Target: DesignWare ARC v1\n" + " GCC_ATMEGA - Compiller: GCC Target: ATmega\n" + " GCC_POSIX - Compiller: GCC Target: Posix\n" + " GCC_RP2040 - Compiller: GCC Target: RP2040 ARM Cortex-M0+\n" + " GCC_XTENSA_ESP32 - Compiller: GCC Target: Xtensa ESP32\n" + " GCC_AVRDX - Compiller: GCC Target: AVRDx\n" + " GCC_AVR_MEGA0 - Compiller: GCC Target: AVR Mega0\n" + " IAR_78K0K - Compiller: IAR Target: Renesas 78K0K\n" + " IAR_ARM_CA5_NOGIC - Compiller: IAR Target: ARM Cortex-A5 no GIC\n" + " IAR_ARM_CA9 - Compiller: IAR Target: ARM Cortex-A9\n" + " IAR_ARM_CM0 - Compiller: IAR Target: ARM Cortex-M0\n" + " IAR_ARM_CM3 - Compiller: IAR Target: ARM Cortex-M3\n" + " IAR_ARM_CM4F - Compiller: IAR Target: ARM Cortex-M4 with FPU\n" + " IAR_ARM_CM4F_MPU - Compiller: IAR Target: ARM Cortex-M4 with FPU and MPU\n" + " IAR_ARM_CM7 - Compiller: IAR Target: ARM Cortex-M7\n" + " IAR_ARM_CM23_NONSECURE - Compiller: IAR Target: ARM Cortex-M23 non-secure\n" + " IAR_ARM_CM23_SECURE - Compiller: IAR Target: ARM Cortex-M23 secure\n" + " IAR_ARM_CM23_NTZ_NONSECURE - Compiller: IAR Target: ARM Cortex-M23 non-trustzone non-secure\n" + " IAR_ARM_CM33_NONSECURE - Compiller: IAR Target: ARM Cortex-M33 non-secure\n" + " IAR_ARM_CM33_SECURE - Compiller: IAR Target: ARM Cortex-M33 secure\n" + " IAR_ARM_CM33_NTZ_NONSECURE - Compiller: IAR Target: ARM Cortex-M33 non-trustzone non-secure\n" + " IAR_ARM_CM55_NONSECURE - Compiller: IAR Target: ARM Cortex-M55 non-secure\n" + " IAR_ARM_CM55_SECURE - Compiller: IAR Target: ARM Cortex-M55 secure\n" + " IAR_ARM_CM55_NTZ_NONSECURE - Compiller: IAR Target: ARM Cortex-M55 non-trustzone non-secure\n" + " IAR_ARM_CM85_NONSECURE - Compiller: IAR Target: ARM Cortex-M85 non-secure\n" + " IAR_ARM_CM85_SECURE - Compiller: IAR Target: ARM Cortex-M85 secure\n" + " IAR_ARM_CM85_NTZ_NONSECURE - Compiller: IAR Target: ARM Cortex-M85 non-trustzone non-secure\n" + " IAR_ARM_CRX_NOGIC - Compiller: IAR Target: ARM Cortex-Rx no GIC\n" + " IAR_ATMEGA323 - Compiller: IAR Target: ATMega323\n" + " IAR_ATMEL_SAM7S64 - Compiller: IAR Target: Atmel SAM7S64\n" + " IAR_ATMEL_SAM9XE - Compiller: IAR Target: Atmel SAM9XE\n" + " IAR_AVR_AVRDX - Compiller: IAR Target: AVRDx\n" + " IAR_AVR_MEGA0 - Compiller: IAR Target: AVR Mega0\n" + " IAR_AVR32_UC3 - Compiller: IAR Target: AVR32 UC3\n" + " IAR_LPC2000 - Compiller: IAR Target: LPC2000\n" + " IAR_MSP430 - Compiller: IAR Target: MSP430\n" + " IAR_MSP430X - Compiller: IAR Target: MSP430X\n" + " IAR_RISC_V - Compiller: IAR Target: RISC-V\n" + " IAR_RL78 - Compiller: IAR Target: Renesas RL78\n" + " IAR_RX100 - Compiller: IAR Target: Renesas RX100\n" + " IAR_RX600 - Compiller: IAR Target: Renesas RX600\n" + " IAR_RX700_V3_DPFPU - Compiller: IAR Target: Renesas RX700 v3 with DPFPU\n" + " IAR_RX_V2 - Compiller: IAR Target: Renesas RX v2\n" + " IAR_STR71X - Compiller: IAR Target: STR71x\n" + " IAR_STR75X - Compiller: IAR Target: STR75x\n" + " IAR_STR91X - Compiller: IAR Target: STR91x\n" + " IAR_V850ES_FX3 - Compiller: IAR Target: Renesas V850ES/Fx3\n" + " IAR_V850ES_HX3 - Compiller: IAR Target: Renesas V850ES/Hx3\n" + " MIKROC_ARM_CM4F - Compiller: MikroC Target: ARM Cortex-M4 with FPU\n" + " MPLAB_PIC18F - Compiller: MPLAB Target: PIC18F\n" + " MPLAB_PIC24 - Compiller: MPLAB Target: PIC24\n" + " MPLAB_PIC32MEC14XX - Compiller: MPLAB Target: PIC32MEC14xx\n" + " MPLAB_PIC32MX - Compiller: MPLAB Target: PIC32MX\n" + " MPLAB_PIC32MZ - Compiller: MPLAB Target: PIC32MZ\n" + " MSVC_MINGW - Compiller: MSVC or MinGW Target: x86\n" + " OWATCOM_16BIT_DOS_FLSH186 - Compiller: Open Watcom Target: 16 bit DOS Flsh186\n" + " OWATCOM_16BIT_DOS_PC - Compiller: Open Watcom Target: 16 bit DOS PC\n" + " PARADIGM_TERN_EE_LARGE - Compiller: Paradigm Target: Tern EE large\n" + " PARADIGM_TERN_EE_SMALL - Compiller: Paradigm Target: Tern EE small\n" + " RENESAS_RX100 - Compiller: Renesas Target: RX100\n" + " RENESAS_RX200 - Compiller: Renesas Target: RX200\n" + " RENESAS_RX600 - Compiller: Renesas Target: RX600\n" + " RENESAS_RX600_V2 - Compiller: Renesas Target: RX600 v2\n" + " RENESAS_RX700_V3_DPFPU - Compiller: Renesas Target: RX700 v3 with DPFPU\n" + " RENESAS_SH2A_FPU - Compiller: Renesas Target: SH2A with FPU\n" + " ROWLEY_MSP430F449 - Compiller: Rowley Target: MSP430F449\n" + " RVDS_ARM_CA9 - Compiller: RVDS Target: ARM Cortex-A9\n" + " RVDS_ARM_CM0 - Compiller: RVDS Target: ARM Cortex-M0\n" + " RVDS_ARM_CM3 - Compiller: RVDS Target: ARM Cortex-M3\n" + " RVDS_ARM_CM4_MPU - Compiller: RVDS Target: ARM Cortex-M4 with MPU\n" + " RVDS_ARM_CM4F - Compiller: RVDS Target: ARM Cortex-M4 with FPU\n" + " RVDS_ARM_CM7 - Compiller: RVDS Target: ARM Cortex-M7\n" + " RVDS_ARM7_LPC21XX - Compiller: RVDS Target: ARM7 LPC21xx\n" + " SDCC_CYGNAL - Compiller: SDCC Target: Cygnal\n" + " SOFTUNE_MB91460 - Compiller: Softune Target: MB91460\n" + " SOFTUNE_MB96340 - Compiller: Softune Target: MB96340\n" + " TASKING_ARM_CM4F - Compiller: Tasking Target: ARM Cortex-M4 with FPU\n" + " CDK_THEAD_CK802 - Compiller: CDK Target: T-head CK802\n" + " XCC_XTENSA - Compiller: XCC Target: Xtensa\n" + " WIZC_PIC18 - Compiller: WizC Target: PIC18") +endif() + +add_subdirectory(portable) + +add_library(freertos_kernel STATIC + croutine.c + event_groups.c + list.c + queue.c + stream_buffer.c + tasks.c + timers.c + + # If FREERTOS_HEAP is digit between 1 .. 5 - it is heap number, otherwise - it is path to custom heap source file + $>,${FREERTOS_HEAP},portable/MemMang/heap_${FREERTOS_HEAP}.c> +) + +target_include_directories(freertos_kernel + PUBLIC + include + ${FREERTOS_CONFIG_FILE_DIRECTORY} +) + +target_link_libraries(freertos_kernel freertos_kernel_port) diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/FreeRTOSConfig.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/FreeRTOSConfig.h new file mode 100644 index 0000000..15e22ca --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/FreeRTOSConfig.h @@ -0,0 +1,140 @@ +/* USER CODE BEGIN Header */ +/* + * FreeRTOS Kernel V10.3.1 + * Portion Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Portion Copyright (C) 2019 StMicroelectronics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ +/* USER CODE END Header */ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * These parameters and more are described within the 'configuration' section of the + * FreeRTOS API documentation available on the FreeRTOS.org web site. + * + * See http://www.freertos.org/a00110.html + *----------------------------------------------------------*/ + +/* USER CODE BEGIN Includes */ +/* Section where include file can be added */ +/* USER CODE END Includes */ + +/* Ensure definitions are only used by the compiler, and not by the assembler. */ +#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) + #include + extern uint32_t SystemCoreClock; + void xPortSysTickHandler(void); +#endif +#define configENABLE_FPU 0 +#define configENABLE_MPU 0 + +#define configUSE_PREEMPTION 1 +#define configSUPPORT_STATIC_ALLOCATION 1 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( SystemCoreClock ) +#define configTICK_RATE_HZ ((TickType_t)1000) +#define configMAX_PRIORITIES ( 7 ) +#define configMINIMAL_STACK_SIZE ((uint16_t)128) +#define configTOTAL_HEAP_SIZE ((size_t)15360) +#define configMAX_TASK_NAME_LEN ( 16 ) +#define configUSE_16_BIT_TICKS 0 +#define configUSE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 8 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +/* USER CODE BEGIN MESSAGE_BUFFER_LENGTH_TYPE */ +/* Defaults to size_t for backward compatibility, but can be changed + if lengths will always be less than the number of bytes in a size_t. */ +#define configMESSAGE_BUFFER_LENGTH_TYPE size_t +/* USER CODE END MESSAGE_BUFFER_LENGTH_TYPE */ + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 + +/* Cortex-M specific definitions. */ +#ifdef __NVIC_PRIO_BITS + /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ + #define configPRIO_BITS __NVIC_PRIO_BITS +#else + #define configPRIO_BITS 4 +#endif + +/* The lowest interrupt priority that can be used in a call to a "set priority" +function. */ +#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 + +/* The highest interrupt priority that can be used by any interrupt service +routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL +INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER +PRIORITY THAN THIS! (higher priorities are lower numeric values. */ +#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 + +/* Interrupt priorities used by the kernel port layer itself. These are generic +to all Cortex-M ports, and do not rely on any particular library functions. */ +#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) + +/* Normal assert() semantics without relying on the provision of an assert.h +header file. */ +/* USER CODE BEGIN 1 */ +#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );} +/* USER CODE END 1 */ + +/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS +standard names. */ +#define vPortSVCHandler SVC_Handler +#define xPortPendSVHandler PendSV_Handler + +/* IMPORTANT: This define is commented when used with STM32Cube firmware, when the timebase source is SysTick, + to prevent overwriting SysTick_Handler defined within STM32Cube HAL */ + +/* #define xPortSysTickHandler SysTick_Handler */ + +/* USER CODE BEGIN Defines */ +/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */ +/* USER CODE END Defines */ + +#endif /* FREERTOS_CONFIG_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/main.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/main.h new file mode 100644 index 0000000..be60ecc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/main.h @@ -0,0 +1,83 @@ +/* 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) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define B1_Pin GPIO_PIN_13 +#define B1_GPIO_Port GPIOC +#define USART_TX_Pin GPIO_PIN_2 +#define USART_TX_GPIO_Port GPIOA +#define USART_RX_Pin GPIO_PIN_3 +#define USART_RX_GPIO_Port GPIOA +#define LD2_Pin GPIO_PIN_5 +#define LD2_GPIO_Port GPIOA +#define TMS_Pin GPIO_PIN_13 +#define TMS_GPIO_Port GPIOA +#define TCK_Pin GPIO_PIN_14 +#define TCK_GPIO_Port GPIOA +#define SWO_Pin GPIO_PIN_3 +#define SWO_GPIO_Port GPIOB + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_hal_conf.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_hal_conf.h new file mode 100644 index 0000000..cfeb30f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_hal_conf.h @@ -0,0 +1,490 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + + /* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CAN_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +/* #define HAL_I2C_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ +/* #define HAL_SPI_MODULE_ENABLED */ +/* #define HAL_TIM_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_FMPSMBUS_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External audio frequency in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE 3300U /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 15U /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */ +#define USE_HAL_FMPSMBUS_REGISTER_CALLBACKS 0U /* FMPSMBUS register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY 0x000000FFU +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY 0x00000FFFU + +#define PHY_READ_TO 0x0000FFFFU +#define PHY_WRITE_TO 0x0000FFFFU + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)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_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "stm32f4xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_FMPSMBUS_MODULE_ENABLED + #include "stm32f4xx_hal_fmpsmbus.h" +#endif /* HAL_FMPSMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h new file mode 100644 index 0000000..aa25575 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h @@ -0,0 +1,64 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_IT_H +#define __STM32F4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void DebugMon_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_IT_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/freertos.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/freertos.c new file mode 100644 index 0000000..47b8ad4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/freertos.c @@ -0,0 +1,74 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : freertos.c + * Description : Code for freertos applications + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "FreeRTOS.h" +#include "task.h" +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN Variables */ + +/* USER CODE END Variables */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN FunctionPrototypes */ + +/* USER CODE END FunctionPrototypes */ + +/* GetIdleTaskMemory prototype (linked to static allocation support) */ +void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); + +/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ +static StaticTask_t xIdleTaskTCBBuffer; +static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; + +void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) +{ + *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; + *ppxIdleTaskStackBuffer = &xIdleStack[0]; + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; + /* place for user code */ +} +/* USER CODE END GET_IDLE_TASK_MEMORY */ + +/* Private application code --------------------------------------------------*/ +/* USER CODE BEGIN Application */ + +/* USER CODE END Application */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c new file mode 100644 index 0000000..e99f460 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c @@ -0,0 +1,229 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "cmsis_os.h" +osThreadId defaultTaskHandle; +osThreadId BlinkLEDHandle; + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +void StartDefaultTask(void const * argument); +void StartTask02(void const * argument); +void blinkaled(void); + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + + /* Start scheduler */ + osKernelStart(); + + /* We should never get here as control is now taken by the scheduler */ + /* Infinite loop */ + + while (1) + { + } + +} + +/** + * @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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + +/** + * @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_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + } + /* USER CODE END 5 */ +} + +/* USER CODE BEGIN Header_StartTask02 */ +/** +* @brief Function implementing the blinkaled thread. +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + blinkaled(); + } + /* USER CODE END StartTask02 */ +} + +/* + * Function: blinkled + * Blinks an LED connected to GPIOA Pin 5 by setting it high for 1 second and then low for 1 second. + * Parameters: None + * Returns: None + */ +void blinkaled(void) +{ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + HAL_Delay(1000); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + HAL_Delay(1000); +} +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_hal_msp.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_hal_msp.c new file mode 100644 index 0000000..7f7beff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_hal_msp.c @@ -0,0 +1,148 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + /* PendSV_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, USART_TX_Pin|USART_RX_Pin); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c new file mode 100644 index 0000000..d5e08d6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c @@ -0,0 +1,187 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f4xx_it.h" +#include "FreeRTOS.h" +#include "task.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 --------------------------------------------------------*/ + +/* 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 */ + while (1) + { + } + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles 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 System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); +#if (INCLUDE_xTaskGetSchedulerState == 1 ) + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + { +#endif /* INCLUDE_xTaskGetSchedulerState */ + xPortSysTickHandler(); +#if (INCLUDE_xTaskGetSchedulerState == 1 ) + } +#endif /* INCLUDE_xTaskGetSchedulerState */ + /* 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). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/syscalls.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/syscalls.c new file mode 100644 index 0000000..f4278b7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/syscalls.c @@ -0,0 +1,176 @@ +/** + ****************************************************************************** + * @file syscalls.c + * @author Auto-generated by STM32CubeIDE + * @brief STM32CubeIDE Minimal System calls file + * + * For more information about which c-functions + * need which of these lowlevel functions + * please consult the Newlib libc-manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2020-2022 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Variables */ +extern int __io_putchar(int ch) __attribute__((weak)); +extern int __io_getchar(void) __attribute__((weak)); + + +char *__env[1] = { 0 }; +char **environ = __env; + + +/* Functions */ +void initialise_monitor_handles() +{ +} + +int _getpid(void) +{ + return 1; +} + +int _kill(int pid, int sig) +{ + (void)pid; + (void)sig; + errno = EINVAL; + return -1; +} + +void _exit (int status) +{ + _kill(status, -1); + while (1) {} /* Make sure we hang here */ +} + +__attribute__((weak)) int _read(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + *ptr++ = __io_getchar(); + } + + return len; +} + +__attribute__((weak)) int _write(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + __io_putchar(*ptr++); + } + return len; +} + +int _close(int file) +{ + (void)file; + return -1; +} + + +int _fstat(int file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _isatty(int file) +{ + (void)file; + return 1; +} + +int _lseek(int file, int ptr, int dir) +{ + (void)file; + (void)ptr; + (void)dir; + return 0; +} + +int _open(char *path, int flags, ...) +{ + (void)path; + (void)flags; + /* Pretend like we always fail */ + return -1; +} + +int _wait(int *status) +{ + (void)status; + errno = ECHILD; + return -1; +} + +int _unlink(char *name) +{ + (void)name; + errno = ENOENT; + return -1; +} + +int _times(struct tms *buf) +{ + (void)buf; + return -1; +} + +int _stat(char *file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _link(char *old, char *new) +{ + (void)old; + (void)new; + errno = EMLINK; + return -1; +} + +int _fork(void) +{ + errno = EAGAIN; + return -1; +} + +int _execve(char *name, char **argv, char **env) +{ + (void)name; + (void)argv; + (void)env; + errno = ENOMEM; + return -1; +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/sysmem.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/sysmem.c new file mode 100644 index 0000000..54081ac --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/sysmem.c @@ -0,0 +1,79 @@ +/** + ****************************************************************************** + * @file sysmem.c + * @author Generated by STM32CubeIDE + * @brief STM32CubeIDE System Memory calls file + * + * For more information about which C functions + * need which of these lowlevel functions + * please consult the newlib libc manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2022 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include + +/** + * Pointer to the current high watermark of the heap usage + */ +static uint8_t *__sbrk_heap_end = NULL; + +/** + * @brief _sbrk() allocates memory to the newlib heap and is used by malloc + * and others from the C library + * + * @verbatim + * ############################################################################ + * # .data # .bss # newlib heap # MSP stack # + * # # # # Reserved by _Min_Stack_Size # + * ############################################################################ + * ^-- RAM start ^-- _end _estack, RAM end --^ + * @endverbatim + * + * This implementation starts allocating at the '_end' linker symbol + * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack + * The implementation considers '_estack' linker symbol to be RAM end + * NOTE: If the MSP stack, at any point during execution, grows larger than the + * reserved size, please increase the '_Min_Stack_Size'. + * + * @param incr Memory size + * @return Pointer to allocated memory + */ +void *_sbrk(ptrdiff_t incr) +{ + extern uint8_t _end; /* Symbol defined in the linker script */ + extern uint8_t _estack; /* Symbol defined in the linker script */ + extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t *max_heap = (uint8_t *)stack_limit; + uint8_t *prev_heap_end; + + /* Initialize heap end at first call */ + if (NULL == __sbrk_heap_end) + { + __sbrk_heap_end = &_end; + } + + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) + { + errno = ENOMEM; + return (void *)-1; + } + + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; + + return (void *)prev_heap_end; +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/system_stm32f4xx.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/system_stm32f4xx.c new file mode 100644 index 0000000..3bd40f7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/system_stm32f4xx.c @@ -0,0 +1,747 @@ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ + STM32F412Zx || STM32F412Vx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ + STM32F479xx */ + +/* Note: Following vector table addresses must be defined in line with linker + configuration. */ +/*!< Uncomment the following line if you need to relocate the vector table + anywhere in Flash or Sram, else the vector table is kept at the automatic + remap of boot address selected */ +/* #define USER_VECT_TAB_ADDRESS */ + +#if defined(USER_VECT_TAB_ADDRESS) +/*!< Uncomment the following line if you need to relocate your vector Table + in Sram else user remap will be done in Flash. */ +/* #define VECT_TAB_SRAM */ +#if defined(VECT_TAB_SRAM) +#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#else +#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location -------------------------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 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; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ + || defined(STM32F412Zx) || defined(STM32F412Vx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Startup/startup_stm32f446retx.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Startup/startup_stm32f446retx.s new file mode 100644 index 0000000..9ce3d8d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Startup/startup_stm32f446retx.s @@ -0,0 +1,535 @@ +/** + ****************************************************************************** + * @file startup_stm32f446xx.s + * @author MCD Application Team + * @brief STM32F446xx Devices vector table for GCC based toolchains. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss +/* stack used for SystemInit_ExtMemCtl; always internal RAM used */ + +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/* Call the clock system initialization 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 FMC_IRQHandler /* FMC */ + .word SDIO_IRQHandler /* SDIO */ + .word TIM5_IRQHandler /* TIM5 */ + .word SPI3_IRQHandler /* SPI3 */ + .word UART4_IRQHandler /* UART4 */ + .word UART5_IRQHandler /* UART5 */ + .word TIM6_DAC_IRQHandler /* TIM6 and DAC1&2 underrun errors */ + .word TIM7_IRQHandler /* TIM7 */ + .word DMA2_Stream0_IRQHandler /* DMA2 Stream 0 */ + .word DMA2_Stream1_IRQHandler /* DMA2 Stream 1 */ + .word DMA2_Stream2_IRQHandler /* DMA2 Stream 2 */ + .word DMA2_Stream3_IRQHandler /* DMA2 Stream 3 */ + .word DMA2_Stream4_IRQHandler /* DMA2 Stream 4 */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word CAN2_TX_IRQHandler /* CAN2 TX */ + .word CAN2_RX0_IRQHandler /* CAN2 RX0 */ + .word CAN2_RX1_IRQHandler /* CAN2 RX1 */ + .word CAN2_SCE_IRQHandler /* CAN2 SCE */ + .word OTG_FS_IRQHandler /* USB OTG FS */ + .word DMA2_Stream5_IRQHandler /* DMA2 Stream 5 */ + .word DMA2_Stream6_IRQHandler /* DMA2 Stream 6 */ + .word DMA2_Stream7_IRQHandler /* DMA2 Stream 7 */ + .word USART6_IRQHandler /* USART6 */ + .word I2C3_EV_IRQHandler /* I2C3 event */ + .word I2C3_ER_IRQHandler /* I2C3 error */ + .word OTG_HS_EP1_OUT_IRQHandler /* USB OTG HS End Point 1 Out */ + .word OTG_HS_EP1_IN_IRQHandler /* USB OTG HS End Point 1 In */ + .word OTG_HS_WKUP_IRQHandler /* USB OTG HS Wakeup through EXTI */ + .word OTG_HS_IRQHandler /* USB OTG HS */ + .word DCMI_IRQHandler /* DCMI */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word FPU_IRQHandler /* FPU */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word SPI4_IRQHandler /* SPI4 */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word SAI1_IRQHandler /* SAI1 */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word SAI2_IRQHandler /* SAI2 */ + .word QUADSPI_IRQHandler /* QuadSPI */ + .word CEC_IRQHandler /* CEC */ + .word SPDIF_RX_IRQHandler /* SPDIF RX */ + .word FMPI2C1_EV_IRQHandler /* FMPI2C 1 Event */ + .word FMPI2C1_ER_IRQHandler /* FMPI2C 1 Error */ + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_IRQHandler + .thumb_set EXTI2_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Stream0_IRQHandler + .thumb_set DMA1_Stream0_IRQHandler,Default_Handler + + .weak DMA1_Stream1_IRQHandler + .thumb_set DMA1_Stream1_IRQHandler,Default_Handler + + .weak DMA1_Stream2_IRQHandler + .thumb_set DMA1_Stream2_IRQHandler,Default_Handler + + .weak DMA1_Stream3_IRQHandler + .thumb_set DMA1_Stream3_IRQHandler,Default_Handler + + .weak DMA1_Stream4_IRQHandler + .thumb_set DMA1_Stream4_IRQHandler,Default_Handler + + .weak DMA1_Stream5_IRQHandler + .thumb_set DMA1_Stream5_IRQHandler,Default_Handler + + .weak DMA1_Stream6_IRQHandler + .thumb_set DMA1_Stream6_IRQHandler,Default_Handler + + .weak ADC_IRQHandler + .thumb_set ADC_IRQHandler,Default_Handler + + .weak CAN1_TX_IRQHandler + .thumb_set CAN1_TX_IRQHandler,Default_Handler + + .weak CAN1_RX0_IRQHandler + .thumb_set CAN1_RX0_IRQHandler,Default_Handler + + .weak CAN1_RX1_IRQHandler + .thumb_set CAN1_RX1_IRQHandler,Default_Handler + + .weak CAN1_SCE_IRQHandler + .thumb_set CAN1_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM9_IRQHandler + .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM10_IRQHandler + .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM11_IRQHandler + .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak OTG_FS_WKUP_IRQHandler + .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler + + .weak TIM8_BRK_TIM12_IRQHandler + .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler + + .weak TIM8_UP_TIM13_IRQHandler + .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler + + .weak TIM8_TRG_COM_TIM14_IRQHandler + .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler + + .weak TIM8_CC_IRQHandler + .thumb_set TIM8_CC_IRQHandler,Default_Handler + + .weak DMA1_Stream7_IRQHandler + .thumb_set DMA1_Stream7_IRQHandler,Default_Handler + + .weak FMC_IRQHandler + .thumb_set FMC_IRQHandler,Default_Handler + + .weak SDIO_IRQHandler + .thumb_set SDIO_IRQHandler,Default_Handler + + .weak TIM5_IRQHandler + .thumb_set TIM5_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak TIM7_IRQHandler + .thumb_set TIM7_IRQHandler,Default_Handler + + .weak DMA2_Stream0_IRQHandler + .thumb_set DMA2_Stream0_IRQHandler,Default_Handler + + .weak DMA2_Stream1_IRQHandler + .thumb_set DMA2_Stream1_IRQHandler,Default_Handler + + .weak DMA2_Stream2_IRQHandler + .thumb_set DMA2_Stream2_IRQHandler,Default_Handler + + .weak DMA2_Stream3_IRQHandler + .thumb_set DMA2_Stream3_IRQHandler,Default_Handler + + .weak DMA2_Stream4_IRQHandler + .thumb_set DMA2_Stream4_IRQHandler,Default_Handler + + .weak 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 FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler + + .weak SPI4_IRQHandler + .thumb_set SPI4_IRQHandler,Default_Handler + + .weak SAI1_IRQHandler + .thumb_set SAI1_IRQHandler,Default_Handler + + .weak SAI2_IRQHandler + .thumb_set SAI2_IRQHandler,Default_Handler + + .weak QUADSPI_IRQHandler + .thumb_set QUADSPI_IRQHandler,Default_Handler + + .weak CEC_IRQHandler + .thumb_set CEC_IRQHandler,Default_Handler + + .weak SPDIF_RX_IRQHandler + .thumb_set SPDIF_RX_IRQHandler,Default_Handler + + .weak FMPI2C1_EV_IRQHandler + .thumb_set FMPI2C1_EV_IRQHandler,Default_Handler + + .weak FMPI2C1_ER_IRQHandler + .thumb_set FMPI2C1_ER_IRQHandler,Default_Handler diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.d new file mode 100644 index 0000000..c03dce6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.d @@ -0,0 +1,72 @@ +Core/Src/freertos.o: ../Core/Src/freertos.c \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h \ + ../Core/Inc/FreeRTOSConfig.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/list.h \ + ../Core/Inc/main.h ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h: +../Core/Inc/FreeRTOSConfig.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h: +../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/list.h: +../Core/Inc/main.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.o new file mode 100644 index 0000000000000000000000000000000000000000..3acd588f1d94e7b465f792b7c515f54f10906b0d GIT binary patch literal 1106000 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

J$;y8q&>;uSl%$m5&A`ts6?g_9i22R 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

OC}LMs6SC_ zBzox9LW8tIz;q+31x=lE|@rX^T>2ydj5KaY{&SYvA1sXpxM`+k3BI0TR7; zdc9>Y0RFeL$w<)qvMvT@tgzZOOfQ=g{I@gBwlIDq7diXkdBF%Lt3u84XYgnSc``>5 znCNMyUtCV1&T*o3;v_?dZq-3=*Rg9Ff&NI<1k2ss4Cd^!k}7b0&!|yby+oX2DYDm) z{1DGRF^Yf>dyf^sGPcoPIh;p6S}_D`Sx0)Cg$VeaLx4)Zq%1d^~q`YA)AviKi^Wh9_j3VlywEj^Z{fDtnzM$8!RPEFi5S91_5{5!`a zoTyjbq@9pCD(rOTXIF7v%*)^?%Sjz-PPLG-lvJdjt(5}qKK+~G!a@*p&Ed&@^V~k? z1%|$Pp4i98$cWL7XKjjx_=KjD*48k@cV*J31+vnq#&;H$MmJ!UsHI@+#$0-nxX^4B zS?s2BbNDEmE~WFZQ!KmDZV-3l_ORT@Hq8}t2aK1IgSbcJ&5W{4Xn>U4_eJ;u);LuMmCxbngWQb!ouW!-%h?Y83RhRp zkAC=(QsVBz^!DBD-R)ODe0lx$_T6{u+xOqSeg79|8@~L}uNM|e3G{Ww2y>2@sLkGhNx6eH^ zPU$bS@633MLzgQ|-^fC#e{pTi3a75M20Zdf;HBlr%7kdvH0b$OpDtx|p=-dYpxL1V zh40D>LHRa1GhZ)Z0QU=4Otk#PN|cW6rp(1uE;vUJW5>5fX=+WdsZs27w}!10D{3)n zXyXi3V_a!08HK*tzQCzu`V_e7a38aH!_MYR@yim&HGyA3J7dUt^ z8z3)AtILzJ!-g`4YiJcQ{EUz%?=teWC=~NzJH9Elw3fl{3oD%- zVoL&#iP?%63I2UJGz|Z?;5kUqeC3cc(gM&)3LfoDo&@!y^q! z&OGqjqC0@xHbaS>?!v2Wq4WZYi>eR7bSq27rapeViH_jl=$2FZvW3X$Aa&=~kq0!h z{Za)=cW!1DWR_xmSu*C zjAu{}!#dJ-3_3;PpkOzM>6DEpEP%1Nyhb8_^CY6PQ5R-MK%wK0#ms7bl5Udq@GTm` zhdjau<}>G<_;k85iFRoma%|$g+?|v4HRRm!W^w^T@yk{|0LbrVHFBvP{dZetb zUnKzArFohF7Z8q%+^%*5#XBkZ*HVz!0b-;-b!LT-RpZ4X0IK=t({f3{hA+M>*_JvQEx zYC&aoj#Z;=EG82)2>GGXu4>|e0;;zW(JQ#BmoEe2UW$+;B!-NZ$AYcX4?(aI5Iy$mkOgg z9W!k-Bto(IqtM35y@q_Z1rcXbm`&_aGfPw;ji8{Rpy5tTK`X*4QLzSW2Vvxq*6+IA zK+>shcs+wxR#*q)+a#u*ov$X>`!ZPS33a{ZM1g#mu+Yx`XxiQ$#|pgoiS&0MpxUhH z4pWl!1*go6T7P+O7ykyVAansaH+Ml)T9A;8RFllBhnAx3QRs#E77VP+^kpAiDX~RU zdTa%}(@pIPJbl`luZw}9ZwFi?14uqA==aFfocLHvnxm;mq-~BYLi23@>9z~2xbmP^ zo7o&$Y&*J`8faLBnSc@qWC{{2-xzADAyjs@o3qqlEQd%;ZiM>?H@PTej#e$!P`qez&~JPAqoqBeA?SV&iRDiv{Vx`c?zyAK55)_!3QK zaA6+wpmw*H-fx@NtTDY#s9riy3ic8sIkBjUP@bC^AF<%vHicEiTNL|o1{gM&UhPgW zVNO-3GP0_fbq5lM5RCk!4OD`OcV=HAft_7K1^ZcR-w$*VLirIV&-s&D%L~tWBPs4c zj`xr5b1)~|2Dt^lgiM-YD@>P~Z@tmn_qVO=Rl^d-gJxyBpEw5Lez!RdpeFW`cDEx$NKYjb-+wX4qF6y71gYAHI z6W)rGnQ;dw4%L4$C!lVKjZXIhxNp>#HU+HR>@~6EVo>GLMzvA89oV}Z(>;q&RP2mP zJuPe)3~!lUTuiFyKQ^crr-P@;?BzM$R$bYcPy~2?_U^;Ce?xGCm*P|t!!e{AK^kBb z;|T6M^3Y#gt|w!c!zs7>S^wyMDFI;3)nbPT42*lnx+Z6zKe0%Ftx1S-Jw0^i9q)K? zJ-ePEmiiK0;O2_e>9I-?yor!@C9J*x(!wt5MaP<` zM+d35&br_X5Oc%q>9Hk^UGT=V43$d|@vqo+8K#E|i9-$_xl%w?N+9_>-A|4Xor);j z`0dzYVutC->c`LFTQ`DLP zC{Qxv6<=&$2kV;qexuF`ix--U#8W4`oaDefg#EhDopXCUX__ij?sA87hGT-;5kwuj z+(Dpsm%D;ISp2HHEV&JFM0;T2YZxSgex5r_p+oigu4UwjuM8^48HIK{k7ts|cs68q z9CnNap&u0929KQG4{>;yJ@$D>RCZV z7bLY?WB~RlCSP1o0)%kS6u^Cu7?gY4-5;n{VxSBMwA?CY#(rud-o5>FM^o3;%S%du zb9u!>xx$c}AHFOB^e0MJFHTw3`O`J%pq0p z7n>LFVVJNVr4QAyAG_E9IEmA-iyR&0u?t$yP~+J>Su+`$mHX)PG`B(eYq7Ngb?2fK zG<#;mz0!VN%!#w7n3WJU1Ic1wcn)1=V&nVj9O|VpIo}RuF<5*2T*nifbR6iU2Z*lA zL!TjNXtID?QX4NYae+YQV;P;x2B8)o%(UZsqz8j+s=Il(>7i9bWgBo($6IP7@tqzM z$1Pd;e)Yh0pBBnJoJy;K+KtSf#)OpTYk>3+ofoIg0SXqP!2T9$Ohs|vo1!%xlyYmt#=($G22AIFtMNW9gp$&&BNj^JUy+Ztpt?G|*G-#oEmh?eyKfU?WyIaV^ z+q(}xtUi2qD;28C$I}kfRf2MJ!#P?H*oaBM^bW8tE5s|Vw%|{q@Z0tpG7!ZcbV$t*yNF85W1Lh(2KkI1-~z`_jJ9dOWSNcJ(MxC z>Z0%0#KU2E6AU1au0F|eIC|RVZH%&f9r^vzlR`ySDBt8zPzNQzPwmNvmXNcsIkfy{ zYk+W;)0qOeiM)7Lr_ib(zQ&BJC&Ls6M6r8XkPXO-CA#BsTxq(s7{MKTQYP{v3UIW9 z9g4slw$pXOO(0V@=qyUdf-9OV5s~hc&CG_esTm>ji*+-&$uu*Xv<1ZR#p={dIJ{VG zP7|_N4W`M(MZr!G^UzWuRnY%4Xr-*MO0%Z|aeF#y@--Ar;A~YF!r?h;`tu1m{URNb zE;R^fz}rew^VQNAVwc64f%sxx*&Bnm2RDYwtx2eL`r1M@NOFvn9FPhF>F9Te6%_C2 z+~VTy_Irdgh!Yg&=v*V)$vFm-`1@f0e}j~7WG$U{1ozml+=fbT6e>UREJoFSQpv5` zDt%!vGFCLl5-x%6me$v9Mmgxq;6CAwd}$f)Nj&G~iORwVI!HYhm4*Bgm>Q$}n9@OO z^}~NcTA`z=$?`wJ$D(RYjux_az}{zG0K@-y^6bguXD7px)2EL|C&NciZhw1n{B-{K zv|D7=^iYsUx4jisC+}|Ge1xJwC&GAsjL4pEYV~0_iCQ9vQG1k#3M812$e)$sW*^;a zZu6vAIzz>d_?cWK^5{VIB8qTwmbkpyZ6@pIEmzis>o(^YW~(uyVXro?q2ydmoD_OO zzD)zQqo?$WY?L3_V^Z(Xv{GehloNqs(VX3WVt3qnvtL*K^N)!fNF~r9W#xJ~g~U zz`7DAZw3c_Y6Bj(eGR=&U67$drCJzU$6o950O{)-25pCvt*&PR3=8AUPzpyNaHXAL zc7c5<9a%#yylRTOM&cn5fTh|nFpksIfcmQ7;xk@q@4K<=>6ud4Hey7SbIvmrHAME> z=nE*5AnIpSdoz-LETeo0-4M@yyjmxeg4iHm)qhS;jYXjJ5flSeRYH`GCv_qVSn4xe ziAS5W92&^3^NR(n=eJNE9au@VyFIdz@OUxkJT4){!N@(;5o*`4vQv=%v;jOchLW#} z`$^mP_z+&7+q6RaMD%b$ce^{N;Vh$lMEj?G$>Kh2%9n5eKao|38<`{kw#aVM@@Ods1zN8>(iPuJv_3p&Q%TQ3sk!nHve;gVkcKxE%z2kJ z#A0hkDDX31$QPOY!-44lfhq>SYY~GyIuNF9IDvOap&u(;p=h2b)h2cP*%E*Fli`!m z-jmVeCl4O%J$gJGJ-ELAXwHlTuw58$F3x9^yRNX$P8EbHY9)@fYK)j0q*_(S`#LmZ zNRTU_T$Eg+Fj*CnjrqPr8?fSFk_6*Ktv>SRq@p&LRf?3 z^(k~?vIeLrjBH51SiqSAHKwI5(fCN3s=)VlMoJEEP!=?`Rn%GQB)IYkI!VW!9QlH- z4$D)wZ_U&%Wm=rI~<6m5;+{g^&M%PwzqLXSPZ{BXi(H>ev^j&_RQ|gqZiC%&;l| zD&y?zmlEn?D@o;E0UdF>>4^(L6i$d#1LCe!(xU2S^UO$| z10za;>w1M4__<|p16RN}rgqYjQ^<+wF80!$)w*8SXFlOB4=EW=-0HAMSx+%B^uRi) zs1N6O8q=dS^2c*`Qx9wD0jcrB7K7ZhDeGAsSOfzE?(*x|*l!EShuR)c&eY1NShMOH zHnT`d&jr#5G^HWL8B`_pfvOJ$L8P4(1yg3Igj6|MDg{n7>=~hef5stQKw!@lZ?k2w zW7w|Sz#p~E6Uwxq3qNvMy-AUURxE<;F)?{jod;#g<^5i2KEc%7Mxujtd__mDC0rdR z5aWhKl?}pk=FP{yN1_p>4@!*377rTcOx*txTsO@-8N~+goFV#3>u>Y+_9w@`nZNt^ zo5}4vGsEaS@(+XG{OawyYk75Zk)((`Ts|wJ7_g*C;wd17g3U?%TM}XoNTV45dwK>AQmCkM6Uv<|u5ReypOR_l35 zPjE3UuV20S?c~+FcfWk~`q$;mN_e=87SmU^uTrbB*_VTGgc=|W>6?%5_eZ~cduy6< z_f4O!?c5??u?y%do@>AJW`e1kPG`9psZ^az8BcpFzv@UmMj{B3PK*TG%>!Y3R0xi` zZ+Bc@*>9Xhn9Rb;qp+0?yai<(JQN|tuHplCpz5rSf9N4l!vp4GbP_$zw)XjLCZOKK zYlW`p<50D7jD}n6?UlkY`hp+?XY4HgSt93{eV;N)JsD!SJwsBds2vF50WOP*t|{1XB`&8q?{G?SarS=J?@wVcCgmav3?85a}Ax5+~lTAR-gAk=trM+I( zrc%Z22#DTCdx7ck@-gUE{G1H&o1-BcAEDX$n&?^GHO}qlr-B?Br+c3Qd!21W7klog;awetPfuz@(2R5UM!5tB(I17u`#diuUaRz z?f`RNe2aU+k0_}xwslAFpFC$CmS%7*RIl7@&SzJrCx#eoRGk z)qcDIsZRP2-nP-DxafM=C2E!)>bAJxTGs1sm7 zSI=)x13g$C9ayNx5iwe#0qTK*)B!(N7;IG9XYtEOn3lB9l9Yl2#J`}yb@zh!!oLt& znCV?A+O$)oR2pB-@nm$*k5}9$dN;SY+T{5N>a&#GYP(nj$35E*oO)8G;6_BCu7CRt z!iaq}_|ZL!UO|4)5kKh`Oe9!_rYD>zNJ0`+ebAvZ7mLbnhX-eRIX}$Qd2|Tf-CQAw3V9a14sWx=wHUyb@vRW-d*xel5`Y#%OKAqN7B|I zN`Ui{%J#ciPMstp5v*hGmeJKY=cv}x=G*jsUj;z6BaAB4OBGqUW7V9N~RU-VDO+r!R_-%W59#FV3n24FN zUoLlefR$GMZ2F+^{L*nP>*4Ta_y?O|WnseYWJ0{wwbw-y{F4SjMaRRWS4}i=qRil* z0I2|6n-Io@Qt@2Y0EMkcKVl!AB8FLf~y0BQBwaWXSRuk~|8E9-7Zzy_!XVrNAlM+H((2c@djPjz)G`WL529thVhK1+l7th5HY-6EDZo|0k+6I8G?U4ln!S z&{@6a%odb(t`o&Q31=7**n9h_Yl7&)@olE>us;o9{p)>T8&0!{?DZjq}HUJzN5pQWspd3&*8X#_H=ryRS?- zho`tUsNB4i6^u{?rDQFUm@tI_^}-|+e!hBnj=kkH9c3b9-uz5N&ri&%4{Db-%C)bCVPQ2(YD#77(-FtNtX*G5o8`PAlP)0 zcxaDM%eHmlnhf1;lu+OXpHbzDSd(!fA7XZCWW7S*0o*&!$+|OQHge_iyReRNN`fzu zxPkh>>Ijsq+;+2BKFc?Qp9}1n;=!)qY}4Tuwzblbv@K2V>*@?IXa>`x_(8eY{5a2J zG8HsQOQj4E)n&JqClPh>Qf4}S6cqc)P11K0;eeYU}^$bDZt|EfP~a>cb)$NQNr84pHtM#il)aI{!PIXS6TIiO!k(v3BYn-q<#K{tH=gFY z^J1pDwv9@|o3uMA(2U7B)_I38Z2^_MFRq(U_cqb&HMi385s3Y!4ppVmD~PLl=V&s` z1l9;I>n9DSXbOe%mb}LlSU(+M#`BTFPjNEQ9R(XCZ8NcGK>Oz*kRZ_*+lzJ(&@Xfet)@eb05M@+YG{aF=x_+Ks$*%%mvB9x%Nu! zDBWDdYbO5D<)-WbSsavvnj!?(GpF`AwD-3YI*5*s5H_19?QFb6)PCG9l~EZwFx(4H z*Hq*@p-JMwbyHAg8wJTo3>fkKZNVH3d6njf+nwtq!JzbqwA5_YcS|F^0D_P)BFe*J z;T+i^`E%^@k+yp0^LNwF@8AD+ly&H3U|NP$t#m{&{cR(C7Ptvx#l3HRsUteIHV?<4n&@3DuwUKd56INvu8xdrd{&%>) zr}V$R*^FEuUfi#N89&89dh3rhuB zfb^KUXL23vO^SMAQ46Jj3x1-39!v)>LLjeS0MVV<04Wa1iVYy7hdP5>iDHw*7CRfr z#>BIHwk3-3Y2sDvvhS5=v5C4XW+kLHk1CF<0jaqzE5+l2wTRi86JNl>9Bje-bC*It z1f_F<|MK{GqA8%=%#Z~A;tY|RE#GcoIL{3H=K%6eiLrRMp`jm@`1!;*{8L9hty`QS`fVkjG z0sCSrgnn>!G2iAnR5i&94vW^S)YrwUO5X)@RypkP=7`FlD8~S8 zFXSi{R#gK|^aB|LIL$+a3Z#8Dd6^w5d1Q^MGOJPHF8hg4PsAUPFB_)jx$kMDL6b~c z!RQ9!IP_$=62)FtXizCC{lg+E{li4P;0Bnlj~PK*a@z1ZP8!<;)+e>KJVHUCuwXBP zKos4vpXi#fm&vI(O#NS!)y+aUDV7PJGaJxiQH-<4lv83GgiWB#oCT?Erk+cVat59N z*biEI7qn3`hTq}aM`E%!HCH{)vtC z>gK)71|TIf8|!Qm3^U@z{YS^Jv1T9u%QiX%uRLhV`U;mKr1H23MysVP?ICwbF=d>G zG!&Sud#J{h?RZB$kRY1K;4Dv9P#-4bwi@6luGz+{7M5O{XRa$ioTyZ4JJH@G4blMpDa+_b+0OJq{p%qrZn~@}4 zbQ2z>w5-lD71w+Xw=Gwx1zN#H682>ovdzhIx`v(I{48CXLA7yqGfh2dZZh&K;BOKGxqc{6tXpHL?z3`9Y@^lG|gC|Oq}$k6%p5>6d25=>rK1sQ{vScW*EC|A9Q+#iUuxIz(J z?j?j4azCazie>F7J(`soOOJ?}Yn~WNv=mE^4I6s;^2dhXjr-{h<`p0fm+A>n7c@W~ zR;Qu@sAD)s=^-$iVVEdrZx;USo@B%<7v!!s=h!BKu*8rt{GJi=NW7~{` z7d$k0B!hn(f_JFOU0Q$6cu@yl#ITcgZ>aEa7bf41;hFKrme3Y5jk>B={<#!h)L83E%{R#Xr&)l_*^caq=qiXbB(upWM2OP?t`=Guv6laBu*`jTFM9~wVVz7# zvr-(k4p@tf=8U{Q)!0J#A^(QT}wl;CH$n3%d=k4HgJzqyqE z=wdvifW^-iMGoql-K@?xBsravyM0oHu$}U7h&9Rz0<>wAw^e2cd}kFEX+Rh-S)Wmf zV0a!a#E>h&OHADX>Vrbk*!{pdhMw)WK9es!u|<`oOBO*J$yLeeWCzodwo7o>|q9{~BAClAeP;wR4gwr=Yz$QyXYog@7%qk25F(l=^aP4Qrfxe);)3dG>hu?e!-d&q1dW(Kl#u4d+P3OJj?813*dGPSI0g;dR&O(GMo-HZ!3uoT|yWf~Yd3yw4qg)Hk!C4vps8dK)NkHk8^Dp~ z-hl6sAv&&ZoxjWqLBHP#SBk2gF~qr&i|O1?Ci8(~;n~>Kh^Vp&Pb4niJfQ|BuT)w{ z{2-4pr{_+RZ^l)rTFnr;yqtkTxj+bk6X?^=rzd05F7Y0Og;gS!4Wl@jkmq3U34%|G zVSz3q>oIuE`=r8U*5Y#XOn8E6!s9lD=323W!2sLc8x`uMrVzJxq{;BSu8ym_P`w(? zg$r4~f$kg6_eU6&<6)g<4^ZOqm?Y`LNxVDojlSjOx5yFr)PV&4$75o=vvg-#n~A`eembS z`WT}8zRI-kgDL5Qy!qSI4{)Tq>mcEot@|NJ5ovaR; z0ce2(q{i_j1iC?jx>I-~;|DTwr3XV7v$bLRCX!z*fz(YI9R&@CL>$O$gtD%PsiN9m z0ylx_>^Y1m&u`ZBSvmRe&F5QfvaD+3_2Y!6Awl6x;d}|`Xc0qO>GJX<-BbbfIf!o} zTt6k@xb03(A!N@2@xoPIu|pmVM{Uf@iE}P?d*H^yn@gjFh~U*8WWzXS#S1L1{=^K2 zDZ@9q7cPnU5XHCv22#~aN^ z?th#Xgp_E~f{3KWu)j|Wa>qk=X+elcS5xqIWH47FQ9?yo+tB8S!;7iTar=8nX;6wK zDQ(3faDS$y)BeIiPkS#63tFI-%ho@3jWJ4yEh*Z{OxbzCuAZR=E)5TCH^&=mP`!6B zGE%N4^U2p$RjtX0DPYRFaXKBr2N4D$)Qu9Ca-nN*nozoFtyiN; zmBNXR`qXf4Y8#jJdqLxZteB^M4W$%x{j<|uMgS7=YCo{%6&$G;e+R9IH*29`N!|Y} zQt8@lYAJ?#?FRy+u5;GJ-#}_giq`T}Tb`RohmG9F=~d`Na{RA~pfz6|2oCA1v$r=6 z6dSBCJ_$^QtC3R(E&LGd%4yPkxFJ9dQ!hoMxEQ(}Qw>vd+7?ktW$|9qM`L?}ekA!- zV)F*1wZTI(rGG$J5NhOdZ1aYGy~nuB^z=Jbk7_2LtW= zVs?WYCz5DpHLiSNgenqp( z3KpJd_z2=9nrTd3ryZ@)`ZcuYh{o<6Eso99(9QrIqbsKhdpH5rCG*chpBQEgQS+Ne zI^Z-8+KeKIVAh_caT9e1EUm}n=@9}KKzIQHXGEFU21H+`OR}}tmWI|@aEcxb7IwY% z%U4$-!6f#e^C%Wt@?!1B1v4w*9p<2}jhn>~z{q#$YbA~6b*hEpHQJTEwIJ;zAbdnT zeU^8uPmyDMgK1!K2*MEyo+UUZ8R3HiA~|Q(+6bimuu+jwKyKhA9c)JAAJt0 zYY((6)DNwtk!{-q)JL7u+LwxOadB$05?XpusfY@FR;`M}Onw}Sor=o@Olpyu$v)-| zS>bj~S2ev0MpOq9^FUdOk-+1lxW}j_Nl^7NlPH)Z%1;WRW~uFHv)6?W1fRm1;AYW| zbvp+5nv}(TKlIMUMX=c@Y9hGfPH~?y9cM&SDmJ5o)MxiHFctUTGEf0sC$U${jDPVK z*IE32&*=5)d65IvhLS4a#D#0o^roWmF?`eS;#wnPyT1qhwn^n(4AM$jN}-4rkVh9m zN@XquCeSXG2R?0fKaPCXqNGV9p9gnqI`x`Z3d?dJ?ys)BSPcz_!^Hp`*L3_mg5>MI z1%|Zy6L_Bpi2NyEy&lu^hCUF$_icqbpuOlI)g>8=+O0D5YmMC16d1=uw z$XmAq3-=FB^aMMe|K|MOzO5?aB(+gb;cCG+vu|(DKfnJavK4W~y)KcD+6IsxBPid| z@pQ?QOJoJAt9%a_J}%}VqOm}f$O(pLhMx#SCoR=tCp=*4QE0e;MduG; zcp-`1tLPeS^a@%&bPx*odPE49Cd3X$8&DbxL+xJBmI$pDGi4!|WqrRl!2G?CIl^vS z-O6RXRGW`>AV`&4UW8@6UKZC>B*sSWj+0dzRB1~iy&%02aWw)FWuZz$+)&d%#Jm!E zT}j=H+izz!Ur$d-*232zT_GXwXu+vB5Zf~zV>@iGRx>*a6mQTg&NgFWq<4P=hP*T; zMEogIQ;Y!vKI&%!Yl-_qK1+ySf~agSkpslaW3)|mSF5m#0(FG^>@h{|Hkr+{2vgT$ z#fb{(Uyp?`Btsh>Ep^-(kE%Q4QGJFJ^Dr0l@BkQA4`=nRNTjB2$x7Pes2<*~bQgfR z$FBV&J}Z8LmrAWnWo4XJADjxUAPMXii(FUWskt3I*;No8IQx^)0;FrXh#jEjE9DxX zn;2tUXtv;cDLR*j4#{ZtGzpNQ;<_nqNzM9T`zVl;hlqubWlH^d7dCbUT++oltU38)zq<}shlJmH3=Dv%oU@}l1wE- z>h0Uv8qUnUQqyThM+iM#mDF*`ba64wsNcAp&oOmyEzPM|p^d%;YxDl_^H*P8-+cMq z;csuRKdoS5>i%V5z@YX=II(Kco&7S1=6kdG^!C5K-rUl>@96vzOt6Q+bRyAskMP}$ zlDeo)hv-_1&$SQ6b3X#!*DKxu7prcX7TnZ&vtM#Ja(Kf|q>9Xmf6VmJ(n2!950EbY zm&-~ONdOG$K3~I{NaO|N_md$AzPeWxNIi<{1uJZ6jx<0i6Eg$0#7$@Q#0NZ%n&36# z6vE2yVyPqA)WL8LfwiGv##C8Qvp^57?9&_hLR}kfR^!&*QOXN|v!aWkpHN6Z4JuQ% z(pV(RFK6m2zDy^rLg{|^@F-y+;KT&YCX>ZVY$$@fT1ovA$%B1+St(0$t@@<3j(CtB z2_+Tv8cjncCm-KMYq|!4To3)E?@(p;H_)8}s$L631D=D;dNhKp=jdXL?+ndo}qM-g@hYS5U$?dGs_Xq zBOd}KY@2$jQ<921g$tG7WN zHD-!jl!Y5&g#(46%;c>>WQEipHq!o@1Dj<^B5Y)r3otwsh=vmZ^fOtDUWIZg_i%i; zYLJ)XY`Dalo{ic~s`bb~J#hQ!*B0^B?Pzt6UD9@!5ioEy-^1y{{S~}8bEVFu$3?_( z7}mQSt_#-Nxj(URJjX>q4eeSQT|x$Lt}meXXscZ^5;a6`Gpwn*O&)Bz;M&Ta#W8|T zKot!OI^2bqt7hZSMcPO@rV71!_3P`)Zzgoy2Pt_XqHDz{Bo=sfLK_JJBsr?ZPZOAS z5}8!BbgU~f_mF6+aaGRhLzsp|LVWez*$}zW@mI7@UM$krHEr}9iM?=K!E6oTQDa2o zUZ<^EU_A&MN9E6F9l>`iPjEC1rDj_{a#d(szYmfp)N?TPf`tbH#-GXcTg&A(gr+02 z0O>+8N#s4vJRWLcz9js=KjY6njyfcdld zl!3d#x{WC0;aNb4xKw2?AU513FLKD3Co zbjpZ-=?2*b5rMtU#ttrbZ-k6G4Pa+S;0`e$t=HzuIYa~Lx6Y>4&!bPq=`Ve;1C+KP zeO_ou*V8zG)Hvq435sU7kkN+<?uwJ8dj0tw4*wivIE2E#Y(!PYQ039=$+4PXthAznx zr$|@XX^{qni`Dcm5YpFo28Uci^@!d^%?D9Y_nzs1^$^e$aV^xe5FAisn0`rWSd<_* zWJ@|u z=?t4^>lr_ z9~$aaFg!p(h=lmMy^K1+C&C1eNm|z@Qi&@MAG8Q%1-5;DSglyZW&JlkeS)e^&-rVe z3KB&GLB?OTjYr!X`+U0Q+jEyiN%KhxjgsEw%CRyrw~@V;jSWMdZ?51I7XowyWN=-a z-yKe>DDWb4h69^qE=ZbDZ7nI%-QTdY?@FNUY0<4zrXmthwNH&&4Tu`++QvzuQLNUN z_lKfdd1&br&C1IVAa}wL6eME{)kkPtZqYd+ErFF7kUt&NI&p_tiR)K=icO3Y6}ITn@o zm=QUMOpDEo3$a>_7N&3Met?7u9Xy{MiBd;B?sZy5>F5OZaAXpD3;fgP9oTVGs8L#pIzG_o;o(AUUVD?O`W;-_{7$>B?+pr z8U<6S=z|(gtaz=U?`6m1O2EJ4r!&MrNZZBliU4R-0qmHBilo+fc@F^K&W4}+Axcw$qVkigQD%+EX zM`x2ukIi6)D>x7!?8Hac`@Y9urD&@mbA1=%HKL@g*V_zNE3lq2dpS_3DcpJU;R)g* z(Xu|l_1G9J6fIGK^O#zQEYq!5#mz7En=on{4iaLD0$Rb14ooa}(iMSYWdl&(?hr)?uTP!#e&}W6DhQix3bLnz?euT`*u)|fJQWddw;YsLP z&`N05f##)gcVG9bjgmSV7(*9W!a?aet2CY=I3dNLB{wp96juiYDxnmUwm2 zVN>h+)Lzk3g5?$V#JPohO$%f(0>bbjO4Y)Hg@lLE)#d6W`|1^SYRh*avc?FKDp;H2 zt7iXZH(~JdBQ`B)surrw2DSkKiXGvrlOn3LP(2cKOc5iKU-2~FEi_HZ@&vcg35?Cy z`6&1%!(xtfsrRmP1&Y-mzX*YrW;J=u@ub^6;1=OtD3DsEf}{zF0z|MOtukd(f+x(N zBu-%v1qh1T%w}H;jn#-ah5w$z@Z!LYH*!Tf2@a?)hm)HPNH!ju}yWh?~e|XKXQeS@a z?c&wVtM>>qb%S6V@;*+$T`T{nYy*WtbV88<*$ev-lSuKmp@3}-HJ3cH7ViqA#p)JW zcz^lZvyX4g>(!}^KDhMp6WT57FTATfAQh>Yv|4TsW~ZcSqRw=Jngn9WJFbap;tkZB zt5EnQgQ;n7g6&F>cmZ+ zZ%~s(WvU-!eO%eR9#75(yZ2#%=eIbk6qo7#0M?;4-XifD%(F!$4h-T8Q#SAgIm2at zF&Um!DheEadFMJvb1fFd6C)m&Lw1xjHeng_18{TPusy0EdROeQ^^3hZat%3B?CwB^ z>lvXHw-RxYsPQW%AV}5?oolHVzC)8+*_6P!>(RrpD_P3#ferbHp+hh#+^rl2u@j?VnZuX;fLJBKrx#a? ziz`s#29e)ar%`Qv99&AIJSw*mODwn5FKJAlk*z@!r zJh;Ht4$=zyipeXM-Vz~P8l}iyPSL};Me8O&oS`Bdcsf@_ou3c+m~TJNePBms*yM<< zWY**%JCboR5F{eSg6V_=s)^T(FnOn^Pva;P%N3^n3rhHu-2nLAb5cfpe#j*99j;OE zQe~~iQK)%g5|#F_PK{|(_j?WY6HN1MQb$Vwk#i<;k(^%dX`lybvS=B$py`{BvA95t zc8>kY{uX)|_i8v&S1AVkHsL1dZ-9BmF-A0AG6-AZjP*Cz2{xbZ-%!X%nX^B73VnkP zv$>1z%|Md10x8X{w3v9c-&;_Et_F3{cNdg_7CfqRQ8W-KAQk!>#}}brPCmT7o!@+X zKYsJ-o7?L*laKG;gZi0#{P5M=uceD*TgLqO-qs;upg$$tXwINb3K>IDm39&R71riB z!(X{xo(vAL-!VqGlX?cJs}sn>XkjxdcJLaryP00V&Ief^h+Uz5Q6Bx;bJE#Ihp;X;gtz3tjNn?)gNZZ72AZ(I9ie<3g z`v;o_=cn$n4c0E7osAd7q@ep?`GX&bW%f|A6!RLb>b0U2m@5eMU6Fwytt42h5=7P% znkgCsFtEoOEaLOn(-}i;Z)zL%(@~D!dyxQrL?Eh9|X3pwygy12;}g>_pXTn zZR>Vm)dB+{4iWz+_Mp?xg_kXhZ5h zN`c|5G(((MTJENz?=4_Q(g=mSeX+Z`Kxuf~SqQE+9d0j!)HNaV1rG5NB)vLT#Mh(d z#SHr3{{p+Hk*L$JPqCM(xmSz}zsd4F{*s&iZ%~-|8CK zVSAxzH8W8261XP<`ArWeQ)IL1uhvR&Cvw8hUVVbdcC$iMQ6>m@^=`AgetrG++iPx0 z(Q9?961<}jKHTT4*G`cuw z9_xVhkPgS39(w37tV^q$mMu_E2%|BM1^8pc<@bDE9$mBp)FYtoL>tN2P>EyVyT0U% zjBrz7S0P(KVRsBMRMaXR6_G@ru`%jK_B|YZfMEU~pQXl&VUb zwYYOgiFNt6EU5%>*1C>GmGsn8cODCA2u$v$>q=Q(Lu@g-cQ;JPvnZyBUkhsT{9-dh zM*8K&5iG1$gW>Q=oORl8(I%o*6cvoFf%Vl6`vFkX{CiRx#k55%3hGZjNl9}1w6_>p7=Bx$4CsSFh~R8t#^{1cRh1A;R(OK@w=}-QpdD8J{wPfBw2NObRks4 zsw~++k`?&!3dwQKc!6*oh!##(*bOy*P=T}uZW&vV_EWVV?p^M;3F(7Lp`IA{3Dybu zE~u(?ydotB^refgCpwkN?rlID7vSWdZ7fVaOAq(yt)1gn))}0wVbX9mxMg1j(QiW7wLvI z(yt;jg1{2@r+tlI`7jV{4(a3{%oC?5Yy9NTa`MP@mGmmcrBo_z%gJhiC_>a8A+`5u zj-l%*;}bw1(ip;I+KAOCWq5dk89YiEZXVHRo~?o z(Blj^%xB+MkA?!x1C>XQ~r0(RAW8R~1^zP#?U%e~L%maXsqG8Q1KS91v%Yz?Tv8v(`LBpVMxpYx~~ua&|(Ij`QUElMzTj&>tVCvd*GTp&)#VPpY!ix8wJ_ztzk zdAoy$8>Z1NO?bt1`bc(M7d5?(^e~$lq}DnL?)bkv zP6-ooC;&y_0sh*|z6I~J`uO?g^)=Kz`_c`Fvho-lsH6S>cuqTbmkVBOZef}O#=JpN z$l?G({(W8KdoN*Qj#h>`R6BPxQl@=N7j zUxFXT>cBjZRD%HU?An|yi+vM9Dd1J;S65F{D4wXuAM@}Pqv(xqUrFZNWe<^vF`x+| z8@}XoL@t>@g`ii!+(cU^jy>(GNP|IWh`6Jr+`PYq9xg{avR&_E7mgLm&|0sqLb-*h z&{1&zRu`iwOpqf$di{Gfkwa2$9*&p0%j>Uc!bO+wF>*{?e}V-Uc*Uyx7mC-rMDt_> zh}#X#>|xqAQyQQKt}(@AsY$9=o-xiLZa$aa4HY#KqZzanTBDYTI7l*j#vIyK^srirkZ}nI#6kv#G=xZ!_ovw|@)IsuyBgBV| z4-ujv%c7UgjC5-%VM>Vh;?xlm7bdfaBn10RsKUkq@NYgwzoN%6~>UND(sdv#(6CL0X@)U}Bk`eK zm2eBP!4;vWYRX5WEui|Uq4lu4jjUIxtXWA8bC>5&&o8bZn00GQ1SOWED-y%h00n}Y zATLXiGDe+ATkjCpLIuvf$qYW-axrgBCL8Deoej}mb*9L+chbXGpghMBgLhwRQkd|7 zLMkHg3f*yfj?>}Zd-T~*y9F8*+T%-nRC*#n`ktM5is@tiq2)* zEUg@!ngAR!0R0|NT&EHeOz|4C)g?j*&MxD7p{lNd`XEEukREeEPrnLB(`W&$5NjLH zxfw)U6=s-()aGF!pC+WQg}$4PGiR@~UX`dKHyOhSfdq28_DHFu)z_HZ zkI6(F;nV~Sfm@d8mshwmVLE#R`)KN5s;VRx^^9MSO+V$BOuHvD10MRT(&2ja-F{Ja z{)c%vRP@&&_wEV2;V>yo1~7bNm#|@|k+Yg3?ufKe$}|^;U<9;j=(S*UGPr`pF|3hA zG+V(xr5pc2AtvtL!d#!87Pf5)p?JkP5SMru5tt#xJ)NwIYH-@96+cru_TEo87cWy8A)Q)RzV;^j9Nk@pO=I9 zj7hVylNN$Ju&i#xel;P#3w1ILu%`|I&+F{s-$g|fu(uU3O%`g=op=gA&oo)xYW2d{ zRo=;=f;d?h%2pUni{w>`;&9KeY9R3A(~v#RXS81~9)_m&1ex((eRzF+|K~8#`-`6q z{yTun$IW7zok+^v{0QiW-e;V-GUo~$X5Gx()D(M@4lw~YZpYYQ=C{&?r%7v~HdWUW zr@DpfLE$qyeo1odcWDJuV=8k{~h=ZH2ou1f| z5pz&lGV2xNEm#V!>8smU(4c<{Cn*!e0fg^&ftYf3@AACxkQw#5(9})vT%@JTI=L<` z-P*<$*4$is1!@7x%W58qz4SzY)VL5-SrWvcf=xJ8*Qp;M!hlsNg-qK$Xl(BH5}dnZ zr?eGe>3jr8jfD|m!veuI1#SYr&?nc|uso<8k7*3&=_ z3g5V#%4M}tQm+-oa=X1QEhcLU7+blJ19Yyy4ou=8iG8ML$T_21A{TAuuxk)ziXves z_G)CU9g<+S-fV98Hi9HaNv|{eQAZHV&mR^ae{+2^{rDTpqnKpu=1E+_F*L{&?sQ7% zh1=MhF1Wh9@SbqOc+uHL&UrXt|?i~Aq zjlHy9A{bxERyH6t*AQI8(Hm|d!PGqXT68FJwfL>^@>R>}DcEUFxpCe_IklO)Y}*;w zwC4DdbRsTCA5o5eu>c#yh?*zV7$81B^i|Bh@_aEGY=fO#jIfX87GsW|d*6NKe>^es z>huDxBK#Y+@gj!Gn(pG6$t(JMXv>eK*LE>|XQ5kG?E+lQ<)Ydss@JBo5Dau8%ne|F zX(!gamk=Cf(3Fe0vq|bj5nY=2UZ3nD}EKtzdRHAyw zG#2rc3zWKWJr>tmWY(G@mm>B-e|4I9%Q2Yd-T7k9S3vY~#A7?X1gZG#`qigjPmzxR z_L;+-t{v9-#TryCa*2-~C%TPMR##6gbStSfFRKfjFw70A4`U@24~beWEa&0pn@_i= z*B`#V{nci;zIpZG6QbWs%|+lPTgJQ}y@K)E9*uNF4+5^tRa1EIc zqp%+4V6^(DPazRmfp4BI!91c0gtY5+gCT7z|3c%AJf5^_XNG0Iv8wx<0mL^a^OvA= zj%dyTCKbYFvs=?(@LqhI0fM?8{tF;7>K!K_f$xz;pauc|KMxNl*O=hIwD zglo+*+Gx%S{F@(hp0kFjxrn?{NYf$PusB`#4)lCL$CfITYgu?$K6qd*!MN8`RD1}l zA?2A&M#ilc5VEiV#O*Xez$0YI!9pa@1)k*P^{4CGlgR?A&eyNrUEf%W20>&O4p3|X zx#Wko5{S6fqSiv z)ezq(MpjHfla9~FS2!~-oYE+(nBz#e4kB8`H^depe%-Zy#MZ}8oH#XQ7(~ayj}M_~ z7Gq*I0f~MO^iHO1umj|a&bCOC_*-OY1VUT`!9`Q6fp3*lQtns;>P>wpf%Noz$ z`{OVpva;i2BkK$0rqHevYspopl=mc9Ueko71Ce?VC2}$erskoNLc}xTqZ4X(`(296 zTMfODky4;|Psb6}noPTV=p}kQr8!&Oi59AEX#TSnnjwOFkW<|t57+%~MxMAM71bNt z_GXm|1GP)$WGW0*tx7G`3D0ffs@W(B?kiEo6EYiskw`Nj8VPIQkgtsZO>_iQ_2{D> zNpX-Hdf+MBoKmJo1W}K+s7RtayhGwX1y6=6)_5!myhL|-rdp;x?6T?%NL)A2)UmT$ z>;f61wFSFrAfvRlt3{43>t(x8eGX^1u;Vy|dD5;dLv?!n7Y=XJW;S)}$(|O-Ob!pD z$r^349No4laLw>wy9u4|+T2P#G(sJyh?0Z($fj87hXXy+kSAsLM)JLc1^hg2Z>J9^ zO$FREw+A7>;&$OisQI})FxEFpd1JbFa4%b#VCshNCZ7c3-&L>?%V>lqd*kKg7~JsL zY;X=H%X(p=k&!2hic&s4%F%({psO32E#>HdO`8Yw;N;@OS^PetcoukNjqb3CdoVGZ zIGsO_h+7h%<$VS7lqL8~Upv}#q%|qEQV8ZeDTHeskOpMOl(WT+viDDRPauVy+!HDT z=ARC3-+yy+{WYA+7$Y&0bAITzJ$09hf<(aU-EWz9>K;(ecy)#VT<>1pzI}H+*!|%z zfBntv;D`UEfwRyI@th`EX2z1HB85k1SaXCTc?uaN0VzITZv*YNQc?(O$F2mjr-2?! zG}W9@IT?z=X)G(NU)&Nj2pk_SpIPv$R5CbVAg8e*5b~QV$vqbpMk<+i7KY^)PF&`? zBoa_PimgO5UP@>oQD@YZc(OqPZ7ZJ*WI#FLMHZSbSWkhGsp}GJM#(_0uck+w5}n|b zgUPjry_{TvsT07lipdHWCECE1boK#GDlql=^AjlgJQd95XnAqD*wx>{*8U6Fx@xED z&7LFdI~#?=*`1BT`|Qp};fi)=qXU^5rZ6H9rbxqt$#4tOjzM>EpVcr;AXp0b<)qu= zX7K4(K$nBhAKdj5;nZB}gWaafB$6tovUX=iFy^ORgdlVpfm_zSlnbEf0g%|RqytIe z`gNL-=NCFw5047h{nRcM)HxR}6;eU_b4~1rB-=rXwKGcbNK#B73$n5g#x-@@3|RWW zw$UxDX<@p{VMB8q+`avLrUTrq*4G0ObOn%^p33$#^(_0nX*Tf`?C zJ$QIl2PhgIHhkRzJTdasHlHYO(rBTtkTlAM;kqDlQF8*M;j4xjJhK>f5uSQCejrZu z!{pfZF>b0z4Y970Txt+~e98#0!vHmvs zYY`#FXv8RKItz2eBKNa1t~D^f&kQ|NZgz4$x?UtAphod@bvUOzvF@<4Lf@=Sk*2E! zgtI1V2l7IQUl+VvK~LZsH0c5S!AsdiS)aRS+*f5K8N>v=Ri?}HQ*mZIM43zPHqjfo zd#O`BUD0o^$a~WhdKjv-(62E_j1J}*h#O=PTFn@Y1AZ% zCmNu7K|SLM$t#HWr>p01`m~N9A_9?fr0{aWo%l|knn=u0dTNHs3#M}Ur@ERVF3_^x zLoU>Zs;`B*<}-2NGhu@a)y(R0+jG269nE++s+J%hk~C z>rS;j0pb&jwtR8kv0Ex28j-}h#-8>GbW2EVJ`(c;Q|CCA!jn zxXe78i3YK_1sr7J7I4HQ*aCj+hEg0#ZwY4p8DPa`9Wfxyk=kiOS;(3Q(HR7i^7v8GcE5gnCJ zFtMPnPhK<1>J3e((x z*6bt5@krz0OpcT35o|pe2ez(Z#)R({IMdHIkm+!yXf+_4GL~)a|9j4N}pkGur3KN82O-tX^wO_vc%ae+nUOyYK@68 zW0X-Tn9?-6p>!`>o?!Z-Jmidw$Ek)HqeV+B+4H@9_d1~g+I$Jw98A${0_;ZR!QsIY z4QswrRjAY)A|*JUD!aBbLH0BmBA_0P!j3r7$5$oItZE>SAaytlD~2el1#a>}zBg=r zULQO*`CjH;MUQShDDY(~Iae#fR`%?qIVogkM8F`SYw_Fm1E`}&FC(9^%3qupRt41p zIS0#=x|yd8HxEsif)<8QY(6v{qn1&qVR|V{jV3Rl*rGq3ELCVhRn^F*6~14SS2u4a zt10c55ZXcl`nq;{Z6>)?zfBM4S}XspF_YSZMq3J=GlUxjS-gh;wMwv2!_+fhkBF}a zk;nNt)H&7NPeRFJmDOOouuOddaj(uzl=80ed?v2#8m7bsZjZh^-G>@j&t?mCRO$5d zjym)^N(8HNtpks25O{5NK6$y>zXBH+Vb}JHY*eGoxp+j!YoY|NfK(%^0lCWOXJaI* zQVWpyd26ya$F+%KK2wNE!V9lBQeLB=L&t#OJOvYHj$8;t0jI2 zCjAivAyKcszu@xi7lD3H1-R<=>#uB?!PwWM=YiAh?R-ey|} z7OKb$p2#m2v~a1an?W>A^&oc3Q@b`&QGJY)d~~`vgAf=tsf!eo%X}JXAmK!r8xurH zFQ_+y%M4s(P{Y(CR%LsOy{c@T=oRoby2sUfAbgJ-|>n4db? zBgDZqvO|ns;AX-7iXDa7>2kUrg2$_ab|mbvd~pE-U>HhJ&QEmW73s6I!d(60ie*v} ze(KnvfM^0{FX+#zFoyJlg=TXBA)rg+AUv5e)QJtlEbtTg2kBLX#a^ z_IS>_eU1=tuI@n?9y5CAC`6oHGrm3e0j*?fc#y8mq~|CTU4=pfd%!t?+Z%+TQvxW+ zk}kn}%$FBuU}%>N=mQJf^+%Z0eSQyhv-4;0PMln(E6ovK;3I*wO)8_ZWd8lsZvU}c z{+pST8y8 zkPhXhNvV0Z>B6=(NjJyw#F8Pv=Ni~HQhcO34WU7~kO{fbT5<8Q()eNs1TLnltHk@J zumR$l3#gVP%RMX{5^yt&Z6xU^D?q6sX*02=hs<$26s2kpXU#@yJ{cpdTc{(39gLkE zwF0aLs0So#gw{tk^T!CnQmW=Uz~URpmJ4-I6Om>D3#v;=GY!)g$XaONA_L&`^REXw zi%iEOnG71tUMz5L@7^Dd9$-VPH&;{_Zz5_oc_yXxMBr?NYsG8B6ZMbl`Rc+Upz_NF zqV&mNc&n?d{9ZdxSSTkf42k(s$GD7#xd3W9b;(igcbtP_WG0gWY(lIlb+6!&O!vxZ zp7AHQ4X=q>QrKywS7=G;ffE69{aF``cEEb5u*9m^S;-{B2FoCJr!cP;Ip(w-5E2Bu z<%7?)_4@dbXV0+#rHh43C$5f4o&$3W#C?Dy2hqA*y86OQO6T*%{r%zT(vFvTWyvX| zm>BK<0QqcqIBBEQnu#p*Hi5PHeO?kNXzV{JXS`;cWHIImGtv3HTkts4mm=L!iz-XCW8l^(jw?yFQ6(VG4d_X~n;Y6e=MRv=;D(z=l;4$jXqms^=WI#Af%)N~Ng zD_>Am5?p)KBL+Eh7$w1L(aQWECt8`CXoZ+nb_w(!OkTH+MH--nuFl!@4kHd!d2kbD zC1&*cCXGA{&r==c?5@L*F`o$_n=RkdpqleA62lsFH6*bxO{3g%w{#x%n~1s5m)nTN z%c_N>>}i{>xu>DN%oD~OJbO#AGxjqtb;u5!l-J$p(@ajJU6l%?_xHJP9bV26LVFJ( zsHvr=CT4Y2UF>DO^^y&b{MLMfU*OC+Oz12P5L3ytO*Brq_4bkFWRwjn~DKRMf7SeXI(pM^5q@u`Fr=qOV1@>T<8A$33411ZW`mEAmF{ghH?3NAqf*-@1w3oyc

%a!@4b!47gVGvmhb%Shqs@8 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 z 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%0D<9fpeDg0hcRZrWMq#$05?} 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%0DUh# zE&6-tW}PW)6O2&tng^1I`OajOr$Rj3{Y>V>{KvE@te*p|6Pd6u9_ak^Hm+)+D zoNoDrrb)~ujP?phqGhn84jrIIPO@87_$di_2dG;l7$MA7!l+xkGwH)UHOyEVWljYgJSvP6iK_JjMxE{5 zg#fgeF32;)O)>wn&=z3b6kE~d#wqOCLiO-o>4E2IaxJAh_{SCB`+z*Brrz`*Ma^JF z)#s{7BrhVr}Y6f z#ArPFM5(d3YE3J*r#__<^s%Yz<-E10i(aNJl^HpvQL}B9+fZaLHkmWX?w}V}nu%DC z@IOXM8#$a+wzmVFG!mmPOz~m@Co&n`Tt;@VdPC9Vk~%tQztIh5*3@1Jo0qZXaizfu zZgC&(N=wDK$R~3#Ho+^YLHF|Io}FEp+7&$X{lGMJvb+ZiVn@0RFcYK@D=Wnb1aFSX zhFU@E$fIsbeY4h7I>6ySORnA10nup;AfKO}KKl9<=Ly*|Oe4)){8x-wajkC(M29z$ zYK8l0>e}iSny?f|CAxvX;b@e+^=x)Sa*Qjzjra&m;N7B?ca|+2O&R9_WY!BWI94Zy zIIqs^oUo^4Otdig^8VACpWolVRuuu=>*fY}L3EB z9JCF3X8DnD>;NxP@(f+59vvSShCtUw3y4TyfS9aq`lGQMpw=;Dx@}S=b>WeUM^q$c?u8#*){AiZ zk!813Fe2L>qREO)Bn`E@EzOrJ6J*PWgX*0KbOpP#%

q47Gxtm_56BaBcXtlCTfkt%D1}n9TiB3 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 E3s`KT+yDRo literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su new file mode 100644 index 0000000..0ed7ab4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su @@ -0,0 +1,7 @@ +../Core/Src/main.c:37:5:main 72 static +../Core/Src/main.c:75:6:SystemClock_Config 88 static +../Core/Src/main.c:124:13:MX_GPIO_Init 48 static +../Core/Src/main.c:160:6:StartDefaultTask 16 static +../Core/Src/main.c:178:6:StartTask02 16 static +../Core/Src/main.c:189:6:blinkaled 8 static +../Core/Src/main.c:200:6:Error_Handler 4 static,ignoring_inline_asm diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.d new file mode 100644 index 0000000..66ff373 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.d @@ -0,0 +1,54 @@ +Core/Src/stm32f4xx_hal_msp.o: ../Core/Src/stm32f4xx_hal_msp.c \ + ../Core/Inc/main.h ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Core/Inc/main.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.o new file mode 100644 index 0000000000000000000000000000000000000000..486146ed144a72dc07755bdf381fcf5a14105407 GIT binary patch literal 1090100 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%0AQW2_F$d&*Dq#2i>TOJpvR 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

Ag7 z?93J4nb*>IN$goTrh4!y?~wm};N&n2Lpwi3bbo)dK7eT~q=`o|#8Vc9Nx0rtqXXA> zaE%aFBlPhH|sB(}nYU1^?zCywGu(j2;f6GggwQ5ln9v`wmvy#mjCth@z=) zqSTu}>WqzvHK6SrDO(5dlQpDUZX9qL)a$^8Fqxp5ie+0k`1rL zgyTxH#}f%`c?Dl|yc)}ahi)csaR!Lr^h56Ks;oJI6D%W0Vry1vXwz+n*P+dt&wtg= zAfXDUUONb+@d4n!I`hiSMXjNff!0A2rNE*W8u=*7`aU*dX?~;gxYEbQ@`N)Qbw}Co z)`jXFiABC}zDW7twIY@PVC3@}S9+D;ZaQt(n~uBz(kqB#Szs99vmLjqXjjMLt+0DF z+lY^~F#x9SK&edBUYRyhTbMRT;@v?ZSw4$d>45cQ;>eBckXM^i6$7RM-jj4;g7RT; zUkMa3Mkf;-&+*$>KspY9<*zKb#h zWs`5gj02a~mwJK|7^-DfK=EzBMhBc%$s8+sg^vKKbIgINM$@YV(Q5nVsqSOb#FLQ} zl`@cJcC_2BkBV0YB0Jg4HrMdqulLiwUV1Ij27~T~2)Y|xR9cS)lxM^}*Y-F!njag0 zy1{tY4b=N6D)s+U_pZ%tWkihTPj>a;9qIDR~f*{^9D7M$2<~g%izx-2XRM^=d0_j(U(_DpfxB!*8o`p zGsCpHJSh8@BNZ`76l{k}yNi*^Bpjn~0UHkkOc-!F@Nc$bu%ez6GBW&HA=~U36>+0U zIwn>jm_;GI(GEoI4$%YHKvNjou3v`MHxbbE1Swp#}%>^h*Zxnmg8%`9=pPp zlSdHOGkGlT+bhI^<+5s?OCy6*iB)$wUxBYx?El2%jS@X7O8VY!M4iYa>3NK;n6z9UzY? z#D*4xNo020lWJPHP*Lx5Qu_dC?ZTD7gBin^M+UMT~>(ML9G!hT_7P0lG-WC z8+c0*4aRo^!73dkgVbJNO>0!~F(pbBCd!s1-}fMD5P>sD9j zr1agcYT!%!qDB~-`HkEB)8rp!G#;M=;ag`X5uZZ^4Z!bTti7yFx8nt~ldakJvQBOJ z4H`~umP~e46a>|UlU13BQrW3VZ!z6Am3ZTqXU~m0oo?o91vEqT8Lud0O+}tSkYBU4 zAqJ0{;8t}}(o0(%k1Zy(JZ4!;Ss~Yge}Py$w^BCvk`NvPhJ}x>Okg9w)ZAT6{+EuW zz@(k`ijK{4!)BU^y)vfo@P#=Jc8+Qt}J}q6I54u&DqY#ec&Kt@} z(QYhox4$`>q4mY18G6U~TJXUCWAO0P&&b*a17BG+fFAbveqVj)YtalfhepPE=pQfm z1jNATR|+h^trBX;!cq%vrQ+R_`@HxYJkuCz#g%Az#2716JFP|l2O8<%lBQUjl9cvG zpcj%r3i=Q8%;Esy8>sk}&3Z(w_Y;M~Lbk69p^zU4x1WQ6Qs)|EkA(gp^^(w^*jSx) z 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

CU~?LJR$gK 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 z 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 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su new file mode 100644 index 0000000..a67f254 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su @@ -0,0 +1,7 @@ +../Core/Src/stm32f4xx_it.c:71:6:NMI_Handler 4 static +../Core/Src/stm32f4xx_it.c:86:6:HardFault_Handler 4 static +../Core/Src/stm32f4xx_it.c:101:6:MemManage_Handler 4 static +../Core/Src/stm32f4xx_it.c:116:6:BusFault_Handler 4 static +../Core/Src/stm32f4xx_it.c:131:6:UsageFault_Handler 4 static +../Core/Src/stm32f4xx_it.c:146:6:DebugMon_Handler 4 static +../Core/Src/stm32f4xx_it.c:159:6:SysTick_Handler 8 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk new file mode 100644 index 0000000..37f077b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk @@ -0,0 +1,45 @@ +################################################################################ +# Automatically-generated file. Do not edit! +# Toolchain: GNU Tools for STM32 (10.3-2021.10) +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../Core/Src/freertos.c \ +../Core/Src/main.c \ +../Core/Src/stm32f4xx_hal_msp.c \ +../Core/Src/stm32f4xx_it.c \ +../Core/Src/syscalls.c \ +../Core/Src/sysmem.c \ +../Core/Src/system_stm32f4xx.c + +OBJS += \ +./Core/Src/freertos.o \ +./Core/Src/main.o \ +./Core/Src/stm32f4xx_hal_msp.o \ +./Core/Src/stm32f4xx_it.o \ +./Core/Src/syscalls.o \ +./Core/Src/sysmem.o \ +./Core/Src/system_stm32f4xx.o + +C_DEPS += \ +./Core/Src/freertos.d \ +./Core/Src/main.d \ +./Core/Src/stm32f4xx_hal_msp.d \ +./Core/Src/stm32f4xx_it.d \ +./Core/Src/syscalls.d \ +./Core/Src/sysmem.d \ +./Core/Src/system_stm32f4xx.d + + +# Each subdirectory must supply rules for building sources it contributes +Core/Src/%.o Core/Src/%.su: ../Core/Src/%.c Core/Src/subdir.mk + arm-none-eabi-gcc "$<" -mcpu=cortex-m4 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F446xx -c -I../Core/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I../Drivers/CMSIS/Include -I../Middlewares/Third_Party/FreeRTOS/Source/include -I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "$@" + +clean: clean-Core-2f-Src + +clean-Core-2f-Src: + -$(RM) ./Core/Src/freertos.d ./Core/Src/freertos.o ./Core/Src/freertos.su ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/stm32f4xx_hal_msp.d ./Core/Src/stm32f4xx_hal_msp.o ./Core/Src/stm32f4xx_hal_msp.su ./Core/Src/stm32f4xx_it.d ./Core/Src/stm32f4xx_it.o ./Core/Src/stm32f4xx_it.su ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f4xx.d ./Core/Src/system_stm32f4xx.o ./Core/Src/system_stm32f4xx.su + +.PHONY: clean-Core-2f-Src + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.d new file mode 100644 index 0000000..8667c70 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.d @@ -0,0 +1 @@ +Core/Src/syscalls.o: ../Core/Src/syscalls.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.o new file mode 100644 index 0000000000000000000000000000000000000000..912586a5f64632b8926157d88c4d5e0a7c9221ad GIT binary patch literal 76916 zcmdSCcVJxAnKyjz6v+j5ioukN8zWniXQYud0^2Z>MzXLPnvpGo$#^s~vW3;qNVe&w znig6b34{>RNLdI3lCTM+Z_4h5KziBKO@FgVzL11XvdQ=RJ?Gpz_g+aRyWjW6y8@qn z&OPNh&w1K8b6u*d-84Jz%T0XF#P>Gd;tE44qpcUpbn41AJgG+_!Bxj3IB2(o`PS};c56Y zI(!KJVI4jK{|X(x68=>>d^P-Qbog5M*Xi(4_}A<34e)Q&;hW&!ti!j!Kc>UC!oN+2 zZ-;+}4&Mp?)jE6^{JVAd9{Bg_@O|)Kqr;DG z{1E)N=Sopz<-+#za9QNboia{-=)Kk!hg38zX$$%b@+Yo|3QZzga5b=zaRb+ zI{YO359shy@SoP<55oTt{_*eVQ>gl}XWK7*Ids)z2V>^C)$LCF=^Nf}Jbq+f^S;0R z@vnaiwx7KAw0*t5`CI+!_61GPwjX`=sLn@P?8pI@`Rh-QK79-7yu9z3eOK-?)?Jlb z^nIqA?H@UC@#+7#?+Z_!HhI;ES$|dT%8{!Mys70k-@fX=>h{&THE+#@-&b|k99iAY zHr(}o>#q0IjnYfivlGykJsOqXyzjgNy)PO47o$I`+h^x<#O~CaUHxC(exlRf(x;9- zrRJkN2mDg-{g^pD6Kb9o%`;CbH{j3xpZ4FkI%oOYecE_jeQ~jq!!^6f8K25M!O2}N z>+qcl!w3mRKYo3Ql*fy!SVg%=7pp-M2e z72)1f2T?H)s@#4ayanOcr07-NmqUSepoPHa&Ln~gg~B7_(=7Lg9u^370gVN_Tj89! z6jhAi$!EY>tHNIgP6*bjaC{}giDgYJ^CECaaO>*r48Mcn^L4ll;hidc)h2{5KCz2s zUXH;TUd~+?{MF5HUXU{3&ZTNZR6zw$%CFyZLJ zRR|lEp9Q)L$12&?1xE0^4iwIvNc0lC5D2Ye_#~o;;K@L|6$e*wN`jZ1i|`#QzsB&1 z7bE=UmH)vo>KherUCAvRoW|fP-m&sIhR1-|D&D>F3k;ve^3SgPA;T3c|H)N}diwL}t??+PMPvm%XRJ1W1%NbL!n$F9l^{AhF`JKbk2;1s?F!G%W= zFpWjiV>A3C4m7 zl>V{ZqG2q4-$iKnoJuwrMn8}ew2%^6un;ko5)QG_32)9LeccH>rZymN2?NH`_nwZ_ z^^&@D=q&Vf*^+In8DjRb7tcZNyTeix@wND8K6nT6m!FLz(tP(Swj8*3dinZRMlF6c zaPQ=b;`kv%YgBa9SoyY{$bOsC4mY9s;Ih00?*S(jF{FMAO{|z0Eg)xwZhggg@i3yN ztLUV$>T#T@=4*WwS7Ng-4{c$NQ?WFS*m~xmR~XdC(A`y!V<(t*Iki{IXIoHa#n8+! za#k~pL7_a?ZrP3FD1Xc;j|E0Ir}#CQgk$z37|TvTar3CJ2xL%j(czMK2qD7(L;uYb|uP5bI6VTaPR=Vp1 zPgoUR{Ej|;Y-K38EGT)w)w)b@&57ZPpAC>IVRw}qTzir`_Q&AKuBa}u+-_jiDXz@m z=@k+S)~;5m!Pu$cz@s>YgB7Q_%7ub;Yr=tT8TRV*@HzKS;M2in_B1R%BfRe3i;=f6 z9NzFR09AMA^!LAKo*7=XoeiIImZ#zGn^vge-_7MWu}SOfaOgR}l&68$zZcC=@(vK{#AGhE9aI1H;D6SJGXL!#Qkx2b5IU*lyA7 zJArNSRScV>ijn>=gURt7i-Pv?6NYH)g0=glz95x=1mJ>yWb2#n7#*5gS zVIu(K9X3`D)9sV546I@J^O%&d@eM3g*m$s$?sHh7u(3Hu_pxPkyD*5b@i|aY2xD!- z##e#s!^W_rZv*WZHkNLr`zh)9sxgMYi1i5@mlx>%7KTTBl;OsGbl-i|M+8F1$c2ponSn1hGklh;+A|9oenuek zdzUkOf#hzfX81-K^=+~uCjyP3pE9fOE;4*NkRF3Fd7`{14_e+xd3xV(!lPP_&b}Iu6clXkrxtVT7nr=qcB0tLTDw)p@3OsyB zW_a6WO#j^=-L?+86HIBuyLYb5<~XdXQa<@Sp`el*(=|QFJt+ClllDCISe;O z=w2lweWZ@z&!0i}v3+!3CGC91VmKyy^Qvx!*9e5%D=pk}p`^%nZ|h|ECF$FnWfTv} z=qh$I{o^uk=ibKfJNDE4&ph2;S(m>aW%%edbknl4ngp9|l%5X>PFvo}+?TGV`v+Oy zm#$#=N`Z8PdqUYYZ+30yrY_*20u^UUuS|jJFAp<)`E_*9 zkhMNTX7z^x6?^NM{_`{FzGgk$12Vc@0-1-T|LxM+V=`Ae53yMIT_cL%b7kQGxm_wJu1DrOIEo;Ao=YDmRWik-TXOpztK+j z3`yw|=z3%mQ~oF`^`0#ZZ@7f+%Ld(#%S?WHfZQ&Ifadb(!!mxQokxO<^LR_+jRlm?XRLcCFQ?Y!*EPi`A0I|a0gS~ zDDdzHIY%y*c77u({{L)X?$ZLpJ+hh~73f_h^L$Ezxo>R&$7h_qkKuzTQ(=4&Bdsv5 zLH{d^3?Q?@NK45Y?2!uN?UhtIw;E+CjPJ^9PabBHj3Fb|Y$4 z7+;cJ-Go)EFusOfRTz(9mMV-@r_nX)*xG%7!wTc3)pXwrEKy;c*2VO1fng6DHL`;L zAUp9GAfdvzTwvp`vicFBul~7uXhZ+Pl}W(kt4=by!yZg~~4*F}BoY38rZaQDvK3O9TEv~H{W&xGDf zF1-fsZ-T$&@O~FO4`Y=toqX*EB%FQqiEtyQ6B2GTFA5`alld`@>{fHpR>W>I@8ay= zZvKXi-(l|HY(HdPML>LudEZWWe>A^Axs>9&yH}_Hx!6FHcxVfQh(ukbdGV(E<9;m z*Qt2h#fUF^H%D>WXR%7*vtP~C+j0V6ExhgID!A!Iob9nK+;exDOWBoonhCb^Q8QT& z?~CU9ux1r6nLmG(ZuXqyEn^~WPcf0v3cI^)H%W1UzfLUa>o;Kgck{>kxa00v!na^AT@55&DBzVu5 zS8=)i(L7Lq_Yre3I)ffwPOy2_{K)}$&zV62+sDlPT%eDeR}uI>VSevac%L+DEO?(X zpS>F1r_DB&{Acse=u*W`%_v*BDewn+HwU^8!@DK$ELZecU|B9Qa z@n6_<^E=Ogdv4(<+^z5A6m9!!HQenVJPYpmf9AZlKrUv4TR*xOZreftN4V!B{N_a; zX@>i%C%E+42e=InZs&+bKfooL{Aw8Pp80+R?vW=}!M*M}po;KO^Ys`* z_?z&?0)njgC!-aY1jaf$CWM=W@+HDBz8_XhK`Tj1SqUd}GP(M(Ojd%zsz z2Ol)Qz{PpUd=01kVRIk0V)zO3-|0PR_OZeT%s4ysl=&C#oTtqnbEqFOpW_mL*nBNP z;~DcS1Mq%gE@fwbXWmIbdC9E00N(G-f4&mlAIxs%{n2dT!o6(%U?IH!G}m*=|6=|q z2k*bk@H%)m25veN-gg4ytneR!nQic13Vf4u`}@G1?CxIz&)xvB;N2RuZi07P za5IO+z#(M!Mm#9 zeJ^+kr~2o?EVt_~g72Az_fqiU1MqGSO|t1bLj#w>yDM}(r~K~Fc4C}+Llw8cdmyxi zV}Cew?-lUg5&H3Rc#no^iKE{a`cLlR$3l&3;k^*5x)|P9L*oZ&?4@RUxlvZ7hVdzn!Eq^p)~jHA3_gvIsOV!(H%X1D!ZQ5Is3V zq;Selu2rcT^Jo;Hw`BO6fi);q@%=yqlXJWc%7!bh+d+W2&wK%csCccph~NEydBYlb zA2HuV@8jlIN8o+N?89b}&a7C-U2xJPV>%xA28Xxqbvxj0D4h%UoF5&8yXjp7_v%k_ zvTI-F5=U3?EUNq2KDhDE5!MJ3^0h zGu<7Ev5D7)&R+oUEuoVLfamG3WbVL+zZ%FNXeuDCham71zQ0QYd~D-V32;2|F)_uIG|`IrOI_ zysw0|5>~$&`d|d!*Frz3hxhf+|KV=-p4C8bJ0Fk@%#+D z&sLm-zQ{~16)0WycHjb;Rdqgkq4bsDG8}j(LA~;_t97HNPIe)FTFq)5k9_w8#H*KK zbn?+fuO;d^DRB+lQ~$=vUDI&@?%6p)&xRUek8{4rd8)aPWn!-(u+;B38E*47&gQlk zI5+42n)|RVQ-Is~$voVi-<$|HT>_lSm(IF^(`6M1&u6dUqHb*2r1KVTBXV4{h6}&q zoj1c>`7ZQ0ylNT4C*ID!to|Ao?bH@7Kd!wPkeOBpH{#wFgjT}aF6KA4|LmA;*#9u+b94iD`PiwP^CJhAz`gow{KgIDG^ga4*~T&4 zY5uqe-a}?JOFUwp!fwCQtnY>Q9`nDrNROK%x4?VKOmdo@F|Qee_ni6IQh1*-x3S*m z%&*=G@AKxbImR!VA120l-h7&U`il8cOoB}8$q$brVcil=%EmTs(Q_`sB1zu*UomyV z53+D0!y&kvuQ&s4?e#pWw>-naywA)K{GT*Cnf4iTwW%xLWp-^t%6H7$*~Nb|7ZW-C z!2IZbc>iv`jZ^kZ^FN3|e`nrm16AXx6-a1$l;D%tPy=_{D64P(0hjCiZ=4SIf`4HX z$$K`!ZHaIPx2|9_ZR@x^?YrpiSkLM1T+Hoy;U~FNU7?fUc3*x2+@8c~aC=WV2Dksg zO1NngXGu7-hKn&ULr~pS$8YW4&q*I#$GO|{S>_%%nV>XsJ?mb!@M^dRF9q0#M}J1l zGIlvvXZ&ZFgYd+D0>R|z9QWmwT*IkgBG>)M-z>OSJ-`{fdhcSm z*DPWmu1x{B!`J=lMz}}Kr+H>vZ+?B5p5P^dUzWaw^Wb2a@Pcn$g%fPa>)4y+PoOul zl8Gk?+*>=ZfV*uMM|S?@1k~2YcfftrJQV|xf`KP4Kte?yCQITA|H|f<)^hUBIJOt= zSxX55)?Px~*&pK2*FHjYzwQ?VxAkXV40pp-DYzRqp{wC@n(N_4wwwUBD$Zruw4x2} z=6&68tG99DqqnkFY%6zNT{r@_zL5(RZ{g%MJjxx{*ut+jE#|ip5e}jGxt(y&{R#Va z-t+Bnx8A_?ZMX1?+aF>0{O_-Wd%*)0b-6|L{>gxmH5?v&mm>_gw5`Nc~< zz_VxXNnG|z>pI}RYUoP1g>P{wF3WF$dvG)N(Bv>jcljUz`Re!ZD@V;8tbDym%M$GA zM_0kS(flB1@FsHsC*Wo?$bQ~p{`5?E$IRvY@~!564)8YfVgk?Y=BZqQyUee!vAfMk z3%q;G%eKP1*ZkoIc=wrCRKRTg}VZvq#M9Ipyy%e;J1NsCi@@-n-3~OW-|W z-b|GHqVSHVqhW8X8^T@82F z=eR7p6CCj1$po}LkDmhf;!lt^x#TS3k-d-di|<(%oFO>7i!0hd$3QUiB7Ylk3eHLf0|#-wEiiHZNp1?loIEg|9O!Lh$Z4 zEiT{#=1WC*51G&P!h6^pUj*;1<{cdABjy?|(%a215E$QKK1ek4PV*`D^f7ZY8~b^P zwqxO6hTgLl-d*9x&W88iaG0y}e7LR)-j~8}o`Ls5cyj>Wi{UI+=WpS)#3n~8_H&Qi zQt<*8{;rCzqq{PRp((D@nGbL}tglbPUH6uwaJM&dsOJZ`FD}^3aPrd$xGh_2;m#xu zz`fO^nK9V@C%6#znm4ke_nFBEYXe`s8Q$vxk8qk^AL!#&cthYY7w7)K%UO7D4BXGfcvIlfo8UbV z_``+p9t`}FXz|T~@Md@q1-`i$-dh4cVV52bOtiv#Yv3~Ok4FMOW(VIE_&j^|#lQqt z`T4*gi+m|?H9PS_;7$ACy%<=|W%+X8eoop~0$*7Q@2i1p^YFeFm?GNxdZ1?v-ZujK z2ov879LvG`R$%8@@V*`RI5Ea|0$(PS{afG-{K9twPZJ`)7dV!I_x-?SXhjxc<@J?F zSoOBk;GXy%3|CSkzvlQ8-!8&!{wN1??wc#%p0|dxyY<(c&TacyX8RwA5N|TSO5nfQ z{0>3y7W4C*#XHQuvIlpXw_O15)#mzh;N4~Zfa`g;`6Eu)J?14G+&2U58{mB_@Z6>F zz8yGr7~b~-U+9DP^S}hr#P0)BVR(NC#75!$F>o2D=+A+h3C=eK?;#+*Huwxz^mW1i z4M0${#4z!PWc)L0YqzvcOcl4Jr}9Sr+`Xk~{6AJ-m!BCb zjueX7SZyp;TjxpJJ2^VDe`LJ0H$O2}TbjoIx_m7v)Q;t6YKupvi&Nvd(dmha(NgXH z@tGP4)eKKe)kx{uShTjjrY>5C=A*TTN5<>x@TDjs(ORU|#iDhM(dLHuUa7Y?H#Jr> zJ~3XbDdvVo_Ku9_M`sGfy<@rjfsygz|FT|}t|hb@s-tL7V=;+8$&3Fz1nEzYh z86DiaKcDx(HTOhq%m#160How|qu4-sZq#g{IGmdqoz6~QF0}BV)xw zxl!cUvC?EQucCGxf6q*bownQ&Zy;x@K;?G=d;dn3_t2fj6=$l08(MDveBx zs{;9n@!^sEs@_PkSR9^282uV9=B8(+?8ezKT^?i5Uo1@*5J55!>Qu2fuKVPS2(64x zmJOv;x;?k5$Oxxd1#?rJI*gy= z(6f&Y0&nUfb{HShqee*983phaBWxOB`bMzY+!6=_t(Q}xW_Zz-uz9vGxxowvF9|Q) zDw$gXAy1uc$lMuThhZpT+6>rur zbQOR4ZG{M_Ol+`gzF9kV+}yj6J6E?~i}ZQA{Qw)Bcah%4+%4tK z1Uy}RH*+s5=W-D`dIqf4SjWH&sBw^nsbNA^5qe{DEyaq7O9{YsNMYPg*tm z>#dsJsD-n>unng_K3y|BJTso32IiZJc>R4o8 zM>5;q(wRYi0@3uY&bI8X&U9x>SBh=*Wp?zZl5N@Ep4L>hv!^p-U1i0pt*CX4F#{~P zf4o?*@)#|uws&P3CTRxR2%zm3{Oo=7RMvmY<^V08=jmfW!(v`>?(W?H!bBO*~7V!X~fld zb|f)pJ?$L&9+jOfDk~B>G%-@BiXdFGJv%&_+h4LaZnLgMC)26^{;TQr zwpUg03sc3*XGVbZv&AEz&q^bQijmsd+A4IHh&-DcAD_U{Q;ay-l3udw70~9cWH#B~ zk{8US0C%@+F1@&8L6IRcPi7{ z+tu6CVKoB)T4hZ#1f{NIf2z%5ORAw%U%C_JFe}j`vA!C#wG)|rnf|uU_V#Rda!_)b zhSi^e)$QrXw)GAWv_>b!_gjUD8FU_XI(srK-WthQS$S*SI;*S8$POSCM6dhP7|hV< z!P3Z;u1fyz=+6zK2`P>#DjC`SWKUZ>k?kJn%4DNfBzmOS*jV72WG>2fD)5gQ=~QYb zmMbHB#|CHL4#Mc$TDmlR*VWe5HAI{06AcM?b$zRjCbFl)o`wNq2yl*rJUapsVLFl{$mRg6Kr+_VS6dPup33F@L8!lbAc~WFT>p#nGeIWF~T?`U;j)v6w^+z)O3Qlb!Az=xcUjYYGm!9I)$3y)+4 zHr+`KQ(@hPdZzX#TQeGHu=8pg`o-aXOJ&-6cLQ(78c?pUH{Cht;NQAvG!bn!+R~Y9 zav+@%q&Se)yI5_n!FK%h)g%UXaPOtncQjNq8I!r`12!ynx1{?sy}Mh}*>onENky>2 z1O<9PTw^1pJiVdP)bzyRdC?3jA8{?xR;|Jl(M^MXqd^RK9+52kABQ;>dW0)ni-FZl8OcObj!}Jy=a9ozA zr)Kig7627AytOGiMc`)kc}T;YPsI~(OT}X0lIW$#vvC!$QCl`TyHIRaq1fy~b+Zc9 zc?ykzPx5|Fp~l&TJfD+7-p@%(p3g}k@8@!bf@@^Swl>dqrgGy2a8F03Q3j1)V;w#) zfXFuTrXf{8?ZHXn}F_F+mhk^vas0Ojp0nlp};VYZXjS96AIYOk7o1UH; z8Jd|cX0w1eI}ec~JgKqQ$JCi=?`9rlvD&8QrpD&_SbaRvSXUowXew^To+mLQ_>~{A zk667qo47k&fBKLVuFQ%ksNvd^ORG{S5i>>1S3QG&hlm&jh9V5ki5!U=H(L=Dck<5z zc-c{nJAKI1U4bRevqo_4_-bv(VhEiWtpXI6Gf{r?=2_pUaY}Om-Ajo5i-WE|GDdU* zccbj&Dr*}+y|W!T&i(;%0*V5nIv$DwasrA1qAH`Pnem~CnehThQ6tsa)7RhI(Vt4E zfl`}^S6T)TB&kb+b4PMlDx2QZ(~9G&yAK3S7KA}Iy*t^L1@&*F`r3PX(*u2dz5N-h zxe=9kUbQFF05J_ygr-#Mj?ONe+|ugcU^dy(ncbD@PYVGKDggD;nKpc_H=WU>D*&~t z%Y&YU2qxas=ew(Yknmj~;bZK6Ck`ujM?hoil0rj?qab`Y`>OLi$TgcKg~J@8P0+GV zpA`m7S)n29imv7$!y^TbgviktPRPKeC(yyk(%XD+8Va(+c`maDIEAEKIh&I|&pn zNyG)9KONe$Oa!Gm+xok$dQRjxFm3iQnHCqS=Kr))CV5R~V_5 zWLtN-!)j_`f!3_vXy9hB%>YA+w#6Fa>~--1C_DfH!%gcd3Zn&^$DuId^)gUbL2MtO zo-}yMd2kQ2FafEq&bB0&61x+e^pU)k#n3?z;D|s6(&vJaKPNd8jWrRua%?-CvBeq<#czQPLx+Sna4nq!po-|g zu>mF&R5?Boful|mBymw~Hf(oiTV@9dFp^(~i@Ae<)ZyY(aXep)l&%=7#<7?K*a5an zV>tiT*0PMX)>@}Ba85fp;9i{!Yi%{dXn`L~_qTC!qS3g~m7N}&9M6qe?VVl1OcMA} zgmb15>1-Ayg%hH;2SjjP6N&Odag?me;RCtpYD6)*O%kb6oONvLR`5#utEwP};MWi2 z$Wc!hA&;0CM}HaD@>Qb;SQka~xvV)o%tflNvo9r+lHQZnsIeXU5X>Kn_oQ}rb+%+V zZ<@N4u4BzT)2XP&RBEsj#5trZV9$w^$PBQWjqerlDP(_Fmk|E&s*IVD0uT@pWx6lb zn$7fP8Qzub!eL!KjWtmx|MVf}U?<^-44V$X8Ej`d$GpxRCt0vX&Tl_GMNU}O1jEJd zNM$19)xv)%2}X9fP|6OCOqVW+j8|>R_O!R*>_}f~ZL}a%DPUQ$W4Y2nWP8*>_|uHN20tC_Go>u3N3 zfwKXW^>OwUMGgiVyC1}MwEz=^)PSffi`8TyUzt89RYV${l}WDYQC^DA2ta=R8AUPo!BY+8lfLLP{$UL0_ zfa>i>Iw&*{RJqGURG>;kSQncjqr?FO=FEIrtEFd$2c`b0Ju z7tAE*|DbSN9ub(x>#-@bSqVYDW`L#w)h66sb_c(ToC)_i&kZ4f(v@;kQx2V?g^1+b z|C{nLVHPPb#e{jqV~SJO=LY!eRAw;KlHOz0kqi(?f)?-2BTVq*vj3_$zJ700*Tlpd!YzTiS}HgVPg}TiU@7g4#_xfh-U{a))L}CfV2$ z)SkVi>`mYyAM_G=IaNVLWhqr8q6BSK^NFj7L|tor(LiS^lkE|{U6yUmV?Ne6z;j;c z1Ioy!vHRV_&i2fVj*4&+l0SAPbrEGI+?zeU`ndO?1cCVR3H#6`P}zr=5Ives0sP{# z>28X+apWZA2*q@9n#x3jLi<{z(}(W?`cadVIj7bOgl>reNrtx0`M4G2RN;sQvD>=S zlA}7E?L*6uzGGPG)UX+Wweeag?AID8asgV#0||U*ha5ezdJ$~2bnPS;1P?t+Le$ce zqC^!DSrA!#b?nFL5=NQeu|U$>#E;s16rLwR#K`XBPUD2k;uM_yrdS4tC(%GA;v^Tt z3QD{&jzawgC4(fHXU4g4iiHShhS_Olg#oZJ&KC$oI+I;M3;kGKtv`hD9_&7_Z}f=$ zr7A}>+6okuNrAA+Bt6wRwLk^)AO_ruDarJCC=jsl^i^fcDf|=R{>{Ry* z`6h?UVN1T+`vBg%pko2zbxFR^IiZG0%7IzN@I`9HdEh|1npv=xB4z=1kV$p- zW%gLj+?TowO6HI4M**p`{V+;5HDxOr%5p))F>)bsoLMeR1EdHZ9E>_>@C@K9Xue!(##C6GGccLpisA82i*G(zxH#!rBJSz5fyO>50Cyr_!TJIa6|;fzb4d_9pq~Ot!xW-* zt!)uTSy3~ucsQ$KWfhkkw7#Pmt296^zR}tDz;Rujt&UEF1fFO6btk1i5D9}*rN+(L zWGG>dTdO1xETZ=Ep${kom;u>v3ec>r2J>;Pq6wqq4`ew?k-E(GB{Qu%x>CDRT|zYR zke`I&4_gVE-u%H~2q~de6tNaOuwPpJXW^TG%_{4BD{7sKn9v%zylDSG8|G(VAp+$e zE29>3dD=k?iJ%fj&LgID@@-M2o2c@U-)K-o9og)mTy}H>_>n-yEepPY$_7qwvcGi) zNY7pYYvId%nk7!@B~MfgB5nyPU`5mcSvq@c)%eGx^+45ThNZyY(1!Vhho>10<|?`~{q zE@qjdfZ^O&4hu9rH9R&kj_Ju&4^@#;P^38~;2_ncG_8nf5G@nqvMm>TB=nO)7;KdN6(vMIFASI|;_zmTUEcv*}B- zDI1lSCxKKIqc8c3#5_Sp$8v!S6G69-71 z0`qDRkMJQi2n7iM6f0Q~V7C5&biZ}Ah0ty%)K9wsmF9%{d3dNagb2b1rYFYd6nY4v zq9E0ExY>9L^|TB$4I;4>%rwAL%nsBs)1QL&sYi}#EzH-7N|#O&+$lC5O(dY;xndkp1-XJQKDl`_V1Pp}pNH7zZK++pDOS=$3dN?;ZOA`t zt22?NjEqf=R>J@c76JH>EmA=#q)}eN{Icl8T6@6-NL1xPKPp}uCp?<3B6v*nO25MJX4mijwPAQS@Pm+K%Em|Igq6eOUZMG;H%C1qu(CRL+2 zAW5MRv;8-*q~^Ki#gaVs_oS@^HwAR}HlByzC2!@*K) zCCrHu>3XCw(oGvuVw4y}AfvH1ST*{2bc9yb%=?0$w z?5o6ef{I;auZ!@cqJ045Ac}(+1bE`4Np^H6foGIT1mgb;jbDV$&<06!D5^CPiBqnp zBiZdEAou6S#&RUj#}TSBv`hmkd)vkY6pzBi$I(NHDnk*MJT*5bt~!$w;+q#4=#=tPP7Bk8m{Cb=?YOEUrewmz^x;B=|oP+SDitx`_0^nj8& zDB)?eHcDv&7hCuNcC!tpah-)D5XXc22Db?@uKO@79x3JziGo>d>5!Il~YE zTT;{KsX?H7D@M#Bf^wkkp@~t;1A)W_lBo=^9MzTV3-(f!AJhoVt|xjTRd0WB9EU`n zRMS-TboCX*QuX)*j*Jd>x;1^S#T*L=f_Ba4S}23g*c4T4;qVOMI3$O`72n- zAv=VH)z*Sok{)awn0k@SBf!8!N>L9-hKG?v>5gBnBV3e~#Zd+WW*TXroL15gY8@J^ zBCx}3bEocsOllD4|6H(Uh-0A}5zdeE zJ~n|{B%~&UrfGmNwhY)E_^GB5@Y|;F-kC({mZtraG zokvuK9Bf40*A|*$VF1Um#G)ORW8*+!Dr9dwT}OsTl-`^RTjpYMC^y$do9hzI4X{N_ z#Oh$&)YMLvPe`9e;@m-SrP%F?xpczFD4(&isYS#(lNIxsG6x2(fo3sc3&%j&7S55= zssj^918q9&C0I74gfM8hQ(_ayPWSXd3wi|dF&+>yG*o?^@B}ncp`Ztz zOS(vikmIs53l(0+MPyoV7I{dvgrSs*wvJ8s{rOaESHmF2r(@&HfOE4gL{hW_B;Z3n zpXnbUP;!DawSprWodlS%ukcVgKik@(8@g6Uq7{=RQKnQR)WL*+>g1{4*-q^^)YMP~ z$qE750PsYje*HjiOS-o!1?)$T7DMpFxoKz!s%c-Vi5O3gi&>V{pqtPKNA(NR+gAJ1 zo;qr)dtEZLdRuA$x=woS5wp5%3PhX(2UbA@W;@$DciCJ# zs3HPsl!hGG-UE~*F@`BgB|DNZub^PD48F-UtW1yq=(AVNR{wev<&>?Vzyv^}V5Us! zKp8-)NUtk*Bjnr;jbs~r;2StrVoE4zt9u-=fn(k=K2gd+?Fgohz)&oeh`+E!DMfWQ zHwWQ1r~z0(&O$jLF{U25aQf*E%z+B+$_%Pd|L(y7C)DADfbUXmy_gWp2sSK^CJ%+y zPPu+7ZI)bgoBJ3ohYd`oNK;8gSXT*@Li=B>gV%udBH&(wQMgY+TfQu0H<+KSpm7+j z?&#%(f;tqR7#=R4y&A`eu)n>#OQ~+kTmvvpXL}d;NF1MPSJ>EGENhRC&c&|Q#^;I= zESs9e>IgJg9GE4-R@4sgNN$CpnYyW=>DV&L7qfeq{`QNR1DGStvf(@%hC(hoIWwJy zIW{Gf5R3@!Ib0Tt9L5hd(43K99KLFv|N!F5^TkZ?E^aO!xsl%rgtZr04GcvV@w=95DMA~8mllpaWFfI zImGrX+c7IEW_%xL5Y#|F=rXMlp|L+f6Nbj=*8hg>@9YoKOqRpe2C|M_Hh!f+0Z%Qp zT{EyG2J3vhLb&KSQ$%4{y3HbNbA4VCGY<8{$f>J?g?`nv}0DfLP% zdOknzJi7KO#_|endMxITH*|l&dQUjns(QO_K%q~(eeNhBxYrkktD>a1(}_CDX^kMX-dLMUS?2U98g7O}1n!sH1+dqE+miu1jm*Rz5Z<3bHoxLDw9EF9lZBX3Lz#QBU=?_vrT3=z4k`#~$ z#WyGd0he4CpAk(B$Q%TTjAi^HZ4$Ezmw>;Fd~tI2_P}I=N3IxyICsZ9)+y0=yfGSY z#-%El*@G>OHFmLs+P2lEq;P*m+tI-q!(;D9&W7xSv)(unY$8DHt;sXZB0M!y*3s45 z0=%v$4G!wS#Nn~r_!a7c6KvPfI4tKQxa~y3tqKw_gk=KN#X6VXg_aG}z3enb#wUcp zK$m>LCy>TdBa+8aQ>s=%2lX;U*$$YgmR2FsjF$29EU5uO18DSYM$)jeHu{Re42;Ti zv4H4ohwTbzSDTzC?I83SVuA+_b`%;CZ=$7Av3l&AR#u6bJ~oc5s)r90nTQKS9l}@L!;-Qt zSxRRrMIj2olys zrLuAQN|^sbW~6*Hk12QI1Y7CHIfSvI=#sdzwAD3&$mqbO3a$~%4trrZHUJwU^jb4? zm8 z)dK=@m>%cOolEHAv7`_UC!k)8DMb1lYqW1+Xqy#Rs*OsLX*{2Rvl8YpKAtdF0?^w? z9QtIieLbLhAol@e!Ps11cgNC++DzncWK#veJX>p?*AO`GSP~cSIwyW{V~liC2vIi{ zEGvQLLxzqzs9IiZAO_SZ)2S;bk-~d8EEI-!)MhX|fyGD??=cW5L9C~c61q;jXrDep zWx;GLFBTGlrf|rJMY0Itu=rxJM2~pbNB>9TfH|+p63Pj}G&r-Mi_p?c*re6Ll9?$&{q!f>M4(frh|02o z{mA~}*yQvT_PrpFa2Rqxg(cCxZLr(golfC0QXbE&jlo(F59+Mu^T=H&6-6=-SX0ft)+qll?J3j%A|0N=at03S974wMW@ zK!6sGAsc%@D4kB@krgO}D0Dv}axR|xq{>{F!A91$PpKB42Y}i^Rz*?0FuUWN!X`$P z?s^9&glI^0K*i1G(K^2F>|5CvZV2=2zhf&%wyIX|@Q6WMuVo#E_tSwNmb3WDaj zY=EnpM;t?u(##MpG~u!{{v9eo?x-(2BWPc80$al(<#-J)JGfktl#HEFWIm!qW}76F&u0u_F;zD2IK?>n?y(Y7g}qUav?REJc!#u}+BUDy0=pRdRxZ=~FGccty|URtE!&)R zI0s$R@$FfOR=|C^xjXU??iDTEODPWr2=c=Xi`J zHl+`;y9nD&`eu86%RqEg%m}kP7+C?d4L;|^d$;f)s1&uA26Z=mH2^+D$AzGz$k4?WI5NZehz(-EStbP_ z=vw>s5R??S>um^Ohv*1|0dZN!|dchR+Qev0uD`Vly%XVgdjxHocO;=dUc3 zR9W&E7FC~4B`1ruxL(eg)|Beja4_I9&!WhoJO#5DawU!-8=)2dWi%ujUEHh$ zn;$|yYn4q`TR#;xo}&q%W|{D71Z}YNFyR=1*l@pKwGLZ!0AbIZhJygAuvaXA_cGCi^O@VzP1}i zqo6sDgVEfoV(t*bR&|3MNggFQ_w_GX>J=yHLde2JV7Nv#X#tBcNhlGuy*F< z$a$=^Fq-l`D|vxL?4B@Zy=u-VS9LD@s1R?E;-Ca&L=6+KGVbmjpg@53W6DU1YqSGK zceW6Q_Bb+W3W_mld~*_l$~`dXpj?Q8*3ND{1UI=XyOmNRtdf>ZaP`&mCN#8nQxS(I zM)8shUJ|nd%7R?3Xz;AmcMYf-^2wp_d4i_0WCt+YH};rF+S6+nEcWjHQfNZ&Ci24$ zQ>315v9rpUe{KP^aLdxr9F})9%fe|InfqZadNfLM*O4R6lb1R1FJ>~QX2QL&5j=S|E^&z}i<1~Eb_o1?LR zltPM-cv^$dto*EVm!5eap%JjJEK z(?wU$Lrx16l6Di5Q0?P$c+ps&r|Pv+@|R%N@#G2w1yE~?ag~U4gtpclfu1%i??4(*Q9-+_jq_7IgJ4%kv$exAbM8w9A_RTq*`y?tZ$p)A ztpwkOQaTEl(+%K#5*s~|o0qqNgxurh7eQUxqE^U#jlv-A>k#AME@0GdTBE7U_O>~) z63NN^6p)rYbDYzWXT&U4sfTv3>Y+7?7k5MGN1YQ)Z#B^kt_+724UxN(X-F&u|3lFO z7LT%1A$;ujZ@{gK?ZmuS==8=^_vY*ybP-Aluvf8f*2<=^l*-#G&E)fV!mU`qtq)s{ zj6vA+vYf!~L+_&gwrp~7#KP9HQ%7ZWk&nU$J2G=!p3(fd zUU`}!aN_DAw}P zE@i{b73NSekK;#Zcq>P1nep2)c#QxTd)+`yX#_;C9A29CR>IoUIWvT0P$ImP(Aw4i zcU?;0Tjq1zN+5yk7e1EF`aLYKy6T80&Y)r96ZP42vK?<~B)jm~Bqa;p8xz!7a5j%~ zK{77Y6gfiDUNpUK6MFTwIgGF5WpnuD_hr5HSX;v{2RMTVKT_A7LLYVCVkh= zk!SfSXeGoF;!K2Qa?h1VuS?Kb4_iUp)4;=vcybhvSd2{L1+@cs8+jCWedUmLmVqm& z_l@q7BN-s&m9=H~LVUrT{kRWM%N;rW+UY@MpeqkkyV8+bPQrCM#@$xxyk$3xLtma5 zaq>K7zFvxhk6t?9%Uzi11$M+PaGg|&zvCp~#T%_UK!l)9wP@Ll&k=ZXH9Qhedy*9W zqwqr04uu!s6HVF=r|Ok-$wVl5q=$I^urtAR*V7fJW_?BS|Uxo{lWP6^R9N9*e~B$EPFRPerI`Am27kE~1 zj@vre=7cwO^$YszF8)S_BM4Wl09Mx)RS7Sqmsm1Mf`E@H3$14HhPt+54Y^*f<#%sB z;z{Hl$Q>#I$Bn~QX?#B}bjCzI-qVY>Wg*GPbl2Cl!^HT=5#oOS+5@hU(k7Wpj2E6= z*3{TvN~)x;3#!XP8X>ru4TU1gmx$-VsjjQTs)YI`s5sA8mGFhP*+jh_fn_jI5FZMy zlB;4ik*kIDmUEX~zngX;Ub^GUv2tSBNXrk|UfDYM0bYXUcV6*rr}7VzyrRWDAA*^S z!_lixnGSRcgL7-hod@CNkc7DeYz`nX1SfufM-^gzEi0)&Yu zJvMDZyNbo-oR_Qt2W3Ty96y3wTsWX?#0`Lhz^SJfH?-0j8ad%xDD9UR!ZL6=2cys_ zXbX>2m#QhQxk|lN=Ln`OtN~a7l)xoaGCfdHpd4PU9u|RA!hWVh z3%NAE#40st&$h6P-~oX#Fag(K^SGW`APRzIx`1yE65}gMBPG<*as5LyG+me9{K}Sc z!$rK)YL`S?HYlPYOd9q1uHA!Oi+d1c8YvePu>pQiN%mq2ykrBpERnx*iFmnEg9Q{h zq?l=6<70v3FtU#rDD&m#!_l{x! zY8|;EMW;kT_VBg9SH$LOqa9C(l5M9wZ!hLde0_hoBa_Ymd?=D5m6_sm^3+oREsm5R z4jU>?xgSH0*!N=b9!s{h_M68R4Udw@L#~`XEu@si90NNdJ-NQ6}VC>|kZn@{YHTVsv8fCghQ0Q{%aL;VR)y zXHDNjJh(PZvD4qlZ}LRt$))9Oq($6FODauxeUPM}sBePB2=5XO7 zAG-2V%fp-!eA>;tKp==;A8Mt>6d%CO11gRKtMS)*#2TegRQ&~*6QbRGjSC~XSYGZ2 zw=p5ssIM36%H{1P27o|{r>t9$AEnx@zCOy|m`N*++l4=b1?0zJYS)36zlg26aH89y zOZRw0zcts7(%8Z;A1$tbD~H_wYz;NI{pl&WM2An>@6?Kvqq7wxul;bXf;52){Y;Hd zH&s4k8|(ReDvY4#dZmWO1w5^JLmDa_z7VIRo!F{E34^Xy2?QYDPybL4)>i{E7Fk#V zp(PYGDQA|x?v7b?m<^ISu3}zT!3R5lcjXPf^0itmOqJoy!@~(TBqj{lo4{K{k@iXL zn|qt2mR~)XL)N6ZR*f8qCV{9yiOFR*!PSaCz*`;3Ih3E8@w4wE%A9E`PGmah9mFoG ziEfZduVAF%TtBTcG=g*lrQm|w+adjgxCO_)^in@}qZLbHmXGPi!C1b^0N!2X8bm@Q zoUt$Q0;~`Y%7S)I)WD}s965(A1y*m%h;1*ykRnQT{FHxZqKo(y57@y40WMeX-20}r zjkb77ZlW;{1kW~1AWO{T8{@W^+HE|qQVrMd>tM+MXiEP%i94J#_yt7#EXELS&+!EE z(iQ#!T&UyM@Z=qftH;wP`RRAKaT-3ZX;r3IKsYp70Y<+VubI z1;4fB2mCy*PjF8vS+=Y%?L+h|%YIQp#d&3l$CZt$y2lfa0#kWE&-Vau7itts;S+n< zIU-e5uayuTTa@sNwtPToew~LP%TGcMB8^MuU0e}lLu>}=4Bo$$!Rz-+aD62?s9x?& zX7CbC3m%4wusiApDBSP7sZ_M>fml&rGtsV1B{6@Pj7W`w;6qsocToZ`k5avSW!b+i zkn1|TTJT$kp2I7JAA1B!re&H!6pD*gXO|MWyE8Ng3(MZJ?FZSHcw$c5NR;!Ledvaz zWs0fr*d-qx&d4v4@KjaLb3wm=*NzFWXnj991-VIygJ^2H8o%ZXrou(@OP(dk9$rAD zOC@}ZsvZ1R4b)m71c+qiMj7rwC5*`fSCn#vDNFklf~luv5n%8`KP(w@i< zW2wu7Vs}htjWQ7c&}=O;?WvryP+uOWFmgSmG5q6{My^uhC?w|wcy0w8piOsn0r8`dPXtCy1cuGA~N6KR`O=m(k0Pet0yk$f$k22%%Pl+N}&kd@;xWeSKq z`#Rm(-6kt-D{^SPXa5MAZNcZLZ?M7nK8eT9RoU`6MZ}6sto9sZSW)_jRi9Ie4S5TZ zP$xng#2qJF;*HMYY;)e1#0gDvP#?bt5i6e^{-2?9UHLfpT)nfdc2RBZmR2Z&wxp-> zTU@_?j;)yHdpyEe$^LYqK#yhs6diVFnJ}Bj@`QG`d}@~PB9CFq?~_0@K9<7|l<-V< zB{R`Ns(SLgJ=xg>tgOyGkItBcq2{IBhoJ|__qWOciCF=`553~7Un}AbDobCJx8)}I z)l{a+j}{?>-nouBGK+jxJ68hyN8|>UEHnBt=PhRalLxrtJr1=dl*?)pgxr=0u%#j*`azmQ>adGL3jeN5vPg=^anthfjr|~a8{$CqQay?4}$9R{(du5 zgmN1ZSD7VXKf#8z=Jg77iRi0h49G#bwS5Xzs+$HVa26}L` z>7T^IHWK=V0t$#M&>Y@ZDGX!2;Zwj&Lh^VlxBJC>H&{cWGqU%AI*H1@urx@k^5E;+~J*RloHAkpw-@$?8x>GWcmj1 zhJ);AH!%t70;eGcg6jpzHau<>C(kV4(nlK4{RV{~211=r>18u&`bBj9j=P>af{@^5 zK_?zALYfY|gxsaI66C(PS~&Z{oJ$3XH_h}flUZVqAU{%uZwXjy^fI8XCF0p<@Ex?G zQZ`(ItZ?R)&6-7LFiYyIno^P+=K-++e1o&Ee=^7(m7{NUx}M!Rm&n@ItCFms^en3^ zgE0RhOLOdmoKN_5jFja7z4IaZ9efjC46(`<;k1_!Ll)__b8loGAv9jonM-r&>^}R> z4UefZg7^IR7iJ^fn=L;f$rn*jT3#-9pIxLv9Wkf8$x{BsA}g+btPv3JNSn3s4=jVU zu@Dbj-w9SOgD=^|1S67z2SDNeBgEy{?NYf!I>07UBWv*h|GDztS`?a?x$e*53p2PN!xy6o@_67XNA9X@>?MX?OcKK`*?G=Sageo^-!>3YI1d`V zX>8ivHv5p@{lVIc22)4`zC;159{Ghf++QpnMAh8r;oKD^D4+Oyl@_&73}B9C&7h~G zu>2TA7Yw!I#BszxG>9X>;g?V3;X&{<Ph19}>W{cSkWu#M**DYXWj;b=t4kJL2OlY+xL z2gp^_fsJs%6nL(2;xe@7m2G*N1IotaE^r@!KrGHpVO4@~z^hxE& ziV;Hp=ZqX{ABU66_RTtV%4%Ja&WMe~aetPzJjmNMgb1Y zk`|cZ4Lh91RLiAdA0a)67&&2~Vj;x~$6pfU@~sB~qgXw!I_fCOx4DxSo>SU8g? z$DWiQogv*Vs7Y<$&B0cuE*QrNAe6n)l+c*%l4(?l~A{OXos_Gl-pn6L74#LBdQ zbSQ}*{nCZK-R0UZ)9ntqSWhMkIR=_;9_^%-_uG}lI*7=Vze@!|9XJLzgU0Y_A-e5H z8u6>z>WUOHWEpT34(B6IMMYrFa~oIR(kZ_Zw>B27t*?ziAzlZwhq|~G(Fnb2tzm#g zz~xd9=vHQ8Vzgv|sIkN{39MjkeGTi>B1AuiAL^=s1CW}xMZ-A3FpR(9&oly8FFj$2 zaXRAm-%y=rwt2j45~IPl`U?WEk#pmbYBz zeC1B|mTQ}@+-c=_5(Ha_I@z2X6@6$UYtmC6}^7irr;LPe^|1lb={B zb86Q)Q|h?p_rlq8GhZ3^nE(Hn8_Vt#e1@GhbFDkSWB;l7Q+;1jsp{Byfb(*FPC}O& zSF#=%xngc;#4xK63^%1}x{Zn@mE8*iiz-%zPBc$4PYJFzPc=_7*O;f9XI88=?KW-S zoe(m9`!_qCe$a5Q2;(t#HsW=@c)jeOaw0oe{tFs$Uw*utiBQmJG?sZ%8a=U~(d5f- z^5rLd`P>QRzo2ohFQ2=q{1-H~`trAyGZ6|J+kN@lefbyo@-Oh^Cw=)zUw(@(zr~l| z>dSBS<+u6r+kE*cUw+D$-{H&e@a1><@;iO`7y9xq^yTmL%8ac-W|PA3#Qh(d>y=8Y7JZv!3`e1ZYnZ}nq z@v{spiR;fY5}x?k#sN=!t?>p=e4X(*Pkg=cvM0X5r~<81{@Z8_dgA98$2{?f@gYyV z%J`WlzR6gJcxT1 zA2HA3A?}%c#66RRxM#44dpe8wLSKIt`QnRxadJE5zo4Z z7?m2t2)QeadSi(v9yd-xoV$RKvl8@tRL2P^D?z^}blj47!q~3sBP!6;uJZ{QD?zV! z>G-*buLXVH?<#L0EvxerlE2*;_T`s!J|ShLae;BAj=;<=_+eN$tu7>y1$*5~T#@={UN zL;3o6ZG9}Bt8a)l#AC(!#^Lx77|!})zNsl%U!RNRqV-Z?q*yEtPohFoQ*AzxXsB<< z*EbBu8yoV`hM`zA*4!A)4@YB7&C#X?sW4o`3;xjOp-Np{?QpIT%NO(YLwQK1qK)wc ze@HQ2pC}9!^23E_om9aUo#B!FQX!6aaqAoF^7Z+`P+bDUj}9dY%?(3^=ukdhXvjC{ z@#n@%BOFDnwoq)Siw`#>8WM3#RHDAI*c>e+8tbCDSmSV_n2;|}vd13>6}=O?)>zxz zfFIC^=Z71Hqs>kA@nWv2A=a2rG#3*?Lv^vCg4Bar2Q~Sj=Gs`Cr3;08p`kvH$z7AywjXas6|4i^zpg_+8gr0SVa&tB#rmP)hFl(xGpLS<<^&b$ zqP2xWv=EIK^0|8a+FveOsLM6tjh`VjU7stUQ{EoM8X9Wr8xn~kx>AT06Zs~*_K=7+ zM4N|(nla&MquKijKoOR`IUXw%V?%Wf_00wJz9FB>N2A4Pp-|V9gMyudkasE2r&v>M zv97spXgDzx9V+G<^UaM#{NPBgAzmNHDmLWmqf(xdaSj1f)EFzoAVy5oai|G)EnkQG z3r)jV`nZ}RyLA9mecf=Oslav4*X82Tp(q|j#w(x2hM{6^xUr}pP>HYE9W3@xUAzc@ z9ga1|V{ydl;zPsDiN*pXh_R-knj-rH4beE>tu6o(3dMTdXT)cQ@L1HzcqfqTI@j*we##fCZqv8Kb}tjpn_j8)~CPv^rcE z$~WWZDu)}IqFCdGcpbV^s4GSjx;S-j=zbiy1Eb3i$>hbR#g8fY|Vz&N3Brw0U(SulcP07ncOHDZHJa0t%PfI*iUG(wcdF@`2_ zh#E9%jKML+x&K}FJCE}Es<_?JEZ0gcitp|^yZ$wM3dusV8fZKl%P3aGVmh5q7Sx_AYEji1q(@}O6|9$0d&{H? znr~HbCRs|Vb;JuL^)=0zj7l<<%UAbk*&(l%pz52-T2jrXxsWZWGRKNKN+z$|DW$WOlgxwIO8qEb|r zsokZLg<>v~j;k)IJ*n3EyG*N0(BEdTgezLHQaRbIx?M`8GsSp5SyUHRN@UZDYD{ga zdJM8Q9dAmf^#@=}`JBo(TaIVT$x%I2E$`cFNY@2}Tr{1*pZCy>lEHS4P_`Ftj>UN)Yw{LScqmF8?Vp`J9K z-I{hwMoKj*mQ;^aDXZxeGx9DZ%8BMgypT+(NmcThYP@vUUH<7*Q(8Hy54mU5TPBkF zymuvAP+_Qks5a?yG1ZfVDu_-lb^yK0QYk0xbfjJ`7t^_@l1;?3`T~5qoL4n$uEwYO zLZNoZHI-GTOFD&=QdyOv3PW`;m(ZyqTh3QhNr(>zNGriQ+a*fP#pYB}=P7lPvAE(^ zR+rzLO_cPypEV%eNYI+|EoeT2T?m`D~Y>h_Z{RsLkP+?=~Q?MkVf z)p<(Yp1PJ;K~=D%>J50&sT^++wWn%q>Okjo}g%JGE0R;lw$vrg4{HJ@Zz5sZJ@J*UTyMNJRQ$wRDIHkl3G-$n)@yO@to>h zDOZk_V#=s^C6>u%)0t#aXZdV0pI3jD^)rb6PCZgAThtjbQAx)uDV@tw>h&_Ea;8}w zcc!RrShtYuJC$0;=|R@WPdn&C6_f36p7FgIzl`1YUHPt#zJMSvd&SoqHFN5?>GptQ z@T&;^Q!4sKa`nNuantnR%xT^zo)4)$#yhiMf3<_R%=ioPJV@uic*X~o`Mc@5mb0Z{ zt>@W@Y=`yL>*F0Bv}-)s4^{6Y?eK`_kLWDiMs`N$Z`a#q+lb9*Bf|z=o}1mEX?7cV z8Eph*w2@Fl%=1Si4GGV)kwt^1@9m1;!u8LmU00jk9}b2#^J?2qgheTX8bs9q%m0$b9 z1RMZ|88r+%8G9mJ2roDG_PndGZ#HV!`4sk_jH*oUV0Tr;wBz+O_VBzR*dvVHJ+Fj4 z4W41tF#1C5E8%rU4Zl}o{~B(Be>7_N{swlpcCvNcZx~hC^Vmb+2&1M8O4w(?g+?`! zCD=E@Ul==i-a70zVS^f)9cO2w8rfdhL*Vgnw6UY-O~O7Co^RB&${pDE8#N8{2=+$f z_OxdWzipgswv8XnuhFReZKQAdYSMl@Y`kmn?PpYa{C2DK9%Z)j<2a-8YqU}MI@YLs zpKMgQ%rdIH<{Eo>-nmAV^F>CL|6-%+i7gf%WxLM~M#anTcf?)IR{U(dZrsDDc-nZ` z*l1L~^@RHy6>q;E5@Tj7{wbIzG<%@uJ!e$pUN#O=yE6{@tl_P3$mZz~f{Fk6K>+IY0*eUI>|#_y=! z8i#w{0=6%Lml;(FmKc?Z*RuT<<99vp7e=MyUbe3{9_x9J8dYh2XFOi%HlE;le>R@z zd2brE-+M--&+qS5x!PO5dy?mMG@h*Uu5pyoZIs`B#?hX4pt0b28DmlDHY&WG<)5e~ zgNiHq2N8C(LF!xivmxDwt8*FeAiNzbo;;^S=J1fPMM;VWR!o%SZI1C;GPlN?H22O<2;A!wo=<4qU*cZdg;g#@e zcs=|XydB;J?}HCOcir*?_V3}d@J0A4d;`7%F%7 z^YayKY{-Bnzrw_T{VApgI(a>um|i74}xiUFzgQp!6V^t zcsv{hD{wrV0%yWGa2`AlE`pcAC2%=h0sZSnrEewnop23Y2RFdS;U@SD+zelVTcErC z`~bU6TiQR|8Fqs1I<*^iFW3jhVHWmoSu*S)7l4%+=|i^mLjI&|0f=U`t5FM(IUW$;?)uK#bt zUJdVo_rvw@QMeI41)qm6!Pnqh@ICkmY-iW~O2>|HH`oR44ST@e@F19m2gCkw5IhnN zhi;rQ3cCWw!zpkkoCD{<^WY+Q8C(LF!xivmxDwt8*T8jf1AH8Ag3rLs@D;cPz5_pi zZQ57!vpuwDC@p_G!LG0y>;?P4ILyMn@NhT;4ui+Q6JY_4ffM00cp5wtE`S%ni{a() zN_aKA9{vp84)22Z!3W^O@Co>P_$+)8z6#%f@4}DZb{g1NK5h>?!mq+TVRyJ6JP;;f z9v%t@!lCeJcq}{#mf$!z3C@70!?WNy@IrVAyaFzR*TNg&ZE!Wb2i_0Y!$;vp_!N8| zz64)`Z^8HAC$Qc2w12o8>;m_OJz#Hm5KO~^VShLX9tnrT3*p-ufB&QVYYNDZe_uEN4uzWP@WaE7^JOcK9~0jz z;Wh9^_;cvy0q(_q06qdY!l&V8_-FVA{5$*v{u|>}H}3C@y(hFcAFO|H^HDKuH{Smi z_CR<991i_?DedpZ`D58W35JzZz4htKGM}@Q{Ja|80B?hLKsS%`YwU;NZ{bt$kMI@v zI(!#?4BL^9J3%*Z^EK@5aDR9Z%s@9^GXQ%i{0=-G`tyn^M>kJ%3fpJE*>D~_AG-OO z#n{W>PvOnb-9K{kGQVQGKi{b1K8C#s{sFrAn7?4Z1>c8lm^bJE-8{_h*n7jCun$Z? zH~-QPdl39KJO;Y^Qf}Vmdu*QqXTdY!+0f0mT#CH}UInj*w?a41@=NS>@FDmFd=k3( zm6x%%z`wzdU|Z$`+`P(Hu)D%WxF2kSZa(D@?6CIykDhllHUFu8eJAWr@N2L;+#kC0 zdu_aGZFj!@qWYb%HWOQXCV2mTN!?N4Tril;M)Z_7EXev!Z~n0ya4_P zUIBjsSHN4~?eK1RKm2d_IQ$)a7XAso2H%Emp1gtnWP7+P>;k_Id%@cL{{QB0td<ODRTd`NeU&3|pA?WTS zKZ*T3d>L+me}nG+aa*p-cZ6SoU11}1_l=vd)9?_ut$JJ=zAf9egIYhg{ma@uzNqt; z>j(cpKk_2{3w#T{4_*J)f%5JMcZYk!p3psK5mx^{?{YYdcn*P|_x$6(`h3@^l2jGa8szc2b# z&-3qpDpTIH?OpY(cYAS9?Pt`<{+q^bdcM=x-SbX0>g4@HV=vG1?-TCldH#LC-k#^* z=j+3Bi6x%TRJ>BwE@b=Hm5Sd8?Bk4z=PYdh`dRT^jP1`4D&GFMRQum++ZF%k2!Fw- zbol*(!u|O?rN^Idm7TKsqI4Z+lIM&-w3?CD13%R=mnjLILcNng62UMPzCImEAKPoP zk5YO~#c9+0|C*|AB%SWjaP{AM z2-x}%*Z80mZ$kJUifh^pg^nL264WYvRu7u6fPR&a~8 zC!5Q&@kUu|TUM)|LBD?5?))kdem3vq{F)>Dti3wFF%fAfT1Hz~qzZNSg+C`|9MfZvn| zzo!F!QzQId4){%r@OwMpH$B47Q@`oTV@8CZ_1n(R<}}07yGOupW`v(z2Rc1Fw}k20 zdBXXf7U6eDz|Za#hv^Lt_?;f%HzMF?bvsONbii*;gx`dK-x(2pvjTo+M)=uz(dEnB z2)~O0erHAaEe-hnAj0pufZx0bKRaK$_|1>-yEovsAi~eaolfuU2tT_naDL}R_`MMD zvpy-Td|wavofqL}*B|bsac6t{^_#F`N`(cD%F5tH) z!f!yp@1h7lyWVo~yEwwn?lU?+yC>rEPnUw$MR~gX^_Q{o3og#=u8rom9f7re7G{es z{rq=xw&iy~D}ELyx47R2YeVgEU6}d0-&y_EWwzH(t1YwD;dc=2`oOLg%+Ks0T20TT zcY+eQi)^>J^x8Q#==XgE?CP9E=VyIa(C>T&G`8YreQ+>-^8@kADa^%hp?(MTZjfH* zR`je*1@#sN^u8I;TUw)M_kS(iEiN64wIQf?X+ZA~g}M0Mq~F2#+53$D-L zw=|$<_hg;ko%$Wri>c!5;lxCz_v;$J!SZWt#qWt4zp?V$y%oRbYy8fT-`864`)iHg zV)^aWir>dIeyim7^;Z1e*S283TocHbfeLf^vWqe$m@mHx(c3{zLA{#-dV>Obd)4T@ zF1^Udxbm?1)S%z~A%1B&1>?6W5Wk@kb?F^aqc>Oqt(Dur8oj#% zdPfHI?D-S@YiZ{vOK%^S2+^g(=6!?lTN}_D7SJ1yo|Bj>z2{sfqK$SeTkJWPpx#5$ zdrWz4{m{``U3zEM=#Ab{?`}8|`MICx)%bPNT!FPMw>ZBA`VlhZ`8h1(0+P+&{*y0+!)bpO#sBNbAU9C>f-uKhLmSwm)Q=1ELiwnC!KZ5Za@kjL= z@-w~Tw0=epjb-X|XYJtBwjQfR55I*kc;4$ui|L&Zq1QzxynVLHwZy$vZ}ywjcYsZA zWQ1N`dPmfuca8K$%g^*q)*6=H1=0)l8=uKP(%beel?QsGBlND8-lYn6OPF3y=~=z9 z_!YH=#V@;8^+daor$p$jm)_wDcT1Sw0O<{ulj%*?8Wz8u_NlLY7fLUOo*SRH zmVf=E7rYJ&i{D!5nV-dPdPMw=lAiTHZVA)-t@JFNrgy5=u=HLhJ)4JcOPJn(4?J(K zoJ?<))-b)UJwAQC5vI3RdX4CPKSD1py>B=X`MIC9_3s7g9i>2v-|PszQ9bJ`kJLw7 z%j1j)y-CtbE8Hz%@f#pLS6}AJIV}IKsWX1F1M&Mogx;z;^%e&7=11tQty6DlK=14b zz28dD`X9H1<=;)xJ6BFtzQ(p%TWfFM(%infz?LOUFZJ=(`ggv(!}Ly&-gjEm!t37% z>5Y}2#m~k>VR|=7Pff0635(y|(%WBNruRdwVS0~9ub%$p1?jo|<)R3^Kh&Atw*%?@ zQG{M>U(eg9aJPh|cjPDXP@tvvQmtX>ZKnZyJ>@%6VvW)CM-JpnJ&4^!`h0Sb8_sskbzs_mc>{SEbim;cf|w-zw?FnXkd4RT-!i{IPQdr*EBzn^Lii(jQref9b7c3bQ7brE`JNw1#tJ}o_$-WwwH zF0NDWF9AK9a|uiDa_QAm|2~wStADpd=&hFCKvxLzb3bd_M`yhNt-i3bZ#nt}V~XFBrcM6~9Jpv-sVu)y2=|>ot6tZ2Q>q*xJ^w z@8#Aq$6|hM*LmKp8lT^*-`d63+f}qjxD=s4f^e+8)oeT>2QAk E3yazwM*si- literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.su new file mode 100644 index 0000000..50b547a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.su @@ -0,0 +1,18 @@ +../Core/Src/syscalls.c:44:6:initialise_monitor_handles 4 static +../Core/Src/syscalls.c:48:5:_getpid 4 static +../Core/Src/syscalls.c:53:5:_kill 16 static +../Core/Src/syscalls.c:61:6:_exit 16 static +../Core/Src/syscalls.c:67:27:_read 32 static +../Core/Src/syscalls.c:80:27:_write 32 static +../Core/Src/syscalls.c:92:5:_close 16 static +../Core/Src/syscalls.c:99:5:_fstat 16 static +../Core/Src/syscalls.c:106:5:_isatty 16 static +../Core/Src/syscalls.c:112:5:_lseek 24 static +../Core/Src/syscalls.c:120:5:_open 12 static +../Core/Src/syscalls.c:128:5:_wait 16 static +../Core/Src/syscalls.c:135:5:_unlink 16 static +../Core/Src/syscalls.c:142:5:_times 16 static +../Core/Src/syscalls.c:148:5:_stat 16 static +../Core/Src/syscalls.c:155:5:_link 16 static +../Core/Src/syscalls.c:163:5:_fork 8 static +../Core/Src/syscalls.c:169:5:_execve 24 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.d new file mode 100644 index 0000000..74fecf9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.d @@ -0,0 +1 @@ +Core/Src/sysmem.o: ../Core/Src/sysmem.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.o new file mode 100644 index 0000000000000000000000000000000000000000..f84cfe88b6b31b3374626c285280aecc288d5ab1 GIT binary patch literal 46588 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 LD>f0(ru+W@PH$sy literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.su new file mode 100644 index 0000000..12d5f17 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.su @@ -0,0 +1 @@ +../Core/Src/sysmem.c:53:7:_sbrk 32 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.d new file mode 100644 index 0000000..f34cdbb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.d @@ -0,0 +1,53 @@ +Core/Src/system_stm32f4xx.o: ../Core/Src/system_stm32f4xx.c \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.o new file mode 100644 index 0000000000000000000000000000000000000000..a21764f0b7fcf5130639ec48bb3574b9747245ac GIT binary patch literal 1083604 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

M7(Vl(*hq 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 G4E{Hsv^KT? literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.su new file mode 100644 index 0000000..96f1cd4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.su @@ -0,0 +1,2 @@ +../Core/Src/system_stm32f4xx.c:167:6:SystemInit 4 static +../Core/Src/system_stm32f4xx.c:220:6:SystemCoreClockUpdate 32 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.d new file mode 100644 index 0000000..168e9e8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.d @@ -0,0 +1,2 @@ +Core/Startup/startup_stm32f446retx.o: \ + ../Core/Startup/startup_stm32f446retx.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.o new file mode 100644 index 0000000000000000000000000000000000000000..3b4eebe95300bcb8f25065e5cd7ce66c39424d08 GIT binary patch literal 7284 zcmeHMU2Ggz6+XLbJ89ZDPLr0G6i6`?{E52+NXMXJ<3q*5dDfS^JYf`mj-s+#ZI zof+SITnk>2xXJ8yzjMw#=iGbloy<(09vn%BLLu^7h`MQ+5&d$D(lqxg=%y|7Dc{t< z-+$Qu*81VrOzVE?3}1U^;!>`u@6wj%2mbZ;&HHa2q0Z2?O-Gx0UmUpc_R>E;Uh=Q% zkl{olAOA@s|L^{fuD~Wzn6WT~^Ev1%7>(Pkn&Z}DQ^%c(6-zm_6ZQFOEbTf@zBpD0I@ZWw3fjqqV>C2cYEKl}d!v23qj5ip zB{aYPN%(}u0z6lEnQLvu(3Z4}FF~MtspB4NEg8xGB z*9Cu9@DBtJ;TE9hyIJs^f~N(a7W@gpzajWJ!C%A?*W+Il{KvxnRl$EJ_*KC_5PV7S zjkx9M@jC_IBY0NuX~CZo{G8yg2!2`cYl8nx@Fl@F;1;Oof0y7rf+qwo3GN8~q~PBX z{AIyk7yPQ=*9C8CG4tOd_;7U%+FVo^VP+aUAHrpazl_V&(1#Txbu^>8f7XoWyl?i zEvajoj#<^2%D6LCpLc7Na%Sv>*}64sSEgqjm#kWO8lHd+a6HDIEQf#dPR-Hm9Xv=) zouI;Et?taJ1T1T|JUL}?P|J2*dy(esa)m~-nIOur?M|nSxLIc|Ygg=JPGB>zP%}+R zHKQ^($ z7n9bZ1Erj9nI1_LhIK(cnbhgvL^0DN1#v0pm4ZGg=+_0QY$9$I>aJtY8NM~S5kiw2 zkuF4q55KirtOL?D5w#ZUj>r zZ$XWiN}(^Pu^LKiE~vKI?$=XFXN}EMNM*)!H9Q%m$BG$wl(1k%XcibF;9<9wN*GZf zGm=1Zy{nuwUv5-Ivp1GYlN(uTawA#n_uiF9rPo?{R9I%DpoWU0;+0psmuZ2GMbYHO zQP$+f0;z3iSYmhgt=#Ys<@NG$M#BYbFc-JRO2t()nbA*B$UCs-NuOI1|JrCgoh#`S zJH=S*LPDIqgn9N3mJ%t9(Oo15ja^g7r7~&MK{rWfafFj`u@ZsQSPZ;n;5`E`*mxwQ z@ExSy#lu@ky#GfoiwgYhuYhm4OBeZ02$5C%aeBju}_(jy4 z@dWD4IE#8S&Y|9n71Wy%A3!D;tEe~Qmr!p;7xiYWq27#j)SD3>NUDq{QE$d4P;bUl zs4wFp>dE+J)Q|Bis1xI9)QRy))QRya)QRzF)QRy7>csd}B9x56O+*+<;dMkUjBVaI zz$YVgDZI%$2b;Zf0NloMpt9fK*}=~i&(B&$@LN1oe&8QNR2+)d7U$~rB(Ux_@VMV| zo!Kb91=cC5p1z~}*d6tSQS$*@8Ajz}ys|FWTHygq&ld!4Po zn{e&(`1`0wH~P2X;_+B!b^pTcO7RGg+i(MdU$*6j+my2ZPj;M-o*(;a2W=&DUK3_xr4B$6UL)<29Z$w-<2f^|*kzd@eaIj%pD1XXvv( z&WYPF{Na`sG}iI;nuosPBJA3I0`%j)ioPEABI2?g$L0C>^L-P2xTpeDy8^P^CqRzL ujS)*5w2wG0g53@YTq}QEAC3uC(6(W5-&hmSz#ndBhTRo7d2iV)u=_VF?fvio literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/subdir.mk b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/subdir.mk new file mode 100644 index 0000000..1ebf864 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/subdir.mk @@ -0,0 +1,27 @@ +################################################################################ +# Automatically-generated file. Do not edit! +# Toolchain: GNU Tools for STM32 (10.3-2021.10) +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +S_SRCS += \ +../Core/Startup/startup_stm32f446retx.s + +OBJS += \ +./Core/Startup/startup_stm32f446retx.o + +S_DEPS += \ +./Core/Startup/startup_stm32f446retx.d + + +# Each subdirectory must supply rules for building sources it contributes +Core/Startup/%.o: ../Core/Startup/%.s Core/Startup/subdir.mk + arm-none-eabi-gcc -mcpu=cortex-m4 -g3 -DDEBUG -c -x assembler-with-cpp -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "$@" "$<" + +clean: clean-Core-2f-Startup + +clean-Core-2f-Startup: + -$(RM) ./Core/Startup/startup_stm32f446retx.d ./Core/Startup/startup_stm32f446retx.o + +.PHONY: clean-Core-2f-Startup + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d new file mode 100644 index 0000000..4024655 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o new file mode 100644 index 0000000000000000000000000000000000000000..ad839e8dd7ea24449ba8fb303da050ca8d2339cc GIT binary patch literal 1097424 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%0DihlBkBF;A$6;Qx~FvW3$WlNO?eJ| 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%0AOEAAlR~-_~M+%^qWUk0U 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

aY^p-K@3rIhRA$Lv*pq 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 F(*gxNUjm-M~S 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�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%0Dak0l^Om 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 w%=^AJvIxHf)^Lxge?cOT(-a=FPmZKF@~ literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su new file mode 100644 index 0000000..424e879 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su @@ -0,0 +1,27 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:157:19:HAL_Init 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:190:19:HAL_DeInit 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:219:13:HAL_MspInit 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:230:13:HAL_MspDeInit 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:253:26:HAL_InitTick 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:312:13:HAL_IncTick 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:323:17:HAL_GetTick 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:332:10:HAL_GetTickPrio 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:341:19:HAL_SetTickFreq 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:373:21:HAL_GetTickFreq 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:389:13:HAL_Delay 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:415:13:HAL_SuspendTick 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:431:13:HAL_ResumeTick 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:441:10:HAL_GetHalVersion 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:450:10:HAL_GetREVID 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:459:10:HAL_GetDEVID 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:468:6:HAL_DBGMCU_EnableDBGSleepMode 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:477:6:HAL_DBGMCU_DisableDBGSleepMode 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:486:6:HAL_DBGMCU_EnableDBGStopMode 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:495:6:HAL_DBGMCU_DisableDBGStopMode 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:504:6:HAL_DBGMCU_EnableDBGStandbyMode 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:513:6:HAL_DBGMCU_DisableDBGStandbyMode 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:524:6:HAL_EnableCompensationCell 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:535:6:HAL_DisableCompensationCell 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:544:10:HAL_GetUIDw0 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:553:10:HAL_GetUIDw1 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:562:10:HAL_GetUIDw2 4 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d new file mode 100644 index 0000000..1b9b47a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o new file mode 100644 index 0000000000000000000000000000000000000000..10bb92a3061c06fa3415e3521dd4e2aef48df43c GIT binary patch literal 1100620 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%0DDW=nQp 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 i)UXjQ`SSwLdKI}h^FN8!Uy59l9`K+S= literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su new file mode 100644 index 0000000..6ed4c17 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su @@ -0,0 +1,32 @@ +../Drivers/CMSIS/Include/core_cm4.h:1657:22:__NVIC_SetPriorityGrouping 24 static +../Drivers/CMSIS/Include/core_cm4.h:1676:26:__NVIC_GetPriorityGrouping 4 static +../Drivers/CMSIS/Include/core_cm4.h:1688:22:__NVIC_EnableIRQ 16 static +../Drivers/CMSIS/Include/core_cm4.h:1724:22:__NVIC_DisableIRQ 16 static,ignoring_inline_asm +../Drivers/CMSIS/Include/core_cm4.h:1743:26:__NVIC_GetPendingIRQ 16 static +../Drivers/CMSIS/Include/core_cm4.h:1762:22:__NVIC_SetPendingIRQ 16 static +../Drivers/CMSIS/Include/core_cm4.h:1777:22:__NVIC_ClearPendingIRQ 16 static +../Drivers/CMSIS/Include/core_cm4.h:1794:26:__NVIC_GetActive 16 static +../Drivers/CMSIS/Include/core_cm4.h:1816:22:__NVIC_SetPriority 16 static +../Drivers/CMSIS/Include/core_cm4.h:1838:26:__NVIC_GetPriority 16 static +../Drivers/CMSIS/Include/core_cm4.h:1863:26:NVIC_EncodePriority 40 static +../Drivers/CMSIS/Include/core_cm4.h:1890:22:NVIC_DecodePriority 40 static +../Drivers/CMSIS/Include/core_cm4.h:1939:34:__NVIC_SystemReset 4 static,ignoring_inline_asm +../Drivers/CMSIS/Include/core_cm4.h:2022:26:SysTick_Config 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:141:6:HAL_NVIC_SetPriorityGrouping 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:163:6:HAL_NVIC_SetPriority 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:185:6:HAL_NVIC_EnableIRQ 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:201:6:HAL_NVIC_DisableIRQ 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:214:6:HAL_NVIC_SystemReset 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:227:10:HAL_SYSTICK_Config 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:256:6:HAL_MPU_Disable 4 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:279:6:HAL_MPU_Enable 16 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:298:6:HAL_MPU_ConfigRegion 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:342:10:HAL_NVIC_GetPriorityGrouping 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:369:6:HAL_NVIC_GetPriority 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:384:6:HAL_NVIC_SetPendingIRQ 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:402:10:HAL_NVIC_GetPendingIRQ 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:418:6:HAL_NVIC_ClearPendingIRQ 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:435:10:HAL_NVIC_GetActive 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:452:6:HAL_SYSTICK_CLKSourceConfig 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:470:6:HAL_SYSTICK_IRQHandler 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c:479:13:HAL_SYSTICK_Callback 4 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d new file mode 100644 index 0000000..529e1aa --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o new file mode 100644 index 0000000000000000000000000000000000000000..1f518bfb897f1c8055911881fcceaaa752a96a7c GIT binary patch literal 1095296 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%0A7bFf~i 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�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

IP5x%y)xd8ANRi)Cwwr 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 P@AqrrW!<&D3gq_}NAYPZ literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su new file mode 100644 index 0000000..6c24b90 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su @@ -0,0 +1,15 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:170:19:HAL_DMA_Init 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:309:19:HAL_DMA_DeInit 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:407:19:HAL_DMA_Start 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:451:19:HAL_DMA_Start_IT 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:513:19:HAL_DMA_Abort 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:580:19:HAL_DMA_Abort_IT 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:610:19:HAL_DMA_PollForTransfer 48 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:746:6:HAL_DMA_IRQHandler 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:967:19:HAL_DMA_RegisterCallback 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:1029:19:HAL_DMA_UnRegisterCallback 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:1114:22:HAL_DMA_GetState 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:1125:10:HAL_DMA_GetError 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:1151:13:DMA_SetConfig 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:1185:17:DMA_CalcBaseAndBitshift 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c:1213:26:DMA_CheckFifoParam 24 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d new file mode 100644 index 0000000..b6e0cc6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..d43413d3a4a62f0e959ebd2976b09767a1b1bed5 GIT binary patch literal 1092460 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%0D{Ru)UW@}4;KgYE43K(p#FsoFdx!y_!5pD=wGHs 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%0ACJhzoN`fkoIqS2Lx+ZzJ|^a?FL%6hH3-f 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

KG0Cbea~C*X6oXYL4oeHUoHVp# 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

$wA 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 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su new file mode 100644 index 0000000..9b2268b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su @@ -0,0 +1,4 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c:100:19:HAL_DMAEx_MultiBufferStart 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c:154:19:HAL_DMAEx_MultiBufferStart_IT 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c:239:19:HAL_DMAEx_ChangeMemory 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c:276:13:DMA_MultiBufferSetConfig 24 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d new file mode 100644 index 0000000..e0027af --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o new file mode 100644 index 0000000000000000000000000000000000000000..96d299850cf764daca9eb76b66eef9e5fd5e9342 GIT binary patch literal 1086716 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

rL1>Tw`CIdVtj(y(V#)_tIeSPg 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 Rm%3nlA4Sd#&WjxVe*k?s4lw`# literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su new file mode 100644 index 0000000..be56024 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su @@ -0,0 +1,9 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c:142:19:HAL_EXTI_SetConfigLine 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c:237:19:HAL_EXTI_GetConfigLine 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c:316:19:HAL_EXTI_ClearConfigLine 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c:369:19:HAL_EXTI_RegisterCallback 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c:394:19:HAL_EXTI_GetHandle 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c:434:6:HAL_EXTI_IRQHandler 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c:466:10:HAL_EXTI_GetPending 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c:495:6:HAL_EXTI_ClearPending 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c:516:6:HAL_EXTI_GenerateSWI 24 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d new file mode 100644 index 0000000..c7fe45f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o new file mode 100644 index 0000000000000000000000000000000000000000..729768a0b13f90141c907988193588a4655438aa GIT binary patch literal 1090936 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℘AI(8GT{7Kqi;2al5N~ZJN+DE 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 f%w_;m_2Pm-8=7(_XTd3VOJ7(0kUowmp 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⁡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

`vYAnAbXwZQif z{X^2A@EvPmn=>s%-ANCCP}1Rb9vf#vK{EY>1+UW&4CB?DLY#*H#BIHO3-$>cwNSk> z>iT5RHfX^Pc)&8^=@|v`diO3X3tqK#MG*tzyW>+hM8u`uNSA;2pTWc+MzK(mmlX40 zC!8`$=X^VoCC;ttvh7^IpCHV-#z(6-9cX4Zw@jDli7Pr%V)5ofT`Gee*rnsjBq$*! z+wR<(Q=8Ciu?5qwzMd@mcu-wwio^lQ(xEVw^{w&uWsCa7u|Smk1RS#`0M(V?Tyd*` zSi9<#?b@Om=16R@YnuHcJ?4VZj6}6juaV)To~G~R4Z{|tgp(F-XEPO%uU<~kE>Dw9 zk$HQjtf*a|q`(acY$q4=NF&(Xyln3v9m}x%J;qQ=VcMdF0Hx0BWNAoNfYQ=Xf_0Ct z5YvtVk#tz|4p=uia>M$(7#@q+-n; z&64R>%O>NMY!CJ7+XAE!<@|~$ZH_u@vx>hvV~R(bGt3my8&4V_J1*-Zj_vi4I zd55wFD`al^@y)yBG~-bCHPGKBWl^w1RwyhCmJ?~nkqUONa6JU>yj1#C-|@@!Zszqq z!=J;0b40GVBX4)0zWB$)7fLU{NTe_T0{fT>wbZ4O6cnn}DBE0i-y`X(6M`@IjNFA^ z>gj3iqZr!n>>f4JerNXx%ln<(qoUgH>>h>IerNZnzxF%3N66ss>>kzHerIY z-`hXZasA%@U%9ZuuUy&TS1#@FE7ukQnO`?QU%9%&uUy{YSFZ2qE7y1QmFqkD%Jm(6 z<@%1ka(xlE_*LsQ`pWekedYR&zH)s>U%9@=U%9@=L-6K`0R=;~nXEh@)Gx#bB>p&@ zb{N(G(gqzT-Pw)4k(odU29tw;4Mr6@DCd@8FrT*j+=I z8<=T@9O$_-aA5jRKU=e>aEY8n=~9Dq&Q_9_$9G#Y4|8oW7LZ(mc?qncmMN7SVtQ+^ zh&M?mJ`1ej`05rV=BrERl1PLrMR~!zcVNalSX@LhLzuv5TvzhffD#g7u?Z51X`#@{ z|4hs~(AP$8nqiNu1&b}`PzlR)Y&R2bG*|0<4mf0NctI`ZS1*&i-1;asz4X#be6t*| z@UqVFi(Dmyo+7;)U1CfHS6usq!f$qTa7Md8>?qV_Liui}Q7(|V@_N3$oT9)SHN8#w z>fjI$!?-=+`}2TfY9APPg@rc!^E#$kH*O;OLb{QP?iQzpHOgkFTn_nczdq`1Z~?BRJrIXR&q;aR!!>K9%FijccDH#}pJI zNVh5@DFfH&it(7|KrONW1OAO45(2v2oyB(F=&D}ytDo#TQ((F`r zS~qa2Y995flwL2llidQ+5_$ufktq(TWBp3WUgyizHWiMP{z1pZ zcLySsfF4tA=0AePMl}*@kC|(el~O|MgPu?_PbM(3`3P3+|sWLK2y8C<#L?iCEv^`$0(58TeSz%bkM zRx4J+^!}i2g=TYc6&i@X-DJvdF#r;5Sba`_Z7ql5AVHak3| zJ&!`H6%AjhMtE!e(uN8*Za2j$R{@twv3$&x%(A=i-!8XjA3ROr!pju)h1q17x@Qkm zZ0h8J3Jo&cI0g>^{S0Ht&q`}RG5IYhDMLq4)}Ji9dKT#M9i*Wdw}m;K-=K7FGvN(T zHz-8oq3wVmjSkp0XjVP?B9K)Szrqw2?i8+twX#6mTu|bND~tVnQLj*c7mYO3bXZ#? zd+~_4q>?u)9x^s-cf^%X_^)q%{M+46nC3V4_aEQ>@cI63zo+WM+TpimXbmMdpl}2y z7*xktFruIY(opmcQz-RE*e96Jac~Y~N=oe-uQ{EhwEZCE5-vJChC(T}0XUG6tn=&)dO85ocsZWMoos*mAd>7iKBPe;sgs zn0r5k*HyaIevbVJzGWr)$j!-%1ohfws6xfQ=}K_m^&IdKX`YJ=>}@)B>G(rK5d9VW zB}nK3x{#3iyAUS4(#{Fy&kk)|X_$hW4CO(b7FjOA@u1|;1JzEEJ#jfju@=lRVzjwB ziPm^>Pq%oMwOEN0vS3fNYc z>H%Z#+{kiAIbQ>k$zzJGF}t{MEPPBRMB9$>mCVT=QPXsbUcm8T0kbUd>movqQ5Lq~ zI0}Q31^!~+L6?0~*hl?%gN`v;7x>hEOgMhyll-t#|orT1j#}FF&uGH_A9Oq&S1#-Lg*BWUzGkrIIJ z=)GPifl$urQO7(b{QCl&CZZ4^8Ath{!`<{YeL$)FV(@1U-su7Bw!DY4WVAA|yv}4b zlIRaXIp-t{%lGzG;UV3@TW0$1>0^6yIi7s}`04)Y?)}gAf87s9TLzo_1qD?H+Mxi` z8j6zc=ddLLOe-Qb=f=*zv4MpNXw}a+ET&>gv{D+FIyf^yx{K1HB z5BdK?nFB6`T39|@5JzfEs8eA!NTliFC7nogm7_8vv8N4%(iVs&cHU#s&cd6Rt?sg= zb&gPp0-HN)j_4xnD!*W?(WwMDPljY+FNi_me@+*2+Tw7MS6yMIWnAr$8U=|=uI5Wf zw^Ygo1#rz~ZzoN+aV-?XQ4sWZr@`ylRioHKg~qhg ztk+mfD(Kh~4@t$({gZU$ORu9u9?C{N1VYy3%jFn8JR8ItKtFbl{0vf1cH70T+@Ss< z3I)L$tav6EVY99rwdHKfX)#3yESRb%QiD*XkAf1Yj@dAe#48x8eW#SfrmU0endZXP zBBHhLXOM6^p=WtJLQn^kW<9xM7 zDE{eobwvx+7+h#V2BkW2dD*UxVhABCLP)g4QD}7yFbA^m zLI}OiItga4WYSF-X|N|kx%F5noMDuJmIK6qDc7${b(v3z#&Dnu^|nF*?n9Te^ghl% zkyIB>P77?ol+1F8r0u^;{YKSD*2Zv4fgx{oa6KLL&BkV*ob4^?;N%hUw(T0 z<1atShY)`U-~8LZ89`?xmUHIw-~1j-JnnzFo-g2`2=?z^iXOAKpWgiN?yl+LQlUkF zjNIcnuC!rn<)HCGFh#;Oe&}nMz5)fGi10UXkQFsmCHsw#iwW^ivCg_#zmSPn?RtjN zLad<_LZaG4!JJztVd~tY`~wSh0*MPoHTwEYE z6$@l?7ec;qH_jZT97#Vo>FZaMG9|HH>edJcQ?glZaX518esUCeH}TGN`s%t{uBF^bGZj>ml{Hx9u=#c>FJ{7p)iUFkaTZg>Lx|Nm|~ zHn4~Q(ax^Y3HLq9y^&#BPCF^CqjZg_qdb!{JvS590PbjvO3=|Y^>J=A9@`w@Dk4ry zAk=nos~nin55STif*`4dg?m%^`M=VJH)t= z5sYNIj~0c&>YT#PJe{g_A2xeIZ5I-btOfL91F~GLVu`}21`N#84D>Z z@k>NrS0%23Ul6*2E>R1dZDMQCB|j)UN4%HD#Bp1A6+>H5lS0Eie$y3wGI<1#;#-6Z zZ{SS~oS73oq56Ch7O7f=$sgtozCI-ig>{h(O@uVZl_sPJMq9xnc)z~g@76c9-VKVv zm=Z_{N#$y9q4vt~y}iWaxIHU|#c`Kj;!o<**)>Qr>@u_+8Lc7B-FA}TSfb;Vn)MOI zQRRW%Kv&KQ$l@&bmSZ4$<0YqfLqPNd zm``q2bi$g4wR@2L!^>vl#ys(q=T3_&eW=C~i5-OZOh}HvKQf_Yh+)4NL$A{|6D9+cng3!GV=Bk$6|uo9Y;vJqaAA|8fXPGQitLW z{yWWeJ|<@EgI=e8o4zN(?1f_d&ClU@Da9|t7f0}jIJVm4oMI)walL(sFj|-%>9a<( z+n*Q9rB1Q68NCvJBhheD^!auED2uy_yq|F;IFTR(@YQZ>p&ceTBadxw`y;ZZUJyVi zXmd42JP6E#2>lT^UIMMzc7{j3l{AiDYtfj|O4J)1&V>R!7g)y>?n$23INH8Wn!x~6 zo;nk(RK1)ByZJ-F0Vo-K%!X~3qN&2UEt^@M#FovZdn>#=kuH!2-R0UeoPbu}at@b3 zT5|EnONfwq?)NY6-v9LB<9_p>pSEv*{M+=y`@g*XnWZ9(1y|VE7AD&;Q_{>>s?es{ zLTcHkTvNih&WlZoM?8QAV#r7!)7ur}3(H>NuT?0ZdZ6NkWfMpKduMtQJ~fv9*b}V8 zRo>%X*0x;>9jOGHHY<} zywry{QjiG5T=%8Du7zoQ{JJ&sMxthQW-`Q#KnXoPxmgG=0rl%5&z4#EVS=vDg=QB^QLhC(My?)+9vxIa0c}6moHD; zC^dxo0Gb21k1Ss!~U7&=pQ!;jP z&wLvsjCPf6nPnF@X$F1_tI8BPhro517f#uj&LllzxAUo3C;u&&PBZ=8n_?hkyJkW* zK|BO`pciHp^o#Tgc!;~dv({MtM#?3RifTOA2XH-CzS|*d@wv4ww?!dGZ_s<=n`?(8 z+hn9;++(!&wOag+5ml>CX-4RGsh{Ew=mhA$p4@= z*&XO(Han34&kog}4K@QcB%;Hj#011B4-;q`)3=MvqiCx(BKLvKrbLw`a&naZZVgCp zG|Ftz%biL9-i)ATF9krXMHdO3YWE$_rt9Q2fTDdgIVh(NzWW|=2~4ILstQY?5!G(} zN?&A$==6YZC(lm>ONtS4>Kmj5ZiSmz;taQGrZ*Wd-PIK^PWZw-mIE2*X!7R$-=6GG z_wbZcvQD=7Z|3Pd0zzb-&XUM;^hABNcq$~prHL;uBvxpMuv&VCu~ls-Kn2n>bOJ2v z!Baa9exbQje=pVMa~oHJ)7j@{48#Q~$`TT#E5WxL97EcF=^1O>|sn-GVSg(BH*G9#f|1bEVj! zKKeLm6lnfaWEX#+xpMzNERLf6VwysHX&%atNDH>iurMbL$9-rg8>`*T~0<$7t99Jea?l!=6ZOb19 z|GT_FT%~N2Ol$JFSFewmdulqe8k_W(0CHE2PMD!~RDoWr)RXl0(9KClzPX;%Mwkks zzB(D=p~y3M>9u^V4QV8WWS5AukXrM`NAOu2Ny!G@pdGK*fG+RZ}QVr9n;0U0s zy8R&m9hljQaQLLm=2R9M?y9l*9_)7uyfl5rf0xrMANvK#jr>g#_r&a^n;w$ff|?EK z%bPDs_rapoXk5@L&*);vAlp*R!nj$j!2@_I<+4dLM!c}tK%8D|ro)lZhIFYOL=vXu zyPTf5BY>Q4bgL)e>aVPsfxhWpe_feJOr;ZA8ca03GCVs^vYp^3I8jhb^s zV=_Zon6I?fK6RiPUtkr)fzw95Tfz|{AwBO`pG;wsIgu>Gr>=b?b2{Y1x^To`0- z{QC?lj;3jiHet~1?24WP@MCiIAQ{{kRT%xC6GNc5+a0AVf*UYhx3+TV;8;qUR|EB( zk{@woQ`Bq9$vrVP>YoP6X)RCJ1*&jv2Y(zKg9kz=p#Xkk%6$hg2GZzCLenb6g`jz|a((9mQnEUf@$ELF5^O9f zGMueY95{l$$vqZI86=Hdj4!Vq(%a-N+7j)-DP5iQ)$U5;9&2%>?=mV!1>_Km?=ij< zpW)VQ^3O5D+t|(X-h*e6!g2`FE+XAjhZVA)q&;*kuJsn~V`TPX62lWyW=0K?3Zk#k zR8%e!_1W#hbz4FR_(2wl%IHgAs`}u!tkG;K6`rl?09&5a&|g89zJ<`_fN-1 zXDB578xClWgrne!c&Hsx!uttz+VD^pQ3g9vJlPmsl64_KJX)@=UP5%3yuH8v{L2r> z1Qrbmg(dkEALS|rdE!MZNQkEyY)gp!gC*brWu!d+!ghX%m!HWsKURV2FC~y%&6kx< zEE+X!z)RG%!7Q4M#P(4#5yww>(-rEsvFF_BhfaE-qrK_#`tJ?s1gKLd4mzTXJ^wiY z(k@%5QUW5!`pI0>BSHDv@l+k^k|(Y_R)Rs@9x=~r;SM52_UOrJo12)77_Cp(GP~J&kbi2e zxzN8YP}B{a7Z?1PMEl4qbG1NyO^f`@pR0CXq1av3+9XyKR|26sY>pgQY|INwmrsA{ z75ryPz59VK8VlF63g37_0oay|rZrJ4PmkByr)roU$5AT3$!(G8))<2d781KFC z)>%Y9NsSAP240L~xL=GK;%3JZ`a zu%cYybfrb+`-*J2OL41ZL+XWCe9mX4Ow@QGY`C8?F=}84Fmx-4rAkiG?yy)wY|YHC z0IpOM)+86SG?(c`txtb$ZWqg%t&oiYKADyq)&s|psn0H~uF z4X=1#9;xPh+8j2Gh-kz!j6)l`%Vs!&#idPZj|XFk5#?r)tfr;7Fr{-ftsK?7Do!<5o^U(a3|gj!*Emxz5qs*N zWyVy{1wPT@Gu&VgQyqNwrJ>g0)I7UN=Rg;YUW^cq29V|LwN&R~SKeHK+^)N5i!lRDFW_ql=U<#MU2w^q*y$X)g6b}Z%D zppsXuPO}TwZKQnb@$0CYF{rM@EHOC}3v{&pT@BX1*i9G~QwwVc`m_V4D@Lm-FUD(N zA1)~}F&2qDUDYqIcQ;t)ZWA#1&5E^x$mex*2Q4VkIhBo|7fNreZh~qw++3I!?Xhg} zv^_^NLkPMqUi62*B%mG{Ggih9zd)9Pm$i&=xSO6*QqFc_YnZwVQMsRc8F{a+D{SO- zq16}KfWaPyUzgchdlV(Q49x>_6zhQpN>gadfP=`2DnKxEB;>t@0s}r*`vWeyvKWvb^4j8HkIZJ`7)`cTjNvcxn4T#lWFy`tmZ;PCS%@N@~gMnDFnP-+a8= zfBf*_UicJlVd6AU>X(i?$JZ-y8u?PgisRu-Yv88JXW~E~&6~ovfx{;&KCU3~1wb8% zjrg_D074Q2UWZQ&;wFpc+?t3v)CH4~YX-65>{8=yw#YMEj$&s$%XrEK#R;g&LoR%j z8?BFh*#&St!ac9&=QrESF>Tt8+1;qi1m4)=Wc!jY{R4@)W2OP{oUP9sHJgrWfN+)<|5-vENtjOSFaYBq07t7%?*DIz5v%kv~pFo zb6Q~cL!6~iinDlK<#st=K_!U$!1iFW3nsHO2Q^HuBA4Pm0;w)xdX)a3Y&`ZKngp`fWcg_UoryHoLWN(6~bJij1WPwum z8B`@@mH8K_*2fL9E0r70iryCIwE;Ho1k{w0zx$=ULvJ+^Zp5H-2s_nPo;0&A_vaf+ zFpViw+9Jh+2Jd=tcN>o@y@UGz8ItJNg<7P3g^T@hQnWmI$bQ0rzitO$7z^^jY2<5) z*(@O%c9sDa#`UvvSdwd?Pkkg}?J#6Dpb*2s=N?=nIzLtleR)mtjeOqN_V3op^ovblPW z&B0|%S9+SzyrrXA?~yUAxE?+c)2-u8uf5u>DxG`-X->6E+;6?~$w+vIi8juWkYKw> zs81O}f{TdRI~V{4Z=v~UdXf?ny zCdAT-v-d(2=CNSY6A{%dQE8!?l+dsM36pz%R_7gD6>%Bqh+1JsiW zafQ1k;-aVl7rB7K07`SH_p($N3v?bH46EfDm7+O?JVvdXN7GAh&FGVf^=y5ppgNSn zR=E`-fvt5n?=rINCpsmO=ZY4^M0@7TXC}cL3;#@h^jQfckJo&uO+W?$UmGR5TzJo| z8vl+SNjzFpR!To-s06q=XgMe2>2pN6?sOQa;Tm7Ai06tZz0uC-zqy5k^Lt#SF^GwQ zMfG}DQNqOE7)Ybx>0*IRQWsE4;E-607=5>cZsaGd@CmcK@sIa!|9-c=`{l#^-R+yd z-F^O5IHCZ)xv#)tv@lPvx3)1<8btGM$`Y?{?iczhXY@hfmr!!V5M7zq0DYD{!Cj<^ zXPL0_Sj0}eC_Cs@iPhM zo$4+3mSwb|@$_Zm#}B{yyRa0{rh8E&*Um}o*4aM?9-$K+Jt%pwJ%o*Dp#bRv^Lgev zK45(|SDR#gE*)(O+p}+I_dWx|ly&b4WsP+&l?|4tOal#rITdQ^8Ohb5=G0`HlY!Z>D*|#)Zz&HQb}xSEch#Skr@JdI@oLJ!GevDJUGo=Gm<(% zDgB~I_VgGh8tmwwAjs}!s&4=Iada)adB1O1^W3_AGx&Cpx;81K;8Lc?R^9(NfY1fE z2zW;@VIrI-p5Suue_6BX5L^@KPDE%_s)2wOLyu~Vd<KdfPs zTd;1q$nq6*ZFVcp0r`~JATy-dBhR>gg&)M%wpMge!dc^iHG)ifj9~il)o%V+|H}64 zzi9eOJ=HPdkq>r=0OW%mqDafZ4k!a;nu{n7vb2qP6g!htKf^R@T8h%CnmgGix`wH{ z2qF*|{xS~FF;8JhW5xgn>V}Ncu@##F8o$#yi2?e_ImwPDUq-pV; z$bi4~tLrq8^$t(ayi!36BK1PP&LagcdmN!=Lj`$DP)_c06xqt~=;qIEKDiz((!jbS^GMkw2+m$S|E;@p*6Ibnt) z_zLs8Gf0VLUFPJDk+PwLB?RSc>J*sIlX@PTrvmjB*ia~!WSR>7*4!2xb*uNUK$_Da zBdFV(5_z(QFV-V4w{*5TVCt;>T5fjSHr&0mn|OQBn~` z0XLT$=l|vLE3OaC z+smOx9*}y3%r$BAvv9dfAIeFGV>lhd_9=uCZXKaWN&x-)~MXNh3bNq)=*tE4x+8gzCOmh zMYZy-EkH4A_?ID~NTFMU(aC4w$x^>y-K@tl4cCt#Dei|PJ#S}Iv zxGHd{yA|9NYIVn1QLhK7Bdo(SE2=IWcty?Xo;CJOYbC&)ZREM`5u-QyNVQvRHUbk`5Vs zi+D*j%(Z@LFJ%|5Xx79S3Ec9eBQQ}5>!k}Arx^Hhy%?^+H^1cKR{CV_p#qpsPonC+ z8I_OFIG>d$Dc3byJ)kF|W^erpz8B;t=z@`EG3K$;BfU;p0#d%ybfxjr0S2D!82|nC zhxeQN55H<_9^;KORjY?@H~9c;S>*S|sYH5^05At>ZYT3>pJ09`kL{0`=J*M&x$FX8 zVk?t)2p+kA4#9)xJ_L_kK!@PLk{^OcZlFW(DBE}l{*-Jj($$T3SD@TCJ9x(pEW%-7 zJXqzT=u-m*9%^xY<&V8k*AcvQmn)z_gpN*~tY2FBw;QWh!KbWKy1I5n`A!NU{7lGg`ry zh1PlghmcgGR&v1@wWmjPAV7M(*Lk|+fAzWX!1VOgp#AQnNDp&l1OHD zqgYWmX}q>L(!%GEXw<8S1E<1Jf`d4Rbq%k8K*h;q8iw)uoQH;g5U&$m}m7XJMKiR99NL`l)g^D&9{_C)pCRAH62+ z>msWRu?JX5A|U&zC;FHQ#@gyeFq8k-kKnRk)X%m?>PSnG~@8OgzJ!ZR=fd zpp)h)7@!#|d4a~t>3qH#@~4eXm{@CKng-M4Sc7RA)Z*L*)(48wW*cg9J)0dL+T_yU zOmjC)t4tb2tFr`dP}*H%Zs*_6m1~0nwY7iy9X0uj?~Ug58=uUvCrQ>K5OmkY-bKO& z5|p@74H9a!k)sekLHead6miB@U-87jv$wfcpWOs%`;ZxtoDdm9nyAAaB>ZEHU#1 zQ(7saoEon&gd#`_`_1im1>N=#5}KKgnICdir;D7)?fB6STM4n`<5%Rw(gjnTa5@r> zxw^ScXfUvP=0UKt6-V7{tj^B1PByn#wup^)p1jm~A&(TabSR+voZ32wk7hBco3)ze z6E=cx14`&N1E^toFZb;Q45b%Vch`REL0Xy8(V|s6C72$R(emo!ho3*b`2~!yc|w8Q z?7;JxACzC{4e=FBFG3w;R3XtiANj^Q)JZSZxz65TYd2NrmM6itpNQt9xm-))CJNmc9q-`g&?Ho-+_}Br1sdYF;ft6ljCTA_8KpO)ZL{o~!Ma z9<`dqiBdf)TxFM%!RC!#jmg&~(?jvJ*{%l7wGL2zFNl@ZC@kYIOYO3XrmUG>+ujV? zXi^^Ubn%Zohx|CkH)bk{3%#r%2r%C8tV)^&*NlYY@E?RZ8f&wM6$=36+cEu}jmqc4 zcMB)rP#0UuuoVq-G~-HxA&QW{!2_=DV6_~oCG>}gA?ekqjf`1wjap4hFiU-9XQEkS zviw5KB~hdo@`@mGv;0zrjR_p6X2~ikt+z;niaoq8V`4cE8}7;eqNcRbt+^4(aq_Da zk}cQF8c9~tZ^7ay=Sn@=>{Ez=J;KzJ3 z`0l%+MdKm~fTkX9)YEN;KW%`zfh^ujOCT);OB>}lCx_dR+zwb#9x}K-kR>fowsKn(njPqGBB-6kpuydeDE2=s8W44c;deU&D+&^|di)#9o@2ZGhX3#P z9)Yg}7{mR0rU)NO@<*VqIT#q@Qg+ZYlL8l6i6A56NY!86h3hsVrWDeMmce6cUUS{Z z5~UZoGpa|H;78mtlG=IyY?~QPfC0B}riz5lNmod6fFelk zN=r*p!F5}vT-e;t#9R3w%dKrDsKW18vNG?GcP9mINMcJ1OVF>hk2#^pBGqy@G1mgw z2UuLTNUifAzzi;XB}1^sQFMCg5uz;NVB~)2S*PIDu);aW+=WWn&}ZT#aRJ1!KT9}>)iS4>3wN+1*MfNgssVp68P~bIg zK4YrNetC<8QoEP?$Uxmdl+_8N0?$R?RF(F)T)()$YP~~>0`|?9kEj$tf@pZJvHSoP zoCvL|mF3*A+u6kkGXPst7<@?GOS>ec}4D^g+W+>Q&ROF09%z0upc^ zzJxkKPB*QG^!D{vm2P7WN$&yMLH2Fb%iJfJx^q`xfuRIOd`o%3_qb$=EDSf(9687f zL49_xwK+R!62gwqg6)0o?YgU!D2|~J29dwP9nhW{R~uJ)u}fG~p#(N$Q&ir0z&JY; z0}$F5=mS#dp=o{)7l9GL&xiX*(?N5gGD#nkE_(=B4bhl|_si5HFmHHmwN$T#Qz|5A zyq||E_=UcV3vIOkhOYUg!Je;68C0gvPtH)`%Igx3D0~MO8omXHcp}Nxmk7aX|A31d zF%rxT&9%)iXQt^Q*di&71MMqJH5maH+H#itP_7*F4fYjq9>0rI7u%u+YVLgBC11xL ze$l%azgRGfYBwLr4#z0*H0!=?I+C^4A_4jXVG>NkqY!1qX=oea_TcW&LK>Cwqskdo zEBq07{xlf{H&?^-Xh^_X8?uC+K<9G1ewCAzvwhu?)TjgA{MVJH+EjJK5ZH3?cS8f9M_0v(dvk5W>h3QY8 zJZ2)Fk%{s|RhE<@X&mfQwp}S4$~;w=;nP-kQ81i+;L1ETs0>mGDY(|f5nfy+Op64g zG?(>mssL$EX`6Yaos!Ek858Uu18Po9*JiObr@=8{=uz4n4(M@mYhSabk6sxF=z_Mi z#pY_`IEGRYPY+fFX6QaE7!;R4!I}{HZNOd4{5CjRd2JkxKRYVM>BA~p#Y;yjJ~Uy0 z60A|_gWVq(I?z(PxEUUasKOU$3ysivY0(T0dlKzG!U^UAW$-Ey$>y`SQpPsD3?AIzo_SDI8|jOXX{jeu@N2D)i-r=kfZgyxQbWehAz3FYsQZ$Zm!XCyD7 zFB$unNVNg?I&N2AMfUdZMcY3bH2}nKU1%p3uRLHiaM*blsHf z&QZ<}2=ARfy4}v5@s)L1Q-yi?0g{X<*@476BQ$u_CeTdm z7qh@i2Z1`8bhcqeO>x#Qa1=K$V5XA_u}nJ(YmtNU*p2h^ATqzu0+$#C1*>oe#4joz znx*ut@5NF+^`&&CGNvUitL@VzuDaaoeNaJ>?Tu=3eobGz&`X~{%pU=+c zV1H4i_RIHJ-+y%y())C;Jm-%^G1^WoTI_$Ep-RzO>M-FiUq`63L3c=pnb~;b!stN= zzh3x8*!6Oc2sHnFUHo1Zzh4x;*Ybx27X9`+djL5+G7;qyA!^K!zWD%YP2t4S$NbJ3az~J>36Ax4%B<(DNm>GQdS-Lu@qcZ+U~d3t0oz zjtV|(hCMCy3{EEwr%tWKVnwCCxYFKj@%~Yjf~O1ByW~R(p6v(%!*c(_f8O8y_~G;W z``Gv%Janj+9zkg%8$4U|-a>T?WN>cjun%n4uOH8^@vn?#{tI$->Z7Lp?c&m<-3Pjm z6G^F^-JHcqPHk@E3WUlex2LtH)lscM;uC>^s3ERW2`!Q0+Hwg6D)Xd1tMyh1$12~B z1AX)Y*{W4-)i_zQt*+vxiZ`+nU<;UI*x(_cc0&@*i#bSbF$WS1#>^+dD!0IQ7>sSU zLOetYSzU1lnRqz=?2-9JFq31-BGemESSi#=AIW6^&2#HMl~Pnm>u`6Q^${GOXJuhc z*z(HYc%qUQUm*c7LM}CYs_!!Hq9X`ngWQEz_zxbgDh`eTefynj`7GOg82NYyQ&ZaU zm34dsQ;6$}=>MT%_W|5TIHZ@l?99mQ+hO)ZCRlz4iJObnCB%0I*#}NtpoOnCxB87> ze(*hx2cGR;fH+pX%F#10%nTy0YID@X>%z;G75(4~5F``JTDED;jQId+gSNa^wsp0z z+>>nn-DZ&&02|qdE@L-mCn;;aGu5^5G1TYYr2HJlo963cM5b3vD)rKDz=bb)k7m{H z1#H&v1RY;r<5jX79sTx%%$n&|JZ1_hRCIdMrCu4hz}0dLc6^jb_*vSqP364UZ=c8Y?pnV0Yp~m2TGvr{Jcnn{ehR zT!)_x^8DCJm&Om^7M@NmN{Sks_EYtQrD`yZM?s28B z;tk<5Puo-d;ufk`D^e9Xbo$MpHUR~!z&rSOsQ$C{^vjGF?-1igsxNV8YjkYM`Ya?Rj1g*LbBm4H!r>-ySecU=tq z95LSOA~ta?4ycmD7C=P_KP2glt@<)kvB)Qap*kX>Ng+z-m;@?@Y*<4`!xDYy)R{s_ z2RD2dv~!bN_NdphF}rO;H4^@|*xmFwcb#Cpc@A{a_-Z0MGI2f^SQ|;oFneQUs)%Zi zv^0g#;gvD8B9zs*AixRx&7W_bY$q2eThhW+REy^Z@t&B%PE@_|E#Y$*AJ^%o&r8ry zmflP=R>^I#XO+l%e6`v3MWQmvx54!2QszCalZ)4&Y9LhzZvQe>U39aOLE^;iu8~Lh z912{x*63c}czy8ttqUl_7qDv6wcK;sq$YiQ=1DO4()rL70wsbt=n~00-6fK!X$#%w zlDS)s=qv;c=;LpXkDiw7554Dlu~4{sCKncW_{0rDLgaOe++(8x75uisGQCs-v<7J- zUQM27@h0az=N=VE)1^_D6%~&E`Q&JHHab2zJv}~qGCDguMMZ_PMLu?zP0}V7h=3vh z4{`TS!xC~8o666C;qCAw6Gw%ZyV>P}Rz2!Fk@bopE=`LTg(3zKEp;4*wD4&+8zWJL z;sc7;QU@U_RfF|;iBQu#4|H}+)-J3LEl_u4<==EV+EmD{0r?Bu&j#KrP>cv+7VM)d z#OSzSV7p25!^$S%U(wO}U>M1%d+65vK71HK+f3za+ZFQSz;<-g>YM^uE(F}3Bc1yG z_68h7M2;bIPeCT}jZe$GCFLnF_rbz1IC&4!3kSSxI%p6li$XN2{>TE54B_ zQCnk5%vk7}IKR;L<0-Syw9D)1&1TSCJKlg$V7!D)z0W(j-UgBlY*5)FAxud+xtnBc zGmutSbio+kk)Lq+zNXZ;*EiE1Jjj?+L41pZghDIAlh#bj6@Ad)tGi_JWnvckkiw$m zhZQekFtr_fQoYQX>S%>?NXf6}eIXZN=)H5$Olr~0>hs;KnBXlEGWtszh+D$riovm$Il(hyHGrJQI-k&$O!g*$TDjL$rp+W?gPqiaei1@h@ z7us#E#$83GTwc#t*R04^N$oNG-mb+V$$TX!cHf35I|y~CCfXA8E3a0SID05m1h#hp z1PkdCE392@sl-B07+2*?z{FmAZ$Jkz&MA69K$fe*%SMEo)sT==bpK*^3AGA5;Tcfj zp#h-1SXz?m66;8+B3*WvCIhx*?Dze}?Et@&k@Mo#o`Umk-n#a=MAhWH1QxPz*Al$W9 zFf3OCD7z$0zJ&=x`wv0L&=4IMwdrw=#|kFM?HnaBvNSy}k$puZMKne}tQasF4Jo^m zA`(aRoRAFEs<~h?-Ar0VRS8j7S~)SY$>uc>PW;pq_K*so^r=lCj#RsenTYxq_OZt~SMMn2q={7UoF zh=(xPbHSU|wKa!?GJ&J5^Wc_J#&o{Nsgy}MeitP((8dlnI8q4SChZ+vYa~j7h%y(} zpuEs|#9}T_FQ9%6yD)VP{v#jQ6CfNn$bSstlp- zfu=J?=KAGx0I0f!0iTZMo+R1qH9Wdf z>q<3n>U!NmO`#`uJ86Vi6L_%qm!xeVB{u1$ghmM6l4Lp#OZS60f4X}lMHao}0v*dU zCCiVi>G_n|MpEtU1@?+j6 zCC)DT;ESK@*~-47Dh8ONuhYp=gUtj%vsz_ zj)5wbiA5Ub*m!wQDl$+ylhR8*^e{B-7SF@ue)=%@Uswl-`Jv7m-2d|H$Ge|(e1TT} zb)cYND8Fzvk)Y;c!o1yH0^TlUF~&RpHQ&0fEa?y5^ibV+&eA#+!!T7$ajj|AOxnrm z<(~qi6_(J5gZ*cf{582TUFvb7PIdTqIOr>5BYgJtH^L!fZh0S)s5OiaS1cyZlp{Hx zK~jt8R@dGyauun!?|*)Gx5r}q`1aG=4`!=9aWUS+FyvdsS3&Ph3s0Ot>Kb@V;hat{ zO?9YpC5L2U?#+X^uWrs$Yp;qNyKyDBVa}u-=A8O~it)6WTx>ubaWDe#JS8J`1eDe^ zt?e%!AA2578&uH>*~Siot|({9eOk1D0`v`tA0v!Znt~eh<6GYF-hA?#YcH zKqjfu5pDz0=8BnQCQj77O*8A)8l0VQ(Ae=Fg5ER-8x4BeI-?%i1Qp*QSLa8ph=_9S zbEINJdLwdP$Td?Xr6EHhEplY35r+YU_-Kzc+pb{)Ssiyp?=Ri=5dNk_0rWbZ4sUWH zbzbN!0D6*zx{jv;Sziiul4+(W^}?77S@b4xrN>b2g*xO4V#gI6_FN2JU2Tx#<>iUE zh{&Q7-%{%x2 zy?OuXm$&yc*>yUV&;|vAi%40@Kzvddr%g~V5e|?~16ZTc>;Ny{ff;Y?#Ri<>S^jD| zWn+7-Urmq>rnt~&n?wn1>Mi697b*QpaI$Bq{*QZt4C#fG4?Hur9?3*9M;Kjf5-@OQ zft->9PTf_XnM^RCVhBTu+YK`{K;2N;d2Wz8rmpAO1?#S2Z^9T|zomw$yIEz=w=_jU zoFcB#$t7Vbm_8zH0`lmsk6#1y>GLdm-O^U2 z6I;zdKB;C?JWksoPibkxDk!g}Gr`o|i7{2Gh&z~iwO3^+NGk8E&F*2Hc&=fA(*#28kl~8;0QixMB6wFl6ZQxF~y~U+^Xs@Oi1luY! z(#Kj*M4`)^DvH(^tGA1G0T;=AzH#qy>GjQPz1VQdsW_#s>V*iUg4s5-V8_bdBs~-q zSzIV;bjk@bx-tUM)WK>nZVOFA$05b&k!H94UU9DhQfJBNV86GoFykEtyoKr(&i5KY z>E!1M?YY^v@M5bvh2^q6PsOj{HdTzIvN7_hsN@0Fd!dAbd4t|HA#R!a&KvVu58XH0 zlL@3t^{6=byWf7i`*nZ+@y)NllHD3I3q%TttdP_#s^wI5_WmNPsyB2GTM7Sv-3dIl)sX%fDE0qZvP0vH=oI*B}=gm%$Ru?<3D`Y zLnz-S)a{p##I7N3=L*TqmPjfveT@+F{S)&jXxlgYCx!;iB^q{05#YGeMoNeT!V4Zq zL{ek1o(@_V;{iRyv{x{wa*%l}n^~0$M8*&L^X3KBb}zC%-;ZVu%tw;ZDmGsJ>KSj{ zK{sN)K-Qp-qD81h)eTTL5Z!Nxtk+)EhXHvAir-zqC-w6B&-3YaKHHzKZ+0t9e?Q3f zJaQ0Vkt|9WbV}K<5$79wlXC6L89Yzq=M4dKsak;a_>raAuec!C59V9dAp>`sw(h)tZF;-E1C%Piz3`zB>6 zt>j4mBIHk}EI4p^2oi`H3Q|eS)w7}nRI5`a6twU6$q{`|xdshnvmwT_jfcoAsi$6` zC{TYRt6U`V3=9>D{e25@%_ZSXD~0|TpvjbNuKa_w`#X& z4bxWy6X_I-%p=;3Au27KUeem_oT8`&M&;iB>L^g$gmVmMGWUIP|Bg9oxiHBDUFG9L z$!QKjqugbm`dML^$~pO%vV0lZP(k&zVo+XyY$9icN2A9LHON=ERhl{%_|yUqV8|&l zYcR}32R<^&&{KhiBFGVLHk$T=wCClKJw-0-+dA~SXt(u}9C3|G;b;0>=J1!rfpfL_ zjR5uYk-|9smWxWnwZGC+=8Q#ZB1!TGBpP$bR4=o7rnon(~UQQB}U4q zq_zo4bRzHY6JaJdlYkrD=fN<5mg8d zt*4~B&EN>a)~odk-pN&W>{`Qo%TgWPJN_DA^gClj9ETn(iN+9%o>6fG52$L(BS2fb z#!|?|`hYv&XMU0Tc8o7b9v!UGlTzbeW^Rss`E@~%WW^QKXk%4t{`mG zb;)h6hogfB)u(cXvp+3`VDJu#;w0 z6>9!QTohG-z^mVrsUq%qDz7&q0Te(=W@c!{S7&>|HQ{1SlqGD~)yZ~&@(sXV0-t;Z zPaAW!K92YmSA?}Jm8K-YswE7jk?Lw5L;!KfS?njR9z0>posU$f-e~=O@(SBKN2Pzc z)BLkY%u(a&voJ8qZN`)JL+l671le0WM8U2*+&_rCHmx1NnET}$7;!&+dSl;1U81}Y znD&^}>ZV%@SjpG?FvEv#v}>hY&0&J+l{ONr1k$K96H|fme7HUbOhP@6b{sq(n2xzo z3ksCfvV$ZuYOJI0CaUT7(fcy*0i7_SmS~WmvpLlWe?;!6(y8r_-x!@+dyXi2lTYB| z=C^?PjUbW*46kl6!&?U6lQd~tvQL-LvanHUmk{=f^*}Ah8<-#&B{Yw~SB|*@vtt&L zxtp=&xMle z^Uv%a(?eb4U9kZH#d8&fWP{{(C%q-Mv-9}23Zw%(<~MCMYE5VGh2lQ7ouAS zmVHRa*Q_*6eVzP9b*agc=tW(iSxFvH7Um8bihUq6dEZQrmlbEtWTeZTFeAAb4e^F5+1KfIs5dH3#zH$VPOju|C10EL^vj0U{=xY_BX z(~^K1fS+$N3gJTUnprcRnP~}Fo8H^yg{DdV6<(0u$o=TvTAN+X6jcy)mdZ=!MP%!Iu++#hb;wKQfj`j9)@!TT z%0L?yP!87o9ObEQ*AV9`n)7twPE=rm%FJ89V`lmg<;cgsqblu%`vx@cPlj!7Jl_bp z0!^Nh56xy5h_NW0En8Tc*9cKrdU}M=32@FcOx=SlE7y{1EM!~?v!6q_Ovmw`Sqaha1ZE>V1qr<(FT)-bjX)Z==j zLMR!Y+Zl%!B*|X94j5|%PgKy@l)Q9ehQWU_kM-!-TSXx5P64!0cxr!(yjs9P@Khz% zB)YfSL2$4ta1A^%iNKCq6M#Wx<2I}*JS<`|lEvE^wIrFvu&_0(Yd$7UCCj)V zFVE21?a}oQo4X(HKYaYO{V@Od=F=SzBI-i+%C4tK*?YA%mccxQu(#Z0Xh^}@#Qn-4 zo$a>AV15^p?`7~ZP>ZU)AB9{HYNv@B(V`>cNt>m=ptTU4Tc~J0G+gerC z^C=Rcd>Krrf!eRG&#ao%(+HR$mkIDVTshg!jURS_LgyVl^hsRJq~e<{Pbj!_b$*CE-_hBMsxt<0GVaK$CK_qzWtHe*?GFDoMC0on1o~vsel@< zVcbYsi7JNYQuY-Ywa}z>GzzLE>7@lWLM>L9q}{=#U#v+$8wd6u#sWm)F1;R~j5Hg+ zL7{$Z@yVt!nW-|%_x5#Rt&uJzAnB1I1@*0-5SU9+2G?!k*&vP6LAIH|3Z%{%*AcBg zDdn1En58ZNhoLIUY4$+f0}$*8rc)b16NEZO<%Q;+4KU>o_gChRpr3-c{Q=ya1?R#I zqh)J*yJ+-cDzsVFox5t7f9!an91lf>!VeMLluII70kjf-$hK9QZ>(QEe^VaM=5&=?Y z;;G>F?Knbx`J&E%cc72%=X^`Fz1=1C^6hRR+ZMhU!uU8uXe~ zX$+9Q)xCr0)d`DKvymF0ZqOqf1NrOYD!pAiT-c?^KtC-PH$(FS?Grr=-7oaGv@c-} zk;eRbdx{ZRKbac}X@Bi}l=jr-pr9~^-K7RNW zYqq{d#j9RzYy)xKq^a&smJ(D_fPu_BS-G))K7TzV=XN%HHX0vK%4ol>m7O(ByRrd! zizcfh?6|Q;)-CPN&<3|$WdqC$V`+;W%ld`hB^pV63rGg71IJuvPlDIN^f)$JV$2j( zmoM`pOO26l-Vnb?{7Y~ir6J|QG-W8zt*p)xhRu~{gjuPfbcb)k^6mS{=f7cmyN)UNKt!5szZL$&fe^Ww==+HTWx`-43I0#o;kfi>T(1JRg zk*OB)T$&Y6<8}{=?15|Msv4H3z<7dDuv+{YY6N)DRPQLCJG-nfOjzxvmk@+5&bukJ z0-(FNO(-8(FgO={!Jmfp$@a2?B@N6I@d5;gKSw~sXnv~9#fZTyUawB-tFRBLp~h^qM5@227A!`4_eT+S30h$YBJ_M^-_R%+p1Yj!0w+L&kzqkUabCyk*43DN= zIUy8Y;#GbT=Pv6?9j@?(KEkHS+`;;5%sOJTio+Hg6=@Q%WfM;vD+DcI1=g4iwSn85 zPEW3_gr!?Jaj6;9I4l<;qAaQ_!CQX83q%yUQ8C+OPFKjkb39UHW)Skx9#(X14a&5> zTa|Q&yR~GrT9}5fmxp6cvp_XW-DA51nufHW++!L+zv`l!iBrJ2!{=I+kHo7aTTcyB ze;5wwTv&OwI{D+Hxsygpsbc1e_CS4|ki(5oBZPz%9m;vOH+_)A1Q+)r;* zf-Ta%m;mVjZ#v zUi9U89e#OYhflDp5` zNK}XB^5BzTn35fSy~w$fkqh4&nqYHBg_OPe(0FW7cu~WfTa}bweP#x0tqnv zz~g>|8uZF?EeHx9OW;2P-9ZxC@=C7{Tt$ggiTRehE9T{MD&*YHp5=VD=yu6a6@Rg*SW}WgSaHh_ zZds$YpB|z`Ghf+bXW@^@!pB$9TkF7Q=~mNg9Jj=?hE>Bgo*3&_xzfbCWT{S|3;xJ)xzw$o0hCnA1@m((Qf!~_ESaqVDbHZ@SbVRv zU2c95Gm&5uc(_Da)P1>nr|Ne zVr^V0WeZixYGMl`fvy{b%?wy@R}hroE||2;`0RfmAzYDG$W2fjH$vC{flybw>!DEB zuA#usVsgsu_RwTnW{detAkHN+U?W)@X#Mc)^mMpCrstiVGn$a5a3ude(o9%Y2s&?# z*V7BfW#~k2>jn*IS=<)r!aZdl3gu95i<8VjLMYOjl}zA<-V<9gp=7Ct$gRR;v~X6A zFxY9vXAmXlT(pmkQx=~QKN(?Bbt3=e5r%ZPWJv;khl*6jmhhBipF13nHBlCSB* zgRH9Nq@+;O<-CswCXnqvxYFTE&2qHb1AXu2kM*z6oBwj`7QGlBd7L|-Jt`M9+Aiiy2P7g&fdH9v_x%Nn>(x zl5W>9U9FohYoYo!eXixhbF-7RSVBB&%JvxMEjU%;DCNP_rS>%s1A`pkHHeK`vUfE^ z?}P=CWs;OM3Ouol9oMt@3`~;)=xCSQ<+wqy{C2m!_1IymtapovS=T0S@2@}q@&lYn zb5rsJPfXM~?0v8U?=L1Bxf0l7@j0GRf?5swC`{b}0dWA7HWGHNcIzP`52vH=d5QCB|5+gWZ;gCBeQ{FpH z?YbvpLoiezAUK=K_K%;Td-d#m(VQ3DD{%D&1SFUyoW(pR!fhp|Q1JPEU>#{k7;s@| zsd#}j1Wg-7L6x<4d2kdX2Gw=4=C)8hNsBk!J|Nc3I_=gQMnL(=#b zp1wArXOH$Z{H*OCp%cBjj11Hx3%fSTFoFx0k&390RT+gTYSUtSK&eeCERWJ|xYjYs z$hS*e9-yI=1co7&clz4;PI&DOGRf{BWEnW_ z^=ylfUS==!UE@aV8m5m5l9EF%5=)<((gLQW((P^u1R#`|2+Rsi%u=nZB-xgAAFfrt7#RMf9E)95pt z7>e_AVrhL27QkRRkh67n~mHkb-hL5h)p!R zTH4%U!FzUGWYLz67`0FQ=x(N3k*eAtU|U{a6~()r4eCqHiGSoMKJqCy@mXX?uun`t zePVxX;)O}lsOV&b!@M)(jZr8mYM36UF?lM4a$E45fSsT@2W_v3O$E|J^jxge6nREV z|BJF+9r?L%HbYmqD6Kobn*}Hhj$-s0LNFSDUnxWyZ9p>}sUnV#a*eiR_UBvsCe1A) zQ+UD?9cij&6O|;P{Uf%PdHG2x+UcVKISb|O+u8Vff98Oys9Og zP5vYmnC>u%3so)SyvRo~`83;A-W>|{8DDPcK&44wNPw>al{vH5Vv4X>cBMPTZDULx z>d#-gmm1iF#b6}{Nx@Pe(|EnayImd^9kjm zS*fP3in{}g857Md-7TG%s#awB&_F7hQTIav{;|t)ya*MyP^M!YKhI5Kr!T=YUOsYL zq!5aoQ&7|r?BB>)UZC9H*&gW-w->O%9goa}>dZ{d@0%>8(Hk4);)P#mnYr%k%nZ@*O+EtVN=peO#-Afp!5Q4q|6iYth3dngC|a#KnBQF=QJEW8^B9e66vG&|v*o6((#F znlzd~t=RC`^Q6lvsqwIF%*2oF2CYDjT3CUE0M%sf%z!1u{x#Y(&V>cxfg|LZ@;#uSzXf zs8GhaTyYR42s78&z5EUOL^QJbjV2!y!I}Fy$E9X~dl9LmMqsAMZ&EmQ*21f7rIfHo zV^7pZBkuTWvo!`IT@{N&6w5kX}F+@t?lK6GEgrF0>p5V1=O|-6j|gb|KweEpr4*W+_Rd_;7WA=_V0J=yI(%s z-`&3X+ui41#YH91oBIlA9!sS7NJBNU__(;zObLyJ+PnRj23UPe#FX8v=7-$#t1i0P z^^z+0bTb}?o-(dAB2yECic{;_za}wJbq8A*)3~(yF|B%lG!)+lT*Q8Bg%uex2i2t3 z!v5rLaY0E5^`zbh#+t!1)E59(ys&%1EmP0*Sf`OrYPe{Dkwj2A z20eHj@n$$)rjW;>J1fpy)u`EwshW|YoPk_d`hqSr&5bIcZKq3(D=zd%eo-#x=Hc!h z5ZS`?IP!TBor}Li!2y$c^GR3ixAYj*Ynl&gD9%g zRqr9fMXkCENU$i2F?w=JFV4@ue0~QEE0o&-{_^hL7(eoThxHo?rq=`m4V)lVg|D4l z1Jda%LgMpYD;hPI6*0!Li|XPXZk#UIicu9qhOiP;upuSSr(X4?Mhyic&NVI_j(KMETK82haDL#1^3qk61`;Z)Un#Cw4 zKZ8CD6{?%O-7xoDJ=f?d0PiX+#9>>jMjUg$eRWjUTeeG0n5GK58Z*^l$7+}@v`nXB zAX#FTq?L~M#z{VP))qXAxC&RY$|Ila3g!{QoDQD-T-M0!K%YGKmJr5L?_fia%@%Pl zJfu!dyI8j9JB5ONqqb9GYc**tEWa@9ldc6!m&IP=pvhALqa=S9@aO++VFJJr4|pY+ z`Jh`z%kFx}D=D@H1yDxSgPGgGhacZ=v9p@ka8hzLwYx42q@a#+O0L63*k5&v_sx3a z3sqZRtby#(@h{ryRf3K_1TCx?uLOsJ4;VAKzu09$ptc!SSmX6@Xru89Td&p4=JM6v zgq(pTcJTz{Zo(*YUY~;@p?3`CWpTB+;1dcdB4)4crLDs)p@q1p;~pz%Kd9=vyu_Ac;qrVvAeRH`ljUGN}A)lT*5FN}USUb91t8j;y_5*a6ZzC7_Mr(TTJ) zp zXtU{n{uavl4GLd!CqY>TQ|6J0q@8BnL8g#t-&idGsfY(m6<#;(_r9p^|8X2OMNE5c zL2c5Tr~o5t2ZzOt`_HJf$CH7o!W!FCkf?x5$e2((-wZ3%O_Ch#+C9~Vug`1+D!1DD z!ivu%*AVC2d?#kGpNS2!Hzt$J@bpn2gKJ5~DMqxLe>OVkIbFww(e1|d2v8$L&CgS? zVek|wjjX;2T{#$@?}fClE!cp4(z&O4Qnk7Yv3N#brq)n2GJuR|8CuVgi!wx=$yDd+ z!fK^Dz`O$P8|bDbQgy0#F;H*`ILOFGUB@(xc7y->-v%Dz@Xg>4i1mno2ed=;7@O0) zz}b-(tdI_1)CK^fvY@UEWI?6aaP{hVO^+!8o!QclI}c5e<9&93kAO%AAwYB zJY5A5DFAwy=%-Pv*7L6dsk5T>jz=OHF#r7X@adD2XD7!`j?PA-(b>}{ci$eLEnqJc z#|(Z9%6f@{v2ns2TQ(uK$I14NpJ&Hu6{kk7kG~eSmLjVQ^-VD22=x zra1~6G^NW-d7;Pop2yVTVe2TE#{4RBz2!HhL`PKB1BJ9{j-ojsC8e1(1`iG^1?$E1 zlDXYKM-F$`GDV@^P;b?(>Mw!FneukW)-Zj%n%tL&_ZLT@0;zK#RT#e4 zf0mR4(+B8w`fz|zHb3X$d;dS$-n6-mD@zmBPeHh2Ca7+^ngAC`?e6LTv5>H^2>?aO zUl1yZwiPW)9*J_P->H6o`#jHc&bdowg0`n?9AOc8&&|x6cRBmg0O|(k0kgC>_|sr; ze0q9*eEMW?c6`!5>EC|SKcAO^D>5*ZZklA^=w^zqiUMnzB~QTT$hu$wxecA`qoW8W zk+@emKk()7v7R6~oz*J^OF&cKk^NC@S^R{JEpE{rc0-s3k1rxAgdU(;X7_aOUjTpG zV!09D83CFMWQ|9<2dny=r?FGIU9rJuDJas$^GsH2s5!om$!?S2dx! z(i`}l9Mm{D+$fKyarboYasxGy)VO6>+9wB+5`&j+Koh4-c7^J;8chVx98gW2;}x-8 zDU+aGX*H60hd=O9jceZOZ zW-9r*vR!Ysgb+B>paAfKUC_-)LY?c-X3G(Zdn#%JjOg9NJW|uKL48522@R8yezg(> zH-LJlb4_xeqdQ~=N0nf@A@D49nq!ZzTYO|{z`mtgrd+7IrmtmTND%XzmrRQI3`7Znz8PoXJAb`<=Ue~fu5n0GxS z?lbL`e5rAh#k|0Y+aqxWSbTBk#dV%Ccx`)4)-!V*DjL))rg}ZP#N#f9yU7&}WLkl` zS$AX(Z1o&f@J%J)@A2Q8nls9RVqot|4Z_{vZk4xltNbzT$%r52G#-KLOz z(+mDvT4(ddNU^Yu2>JV>VcGTYefMdeIeL@q!xR7^e+dsY+BL(8{Xi$pAuVyNe#rkF zjVJGe5~j{XGBmHQX50SKC1AhOj0#DL%ZH^>7eoorX4A;}IrDKzjv8HE73pWSp5~b{ zfG}PWl^Ukez{6>a!KXDVwrve?Z$!!_`$@`q13HNdun?ZVijIIR_07NayF0t&9cZEo zs>^7Mais~Vlso=Vcg3tg`C+EMZN;YR(FvyRII|FL_i~{}EbDRw*O$!%sU2|2dtJau zK%F&&Z40TMywt6SG|Ni@v^52bK?tfRqlRfDF+Z265`BqewlpjNfWye}Co&R={b62s zY|VymfHWuYcWAY>8f_g*W zlsP2>WS;)@FfzsSKma{Ama2#(E4hLWa2k7;s53B4QvXrbBpno6?h{#NJADq~#lTZ? z1Ka-LeD7(xsNH&sgWiInKd@Ap)}ZL!fKWVFd0J3}$zr`@oDGE7)n>MPc@#e=oaf*F zN^KU0HOefv;=8fOcPO-o+3G>?CHH0-p!bO2MeO%#^Ri+mjrL@ni4W3cirj9B8TX@i z$x-iT!jT=e;BFh`kZe!+ChP!fA%#a=@JQ^N$HmpK?sW&2A!8!-AysMMjCGi5IrFSi zq;z)B<0}!$Tq&U@u!PSbURX=+Vysd|@?`t*%rEvn~Q5pDgY<+0x`k?rHZ)awO*ZB4w)5- zoRirE2sQ#}tfT4?Zvg}<7Y>62n`+WysKjjFA;%k1&FvS95f02qE-+l7{y79?ovGP! zeGP^ei)Ri`T9`O((i2(n%v zkr*IdYGM5wm<&buCnz9CBCd%75SHx3xTd($y&-AiEflm%9b^Nf!NfidmosSa;B&?u zcMzi2WYx&7NN8j`QZ)J*3gX0%2Nio#l86eR0SRxI&aMjOMqDi-`&LspIx?4DGD(16 z4Q935X(dDT{CsGLzmXrdasvJBd?>n0=};KIz|zT3TA~0l56gP^a=wB$fDTUGX1hCQ zj@BfEuOQbO2QacqYn)VsmYEpfA=b>q04Y8#5_zTN_w()QYMUiJIb}wxmQAzkoS$pZ z;wr;E<)-UcFnOus)PWH*>H#O@Wl050ry)mU2r{|E$nGtQJ9?EjuWf zBF8-=U2_o zshp%b(K(L^Rm2m-thl@?>tvi*;##G&Bk!oE%9S*6ad;K>41&e*kvf`410;9R&K}wb zV!f!D3frwcmYQsWfOTfj=W}Wbtyu}tQ!rYN5vi1q@W0sz_}8<~F&8s%SC|8u5XD+p zu2~uk_eBO-a4IXK7z(bCL&C|R_tm?vjN35wU?5ST7@#IP!8AlWnU07zlf@80d1Q6) ziNggb8XdO``pusK*(}yQg)aIX)rr=KEXCivH}A)j(_@f2?c3ge z{q?7}?{1HdAAYN2+{L>hExy>8k@2o^E+d0Ht|<+Mc$#uQ%|}n6@EJWV%oAKDbHZDb z2Bu;k$H+5p+=k`HY|f|-M1VA*&py9;Lu*4}e2s0En<|^t!LrbBE!HC)qtoBH4=X6B zf5hNb5cTzqTPAqM4cNBWBU^BO`{xL;1}g6jj{8>8x(*lb9nn!!8^!H+ojhiO>7_C8 zCXyhECkJ%pCgG7#(@=;)fMDYQHKBUA#uBcEFle9=T5M`=rH*Du34_w~cXf?l>R_Kt zBMem_{bL%`JPGPVoQ*E>j8%Kp({ZXR+W3tWDU*}lp8yzhxDg$YzmD@ zPQ-Xm=HjZKAMWnF!>yiB!2Qmio8Qw9NCF%`&nmr5K#F22UD7Kdni@8Iw|zzp%Ci$O zbm>a#;tP85at$wbD6MVf{Zc*RL|$%K#AXfB2|v?(GK#qeGhAKicC{FfQn^}5YM~u( z2D+GNcxr7}_Yk0}Q(EVHL+&C30K;@tWqY&Mpk9Zgu-up0W7UN1sLnK5(LPXtv!!FU zS@vA;Fw6n18xh9#?$zDrPy6ZTckg=C#Hr1ao4`akmtlM}#P>=`#621rHqCFNc9w#m z`OcY4X3tVfV8$Bh zBND#Xw0F9sy86O{YWyV9z(Hymnyodig@$%pbGk1Th1{gkuJ5k7g6$3R{(`gO93M$N zVy6On#Tzh<7TQvae8=5_B?EM&|N0nvB=nLG?-SxTLYx-#xa@W z46S*JEp$$)@Ut4f{q*WD?{1OjvVZjO+w6ap+Xn~QPY$%B$^f{cUa&=WRxHxYgDecv^QQvQ;+z;$kU9$0zVFH6g-esPBDB*EYcp_O)6r<);)HZV zIR9U8)JIDugCRCZS2|}&)ne*R6b~u4cN?masu|wfdwD2?pyrqTBuNIxYPn>RG*vg} z)9x9C5ofDqNtf!8H-OXy&{-t&O6*ebf~#I+RqNgT{L9DNAK~UjUiumwJnYO&yMygu z-b5|amOc31NQ^E^T5;Qb2C;%1b>br985|Xf0k^34W_g7QR2*Gy^PrEAR|{=e*5F-P zC}tT)Zp@*y)uzJZILjEy0y|Y8y_%YZ9diCEr#XbsBDv%7F_;6m6UYk-5pK{yFIOY} zV2V-TS~=SOzT6J%>W9@m3!Sx6&Zqe5$g&_MXIEp|YP<3L7=%f2#{8(_T75W|!0gy! zwSTJDtvEHoEci_@hglM@lrfz>e9i2%7t7SkTf7AeBLsMYCGx|z<#TYj0_oxDwHVnL zRgG$|P2hyc94Eu8TT#kEG!(8{8YcCDtB*)HKH*hkiLB+6bbkidbz@E!~y z)FE)6Q3g3idzQLS7e*6IqYGEO-HR^2BWA4~z+6XI)qT2YPE|aJ5Ow8dgb2K3jUN!S_M5vTjIIaZehgc@WjrsC)Z!9qP2G(%&7}K`+M)8aE zNYC-psYuE&J&g2I5%myanl#B7n2G-GL}KId!*h6Z3lwUgX$*r49Y(M zqjzF{t5(H1^0BC}@Rah+^lp3i;g?@--)N^h)4!Pl7g8?hVyFwCCR9j!1l|>_>lL(o z)KLIn${3L*H$OD9PS!9zixUHxlxCQWY0SFlfN&y4(on@Ja1)nu(_8FQ}Nwl)T`H5lwhdkBz&STz(BMgGy0o+!40YJK|-Q zlfkTxD72PbmT~pU}F&DxLr>sV`Lw`F~-p@;r{)MZRV9>$qrZwjz&SR;LT}* z`hW^UUspZOGr;KB6x*PN>65hwBSr9_S6}LrNG?1H5UOJFY3>kG0rLEroN_>k#0@A# zPvM(^d0i}$UW%NzO(_8O;RK zXYhcTia3m0kP%!7FG>hw8GLTUZo8mWFe*)uNRnZn)#!9I5m73xHOX3;+Ag0K&vi$g zT{K>boTV(bzFcRcKMc)=4dsj4w~DjHo@fB`I+~fPGrlB1>g=%!L|I|D0GYy$EJF_> zE#dvWG!;q5Bn&@-Bnb;r$q03J&`_X&h5q173sa_zDpsevgWQLxnBBn5HKq0mB?_%% z38ohn$1dxB+||5-sdq^>8F&O*h;RC>v^&wuzl@8_jX9mqb_k7zq*s1nM$HkER|+&C z=kr#V@?%VwB>%w%JY$i$gAlC_w*Jj}fn0UnTzVUbQyfF5p~+576++xG_M9^_K1Wt6 zIitFYf@#V(FPf7`)DRF&95>61E^5og4El{Ih1o;J%J4tIL1P)0OtZ7`eLZrYiJ8ch~y&}0XKfIHCFoo*vc#|}@;OQ-=9KUBAgFA7)Y z&g{blP){{vQKlB}_sbC63$Ige@^_&HB5fOAZD=UKPw3vR{Ag13W|r2jE_$gx&k?QX zLqd@~XG9#EHwF6=(|g@S@c`7Wn@c(#O$o_D`=JpWBY_$8kNTwzOZ)~(rL;is={Ohq zWdqX!vB5Ve`(57NjXr#Se}^zi+qG(hl4L}4(`1wFgOi2V;5LiknXRnZ%3O8p7k+A# zLhKELw|MA0z|1PmmPiM~1V^|;mrDQsP|3jh2ReFKH>qBFt zr~fZT`geV3jI`exX@7tA-<{LH>qBFts3_f7{lCLV|E>>>kq%lT9qiBlyL0+?eQ1pI z{Qt#B4?UFVA)VZl{iBeq5Cr)GwY!b53D=T=kbb(5E@{gVt?B~wQ~FqHUM zY;F>+a`qcIa{@OvxYiYKSApov2|%}cwY{Fhc_K41ZB9Bkkt+n|cJ?(C>NYYbQ;Khi zJ1^(!1zoo$%Ztf&o>`l!S%ar$g;d3(J7u>huGNRLM+TO943N3dW0WoGN4o@g0R`|F zeG2s%HA~P*y77y4m6GUp^V+6T^a3qnE@3U6Anj5u;+GK7TYk}&Uj(LZnlrcYN~07v zWBPPYr|uVmg3sG6P6pG{FJHvJN&2{A;uaDlD&+c#9YOlM^1|WQ%Z||H&Ri#*J$+W( z^&|;G!HJhREl#06dT#R%ZabfTU90!2Dn$X)Tg&K2IfnmK)ub}qhfNL-syww ze}3A%ef=L8Ao^rY8c!oU{>j!!`Hb?N9Boq^re2yLtsAuvT_TsWh=*me2Z4pIMx!ev zCXi=F!a-%DW{j(8dY175xKOKGT&s^`phzi#y1O|%Pad8&$tt<1!e%v64O2F%?LtTC zFzsL@a5>$GbJj1tjI(4RtgA&UZny#TnF>jdD}1l(FMY3z0=0!J_Cs@;G|yl8eR*k- z9V=rs8#GYiP@@8sf05eVIOYLgai#m>qybSM(T1$kWk3ArxKY`UO9g`RZ-hLB;TBZE z)>G~~?9)Oc#rO|yzayINH8MkQmNKf?fi+AM8~b%M8XwxP0;zMdW#N6v8CGwWWw1Ji zPf9VqeFo{$8CwnqPu}vb-KCg^FIqq{9dI)F0fhvZKpK)h$zh9#zyot>Cme%?Jv||ZNTj#cSDZ=0JWeXeO60texpnv!_orJ&vzfBZ`;*$B|F* z$0bm`gZ~_E<|<)cptuTDjZ_AzZpBzxnAas7sPz+>sC@ zpP(*E&3hE1lS>w7vcfR~cT%u(4x^0vF*9%?{iRj7ru>mdW^s)SLQfCc05VwXL0JSQ zI)u`!#!Wqb4O4fbN-#YAGpEhO@EE&j3ag#bH~9!(!U^eH@;zR8>OBFFc#qr2J><~O zl&eL$Z)-sG8Z?gO5k?u)Rw1!`iVa#E4tFhaX&wXB*)@f#douV%KG|Npt8}_{XG|Uk z2Db4pl60-VBcJ|+GLo&NXjRsH7KH6em0QzhRnb zxVK8qh3oRGk8kKae9IMmbNhpi67-&+1;{KDKZFWP4E;)-mAyYX=*k^1C+%92h~`u{Imdh!;<{v#WsyYP^&58e5& zhog(#o^C|+jlu|lQnB=?!`aCrWMJNy=CDyj*d!#khC>8d&@A&ri*~4UmQtr+-}ixO zY;#jvqClqzrSP@-^5_Tq574bdstk}31gzC)yX`cAB#;JP;#JAw_F@@#i4$b*n;?Jz zx)SY7K}fcw6G|aj3|2rfGPvT^;w+XfM4>j&*ikTKDW6XnvdN)clt2wQRBl+F?S=cm zGK50Ts}yAy2nIp6&^&?0#2D>AL{P~W$ju=V=&-iWh)HWBg-&irONK5;O}R3LEG{xM z>cjNS!>(C)fTd&HrGHJfui)_gIx1kC9Dz*>;SA&$2H2-5h)F;S3#Y{*p1X=Y_m>wZ(n76tGF(Q-|mrHzs@0>-}Rns*iDG;6uR zBiGl|A|Kq9%rErOc9OCE>0wj3r&bV+*@=l1w^Xqu3A{mViVpc(jpz3f_=QHGV@_l; zk{{vb#)htF;9sWiUVZw>2#Wh`IR%#l-xR1ke^dHuBl=ePCIlDyxT6x^l*gOjoaV9d zutDs_N+dgeKz5*vXgQZKTeax3h&+K4%DRcZA4*7`A7A`NC_1UZX>qV>EfzQXfgZ)7 z!HCO%2$$Azd~iFQ-NUb-!%c#Bx|alZo-qD)AvL%Ewoi2tm0hJ7IpMD)rq<26!*;)< zu}TVrEP#aLqodakd#`){@DDvmrwOkk2mf^|34ar+`Q)^u&&uu+d~+ds9qOe=1j1!j z4TfQlFGjn@{heLXdTz$^K5ZjA%zcs&%`bo-UxIayc3;-py33uLa2N_i78UEkbP469 zrW4HEQkrjg&N1*3ywMG^!Ay=`y?OKTYj8hU>|Z~;ee)2;@uN?7A3wjo>+PzZK%MHr zzr5)ols3OY|A_l=cPM)}Wtj0lE+yffhLpr(q{Q$n#hj+d1?~n=6Xa?(=9;LJpH={M z(wRbdrUx-_SU{zIQiFlR~8KS6T$Vb@Y@; z@aWuYigGy97)5Hg>mIoCA@TgXA3tnw-`%1h+K2c1#rO=2HJj&`L>`D6R3Yv0S=19` zsbbZHCX0gKdXm(^kYgBN2!b{qnS!`%Q9qyyonscrswk$NH5TiH%C84y~@#Z^Tg`W!DVADW z#8NFWBm3uz<6dfnG-a)`CG?a?(g}xdq>O>2a4gbMyD5VZ_-Bx3CJneIX$K#TWC<1o zT>*^xnEJ!~VP&rMRGrGi>4An!!I3c-Wx0)um-)PXM)`z9Ki8t<3bWEMB8&gEl)Au2Aiksx-l-V01fW-hnMXU;Dw3 zbNFDpn%(lX(9#|L=mYmF%h!2(c@@w>QxR&%G-YXQY=7+5#&Ii6K!>WA^Df){=5C8z z=|GDO55>AIOpN_P&6f8$;#`bUnSBLV07b?s>u`+)nozi?NIn2kAi)%ek zJ3VjHO+SeNxsh$Q{Ud0kr`;7-dJvWFmb~i%r35CM*%}HjSTr!@y??Ue0_=hy8HJu+ z^!~92ZQDb_8aclJfoNZ{VB8n?ar9AXqr?SnDA%oy3}~U!cwo_E)mr|?!rG+p@{_f} znc>rav;H<}yjdsMprEM|$NxC<`$dz@1dpz#N%okqxDwnql8DC&H6yWB=EthFs5t@m zmi5qs&3TNOF;n!R`_riIC<=>G-0%{$oTa&H^5s}Cb)v2fPV%Tm&aGOMp z0v?5h!J#29L1h8f5CvzTc;tkVbxYVE!V!JJ8247<8_p5khjebaEz?nKpI-JWvtHTj z^Bp+6ao!&o5i^Apop+g(3U$YqL*(Qc_YSnD(Rv&v6sF8&!!1L+_Q*}_@lB0hI`G;+ zk@yI4bd77&ve>Z>0^p-*O@UilbiZ9&wg;Ecy< z2BMyPKiSWaBC*patbjidhi|#Wn6jgV;aTIW1nV`#f{{nX&CQWpyauT^5`wop4ZN+? zMVgM0qIdVUjWuD&HHGKx5*0-70+==E@)5RS!#&&4Hn1WO6|+3Kstz30AhP6lF;oet zu>-TgiCv*RgI1EI22eK;%^_7LB^mr{I>3Trw!pf{Pd8b|Fe95V0ECR4DeaJnwIjHW zOEr`)(}uGc8f2bpZj%&WLzrG@Le3U|QQvj@&R=Vn`%;7@DJ34e>_qlU%<^O zbsV~vRW~$B>2yO!_ud=sj@|c$&tx|=a`tsY5zYFyzscqnpI3g-mG~Dhp_PbPP_iaS zOo)f};;@O=>@&@%qyJE);tY57(%efo2p)?fzM&rq{#X%34qe?$5l{;61mMi&XmS)k zXy7g`@D~evuu8Q&RLMEYis4K;6~;An#!`i zWDY1dW*1OM0^8~|SlS#>)c&WtJ@P;xKb~EJWzePF2lRM-(Z3S63~Hzg9Wx?G#{I(1 z*vwK;fwUGr$j26zSd-4jSd`@sekVnxNx#A|Aq@IVlp{kyRM|p#C6o0xJp>Kw)D+nW zEt#L|g@Kfz=tA6>zFFd}5TaLbcEplXu%&5y)SAXKGgeZ{r_5CHReGeW%G|p$t~67y z(Tq*VOKY`@rOM_EQPj%-y^De2qQq_c?oY zsFxlAUhTx?96HT~EM|h(@t3nvmU^TyM(!<|b%Vt}MmoO-IkFeSHcAGT;&GFdwSijy zu*yQMJs2P0nZm5i$OEOMZG2)Iu8-qMGl$R6cEjgqQ76ni&?numJ3)MD+(n~P%9ztA zzDM?ByHWu@U_>uI;f47Mm_9i65RmTTVF%L(VY(lUXE?rizywTREi}=Ke82yka01lYa%885QyiN_b#SvS^XYX!40G+ z_C~(s?V(S^rmv#p>LloAj+EV^{+|2$rkP8J3m<+?B~Ja6>ZC;%-7H%K&5}Sh zWPD01P!pybw9?_M*SQTcP&bHs7Jl8mKpdnW1Nz@QJPL6PHqr^?#C*A#1pn$eraI%> z6U<%|R0e7U)H$J}6J$OX*hc6WdO%nQP0>^UlT#6yf+@p)E~iWnF9+f@tK`)&qwP+4 zio6K7vy5^-@mITQRax?=S~Wa~Yn#Cjq-yJ-BX=l}+E zezErQ4t}9sL{w;Qj>y5Q7jhp{0ZvNuWk34x{)e|ejz0YS^JjQG!!Kj<>+Soys9)Re z6JX4WR2gLS+NS;{2wzBbmIlVcmH9%0q=ih@Uc@LO0QP1&sRic&upd{CnTKzTbp!KG zC5P=V7eag0m7W~a7Vb?~%k?HPKTV;^U7)Ow=5_}&V^qY5znnxkL}F^7hPA}PeT2uD zQm|;y`^n2#RZ8$OO;XSR>WyT?wm3_OYUTrqqf|oFRbT6rq%iR&=|g4bJaovetC^Z_T8>)@W1ZrXy!-j+L5ZL?$<`buYKO4j;0A!~OVr`w|59 zJGu4eX0!-Y=NPuQSu1s7k}~*T;M>MwK8H#P3zrVJQjW<=O^zD{>L_5?`Ad~5tfb!t z#UKsSVRNs>E)Lp~b_>K|%lzt)wo$7>#;6j2lI5mXf`2Z!DR3k}cX@Id@4^S1W!TEGMh`F*f#1#u% zCJHqMg}=;MZCp3%gR*rPHijX%yl^~FVoeGU5;&c1V3{aFZ&y>@p>ngFN$=kZk zNGCt6s590S%UWO!*J|e$-VT$^* zPDHVMMW_QpEF6{};s(glA3_huK@!SwT%0a7Q`W#4>?@LOYDmRVS~? zQb*Qc2*>Ev<#aY@5KOon8~{i)%}UnWmrDfb)v@H%O_wlzoNLAy`(H=-Q~>MRHilxY z2Tc_+@JiAz8_;(R_W-wJe6!aUwNC=tpr1?f=%)`($#csmM*=F<9p4uF%~zl2Cmxl{ zP$f>%$XHbt1=EC}C8hV1AA~6YLc8AZbVA<_M<=^Kc@|_xC(d4hg^J-eAUGR0bYh`9 z8=PvY3PVmgXlrNSb=n_Bb%Vkhu)P+C-c3Y!IZF)wiH5d|!n=PsAtVs7-9zwNW^ zl4MemoZ4St+L}%mb=54_mEq;v>gb6fq=+*kS-RmG)^{Rqkp3h*3z6s{HQ@NgMZ%)m5^53 z8Dj|CSL6`b40FhCj@^V*L6BsS-`M3M8Rim5V~-uG(vR!u?0HTqmYeb+Gc*nnrKb0q z!UVG^l;?*NhKT5*bO2^qYc!l54dILcGd=%6b?dFi@-8_$zWV>%ie7`CP_*xd>Ai+Q zS3g>H-i11~K<<-BZqvMNd-L6)+u-dN4i)uXP>y0Cowo@T4h8jH5SM0)@F?g2b$^)d z3a^6tt`k1+apy41!R;`pdxW~HdxU4yigbUnK-~|t73+TDx!l@2hiJETKk|{qVssD1 zf%o3oJsR_C=w1T%dFUJ}VCLLm&NKA_Jwed!vU{Wgb&nHf2M~JXDeHWpL$3}%kz`W`wS>NK4mO!t^9%0{E>?xb{c)%tBWPBGY*nwg)tpoghR} zOuBDE6wU#N2GPCr+KAmtAyD_wvDF|ubstQn*Xw?wW!~%jEP|AbvJ(ndh5MnyS@#>C z?4RN2c0Q8^u0yv0ru(4$qF*Yg*wctigEFe4O_YKj=`-j>hTyM;lNXi&n67JeTh;~iisNoL5o4qn_L_GlS2weRMlG?36yV&ZS0I zI&R}*+B(GenXt+>m#4+q2$Y6mem=?_0sC$g?d?O;?7m=0_1(c~C72!;UmSkgNE$Kw zJ_#CCtF1WQlOaa$ULcVKiWQ}*+0me0Sz+Ybiin6x;&;`f)LNJXYFokOe&~+U(FMPP zKq90Mx|AB+e%d>UWN;>k1#YGzyvc5pXI~gZ0URQuSZD|^>6ThWRb>%&9@(kRp`+Vb zB8Z-i#q|I=H)BR~R-_wrI=8TI3_Mo?26L-{#}fW(gr zGj^1+G1&*J`%LPrcC)R9_~hW7O=s)s5o5E{hNqsGQZn7PpF)~|cu|>9(mrVQ(>4*0 z?o;3f7224_H}Df>Qc=hkJI2!>vV)%kBfz^4?|?;&MI_^ z=Tlk&?!Mpu{Nc^5wm;CYQ)YJb5esgmC7$G!vYHhD}y7jmZg*btNIF5iRXjHnmuQE%@ z&*!~tLZI-G@^?f!GJ(Rax~{enQ4%sHe-Gk#y=IxP(oZS2P^*((69!*~nMXG70X!FR zrB@W_e#gw@jccDvWBZcUvuCOpu1y0{p|8r}L^JGx=bd_u1k<=Z4L~Rjvl+$g{@J>c z@%GTy0uE5c0WDj7Qt3Dl2}0OZoyQ8Op~zxT2PPjuSBKg78lKYEW0lcRClH~<5X%!Z zynl|gYU=s$>)w%fe%Slhe`Sm+gID7&1Uo+at-BaTiS$wbSN9zw@G@K0fl(2d0h?)< z+M_}96OBcdeoTYWT{|XrvcvKjMg}u|vIh$TAvY-~JuOh6=vC|=t+z>m>87d2*J&98 zWo|d?(J)y|oJPc6Z*$FrN*-8RyMzmRG1Mv zVlxwQr@+r9I;vd;A~w_s))t~3QtU^Dhjf{T=Il-9Xf8jzXCX}vxxmBpnesB5(ZSA;N`WaBmiqSN{)l42TucP@ z1Q6~aZ#GXOM^ZxVQIvu#1bBr+IEm>A)j|`jn_PMB1q99!3{|bP3%Co zlA)gTa+oCAvQdMUssM9L*Z*F5A*lG5GXLZWm(z<{w1Cy?RY^AKE3&#GhUakIV-!es z@Jc!&P8SB>URbs#3=|>#HZu)R&t$tS^#-jzdY#U!)i*&%e08O-=FY0}AN8nP(0?Rp zvC547*U}yJDfp7BkLc^D>j=>eh0(Md921K3! zfBtiiu5vW<=x*CaUib^unu-TB^33=Dh1t#u+q6IbVXytn0k-DvdFFs6mhzArZ#-c- zWZI>o%seyw>YLcE;p2+BP_Qmv)>zNl2TttXHUCcWIy+PXWO6v=Wm&?lJ}fB)5&@dociM!P|9N^zh_n+g{pIB$iN1y>8>G(slJ zNXcZ32ZDobCn z(Iz@C5oXpP0Iu7Fo6Q3XKK9j>_DO-eYtit-$J_DkUq1hc8j(`=6ThHZvJE)YLx(!$ z5odMRdH8SSrVZLG{MoB&=dbcN==5fwo*N{{wBS(N#UwTak_^{vWdG%I36)Zl_o`ue z^e~wqjUoOyEw~D{(D?-An;rR((0RtFV7HuYXS)8kpI$-H@%+sjWRx;Kgk~M&VZcNf zBa*MRCe%w#ua}lKalU*CpV6WA(UWVNEzd7D@FO@Nv#*8p^mDF#i7P!+!hk1J+`=8d zPOqpIdpQ$eJK9G2kMc@z?ZcFs&Ur1r?t8Y55I>#wPnUXti8LhA4dm!kmmNqWn5pm} zjV9e2S)eS*KSi$)&W?;W%f%voGC~e7ExXYc=Z3-idxaaseZ8Rb#`}NA^r@ zX@lrqdQ47I!F9)Ouls0=x_XLf`M_X@#UN!=$jIQd&3TqUJ*+%wO-fM1)V;tP-CARF ze=&YAba^I*bvhwok5F8c-;$Y1xna|SA}{HwxyCk{=V;FX`J=UGO&8UmoC8y%X)$5B zf={HOW7-tkB;>p-n~O{;nqIn+dA5X8t%~~-HG!HGe<5T`R;)miu?Z4&m}C?#I(^2d z`wF|Uu?5z%?3k>dkBx(|K!pfZG2Y1e3}T6PZ{X=eC#<$2cgf!Po#k4=Xm+| z16?$b*nnjuT%zPb%ey-1ZtatZ2Q>N=`WDdWz)@F~a7q%H;Zr z(64KtkeFO223+M0U9XL(C zD|*@7(DBjB8&Y>P5Sgl4^o8Jo7(`B1sHl;`R;8=(V{d$E5p0w;e0aE@nhp&j+7mKh zq&b+$=Q^oGuvNcpbl!Zq zzxRLj{`%9~cek?P`q>-EQ?H>S_SLi)`DSpDzAr%fKCKk_4P~lka4niGwT;M$BG4=j z4XTfNl{-2Vb0&NT@nVlmGUL_FlF5^iInj;tniF&Z=QVjx#%ulg-Mi~w`0x0`U*B6; zr1NcDOyI(M5~mJ8SfO+NH`HcfXV`nyqPqYB4X4(1hqMsm8EeoCTQQn z4LUiA&&LD}$K;5!l_xc+r)CzmYf{I;t;8@07HTu}da(MfTjUgg_&xV2H}4qQu{E#M zoWKvWRGc{57P`vPV<92-(RPjRj2wnqOG-Nd4}~d=Vy&2p?moUtp6ZMOXOJ+W+(mi7 zQtN}~bJ{S5mpy9F-CkF~ebGp=2B*O^((J9E!TwshJ!-bI{MFZ0ouCaQl5 zpv{c$8edMjj%jD0ARSz?AE)i{_Q&_PZ+fqPdi4?TIh?+*Z^On{yrluLSA=??b%gc3 z1yqx&s?>NqR2VYHO)zps`fQLWM%8{%>4k3Izuk}B{3DHVOcv+3)STk^dj&RoHr4B2 z-k|zZPtB~GYWzG930S;|JQx7ke@AV~@8~d$d@+CdlKiVJf@2w)9z5tz&D~ z(8KCm@tmecwI-W4v-A&K#}HQ_g4H!M~A!_TwCYi0a8I1 z{upaiDw-yq&0PiC@H7r{xC;IrpSIkiHU#{5Xo;ackYnlSqz8l&jJZ$|m_pZw{plsL zK1&U3>0$e@R@*|GL(+-OPwgobp!AjUp?tA=YJNxQO1t8d;hldven8$WQoNp6%nnkP zY1lPL&owK@e1$E#yx8JzCCRj*x+zFd6p?4q_^a9YMY60k0UBbV>)0TTPI-A+joNWF zOWvh7(LzGb8h@X?*bblPS2ZE|U4?4werr*K*C+J_Bfq~GT+kiGSS{)tJvxiZ$lZ%p z;pZk)Q$?O~v;h%E?ucJJcf{zIcXy*#@8138mDi$V2PK*4>>|;bu~y_sTDw?yGhlk9 z4oXt(aGI|o-AthgIn+y!AWHY@9McLJR{(YG+U_TVdb?x)`F8g@jP8Kfr|Lk++;c^> z+U;BiiH|ESF+V^@bbC|h=Yzvxi{*6!R3yVN9fA9^Fx6aStO_&lBhrLN}8L1nxm{Y9ip1dub|eeUvEE- zKfe9-w#C^eh^>g}6`Hy$EmnZ^oqWaBf`yc?P}*qv_Wj#WKk3;@EKoF3U<4B6vK8Vj zFR2so#7#CK6qwHMB>>*RXWEP3P4N@)ivz7)|w&Y%>2AK*p8|hLv8`o?sM5yJfJr4bO!Rl%arrT#=EX?`cb!at6lWK$VR0~4c&|8_*6jo?+D6sq);v1<@T11W&p>TyB zz+;G3?Jcxb*n8%z0SE14SZ5dezx?Oj?duPpk=_Td?IES!1L+k^Dd2otVbir)CQZ1; zE;ep;Ckg@X$2Ux{9FD9>J^<8LWk)fjRNxEYDJJygW{GC(sfS)C8?f_Knw$jFlVcN7 z=vKTPe#C%6pXd9u>XL_L9L#!yym6aV#lRe&S^Cx8-N(0o`Fw{W4M#`6fHK~``MUS&o!FYA{zK>n_&rQ83^M~vXUPCs zd`bz`S7;Em-$QprDQ!n_J4{5wlA&}$_0>Cx%m}I#SitoTJ5^ZDNu)sIp5$OVv|rU8 zKhQ@{l?5Ky;Ccr>Lz9|3xz}Yn!YZ*DH(v$Squh%Q8psV$i4>7UB&GYzfiAk8JBu!2 zpnVMSD6ceY!J;ufBsq$shR~>)#ps@ndQrslDnZJT{xy>mO4A@wc?9+fVA(m5usbY7 z2m350kDf-OD#N`H=+-UB`L9!6LgO@i#! zRh2QCwX(*cn_E`JuAiibIpR>DA&-AeARPl)ni|&)Ig)U`&r~>lcPxx6y*)4~xnAZn z$o7>QqP-*BV3p@k$cKo+FZ3vG+RgZ?ZwZD>UsPPDKGPt1O%Vc??2joeD(g*54RsbNzFnq zt&{V~@)D{$fRRCWJDqH{Ml(Erk*gy;fl-)|O^aYjiapQIadQVC zv;f>Y^rOA%s#r`jns&0VVDULBPuOJRwzpU=Ud)12h0Dne^5pMv@V8W@eRcY${-2J& z(!62PLPL;KU4#XX6I*p?Y#FjQe@y*}JFxITJUo?Tq;)zAPFn39yfm2?$PzjgvHQGD zbH!~(?q#?^&J=9`N@Zm0U9#D}d-dz>etY}BJ|pGf+gI=Q+LJ%Oz2j~bqHA`ndek|G z%!?b`n|W~~)-lQWBp|fgr#jY2#&1D1@IZLsD!*GH5;)ycwW@!ID1~n?U6D*X3=71` z-~}rT&;-#PP%}Lle0ea+4m%T8xkS`&L>jVo2&WM5+|NJ!b^YP5w;zoV9IbCZzWwE= zuV4TCM$`>|dk_EZ-wbcSfzj_;jIMRFSzS6G@et03jo$7Z)7{;VO;NF+s_(2*Q~-+| z>t%;9TPSv*yhW}z^eHXipjuWk+e$JVfAPZfKX?Kf^YZmvey&t}WGcqY8rHd!w9!jo zMhsSKCj#-}N~n;ao!L8=M2V0+BE`x=Z&hfN8V3J$4ezb}K&*GQ#dfs?{#hRrQC0oFPd!J~BLy zM1VLRY7EFSfHwmk=g6CCyt;$008s;P*Qs^h@%M5kyr;pPKvaWgOkRYx4xke*QpxfO z`~t2MJn%D>!A3~=3ZbZRp`MCgpI^A&^q{IOd83cCrQ<-b3bvAWZ9#62$G+43JBNscOymBw6=l zekxX2Gf_abyzz=k=t3s+>nPnyzcr~A3M<4}zp0l+sT~{~mas*|Fea=RzIzwmBaDp2 z;loz2+LG-BZ-UH=x8`6^?qy(4GXEMU4LZb&L8n86^WOk!3TSslcWFL3kQ7Q3}F7R@rQ7hGv{9=z#F2F{n1ySKfStxH1a==zwZ5yKK>tk z1tR;^zkU3QZXmdoH213+uJq`ydtVtuPwDA7=!ArM9xevrf|z)iWtly&KDZ)76}(#5 z%Mpmr{`mz{>eV;K(w9ASYw{6+IuwRrIEi?cU$7>rDQ`HVmV?gimSFXm+`CE9DwDLK z!!^p9^@8M)#YB7MMSgv_u^KImE5S{&a^B*4nYoK6)SO%UH-9EtoPKZKB;J=zp(V$x zKarO?SmvO1$bH<@n^hovZGm|}0_(Z2VY$1_S7FYMMM{CusHwc#ZQR*YZR5e(v7aZs)2d%ky_1H!f2i5$;lrk4QJAkb1Is(nIR9s2C79o3F2hn zY0A0E0X|h>K8_(m$2@}230CT$_Y2(5fN}_8foR-GO ztpQIzd8%~*^f6>H=95vO$kLVOA2hPcM3T~{GQhV9Ea=aJKmF;SWm5V0>7R3M7jfn^ zw0!*M?Z?;u{ORuJlfe(CU%u>rf&}%$yH}rn`qOKhU*ja*i^VTAAX0C0u*R1@ADo?M z_9T4$&?u(QV@9v8%Lr2VB4F=W_6>4}oU-p$Q@G3HU)CA+N#$H?XM5PQttj2#IRc2W z@C?KIgD{{tV#;ZNycK)kOYg@t7X9-?|45u@M`e|cW#0RBvxW%!5s;L{6)_%4j!DhN za7@P5v?6Ym2Gex238o!pBmxQ~ODv9PaFUF4tyd?dFAXZj?X!!_E1W%0l&c~3zidm7 z-LV8bDpMD2R+lFKmidg(h?|1@5}N;Gl0I)SQJ*LF;wfq%K(;ilkD-J7&)pC*T;FSo zF(lXDFE_{s+s@aSK!KkwhT4RGvC-mBBch4H5@nB79dh7 z=nr+$_ej=Cbu{R*9zbF&C6t(>}{M-5LK_{uo^-4-FRRVYRi7H9h(!(Zr?LW zN6t$~6|=kEEGxC5R1g(ZkKl7J;QxS}>8Y-)ro|mEN0AJB7GEC@j)F7+Iuy zS(B|n4pEd0s{_ZW!tv?&ggiQk(coBz{^>999CQjURp}e zOy%NsQ*#3a_C~_*+2wLF-d}?joeYk?NbUCN?&IgzcfFmr_Wto90EplH)k&eh#q~l` z90ejwu|vbBUU$l(DorO1(jgW7=7s|-I3R6qk(Pkhn|q8bosZc6u{)WitxbsfDjy;i zXt;Zhj~d(C;p4Aa@EGpKTPu(rl0L)Ltu8gzgFVoxdVq(|Bkf@l1#**CCq2dMLhfGR z2W%Ia!O;3nCEem*U*UYMr(ioeA_uL8L*a0KJvq|9T*<+8?_VLu*)`&-8F1}Dv_qAh zoyh9ZajM%@;}PM@{pfluZRD&Uz**!pHCi{;Y{(*XMcrXpu1G54vM92cMGoAVe%a($ z87-ca{kz*&pIBCY|K|3Gw{$LU=A=9ahVUaNbGwo>IP&sf)zYylA9n08lkH2JVy43} zv`mMiMOpzT!|;M0jDR6CZ%|;tCJ2W=n0L=Ry#>mG$Nyxzn#0x&8wr=X5(=FoZ4*_(S zkc7*Qb~;GY$jnDPA_z!AD~aB@z6gZ7#%=aE^OZ5G?n=Fy@OIW~kwQR3JmR+?Ms*d1 z^ms2p(}r`05a=j!0rQf$bEUibw6~p^(cqzYfo%u3WDtRTtV0oN+FqPz)`GyHoUO7V z?C$4ZKHmNa4H)u`9$$ak!$2w0dc_FaOkYc`i=Aa;{@Y%vQ$53o>qTjst!bMnw=BXY+>?F4 z&17cjGCe~7tPF02nv@HN(LhRuW3yjSW2S1~Klc=8Bi;QD+-5KlmDx@ib;FWpYsmSEKzuq5Nn zbg{EzOTkMFiSk7aj9;_gS^;uAcK2*CdWe&bYj+A)E)G|5N9!~(>ao?&+F)bHn_SAd=X=BS!~Jo zi>V?)845q}D8M*B1a{%I?zU>SmB$A-Co&}!>_M~Ij2rV> z#b&JC0)KJ-V0wV}hl~SprR^*3U_N>Zh3M#MlSVdxnk$}^UGk!Gj#5TBj`ak5H_vb3 zk)q~^U3U8}^0^j?qIIRwR7{msoq`6UvsL{a8Q|am&9XEN>6raTQpoWm!#q?>HXERR zq0ef95=Yk7OBN?Os8FMmCMNT=&>GSSgvv~1^c6GPY?K~0A&#V#@%#l9>X7*9*>P&S zTK|5-8o75vzsWy19Ew^IYk~DR(@g>gLV1dY z-chm}ZV<-VEymDas)7Yw2P=1xn0#I6D;ZlhU2_{i;3b>H7eO=-p0~O=+jdILCRD@K zNz5WBl=mga*oNvR9z>{vE?#}Qr0YvuBS zIp@0&@B;09yz{AzJaRF`PBpFv*FXBFZj^eH&SZhS6fQ;IuP zEV<+#-XZO}$hw>BRiW2cSlSPn1d zu(w7TL;{!&50PUvTrm+)FffG}qC}bLKQIrPOM>ZAPvxDA zH!vY2du|h(XhzH?+{}$tf!b@?_h{x=TdNdqdUveJXtZ{um6#_(#zj65oL?3a;jszF zCj89w@w80J29%Y`3*udksIm^IzTHp#X0m{uJWlZc?RmE%K=Bm$`E!jC@{uVs^$4Y& zQ5D6grNhR5;I$Qj@8DZCLv}=MwH)ea5|-;0{X#ctEldy4$zldb%M@{ruvC%-rjSM) z_i2kr|669pAeyT#|Gn3^2iyN^ltcI$dGYv{z9h{a1BbE)mN*B!%q{3e_=wxiuk&{p zs`Ib(3qg$;njD~PBp?+`vTQhPVNQWn_0qb@pS zwDCTBRrhCb+1@@Ih%MUsg&uW4s_mhoYglY7rveQ9yUl72XE@+6tu(?twUANwKnP$O zS3XcOe=_N6WK;N6&}#rT-5@M`;cAWFQjXRQAX@o$_2MN8O8vVd5<%5wNZ+5kk5@4n zHmKLXG`pMrFox0SPGpI*a8{DQ0&z7#hP76-eSz)YotaWNUu!O$ai)qD85wpD#C1Xe^hcCP>8AU%NMeKnLwg>*bg2*5CUGTjCss}{JMVOsz#ip4 zg}`dcAh~U#ydsi4Aze^SeY<+-iOB$jJqUiw(G+zeg1GB7(sIf!c#*I3@I6{J3?=DO zJ+c_WaqEonhn)_yXSq$+FYu^%mx>}U~P*pnU=u}4XA_q>{oM~o>0R@~>h zOvz87vyIIz)>|*MTO!bk2stG-GxPBsP=#o!i4T#ER1hW^$jw}gqzD@ql^Hy8@H0mGGsvn! zrnsW6&<#26OqwJ?SL^F@5==v|FN^~Y=E>%a%vs^=X>2OcaCy9sBPp|G<2_}vUb~yD zghUUfe}Ik#|8BqMOp^!o(400rkH>1HHYuov8lc=c&ZLKfrpvst#+x@E=O~^cmU}#; zt+Q*(ku^+jx6@(zp3B=iregr%c5Ld+DB=sO4le-g@kr3q(jU|SEiPtfkl8JAgd0Za zgxBdqZh!~|WnX~XyJi!{QD{;qeR~F(=H^P>^i{Se-Gi^w>;)wnC(UX#gNN@dJB^*B zguFE-yT5Po{$qPZCsxIQ(fhrwOmcf2Um)-oz7}|l>%)pY=BY>oOCm;KyH53U25MZv zSCvUv`cE5KDQIIA>V4xM6t68;tm^r>p|0vwanm+Dqp9)fW-vYvDYl zY-yZz@*FNpE`BlPx!vOUCn!L=Oy>t46%g9!Q4!dI5=rRvksS&uiCm)zrSr^{tl2?h zCl;jt*%{>E^iyxjLLARIB%v-D9affFMz;nj=b)hlcPnnp9T((rT8OqveegOZJJh=8fM=`*)63mysE?__%{059M(OXxd27y^|U+}QZ1d-f@Y<%ped@> zS+K>5zMkNxlpom%m1qp52(BkEiaA5+2{w7UAkTPV0fpyUD#Rhh-p_r1~xEHgO~z-Earz^ zA|NcDU!w)o{P3Y*JW+>Z-79|U(=;vaWq@&<-D_g;4(Xv&Q&U8;wz$%RH57{rG)lSx`WXBy7%_|J2>R{=*(7So0$w*`4!IXBxVjoL(0G_ z#e^Z{tvlKA#kf@|_3i0M*2Xh2|S-*=Qvf(DRHHKu4ehNG%>!ZGT2 z81l~$Em&eXylju^fZB(VR}2ehTH&_^gP$lI(=pO^2*F7B#}- z?u&6D!vPOuyRYU>YShKVM4hHxRp3uhfp=w`bwt!om zcAA=*37#OJT1;@pE2vKNPsI2>iXdPAi)5cb0I=V6ngoyCBq&x;G-{*rs8bjQJKAjN zfLCYS)i^LX#>(lV!MdzOyxW9pxFtj8DUa|JXWU$2VuGRzj2)TcYROUP$771X+D=xZ zrrk*=FhClGa6w_j>A=MmR5y`GS_RziK*In;@C>0+RW!K}K?3Pb(kM)}*Hm6gq_%wS zt`-5?c9CLViDu~Ry2IAH+--5;7K~;O7{yMO8i0RNi3ime%h%>j=qT`>e#Eg)I-f-pv^iI z-^pXw?jR`#j^+pqS!}FIM!M3Ib?jKYjz5^+oRV1s834kP?Nt{IT;J;Y)=m*L!K`~D zYr=E5hcHVw$UWfj*o8i2B5OUjIR!XWV}Sewoh>89w&bNcFu7Yml57>ckf)YOmw9=d ztoBRs%hz3XO29LL0{ASrnAC>b+R^tLQsjvQFL3MCSqLdIL3K|{Y$*0;B{bABlyhJv zYDkFE{KvE`M6tjF$gA!v}*OHg5kYYoT9q;Yi_U+x(8P%nK8 zeKGO;5h{3L85&5!1@K-L61&iVICi6JM9Evzl&q^Y+<}t9m*i&$0Xfs1`N^ zz8l;((3+PN?DjKIF~I_a?=Xi5i?Zs~mwFv}Hx?Hs{Rn55LiJ><9bG5J3(ya-vMB8W zds?yG3IyUOs{n?5ZL%En+|-7jdN)})a~MB-Ra@VoWHqcPt9>sA;j+7e-#%v(`v1 zzP-KMe3`zTeo!1DT9A({wV86uu@dYGRc2}-r2aj!?J-ZMT ztSB^_nsmB<&4oRuW+0;YFN&9v;?gkNaD1s^>^l94$Z3q@B8tVeQ% znL-r{I@>(EdiDOzyW5XiWhGY4ZH^-@cW|V=bVMU{VM;jyVlFF+gv}RD+JT6|BQ8)o zLPm>opJ~vQ@{bgHD{G+C2E_vPcv$D%a6z*p7!YWy@Ege5TE-J3Q#ADx0(r2(f4gTw z-yX4JWe`gBMGU#>&|HfCV-Y)F7$^)$3ysaXdG+>g`r+gJ)u+4FFSj2d&3||=!Im`P zJ8WGplW>Nk48t@Tmfz)?=a%bBUo; z4N)TzB?4FrAX~=S#Q}(vL0RhZ9khs}KxX4rtp}Ss755foxAx;JaQ92{mo~Rw*QYbx zsL><0UYy!a0v9QCC>?W^pPmKFe23w5ct4UnSKU6^Q-8ox}bMpK;z6Kdk?rQ))0 zuZm8$RW(JuX$LmXG-`SwCk8kgtN-i=*;@7SE-r$Oqe`gRpi|AzU}_Pato3k}V9HGa zbkBAlw_oU~BAf`J%yk6cei$r1ynlQ5!LTb1mvVYWnZXQBM{KZPjZRWt4)@!Q^XEVv zFSfx27FZG9mF0zoBH~8=b`6cjpi-kXK!$9x+@u&zZyqrgI+>sYmZ0pzxe+Gm$mf-LoaO&x6 z$4s(NL##F^5E@R~NP66sZrj@mb6APDvA2xTq}F4HwJjqnYKT6}NjPMC3Iz@X| ztOx%WmzumxIUzW}DX+`+Wnx-EGhJ@u9U_@rVpxj9(DzKdPT7$5h&u}mj2nvNWGwJA zsJA4TE_`5578WNQsEo;w5|;3Cj+)7}n7DkjL#*f$2LI9eslk}(+K{!pL=U+{K#N!4G4>`IvGfwB~=6~UAcj{ zndi9;*P)~Ty=!=du%}khj(93J<7MF0_Ir* zu5imj!2IL}uEb10;y%ei|J9EB(}!G*c9_Qfcnu$%Zf+^V^@JQA|jr z&wp!EYOdXO-RY;1V0uZ~ZKIbXWYva4g|-Uhd~Olc!3E#aZ>k$AkRD@xjMMVC`G(^3 zat14y=(nr?^#%T0UqGY0a5c+iy@Zra`S__VB2sluGAY`Fv1u#$LcM*<~5$`a46 z-0krSdv<3RJwEo|YP`Jx*O02w`*j0Ha%GSOEtxwVXP4rI+dFe%xMY3R&2I7JfWnIg z{7RorHXUtxeN1p!0J8qPt{(b2a{61>T%RMHlTm$cC#yl~%>iJ`G~9oNvrO8s&*Ly5 z*OX}ny&g~5uBXXag#HkgZL}31(}t%(fJ%hB_jZO74jdTTa&k*Fn!UrYp|eb;k_t(1 zJ6YPGcRl6`kQrTFEUu+$H_VxH zX>1V5>wd+#k!_N4a_OVt>(`%u{)`ZbThvc|lht>siv-}$@9qcyDnis4lAEk|s1%lP zY_T=F!20mbtPh{vI%5Hq4_lxmL<~os6nuB@h`j%NEwyQroutxL0CX%6BPIdZEvI(L zRNI+{%1J4>308H*>IH6cwiN6&xYLCHs#YPuZmZsvNa-VxQ7M`{gEI=0)|Yw$w<@*> zW-!r0R>XY%$jI@d;}d4e(3UWxNLiQt|G1u9L#3V5LGxpMxaG?WBkel?Scu#-c z@X*AY>C$WKNI=?{zF|BCr*$Cp4MjFiPhpDiZQTIoDX?#r>aXDLG+_Z!XX0lMDlKx6 z((&tB^QAjdey^s>ZxgCV+Nltm$l~zFeoS&hez5uF!kOJZS23%IVB2r+5Tf@p-I4e( zyDAeEpfz=J=Oh%O#>r~20tH6ygiE9~m0!7B`Y^{aT_z~!PR)jp$h`PUwqnwr=WR07hz56$3goAWf)&3Q82+tPKYaV0p>Y*TSuAEmAyTFn^DB{V0r zLL>X!WFCBzBwq@vr9=J+H(W$RaMCMi_0TIX5{f_1P$Sg%XJo5Y@zZ#7vy+~n1#&BH zCu5ah>h3I&6B*JiMA&*`NL`Q@2qqdwTQK1C|rbW$HrkOS0cwk;$`w6338!gajv!Otd=CR=*4ab>nXfT*{1Jh)? z=*a$v^Nyd+d^fvNZ;ZC6X|}qC+l@&HIG3%?K=i+}Cmy@`{aqQvDa_-d#l`!OCwD zT`0}U!d@ZcxH}thspYtxLF;sO_M~T}p?RV}?4YhZEy$#uo0N;yAPI?pb43PH><%dV zO6By)6TD-%gL^7W#@dF?UZ9%P%{Z!lLlmpniva4AaEvYDW3Vbxe&IsXoi&XNo~ln) z4b#Ia0pe7KT`~i?)D#g~B_AM+KGtkN_ApdP;NKZDVe`PLjKyqHk4isysFMa4k6v#V z$hpL=-D@}5CQF_f)GXFIr&0i;m{o@psYUuofN(mEJyn&AF%fcGJjgKHVRRaS!E!@4 zks?u(Uu$@rM0{z&Try)h{cE=S2$ZCoB~RNa$rDKLml=qOq8sY2Q|Ra$O~{0E?Dj7V zcr-deTn2X&@-z6QMk|i*i=rO%awSU?Ly#f%YS|FRZNgPhYYw5K2M*fx9Lln57=?!~ zP&MrMMQGUK@A{h)@F7o)+c$%BXB=aIG$e65BYbE|DU4)E zrC@+65av?q8Ei61K$XVzckTX^KA$1cGIL%{my220oxpVDS8zd*5eY}5I|XhSBC?tz zTC`gxZkph}W5Oh>V30BaX*)uvOpp9l^@5;l#+^#D&%@}o4K$^(o|iby$(1y%a@DGJ z7LPN=L%t)gWo%BmOs7FXM--*bBueGWYOhE!Punqat-wK66+ZW6qk8Z6f4zP6A6U++ zd@tLAH*l#Zf?pVjq=Q^bDsZ$eaZ`7XYEER?!47G90LGkUxNfs0C(T$tA9uR^SoqjC ze}?Z9@;?0yIi=ZKN+!8L;XZs5mo#$GZ-j5sRhrqgJi1m-KjGulk zPDhBiro+JD`@@N3uP#oY=kY|cc0s`!YVE^0K<>Nez7!zDR-|211QPko^NVfeP5D-O z1e+ux#kzl)`gBAA!W&_``_}xZ3`|RRO>KuQzQ2=;v*#RO+Zk0X^Kl_t=PutI`G$uxiR9tM?^d0g6RL z{lFwtq66;31SpQPb0Ty^h2)ll0{=Vvl_BeCzbd7ijDrj~{Ec1vTX){KcQxLbbMOwLv%0;0kJcz9rt- zjMuRRBY!~?tS59s~g=Qwn;TUdvM86F`l*mMj~89<|R=3C!a$ zfq3Bl^>L-SE}cdnDatQgNG+l}^DRK}Pr{;TyS+3hns&X1QV60am9o7m)S*c*mNSlI zTxmf0g@tE8$ti(kRNPvVlM;S|G4tUTh>0{C_6f(Ia3xv*|;3>Jc?!K z2V|&jFb#m!KrK;Q*{+USKo7}AtZIF!&*x4=IDBGhn>eY2*}IL%ljiLi%hT--;dIbD z=ti4HmtSRn#Iab>tCGizY_Gw-`LnqXn`5E(wkVkQFUQXpJqXNH(5jlNSh-#tO z1kjMQH^SlBHZcVeUi47F}vVR zoa^=a$2AZ92&@XuHArqgMQz>cfgXmW3XI=$NN>^zcS`3f(}PodP{AkW1S2T6N@MXB z9&X@+FT*jY>LBk#^$6YW1Nl;5E=>ViWQ8^-3szQzBPw!(bM4G)II%rY#F%i7fx%<} z&!)yEYC?VU)acvTcOvjoqkc$d&3QGQd({K?>I=?mHB5o`y1=*#6MLv`Y7>OsM53g$ zP@DCcGI)Ennj^Zat2WC0T^@v!j@aAv{)XjUht#y=14B15SgviUsoBy7Em^(}QLG00 zY$wFuvTu}Px)iImA2iigvWl3J%4w8oU^Saeh0|E^1D!M!V)h%#JNPGVqu#}dO9@r~ zz!71Cy1Ll1d`M=4+&1Oy!YggpA~Nmp%N2GD7o3KR{uXHx)X8UTjre62qFOQ;&*%4u zIl?}wBMhJ#4i zhk<#KVf8Vd9CAH{7*;xP1VBS_fwux}g~m8%qcYyATXmga`uKR0GzjpV8Wm~0v!#0@ zC#pss2>Ml-C!{gLo=V@%@o}Y9B0d>kZ60sN&_azy1N_b#!nQ+K7u!X~gus3hoC)@Q??pX&1mLVS?h4G%_Ig2DuMLo0se2`T@2lh1o$A zpy-K-Xf%rdph->W1#fwB5R24Zw0Oqtn3X$B-hQQ>g_K$ljHbiw?i^karsVz7k@tkS z2*X|BFv(fXf9o0IKqEd9bPcrav3ayrjjL_nsJX0QIR$|u84>aT<*|E$e`nOB>xs<2 zl?t_>Ts-2Fnyx9PZ434gxzE$l@fVv{nS=CV$%fD9X!ZskB22 z-8K&;Bs^63lpVDbZH7J`_3FTf5 zU>Z9#ElAadD0_{azBJAoAlFLi7F^7*s96IXzWo>#YDFZwmQQl79N<8EJ##1^ObjMx zl46Y@oSDw`y@f7MpNFLX2qT9TC(m?{J(~L`FvCM@glJGxCs{9Y_na}QG#A(#HS1o1 zG_Jfp(BbDq;?2ct1M}jUyjck;S*FC6E4ksM*U4q7sDL+ZZEy%`ff;-x{VH%#`Q6l_ zTQsp2Q5JqJlG4#_UMyLiq}iasx~wJIV0u<&BxuEQdu|0rX_dV+TXr622X_n4V*?5b zZB_1(h_;kIi)KBVA5UXpWt0Pza&zs;V1L(@g>;Xsut@0Swkt1ke1a%a@rs6{2TrNw zGOzPyvF%8ISZ|LSreTSR$j&KIGlpl!spa$4d#&h*=!XmgIO)$l=U#^&+@rtSC$`;U6 zs;k4yK`qAGu`$tl-n57(OA@2|g*1S6XnaADU`k|IW}B^f9+W9+4DE!U!0|DJDW^L? zY|O0NaSn`kh^)Isa%ROjo}Vu2T(o_7QZOz81x`U1fNLa=r?gj29J+hxTPP8WgJLMn z09>ntX=M1LS3`XK0Hz8helGQ5EnwOjoM6!E5e>{GiR88^Vd;jg^8&}U<8#Rih)!Ya z%hg#voa2Q?jE8_BAZ7?16+9o-vsmC(1wAM0394Z^Rmf3FW_7c- z(Lq!zX=aGZAv&l=1lFwK9JkodX4}q^m>`o z3!YPswsx4E;G;DC-UR7PcER{0vU@JPfm0NW+7Q`X?TAwMrIS<&@^#302UvqvyJ<;T zQNFw!$fjMyQTm+tk)uhw0P1OJjoe9~+*VDPZqV|WjA!|Fp~6sSpoax<>;sxp$z zkU5tgQtRiQ6o{yfv%+}R;l<`zmp^farKcl?fplRpvmL=X^mECQ9L$nWH(U3Wtsr_t zjGpF3GEs;!+wOvmFCC=FT~bt9?c`?+ByR~G8ttN&(#xHM9m92D}Lh5jecoHrYUU~nvlvLGoqUClzT(m(0ne$zjno(#U2WI=}=vEDuH=ya)1)_yhz#DUA1aV5BLD^?b1 zCBeW~z5x|TUqOxp`MJ-Nq!!*rS@UIJ_0Ba`7SIEsMz&WuMRcp!159S20d-32o<==A7)E3gUbBh8gHOJ|aCETJ;60?R zOsK>OMaeohVVWDMpoWOwMutQDu{@;tT1&(I1S_-Hu}IuimUl^89i7VhUuB<`nm$}a zu=%)}Fk9V>{h*8FmG~A^y}UesU`EgEY+xxoks&eCYG7pzf9%E=uq7dJ>i3f#SesU( zm=7hcj(X78gF#-CDwX_4vy-Mz!y?OOsiqNr+-lJj3U4uBZSrDUOmE$R9xt<8QkQ6PJQcDo%w{njsphA^MWcB5cnHstfKNl(_F%!9jy<1lq_N zO$@CCNFVIM9j=}*e<<6#{<+Eb_z^W$7^Ow(X`^{^{L@}_rDtdS2G)BG1#8}bYj4S8 z@a(1$@0KprBNodup4D#nEuf~+QQLqTyQYb+hWV`XF>OyfpK?w_cLzWJuI1%u3vVgI z1_9HHG)+_GdVtWOxfEiDW5jwfI~3a9ge4j?SvQ&An015LT*wtdnM_Xh?)?A+1@67) z1^#dj?X2QdrF^c%hctkCsy@#1&Ujg`xYD8-3ylYozU%u?GM+aqBvamDjj8}HW3*OcPn#cXvRiA zDC{y5+A&#v6?nmA182PscFJFGRcD}v>iGHuQ+F_sT5s}*t1$~lmhyDwN5@n6UfjbY2@XYG9bPVp9r+&^{n|ellJY!4{d1iu)Cn0Nco2S~ zR&ubo*5(Or1Gc)I6>MW>MqLRW=iqV#RJ?zVK;y!ImfNf^l>=8dQM+vklX69)wAEdK z?P;dt%HL%PftOJF&`RHt5ZE15>Fqj7?y9=d6GY#!V%Q<@NP}v()}|@9aS7E*gHUc! zWN?HSg6CuGs1?$jVg!i9Ck+J%2{;=7M^{qG!i~!ilwWBeJhkg7y^>2c30qYL%RuHW zDplhZ^E?G1&NiqF%Ujq2bUXc=0;JAHyK?2I$@aP`K!ci&pItO7I*#^6LagkiB;!e0I<|69rUj;^h00xiOs7!t0|f zye=tCMLDKq0JgFm=KQZGxxZBAU!e1wZzs*jpyL5P+7@xmB<>f`levqax$v<;pBi{X z{@Ux+dUH8mrXAl9o$EgN^J+husC!tY^_Mm@6X7iq-rI%{uH~ntQVWLEOEI(yY`e%+ z;hnnH1k*rEVqBl+5~8j#CA$~LQwX*iC#C-V{`nMk(KTeyzB|ZJgNC%NC3QDk;s8A_ zvF(d%_y9bmWlzs!`&PMB;5w#iHSj1G=$}xm8e0PbBK>rLtNV}v9u1iX$ukNr!@Qs z)S^ddC!2SzCo=X6L8-U;BEI{2H^E!^m{yZ|(gS9Tc%WAw-;Chr{GY$vzPbHDnF;FF z@$CjE>1^Zcn^m=Y0I3Hn-M`SM}QY1InOqEqP7%&F+Fg@ANEjL)I z%HeQ5o(K}MS+-UoEiyTk!DI0S{ZWyqBWcAtInx5FC-YNir)8@9CK{<>se2^Lx8VBb zv_w7#8P=h=9zlb)0JAkk1P5M#h~RdUCdW89t`xE$4nHHm=4(xbuI;_fk~MzJ{f-IQi^s11r-Jp>xvfF&m+TI&<@Y1%Np5LMZ*qwF?EKt>ZtGv81x-UU`3kLw-L;NTYXHKb55(O<@+fx(ci)~ylYeBC_R#W!yHN$BLzJB6+q z@PIB>*fEILa^oOL!=7WnWOl|NHbD$qPEA@|2LrL#8yF7kXdtFkjGII%V!PH?VTPbjs!7Jy}2i8SEbsQ9ZslkfNBz zZIf55VcG)bC0iopq4ts;Ax-rf+``+t<>#OOf>f{3kg}G_lYw6O&V2B2 zW8NbtgH3^UxR6TnBL|w58@WW-|3lroHo1`;*@FBjxcV?gO5NH5P{qgG9bH4=QH3T@ z1p=rdsV^|9yELMSP4@C3wPtkhZ{Kr{yT>aN)!ieF*>0OP3mG1n85!Z>;cw6G<bP>W4DbLlWT@(JnXr)yT!AxJn`#KJI~j!aIr$HK>J-G*jAC*$F%A@4 z&^q{MdLjr{%1OCh=rl)897bW2l?iLL+XwB#Yzb$R>SX9uzKe!5XUP98!r3bfCzw8j zh`>+7Sg_y9!>xv>vqli*_6o~}SzIx9s4-I?QYA!>(2~0wMp%H-r9L35eiTv+Qe{%*D1^XA(RXSFR2H{zJd?i&UsjF&Le_^hP70`&) z%UHuS8`>*51kU$2&tfrdmdhX3^y*44;sIa^6&^J1Mwb+ZIP>t)3_&_DUF)9VsP2!; z@`FZGeUJM@$CaL5o}`z{-={AL@w5Xs%-R48+|c3D&BU4n&U+SUQCbd$~9M^xm893q94+xr*BvG^~*@M(hdJ;FyI6A8Js|0dLvOFimta+4*`)kKir< zP29R;kb8>+Ha4AX@{?cO*8sbOhC&LD_tGW?TF0Xi` z<;X8+50FUB;!TtKa0E986fiId*)!S`_Z`JDar0z8(y18W3)?S<7uszqGaTE`aOlfl5@x&@L}f;Kk)Wl#O9A ztmWc0HTl&sR-IzZW5o>LUk%E8v6}u4W^V;MtPn}z9T>ua!CdaBq9~&aZvXW5Kkg2n zp+hrDVJux`bk%rgtwhTIa@_I7&%jGQb638c;<^22*gya}iq$lau{|7UUw z&X<~n@G{)YS@bc@rd_Is%iKJ~yOLx&Cmn?S_TKb`z+O-y=3Lp)`0k%ZCNAxMFbLci z7yq?=!NfV(7g1((H={7wZ&yspW=!XTh)~%LyHL$t9A$JJrIVa{!~s@{eOL|diX+OF z1gxG&@4FPb(P+wo9|cLu_F7(OEp#|zVpq&yh^5s}LBwt4LNr(AyL%Ef4?18CsA&bE zX6nQ^ndEfLE}=Lan)DvEYxG`?m+_IQ3JmoALY3R6!nY}b@b#ftJOD|*HRCk!z{2DX z`M2Hyu>_rN8hs_kwS0X8)D6xfalM9aGBiIPNb`6xbvaMLc~GTOL^`w8)5+=qVVVny z2SS+XJT)uH*U?Q-B=kAdg@Gs)qt#$s=jc9&ah2gN zocO^QSAyH1wSHJphBsZvPn`Ds<<-sg&Cb^E2+(*-Ppbe1-n7|~3qtg>048(`o2<(N zi4UYiQJkPwQ=TV*GnO?hFQ+97b}g}A*kU5&M&@edWM3ct@VC!*-+uV={xf04W9d!V z*UQH1erJfdXfatYfl^rarFehng{py(HpcA^XY3w)~0c5 zhTR~3-_SwDr-*EcdQTQ-3^xZaQ5IG@bG=kJIP{uIGEgJ(c|)xShT_q>8DEp7NBO0f zJ<`->n`qL;#%-M566|j?|E-M*qt^tE+k`$`22*!gBaLBToGK@7vx27!4(gGP=T2+* zI=EYb*$$q~z{*C4KM5ZVo zO9y&fKn`&F)}A~!QaUoMs0=a3cj@%B{;~vs&T&H_eGD>~c<>0ol(n#QO!<~QpgC+h z218$DiB7mgMb78*q8d!frW2>8fHqE-i8CAEH( zhqOV;V>+3Xd$q>}RG-z*qf{0o(=F)che3!CqXYU-6Qakyt{{|!bMfQ65&6}bQQ&qi z_d=EiA#an?=3JHDAPNvXuSa8mkyOfW6#pY8*i6wR0ZfwP0aEQCo%K+LTkH_}f$&<0 zFTw*qx*&dj(k7ZjkS524FeG!XVp@pCq+QAj6{*E@RteKFI%nb+d{v;oNx0NQ^ElDa zr491kAZrnO7*D#G-Sms=jW1oD-c+g~<(rFTmBBe5ic{s3s zA5#X|vb&knT}|RDeUbT-&G0RveECv6G^uX*V;M)r_FTI~>R_z>q_KcWitqMOIA^ePKF}))X_9FW1S(votgahp{%1drvVi#B}MbV(oa^fM5 z8iI5szSb}ek&@vKD6^a2USG+-7tI5>MdW>f+;#AT>OUlcu+<$zO7^qM6LVBb!>AAC z4Aw}D{CL1%_!z`x{xm;h>JH|Eprd0CR0Oqy&r4-9MkMnD#VQh-2!?;2G?skU6>~z-IP0m+yq6i>g z{|;qVkQ7t=6?BE4A3gj(uJk~{1V#jfsB9iYmfpKKFFIg-h0_U0mWU3oBh+e;ddJF; zO}0uJ&`rsQ1eC(7e((s;d9R8f65{w;GdnDo}w;FH}&6$e0tBb8;UD6N`k+JS89qo2Hgp({yn-xTpYK z(*Z&Kt;8!TonRWPD56&rA6a7dNauol03>p`$MtlyXf4JqR1cLt=y)j%kk$tHAgC=? zX1zJ7c1i=vGi+RkN89*?Mog5U5NU@jMmSW(LJ{4bcHQIhg94kjmz{9*ry3y_0{bEP zYYdCsCS-J#fgNQQFK%p1XawMTh7SO`auH*kbU?-?ibG82qfipD;TuGvPPQ{vV7l3j zjl_1E^#!(jxyvJV&9^S1^#>W~DOAh2wcO7vcJz9KK1tqhHS&tulwhsKZg~Nw`Fgzs zgYV`9RIj40X8vk}bX1T8C$An2WKkfp;=tS=X7eeE$fMYxO_2N02LDIzZ5wkwrk?a_ zvkN#`NgU7G@lUk1afY!;zOBEZ((3#v{oP$9%kAJE0n4*NU!x|L23HFPRC;J$jx8_O zpbr#JcU>;Rk)TkVRw!Mogri5sY&TV85+sV}&I1KWH`xq{;E=}-U_M>P_NOp ztg^qS2*lzbJJu_&qWjT7kyB4td3;46L%3u$!9Bij`7V;Nvrh02$!`=^76%^}`gG!* z<@#JZr*8H?+gW@nrxcS1X{>Vd%A!WhLy_1on(Ss0SseRLKSvyAQ)(R%0{Ud5imqq$ z3k|c{c{u8@ErI0cQZh4USyTrLcu5tpxe>%w`phbm)0pdooz4s-&S>QvP}Lgav^5jj zB_)h{onnRSKDym<3mji8zO;dYoKZE^HWw@02ez4WrEIU5nqc-_6yv3f42!L+C2fJS zmxjkq6b+inj2Tk5m^MB!fS3^z5Tv0_v3ll_Al;2{p^68AgEMl^f&8UdW%@Xm5hLDX zn0r8dffAWyg14s(Arx{Ia&}IY<^pL?hqTO6uIyg!Vs%4XOwp8r6G7^1`_eQFr$%1n z#A0d&P>MO+dC?Qxa`Ii9U5<=pH2xnlMqFz;?UAO?br%)SMPR-_qMaL@{##fZ$_rl% zY^JCEuCNV6(mKmS4zc|3&=ikB{!t@vk33hR#FgHm?IBZZq(KW(Tx_2TuDP-dSC<9l z=(vw@O}ZVDd_aP{U!=e=yUdej%YcaOdQa+e5==wkHYEj#`dX@Age%v*n2^FwzS=;= zzl#-&Yoy*x!jU_rT;7}$`34~~)y;X7#&v?vHngB3S|fBlYOkg_!8Cf&HgF*3S@S?}T$i06Qb?;OiGL*C!reRuflw|{!`5lW}%3;tvcY({0@bqEn$SaY7k z29SREFkq%_WTXA0jI#r1u4?Mgd{9L>Y#~KvlUMAZzSLCtQSK~l@YFRcY;Se$$hQu6 z4u)%5urUG?^rdnc=$rqAbVO0=SFUhw52Ep1o_D>vFf3_$o0C4 zcXTDTH(hD^HAChL>Uuf95Hu2JZ(;0tID7l)%^%*~&40Z6_A8X>zWelPbNBK4x1Z=( z{}oOA^B+Gi-rl|Y?yKde9d_Lvd*k=?&9{Gw-{)Wch+sVdc3=Lmz593E>(Bja2Pd>g zgYuQ&Z>zTsI?%L zver?zZKr1hJ)egpt%^zLojo3ZJwVyBM}yzM>Cc~#0zwAAhW-|3Y`K!Re$G)1Lj55a z!V9EaWpuIBiC_nAW(bO&y*6s$MslYXazsnS4>XmDswTTzWQqfRfIp+_S%D-&kFQCQ z7;%pFZ=V7xbQ7Jkz|j#gsE`6Hkl`k5aqvdFpsNw>upSIe5?nTec3Y|gF#!Emb)m6) zbR3Z)>u`A8U{s_XXa&+h#cmdL1fCiLTDEAr}YY_v+>_JNW#V*ef9w9uq%d=fb zj->MVzDiN|-F2VSvlgh0jOY&>$C4Q1VU%%DU;13g=-BJ$)|*wm>Zw%_2PsnFh2_lgq(goFeNE`nsE@;f}kKl>BK$zZDI$gig{bXFdk~ zRz6BUqC*y{ao!#sFb$7m&eBJlgeybTIU^L#!6s*NrFfv=UF#hrit{e~07ZdF&GQqw z4V9i6BTu2ZMG&`{j*WjIEJ~N4dXSlA!V^d}kP88J5UjPCOQY1DHEYeOP@?zf{*}+K z=_Z+?^fH?T4*gt3Kq+l*rznpx1+n#mFih;nyBTgUsfiSS zTULq-ZbgAtP(pD0lhq1}S1Sup)CYLj6bnGt$gUf`RYU;okw&*|XTDtUqiUDgaX*jvU|Jj3viuyAQDJYxFT;3zXmB0@ONEj#qU7d z$skn{t3nRQ)M3gi1|y?YT0>;;7J0><8U6tQ!*a^7H}1mijp^5`!{b;dp9pFUI5Zj> zV?JC2t;>q>xNUtieTG}VZ zHgaj8gw#>21p7xE^Ay3o7EqrP$H?UZQriOdb1$?)gei7HYZ0hGzErzQ=tLskjrAug zM%a~!&K8?8F%wnH^SvI%qk46D$+$CAGpihoxtFl8kkk!V`4ynNjMx#{gL^?vlG?J> z1y>Wpf`mMFv6~$K@k|?didzBof|*r<=)gcOz*ap(130?jb`S#{>fp?1z*I+EZ~T3M z%&{(X$WKh%FHPa|_0TzAH;iXfFE*qL4wNTiZ6h)6{F*@vvkmfF9tR1M>Io~{cDIi zYqnhKsWL&kU*Y2;N3huS3TQTa>})ts@ztEVy19RaUxk@_4s^!@y(zbKc!M-iCaw0k4EUyqg8M!*+8oESv2Wd9s7O=5qfG_By)xRP)r7^Sf33zM7Ls zgx}5OEniX+Uxl zK>0iRr7rw00LkKKrhX*9ae3XZhiA40X%K`T#{RHf?wF9uu~cEFbL`p8%^sE>BlNfY z87Oc4iw3`wC(#P29;+BkUt6MI2Nq1=23|q8uvA7iX3yee-g+kEn;ly2doJ{ov}kY} z+W!izueMK6>eyQ2tP!o@nn`!To4&kRnEni>0e)*6@Wh^C_>W!a_$e zrWKYY7)k;ss=Wt?=P->Se+v>!I6-i7R)N$RXaybsik3CS5fh#;Z2)YfWEIJE^HUg+S8uKk-+%b-PGFFq_@ZPP971|(z2T2^(r8lP*ofp1S?fT+6!1jiZY^2@ z@j6bJ>l|e<$t%>T2Sd*@Ch$6AQ5WcoZp-FEGTBaUd^n6DHw5Wt%x0#F4ctEh0*q*G zI5+e=R0mWyIiqoll*$OS!68B^Y;ZbGnjlIWW>xkjEyDe*-JXMP*!ghHI~KNWAay<_ zw`;r+F?p<$o=`-?)RUs^m@Y>O{L^M1+{!NXd80=3NRt(uYW(^LK{qeJglx^I>_KWlBkU0$+x800<&;1 zYgf(K!r||a-*QIU0qxcGzq!V{^L}_-z4Q0ZCXgZ)18Uk zTWdrfTPz4uQ-KzZjVbhs3*%B@^|)5!72JmM#yo0scb56hN2tGr!z0BCCoNByvKy%8 zBLYpAIQZd=rV#lcwV<21QC~;KE37G#2X>`mdU7dB>`mCzP$!QdhT4NgtJ)+Ca(2&$RNES(HDg4fs}!Sq3ndK zn|b;Ptt}HlkzGY65j|Mpw41un+rxedm-utfZ4|r&A~qF}W%<6F9h+bpnRtEL z(iors%v9P+yV6^XXTI4m)bU?iN`gfb{0P#aL%&hffs+af#hB~;| zMK;NrJ+F|n2WAm~2?Aq;HjM|EhUP*EW2ZW5rUIrf;`}6!JWKqWeDc!V zxiH@A+?QbX2HT3P!W00u@NJ+OHq&RCmPe z5NDN84g00|t)(?i2h?bDF(G|wu5J0rUveXFoB$~1)vQ?19+e5A3grYRwSn4Ri351l z>posU^_jwcMEFFVk}B`Dl`cUOi@NgDP;D7$)1_0GUf*1Spn`J!q?s9a_L`Z|&RX@= zx>L0J3G9z9HvS;Fa?DG_H!+Ig!+G_(NIYLQY6%iKp5HE~b34SCgqLaYGah5pBo(Z4 zGQ>YuDuk$*@R-=gTN*1%Ay@67PsxPH+&3-vAtc(A`mh)Q_ISxx{~Baw&ubfi&+$Mil#6} z&CcEEXLUnD!n>&gaC581pPr!_IABX>FWbU6)+meuCpmUzh#XIN)X|;oXlvd?Y^o<-^UqU4K@;&S2-HN6F^tG9eP+}8A&14yU4$CFfc~Sg>L2?B^jg}?Be=%IXC-kzSMV# zP#VV&iH+kb!#x9G)NMDJ(JG6G!(MN|jv?@KSRL98NRzJDMKEP2zO{wwmQoDcAh{nJ zAsd&_}29alOT)R9AwF z!T}3R#b_rIe`~iAJz9Y7N(kpR)Z265!F8PCbWW~F6E;m&x#V*($Wn^laUB*u0(>~I zhCXYc#C4Vt>~4e%P!U2B6Bmp(ZbyZ|!MTJ3E+pF{owPpKB*0|+TLx+Kl2MyD4R9J- zz2@uNvOu|z+k*jH!Lx?xEkX@G#%eMS6-?NH;|*;5Ig;}eSJIX3H1bkVpv+NW8tm>AvcJf9YI5s?u}UVpA^lN} zy-wq(Sq3akCJx{5gs`9Mx&i|yyr)k_$CO>O=XD9D?o_&qjDU3Cz~mTu6ZuZ#i&qLqi>Q$el!8hJ-WJn=|p`*k;Xoh1O|m8Y*wB1v7l~#E9d&_ z-@zfoC3{6dE^C;k z1*i`u2ss^4XU7sVu)k}58lY}4$--)Iy??pgxTujEG>V{Ams4sTX4HrzN>#K~eWOr1 z?geL_y4TIRgOmvI$I!ZwSGPhp>;8T@e_KVV*^q<4f+afXw6(LG=H9%8lrel zTnQ;O5=+$B?;4U|dK?jjPLZgzH+fy*Lk&@94#?{#C}5chO?_pGz~HurZY^pl)6M#} zEwH@3xymee;h6Aq9TJS!*&|CW@ZOFo`>jb4{c#tyq4AV)C3s*{viNP*+uf%5wj-VN zc>#kj{g!MC>?iou(T^VOriVD?l5(;C&@siMWQ?H2T9d9-pg44bX>Dcc_RP^FMV`!7 zLDv8^-hAqjXI!+haL*93UMdu63kmeuDV8T2Io2(L_UeIDn9h;r{7# zh!LTmRaw&TbpXLrRwtBO-{HstefilJY+;lT5wH9Tp;Rhol&*v$S{#YJEBTPofJ@*^$w;$R?CW;JR3PCCcM779AuLB) zNVTL~NAyxVqwwe=4yD+-2PUaVI4Hv}RDIVwRxK#}FhW1^vm*X<`#s@)5HDEEq+s{G zMH4{g3e;QvN<#L)NF@-Z4cJek6kVTmmLAuna6oOP$pYd5++cwkRDvNQ1VQd6&-`$+ zoFj#GTlX+9;ds$RtdKZ^TIb76c01uB_X`_<13IWut_IY`Y}^rA+ILRSU?cpUmRX&^ysUa zIB`>eMjsC^y#KEI!VB~0F-`aS+|xz7keYZY=gUSLEQZ)rH#Q4{{0dBQ2?5>^fiL6G z3dT9#&0x4mNv^ za5?1qSBU@VZ=ao>JU)ATdiL~mI68fNc6#^qcyzjQ9v`d%_&VSH#JJFGj6&Vgsf|~< zTpHq+r@lM-JA+_eVxj>id%z17P8=|~_i=1UqLw{Klf!6-xDK@)68@PY4|~|!HJ!HI zPmV7ew|on>Q)ISBdYL^+-_?ADHg|&Qq)2QUqz?sL(8oNE40fq+jMra!1cu6PO>XlDT7d3yc@fXW=4c&GEs+%fX$U+= z_ph#>dtLjuss_L>W%!m1>T@@!k*ox5L#AUP;)~Qu)M-zj)xyrnw%4>kviq?GTE`$nLj}4%n_MlOpenk zpQZ!h1THk%<1*Dl-GOlPelxzo^t9sJnb2YZHG>=#IT>ouv>M9VFw#+8B6wuHGxQRd zD=Y41hg~Dbeo`WtxHMgTC)=5wY-e877_Ml_Jg8{9sb4+V-F=G^!6qrX<7CVDi6$kO zzOqEuW?d?fI>+w20IvuoFN2)tt77vt?V2DiN{GEsYmV+0jH8EM7yJgexR(nrV?HEn zN!P=dkOD5|R|wscnfMAW&x2@3xHGa5DlkIv%aE#Ncc|)l=SGbaU8D%ZNjM$vDk{-{ zG`4&gqCD1YeVphD+?sPsve;iW+UTOC^?dYz8FuU*+u|eFAH|ivz>ZVu+;>xkkYSwI zt+tKfU9$&qz>x}#d>`&7n7&R}oy=hkUNpdbgVS<(wBgN(8b(Txb_WZ=GSD7`-GvnX z@GybkK-{4YC>o@e=l*+nvwyjeDkEKK3MdH6^=5}oTzX_V8I#m_e0CpPuT7Zk8IR^y z=krb}&Lf@lfJ&WZxu_sTWLry*Lq3*GfId|y71@RAiZQ0CGw&&ibE%$_ z6InTy7{C@H!l9;Xq`HQhv_5Q7v{Zo8`%NswF=xkTzSO4#ofj`sd;MEjN^!tgV2h?U zIY{Ar!^~s+b9x&!gCd?Yw6g4>adFim>uy9DokM+gn9p$N#+sr>8C6$@Evc)~4wF-9 zZ>`Q>eOiL)z1o=`KU8-vA?j*IYA(Pst2|?EKE_<>%%0`UniR7p+1a8Db}w+!?_MB6Uo2>p>(GZMkiNZG zkzSjjEtZ=MjkzUt-$Uck38OQ{pML)Ts31j3(xn7>E&6GJoJ~FT5I8WMI=bUpBXkEYW`Q#231+qXk+p02Ut~eW)=>%! zH_*kUo)DCy<1|p5N&S5^NDJ?S8}_T~tJUlHK;QHYFr%Hh8N*%BmV@j88MfKw_UU#; z1=nJeE4Au+VMb`7^XP(453$p6#}w7Qr@L?QP>z)uf)WFu zG?gGNbl%^6e)IXur^EQgmp30j-+lbF`10p+8oAMH9X@cAv)NHy8tl8UVE?pAZSnZj_nNPCWFwAC4b=oy zufdT#lsDNVq9zFUs zt2+E&4^MA?T|w>kNBGZ#{xat_KF2jR@lE0_F@;Z$vY)BSp1L@a&^>)IN8|)tYM1y9 zWWWl<3&#wIOmIgia-H!CsxfcZ8YgWi&O}%}M%Y+Q6IhbrgUOs0j`?H@M&p8!A#fX+ zZeJr#t!{j9cnJ~(Nri3}UhYBaPxInBa#-N&yYT!u?*2G&@5dTt(nmMFG)=-_^Q;<< zoKYdWaqwZ9RvHwP@~6krcw`6-8kz~D6uUf35TCn(#8WD#x=_7S)C^<>q|N9|f!{Su z-5m{F#DFOaXb_lNHEOv+^Fm9{2F!8Frpin8h*yNNq2xPTmD+XL1Zg%+MRb5LGr2KiPhH@55WKUKIzWSJ(3S_sxmRsjd~s3 z4&iiY1i`az)2q|D=6t^UY(^|GUz&jxY9yP2DQN)%N&!8c`O$55-a(9+g+8vpU*t+9 z{ywR^+XHO9DQ9WeK(y+>VFA~+>mFinArOTZSBmqw76r1Zw$s!_`d-3QgEZ$Dps`Th@g zA4ToG4a)=#F|y73=P~IWzHZ<0)b?o^s!=HLfq||ID5A=fssgBM$ugfJ;Hf6KgUTt5uByW*S=jBWC` z*3Ft`t)U(Mt{3zRLG2qcxzp+BYSTLb37BU$UCm>dnY%B!u2fkTLc(#I`vL zo+APc?evQe0GcE&iiV#fG-bcBsil6>=1@+{w^W!`{sBC)lRvXT%$?aSmE0`&01U=7 zEYc6U17RBlT*EYeqkd-b_4pu$CHwkd&6LQ_nZ*gnCK?b4PWZwk;)hg7hg(sI$V2$c zQbg8sGGB~M5{zeVWE-4ca{57YzK^AHjdf24eSr8Xb0efqowA0_MN&6`uEJB?*}^e{ zeCX&Up0*E}%-&}5Y2oHXdTidl(v_{=e)@d(e)_|^&(k;W-u>atw||z-(0X)%Vuop~ zK?UfDGtZa$2w}&_l$9%(^zO~m zX?-5_RLMIt;?!3_?@U=VW{AASTD*OaiUzy?h`~8`%tRVZ2Mw{={3t>gH}+EpcF>It z{mEYEeqR@!Z@Z3TcRWzHe61zr=5t;Bc8d*u4H_s@ct|ctF&))yvr|8e1RjFdH^Dvq zWGu0KMOEEanc{{kpZYmA6K2)U5MiFgViP2eu*fY#Y=Imh(b=wb)=C zm<$_=Bl1g^YvdT1CVaK9q{Vi9osqR@(*uKQUrs4H;QywYSJA5el421usf>ob$wNw@ zaL=4Cp9=ww=&?u+x*Z~BZ?TyrbGw^l+}tjRUP9A>$US&LIMK*@P+a@uWfDVw_{a-B zoq){@2AootsE|?89T!45?^pV` z#FWq1qfr_EGaAX>vios8#D>8?_Ic6>)!Z`O>FQIyIWXBlg9(lS4@7=_PNL=5NrPB# z&&n~#fz9%0(MX|K{{CS8fax_^Dg=GtIpyLavGv|u7U*l9M@2ddVW-RX)TP zs5^rB#?d@Ib;SgCx&{mv3hu8cHIObf-xc|@NJkfSNt*avPyi|j#-ZmU@za6!{DMUr zK(;8$QxzC<=3jWElLky>5mxvdNk5@RE-o}EsW7Q_SL7FyQPn%R3)e$EbLD13ItCG& zF3H};^|oEEDTysmP%n-)TtP9%qx)S!qley`cQh@4Krm(j;~!?phS7}w<%Zw=ZU8L; zRsSIK|BJlA*T0)?2mgAk7ub`5cRPpb>3ByhOgs)HFaOmZyxhVB#}JI+4X2|V$iIj$ z(KyN4px^)aH>9D)L(unM`AdoaqN*m8vfqCD<@+!2^t(fX-0xUnoriD*|Nh-)hq>lP z3?+2>Ac2_q*>Y=^?y?0;PPiJQuuyp+WayaAy6QEcX=yw24n~?^KtkWWcw)Lh_*$nz z+wgcYNZLVQkj~$Hx|92%TnN|zt&JMYSSp!*kAxuEELslO8OcNsF|Zs1QJk(sHgcrN zs^Psf6k({>tL^mfocwh81`=Z+AMAugH+is@9U{oNVw0sXsIaiNxqG` zP~D_c!}rnzM)J7kR>HNEy>vrFaj`9!w`xQ=nwKy=&Mdab5RH$71yF!&kpGlK3n--xkaX={;pao02*Muo9RNreQl4oq}83c7}(Y@ zjZy^P6F8$Ur@*k^?pqsF4bwP`wZS&nU7gqTu7ap3xQz{e^Y1=0fECcK3&rk zjKZM0(lj<|F)Z-YpDbR3(pR#c$mJ8>xUIaz6tB<#0b(D+&S1snYuNa8r(b9QVf0sz z4idFcJSG=eRMk#he9I&aqCqfdUwyk;hz7V>N1^Z7tajA=E3V zyB?!38=ss07Dk$qCRCD-0G@NqB?)?nSsFihO>Nxh^U!QR#vsS6x}pC7-_`~I&Zqu!fnv zDb6MUtXzz7WOlk!+W-Lx|H8EugjN`o8?klK>PImyz=}q;S-;YxiAuIRE6v z3U}{|oh#GxE&2+3r^7hLxg1i{+LC zcg%|`%>>~{ut?D#rBEe`OS@KMs z{%f}V?zs(n8+2~>W+J-hru&Y18@eesWa0S*=HHo_e}RDJWxH8r4_hnam|T^=v_%d!QQF4zJE>PiQd~PPx(suGRHu z8=wYD!qow-g!>kQRnJUd+ z6JJe3L}c4evw)L-_q^pPTBu$iN|Ri$74urU+E*$UK@`(IRA?}7GRC2U5L^S z(ZY0tP{uvl$D+7VFG#bMhD@b81IVuT^UZE^RI=`L^LfI%jnAvX&x`%u-@#8jk{2#5 zs%B?Db2<(Hpa2q!Eojr+>lS&tq>~wCR%!xKLNwM;q5}D^ke|g5HgeU}d|;U8Up{{N zyt;e;@1Os47(U&9eDnU(9}zh$bt%D&Qh-E%K}YPc05Y&lU7c6B(VP-vica%|Cwp@G(9^7aDYm z`ki_a&vph$`=`&zr$BESeGIvps?2LRazuuc;WGI3C=;pn5I#UAfgBWN98 zXy(FhZN?-vYwl!kb3XzUfsj+=kNH}Cg!bk<9S#CRYv3rqGb+b4W}ta6eY4& zHflWly4`MyV0YARghag2T2?LU2Zbit4|vcb#UL(>-$_jtw>gQN^FwI)5gf01DSS8G zdlne}xR;?V;14dh+z9wz$))Er6wcnmQC~%rnQnSMgI5JoInC#{Po51@Z-}as!}$T5 zz&hP`o1aJK>s6(^pYC?_a$4@)Yo4=|+9EJWvgk}z>$fi9mnQ`7?cv&1cu*#+_tGD0X7r2&R!f%zbiE-`L(;@(1ai^!H&6zyd^6D+2H`gUn}5k<6p{ZRkP_~5_r z{n14&$m+KA??2vSUVgqZPT~lPC_-v(bFIg7(&)^!TRrbYW!JEnG|~a3OmtahzJ~`gwNW%BPOhf&A{jOO zm!dT?Qy(jM_W#KY*F76?TnW~_9W+zgI1?J`AvPrRb;PfM>MzA$WasjeSF+vUAbcAJxM2tZcf2zSm55m}LZWlw~~v`TapZ?;bs# zETTb>4+dc@enOs~3;c?G82pA(`nBfTA5bYAw3`!r~E76?OGcui+M`+{iXf zFH>GjR>{OR}Tz ztd=O+KJ5Z*aX7m~r3D$DNP|Vf27mNs0Z8)$Vhez6C1+I>wm}0N>8WdvwU1h=_yQJy zR0rq> z)JoA{Kn0B(%gPq5FG^vYn2yzBKb7;RhwUAn_DQJ5r`n+oodzldHFK*Y-60yDo$-56 z5M~GM<2($a&KgI?O5D`J)NC5$`iRTUmD&BEA*4)5n>(bKe@2w;o_lnZk|K!Un{5?` zGqHecTyN9Tubn3Q5RwyJbx0 zL|Dl^F2`QAubPgRn}lFJ1K{UpY|4r;F%-+LNjD@Dg~1rJLM#+rS^AM zIBVtoE^36Gjf??Hr!jPxw5hKq)49o#U7_W)Vh`A$NfdkFAs4VxPL@Ey`ZA#pvy|{Q zd^~P9M6H_C(+^8L>jk#DtX@q#jf1oj#u3BG|D@3Mo;=9<<3S64Fy%MolcxT-yn%=rX9vYy8ct!y!DqHCZOgafAJR2 zzMgtCVJcM7h1a*S)+IGi;O()H+NO6&g zqN8?(g|JRj5%zTEGngTHB8na0Nq%r*gMraPir*cK1v?d%ggSaw8)XoOpt-f+d$-B@ zMQ7$m{d>p-P*IK`sib3aCW1zswyPf~T^B<#~x1 z3uV?GDjZ;I$O=cYl*({Sg5thjLYfk&MJ1iXyHlaE<>^z=ezXnCM!dK!Q&v#Q79@rw zY`GLZnW?tMG#zSLl2s3l2rp{W^?3?kkFmC#hX}4AcLcGPvt}F65W|`}q%;Bb7V`M# zaGpAVDEo<_upcB2*dgyU%n+r&7&n$t|j_@Cx*MII)W2|TYEo1%X zJ~hUQ;-f7NkX!f%=k=fa)EMjI|CX^HeQLdn$A>4u^;U-C;C|~yQBEBTq;)uvXx1}F z?WT2W%{cy2-hODSt1CT>L>)|v>HSQZ=)b`QgSP`CTvBQ?#^ZaO*gV})-0rCVYr%BRB6>aK^b9V|Id{P?MN_~EJ zFWf)Zj;emnFkm_W3UvY)b@TXtD6KN5ChEWT>NYdbo`fOA3C!b}A@2Y{cSXNs@p5!& zS>L=$0JKZ>H3cpphX}HP+6|OMWo6i0zodfeCCX%5eotfN;JX9CB4QPbIvCU4Hkh^OZ@ei=$vQI;4az_5E+?b2$4#=Dl&Plb;Mr;A3ZxO}4V^UW%=}$I z!kr8>gb_15qx$``8;Fx!S8}@C?G=dN9Zr$U-a;2dykwv4E71ZI3+XmZL`Y6=M~O_z z&LkkycdnX+8B;TCF>v&2b3IiceLUG7B}S+4lHG00DAWLTgN_h$2T2)o;dRTBWszUys3WanmWO%Y2WTsnwMx%1$pU>tJ)&kxdg&FL%=L zv``hM<%f}>)T)*3K5z^m+j@=iwc*g%?v|V0!T2`Go#z+p>CGW!y2X>8P|s}M6YwpE zxW4$kX_|XHD%f3mKM+u^7`x+K!}2fJr}z;V?aW?p7kxwWItS|9AX2`$)}*4~JiX}q zk+}s45$W|tj@9ERQLQGFK^zIjSf-D%iK&$AqC2HefEz1#r~3rhH1cs-A=0C-ZyfYp z38Gu1u$Pm>(^w;aK(mG&a1qjuX-OgNXQqk8yjoTl&3dAui`8TIgl~TB_-2V!#5)>x4Dxb!V128Bqm~>SG>62tIsB&w zJ-eveOYb)#V)VGz+0}`&OnN0^b7GN$zcg`Vw8nyShZe>oZ&8HFIbhh!dbKN2!zirq zUS#|-BNh^*3&F@@+d##uduR3~5_l*lb)WXLHV_=?B7_olxZ6H-nqtK~Qw`kqZ5`Zu z9q%9A=iN@Y4RQz83|St-=9w-v-+H5&Nq4Q>R>Km;gWhHPrI-`pez!RfrG%VddUan42{1pwvHCPoTp~Y4zXnufnqHckJFYaOWEosfcMhT3ol<40{wwJAeAX1k*>*B#1IY*!Huxe|h`e9pA-M(wXHBSU2IV zU;-HQfKo*LOh5wahS=!zp@8p6eQ8s`;=D@BgVK?7l&Eq%r#AJ~XL!WiD5^4g)*F3t zsS0zoSYigEyMJ1p+x8bM!u;>3{8UM_4F`(_#>-jr{7L2-Nn0^B15l$>G2*x zKffAAzEu27<6M~ep_gO?sG0)GQ8Vq8 znWZenNv1LR9W8rWabOV0P zsw?kMjo8(eWCN6D1euP|j_2{9!s5frb0>ynddXx&f^ljX8bVsb^yO;grn2-yCr21j z%r1n5f=M-=1o|gD2>&ul!~A!P7A6z4V=iK&DNt)MiFEF@jC1 zB1N=z>v0R!vw~DENl(9d!%<0lvEHv_G1+;9U=>IMDroESQS z=esjpZ%W8)Q91A%F>U4vC@+&Y_P}+Yiz!q%b~VPBY2$1i)E5>2iT(BAW;W6!n1YLRk%o6jqS2U) zg&bB1P=+Eg4;GN056kU~_pmA04{?n2Ng{tLZghrUffGJ#(eh3oO}ysT?UH_Iswo#K zMh=eh&;(It*f6l~Xi`QxMdUtujXo@Bv?FXuECb}oQ21k)(q_+u8YfvzX;F`>Tqk95)lT&oTe#E3LBS zP>>I1=IR4-3qyp|-APri5)%=1*?NGUS5S?lXR}qFXgzSSf!ozLv_QQ(FM;BoYkX^f`HMqs=d@X= z{@K}z*x_FgCx4WqK?~Khq#=6y>CGSB-9c>Keg5#n`onj3QmVQbJL^EJ;}pj#T#mqX z=M&bNgdyM~)`(nO@4zfXC9&NNq!~`cX zMYR<}SDyC56w?%Xxi7!aC&aCh_W_LWG5@NnOIll;RnRs1_TYKdC)*82Puu)}6Lj^h z8@!82*jJwJDe^rX>6CHBcSmowj|5Y9KlS1K@#0yX3#)>tFFY+Htx)$AY(eJg>=pXl z*Ey~<%|(c^Vl9X5bd0&TWT*xiM5$14EYlSN(w%5=@8$if(vmYu&bw|CRsz_M9tTAnG}31 z@hFO9tIE(~y)stRWnHGAyscqq89T$<}n);E1; zK?cA`+0(^dQhNY_WdpWuvYjzz{stk9zK*s1Pi%j;ub!`^WE{-})B;knJgk~5LDS&x zhH=r+og;|cuvEZOXUT()IO{GRXB-W0Pcc7{zKq+%^=>B!=lP~qyM<$>IVf8dzXDk` zLkXsj@@J)(*0XypVp=pmBgFyuAz5YL(2-X{^&$#Ia!|OsMkevi^OkGu!gZUIg!y{H zNY(4@YX~9h>A;#j0p7NO+JR7dBDQmoV0wq9#S)D4avA|D2Gs5nJYw_UPk6Y)<;2_o>-4R8&|CV{6sxI36Iqou5H} z-Q*wZ)!o9Y_b`-A5S+0}i7;*aSaw0SFwj6P#R(w|3OKUTvKJ)C^FRRVtAgXo*5u^J ziCpF3R<$xjjKptYuZ>hz`b3V}SbrE{pdx3wa&t^Z33QP!kDo#;P zsG|(#@@80?NDRuwnNCzuf;hefdk>Km(V@qzDJs4=u%zT5pU&#So%ni|7+<^6kYkO5 z{vuO1qE$BC>>vTKg>=u7CtJn)(#hnBj^|!>@$u>N#uTs+|0AmzRFb`#3ECnnm=?Xr z5D-V2X+KO}*kdwtjsPy937L@hs2%iNK5+J%!lSFO9Tm|~th5USk(t`Fhx_oi!)K$D zXQQXj&dyGrJROeC?!JDqU^;oY5KIo&S988#2V7byJ5sdjz1ECp5(%o6E07JaVGUH2 zl55+iJKJ$mwlBs~9Ke}^6%G&;5BtYqFdo&~8}llH$n}kFG9>tNGwRD5q&o&P>Qm@G zT@6rJ7gcP&*&s*(EoQ+jN%cs)RnTsYU>-jl3PMKfL`H-hBdtn7Iu3j4VL+Xn)?UV4np~3FYWxc|%nI zGy;>fcgCe&w?L&X(227KBg2K_}K?Vv%WF|8K93vSmd8P)W=_0aFk8Ey(q=#~N;X8^YJJu^L-gbEck{5}X z)0Kuw73ifbBU1)4w(c1nupS!39VXfo;FTiELA_t1{%ENSB~9>V-7kg&2hjHJ&3Au` zdiLd-NHfQ(@9Hso^Z8BcRd)Mo5P?JkWbgd$!}sISAKrd8YcZ?cvl8mw_9yDex(dt~ zOBj{vS=6RTu%79cWsmi?xf*_?krRyK0A!e$qpn*Uz_43{jHcdg%GJT&Aj$Ahg{MQ| zni}*8rYc1E!Cq78$2-up(8%~YVqBSxj((-i(;`!Z>1q4o9urW{;qk$!^GR41`He?h=V{SSy8;esYe_&kcd3vMk z`;z{mREZ~;zPAvn^E+ltqWF zNkkaGM+i^6V(E_N+gqr<{&2XOzg#WP={gHt`T?cD0^_L#rv!gKLTZy2rCxNy~Q`&DhQdVh<{H0uloZx=mUy@#>(BtX}f6eR%`a z+qsAkP~h1N^Vh(y@DmM{kI=-56yP50d@gTSjV+}y53a!IzAk#Hc(5{hVAQNuPY2yt z?kxC=*KA({)D1?PwND_{72Xb&g_wri(tXw}yAT9TldiKHJQ)5$KVdrKbZOJ>CpjNv z8L;syhUYlr+a+6#7wnVgBbd-qYpdOCRjW=6A2{`7P$86vPu>6Rhr8L`9|ymFWO*zo z7W%osBzTxeNDj?NI8o3qB&f!qO=kfQ74OE4GrO6r=;OgC`Ec9rZ#VKC++(jIF$43r z8_($F%l$$V8&iLKPByD1XEjU@^Di4Bg$|-dS{+{t&F_!wmMz5;9%i6!fN1adl$iX7 z#_KEQD1I_88L$FKl)52;BXYLh*9*JPo=c1-+esn?*5-Icke&Hee;f1x>hk*8=r&COc$`)470wS$AN{yzkMfG_`TSvR(H}QImeG= zMhl<}BBp}X2eEO1H0T~WlnIYqBtSpus9?^5R*L^#uU^YQTeS#DVrSVw#4>tC{Ebo` z$z61}g3=v{^{)53-&eeO7piYSF+imjc9b8$SGj2t!@o=ZeSw}nJH*cn)FbzAzrXwN z<+JYlW(IEV8!~R9DEU&~R54aclVNr2pxeQ@x;~y6rVkwB9AP~9P^gD#Fpctt2cNX9 z%;7XaIcew>nl?oGyWEO%9>j1vbGDF-xM+!cC|AUUU$viIj=;F%yOT5$2Sy9lXdJbv z^@J&H7RB^i6gb_3dpJuB4l=AgpbVta z1!LghTB|OaIGY@bc+A+KvfJ}*DPQ3XVILQ~b9#oae|LrS6UN}N=r&Xs2!}#47}B$R ztr-$c-DB`r&=nG{mNIV()2R56B03Fw58AjF>7yJekMy!9P&37Y7LItW7#i(90b1=N zisTNg!e<<@SPzd5H59ideYLiB*o30e8+An5wr1S*Olf|h+qf3FjzTNFv{3&BH#Sf+ zwwb&FUw611^t4Hb>r!!e?0Cr~@_iYi$NHvXj6^rdU<1?*fo9=3tt{$k*Ho?gR89oT za-5q41hz0{$8?RAn5hE-WPY<9jSTzcnCw}wDn~@$*2E9xz^Z`eH=rOItS*nbGOi|? zG(Oi^yw1LyW-rL?`fOVhdX`R=i^Q2TWgcW#PT=wikxDjfX7<8sEandSEj(kOXf9*d zvEiI=FW5G3$&4GFpN1%E!f_UQAnv9F(%^U&P^o5faI9j>(LR-|(-dN_R~qamBjX1LUQ5;ceZf-;3(CcRs`Nm^;H3)f`mIH6txXYQOvU!;!= z9l<$f*Um5YlD4+Q@?Q`GY4?&f1XG%K!m^g+OZCuG+R*R*94`-cfBUq5i_jsQY0$x7->==g;8nKC z3naY{6R(WgJ*K&Ht*%J3Gc6@nJw8oXHFX_56F!6Yw)`({sH~dwDfGC%q`$t@1};Rq zFyF$olCjL5t75a=Q)sTeS&sC{n2=Vcrv6UwI1A=AmZKODUBdAeM@7Up5TYj^4j0%) zZdKXO!5@I@1LL}fiSK59J6S>VRd5Njn?ZG@>8QEgoH-7)u+vF0MJN{P>dbDCU@}K# z)!t<>15Mv*21EPiRm`f>h=Pc>Yg}R;+_fFz%%& zwyWn+kmmYkJ4N*xR{?Z7Qw?B`nPoz#oQ-f`k{6m<&YtmA zC>%)I0=?)}0Soh($m#RL(j{1o!vA#(lL{#67oMhP~nc%+ja02Rgr8R_BWaE0oP{5f&W zM%$c`akGEL;1c{%dEv^+6jNKKx@Ce@y$o~*R!y84aKh+BrnjItv8dtqNF3wv#QeD* z9av}==?fOxTa1P7YI90XuM72oh8GnVzp_?kO)>ndIPFE`i?`6k1qe2Ea9t=#4f1-m zgI)kWR#ma4obk zlHb3MVkg zEWPesNH?$5_S6jsCd7yNX~Zwa8}MhO5gNodj`(W?M7pjUN>8u0Q$EhweSf&|`IZ2L2nw+>5eQEl6hko=iNFJHuKE z;=7){7IhRq#LZ`%kNJs;3fa#qBSc6BZnS_qxTljonykzY?l&Nk7|C!auDWc{N2OHs zkBe0Fj}wOhO1{`%!uD1R5|O|Do_A%M~X`4|@4SI}1Gk|b5lx2RJh z=GuE_YTyp((@U&pal*-mU5)w>ql~LPb|I^UZU^}%@aN6P@8t*p1s66tH87AK#t^%l-}=($0;M=W_}pUQ95GP$Vd>ws3CD>BR~j5p{O2841ydp5+NCJP|p<*#dvZ=DL_mQ9yIn zyGAM|Fh8YXVPF$pblPA9B34sgA_ihw{{1r zdlG4#kcqq0zw!Br|Lf~y0|fe+%Q&TvV;ouBj>107K2M)h;1w$hJ7rCWj46L)-b8|0 z(l{w9!{6IWQwEXbZ5gBixk-^q$Rehrj_CN~AK?N_g*w!=K6nUL?ch%lB*J+4N^soU zlzI+?2BZO$B#|UIDvLOkv?d`rF~rz#Wb}icS9@&;CYF4xPYj>NZC;2v;IO{?F!)cP zKRB1<$@uyEA3omwdjw+q&jFP%^l-%kOzj8~{gq5@Aw=@A&|dz}LAsSk+Rwe|<_aE+ zvxjys9#T5Gx}NBIwtLypS=O*>#>6dJ9y$Ju!MYzS_xTyyjSSLQ2UA^b8RU9ct05>%*}HKhOQT3@AGvo&Gs`9gEcGk-cf#m~1-jh1<3qo+olP1xwoKNTQ-F6{!ekiemM zSmAU9P}gQueTg*k2rW9aloKFjLC1c5wOEpT<0?ymh@gn9d5EHb7J9jOO$uRHOYR7P z6WjtJt_{JeSJ#lf7+leLFjQuAFTmTtS;MGK8G5oj{78HFbmK+g{X$c3hY7Khjvga= zlcNAKw2oj#wzu<8Gm!m9C-C_5_sk1moj<()3=f*^9shm%;eEUc0wXXIGEI5p`Y;kq zQ*3W1Ipdc?5q`73h8kJSYSm(kY<$?rh13;A{|Nf*)Vz@VnhwPfIJso# z?)Pb9xL4A?8bcdAiSewmy~~Im>0GBh0gEMo21zzL0bZU6^UB zpcSD0#KDv&Qf>BbN%nJioS}g84C33*t>RwYB3|K&T5c-sQiQoHp?Jay2ycnL4vgR8 zL|~G@xl!nQae#DrGk>Um>F71Q86bPKUwdY02cmt9Sy7ce-;=A=!wt?dd5GB$D2D~R zy0+`TV;^{*019fqdHB7?Ezz zuLQUK5$T5`z4Uc7c!p`uJLt~Mag|=M#)-u8?HXfT2iS$yhM4eD*AArx&yYS9 zYz;7)<(z7t+#fzhp1!Z9SHU|roiZY2Ufyx3XhPp#+x&SaGy5@971<-JkA+z@(qwwBCW5sMwRtbxeew}|Yu-3q<-$x!H4S4?0;-kkcjKTKa&mGC zcDtZSE%Q`?^f2va6Lt$_NK&1EubM&a;~E`T=yaeNgSoLlW%#eLPmq+!N$NGWZ`v_c zAU%n*JBQZ;%2-@zs^da?Kqx3-V|5+{$HpwBWYRZC0NSZxH$@4*V7plFp)IT%^e`hk zT7Hb%)qO*%(hEoc*lwB)uu>a@$)_|Sr*>o~Wny@C`Zi9NdMA-KNiJ}d$nt@3lfDx! z8c6Sz#JY}5I+~hTr>s_{z;+u+fp(b83S>(WN>@)dkS;Yqt%x@{t&Xb<_mt}*wUA6? zb{90WpPO4SC-iKl1m_7(u&^M#p7q3sNme!WHU1-ahuDeDg|9%QW@UA%zp;hdXPVB& zi+=ir21%MoS26euDTP)`FH4wkGSP0R)2Us6#E6dq$P%e>%JxV{swhKmX84(}wX}-* zhP>EiTQPCG13kx)q%5pnBx*?n=DmY|sWW2nCZ)roQJs26cuYYoSE79+=7OH0zD)A~ zCq%I6mVvWm8FX$GFwH|ne9Yks=ioxb=PZa%mZ4x_?-cn((}M|=wNi&^BTuJ`fs@Di z#EgAtvdOC~!9@TSnd-DC_(9=h!4RCJ){J9Tt@_&NkF2JuV{%~TB-7!Xo;*X2MoBa< zJY=H-x3o{hnADvzSkELSm?kMsTv(5l1{V@CbW2jZS%XF+3WF0qs!W_#!c`ZlMTN9Oz*tR%}Z+B1Jaf%k#Qb^R0O@o^w<(PZdfl zczx~@PnL~Y!|4cya9YC>h5o${AfY;*_9LKH#b~)FrGLRDtEW8q(_Q3R~Wim8-RjJVT z0}8i6h9!|R1e3^ry{5s5Kd<+fFdXzXcDC(w{|bqoI{Vg|wRA*a#sqlr7t{)!eEaQ} z@4viz^VyOZc7Ti;h&iU~A!+vI6{?e5UgQ_m?FEupJZ*1q7SalEr|HBmC=i}c2auP~ zxh3)&s%E`_@)_Luz}-w%@&UmlQqmWR;DKaCy=p$N0cypJK>@M4p0&Qe6-b@2pOm<0 zbhw_LF4{P;7OGo-98?LJTKVM1Q`qzH{|OY`O?R6Eh$&0VC#BWAJT8 zwA|6XK1Mx;+bNl8gp800$zA9xH?ZL!MOetfDOv-n<^LSK{bLisv7&(+CnPb7cg$yx zpn(2(_xa1m_iCg@lRDtLcc1P6DWCZD@9gg4X7>Ew%8P)_Se{6}@CXOTuh@aEw@P?f zchanv=&?RL)fVTZGg(RvQ};r}IU1A~!nO1wPxGN&P-9kamy9x8)8($+2tt4WsdGFA z`E*cUZUx@}{9pp^cw1P8j&@A%M5!xSU|~(;TjD~W;|h0XqAvNhqS+pTJOs1(ExaqQ zKJJ+SfBF80FQ0{EAkYP+bl%p;rX~FsqS7~(4mEVTF3ewL5@2}{g9H{EB6Aqm{gAl*^8+>OLi71u(L{CP12Ie&c*9}U*B9q3Lf(a{1eXx|&4%AHB(#3)g>ProlN29ERh*~%^Jc}pRAU!WWD41GPFy(^=aB{#| z@03nImX1sDDa)(*=4xGdcJ=@@I)1ToKI5aXjn9#WEUb!N$Kp4}BdU|v3H`OSx=iTA z+x<@HmOXpeubC~%PP#Ddl9?JIFc21M+E7X5xX?8?O(?^q_PbH#9L1T9_SA7<1|qjA z_=Ua;YAzCbO1;$&4d>^6C~DLixv}Kwy?zD(($G0; z5{Nd}Tk^7Ht(+(4$#;^xng^#Z89bU3fK{w)lFk^8b8<2X;umr-UI`+ELyJ=gYyA*% z&nnqi++m=GX_VqFT+7{lQw>vh>agf4Y*}8@O9P?7`H^ud>1+eiQYM$Bh0?sGy zI%aBzaT_M6&6Z%gJO2#ls}B+Rao`(pCQknuEt8m+bf_@xc-%Fc?EpjIBQd!-sdrbP3rsoR9+ zngTyoJV#7i6>!@a3}LRcj&^ebYDgBBg)uSt*s@dPuLDls;UQDmc$dDL^jz^%fTcy6 zKEFU71NdNpWf@URb^wo-*$8KZ$WHcmw827f^fa)0R0L8&Sl>+26edLoBRjGBra9yi zY*>p3&#+K(VRKeyfJ~Q;(p{)t&X`PO5~l3e)yB0TVG>RO_QTUZ zn8Xc}Drghsmn#a{4eoHG(dt@t(b!9=VLS~7N0Sf~A95C^4~y5KaH2@?qtbh^laj7Cp1=(Xy_#HU$1!xO2%RGcsgst1=FY!va$3^~)Y zpz1l55()EzFG1u+akx^prgR|L7JV~BRVdDyG%UYR9X<&Pf$mk%A*&_tx83mUXXFcuKajL*hb$kNzx&`vMR-?5$lo}5$AWwnF zy$zYoPMR~HHaj#&E|tcWum^n30fE#E<~1!9(En7zTHSiRgRTy=&W=t{caj=Wyaigh5RYimW_ap#!MaNmT4-}m zDwd`TEpIvv(|-L$NTDY3jnEnJ6B{Goej$_ylNM`BnGZZ^jjwP6%^>NKQfTZDUA=>n*^rx3ZIQ!cP*}bK}|K3 zP|cqZgqc)L7J551_OsQ{^!mxWHB=J3qXg^a{95SNn8>l61aDS1+Zfb9u;8Gfrm>Ht z+rNhPsPt?^3Mz6?%+LaX>fZ*|6K95El8_t(iP>JG9*12|&^NWc+=VL^I3g5G4+`KR zkJ%%PFbz#87e~R9>L_?(=Y-6(+DYPUbVF|2vXO2+YDcO!MgkyT-9!5$nJIokYD&G# z_GD61ADot{ILYlSimFn6G`Yq(_yug{>1YFvvs{M`P@kNN18lC5?Gs5SL;?`{DE5@Q z2sK?!LSK(lg1)ITvQ|fKLGHRhosr?G+sm?LpazxqA?jo1ddM@D%am^Z0XZ?JkY&aJ zOJqEG)|1G1^6Vb*e(o_&Nxft;Cal*O4_Wvi_rZ;g+Ji3B6o<22 ziyxIConK2p&9gSXg+u0LG2W#DsWZ6;294pQfvcC~56letH}C**xE}oK-Me4;&IIPH z>DEw5Nw!HHlt}2M@W% zA@7YN`+U8!9dNO_cIZSVP{`CgXRx*Kgd?1gN&u?bhMne+oTfwYQ1v@?&<9BG3%Y@I znqnP1a8CxeEY)mrl<2dxtGTH(#i(5aKi}>4daI4rw82LXrb`%c6A_6`?glYEF?p@J z_lkRP$5ozQV7w-w|0GU8eN<*7rL|AqQZ6Z1!j3G@wX|c#Xx!?yXifxDryh_(aI=$a zm##EE@hou4xTy>Vxm9BljzoG9j~h&vdW_Dt%-cP^kF|5_D@6$g8sB3A?(d-U1-kC}_>0oSnv!RPKaLCdTKIJylhNPqI2gJ#=SODxJS4!lIIL}Bf@xH8#(D$QFfAxI>fCTYbjE0! zAhZvSadJQI)-0y}38tsUDQZdcs4mgE(423}!X;($IdDzas~hrHTIIS4ed!v0L?mlL z!XVcv^&1wbQ7U-jg^RP!ASkmKH^m$?J>T56q^bhxE473CA+4BQ!_?gnfBx~!r@O-r z%)p0_HspwYep;=Sh*t*b37ToLq(iK#T%n=F{QSrqHaNAs39PH(`Ak!qE+4cpvbW#` z5S1s!RqG?Z5UKzu3n_EJ8w53ySSRGEM33$4^2B5bb3`t#MJ|Fl1*bk8*S5+Alx7d^ z(*8&}7MNbZzVc=RHjzrmh#P>RB%1-NG$|Dp#wUd6YVj=&(bF7fc%(6j+Fa*a z+xTE}`I^z-@JzDuZ4GiTB-!{eR=|Au=FfLGKTK7d9cBS>OsqHsUE%Zj4a%axJ%BC? za;dLXIa8GCB@L-sIjo{K4uh_15|!)bctCb|=&grH)Q^9ne+o#EL5!UC?#I+e(?L!x zVo)Ia4G|n;9N+Z0)M4HxbS#J+MEBCrQbY9Ma{UV)wmo?uNnJoex!fU-opx7yEERAU z6+lc_V^*wEp{6i7A^|lBzHJJuC+{CpOOj@c&h!}3-Pqb&*8rlW{Nq%=B`ay+FK>0~ zOW86sxCxjh2D@}2M@rQ_s!e1ilMUVR2d3F(4@ z%>BrB%%TdO#vk)%IUa*1g%SG(#U$pp@VJRwdEspd_ghxtBwZ+J8ds(OWn97Hf`g=? zy54a@qzu#zrl3YJ>wG&|!3k@XPKjd>3FsXUGj~5j^xStMMx73DK_d{J=wx8PB5xOP zLQlW7H?@AArLh@%1xhH$s1`bz^>j`kb&k1i5``K6VQiri7{i71R}gghHl6n`FN#b} z#?d6DyPr)eLfjlqTR32Ma%r*6ly&CA(kmeZNTV+38pKD~(IEJgge^5{_FQQK1K*Y! zF(^KSGI)|5pegs3(&u5*cowQLf;uv$TKeu0&{iH)hQ7Jc-b9n0=Px+t!JuQXq#Cm9 zb$X zTlO&bVqKXGy2PLsrbqw3?7az?Tt{^_+?EW+fNih=W7fttAYmk?w^@vhJ<~HIjWwIP zXC#>=Y#{{r2;Y0& z^VYppw|m4A=YRhHe>~44yV^WxqvzIkdP-uI62mN+;X3So|C##fB}U< za*Oey5m#ncN$n+=^%bQm%Yl&M7x;TXu_1E;Io8HK4_eP0n=Di9(J_S3N0j=A?`dHg z*zA$;X+c^pEhS=4-1Q17N6?picSD_HU~-_%zH&61r ztSKl-H(ob%gRwQviXf&cMyN^i;`T1)@m-|x5FeoivlBbWPqU#aW(&mOA1HtbLKqF$ zO&7F{+Wu{2kMSfJa+_>S<&fq)ieYWUPfU+Y9 zMaQuFb$1z&)YO_H%jLH^pOI*z1J7!0*C)I0W;l>_AhvJ_I#8tFA%kBPGJ9;6$#Q1l zt2QjgnuF-WRa(b5<-YIXmpQ=a`F1+SBcmjagou-ncD3R(hNVS&;8bd3<1yI|AvngwL7FMw4UT*u!y_bAUj_sIfE-Dy;n`(gIgE`}FH(l}im}o?0`N`J5^P>w3h?cvs zk^N?p&AZ$}3|f>duy^6bO@t9L)9);ww~b<>V+NTZM0U20ZG1+jw?LKDU2k4}|Ea@= z9gnuJg#D6*vDjKJ+_DAXDU?%9eU8&i34i@2euAVfhK4O_SZ14#@(Na#2Sr)I|| z_PJott}z)VlSS2^ha`G3Or-2WMj3KvykuYF^b@z!PtWL~dflBJ`kIA@EEaZ~4ICvi zhp@U%>a|E2cWE_G@@ObA1tq~4j#?i;KbiyA<%!k|5+>8xnJx^kk4`wruGsk=Mz}0g zbR~p}u8=0Cm-zJ?ZaY0JS7l79B^@mc_KmRx8Dj>lAjXQ%18n56lN#H=W--fDs~Edr z_NVmhZjH|FzzM@i5`7mu^Q34@L|Z+%dDqD0Rcl*Fv7&)uz|B5{ht(25~1w>h1-or8_ zjHF=fAa|AzHVYxerVd?=Z6I7=_Aa)ka%Z#X8q3cWn@>P?;5 z^!P%U=d!X9>w^)Y-pOt$=JJ-n$0(9yc#Dp+F6L%U(wf35GzG&et9(fCYv`d}<)YrV zpOdW68zzy1*om#0xpmo0_iD6~tqE6`X@_LD)VByL(-Tl5(13h!6e4P<0Be)^jb)Xw(Ue8f z!HzW3sB@D<4jdHOdcKD<*L7AaP~Qp-zJ@butTcPWWEMEjmOMCuBbkXT=$}j~Tnd!) z>R`shLTiiK)NFanHW)={?X^qLKrNNGmFcBmT@)SV1v6sucB19#qqujI@P)1Cu!4X2Sudd_I#CT&5BdA^Oh2x7(Q!K+giv zH@{?tpl<40s}2ng`;h?Q5IyedebvZT-op8LRwUSJaEs(560~r9v@DTg@jAafA9-lG zL^AOU&?URY2@|#qHW=+Qj81H^|0tmI9}rT6Y((UlpWADeM=U}|q@F^lO>EdNgd>LI z9?GZyJ0vT?K1#lAcq5uiulo2LP+qWweAvG&7_G><4UcwG;E%W2Wo$DTpg8_1Lg(2P zhQe}fF1<7gp1V_sD$qH+0tWvhDSt(TOySbE!oYzJ=fF|r4n)aF-s zG{yuUJ(NG%PA9u5A0294*{Ig|BINbHRw4ysBNwNktf?8LAJ7pIfu4C5d)Nk*ks@=h z0TY~sH)bSTpQ6Dvz)845-0IXnhJI$a>TF&Wf?Q+SrU&xI^SNKP2owf6!u`07vqDkU zY2=EhBE|x?e~SnT1o_uA1n5g3p9nOJ5OUMgyTVj9%GHF8hM`H4O*+On`lW2qvv07~ z5z>KtHRV@?tDNVNS`?N;*%)RUx%RQv*Ni;NV|zQ7kKI0cC_fm_I!T;!p8~wm?DN`; z3=PfL9E%~vjxPx zpMh>B?DnHe*(fq=`2}vt_$$9oJ9_2#@9>TAZ`3J7d#50oGOLqnG=dk|Vu!^|R7YAd+E71|6S){WxuGx@Es>o3Nizy4GWyqV31_Q z*+e)om?~1x#Zeh9K~S^U4mng0z=*gqobB{da}lFn%4dDT)@&macT6?x&XQboKMmhc zKnnWib7N;RyotR#Vn52zShnBcNOAo1#wXpPAlF@^klLcIiZ_tRPQH`)BzacV(Q$AOfX4A8udtfM{ zYQX6a^VC$$#$L2x7j2P~rpHEMgJCwoVQ7)IF#3oOR&lz{hkR}njy4mBB$_1I1Q0s!9J3`q^4yM^ zy*HDp6Bub@^ST@EBR!k9Jd0mKVm^;a+_HclRGuq>x#42KE3LQPL|8RG;yaF8@UK1Up zY3Is7gtfp>TNGTC?TiwsnepvbS$$7-BI-)atHu4_w=|K}q&2Efr^%EDo4UdPgVWn*q^Iy4R^j z2HN@2fJQzUaKOfHFa3DV$R?iXo)a^P@H`tmxc`W0Zj5a~g?9%j(Ih#1VlnWJb zvn`!!%rLb((o(FPlz)Uxt!m(h8+k30;d3}d;lzI9FE(P6s8VPK5(x*9=F*zVOm`_ zKe59tgq7g;gx(svd;v?Fsq$g*B)-BGB36Ro;4d)dy19r*dq8X&c#z6`bNm-|LJ9oQ zWH@snSu#WJPCICU?=;UZ(D|a>Vlgit#vbFQ$iZ<8hb$JhC6ATcJO&VK|Wmw zJwOT60L6HPzB$1}wzwngAMY}lS5-J*gT1nK8om=G7;3Iv<7@~0&b!NH0#$9ZtEOII z&*JPEJgkLnDOw-r0q>)wnN~C|f*b)v6I#pmE_i)qN00DA{xZc*2z~%rk|o?( z3;}0R;U;3$U2a#?y<=|?4vjFU%~HsiG05%^Nivp3_bo6LD!pSaYQnm^M1LAASlB;DG*aI1H5Qk9D zgjyC|&c+?ssV3NsR=iHzbz1sbX3k@hNwet#fp#B>x?SZ$QS%5w5eHJ<3mAANOps8?SE;m0%J4~=pb$T&k0$}^#UX1$98gqAqJVdWk zA5(0`H6a|uVD{hkg`7N@rDLvobH0q!CBFz$Ih5xn8bMAW`$aGs*dIc{G;7X9;}pg9 z%ke>K@qLWCSVb@ynP7z#?ln0WCt6`CgiJDhc)KH1Wb9{yCd4X6Tq`>_$c!)|c}9}U zM(2d^(6Qbau5U#fRySDii&_40QS>7AcBbs**G9Q~tCQ_uIU0^P%F=9=%&BW}cGoP9 z&RYu0EW*sv8FQ(a!B|2~9K3;?a3)AP^u|E;lkB`USf~)LW)iEexsIaU)NHJ3oXJ}_ zR$VNe7^)*;bdr^~afqr~W1mEZF^Y{LUW??;-nlcI+yg_$owR%CNRmB!h$a;82w8le z&-mZ~rS6c4W17d})K{uwM-grEcs~fHmTz z2DzB;XP#j3g_yyjCL%Tl0_3PQPoaC3VjZ&YC*j1IXvrGfo6CpVhvgwfxaUUmVbKiD z9Ngy-?P3~o8}BMI)R934eDtt?Om`Z+*?i#=0=t4g+emrQn;As-=4UVqMO-mLj9NC& z&c16h1Xe0;4cVJ{CT|GeJ3fzP8&`sx1bjrue@u^IAKkMPF>li(o6oX=WVW4D@$aeT zvnunC^BJG9^M%2}IiF|xGa(U`z)@B{S&F^SZ<3#m6RF^|gBc6P*v^t_W6gv?>JC^E zn<^x^6f_Lsgs5Rx6N!>>^yJLG;!eqa)vB8r!_}}&C2cdC8S!Hf_w0_GXrzcuGx?EW z%$NwExy$Blx%U!3x8Qg&H{Y6TmMaZ>XlB5d3uH2?HV-;i$-9F|J#KuWIR$SoG>XN1 zuMGJj>=X*VvK$drV_33*5}#%;21cJn%qrjcWN`iSJ7MF?APk=1tJt}bsYJs38#z$W z3E1a|)>blG+BDn8MRCJSX+6I&*+=s-D_|o9R*TqQ>}&1jP{~rv4WqM zV?J_mwQ*@8Y-1%{Sd9fP3@~5Id-JnKD}?_^Ru*gOVm@yqN%9$#iF#vsM95;{;wl`$=Frl|Ltg>Exe z%1EUN`oXCt?fYG1#SvT^<%ajeMI6JS7&*q{uiUTlYu`tPIrr0T#FXsC5%?}p)Tyoop2yaYHl;+sv zVx4Jjvd8w-+(;@G){*g1%to_$H~+FsN0(gXD@<9Gsw22=7q13>kj!tZ)kDQHP8*yu zv-yodDrV%bJvP0o=e9ltcq8eOL{bvFh7@a^?CyIOzG!prd6eT&UNb&}<3G4I!VPR!9owq3PZ_et7=Kb=~#xBiH!}beZJaU0maQ z%sB`HPH3awH{a))d|b7+qXCim8gPT&Mj&A9>rnmjmh58iKLGu+j0-G?jz3Bv$IAS8 zCD>Bwpd4^@LpDfVC8Oc6un)!r_|Fsod~YTdaw&2yUbdqPe3~R$A6#bNp}}zWD`dX| z*zQ35;(v(o#M;S2*Q=@otD3ON7@6ibvNV4gpD+SW8FLQ2fz7-~_hU(0a&nt{@Wr+V zYHqX%%JVrkoL^kPPIaM$SZ=XQwvff*`~>M*`^Evt@>o1hc1xUyOZq5VfORNJnkwjntP&r~xH+%2+!$3ktFg%V)>ZLZk|d zw8W~cC!05U1e=+0%Ge={m=AYJ64aZ|+rlCh4mldfp>`Mt{V!)N?`Obe?XC^2wO7dD z!{vO5tpy^Dj7~33gh(x0wp16(7OsU?w?d%+|G|)n>lp1hKW5=N+q*mlsBvLRvoh9n zXeC@83w_FvJ*Id<$BrFeKYDDsdwBn`E0-z@>z%_#!8}qEWtoc*ks~D14mkc)Kp$q? zlM^i$OvEc(Q5Koy@e_;ttgx2~`zv-siQ)!QP79_i!5hsCxIh}uYZ(c>SA@Sg zb}0cWu#@&d=3Ia$T-qm9$W8amZh;Iw2#P3clHrP|aj&CL}}f0**yT zXVPr{n{ZC~iRoN2hb$JIeI^W8pr>1yPkEd)M+3z<1+&r_ogLkaIkQj9Lww1Oq9M_O zxRlZFFhq<{ZgJqgJN(3qV^Ir|CvrMG2KvpNgX`<1*;azhE$$%1+lCi_*v|Y2KwQc- zL-OQaHP7SU)oIi~lp+5ZGOUAW9Ud<8Kd$erWp&Cp7!Z!woO zX4^-K-<-n4gefhMe=0audavm8hAhe2_>gxqQCNX3+95oV<)~j`NmfD!Tu4P4Qp{H` z@KuUiBSS}WS|Bo%q_oGlnSfcL1<;x{@xCHeDq>$bFQ@=VJ}{}&4$&rcC!R zESc@QeKXl8odG%y4};!)v<0tC3$W>|vKtuRSv=2Tw(RdLq9-XG0z^VigslX$`rO7O z$MeLwd>f{3WKLn0R$FL&$%(69n74&8c0N1fUi2xETWrZr(PZH?jHfcOzOk8FPbt>W z*=|rFlLJgvo!;?W*Fc%go+dj>8Rwm41RxvQ9xb7_9ACh53E;H2v4=hSwm09IElp=R zXoXZhF6H{#caxaqu^Q=w_T4yJ#J`xf8$Lp{Ea@X3X29g_^Xe4r22> zoy{||0vsJ{?RNT~r92;b;M>uyh(&EZX(K0GaGuP)rSMr=lmpkm6)DSPjRMgz!(5Zq zLblEzEa`H-Q7N?s4&RuvRWsZCr|8s57FRTqoIbL20=d+)% zP;dY{VWHp+cEUozHSC0i>a;J+B62_wLtPUZLuR8c{DQXM4#tBOTWY}_hKAOZ)SjCy zip`81E6vw-seJUxBkRY?#}CU76XD041BZBZswkEu1MV4oR=VhgWBiQ%*&^sNrF=1P z@8T#TpI8|i?D8#+GRd}J7XZUMa6VGUn@M^8K&?K(yF&V-)V;#|ZY<=Iy~LJy6Bg(` zI#}5L+V*PLnDFFnNStsS*bF9dAVpAeE)-k8j5}tg-m`F`zg~O78$%^E^iTuW~DNjXuMx^CkVIm zOATn;UL2f9pO}{z^f{^wO1Yq^vv4h(Y%^eWaGXth z!op%K&S&P)c`g*MCUZ*iGwD+n0*&hCjW#vKQmi=++D5IRCBETUcXVZi^vv`n&OPDC zx`dkwX|{JtC(!74V0nvam82lFK5dWX5?z;H6f#*0(^yU!vjxG#czX{VK)oV}O<)8! zoFye@+-MlRHgOt2?6qm?5ql@BIy1MIv{I^;`&LXPcHp_oZuWBrdjCi083gL?|l@F0t6I_!``E+3x@=Y8>*u*&e&6 zD2HD}X|ivP`^k~xoG|z>{UD*u8F@?bwORspVu!WG{v(&^Ka7>YT+A&+1M9d!c3>Je z$PN($Hpm{9Y-5A$%HWCf2Y=4vE7hO#0<6C$enX>D1ux4LCbu-rMROW|z4`1iUe3-S zE3QJtT;5`&c47x8u!7sU5hM0LP)r3~@sM=I(=kt$n1hm0LO2$z4Xvf!;1%#A%p9$O zeT!(IQHB>;LsfsSF;vwVT@Y|^eVC2rZ0!@BXK4l%6r*b_m|u+%I#XW3Si^LMbe!Sg zQz5}|>Rd7jm^lT=b>nqnT?h?651cDuz};bMzdeG<4?OEnfYv6*En-FK6o zX1z75pmcw&ZV2;wn=!=2<==__iGUy+A(_o*ZXX&%5NY*(TH zCgIYO-)*}YkRI`pWd3CC;F~ay!0P#sPFR7=9wH>!_E^aynO&tvW;g6IyL?AVessf$ z0(Z7}H|j~)+RjWBW{Pc5$iN^HR`lD)1GuAbf(qTn5`S>x7?NCekanfE|6Q8Q4sjWD z(F#g9L1BBjUb|Y{D5QCOD2$exmqR~cE_JkdF&-niQnF5k`&YBGzS?Y$niH9ro!nZ+3}Cu>=4Iw#jliAffcOrQL&Dvc~t$cEa{JD|7C z$yWL4HiOIkHhkzm7DBldosVy(aj|f=ciV%C8|s&W?h9W zezvcW;MoxXSPdnWYn;QPoHs7q^^>nBmEe1sE6aPWM6{`Kx+ACM5I-;^d8bi4xY*#s zXW(;3jy+H2&vqLHy;%w72D1R18Z^2Kg9^GuY5gmeAYY11o9sof=MTXQG8R>X2(I1Y zd80nbjLtVuN6Yd&|B@DMxkOw{zmpO#!R2#;K%XCNUkLyBUS%`k9l!%OD%3#oA?FJ|1nR4`dhBp}7SXxvmGVh-`TQ9ny~ zmy#mRuOHdJ-Z`{1e&jd~>)Cr`eH9eLJSuEuTxi1BI!*G{BA;_&p(RaL63dRtP&u;m z@Gye0C&dP#(8jQCaZal9!?4)pi$Iq25r+*nq@znarsroMriHEQd=@{8yebF1SS-m6 zLy8Ybdt4F#2>{YOHnv^LMXorSzT9(#k6of%W9eYGbM%;v_$Ve7hb9UN#wVa1YPqH-#L&h`TpNiK!lF}Oslb>62u-mMov>Di$ymvy$yq$AQx&@rb86Bf0mm2E z*x6DtX)E<4&U}+XhCB!-U2f;p8uU@0Um1+}5O$_*B;#m#**cghBa(wcq@KVq5Nq$N z3w#ipAXn)Mon$#R>e1oXIQFC8eX)ilC8U}c|wYJp%yiH zniu{?h?Wv7 z#dURYGvM-9XAAF|XM3cu_eSfL>!?Mk3p_I_JJv$(9% z5Cp|S(mX~gvVxuyY#`l|k*#ffE!qh!(erv)-6&UG5hP0xq_{2GFTe2MPAxnsdqvU9 zK#0Yc=IQO=QF;6j?32uSdHcZP&RuGgKBEEa;4giO0EAyX)>@#f2%Wq2mowJNZaR^z zR;<)9Q+pf;562(LVv3n;gN*vd_K$WX!0b%E7fp;Fl}YOE$~1`4d0bACVm`;HLi=cU z7gEg67e$-clj)L~vmGZEfK0jo#3(B*0?c19^O+SDDP;1~SvgRBT%Ab3Q&miH@> z^g8|2&2`=GM-FDBjm3=FMKFz}EK2_9WEvqKQoboajxG7lY6$b`JRUX|K?IjsVznn1 zpzijJ5Cy`NM~qK9dEoGYqgSRj^L~wUB#-Chk&L4>2UF~x)Y^-_-mztUYx&#@*3T{D z2NoL>aV1AiMkAmn&xsBe73&XIs8~w(K?xr16K;^t%<}jVWC_vZ93+uHH?L4!%G-_}TfKPy;p2Gq zwzak6hgXgvM&`DoUE)z(TSb76IE~XWSFYN2{Ag!?w?s;t%D_3EO|nV-7KrWK#8^8E zLT!n>o94m8wJJ3iqbb4MFg168;F{RWSM zcE!e~GrMBf(-Q35ezt}6;`xJSS;%{(EY)Jp08-+5t;I|u(wu~Z%-m$WD*pw;USr256K@*SZI3@0TpIL;6Bsv1zA62eu!p_b;30Pp3DcIlYh+*Bf);w;3SVxT^O^1Mie9| zE@bk1_>mKI*7gHqz*y$$Jou;Pd>KVsCy-=1=}LGSCuX=&`$^7f_b}?Kat~Ro8pnDr zRmGMfUVVFWc@y8D&?T|H+V;}W$z${_?8Cx^vaU7s&&%UE)%sd6Mfoth0qeg2hfVBs zZCB1m$yzyx7I{Pi)^rQEo-gu#a)T~MR3KJ{55>xG*kop`b88C9fr#%mrZDrbn_9rx za}(zIlCJJyx!IsFTg)hfooZ3F{~LXkS;}H@BaNKeIQyt*ikRlHxbY+wD{pERG33(9 zC0Th@Ftrd2k+tGaHWa(nmjl_hD3Ry-KDfVBGt1*^j1r+rkicPwoYpDH^6v%Lio*Cb zc*9m{d6p;n_Q2`eBipS$_L&~hJj>=|`9YGQgUL&4QOM*CkeH-$^`$RPz(7>!6p zVAjp8ePfH02*Uy5h$!k{A>m#_Win1~9UX1hzl27mr(ose$>vmI+PuRY#k>j(Q5mZ^ zJRA{L0y`iUYeYjT4l%VAnFuftt_?Y`@-x^B#VrtB=9`Tug6X0l0wbb=O=e)k;%oWX z^I)YxlaFuI6MR#L?&O{#?c}~i_=L8Xfi zGRs+PspEjI9zoQu(NssG=Q`q++C0dUd<*;Ch6y_Y+eoK`P!7Ox1Lk`;?T@4}x{%k- z#i}88e@HRkne4sTejyf8WPJ)wRz}`D3MMa*bP>00sO@mJX|v_iClE*)Ox=pyUYf^; zh51IMZU6Fay;0?0g7Z{}1-1x#FgT{!-VslV;(;x;ckn!N%zDef=`*NSXdmdxbf#O) zmS+VL>dj^4u-|QE=BN^hj7MAAKDi~+O<~5^nLf~9f=|yvCwK-PoUJTwAJIR~b+&#; zf`BMf&?RF6C40z?N~!uV4BgmdG|oYlg26*;Z>H^#z%k9^qmAX`I$>usT9YzF3uOvltGUO%9@-c#01#Qdn$MdoQu%(vs;o zEQ|_-eq~sVnFx4%adg@^37l~hWMboVyXceQLtkE{F$2UgK2vF7O3YL<6CE{fA(J1K zTuXO=WPs`+paBgOgMA{K!bpOm9q>{15q`wxG)x*TN-@u=^N;A05jLNkkA=a;YRNvt zrWSZ*8#EZ{<{KeF6&IZ?%rNsA8v|y!xvz{6_+Zr_<|=k1tj-jw1y(9Hs;(bLoSfcE z?4@X>;shSh434g|X3kv795o9Giq@#vUSR@`s9X1PwtgyL;foCpO(F1 zA-qg7fu(LJaLf?*ql-j8^k~iA*iS_j(>rEWo#{t7Q&^Ypx>E_E#WKCi*wq zBbXzZJhVR*D->eIYygKyagntQ>njuLzB2tRFaJESB^=g$wU2qGI>AVs#zMXasrDH) zk3=}OK7$6`1m+#WSd0~Nhhz;AGQqjS+OYG6V=!$UYsuh2_P=%>5tN978%ooAGqVU| z)>SZ=#z%l@j62W|OyzY`=&}KwlZTZ$FW17b#aOlw?;d|13Gyyp-D1#7k<&sfE>e8k z^Fe!yBL|E!Who8|zFj0SF>a1F`LLAFQm_;CxZSxx4sGCr+&|U6DHyZBt=eMU(L7lr zO~N_xHT??WF=~|{*aNNRvl&AY-AR!RTr{fW(M*10iTrzf`aqJ(uL~*WiyX;d0<17K z86=F6(F9$*jt9W5OR88D*}bvjOEkK%F1GmUYJnk_;q<0@jeg5 z;61k9?HsyE9~x?k-~%^(O>feNhMHD-YFdH)#Q(5OZ_7CG}ILCdWGJv zVn6ynY}1?cp`oUO{~I;k=%LBXtt|~XIa(N>2J2`%oqL%_X_A((s&hLAdAF(4EW@@p zvE5Nnw1pz1ceee8NFO$FS}|M#>cX@v(l+E>5o6;g6%PdlCF3Y_aV2OacE9pY3i-a` z1oeD>xr?+8Iwd6L9ZbN6w25ms^8Ajh3%nS=5X%I<5cW8&<}8+z%*#pXoO&yIOky~I zWf&f0+$bgXL)PYn9J%e!Gh(ns^b4Zgs)ZUXe#$J)TZhyTys$TQsJpJSRs}I@OF{2) zv1~0I6JU#CxUjQR++?2i?`^ zJp2jg%J7|M?ZmH$VWfAGHe^+X(}e)t$5rOH#)pc*&GqJK{YRY6MFBLR*So@46n!sV;34_!lY?LKX&wiIXN^|D_ z=4NK*W<7|&DD3CU^z)VL)eN*};aP@PHE*<-?-Quls1oMI*Y- za*^3&YhN(-w$9`bDYEuMQ2Im}P~S54I4(0>MSC}>>U5$QqUgsj^L-q?u2|}C+Lh(8 zctld#*e9h^p^(WNGU0J1u@ZkDWn=|;Y*0HoGN?@rgtjWi%{O6YrI$)==Np%h$45~W z2hZ`jwpL8rc!=oL;F>4D6-uEjWlttqQ@W8NGA`ljXaFUou`O6eUI=4~h z53;R;?ntsxELVOcroRftV)Y;yka2@Xa3A}ID2G*M6f+Cr0$-fnAr5S1knuHNJXDbLVW{x-EKnjVmXq9Nor%_-8k_qQth7{jz-M4qXwX|#Ea!zpl zW**0s3~Kng@27{!hp7aPO>fRE&f3{3X*uldciU+nc>&!@>7VfpSodKe zz;CjiwyMc64J=6zh$LJSxFwG~WZnV1ktRf$B!wZ%!q(EB8Ejp6%DcCoU8M~umoDB> z=gv+JGk%2)5=PC=CXMqE@6*)kq|>JI@%Hit>puwtd8EkFzYw+>GyUe2U&q6PwYBx6 z2?$L3eVClu0m_V>l|oJ6cTy6Hjl(Hyl~-j(3-j?}rtn zS)lB}@R>s>A%?!@j5S8rt8UZWqT26`WFS3Fgr3P*udLmyyKJ(Op@x~RSH!?Si_rX{!#No>do9|O(FK1*FLD4!BRvwVVPmQ%k7eM_iy5i^} zJSFik@Y!i^ThkB3v|58ByY5X*>6$H4rUMC8>si5=nYTso1@o2&DL#-)(LD5OR`Vu~ zjke&AIo-4kWO2NhSk$BXW4qCh^R=58dm;~m$mUi=aLLR(05u2aY17NQ z$&0#@HDb{UnfzWKi!|tRdoL(~BEzPP1Aw+-ehN;(;Mrcz*#z*En_ zTOiTB6!X}e96E{!n7_xzJ@r{T_gX}w7WTAoY80Oki&NoI^9bx%=4KEl7CL!GEROSY zajTu$Si3)#AXmB~U<4#EaH1)eK5%UN&g&)*9=Wc0?4Vh9r8hjV{HXGES0Z#V&)wDd zup{h6yEt27U+Y37IU_dh@tK)s1siWI-yTzpD~Z`c6f-hGfGMp(y~t=H{#G$SW)nRG zDrL4i@li4(3pz^XD3=V&jn0x831`W)eM92nfp$>YX33m71lA=u#){41Hk#8qiBOa5 zjcj5kxf}yw=?!72(XR_5ItA22C$HZ z3(1;cAMaQBuwC59Xl#_})&ZVI>1;z`3adWHTiISiS$vqOLv5*tjdD@Sn`E)D%|KB4 zX0smlYPQ{Qie`D)nK2^gEDyq!UH7$CG%+@55cM8FxCe{snbL1_Qo$a?0tm5F&3b|q zrROU8UT&VS1R2Na=jGystUJxSmLhI@wYkaVQ_|Ob8D1##KyVtPoY_Qs7Q}Av=$?r! z_8%2({sa6-$g&gSki~->`ejamMsJV_FVj&wS{Axq4#(*9*`A{q`xIbrg-K?+16%VT zA+{I@Vl^e%*q{&}V8q5qy!V<6HN-j5Oq~s-18eKy!Lc1mmdEFXb~RhBS~$k7ios_| zb_`3n$*6ObN?`6z@_W+fEIWD|ES%`E%V=%@4$lXd$1M<*}kRmC-OJKF0A$ z9BQ7_qK1ne*S>f_pFP$z!*1;c9(C#Zq)6TjVe1eAkK}1qnDas6?7*y6gX^Im?Z!pP zUZ|r_?K?tF{vNGp+MtA#nvGt^m{Pvs!{H|+k0zzaF0mx`&kHSVxFO&g-Dl3gILX-m zNN&t!vIcUKxUEEzGv#~Jx`Jr$Vsn>yD#Wa@kvXhsAuIca5D_I_55mV<3>6k+gXOA> zO7i5M%ziCA!E%!W1HvT>u86&k+v+8Uusv4|FSc`a53Y@EdDamPR9IzsD>}G?iSZ@>LST) zqtL9JoLOGpZ5YUAdIMUBYuLxxx}WbTahF+&^$i#Y)s~U{r1=utUbLTaW0WFH>@kPk zAV{#wnSde5@^8=43fxRe|lvaJpb8Vc;lcUufPX<{biL7Em{5$s$bYBPDLofZd&-W_pbUqC%+kIx0OvZn&6VEBBDFHKDB85}NWB_W0xUBXG#keZ$F7IYb&3+-&=pq}<~nwQtxyjkZbr}j)I zo1}~<%(K~0_5qj_uB=HM3u-=9e4-yXc&xi_vrvxB9;lBOxH2KgA+|xyg&qfHpYvHJ z-w95eTF2NqW=rsrF}6GZ4bIz&Lh+uMc&6hZ&EqSift#FZW5}hYlPnfq0#iRVYYJ$z zaOc>u^#jYt;hBh_M&&Jsj~qCB@W5d>M@y(EpIeQckkZhZz!^z%2$$+Y+Mb# zHh}vSVx_W84o+a0beUFsX_l%B_fvGQlNMYsdi27PuZr^H=2=9*h=f9`ZFrpp!?0=Y z#5N|*m;`ENE_Q}3|9E82Rr?cOOFy}XJY5*6GLAj zRNICoDgA>&lm1dNUoc6*7QskoUw?%xj~!89*IQ7p6fRY2shmTnNkow(GdTx)P`hZk zx+zj-NO5pRi$JySU~wiCc|JgcA2``W5e=zGxb3q|6!Tb|Pxn}cefP;Bi-iO0W46w) zAiy<0@zSmTT2Iz9Nu5PppNCq;~!v>f?MJFW$N1@?PvRx$iLAy zCH+UZ27gpoMh8I<5|Y_)%%i1bVMX=S=(=218ILyNKuA(HlnCoAlTM(4iWS5k$7v{9GSRCdl zJozkhWEYVW@wBh)UqFN|?B_^(6}8PHTiX?AS7tn{kCkH?+MQtsh!MjX?Sf2MqL?s0 zwAi@ROb`HOnx?cXPE=A|V!9l(sp*DrrM$ <$rPU1l!hU@^mfEohh9};V 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

0UqTkp65kg#+%2u_Jr1ABS=@CvqB} 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 M`tX)3h+gmi1-?&}V*mgE literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su new file mode 100644 index 0000000..a5b3ff7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su @@ -0,0 +1,17 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:154:19:HAL_FLASH_Program 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:212:19:HAL_FLASH_Program_IT 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:259:6:HAL_FLASH_IRQHandler 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:382:13:HAL_FLASH_EndOfOperationCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:399:13:HAL_FLASH_OperationErrorCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:431:19:HAL_FLASH_Unlock 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:455:19:HAL_FLASH_Lock 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:467:19:HAL_FLASH_OB_Unlock 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:487:19:HAL_FLASH_OB_Lock 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:499:19:HAL_FLASH_OB_Launch 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:536:10:HAL_FLASH_GetError 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:550:19:FLASH_WaitForLastOperation 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:610:13:FLASH_Program_DoubleWord 24 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:644:13:FLASH_Program_Word 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:669:13:FLASH_Program_HalfWord 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:694:13:FLASH_Program_Byte 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c:711:13:FLASH_SetErrorCode 4 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d new file mode 100644 index 0000000..ff05e54 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..819a6027f047c8838a1aa9d9a0f906b6a224f741 GIT binary patch literal 1093972 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

lIo-{NQx@|PuQ8N$_RtLG?mXm zkaX3%AA)44_>|O?sp=;u^F`IW6!FVa{XiLR*{bniSba%lPZ!lLtIm=;EJx)-2kBhZ z@+Ocx)sI17$ya%h)9H%p7;WLMs$85fQ{}tTOsS(M{FsCP-;h zm8k(}SFtGZtV88SGHg7#6>gY^3wQ}uj> zw!5n8OyKUR3bLSmTy?MjLq4JUZX+~Is-C1n%#`Y550s`=UPl0*Q3baFFsu5Ue%f=Y z?OVYzuX>+elm%7SH(;?-NBcpFz4~D?!a@C8F7!F7&zyzvPU=VLuE`;FFwK0<>Vxk> z%3<}~yJ$P2UQMo+qv{>B9=WI=r#Zw`9ZAdQF?IF;)VirBmZ8#JeVqai$JJl?K$wU6 zGcN#6sFSvW(^K8L9h@iCqV1?WrOulJiMAQpsQN3)QV3K3a|1HN)x{g2@2pyV z1-J<<`;bLs=+yp2>pp8*o39;UmU(dtg}F2|_rX_FYMcHWA%^XgALAtg?Ibs5^? z)o+Kwqy+T?X7n#n?M9iKN$T+DAoGIS@pl-XtUmoD;3?|G6#Yn5tLSm0sYk0(N>^WN zfs_pOTFRHoR4;uK@Qdnt@+@Sjw^PzkTz49+(7b2~xW)jv}LQit018%np-b_U4oR4=8CM3;L1K9p{&zqNz* zZuLGo0Q9JTaR%vCAG`#XKJ~*~bfsTyJqrzY)PGPYY(TA{pW&doWCyelsh`%PW5eq9 zR8)?rH&fQ?sQMyZ$GoThLk3~v>Q8fE#Dw~F+CxvOZ~gDiZFA~Z?NC}!|IP=Co#u-tQL@(rSD=3mnjt!}Icf^&<26p2YY}KWq*+6EvYj=$ zm!bWz=BZeaBbp33v>(-!z6pSfhE1OdbJY~2;B7so*))ifo92g0zR{|J+=YL?f6<(lTE5N!pT5qf@wn(}#+u4_1Q z=qu7pZ-jNFWKkW#M+q2;>e&)BcAk=Ol>W}pQ!2Q>G;2{NoXL=MFf%?a8- zj%svk(6KR%_AON2)qEy|=zAKcOjM3*YU&|#LNk9Ic1~*ES_Ht9CbtMI)0(5S!J5&y z(w1XZ^YvdKbD9pi8!@kWTL$=orYZya?6k|tRc){RhmwUHv>%*A$x(YhIU=33Z}vd+ zA?>2CfpgZLrw=b3)`mx6BwVyRHlXCHJ@F}6j%gifr{kvOl!CZxbu`Hx*IuN#+(R2q zTeuTiw^zaGsSOaImA=|~S`qxT|K$PhuU$l$q5;~ceZUf^ zb?gT`NW1?I+RkZLhNDN3+M(Cb7NxyQk*#QLiU6e;?faAz6RTZA@blVT6q|_CmiA%< z8xemtnY5jMhvS0hq z8|eETZTbh$H=vECoP|N{EX}k-+IA^=G_3uFmbww`#x7_d)!z3xN@LoncvyB<%S%M% zJ?+JG2piYF{wm-T+D-JcpVWRyLES0s?>w+fYqQDmGNb(<0`OVwH?)MzY3=FYKChkI z4fuj~^(hcLog=xf>~+l%z&Yr0Xs6?-`;tzPPC9403U^57Ogji?U4|IOAJvtdh7=dw z_sQs=tFD&|(Z_UO-w#D@I`8dZao4ST87#+j`$JIaq3e~P@`P@p6r87Y4HWeB(m7BF z=CrQjW4vJAy7f^Ic1G9L2t_`+wOdi?t8*KL6hGZC?IZnlKUTq(Af1f@PQkhxzK{~4 zbEEJ@s4jy}ZehB~8gwOGm)Qz^XLYl;K_Ya+Bi3pg`$!K=}~OkFg2bT8`i?m$?UZnq2cW$SL_f?U$=qibEcx|w0L z<>~4~DCO&3qAQ74bnYKR^i^H>Q;>2^=V%8F1-iNrR2J$qd%$vCcZuSZMY@m42T`mG zrj&;g-SZT8D%E{L7fj1^CBLGwT<1j}@T|~@lfhZ3EBG9^8#*fkU8&Ly%E4K!iy(Jx zjn07_?6tZBCqU|S_w|9ZUiVo(WH#s$51_J9cRB~SCSB8Zl$vz|pMa%B=Sw-yt-5!s zQF&AM{T8sa>9#Mx&URhTFpTKXrJaEGTe@8OO?T>ArqSCj-KTp1zpZ;A68-DeRZ+Ts zkM02ZvwC%z(I9;~*S!$duX~$za(8sc`G61T63J6DsC#}Na6`JdnViDO8*=-rdv;|%((8rGtf7oJGueAoz&SML64?%6`!GUT32xpfEk_j21>KK%wu>Q zbGqSEuxwuUtq!FH-A^9@V5iqS3VrtadzS%l(7UVvz)^pu11wJZ8Y|ik=^bbz;jF*; z7>qxxkGukwBl^r!AV>AfK8GzX`ZW^3UG*Q*ox)@KB{2}~rVpa|(_NpDg039br_exp z=-;Q4{z?5o8#qttPt<~V={qJN<%~Wo0&PC}ikm3;>TRE(6rg{Yx)P}WrxvyZ=@*mx zG)iCd9&pimCvvyP=y8h2`k-G=IXv-tXF5hC=)DwZOVn?=4Jk?b)N7D=LGMM^ms0hQ zQszpUUPCA7biFGrpBMFuqM#v5f0Zt{W$ObkLhU7e>;q`KtS|lx!gBO`KLRPzZzfl6 zvHp`8s4dYKz6DaMPv}7Z%Jg4!qqpUHW+>nl`t=mWsMIf`$^VA_U0S@W^tU&Gvs&+Y z5!!3?4^eQvR=+w2+UxXvv#6}sw~@oGQJ+A&nI`?dA{gJSe}yuETJ*2bLAq7{#uLzR zQ(wIwqC50y^t-*KKS!%tr~Y$_T6XDU?!wO7`eGWTZv6@t6!qxqs__=|>OZ{)mOlOI zGzjb0mwyhmcl6>ov<>J-=!p&LXFdTL(*H$)s$qTqa}YM7fA{~dqTad_+Q;-pa)8~{ ze^1_@d-^!a6Cc+fq%VR^=zr3nZBl>!5a3h#xSIe>>rZhZb4D-Y!s=Q5Bst3G^n1u> zHLw4jwtfrxuX3Qs&Tx`$W!f7K()|txgZ~t8jt1v!$aFH~QaZ#TLmtha&W2~60sOF` z;s7d-7&x;~bkxw_2PrOw=V?`QH55?@^qAo@GdSH0;oDK^Zje*3^n_vR|JnP7eQTiM zq~R*LyiOYeJ3zb*@~=S77~;v_<70?AfReA_ue<1`pCM>JwEG(}D6A7;*hBd*fd>8a z=tGd<4@yxBHdIn_QivfY3!I?_xeb+JhP$n>Gu#k%9DuWiLi$xj7?xau=yQe^3K&Kj z{yvGyD1-l2R7M**_o6b!5d1Mpv4+Z7;LaPKcnKuVz@`9myx~44Jb(nlGwaZYM1#X# zbTi4&NJ(iI4842MmTcJb8QM||_PZf0)$sN~z|#$9Xa{)F(0LvP<{NgehVfSnrL>}7 zHI&xFh--#r^j;SjT4|OlG-#tB`nuud8dMe;diqc*Htab9Qet3}H>T8(NN3+NgO)a) z<%YQoXsgO(hoHx1v=`p{+&JcT~A8wytf&|#3! zTX)N_i3X(8(60lo%iu*;-!`;ZFcRGc_Yc6?WAJ$zq}Q;YzAf2jc$Jde`wd@j0l8y% z>Lu7RUwtf=^SGwIiX^5iB^iziA-jF$MVEl>FjG^>0O0$OK_n~3Vu$2-Z<_)*w@HiF> zj6BG6FrFbtfur%i)llnXOe1&LA!DQ)v^yK02>|C|qxK7EIAZ*cwv0!OjkM2lF)m*Y z;%eNG3Ps0^QCraFX3XD>lDlzWJM>%STy}&>;xdr*lz?N-Z&|Plq6$QAKros#yMKml8v)8v!@vC z??7#;k>3P(nz8;x^e^4`hX^bg#!U+looV!b6D${vmSC`C886&KTeh)+f>Alf_ABUS zu5l_ECgm9)B`@4nV>fm4n$hDus4Xy_p)F&fvF|O|a@|`J{Al`WybwofR`I%T~VqqUONp^X}r1!=H4)VDu&D|x}&mKv=!eogAhOMrYa*HyZ8sgR{w)M^3e7<0Jn9&|;K40Y$CG<36zZrjbKO zp*G_j1%um-apZ;TFotx1<(Bamx~M_>PPo~%S zE1k0Xj2|C@uzsWGE2z9v`rYd2ZD3b=(+%wDP!#OsGK(LssQJVF=rFHIcv-& z-^`rxw?uHx8{ef3>w+4X0u+QrmQUQ}088@cI^nR3>m^0;Yg3veE$*i;yC!t~}<^yrj{OHL;*lQ-S4KW!?Z z`OL=@{x8(}nsik#$C^hPmDcBobxop};=l2{_EbRnxO+ECo=b2uh zgx`Eq1>F+4Vk)4m=2g>C+WlTL-Pek?0@Go-Z-3o%hddHRroH!Lu!>E;1fs3Pbc?RP zl$!c!Lr`W~d<3G)O<$5fq{38AnJbm1TSaKQVJfx(US;a_2d>)W<%Y@{ljs?+)S3+A zu&mA$ejNR)H_g%xslgON-y&@^)xHHltLbk#&b66drPrq2q-CLh9j10qwB0flyFp*4 z>F@%Cb(v09g0t83);KErO*u^f+%bi+Q5rC*-O)B^`hu3MA=57(LCUb{r|W1NGX-^{ z?{`g4QVQ2Slf(v=ag%uq028KSN(Y=Y-A98wWeT5#%xTkKU3i)^rj_qQ?VQPpa$M$3 zTc1bUf~k(~&e@qGzXROf-0Fk=IhdbYjvhIhr~icpC$q54 zev9VMQ|9_u;JnQB(bifAl?k>n|G^aH{N|Sj7U65)vKTl`h7W2m=XlpgQ z(@&<&eCA1vS-bf`nw~n$zw*Fx%iQ0FwoY@|4v=oM;~*6Em>;0fVz0UVS&U$x`JEqN ze81U1SweTrzfpv7(99*j)R1}SHIQMmVHTVtX8$`Nqvjq;*1Ko^h!*y7^Y;Z%J7Io} z_C%9rb}?9{%x}|IPo~YGba`sV%%!x&S@TQu{1(iDXQ9Z>GDIP4d&^mRdmJoZRY8%X z<1ugRfi^cwKRGbnE$=@H(Z?-2 zKS8C3<;QHuJYngR0_SOQrBlx-%a62i@v``NqVlwbO`d#jOCM#bow0~%T>LD*`hwHn zBK-?e0xb6QJ%~U{C9woq^gO_WEyqZ0h($}EuL!jq%z>R@mR0HKU$`am8K^yLiF*hp zMOa><6rgjK2tSk}ExCCR9c8I%fud;3ya;VEmPfV&7i(EUc`R|3<#NE|Eo+Csl3-c4 z1C@!Eg<(`CSx#g??FGvOZIqHNH)z+KVo}#abgHHIG7L6Wsu0MD@4Q?NVJ za^E_%U9@~iNikWL9X~>5w&kH}kV_UjN)^0p8MH$w$HF9sTdrjZjeMS^`(sGSwy|$$!Li74gQlQj%VzSImsoyP0#Iu4r3|++ zOXD-(EVo>3MQDXL)24 zy{)%Q*Q2t*^6v{Ejh3wx>20z+{2#`p*|LT9SuK{QL(rpEOUOUa*Jj!D63lJ4SZLwv zu*`o3K$pe)F|^&boTi;ex24(+2KHEnx>PowRP)4n?P|%8$U}W!-NN+-Yl05Lmpe zUs4p`&pI0dPJgR$4=f9?jvd2523kkg;;k}Ffr7+Dh9&BtUr_U zHr%>{-h#8%SUPV;Sig1vIcMemg|vEjThnP?O0XK}MM<>seL#||%oX&@vFhnPOSW#O=`h85nY`Jl*7M}CPP0C4 zLtDCa4;_9otddn=$+R|qkJ3eJ+69=KWu2pCFx$F{g29)pmt88)-w=W?gN8uy$)S4=f$lc5h00ND9N9T$ zb*HWET|5rRyl2(rpfqlMcmePUtL{6PG->_*PZ%*}^?w*F(^h|arDm+*lv6ruJvIu! zoYjR6%k$Rz={;MpHvJ6IcD5XfW!c*j{{p9jZGr)rjL0C@JQU?H>wQINKTq zVBlffCV#+>*yborRr(1Yg7@OlmD8<@dl7Z#CZD}#O5@!pgQ(e4m_bY%W*xq{{ zm5DZUG%QQ9QMfDJmY_vthRw4P24>ni zX<@i%`-LtPWZCpmaAwuK_5v{YPKtEVJd&J+N}yD+W~7*rw{Cw$Ao7jaj`- zGzLI}P5UoIH`*jN2y3z>c!H(bb{|c7H*J~8sBE(hQc6y{?PE%w>#(_z_FJ~?$Iz8d zn`9KFE}P&i+HTu?cY<`=bTlXT*u=j9-fNquIBcKon@Lpm+pcT`;EpX}1u6$@b>y-f zw7t;^GGyCE=@7%V3GxMv*!<`$GirPLQ`k9X+Zh7UcWsMk^1o+Wre$T?@Y#Fs{g7{JO9W-g zkS!{ROl70U9?F&_iijdZhOz{iGQ{_L`s;k|J?DGQx%c^vd(S!d_e|~-rNhG1&Lk?w zo!%L8AG`-U|Dm1f%uWY7$@6fh?mNKuF;rTjWNf6$Vi!j4SvcX!sCXAT-53XlLEIUijzF0QW7pqkc{0KxKn^j^Q!vMiF-_YR zZw6~ST0V@)6(GKh1*1@Xm@zaLEk8ykB^Ue|p5J5a0SqO5`6H0AjGpB|jC1}V!HmxB za4Cclcm<<9!gy-~Tnc5}yA0Jw8QVrMuw#t=*&xRmnn36bV+e%+gyYNrd^y1=?goiq z_$GmOlJPSKyhuhpePJew5&Q+TL^GrebjC26Z=n^-_=W}@$M{eTKTk1!qkY_IMwl5E z;u+g1NkjiOtH zjHUG8JkR)QG3;Gn)Vf1U5knY>RxxAmQUFRA1GAy5l<~|6NEu@dB|*v=2kBW}!B|JN z?iU%i-oR)p87t_4RK>XD4_q~)qzI~O7ze80buHs#3d~<(NNnKMF$(tpaG5bmQL!tG zvbAW{GaNg>yUIAR6@UiDooB(j#^|FQbR%OM#gMKuEL@nq!FYipJWUMQKd^U`(Xtez znK8N^GttISY(nc6>tzJgkUbOlc0kp&HXZ-R8blzqBo(8}GBm7_R1{uMRL+3q43!N4pVyt}u zlEaKe^tv8l?4rt}Q3m51mvcVwCJSbf9vvL zvZx%;mwAfPYloTHwSfCE2kEenKeKZuNDx!G5e^13qmRSg5a#!hfFEJH+F&-6IS~Ov zN11-4I*d6<`>}B5KeX>Z!Mt1soe|8Q8MIC^mwpZs$xQ46E{6FrZ6;%x+ENT9j`NwKzC-0R`Ail??+Tc|AA*HK<|lNcpJ&chL-GQ%(FA2h%-0X2Rm^<%GDJ$4 zErB4V%+3Swtc>|&B}h4wO`DMl=0aNYU1UD}B`j1jH|__niYaadpqhDEh*k~L(+E<_ z^q_U?CFYVZF}rn42a1AUX8yh#TCOnD|AfwZW-!&1US%%+0n^&RRMFV4F^g9~vXOal z0x1cO zXNGyfvkqn-EuK4>zF)xWE@mLTb8a&yC>SWF44Cz99e2A z3f<58=rwdYv0AB+$eEQy=XwsX79^u}khT3INV>4Tt%XikR{IiYabtb^ILx}Ux@dXl z!7|f>#gpYm<)epKZoz1Iv3{oDkvD5|G&+4)FR#ah__ChtfR@9oYHv)4A8Wt{oH#+Cw*GAgkkB;DT6#R8JesnoE1b5Y~ZNFm!}fMVq@&){hO~9c4W_3`56Q^Shw) zIO{XYpoX#jd;*=}tQ0zfdV*ywg`o)6^GiTZvem5CjS@MDEbcPkl30f$;7c;AupX@xmJ=nTQdwpfIG@I{ zx}kN3RmBE8o%JD=%AaGM`4_wl*3;XeER&U}gcDh;9x8FlVa?nIFPF9G9whTvxz!kL zKC501UI9y+4PGIuf|i;^tVijRDrWsr2+0!G5ZxA~tXHUDri}G$IsoM?rw>6YSf_r# zP%g5jgm9vgl}U9hRjk6}fLF6#Tn(>lSkHb8TrF#qJ{NU~)%7+2b*$?HfL~^%)c|mX zwQvCNdX|xrCs$eX7sIm#)}rlzUt@i<2dzfdAG994&U%B=Yd2UPU!&E;y4?zQZ?a-3 zq~6S8uSI7I>prclT3HT0Fx1A{EQd%t3(t4lK&;=LKyI@<5&*cvI@<&%x>+C8z_T7! z>Te*utPK>v>|^~ym8t!#@pqu}E^AFUa09HN1po}PY!nf^$NKFIydGjbItaih%S?gf zF;+F*T;r^!FyQX982y;K3D$45kep<_^bJI&ST8g|WSaFNh2I{qhL^(7L)NVGu&|G9 zrZeu2>;v?)+0SlS2`x_S^)!RdY`YSz1MKhU!-@ylPp^Pk7xpk!`?#`=M=(q`_ODdd z=g$6g4qBe<3tZq1u|*TWd9kzmV8NSxkwQs6?A3G-&zIdy(Za)Q%>+9A*xi&)@Mq6` z0)PPandi_M$X-JUt{`^!HFO5Eb7^A~!ahPd_9JZ7a%c%Blk6PYnnbdr>1K{%zxEB>jb?9FLQ4!=k_FYV?4bxKi({Aa z@iU%c*ZYH>Qv=2yNXAhy3$Ug6jRuVgh%Da-;Z*{^#3Oo8Dw4}0sJPlkL zTlxgZ8TJ!&Ody>-L0Q>zY_BZ9GuXH2jh@MNpcQ-;oAUs?9JcFySkGl2dLCNx*gtN> zB?~j0YlU*YLX=WGGH*8wi z4fJ!gvYBtfms{))8!?7<_A3WKI@rFnlj>yez6V2H>l-<}4&&JqK z(EoOHQ*B{9ye7yLvf1n_(;7g0hF~axu*A z<22J@S4U3Ya&+$J#M1W4i4#rv4rk7JDmXmAd94734sy~9VZn{VXTzR5XW$$}JUI7c z0C;j%(*EHP=kxVY=EW(YPm_3ao_Gl?1w)m^ks+y za2|XJWr3XE*8>;C$>A8vw3 z8s`fNx1ZsBNEHlcIcq6TlFpf=T9tDg9qrgNI3IPxP$s9C*7I4MCi zk=b0%7gVQ{$6--%L_TNoB1T)lxlZ4VE98Vw#o2jIAZ1rCaN1u5ponvvGTFtPSLxCy z;rPvk6Q!Jow9+Z#e0>-8$~ot$TC0NdEBSJf^UntGDmm|bj?OC1DLT+o&AGG$oi&^X z6oRVbe4&QD%N*Mj;8!>oJi)8yq*AHiRZjgOc-FxAWD&?U&gS#zY~<91!jyZ1jR|=Co}9Y2my_3*A;ue>_yTarSP9y<40G^wenQbS#4}9h|rO zV7-&mUjt=boNws%z0Gl?OYsh8fZ|!*oGmiIdpO>=0O;kodVtr*F>its{ha(I_!;kV zJQ^|D0ZudJXa_k{Zm@oj(?vnGAx^h5B!@ZA(cW-`lT9y%QO>;>w8l7(IYVTe^Hwj$ zaG&!$<((!t>m+nraJ<{#=M*O{6`eDjx5wecL(U9UFzn;T(a9P|ZbBSH_H%tBV8Mx- zO0h0yZfglz2e>8Qf*j;lJq>^hH$)GBE4Tb-bh>e$ptOfO_jf8M^WZivfCW$Plnh=U z;_7+ed2wrK$>`0E9|Q5>7Sr$U%XOe+#$j&Sdyw?w&aQzyf9_lwW&qba5+Z@z>d&Ao zh`THgox$8ZdJcwg$8TXoN4VFs;BF}QjuWQfDA$*20giG1q}Skau9FoaVchwjp);KO zgaJ;R;QmFCwg|5BHTZdw>vjj7k=&jOupY$?raG2ru2(4R#c-F&_Th=#UKZvhi91w-Rx&r&3eQrws#v?^bk15?TLri8C++|@nv%RABUDKu2KOl*<3p9 zy^GvE6`06MuKO(Ltl~=gfve`ShGD3N`(-dJ)N)0ygIwausg9+NyOT;YE^~Xm(Rqby z9R{GDD~^PgtK2wmXldY<2q1ZldubkcjocC?lwIfUq-nju<-QIlnz#ZBtl#9u>Huiw zZcYYi;m(9Zbu0I+5;)k#{oyRM+~N+=-Pq1e3BfQsxUCWx>g4YJ0wP`9`zyh_%~jCT z<_>rMO&IFtp1zM(57#vTtzK?=7gYCg^_1l4=bqRM-d*m`OX14^w}~>7gWS$fq2(TT z8--SfxCiMIaKqd~5im5u{h3Y#jB;=L!Iv>^BxQ^yxEtxH*d%uYE&ZmrT^azUx$}0R z^8r^g29X(V?sw>P9v-^4P1VfnvT1W=)^i)O| z$h)!>I)iuz=%x(j=_#Za!aFX2$Pu3U2Z)675^ke)ly`*kYR7or=^%NW7xW7zB#gIg z8al&yLu=st37-G!i1$SBisAji8E2ARtGrTP{t!H_^MuMdC*8B`|j@L&;%NacG+W=(p-amoPEM5(Lk|vuM^(01= z!%L?0MJ`WCuaG=m5tSh1^8)FKS-|tBveQD|3_Uo{^FE*(;R4S(3j-_Sou`;_F;8{} zs!MojmEe`~a{gP9@pjT8zntgTf*Gvfnd4ygB2P`3!b)CMJ9t&RsLwEw)x0O^;;Z3R z-i5td9*^$#OS}Vz;Pn+=LL1E1^A^4Z2e0z>ZUL@=cZm`}*Lbf{&Zd!f?mFPtc|{8_ z6E}D&`W>2h2T1iz-r-hgY360qnd}zcG%c4~c}*0FYU4fO1Hdg_TQZcj^EOc$se>n> z10kKfc@p^2#XH>ya+`N%DJ1XkHqq0qn^*ZKM0$9x^o#ZKRz*Q)AJ2)ltNpwoTC?Bf z)j7c40B>LrxIy0RJCMA`dxC-_L%i55@P>JQD*zbbeL5TPQJ%v*;Kq1Kw5lBEZKkc> zecqS!DwyB}>;-O;=S1uBDV~PjRnxo^bP+w^o&F8H86NKpcn^7zZ-KXuucyGZBcCgQ zvis2&}P|-KllcC-u&2Au;9Z#;{*|3{xd(Lb(o)iA1yz=-?#9^pP$u- z&H(TQr$PxZhTJneT-+ls;NBPguFCE6;a1Ok1{vT8>cY^OlPrgWg zUIj#=_^(l*E}EZ2>5>@!Itu2*^8ZH zGJo-Yj6H>KqQzb+UrEXJH2$VQ7&^nBLuby<@_(d=XF6YHhvYea)l#%F_@+}(mdSUf zP*N7(M28Tw`L&dE$>B3%!OP{ZTm+KGKT8pUeEucM?H2IA-i6LW{_(9K=lR>|{eFRe zoe#4`{Pqcqy_o;K8j>aae#%Ui@_BlQl=0nLz$@oJPf_U#{(RakUF3V(!K>t#PzJn; zA4g|ms`)Eu<50tA(^{&QKSAZxm-u(6+@p@)xEJIyU*8PtSNJ3G;5G1Hq{DC5_=WT~ zY~=5K2Rg6wXZ;Lvga1CA2x#KBy#&dd{P{d|HuGo5r51h#CD&W|JLzH7#;@{3>lT0Q z3aD=9pQ4k<9sD;a0M^NWlor-qeAywiZu4hv1>g>!PutFJzU(A;J^XX@r0wPV{sS$2 z{C|{y_w&~WL-H>FqnqFj@YhjNX^{Wy>mc{|tArTz5dV$0;q@qAPvsY5{5{t}#`)UM zpn8(uzW}%?{&!=LoaPUl0(rpy^b@F_;d|A?&xib<<^aA=P?8JcD0u%5i0l^}GJ-e> z5*NW;XF&DK)eL=7oyWwV4^DL!-9`Pq0>)bru~t>z^@x#2MBIcS|Cu+{u#y>Bq-Sj2ZIIo zRq!Q5Fix4tBZ3S{`GgAA&cK(Wf`u2*c}(!bN9a5*2we?$nBYn{NVwp03V@vuWPb)j z5dwW9be!y!G+Hos6?id%Q?yEt6};gFkvPFkD)l@i*z-7Arv)!k zWFcM;gJ@Ba_H zLc#Nt(~3(o>jFDT7`87BWmT=92K?VSAg3@^KZV5Vx*DeqRVJKaKsrBf*Eoh?; zC*Kh~`8_0i1md&@v`SNrf-t zf*1NAIVo66A0(a>U(3 z-2!nFUZVGkyReR8oF2ku-$2q!_(32fy@i@(Q0*gZ$$%C=;huJM`U~HP1_=6s;2-yCUkj-)^Q=5R@7m_XWqvcB7}Dy!AzVKTIlPXkwQ-@Zix}T z9)f|z3fIunJ5D%2WsC8`il@O#5PrWNBvIHm1zd{omH+nI!of38mL^3DL5u$VIS7lo(k zs;d;Pp%{F%aBmc})CiB$jaMri-UQqw;cPn0R3}u{!QFb{70OIr74CS5@ihoPps(Cs z6Mnx2tw!NZ$`#xYE~MI+CZX>}v~CJJUIA$qZlpX{i}2VqoNp8EsDWpRO0^yQWT z;YVqMfAsVc%3S`L}O1AEvEW{Ga@+y7S4$ly#xm{L@yqONTz6c7A$0m((XYrTeO0X z>Ewu<--VW3QIjJ8d7?u4NK3v*-T-?AqF@*B3Pq)v@biMmVF)8C61`Xk$zsu-8juoE ztq7f^qP{&KWug@nwksD2enqQ76!$b*7e#M93du@Q1tt2cMQs!ctPz#QLZntC3dGni ziH^St$vRQp;~4E_Q42-ku80m$*sfl*>1()qRrF0d+`T3e(MP9lh<;v5i*C_B(Qxpl zXy+E-nngcR(5XdKO{dITMen*pb(?7XJs7$r3jPVW4p9M>Ds_q)e}c{~Q8uk&Z;N*I z!QLHF6lH;XM53R;>lO8!gP(n(2ekd~7cHa3j)>lI#4yK2>)wPf_eCwVF`5wly%K;)k&1SoQ=$plcT9`KSy1*sG}i#h8POI> zTRjy0MJd;P;_Y;*!BLz$0t@@aHj4H-iKnih(^;IC1aW zil1S_7dP=j3gWqo=Tqp)L(JX)5ijwpO0>Mi`)SkUBi>8zIA8I-EdU%AJJQnDPrRLW zS^nbx-2yK_e35X0V%BQ_1c}#X;F<^)*U(lrMEv_8T1Uhm(?c~>d}}8FN5zeHbRH8g z&xWDnV%ZFIhKW zSn*=oTf~XK{vSpgFXkTvJVBh$3`2=xFAqp2iTOL>OR`u+35yi*tv%3^Dqimek|v(F z41hD@psyf#R=koTX6fSZLI5}?&iWKOGsJ9K0%VF`SPdt##1X@2Ws4u7kY0}1qCqQH z{3AV(^2CxVwDQF%Cx9yu_lwYZLF`V|4Mk$FqaelN3ly5G5`XW438@x8Pvy-uV$VMT zs1=ug1NbHJZTdo2op@Ix$Yt>_9Uxc4E=Gvdi{}@kbyd8A)@Kc3RxQSGP0XUgkVbLL zYN)<0o=Z{w8{&4_Xf}yg=0N97@xmwJe6!fP5L#Nq$(JC~D)yi?ZJW492Xafi=qJG2 z#kb2~p+o#>3gDgMS7w29iB*)+x-FI^0e(lUUI{?A_+0dXqrnFqyB&{FK4SQ-M{koZhClnsm5_h1Uf!~!DY;!iICcVGOC zJ6aRs7slcBq&T<|7N*3HQQ~M?te~lTApX-APRxkA0wD5GtOqjbf+d!PXoX0+>0Nb1vWs$3p^^<*;2o8`Pl@njl2^LWd0g`3UHB3vdDjL&xFkyh zCr(J#y^dCdYos<-RilIbGzIYD2D2Y!h+>Msh(|;VrNWMRZR;*;|D;SECto4P3 zQ<4-)k0wY`-T^OBl0ysRBuUPHw}qsFevTB$Fs*)5B~Q~!KTXn~4%KHQjK{${E19W= z*>uUTl*TyjcW*SR4%5DEvIBs(bIe^U~g4qUTDJrA?nBH2wl z?^a34VgTADgC)??A$gM0Go6x$ROitpnV~tmE&1#SB=1Oe3c%}?Ja!Q}`y{0=;wSEx z@J~bXu4KV3@CGE0?0}&`Nm>dz?@1mFhD$?|brSe8EQzEr;h2O?7ty#RlOCh@C7Edu znUKV?aiL5~0`j4AN>Y&kxU=*w#YzrHPtF7UptOae;4acFlxTF7K0`&|9@4`sjL1_u z|22pll72$Jw3l>C8kBiUb#w>#NQ-B|kgs$bJ&6uWnfqYDPkO8vaDVBG?r=9i`koJ3 zfzlnW-~~$s-vAyW4Wyvc5vdCcW<#Ytd(b*6{gLMSxb)u*n2<2(^RyTWm!9c`p%c=+ zHjoJE1ichbN?kq%E?WBepCB<({tPU{N_CW_IW1+-sqc7cI9*E#Qr%k^Lz47y3b7?i zhv+?)A|15?kSe`HKYyCE_a``iR{GQeh@?w>DQa|1IzZ#gkVccTOsVN73?)nYI^{yL zrITTBH%I#0e=8m79!h=ZNjF>o$(P0n;6#D+;Fl1&AXU%m*3&E?AetHbb>ZI%GO?g>b{V_bdA`POaeuK34M|gcr znoGfeM(N}&h%`wP=*fOldUzYOG)r@7OWG#YP?5teX+#77?b7lp80wN9q$4M{rEh8g zza!;&Vnn^t<^-tjlYT)P{(k8d$^ze&K27W00qF;nP8gKt(XQ^E^eHQp4N3RX#&1|! z69Ypd(j{hej!KXI3T0!`X}Xf{OTVX-$b|H1I&3#7HI&1_De3%AK&GYNDIobknr4FP z8L1CNWA@3uASWDU^JfFTUzX_zC!A!CbXd|^_9$gI4#*PeG}1xYA*vg7k&SPLSy$Py zn;52>ERwd5?y}7^S`S%)H;9+anT`;6%f6Juf{)Byk3sv%E>aZLU-luDE(FM4cnKB) zWgk&|Fi7^t`yj!xVF&mUBFp;_xFa&fo3Icn8)c&NsB9G-pExEHQ>DytSwH36!enz^ z2ML$y_Jf>|eKQYcBV?bcq57n33l*tE%HB(WgHbXY8v~1$t?q!b7}@P^3?)|fbtZUm zvZuZP@06^KLM^9dKR*pW<7I!*oF&K#pNGyw*=AZ!Cdu5LF@wpnU#Vm|MfMp5G*V@G zN1-fDrs;+gXJp&n1UW0qS_R2;S$P*k&dCDu0LYNdp#z_pvehZzWy$7lgoSKb?;M!T zkPsF9xJh_F5_c*JWF1 zcYQ;)t_FTK$re%p;7u9M6X5QU&3+3bYLT6y`>0j6vl^0ZvO*8IdrNlUzbusO_ zZ|}-P6X+a}@qdTppzKi*bl#Ii&{KFw=H3G9!?LYLOu>lE^D(qWW%svX3dUsqH1=^> z-1E?7 zpWX`x56K@MK&O{H<0eMrEzb>ubsu>XEs%ZXHz}uhSS}n#%TNC9Mzs9p`)PR>ATQbm zErIfvve62XZ=jhEmRB8t*%0};6m%YuZ>B1RQ2AeUl<}ziXDakQCZGK%3>}w$Fahgf z@_L&2aQR}|=bVs78UT-wKYs=AlX7z@0Fm-P3ScNou1P~@v|Ro@I%DLk&cM%D`Q$JF zaq<<5G0ao)hM&=SS{{)Dk$Cx6T{($@=x=9A* z8!p4Md-8d7pmj*@_7JUMxi7t8N95v0=p2=wrnLWyYBD9t_M&@h25~ zc`M#qi%v}AeRTRNmWIO6VFk+%#82@J!TlBYC@mMHc%4=r!3rI{=0gr~?C<;x$#Vb6v0Fa>gjjp;x zMJ{c*lN4T5nwYG3I{}7L6dzKJ#2Lj|Dxx~8xJ;4!bj7zlAejpPJs??%wR%{{RtPBc zk*8RY4tTyI_z&O;6qTb;eL>;ehRz~II33h3RJ(w?!Mm(DMvvI{j2lieD)Jc2lvB;`+^sDq4-UDv~H(*QWUNR{(A)=I)1s?Fu6w zIy)5qQVmv@f=#if+lq=suy;q1H~?kc3PmH}Jqi^i-g_0TKcllx@sbae^(z|a56Ba&VmyMl@~=IF3P9rVs}**RfFfIT&e+aSI%_= zz(e_T15|q|cUj=)A?4W)@Vu2N10cT2=zNgF%9nz{^HV-Xm4E)qu}|SdfbtEBx(6zI zPk;m|OQxYLSlOh7p%A5#GE_&D#vYJRMMZE?$^{gWk5*o%kHp6)w|AOQom0*uc!si+ zvX8k+Eqy&NPuX=FlKINMdEgZ&FVpdtLgkvrq2;{Nk9MsWl#kQqph%f|1f*D5L^XRQ zO5cAWQmTA}4k=VBOZp*MrQG`^hElDpDuzon$^;6T)GBiuVCa%kO}BQPQYuI5vT~yu z?p{&q?!s)nQm+QNs{DorksHdCb~xCi+)I^)HWw=1t72I)|~@;n^uR6be=U+yT=9-^~bSw*q*9_9M;X!R=nD8kyO9AIM% z{Ynm940n}R55f9?GCm)w2bC|k18`4SyB=DGl*0GG8&)oP9j*Jy+e^WlQ2tCo%1LD` zEzG8rk9`a+)5>*J74blM_&ofaQI=5o_CuxbtI)Ym6;9WnqpFl@oA#^rCIRlE`h?1` zT~*sBq0>z@L8)4I)nktE(?iupRS}-5_@^LwNX4LHHZN6a1jgsBYIp>5=A&9!ik7cx z+lvqhR7KL3El4#l7KVaV-_edCM78}gEF4iiLi^27RYC_;A60QQAjed%^}^n9)hMM8 z!&JS~&>61UL^-!8RT=HBqg6NPO%kIrRzM_H6+~I!I8{~yaHmvj*Mgi@x$lIsc-2;l z)Fh~u{fyBjst!`QW0L9$UGu4`$oXicsXn=c$vUIb?tm|6RXia^l&-R`hM{w+c-rn{ zsMh}mdzq^BRA!f@;%N6+?S~s8E~Rp75WLRSExS!2KFwh3aFH)R<(C7+`Xjoq{nuh>fJc# zysSzP0DeVvpK`7Bswk=@zN*?qmA(zCCA)#Urg~ZmWsRyJstjmW-Jx(%i)xT+@>^AI zbX~Wp?$bN`mTIIITH00H3?LmUOCN^Wsk%td-7eL?^FVH^o~4_sPxa03fcLAo6oR^| zdY69G0To=q6{#A03)b(c6qHFDQnkv_Ijo8bgrO1DYWmp2sH(RKW0+9=B!{v|)c|Ep zrc~Q$Ycj3+mOc;gK=t*TP(7piVg))Ms(AD@n0@N~t3e#qk5>V{U%jjaa3}Qx%KJL2 zpVh@nDc}m^&H6%}~3yPpDUOlrN zBte~84||E~+FwA@)Gu9vLvMTWvdhK!BCDmdm8Y3_3>Xo3e+B-gA}S8D4cR$?S2aOE~sP8&{?GJH^9#l^|n9Y zQmNV_9QMl8{`9UYS2O4|S%tcaats&M!#~2%6?F;4-RjlFRFi*Io%bR{8q`(C=&Dn% z?}wpA^&a|k@pbjm2mo%VHBFFgQm1aiWZhJ6rZrfz`pqerZBYlEMQ5uz`~^7QrY@k$ z##`#cr=g`oT}(mWPW9bbXz5b_;17}8>PHm7-BEu}w_1;S0|%s6E!qKIpL(1^A9vMm zS7CiXZP8(t2GuS)!0)NI(>8EOty~2%s@}Z?s>jqGui&a1S0AMX)_wIsBa}_3chHk> zQoW`VPE4tHFraf4`ZkqJnu;;G%ayG1cXcRxff~RJ~2wXa(@xKM0mnM$~ zfVal!Bqqd1Q+gjFzMAOEfFITzrF+FsGlzD`{+gGDfD6z(Lxuu1t=WJFXzW{PMDy-?I3KF{fL4`9HGx!6a!gZs0wi2>jViKEXkJjlUWCTs8<3NlXgY%$ zsaby?yeN%Y1Z6RrIc?y@YR)b~D^By~GzNW2GeSAH(;5cti{mxpv>8d%l+Y$LNz=Lt zBFUP-MtGL0S$Pb~(lmQq0Y9S=#ln}fnho>eV7f+0`Hpj%vZIj9(EK_Mkt|InMPsrx zoHmdg&74!Po~!Aj$5WnW;h#`lpi$EPy-;(PZszlvWCNVIpb@+T>qVM4`rV5)e2V>+ zX_Dz+K)J@g8-NPUT>2KxMa{po8?4mq^Z>j{bC$v|)tc}8;Y*EXaT-KwHU4z;;F2bV z-pqBH`)=^%vS#xncvmzDl$)>DyqW{AuWA;$L!?2ok_rp1X}+WgU8CkP23)$XN&O4M zyrH>s1Mnuzk)J_sYIf1j(X6?;5u`=)h80>`HEzct*`{%S4!`s*P3ksSXxHqfbb5#8 zar!wrHP_=c>MDv^uzKm;n=vKS0(bFFnPiS1_ zP(7)M^oQyx%^<}KrZpnUY(3D-rdwu4vxth|9%>j%fZL}{Y=u2X?KlIH`?axDy5OYc z-$kdh_MLYCIG{be8l4BVKU1B6i?(boh^uzV4tVXR)zk57cde5@03KT55)e=AVs`)z zX=l?6dTA$r!BD)lpT7&7kM?tVD*9@_t^oY7R_Oy@{InTV-t4cvhQ_x?J1z11wzBDo;bCQY#1r zsnVVehMzUsLP`|ZYL|bD)+KEkl|0mG_a;H)vi8a`!0WZzE?B>+b#8;Z4ceEq_~EW; zKg@(=qjtqc@UCm$&IG(k`_l`+-PCSj!d|nsb0Iogv}Rgzv}$KwfuT0-G9f0pU3-Q? zY#rJeDoX3rMrkpWZf!el)qAx6sLu){R06gW9F_P<>DP zSUHppX@A@b+^}{z9ljaSW`+Vjs?DeO(YW@z0(9QjKA`VQO=x$`f}u&R`c3erw4WRY z{DF2iMR8`d$~R%?p;k`A+^4Iv!n&jGt`WHXx_>A-;-p({gvddiJ6%#Py3g<8$8pt# zQ^?s(w~3;K?z*KPK((jtU?XscbiP#g0Z`> zgzI)3f`t>hSrj0O&@G~PNTlwUS}2RsDV_!(T9-^DM)&mv%uB59dz$$;-79>|;Avg= zRj7{FHT@1=g074L1&KOm+Vv#qW-%d|tm}Rj%2IV5l!8gqdF_DNGrAxCg=B_q8?6;H zb`dfkB;IDb{=<_pgnbbS;{zotvt1VE$iqdAzf>$=rc zzI{Wd*#gp}n|v9PH+AVvP}Zz-Xo6=gx^fzHt8U(HC~MQ@o1o>EPF@emc3s{*@H%u` z=Ye$U%>8hwOQ-xAt=qc&lNjwC-BLQq+O2z%YL|O-+k-HoUY!pW{q*ThghNZe?&%S@ zbXS)Y0p5V_6zxd{b=?=?(mmZ+F9toNTS?2UVcnxWz>VkzX=^g7TXqnDFCbk+r3n3U zS{IzuTR((Iq<(~UC^34y7er$9Ew6yY=@)$lL-G0zRL+^8U+@(q6ZHdfj6F&3O8Kf} zy_(joDf*rt;Ag77km|b9^!rHij6R4CC7sn*H-V(_W>x-i|Cp!)MtJLz)KkN=(k^Tn`lojhs zenMx7K9D||QmW4j#T1n3ZSxbwnuh6@OLFYw%>Ul_3>Q6d@SEZK(!ECkOAq>iD z^t?`p)ajdOeRf$N)q}BL(OLaB9H0xPQz-!Uh)9u@;_oPD+ZTf*LAh-0(??SRu-!=eVmtIcmm)rWK zbcnP^e`z*&z4}4g2KMP^K7iSNeOU^4clAr@ni$j{VgqnbKTWaUA$?pRc*FWns1$2N z??BtDQN1V{tueighw+W;-=%Le-PdQ(V|zls^*c<~enaVONIDsQrsbWpA=Cyf2MkMA zp!1+1kBZJ+41eo^b2Z$54LCQ$%d}%~H@w^l;$e7d2*lG6vkw*y8NyCNiCM>0`*Eh=i{pnu-n%8=m#WX#EU-t0CfVDEbPx0K-u#Ckr%;J%d(|VQLVP!G>Hq z`4wW|%m8r2aCQ%rg&N+kMC+)bz6?LyF~iBn@O(LL_?`|4g&E$aQsf9j^I5b`8or=1 zpGZRnJ)U9=wnofEtifvp@HoS(7twjj@I56cPaBG_0uXO_=~3{K3|r|0Lb73SIR>3# z*gXT1YFPUM?4=o$m2l#W;Tp}vSwqi4xSMXs9{}&1;g>#G$T0k=Kr7R*HVD?U4BKQ- zmTj<7RZ@;2a0>Qv4O=JznP+(78ane0w@GJ#K}DO;Lc_x4P<`Hz*$iJU81R3#xXKMX zDXm&;*i4gEV#peW&QgQp%ixt6lo>EvZn#Ey(F(&-%DG)Mw9vY)(h$84l2wLvPOw*P z`0*xG*BBz`=BhPB(L?o;!8it&>I`4fJ$Bg;O=U$_43$!J)*IfY?Bi8KKkX?S40GFH z;hN!e09uU(&J=vPZt$ppvKxj~v?gjcT#tv&7DJQ;BCQ6;&FE}1$fltBmf=7v0PTj? z>3b|4hL5OFqtmdSs&cyw@;^at8{V1^2k#iGBVoPI;7|F~ ze#44n=)7yV#D$>&gMdmN1`WQ8FcbF-yQ4sc3|{o^A2E!_!KG0{=-&X08O&pFV%%`k z3Ap=)=YudklZLX#VQsyU~eK6duNZm%=4a6?~rjl zRl|50=VqhR+c@Vv;CzgmB_O`W%W-h`u<^@osP;2Hj0EvFPOJk7Fs^fh*MY{EOTYyg zOLs#u*eIe%TZl1tBSelEZ`8p;sFCFlvqz27G$F@~mSBh+H!d0lAk4`0f@HYyJ4%9_ zFcz+WpAp90lr)Pn)=?Eyw9$tW2r_vATnr-Jb})8#$Gy)H)4Dw31&x)v)==5%=p)r@a&;6&mW!p zOwZ8?HAmCwHGuCoZKl+elgX2EJLbHHq%S>|xW49%lVbE1v@|!1VP3NCui( zuc8%X;?Qe1*i@4P$xzb=ufVgTCLhYwA2Suy!NKFEtyGK{W?Dc+RN)0SdbNHcM14|~Q`_!U&2 zHT`r8xOCGSY>;y%+2i14n9|O|`Ak#rB@89Yw4HYP*`|^OP?lp_auvK>lXEpX^Gq+& zrZ?ZT6Foo0d=bC9b1^60G7TRcDH~meOsW(jQD*!Z^uG72frs;<}aIo3r z_Akt~m_pA(q}BAwU*NTwT+U!#Zkc9N8n@k4O2NinQ+^;^>N7ol9;*9I&FA6gT~pmd z@CHn4S3~unsfLOp?wK_7Riz=*3re(xO*`W0@;2qrGIZ2ru0ZFQ3D0mmy-m3?IC0;! zmQDjsm=wQ&H)-1g2h3|IBzw?2NpCzC^Nw;1)78wUXttYqsRhK{Jk|jb4|5+? z0(qJ}Xm4@ITvHC7m-$^M_~LCAN#Ki*S)qocuQ~7{rr@wS`X+SxnV+GRxWD;5+I9w* zQyMMZL8zVBLQ&fl)0c9ywm34 zqrfGZ=d$2gve}ga1u5q87>J~r`zc77W_CP)))_O8;xA{-@pK2In`copEyKJZ5}sw6 zzo3HcEVJcXIG=4^M|Imd=2bONoog;HfuTI}$&+a1o5v{}R$yLCne#&Pc@D@0vysvX zMdmGzuvcvMq2n4Q=6REFx74hmz;3xY={3MB%q9P=bj*U6pry*Jpa4p>SxPUr8nYX1 z;4YbisWhX`oaqX3+57|TWv-a_hCoZbc}X8y*UX;`J z9aIpxX?}?VCz{Qtsfx74tfzoYtJ!r5Q_yaXd=j2@n3Fmn*=gQ<5uSCKLn#Y&+q@wj zop;Q?ctdBmc@3ppd(0v0pt{%0T>xC4d6fmcesk>roVaTqqB7S3^D|Ot88k;z{lq=9 z4;?5NGCNTQZrHq+#xP>uE&zPgeC1hmj+w1-P(5zmz83H%lN@_qkgZ(yP_OvOf`UPs_FkXdSYA=Zxv`vJBBq%G2GFnl?0siTPX1c9jqT2FxCUn+V9@zlgWy_BZXkD>vrU+KOWrivdu3F~% zz+Qvpo2vj^v%Js()r}TTB|5KL{zq$+83; zEf*ezFKw2$o(H*Qd7fV7?Uo2i$97njJ`H%MrI0qLU6yFde%!XaOsnlXmLI$^%x=qO zJ8(Ugv25UaEnj>D(r4+Qcyhnx5!wgbwR}a@Hv^VMucLF&lAr+1I~$@{HU1L$V!_tG--Qz)Rv&tO9beHB_Kt@1Y^8EO5E!rxKWos@EowyvQ# zN{sbis&0?9&b^3MoVBwWzMQg_uY=@i>l>eAeDT)hYhW+IdQ}Rq6Roe)<(6c1%S0>L z`c@HeY1St{N9P%93e}XJwLV9i*L3S;UyR|L^|3lQkzxIZ(kz+Q7J64@Spz7Blx^+& z6(q-+yC1w<>kuUn@~kCv(dJtt9|Nzz%JfEOq4lvt=sa)TyB028ux8lNS!7*F<>JNG z#LXCOiS_&%h?H8VXRZ7wAijRo2k6;8k0@=%HF;o%jeMwN^*k zTU@ecKLIUu)`ekk@UnF^ZOg7$SNsE=_0~_8LCaO^vTVQ`tnQR!zhg3;cz)*Qpwo2}dbfuAkbpnd3UwdRBa&}Kd41l}#{$*Umk*1vZH*I_j* zfR;{celL9KvYLgk*KJ+%CdSue{c#+fz1B9G^1IeIgP?Q3D%l7!Xgxte?R!?{V{m@R zT9ymRVe9-t@J6g#BSA*3&QwJ@W*w@9p>b=n9pt`s%ZuPmSRLrR+N4!Qm-m#_!w)V^ zTSqDZcwkjhsB^~p{$J4f(0ZOKg!kFpX^Y`#Ykn8J{kHKqD08wsMtNpuTm0wX9k6{v z6(|R7IRg-Ju^rigp}5-KrZkzGO`Z%b?l!#;A|5v80hsl)O?`m*JY@SN56Zl3!(Rj7 zZM#bEcOTomN$B*oIZ?%gpKYZPIDgyrzo8|-c6lXq2HH~Tof>4DOC?UhwiQJfScq*F zZAOmRZq{Oap|(|BkUVPRy$s$l+qv)1dE7Ri0I-h=8iTN<5xJY(D50()m|&Zp2y zx2;|Zk#n|s`l@G!O-9StOj}S0NS5trDMYeuYPyzkY|9^@GuQTLD@dO0dq67kj;}hkli-wzagGY_M(n0y?kRMkwjoXuJ3fRA0AMQ#$sBE#nV#HrXun zOW(A8Mhk*wn~jbjx7c3Y24$_bD9Q@8*>seZy=8m+0RZi`6$Nmq!?uc#&Q6<&lKEY> zY+8|Z+n(UTmmb>&3SsoxK5+rB&sMP#ynfqF3S`~2{Y%@j0oy$KjRtLZ(?IUo)@Gt} z$hPkXkYQVNEPNTUm3$8PsLgEzxG|fQmc8S)jz%cEZyP@fLld^`PtY02|xYq4^F|Q0Q(LH=nS;$e9;QBhqXXwu)VSv ztq}Wnr@=d7zhs1kQ2RK=x{lh9`UpS#A*BJ z5DdlJH}kX_jdr7Y~T7FRHxV%+TcX0eUTWrG`sw9XgOp5-yL+G zwQr?U=IQph0Km`Lou}bahTWbBcQfrpKG2e7XSjoxZD0KyBy;R?S_J3Y@63nw0{gRX zqg801LqXB=_J6Y>a>4HR9b781`_m6sYXAEf;AQrc^xQ4C*KLQ+N_&(EPE^^Cegc=O z?GCh~t+BULby%%^Arsaw*}bS{q0U}QoBGT4A1PCR#eVHokb3*FM<8<5uBUBFgT02r zuGj6p*I?m>J*^9^Ci^@JFW$75BmvNDPc48iEq3R>AacvTowjA|_7eI6M2G!6C8lrN zpPCK89lPrwTHW?)I-~Pf6;N7*aE(LDDzMU59gZAP$LtR^n1XTpaTYo!?Hg<`J7w>redDzKmld%0(5~Wu>~r|6 z1H{pR69%4>!`F{scAXu5raJ!v4#jg};h=*{JCwON{K!S8tHT#Z0dR9LC8Fi-Ag67o zhrfwPIx=S{SIY54$~h&#Mfc*e)w|OVeSI7{2Z#Zko0#D)BP9V zU?_xSpu-yk2y)o)f0C{{E~=|(ySpq+V1?~0EW(m#5_{An#zc)tOe~2dMvXDX7)zQl z*@j9KrB^{w=~aqIk=~mqMT(;IUPOu@B2`fQo_W82nBUBqXJ*d1d+$AG&Ya5{^v_2= zC4q{+eC-Z+50LMry@^2i$y`_olJok}>0o)n0sunf%TGWhOul#-!VQ;u<^g_P{(2L7 z6d`Y>6?CM$nyL+=BiTH`6OJSzbhokra6fJz`Vk4L2c7lQ+;SD_tJ-9RL~ft&|nZ zl>fI0xGedB3n1C@1RB8{`58(V<;u0`@tY?X&|Y%BJYhfLERZjz=U|ciMG?H;k+VKP zNO$GG(SLO)l|QFRX_-97A8zl-oohkLlOfg@{Lpp)Gyyn+m!?I4evwcsodj3 zzz5~KH$!DeUjG{+dnPa7LpUrq2m$w8-q;K>B9HV#NH64{&4r^;x%s=`#^jqs=+U_R zNgK$7JU$V^NqPNFz^CLNCqwvBzHJ0#THZ~$k{S64`h~obm-(YdujRV22yj+jN*^SC zBj+3e&PGv08`|d;CpMzD7ZhST181x7qunw)#pfdk-d?f)e>Z}{@IF)=6)Wir2~LW+ z^r&=JwEha>qDY<(;;MMl0Pk)JK3xuX#Ydk3?xEm?!q`Q{X0rP$#q25od=vxUf%qyuKZB6`6swmZTz^H#1$YloRCl8*fr@33 zXbVy(?}7_f2!w!#C_eN6E>v-q-Z^24?`bg^uCS-~(RBqc74QhfBdSu5R1{K*CQ9+m zZkUc%+)%>U4aI&sh7_athO*!{6{922j8*KV1!J5dfgbnqidt*5B`Ta~y^^Fbe}!%) zD^5j%q$qxff-qGva22>T#iLAkNLLuH1|UO`(gKpHh-<+RWGQASmzS+*TaP$%6uuw9 zbgp7aH*k3h`Bk*#E0$5EQ-R_nJt_+oX`cdqTao-6eJE1AqWz9LiUm_>yQ`1~fD|j< z8HceF#flynD^(o*4N;dV-dhAK_Y^xnW{6V6?XZ6 z&nRpt(ep|n{1Y}`E9~9}d{z;388+W2u2TBcMwv;E=JU!9s@l1rd`$}@TV?$`;Ovxd zmcfI)@(3jgoRmguA#_&qV_@1vd07a~RrxiYqIXlae+U(KWtI0+?NPpsPa4&YJ@3s=$vV|((wmaxvo4-i`PiyO`3c~ zDYc(NGg`U+8whVG1BVb`jPeW>9o$rYM_q|kuBd>`IHkuHsKhI6D3O(*+-?KzmhvW@ zj!jg~nFErf6jHrSva+TD1DT?%{Q$UB<$szWY08;XFrBUxx58$I(!2v)rc&?{ea}(~ zv_Z0!@s#?{QJT_cQgW3qXa_Y<`EL&3h068xlDe&Az6%dU$~9DrdRLiGOQB*V(ml94 zl-3u~R;paL1Hv+8Ae|Yxrwlv_f91+wXtS+CxvmQ~E0zC!g|;f?9xAlCuT1;_@CQn5 zCy;984l2%lr2JMJxEiH9%`R${ztD53PU%ULwtD53UvV88l`36~M3ZtWU882@vl@7B zQP%H8WUb0c+8k^|LzzPF@J=O*NSD&U7>>G?`?8_(SUHpq(xa@o49zFXos?qh zRZ8e*+Na!0!_%+)fu2MIN;`V>JXM-e-P)k?u{{7o$_1q$&y>H8!OF1Gnx?4Fm65R^ zBg!vnW;L$#W&tpv9HC_6q;eiTRHu{{v;p)|xp@TRGOZkb0{D#5kY2*Cls~4R?X|Mv zB>c@PV~Wrt8`Un#(4ALBT!-cb)o+8aX{)-pADVWmJ#=^2t43)D&OxQyfc`nEhL*yZ zlWIy2aA(zqd+_e6GH?aXO_fjv;;#DE7&bjr_t!%6qN-^-;GU`>H8j0c?X+oqN%i6v zgnLTxn=4UO zF@ji|rKyT2X_&6k5x`1@Dw|ek*{bMBkQ~*0H(1G4 zjV-}g=c(R(4wA2$pz`ek)fbfJEmTd1VCZhE{`v-*MXE(1Fm^{3G!Gu`sy?ShMX}11 zei|jJqu+v*s=_GcRi?V~4UFAWy)c5Ka#h+|7^_fOE(EDmon4Dqs#N`y4ZW|rOF7O5 zs?GfXRI7{@!{0-d?llM>sp4ssT%!v74c=>2Q^PP_r`qg?VXaq1)wjSxOpJ)j-w5!D~GY4$?ZPSW2$^xka3mAHF%g%opHw~O{!w(RX(LM z{|4S)s`gXTcUsl&2i%M*W-Bybspiwst=Fn^z2Ih5PM^W;8&wod_H5MG4S_qaK14xW zP~WE(k$9@KVfS1P1+QeRhtb5;l1!-|Xg60Nda)oYre>838DX`#DX+JgRhsH15b zb5Z@6s!Tl9H~PU{Qgf)<;IcZq7dUVAfEu_f>TPtZT~%+TMej9r?MA?T)S=tq&sY5o z`SVj-M1lCLS9k*upx#Bvhd{OcEvN*k9cXhQSbh30w1ugw=xT`YlmiMAMigwe=V@lhvPvfuyJnXr7#^ zE<6ZhX=<~7z-6iXcEew``b%3F%Tc$tgXF5eqg->ITI>NXUwxL=G6m{;G`%ZSFMkey zx78j_AVumCI;?z0{R18Ax~qP^2r9+u<99KvCF*A?kW#gEGc?Q8Ur>S7J#`8_G0W8( zH^4)M`cFD1T&b?5*;AEz$znLVuTI_#V-M5hGmtLzHJWsHt6d5Z%VTvg&GmcKS@iRMqCWj0guUu09gsftWg3ZowF5oK2Gor{ z@cvYtlnMBt`mY_p4XIn$Pf;v?#Eg13z2;x3@z2R{Bd8bB z=K8GqJ{3p2QSTDLij5WD6|tPRYNy-qf>rcd!0oMmItND%Rths%akR>(DY%o>JldXd zwyNbo#ll#%9vfZ5;?^Z9R&v6{T4nr- zIOD9Iw?i0jC0&HR-?B=eE%QXHtF&F2WOeo|j3ry`q|NmdtEXPzQmw`X0Hj$RR6{ev zYOM-frj;!%fwQcZQz>1x)!ttaQjS&QIylO;I&}*{=`E1y1vdaA%q}6KU0+{ZwN_+{G zZmX65VUV9#ouub=zf~D|pRqE1fB@}JZGH*wE~ji~py__<3GG*Tp89ky;MY#2Qfk%j z)Zdiz4>@%%8YKMGhjjig=F|aiv}K)oUfmO-WI)C_%Bv+GnCt=ONO zx}AZxXQu*7Z~>-HX%>Unoc5Xr6{pjRaB!ZdSw?W{cY5j_7z;mbxE>)zosRt!Dha2x zs01P9^lzu2^6WHg0X$5fHV#7&7tVBj4%41zG<~6R<;)isU@Y*A)E-u%&MZBEaY;DS zNehR}GqTIT6`ctaqOIhN$OMr+IOCrOEA?j_KS6Js&-_Tsvd%M=6EsR^n(0;>Jo8ls zxY08^rh%I{vqb9^!( z-AgI2KicdJ<1TR{k<_vM_cc! z!bse(*0lx~WBnU#J0@5U(B8x?YlSJeMC*l-;F7JKs2ViI`nzb5RBQbs0Hj&R(NZYg z`a7!V$*@j34=&TXND7i={huC!$gw_1tGZn459yn?`PMsWj#6O#!%hebt;J_x<+k-- zwBjqW&Z4KrUF&OXv=v)lc@J$R*3T)KT54^53c;6I>)JzDZrw#G=L+jc`gvDcC(@## z-g+zTnlxG4cz|oRHv3I`4)U9@%Ro4IE;GKmi6CnkI`;soXRNbEAdL(OJsF!B?|cZK zt&DxfP-$m;|2aC)$(WjtczPI(5(u9$d{QBtWc*9-78@qF4K|&bw*IhkiTM(%)BiaW z7}GA4Y-a{qE&Kf8>8(+1jN;oC8{lU_D5a7=>Y+v6n$3IA`tiqWV0^8w9DhGKQVZ;- z4O^kPuE`3h^-sQmWWzNE{(fdUmM3kgkqzC1$Hj7>p(kbk952jjlB zqI-Gsk91CA%VR1b-Re#`{cW>!a`2lMgNWhV>pNg!d%7k1wBy_sbZO@~noR6Uz6+i2 z?o!HaxBhb2{C<-oBH6=!53PH@p=Zs$pWcP!hp0?=->(?~`#%Q1z~2L-%OL-0TMR55 zJarM0pMS51mtQVdKz?{vIb!(rHwjvg?7xE6qrS9hax9OY-N)C_rlECQ8vfcdcGD3n z2Sy18Q8+T{MxfxtaKDT;XNLV_2wfQS^I+MPF}Mo>xiP$!BNlf?LkkRgG0x_}QwQTH z<-mp+hfYKIobf(Ah^HB+A|RY$ETFS$_Dsi5KpdEFQI^J$Syzdx;Kb~>0uRp2w?2oa z3)6E7L*&XFTt$wUOer+onenuL8Ni&P^-mykK`BTSbN7EB(af>EaCC!Nbq6XjOk4W8 z_DyCL9lwfYGK>*t9P`683_?8f3MCg3n4)TsTTK2S0Ex^`Xp)q~44|$1WTxg^a4F0~ zi@~KaUnD>?ooN>VVFt6$62?+lHk4OOV^z^N0n%Cft)Y^^3gKZ0GFdN7AV=g&R#Ou?md`SGhh_om$O%MN$ZDV@>uuJ-rHHzS<$DT%J1qNS zAa_~c#KCki>l-?6P{R5-5vEI7YySmT#`^mJjNM~73lVNP>-5(k6|7m>1g~VZ($l$$ zHBPIO`z(u6#QA`AU<5%_vyL8vqlYZUTL3&_4b!r@hLxKSN42cvF}ST`#qR>Vo^_07 zh7GJlOK3K-ylLCJiM4>z;?1m$anNjGJ$M_!R@T&ZcxYpNy8xH5ouya`M;$B;deL;U z9O?Jh#R_kShi+EeJ0Oo)k2_$chgCwW?kB7{@4#3utCjB!7WmIc)^OtU76L1tL9+VF0pF+!__^BSKuAJ^m%~c3#=xflq-fljgq2i{BFa9dX=G1An64qH2RuXLXCDN3Un8p< zDi1WQW`V2LNPGm%hZ^>jJ8RMSlU94J8s1gV?9uq@3dj=;)_VBs*RVbal>v?7Z-H}U z&l!SgC-xHB=5uC$NsB2r_A#0oxU-k}Ax;nW*B9XEB725%<-zO=KLe1-uAt>p7W+G@ zeaU9G(S4i4&Zk1zT=qGdHRiE}=iworeSZz2E?}R%54VME6AHJ8{oAJq@DAJ84Z^!@ zcdBPA#=imqyo9YWfwoe%2Lq&xt@;^m@3FJD!b+Q_x)P?_H9P8Ir9*RV6}V2#sgD5f z((I(yPPgW_9SHZa=KEBw)T8<7KH$bRv*v?LXl~bq${Wph?P1eKt78c8^IBifwDyA5 zJQ`0|txh&H-LxY85ShEyxla&;ht{4W@ZhOcVu*qC(t4@^a!D)UHi);Dy8w^8D_XJi z#=fd`gK|sPwDJqV`D+QOwk|+x3;lzeKrQ`VaN$~`RKTC2<=Y7^RcnhQNSc<)7_p>l zS?AN}YK3G%C0i?#@-jJEyE4(0T&*u@+a^z|>nLK$*Xo}Su0-oFP3B6qvgt-B)4KNu z`gc#ueFKE$T47_bQmN%jq+$_h{{;2TQLOGYiK0wCt;)GN4sd z1Tv^)v>lp5T1=XCJkv6?#OPkoeo6KJKH5LiqR3Z!?;o(@r_H78s=xM!lt2&A9=MK> z0=5779JnBD5p7EaYfD}N9-^(?ineg=?cFeaT|1GF{zYipR00>N{RQ1)(b{1&AG)D! zw-cH%+6mLZ-PAs^6PmHwPrnD3s;xt-=QQo;Q!t&OZPtT6WNP#8!Dg0rv=3CWwX^B~ z$ki58YAR3LC<$%(+Od=*D9~=8{is51R~rb6v|n|@*d6VqG%dQTT@?Uh#o8NQ0A8y7 zoE}|e+OsqpyQjU6_V6mS{pZ7GrS|r(5oeWl#y>FDul;8j-~-x5v{W6`wx*TKkhUk~ znV)Gp(N4>-_Gx;#jcCU_1n!0Q!4_zaX(!QM>bUka{dQ-yb?LSAMtjKvz-@G-`p`VD zQ%@Ch7j*1uV9ZwM%*U`|rxP9np}kHaJ!u_uuI&WCQD=s-5l%WC@8ehCspCvL<6b&L zbHH8J*`|f4y>)z4(7dWsN=e;oIv)t(AwlPBn%dpcNu*tvB%M{Ju$in=cnF#)I@hR} zD^*9>2a=}qHNCadb&k9O$zbL zc7V&*$vX#JfzA$1_$$Fm@5;J!{871ce^38sCJYMm3u;r*db zi7hlA>5O@zD>XW^G8n7XdG9fVbvnjW`qZE^#}1l}I{YmNut{eRedVrM$I}d4i%xeI zxK82%hm(CUk2)lJgOc2Cl9W^B$dUQIe*5--M zhNp1UtJ6=Dy*`~pA=>(NKA^fEFI@{=gmg()z8*L~-Tv3G>970IOLQzimrpbFKwZtb zXbaXYs0TbmclrTrhUwpD;wR)Q{j6dtm4_dSQ{Y~9M;u#&5Lm-cJ&bT!xz7V8eIgz&y@ zY$~FDp!+MWhN^YnE{DyBy7f!o?~(4t%}}Y)U7inPwYm;D7?3*MfoiDK>%J8Uw+*_! z1JLZ!m1w|9x9+F35P7WY^ecotx%jHueovXuKHbrF1mCYaaSNuO>aINv z;h^pkn&}MbzOxFBp6Q0sD{@$O#RSN6-Gf2!H=_INA831_d+-oUkLqeafax*akpTD` z*JaT=d{VcZ?#(G(ZC~JC>h7kg-?T2f5(6@$dzY%5Ug_TL0{pe^){Ed~b$i{wz0n;# z2GcfkzvCdX^K)M=1Gz9)mp*G@JNGW#advY*)(5eld#VYe2U&46a`+(lU+A#-p*Fw$+_Pg2C>nb z_X{-7>$Ts2zYBWr<{(a6y<-Mwv(u9ff!OPH90JZ+&zp|@xae&>j&NP|4j%#Mrq>h+ z4<34_j9}%W-Y>Lw>!laWL7bQLmQi{3RXt8CuGlp_y(4Jz(L1L`@V#d-T#5}#;FM%u2D?bHcp`OD@xUJT!qr(Ib_4a-OE06T%o<&=Yo;BTLwR(>!F^|WSus&}Ux z-Us!@f}t|3*FiIg=Xz)N!{&%y=vx@w7kUFL5X6LDu?l2T?>yxuru5V+VCAKr;t}GU z*4x{NkY@BY7@`la^!8Il?rXhKT0gk!k1d525B>T{z%S~5#RTW6A3@t$UiyFP0C!1$ z#s3Qb^^e!XySM%#x*x9Sck*HSs=m_}bn}{iWEtQ-`Wo~L@zr0f0~J4gYs!cF>$~rS zW`Mq$681s*M@OLW3acH)HiZY5EhVpBsc&;`M+31tdZLuSy7S>7UyOE>S;w zDf*tIU%CyrWc|%^5Lt@;Ak93|^uJ95aWYu)2*lZ7>yOZMG5C`lT{5VogJFIK*&k9@ z4D`-I7+{co8gT|1w9;BM*kIqM5QZ4U&>mN)f!Po|gc*cRz)HBmuch#Q-9U30NSuM~ z07fv?;GPX^rWyPc11sqUI`g2JVNm@oI$dsXj1r<122z?GRvK)hd1S4@J$f6~8T{J` z5A_D#AAmF%Owc^5(O}OzP-!xFRSuPA1BW6ATMWv_VYAiX2`y0D4E}3{+jax(g9xI- z;E5|dbQ%o*h~T>n>P~<>HYlVuWskwhYY6bA!6q{ZrwxMXp)+GJNSUoy1_xiD z?X|&2Z^7-X!4(GDY&c(1(ZqR9|0TG+z_FtZYg^8)5%{y?Jfj!1J?BHJXmQ{;g@AM9 zr29hCi8DkcDbAeLbI|6(`G8J+xpId0z>yp01br06ofAVfoE{u~+Izpq=?H+(lM`11 zp%>?bHo9_&GZhNqWzLNhjM){=`V}yCmD76_g5xkG7}aL&ytv|Z<9D$y3fdFxZe z8Oc%7=42Gdkus<^I9`;gkKsr+LggmsDb3wtIWx4m7020_04wnvRyDW;&hb46{ubvX z{dN;MWd#r>as1^_N#>OO3S0^&@N0Na;|x$zES+=i5x5La)hlRba?Va6mMo6yeR$92 zL{ow?hclmMR=J#E8lGZK;~U^gIB9n=Jf)mR6(D7t!?c6{kfWd~r$?OOH?Ud5DUU%c zwVc=V>7P2zojV})oIPz2HgJA1fl4DMsT6=F&Z!(k*32>r10&sp_vn_-d=6#!tkZkAOPr~)H zn-@TppbqnzC|t*RJ&yr*n#ZAOlk>cjG)r)qH|2pg*LfG|Rqi(L%S{lv&wHOLt~}-y z+=2It^O7iy<~h$G5!c9T-uzv#8Ets!BlIE0@GmcPGuE)C3~lj->0ct2TZS7V07x?I zD26b_uz>25(hSAx;V8>6VkJD(86F-6yvxvFGupZhotnWtHrznPaXp5SbUB_F?pzFb zui<>!Xd5wfpheRQ!!18RbHXrl1IU!&a>|^%G>o8gLeqw4sTOR;kaG(GzA`*Qd4|`9 zCtkqVtYHilJH0X7-~`Ub$d7)>=Z*fM+0z9hIn`X)8Xa{9=VoMg3Xa^3-W)<#{Eehr zU^BodB?LBujCPb@T!M`<=ww2O(TW2Agc?QdfM&SShh?xCZ*;WG=COZApi1P|6gGPdbP#H3+qr!n_Mrpec*|3rQhY&tDN(u&U#K?Rv za4(FiG$9-{+BXPp%!u(1{EZt0{{+B<5sRueCyln#lVQpznTp(A8Yvo}Ic*e1dBqu{ zHI4A_%IFFg!q-OCRTvi=t{@40KhHfxACl;R8ergF4z}3GDV}aZ^62ODF13w_#V6Fxo`U~Nzo56*0HE1Rm#*Mm9SDO2q z2!QL{_Y1&9a5rtn5JYmn{SpC2aU)l%SMxLN(+ZgO3<&=$+((-v7A zcQ6?q;<*d1z(WEzy%WZ6aetc&(}`Ry5h6?C+RjJt$=o9@;8M7wRD+btJxd4a)3|qN zVVllXZ34;Qy3<20lY4zT{AF>!q2m$R-0s8Ra=4#UkyI`>cRt{G+~IZbkk2if0-%6f zb_i{STovuf+~#hl6k8E@q!jQw+f0vAcPg%P?}Ozau*^?%C6$7s1D#hHp+?HOd8P=f3Dd|2nvPX}h(P+x0dyySUSTK-kS~n1boYTosj(_i&9UE%JnWZ7YPm z+(cR?^>Onl!Pn2td=9q*+<_dZJmvOGK{&|Wd>^AU#BF#Nu{`5?P9W-G?s+=K_?$cN z2yG)=Yq|h0xY<-)Gs=yVfg9ttID#AJenHdo3GQY?z$dw;e#+yOT^G2RPK9H;|+u&z{|Y%^$@N%Z}A{BukZ|x!^2fx!!`h} z@fOo{@Zn8UX5E+PodlbHyh%TF#h+(MJ4FG!lPUxl$ousca6!DU^Pm#U`{Do`h437k z5K<^le;-H~?=yO4h4a$hLV(wKig2hz@Cw?%Me5$Vc-i?!pERn~f-P$Ccs18V)7tCS+n`@Az5=)(iv?qt}k z=GC8v%0r$N&AlJ-@@P|{h9?mNUdz)K;!@S|zNSTJJ@3u~Xg2V2oIx6SzE9z(iTBMH zXlv%VFk!QWw{-zLwDLN0;jfK1eF?&LUPK{Gckqm87Td`?Of_U(yvUzmrJEO!2>4^3 z4`mj5c)x7JAV1;F{}ye%JpYG?rH?ms7j6B#j`x8Z;MGk+_>}h>8>2hObEH#dL%axG zg!_zlfpY1?ynf2vKj%FQg~|x;AFAAV!Apt;H_AJu2{Ohjp9?b1YwCcp3Ep!%1To3$ zS_k12&x#gJFL_xnAe`oHrDwqmZ$FityyDH(hUwS5hs)76%ZsGVuQ$A7&A{34b?Gg0 zo?pp>zYBahrMPYR|5N~H$2T`dn?2uV0RRsCsbaJ_^1W%g?8JZ251}*v+jDT_!p|@Q z+?Ag<51n@7ulNZabLZds99BH|@6!7ABL8AD0G|A{^xs{)`0f&fdx?MUeE=@=XY-)q z&3~WvAFlBKq_px?{^LEcd5!;<4*dD>bHm}tmmfr#L_fa$GkEalucT#l0H1ddxIq3h zN`1uff7}USJbwXYRTB7m18{qbZ%4V`M1BAzY?An`v;mvUpQ8123V)39-l_b2sxV38 zr>X%+=MVpH8;O6^0V@*Q|6=bQ2&tl)2>8i-21@i|zj;v3RW|2}`*3GfH}wD};_{9;E$_K^Q>6u3ux z=0>R0@Vx^OQZ2vh3mB{8uPcP?&L5)9j1Kf*mk^xn>8d>8 ze@d^jUVhM1^r4SG{WFa9^KWK?4De5Ef`_O4cPIrs$p3|YHbeYPT4;O5FFFj|F#q3L z;GXlx7o$fb{2{7we8KbnLv~*kgorL9mu4 zkhX$t7vR=TV6FwuUf_8XoP%KKR{$IZ-_zRONl^G4R-6URFQMWh=%;nRtKe5U>g^^t zNxxlpfd8e~7Y@)e_w;+hVhH^z9qU`Hc zLBs>VuL*`t!1)L=C{ODvxVZ*>@Dof?<(t3YoyBxp2*mVY2^3r|03b-PmiBgo1%FdY zJw$M_6eLt|m1-)(1Pz47EJO%$|mKrBgu;;m>) z7RVL>kRm9i8zEI-MftNdfhmnky5Jf8v&Rg<KBC4#VP&@2^bd<)ZM0@ngqxhJ?m`yJ(i1yrF?AuypiW~Jb5Cg4?qN-C+jFQ^-U z<^#bP<;1H6p9o>>p6BTtZf2&4Mf&1h~xm*A;^0VA$1DuXhPQ|m_LiQ zZh%1Woj9w_(BY8F0@9ok36;5qSL!n=b^JH02l-9Qp`=F+oEoRK^8c=p8U2 zNNq&alY%#teVr0i-30eiATNdYX~CNPz|9C6KZWp>U4P(&sP&g>O?nGD!HGh9FpIIs*?OLasGp2^Cs?0YI4W+j$U% z3q8-^qFxua(k^L)@UJ=GB855hnaC*NTdP2#g{wk9ZV2=Lf~9i&@$l2-GNg|%Vu&?6kD>Esh3!w3EA6%J5c zZ=bN5(pvq(L-{Z^AUrICqo=~(|ATN)==K-LkWj#c+h;;sdI}E<7gLqtbKwQr(Hs%( zrR}E|!p=OXj0)vDVRKAaMsvqdSTMXqxRL3Z&|1XVHfh=!%O-&WCqb(L1w%yNPz4hKjq$E)YTw z(c``Fa8b0h5K()IZ0LB4m#8-zkzEokj6_J6MOz2a<}Kn=iu8)ei1wMUitbQ=*F+*A zgg&C@RA%if+W9fyexiUrsQ8P<--DF^(Qm6k0!2z%^#qBM{opTHv~3{*3=xI5z(c5L z@AohkCR#1T&oo?A@(kQ{Q6cT_M2J2fhKEQ|1yw9Xi4y+>i56w8LP$46ZZ7CUjHtdE z#%_w%QC=!mB&X$SoM^rkaPgw@ZxBm@Xwx>3TcTh7f=Z(3R{?@Z5{*!uT(U^yfwmNp zh@N$+BC9>%(nLSagG#z+A!WKVL^U1YGDXIe$jTBOrIm2DsF*%UmLm!tMl89amy~zQ z6B%8>5af$?S3p=GI+_Y$q3DOZi2Al@UpzeA70qn}S1ejYuj^7#*){}GCR%wIk=+x? zn}919MNrD5Li7V2PpTA|oioUMO)_Mx<3?6egN)~Xtftq zYD6;HMyeIP?uC^)kv3&O>P2rigEWYE8X%3LT^+zRiAKEOp;`1XC3agyU(;8b+C=}+ zR$sfQSr^7SL{WP{Iz{{IV601|%0evNqAeez506FL?n1LiBwmSec_JF2{qSDV^M7Hp zPqc*go%%%qv^6{+8vYFMry}q3h-^@_jWQBLqJ{KbpJ$>^=Avy_RCop6pNnE?QU5|T zI11sY$dx90VCJIasfCmwqT*{g1DLTn6_ex3T<}cZL}7(7Y~%+ ziaCgv{0z=f?9+!%JBhc@q}y3satNkf#NTE>=qmnx3>UyneEm8A?qY8lhQLGo%`3EB z6z}=p;zvAq2RJYBQ864{5?`j&)n&2r16c7EKf$w^eMRh>4dGSsAmcpBI9Q7yrpcTY~t*c^I=>Vo4~hB#KSrK$65ucA+g0m%?Qp&VJJxcvrV$r9Jm(ZOu-a#|whh$r)4I#+zI16-asPKf^H zi|f20ED(>~LJ)=G6RrT<7SDTt3tlAtAr{;n@zofRyW;VDxGfgu8L`J+WN?f+!dFKY{lO@wp$sRf>PGgG!Zne-#|v7vE|C?txf~UXj&eeiUMP zD9)$i$46pOEXJ%x%wG;i>`R-T4Pp`1HaCjL>4GM~8wK#;9UbABROE4X0JVzgz@y37APxzMcf)CJ#B;)PP5GEUk z(TX<3cta(Gsm8362r122@h^;J7zZbzEz3B+79O&V3n+D*Yy6zv+IhxqmmthHJ|Ly5 zY3y%BSJQZ{5`f#r+6xhNk?|%=0PYx%&@cI}@j6PFmKb}`?4s28b_UwYj0GP+v)p(g zRVh>$YqmhM(s=b22&;_a_%L?gc*E~-^uSn7spD#64|n)`X#6pKN8ypNlIFBE#_ya$ zTdlE>j`GzR7g_*UZ#Y{t zC(yBW8$VJT<;z4=aPl6LgOa8IRMO z>zVQBH2{W=uGRV@me$B#*B}>4Ki;0b}HOX7++igGHL969-33e zTU`*~OXHG#5KbEp*CL1+;~9Sp-7Di2-e`Mm+(p$5v&M1e5WX>1ZGfhYq;mx1ykyZ^ zXuBY}6$XE{l3$Ynx0CqMd(&Q`7=wy~B<&J}j*?YW0qrEQq^&n+N%wkm#YLjI7D2d5 zv;x4nNot-UPIpO)HHe4g-;L<|MM(>lCVEPKvWCq|k_swmye#>g{^N+Zq=K>zS0sPh z!oyXG&j0||B(-i(@sX5#0MovbMKr(mlT3NRroUw6VHgXL_$UAmlx(MzUXbJzmAnT_ z)RaODk>t{oFI3{Z8X<*AM(O<9b;*~VfJaC^qRo>?i7#!TMM*LbVnCuL_bAI4BiS+z zW3iHt=&2DW5z?Mbg5(WV^xTpdoQ6uGWK|8^CP|i6BC=#jVF3Us65Uq_K20K_%uu={ z%nK?RlD}6&B~vm@8RRU<18>;OmV8Im^f{6-%7W)g&RD>Eo+O*@>3qp^%HdOpUiSmH*%i4sZKaR5ps1~fG)lf1ePE9DXc z`nFVsgh#)uO35p#E2)y0tpj&o@)=Fc9!O>c7=mia+f*GkE#W2TW(lgM^x#+WSnUzLf; zavmJTnsh#ghd7hDn-N63NeS&NCzu!P(J51Fqg=zX<>hCI|llX*9W84o6KUnq;NfL_n+E7Lzku z0cbV(msT%rCNHkTQM<_+U)bz0F_vS@I!%UW(W5St-Z|hNn^c*?dymQ5Vi>bEb;?4I z>`e6|V9eh1=TmU&V7i8m*#wy8{{kz4rYhQ=2{Qef=Ip_y&nX=iVtSnFZ9+{C?*Kg9 zG?Z4t*G(T%em>HazW~AnQ+HE%xMkY;8p1?VFCHRGGF{^ac(Untc@U5?7LEHK?p+v$a-wRFs*+%)MPR4Poz_JdTKKBnh0Ub>DI*n_((sbPYU=+Wgnqq{?gea00c^(u0>mr^iSH2kCf)W1RzT4?uf{4NJqH{ zDMlLYgtk~|#zt`Q(!Xi#n;<<&56)ZC##V5NQW=%wCP{Z$z-F>EA_ssJsX-@9r%GL@ zbT3W%6{S|wr8CHYY~fabTSpee{}fVOU&)3s*)2N(MFk8E>ti8-nq11#oE$En4HJ zGu~`NXc>&i9^f(=84=*J7_D>`I-9YUhBt@toO+haSiT5c9%K0t^emq-pPuOjj5^vq zDP+v~5GuDBn+w6)>}A~h8#e8jq9MTTnS0a#I5596hl(R} zZxR4b%(Yzz*O~d)7+1iBxtU%GuFQ=g5V|qP>8yi0v#|%79!#$bz+Gex(ay9d^L;UT z>&5&%0yZx(?;(4n8O#)yYRu8BVa^-YnWO2za--T{S5{jOYmTND>-PgNeU;@(c^`k) z$rzpgAM=l7HE{CrB6{Y2(zglM<?wt{boVyn%bB_VZ=3gwrnwJUjx-F9SlP6BU&Hc!4PhbT$uiz_C*Ryn>RIBRAC*fQ9KJSPUFmnFcz<|unML#H1^S5o2jveYNxU^exzwc zwnpu7SeeqWzXrfd4Yx`JIIZ!(7{VEihcp?n#rH&E#g6?>D2P4#bSX3)*xYU4JlK1v zTIwQOaRvZS_7iOYyx2!~!jUigJ9-@Xv9COaO@Fp_0=NM7kA{F>XDhv-8NsgD0?kOa zbtFhU`wpeo6WE8!!KJg0(Ew+#CzH^>0(O8c;DziydkD+e`a=l*9y@shdV5}L9aZ{W z&~gx9T)edQ?FQhI)*+fqhHCvmM~lL=Je5!h*Sd8VHwa6l4|S9evaQ$6xVPap!t4!AX(G+8F9aaUtdG+2 z(Pm$B5$+AMqq-2rn60J>|4lRP6c~#&E4c=@8D@Kwu##`qI{{&V+3Z6YyJMC>bCP1S zO4{eGG?P>2qS0(D9LAc=K6(f%EoQP=aII!BR3p@GmKq3nhnegMxIr_eE8wGMcZz_U zF>Co8&z+Y7+$`Jr-*fRW&o&~=hpH%Q^K<&>LzMY%;Q&ONn;rmn z!#sulQ*w+smzM1}&70=Hd#rivL70v+fAFc>q1(a?Fp?(>>Sx zn@(_f=FyaV%Qt^ay)7{JrSE(fnop?l6TWT!Ic>QVncsT|a>x9?Rq$}ve044~i_MJ| zqSGbjD=5ucYQBroW@YB_v{P`;+@7)w<>o&NfvYgDpo-Z_^AoS(_P%*&0B{e?wX`9u zHut%V;dy9ox*lzh%$up$xW@b`)u`8+KdDAroq012NWJ+=I)c$)ZgvmhHk$uN6$?$~ z_jUl#Y@S1#7cJ&%lfbo_n^W;joB4D-B5OCdTmmZ{=9zRBqSKs9C22$EeFkE>1@$C1%I9v5zEk{YZh!ZxFCyFo=}OfNc|4MM_TNuhh~&T(5=;@fC&cPuifNaU^sW*@i?7F+3f zaEV189at!}h2*iT6{qX zp+Sqgt?)2pVMDbW&n#YkjkZaPbq2sqS%j5|+9GBU!dZ(D2aJoO zZ1_*ubdvo|6JlpsIqk-|$ReM^w5#l!P~hBTlXL^Q%NE;1=plQn4CJD$WfGd6vSI@ z3E^$ogdNCz+5EdO{Xn*d=FHWy19pHvl&yIe+#}iYFVOcI+1M?RTG^Mh&s!%;>qTVs zvXb+NtU*>l?~X>9ED9>kGT~1Mutm1@1-Mq3Gi83;WDg?2waYG0HA9DNUJR^s%8IF| zp-Xn0xNh0K9SHuhY}Yyndt}~p{^y14z%2+zW$xRdGA`>#0hy2~--Ev?S&%VQUdlGo zl*7UDUmTJDXSP@ zxsWzM11%j^A;2KZvxk5Swj3KlEFqRVmta6bEf3QJBFu6redHzFvdsXv>y}2emWZ${ zDS>9B<=R~svnb1hx)_3J%ZV5myJ6W+snna6Z5mLCwRGwRJkGM3@_O->d+1vW36?Dz zFiN*9t%sqRXxaS~ZAq5CrVu7uR-Q+vQ!IBZ0zB0+*cM!xrFS4my5$A|g2=GkCP8GG zmLdPZUzX(=`dUY}Wr7bJG;7N-wIwOeW#d~ODzh2hVx0Wg}GR;=e43@-5NJPJRn3Ny~Z)5OwY{pK^?K@v^Jh@K?R;he5>B zv@Cxs{B}@%iLodGJYaKFiza1Ww5E z&86@VwLG16t2|a7+5ygYWy~X(4qVBNhA?!ci3L1FuKdIuZ8ujQivbx~Sz8J#FIFzd zLfhENYAV5by>c)WQO~Zta0_l-R(;oxj=8RyasY8#)jNW=ORI7jfcvbv5C{*xt4`5= zga4|zwA-JuYWF^bbZ6Ctw*kMqN_#)r8dfzf1J}Fi*w^Uv(^X6BARJn?n+LbUs}|9= z%E&7DGQdYyt)(~m_^Py7L^io<_D}eGv#Nxq+2>cE*o?0Dt#+^l30VC*l_G|&ZoLLB ze6=-gNkp$c^(RQ&YOV`xCat!53nYDYjSWoatUl8Rn+2;!8bFFxFJFST;?-MwLCRLQ zEP;pU4;E|b&H3N@^7s5&boh@B`eyH+)s&h0tKSTzA&3KdH@CBSEGs@`9LJA{}?&lmvmm4&587136@)$qQ z0m)~4O0^PY3~#ElSTz#Ibbf z*BZ|%`3779>yHMQzQuAjMgMYGcc$PWm-X*awB@nBT8hZ>S(k?pZUHM$1eHRTj23T2 ztmBhtyTfYQ0`4wr-BPF&vp%2|Rtd{g1$ZfIxC<&ZER$*k(ab8OGss=6<$-AHXYrK~ zK4%qqAkIlv=J&8N%ko==$Q(3!Gr&1&T%;tYlSV(4k~nLOy@95S#&OD4xoRAxEeTr`fD)EFdzXMujr8wsL?}Py+ImvR6H4?5xW6#hHC72 z4K7Tho9g|;HCDX=xvs%;KwE^yaoQY=)aW{g;Yre1&PTYJ8Y@qL6ln1NhOrWjOQnEU zX*~P@LDXuD(J#40qv!#+ZjFPc@cvX|$02Zo8Y@`{en>+q0PdMa+-_JI)@Zat|DJ0s zr$Vw3jg79*e4$}YMIf^ph2J5FHyRILLDPmELDe7U*$0vVxWE?Da@3anH!WQ4*c>ke zVb6}GvK>eEpPp!QV&8lLO=tF#1Q>H+$5MTzEBo11*mPrmPt#L(_V;(dd9V}db$pF| z{329**bi#Z=F9e?ZwdOLR2AX+vlmhJBY+)v0VI$;5(mv-?1MlvguRB24TrJ=;5M;3bql`l)JC?Rrv)D0|$IfPdupQ%)!`>AOW4Y}2D7~1+ z=1}&ogk8u4DP?b)3qTp$i&AX&*!ylkvmAT<;40YrtIUGd z*{?@1E)Utqsqps^d*KvfsbTxSf`?jm_$atKwnq`*_3RaH05q`2DXG-RcJTmt!rn|9 zj=k*bv|-%GcASD{Kl^8zW)83o!_oGX{e<>$huHd*uX@Hl<_FDT_MTpF&)J@I{(6M{ z#29+Uzt9*206mW=|0UbkuZP z1WhMRA>FCYnmf0FbJ5(<2Dh%7!K={~H%*7r;M_Goeg^fQuA&a&Ja&-`G(`%|nhc%EOlL`3L|;Oiw$V1lHiaUtEbidKqAV(_A|lH< zh=722+yMo}<*0}YDvB!t;_mcpf^t{&oP8ul^xr)vZ9=(E_1sU3(Yt$=eiFqW==s=_ z@b%rEcRmTQKli-od+5ZKy_a2$%0Auu;7-)?nck;yC*R+D#TjVmyS@8ehXN1x=AMt9 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

)lT9s;fb7@4tl;N1$^vz0N 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%0A(Iu$!~o&||zc@gnxVYIhM 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 z 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

d=?zF`%IV~m!dw;v;sxf*3qed}Zn_C@k@*2_ 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ν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 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su new file mode 100644 index 0000000..c37958f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su @@ -0,0 +1,4 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c:94:30:HAL_FLASHEx_StopFlashInterfaceClk 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c:111:30:HAL_FLASHEx_StartFlashInterfaceClk 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c:128:30:HAL_FLASHEx_EnableFlashSleepMode 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c:145:30:HAL_FLASHEx_DisableFlashSleepMode 16 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d new file mode 100644 index 0000000..ca727b8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o new file mode 100644 index 0000000000000000000000000000000000000000..ac417c7f5c076f50d43ae4aaf43fc19cda1b5eb2 GIT binary patch literal 1088444 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 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su new file mode 100644 index 0000000..2ae1321 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su @@ -0,0 +1,8 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c:164:6:HAL_GPIO_Init 40 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c:294:6:HAL_GPIO_DeInit 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c:375:15:HAL_GPIO_ReadPin 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c:410:6:HAL_GPIO_WritePin 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c:433:6:HAL_GPIO_TogglePin 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c:458:19:HAL_GPIO_LockPin 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c:492:6:HAL_GPIO_EXTI_IRQHandler 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c:507:13:HAL_GPIO_EXTI_Callback 16 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d new file mode 100644 index 0000000..fb52aed --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o new file mode 100644 index 0000000000000000000000000000000000000000..9889ecca9e446e46a8131a656dad118c3789ad14 GIT binary patch literal 1089492 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 z

    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

    u$dA#(R0%b)jtYmhIr zFBZzzD7f7#->9rnQK9|+$Z)TGm)a$bKGqS+*Ce>zE8p3yQBfx&NrJe@-Mia2xP9<` z1Z@rFYj&S}JA*ejV=z53+$-PWj!C1k20@{Gq3y%H+V^dcFZlP5;a>T+2Kge(ORM|j ziMU}C6!ZGzjq+IKw2S14H|+r8^|sZ-LZ;VHuT+TAB#f?#76 zIwu?%B6sh8Ke`M_8r5I>It0P@YG2-xQBk$KN3z_zeTRo8jheqOM)dr4x=+3V!H#UG z9~c=TneT32@8rp%h6h2R`gI9z_iEoaLB27iBH8ZUzB56-u@%Gly4@#Vo8Uz0;7Fr_ zxX9hR+t;N*vZ&C$cBp+l?vwAp;TX~He-IKq+$&$=M#-Z32N9usk^Xu7;Ql|hM=_(H z9#!y2jHsExwly-`E8nOfUyERsAIjG|xZSIMTZ11i`75+xG~6rS;SNFjg5#i}e0_u4 zz4C3j7$Yil4lpuA?%rL$YQ2N@1rtO0Li2sEeEWj~noA=|g1E@tyYnsXlPoIKw+Q8n z^w0lY{rX*w5w#+Si46D3H@IK2s7*moC|{(1{_pao3V!INPb5hY8@YRT`w9jZcHN|X zk^cF=%Qr6Q&^+zE4z=-K`OXYT7Ii9!3$-uwIk{K;;{OsOs(mPt;a>T63{Dok9Eb8n z`se?yecgk6rT&BV6&#W*D)d`2p?s14`M=Az$f$yAZ}!RH6{qY z*Zl4eesE{;f6~4Y$)av(-`M-)>-Bq#|7d?G=cr`=*nb&+pL`2~e4%q9ks)&T?)hyJ zer1>Kzg64xfUfb~0fyg(%G{{r|YAR7Px literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su new file mode 100644 index 0000000..e0a0182 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su @@ -0,0 +1,17 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:90:6:HAL_PWR_DeInit 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:108:6:HAL_PWR_EnableBkUpAccess 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:128:6:HAL_PWR_DisableBkUpAccess 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:266:6:HAL_PWR_ConfigPVD 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:309:6:HAL_PWR_EnablePVD 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:318:6:HAL_PWR_DisablePVD 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:332:6:HAL_PWR_EnableWakeUpPin 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:350:6:HAL_PWR_DisableWakeUpPin 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:379:6:HAL_PWR_EnterSLEEPMode 16 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:422:6:HAL_PWR_EnterSTOPMode 16 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:461:6:HAL_PWR_EnterSTANDBYMode 4 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:482:6:HAL_PWR_PVD_IRQHandler 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:499:13:HAL_PWR_PVDCallback 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:514:6:HAL_PWR_EnableSleepOnExit 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:526:6:HAL_PWR_DisableSleepOnExit 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:538:6:HAL_PWR_EnableSEVOnPend 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c:550:6:HAL_PWR_DisableSEVOnPend 4 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d new file mode 100644 index 0000000..8f014c2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..c4e6e3480e04fbf74e4c7eff55e593865f024cac GIT binary patch literal 1087908 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 z zabpI#O^>(W>fVzmKpAD+t46{$mV@V{@I*ujCk(tAo9kjOMF-6#Z;g~oV1Y^lgtLZ4 zr%k7i(W;br@(j2x>Qy-L9!54l2&@@JDszs3yV0!+n!gIJ56s(B6SJM};ZQe6V1C@~ zx7#iVV4fTIm`P@>z;tYyd4j1s2N0FpAcc?WE!%rW73xse`rsj0wSzxLhzFzHE17a{Q|cKE8jxnBBy}XMQP;yo zU278ZQh#YoHZt--&#OH|seoLnPYj>N?OTXC5DR|zIQS2sHTaU`!T9CJKYqIZeS}f` z(|}4C`lsRnN<+u^p>Jer3n7w^h4%8F2I*EFRloG6n`?M3PEYJ!Jfw6}bv@B~y1VP> zENfUbW5)P#pI-214AvRK)ULVX%;Q)C@h{0#ZZ+iO4za{fy_+XM>J0KP5&`C~DjKCm z@O1O(4I(98CzuQ}1t)=r3{J>OiEy};Iu!0Au8OXuWd~vVZy^0w*ZL~mnym?2&-a;I zp8M0`=Y6?-W;Dv{3OzHbYobJN_NV~qb7>c#g#>=W!wRP>fVwuLg5O^$`F5eYDN6xz z9yAjH$TF_7jEDG#$a;qu2xy@f^EadrhPC8+5ca?=5W?6HjCgeo*@~eNod-i@M)v}| z4SX|<>XeYjivy~AU@L9BvbtYr>TSHlPC9su=nIZ2!q7T`$=E`6cQpf z4`1Lpv%TlP?>>HrS3w*EMnYmKany&AV8v{aobgMc2*25{p+*)HTD90BpW!RupX#D( zT-nCJY~jGsgz?}3eRgVI$aPJJVhEgEGHMU|vN2dIXdb-{n|4_ zI}q(>m=)y3+DZR)*x(pD;Xm>Wvma0nYu2vUcKsLZ1Md?c0&X_0RIcyh)pUJlHZ2~c z42QOm=$xfI4pa1%+6H9AJ}A|dO6lpfS4*(gTLW}oK(A;QSH)iBy{_Yi3ix`yAXjG! zbCvUG$%SLr$WFPqibsIXflkD6`M7)(mF9Mwtgz!dt{+q-3%hF1B&fQU>&eT?mBZWg z5kl(K5S-p6atl;f37&nHY%3Snsm~nwuxXx&WO;rixb2Tf9~|kS*U{h^qCIP%J2l5u zdcg`O5^JDqjBz2TA5kjHvmOsI;iaw}DhZw;eJa=*U^L4))jp{{e2hH#UQMrpcWgRk zM9Mt6<5JO(K637{T_tr1cKr-exJ=I_neG7f!eA1Ry={62#Wwi2^&PR3fkP+$SGzI& z#;!9KBE=WMWdT+kZOjLH!C&|1J0Yy-=R4s^jA;Uz=R?`d*IGT-|7LBo85t_2oTAU| z9vQracuJ0iY%epoSy|81sraQ<{l2BC8D{97|&#jyhy~MvR)xr+fa)4 z!XKHpJtAk#8;7f0m?>MRR<7TTgJQ_(={eZ#f+n@hQw7q)w3|(cEtDKdB?5vtg*wMI zHLj@XKr;q&V}Z)>Uocl_hXhPcQm?Un(~hYE=}Da38N41)hT?^$Ixe&agn|+_mX}d4 z?2MI=OsWP6Ks)v4V8OPp$r(9GxfCPZ;rm+AkwLy@3 zO7d}TpPE#K;o0fiI9=+UJPnfM0!N7~9|$+;J7Kbh+}E>M*O5s_6BFx{lgiZ7z5@!h z!(>(GTxGcDKM|>gWFoV>pqc&L+=4lwM>8cjPfvn{1?lyi zB|c2Ds;RH>AGtfkPHZlG1qw!1Hl_L-Tc~}e>0&&9(=Rkg(nPw7!DmPbuv&Uq!i1BF zc0*ZC?E)l5e3T)$@@JMTgU*ctrg^A{k2!qd9Gr{zTm-h*kKAWgFJH+pwUPx`sQ_i))A;cz zx~@PnL~A_24Ls1x4)E|RYmZCeMFt8f^kr@Y?)3vrFmk_crVG>xq zMZrDb{8^dg%#(L2@X=KEestkBNVg<^hItXDKK@#lJf1yey^V`oE8_OFq^sk5W4 zS&K^4X0!m*7_9q(BB0~%zyJE<*Y|I~SaQM+knsdD`*cbqHNUz>-I1#o`9*bmfj$;t z+Z(RsY4gPk6toG?r)$XFOKz6@hN@XF;IhEc4}8yfDen+WB6R>F9z3e7TvyE@HbAYI zu`VEE>uHM(6-b@2)0B{CbXZT$=WXOz3)L;a9V&~AGdca~92PwMcM27F(_PFPvmF%= zH*)1J?)3pWH}#LxFu%xi@8Vu5_ZWUrc!d<4;xwRC{*S@C-!-utOB${r!VqJ4$87o- zs^?GlU%r0&phoI4sr|iw|M?z}@`>O6#_ld|X3zhvd`U_d>Zj8k85Bu=FBN&mk;7GM2JSMhULjV%H+N7C1oa9B)D% z98`u|!sd@3Oq?BWYYi`*j_I8!QU#AK*vI&mxX|ags+}36OHQq5wud0|z;t#Czsl=R zdnT@5eE8$nFG4bq=7LH(S8HTZ6xP%~^opgU4Bf5EQ=Uwj^pFA6>x$5KWe&L*j@n$5 z6Bm8#*uhbW8?mjENE9i%+I?zgl_&6$U{+HUdaK;sV47l<4Nqb*xZJ6W#+sP`Jo<09 z!I0xjHW;y=eC*HIU>>;XAsY-y+-?fFj$-9*Bxb6(7J}r@iz&!?=X*G4FqQa#lo8f0 zaWF;Vd5{U2(Wt7h@Y=B7Ioc6TSY#uTAh! zC-V>={7U*Sr~Q6MvV{>2%9slr=)UR=o*|Rlz~$F-Ka9x zaAu=Db)1`N$n6P!q3?piiyL+i!xyalv*ihOi(**q2iClTqnM!-Tm8^*d+vv#xU7*I zOM2exIS?QXowFuUXtUmui!E#1JiSalk>tfZ9DTvC(VV!eVq%kA#z36Y({T{Lkbv<@ z5Fs2|oI)7!hmd%d$+}Y8@ExX6ihFSVcKb~=Ox>xyqLZ*?XH72+ga&6v#;ByT4M zHaIAFri&MFCvlfBQ#hQp0fO3W38vfA%)+M}TK#HfN5ih3$S5=eqQs$s?0h#{Ph6KJ zSLr=Y8Hxia1h-$AEe8|q8fJd)^g4MU`dl_Z4NTZhg9A{=UP@OHano{I-7Aj>k{Oy) zOx-4oHqv5;geQRU^F)hd80Zyh7^hsZB6hQF5IdJ5`xeH;{9ubtB|eMID!}PGJT59* z=+bwSbSp>-u(TeNmoJc{0N(OoJw{Z89l(xdj=^~zp1J)U^&m=Ro~d<@qCLvl>Z>bt zAmLUe5Wb;UXj2bzeKsr?glAa1xDYpMEI^STvI$G+Pr*hDMFFp?a%(}tBoKV0BYl-I z)~CoRzQOciu?Zq#3Sl7FCz;^mm?EQP%|Zn7OF&fQ-xup-KLsJPD>EMRM;&&5eEaEs z{OSI!_}HHI!?WKel@-VkMUiVt(hcr#Ptmkmb4Fn_}l_hahN2i z9$ap)Q3NqFu1wE@KIdGTBFqoI1mPLQIYw(FRx6W* z%`@);2q%j$)_o-q7*bxI`KEXIDl);wr6z(Hx5V1Apk3wcK_LfPXQw2n zJIRa;{dmBB%wQM>CV;B*iDiRcBaHI{teMveR7{_Y7nm;n?Qv+SJ(QDg8Rvdp`bG>g zf_7jLlVSYFxrGj=DgnNQDi$R5(MS;i!8EY%zFdF(@wfM%23%KfOH85`8yQ`Yh400c zMVXM{uMX@}(D68ahe&(^B_Ssm@|5Gf5sj8Nv3(pcjVNqbpp|p6gCtt8(7A$^H=T$5zWyTQM-%x*^b7cjjS+Ca5K4sIishfojlCd;4KTkiG=y;f*0Az* zLT6=yKuOv1xD!&6@S|N1i^C`iNUNG#nmUp=tBeITGp!KCJ|&(Lis;w2keoc(c0MPNDW8M?{(3 ziiG@E&>WTij7T^|o{4!`AWZ%9zoNMKw!2+8V1Y$Kne!kC z9_X0;zzEaOwAgVrJgv@#r*?42I4fCNtd4HTZCf^Gw;Xs7!ml6M=}zpAI^REUl%AAF8p(QdAJPJpz_8qemQ22c%^Kr@v`2dxS>h|zY(+MP3)xljrKUf2aww2y z>&-kWLQogYCwO(IJv@D@a!+c|Q}}7Oa9^habp7=Uba1=-_xG>{72n(kH@<2Q^q>I_ zhrJd*syR9Xmw=jQ5d{l^%*$c~qynikj~%Ax!O;UzPyz{Nh728;0=Zca{_g$zzw@1m zjkuySLnSuZCUsCAflFDE4y^v2c;sZfbd`B_2JVB{+}TmN*t_cF=utVH@20C9x2<4o z9jtu-q$g*H&H{yNP+n=We>r<2yx_^nH-HR7mT{Lfk5@diJu{qHyrQPlb7H#wG_Evo z7i3^jM+U8G;VOvc3OL#( zw;fk`dV%qx;{7La0_vkOXDN++@{w}Uxsrb5I$w)FYND^QTc9}+NR)b*O(vV2guQg7 z@rkDp-%uJ0a;wH99EqeN9t)T*^%$LPnVoy~5U=Mddde0I9)7^^+uuRw3%F}75WQp0 z5Bt#weljoC1FmBUf~VbWf|j`oaC941kW%M42hFyvmROX(I_Sa_QA&T%q?Tf!X;(OISBvjJ~^w6k_{+L6+EK-k@65Qt$=;y%?3OnRge)H z0Ev*i+R#!I>g$>N1LlR4CjXPk=0jgkb}|0 zX0>C9%DcD!c7OB7iHfH~|1b84C83}xd^x*8-4gf#FxRZS=4(aH1hsTYN~%^4t0-Q> zcq`pnv7kwYRK zNv%^J{l^%36vm)AaQMU+dMfj>cX20Z^elN7-yj2omxn>sK>C^>DL+yfvtEK{=*Rq7 z8pohXVXeMForu{jTx%j7UN}_3!9kTu6LXeDFbzbsizUI zI@^wy@TOX(Q{osz(s;*J%>Bp?vkyOr74~GWI2@-2H4)mEh)Z z+QP@WlP-&Grh7FzWUn|7AdR}9YmgP;><%fXBy6csv*#KTnD@3+e?iL;2ZkM>DZQ35 z8EGNJQ!ST%Ni$bmfex{!yKZC)sS}`X&umMz zdwxMjyCv!My!uEl3b=Emi6~$|f#a8OvZ8lMj%4flnMhtlUvo2I_v~q+`;++q0Qs22 zrl4@Elw8Qm1ksn;Q9;lc8f;+NH?s+xpHI$QQI_Tp$`zULBy zT9_W4waF<6!h7&=i`FdTwZXGqtr^U3%R zyuwL1bn9%F`B=r~ng*bKzFEC^iR1WReEI}cn;ztkbv{Qt57ZI=*mgFLn%>SnpGM9YkesDN5VzE>(FM^t6Sw{B7 zU}<2%wh+J$-pL}JQ_}`#N|Pkg;#7EQ{AfUgr8=uj;WzStnz%}6k8fPi^;7Fl7aHYy z@*K=5$CF<}+1p7QP%w=xRD+-kwdKNyjQf!p<8hhgXMDNdw);Fp7<{dP^+0kDNRou3 z8~;9$5ScIaU7QLj$;sKqGLVTe#sf)Gfsa(wmGj-g^e$0!XofI?>)8u&&zdOJjux`V ze)sJk*Z`U4tF*M@`y&@{PK(L>qJ@XiHOwH}*?w{b)tF|O0$6I)N2SBXoQ$p_7}nP8 z#?tkqihxeFAnPt)GXBL0Xze+Xp!!zhDk{@-aHyQS9&oSd8$=v`A+RBfKufIypsxyG z$HQ0*X38^lw3|i_5|7wtug8>w+2a=@+B2MGF8)$nqQ*mc2}Rbnyark_eS@~r4q^t9 znz`&lq18m<vO^Wq8e0@0&8!F3yJ(bLZogos6QDCUfpC$JLTf13R9o5hC@ z_V@Gd5Aaob``h>Tj|a^yC&(AioEU!3V`R-(WIYlg>|GxzPdWv;qMAnrw>e+;bZVfSQUB3 zYsrl(9>vi?B}bT=6d#D^feVuO2u+2}tuqX}D@0ZX_rME5p%#WZsIW0OA66hpe}_J; z=n6x|xM|}ISBji=PMHCrI<-!|1V%k*;i%YB;zJ9<`A=?+Onexhyns;**}+UB`R+4! z`vUoAK7Dxm-ZXd1cOUNY5E6j-Y^)NSj1%3jZED^A*sBgou)M-v&$ZBbX@M;IJ=_uE zN>d$64WSQ_Eq6D&MUD|G+SHfN+E4c*Xpi7aEhNZCUC7rXo9dKR#16s?)nE(O2N>b2 zlWu9Dx+VCSBE=(lDX%WwLerFN7dV9$aI)gy<3eAfkn52S_1<-^K(QL6ZBR04R#UVV zce>#LQG~cq5VgwmC&$M!_LL30!`vQYF@h=BbW?9BvEe?)s1$(h7Px z4R`jW*;q?Nr2`fM|I)VIG;Pslr#Bej`SR9tGWmrb9V4TvhJiV(l$a?=)mrse5RXyN+;CMmew`AS(+83fcg%c3_Ew(_?CIw7)imPTf8n=S7oDt{)68#WsB9; zNUHM-KQu||nnYiw!$XGa1Cq*-a*@FV`Zj($n130mP2M#Q=AVACTqj8?fnxxclJAhr zd0k&iE328ov*t3uaTVd8 zA#ZddyJQ)xAviM2C9FoxW|w7Q>1Y`foZJP2VwL=|7Q+$@6R_mQF@R52^W)J{0D5QL z>B%VldYyLg*uIi&?scK49!{^#jo>(&1*;$9lN_au1l5T)udu1NU;XbGKDx$d#3a;= zev5@lZ=an2;Lgg^8NQ7veq2r+lP5`>k%ms7tOG?)IW&-^dNF-nzdfm!$hk;MaW{G` zxy8CIOemzP%4bObu|)n+Wu5&2g@ucT1D>hLHSA}oe(OjSTgSTDggZ$%EFs@VXchM< zw2Y!}>szQt)=l)`ai4lYhWS4GHfOCuvo`#+brh_hXnP`5Lp%!In8H(@Tv5+gwz8}H zHB#GkN8v=EvAGHH|3QI@5X~7=^&OZQY$`52FS|s-%N`{2bJ@)2e^@j)|G`hAPUufp zlAo5t$nMFXc5j_u=&kWZi0gbT6%I0|m>I*uO;N^y98ZLBy`4pA2}`Atu1L1oKt%Rl ziq#>l)(A@8*kYmOMo+aoNX^vP>agaKtwa{P8kGAu&2O6nKo@`#O3uNPLZV#VC4t^3hIw`M z1C3R(kpUDgI!0^9Zmqm)3cVSFs@u*R9n-`SLMlP`1juJJW9%UmL4E;`RoxS0+;m*d zct`2zGD)$p5}JHf!;X<{TQ&{MH@5C*%~!W<+62+3x@B{F!+KrEleFS6;x1D=O@L_7 z;KY7>0PcGNr5Z2!S|oP!)3&ig{z|T^MLlEeZ}*MZ)HpCbIX(&}i=)t6i3Lg_sKL|7 z-Pxf@*umhi0O?(^t|j^EHK))|_z7H6)jHy}vV>Ae`Q@8c$J3)!}# zsbTIG#iIDt;(a$=LDzVl_KAjXc+K)~N2SXw8G0a?r(9m?mCk&}d#Uf!-Q>GVqTi|A zv$;J+_aEOC$1z)EG9+&%1y=gEy=&=RDfe1VndH4^g%gdANPUf@qnoT2y!Qr9(^HXp zLw$O@SipqU>^y@*CDKX{mE@y%yign>o{9`x&5Hiv7R zQ7SHWCX%jv-Ew`hJrh#=Jz@x}zx!`n!X|g^&Jiev2aqWusG)p=7`qw*|Mo` zp4~PIx+HuJZ2v=zm1SoUFX}Le7I#Qvg9EU~5My9hwX|>*aT6Vz)$9B(@-Xid5oRLoLhd%GCfr2L4CARJ zmZ8@Vg27(pVBqP9W+QShr<*3U;=)_vNPgZFo3cONVZzeY2|D5f>FOI>bDSGsu##3b+)S zEBfL*3dHNBoK_nOPU!a3LXaDQU75<{72klLfU{E3RG?wZ?t=Di06T1k;W#u3Y8F5x zy<$*?{9q4vknNq3y08N4Y)oEPVc$r{#d7-if8-A#@Sk{+1hYPODd&`Uva81I-`DJ zq@LG@aWtUpvXQJnZzP>KstGn~K;0A1e+q#CcXB$QbgAl&K~a)&2nB#-!~*Sy3G^{Cvf!8!j2%_6btt87>xkByv~i5c zwlaJg3@xLR57Uu)hxTaV90Ai^tmyC*D7qHzh}2u4LQ~mDt@8BfP;8a1NsbgSQlVDC z!Zt9$U6MN8NIHpbcDK0R)gBkuiwmSLEpWZO!1X@#`hg+6U~a;GF=y|?bxg> zyskeKcF~X#z4A#{MKQBC0~31VUt1ZOS|*1<*^nzMMBWe%j+)d zPL{aCM-ENJyO@s`=RkNjGaRWToz78RH;Q?K(`NnW!lTJ3+(ku!1;4sm(Q$Y8>|Suh zHnf3_>$k{y&+LlvfhsyVxiq$XQo9nllqec-x(Bw@slBA+nG67u&C;w#>lg~-9wds= z0{1;IW(=}cip~Pg)RT@mx~z451U4Y!I0q0T^3-g5=l0e-mOj!xs1`_Ml~oTxv1S#H z)NEFENgrhm5KqEeIqNixW9%x?Y($t;=WlAQ-nGB%l1kq~&#V;v_3V7Bjn(RTIOO&H zHMI=osNHqO>JRBKk4NO(Le-}w;#A<{9@aJ3Hj2GKb(m7)jM?PeH?gNn#DB@yoYNOrF@#w~M=je)tdi+~$QXH^b`q%ET8 zL1~@3f=EWs!y$+0?zsU@+X=;YmB@9wj?6D*Na<9T>ijZ@a=q!;)Y$5wdX^oig|zsC z2lQvdfX2G7ai$Mw=ZX7yk)+ubs4@obRn;0G=?ChGJ=A1uq zZh~|Eg4PH930s^uT!~wt*sfS-Cts!u;iD55AdmIrE@<4a(XUo_JCt`5uX_N^od|UI zFl2}(9X5MFLl!R~T0T}}u$angg>@##QfT;2h#pv*S~;Zoz`v8?vWa|wbK`=niD=2< zd>HRcB4J|@jF$ZG_)56zC(f_mX5|1#T|!EzwBZTaIt^g{A5dOC2X{XVEEY_}I& z!{UXja5cBieRnds>rA3m!?kHK{t=N03O6`{3{}Y8Q|Qg%*A}c+^V_up)&4-ss=mgp z^B^m1bVkO)-jXUP^&r9iMmC7^vb21^&NnzvTT*MS$8m5ElvSPqIQnmG->xi~u-+mFMMd+pNW--T=nY1S0;-O38ufx&O({6q-zI8 zSw%N&VhWf#B6&p45YPtVmw4kdlr@2tw3S(~gU;N`U=oERJzxPhHL0eR5Ohkq4G|3h z^1W?CI zQ3{1Ewg|wa5UWBHvO8!<^=I8;tdfd19_d}=MbH>Epf3zTP7GtC!)rJLl(e0ZR=sT} zQ((U*mBx7$h8HS1+ea)X0);~qtC_A1!aToPX4oPr^02VLfS-=Cj|+SaX=(cvTK(D} zR-bC!wlfBGM-ch2=8E5yH8Zht0>|6Ux?vVxVs$qqPUnat)bmdjhhqficEnY05Z!(h zoxBYODma%J!Kf>HKap?DHhtAFQg6|^YP#ge_8h*Qqo^d0om14JmPugELQfWywY0mF zXRh##J6G9hUAuXHELd~$8LW4>D1Dx_cu{Z3ZYLH8trp`rO)e$GGdJ;a$tFcDIr@pu zi%0Mry10&u(Eh2oKU|-IJGWs>b)Dg+Dg5F{eV}+fQK8E8rQMf5G#kyc5u6|6K3W90 zp~7r*aLRNIEjAi}yQR?Q`sOS}5L$7nnjlFsfc1D0K$sbnykMs2>M~ZGFwb-g!8)*5 z=VkJf^H9u?yk4jqUV-%#OdL~h9Vm}o0(~QG)F{fSZZ-wt4M-z2spxe@fIxRtn^H}= z59vGj@3%eaV~GgQw9)GmXw@ zec&wIwL(5yXvLv3(&epexR}7|S=ygVU_)Zj{<}t;8>IBqP)jq3)EnIQ4ozX$#uc~o z0oy)Q{ump?1h-=*BHKlyX#FjzNMewwGpf~vq*eJXZ`R_yIG?I4+UAo;`%S1UsS%`U zjt^<+>o;-hjdfCPACA;d+rL=Hm0C$R0pRMh%C)3)K2>aaJ zL!(o9U2nlw#57g=HZgReJO-uAs$gFX*9ziD{YY15#CuD1rL@~@=Oz8z)Lx3osoG>U zn=j)-z13Z!Hu1gM6#BV*QXCrO&kYS%N3nqmnIhiV^A#I}t%oXb9$64+(pQx5+<`#| z`dVqk(B9-^Nc~eQV3@036fB^R(!vew8zSLfx&wNRfKiR>`26xp9PR5G%p;Qtv#Qhe z8#^!S3rJ0YsUhYUYip~ts`!w`yARY&LiSbCAxI`VJ50_oybe<4I=Y+3qzV(50vQL2 z%P>aO+tQw~`5#9FC0m0S*4J=VPKNE;7?m!`NDcK8UI<;aHa~DG8rM4_eP)?Gfx8QD zHm;e~d0F4WW|T6lIt4uraF>e{L)b7bhh?kOTAP`IicV(|sVh*M$=%T4jSP!5Zg4Y> z3vvZ94&lsm+5Na0dz7->E^2C>35frDocn2|CXUubl#;H}_O}e~Y`3xeTirCj zq`7HcE1dA$bFIyZdjQ@5b(Y;i2c=kYJ1dCeHZ>oK2A+&CFdq(ugSB5@@ju&jeT7;vH;xPq zpf!r2x@;NqD{0YHeS|FO46d8TQn)Bxu%}x4<&LXP9#rACR_o}+yrd0DS)=tEomNb` zzxv?V%8uK*B+whRU!qEiYF8K1w~l7_9Rpu5xwkmgX^|84vYb3%%_Lg&!DTHwWEgxDLid})!U_fg z`wvc<^zFFm)?SqXebq=*M$MGX9YSh3Ux5R8&#) zy4Ee*{VyBgk_0e1G&5)0fdfYz^r!E`LEc#=b?qdWfz&&B(a!94oNhzpc9Bj4Pv~s0 zGLLc9K?(x<6XKx0h17san950yomO1Maav*2yaw6{ShPSDg>z<1?hGz#GB@SJo?VpO zB+f*N6hIx(dXqV&86Q#|J4TNwcb7Y2K)j+=!+5>T4N~rmq9GhVhkDTcvd?)ttx;fb)=nv6*4#d}Ya!!c0~?u;^7RuAhoce=ZW&QQH%FO#E%uSDF(~ zne#KOFC$rpT*Bo+SElNPM;4w?u!B3dZQn80+Pr?pg|qqTZH>*_Aw23zltj)zMGh}V z%b`WgqkovFj||sLF%gb%Qc#rIqp?uBQJWRw``mPD%FU(x1$|9bH)zi(u8*mB)8z{< z^GZb2-_u2;^wU=JZ0Vr8^ycF9oiusB^&hOxy0XR@te82d=ZR!LM{vo?m=aJON*|Z6 z(lv!uZ>S2#`>tlP26V(H??b1ae4oGyR^CdBacm{D6Ln08hijMx;u0iXuA{n{W%}Z& zn%#j_gu3UHUyQDumxU^2bYz`~rgrqY6pz_&X+hz4@oe!g)A`_2(KpE&U==bdYU){8 zJ??xKHYvOLsc7let=z&ajrkR7XX8~|q|rPJy42)0R>L?>lcS5D8Z8HQh8>bv*Z2(9 z+|a|?If^pn2{!(f%VuPOO7ESSLvajsO|@FEX=e~aU*;N#0jCOAI(4-u_7?ckBx|kh ztsSG)DJ(lS8yj2ORyQ{8Y-xKG3mJIrkz%kapgjX*T@Jaop&=jJLh6HoVDq+(WZ1=Vok3gFDdI0q0e3&bzDTy6l}6Z zrJCr}L`epZ16mi2CZx&yHZ(~*7j5%Qi zHX}#o1ooYFNmJ@e@Hh%Ck-Ct^vlR4Ebm(Dg@dcH%(8;JKr9P;W2^jy0PpmOf@6**J zo$zIog!EZt6;l_rox4chscs`P;W&vYmKfgS>&*aJ#Vj7-IfN|$o%3jsv*HArb@H+c z7~hFQ&U7^G@5Cji_H^+12t5&|5?IyOX-ssOP8h3CL-P&HDa6uhiP}hN!{uLSx2ZI8 zlDZz1+a*O}u_dAzM%bh}qMON=7B*93rA<=l8=BaSUT6q`NY_U0)Oz3x^q+W8rYS&4kkMre@E=aYJ*tjyY zc^=w_ZP>3OF8;)(n-y8I6jKIMH`wU?pX_VwW@auw`)}K(`Om&)PS;h%WKcN}H-s`Fv$ngcVlL$rK za6mPM0Q$= z-ff^hp1owt#>S2f8(Y~WC(d28bw~EZlPo$>x4}bEHPN<7NK44O-4=J*SjJolU8O{L zFLGTIXw42ahA5v-O=On@dZQQJM#OidIAWlXXJOyU#0GF+u(ry2e;=}V#6fCDvBH(K zl%&)gcflkw+suT|;)v*E1|5%lq`r~sO2jNzG_}yItKXFLSZY31(y5pmI6Grh#!RMDgCk08&8<0#sSNi*%C^DT?Dh+{Y}=9D zxtUuh;W5nQZzxws(@IGcJx_Bs*)$&V+>v|I|H%+&>RJ<4q(a+<;K0Qm1sNZQPA_pP zszWm705H3Q+{49qF(^-d&@{m~kI{DRbM+|R0wFtS#7mMq#4UF7KHUT%POfC8hG~h@ zC*kO>aWvvoSQ{x6=;q*dA#0az(bh!FZD(NTD{llvi<>3cpR2U#cV5<~r?lhN|EoF$ z+6|lbubsvr)1qZgf_f`IpGF1fFuEBPxXXG+he!=`@IZ6aC0eVO?|66?c)hl&?u?AQ z=7%m!sUp@B9njNtoH-mkt|M9>=Iww3e?NtC?|AI+CqI~)kWOJTzs`n>;1S^n>r&`b zq?RYv<2vLdLCq^vK$a%5a6GLUG?k!e2Ydb2V(0U$z&S?})*s|lLHg8Sx!=jn-jO<9 z4;#Z}PMyq(aQ;GicSR~vKT6BbuPUa+zI3eK!me9i%4Oz`Dft_M-Krd&}ab)s)W&!F?(H1F72O-s0$ok`0eQ-n! zjdi38FX%I48>ON86t>ivZXX>L+|^RCZvnkSdrVPfz;i{YNC~eeuV>T2$b8a?9I{7c zs5UXCQ$@+aL}k#KM1N6gq^z}$)n$`iaIQ+16UeYs=hpAU^NO~`afm=TrKUbC9xi64 zywP+Li{)6+L`CslC*{4F=_2$(Q=N1weRG_ijkm_y@nt(&1I?!PbFzwJQWcJ!i=-?U z*8Gn931m8cFuO$7nu1m2`e35xHLXS}Qr|+>F-JuRgSujDzS2CEWgpJ1%9>MCuW2=#oG6RlOSnv8bmXgSd5cOQEmEoG39T>?7UMPkq+}HbHA; z!%}9+K2Z8Fi?DAK4TkKNmeo@)O{yA-El6cbmqPE6w(6W)y5j%_C!rve^8&o~G3DZt znu|yq5w3<|4NN98(TW(aX(s6)i~)KI(@1!w5zq@}zIbVQ`t0PQef0`)lSpPcXwaE0cKUyq3 z3Z-N97U^n-m!k)!pE@&b#JmX0Rc-~j!WHDPP*#hKL{)%-XBCVMwb@mW74U~^IUEDK zCSgTW&0b(5Rk%wNDeSCe2M%cvtx+~gTSM3LFx|qGI>nfl-8RzE$&waKIAjG;x6|mE zQZAtN)TC$az+|fcH`K}W5DOkyfuEV2shgeCg3*BlE|MmtZ)-t!Eqvpa)b3-Mpo^=2 zD-ZFN8eb9b|GTEprdL~rGrM_7GdR$iM918yvfFk2x~@GbN5fiX#WwHAC2`nMo6)VI z-bz`Ptb^;Chf^wP>2cJJC~MMjnn&6=5*4`F!KE(N^r|%iGj=J2N+``{T2ObLy!$wP zqHdit(HyNBMvvxEFkF+%6}cTn%+ug|V;pBTalfUFs7|k?GOX>mirk4Nen*_ibl`Wy zUE-E3(deS<(XX&62o4gDLYlLB1zHP{4!xCx3u+3C~+b({N2HP92V}B%Xg;9f8E;j!)4IX3>5Qks_j4 zEi}$xWv)Cs;!kktH8l)USSMq7q*+u*Pafhp{ZW`VRo7u9LpI;3b&SXz(Upu8G&YJ= z8{6iq^&zpDg4+sRMToBswaoZegzBNe5iLLdt=}vXAeP**-C$sB9Bw)xD(7%$tsZ6? z$LX7~jGQAo=td?cu;vuW10p<`Q?NMN1~FUXfx1`Qk_#m@iIZI}$K}1_ep{ z)_W6McwEvRLB_2?j$10k>d{>2TV~5znOH`X>qI_O%!Pz zhApZFHY_Td%DFq}gR3J0qc~b4{=hB?^yQ$_#NkZNxkoW6zNidr)OV^^ESvcfz@#q8 ze3{{S0bz6)S?^~J6WBvDBE|rCY8G2+t-2;707fv0QK7+SnDb0M1RIH3V%+QJX?9&} zw+@3iDisR2YJMa#082&bXWOU=IUfFfnNeJv4P!K^_8_JRwnMH*7|`cxEUof6I;r)I z^*h|&%)@eM-)LsHD#T+m4nBMwyYp0vPlCyBn>7QU%z(x^0|FcwG_Vqt3agN`56I`8 z&M7d0k_W-^-?=^TVk;{VHi1(P4$8!vr!TN@O&fLTyY1C$YV~C$sXH6vPEM`<{Q+Zf zoaVJo^yE!p>%o<63+NZyskE@G7@J%^G71Oa!RG04Xbr^VA{~W}L=JT7o0a{+&@g-5 zvbyDqm6(M{E0T^2>J1EDanQ7vwj^Lh!Xt`c$Ww*&wNrIjP*bEuoZag&)rKW9^~hJU zf#HWa0}QuTEa1Fs5W|x;J(jU6{gu|&`yju93o&C;`0M`&rR?r!n>rh3&DsWsZIQ!IEH@6$wm16RbY5gQDg<*mr%KG4ff2^2m)-PBi zVHx__isXe{jAp>_TG_FxPX4A>$dP2TQ_$v7tp+{FklzfHH#@&TaW9feayHGzR%`3R zC)c>x$aW|csdZ8RF4purqNRmNy$`*@bs5RJr?A|&{LZKe$>w4CQ>u-0|FJ5sBbEMy z7O7aTIXAJqmzv9tXuT;g-iqdysx)+FTNYzu1!l{`GJW;c0nR)y(JSwajn)SSrR}jd z5cOZ6ba6vMq;P@N1UxpR-JF{0A1B%5$7^$mXO=vm?H zcInyK9hPTOePi5j$X8y9K2MN==S{Br(FuBNjK`!gvaH#MhZtwS1fMdmFfDXl2 z`Gq|+4723qXteBnB3sFZX++}RM7Bzn7krTmsAQqCY%R%E4JK z1ZH2+hajhGq112g?syj>14W~VdXmZ0@Fo$D<*wYq6j7<`#&y}tF86C4(z-aRXQj#T zGm{Pe*240FFg$O}dY|_LBeB1GDEjQiHBlZEoKH}b|1j}zS~zdGRUd&ZHDAWLjF2@Y zb!I!VVe^LV7sdwmc1=g_#QBpgg#}@K_i!&$Z4K(d@+I4rW=}k0+lg8Hfq_W0T+yMD zLG9>>vknPkhm@7gN~M&NZxVTJa0qeYB42i7c~5O|j24Mp5}h|(iY`}Oj|;Gga9W~1 z!6&N&Nn>(XG@Xh}=3y<*?YnA+uU&|lz85)da3Q^q9agXJuXM)WN zt>bfX`VlHrqQte51e?G0y5Ihd+7FG%h+B-5O;gJ!X0p|MKAX?=6npa7Lava{^%c;2 zZEJ}J2DZ`5HZ`~IJhusp&DO4En@R|`5pHk2q_k}N)@Ac>Ba15=w={MvYs_sp7pGv% z5@uo*`_nvTeHj77qiPIbJ=Cvcg&x=e)CQ|dRe=@b8~YC z9BMAx-coMIwRw003Bx%5vU$<6o!cAhTN&+zV>P(eXHjnIvKKny$>G7e_bV-dq?o4A zz-sxTsn{6MSl4Wqqcawjn2q*buUg@WV2{4e1bbAZviz0R;jrVf-l0Y3oQBC2shcJU zQ#W_LR`?Zg(0RdY4NPv z!4W+ub$U<|N~b_Aaw<~4M?Z2{cXr$HFAzGD6+LWbO=LDzd!;sSMdFTjU6H(Fof&SF zKb+};ZAj|6>h7ZS)wHfB8dpp=!qK-gR&NTrEeQFzg!zf6=4B?0WqIV_^jZvD8X@Wi z`@F>YQ?aXIQxLDe1YLYl%t2(vu0KU1W~X+PLl`hFOpD*3WRS0hmxEp)To12=>)|lf z^kQ{w6blD|OfKS}-;6gpjnn0ZWur_yy1U_KfyA0)ZqceB$5oWOu4geylS|jAO&c9! z+Cnjo)8rzPh-1Cc2{@dKUoMJDUIk4Ho)h)0^iR#GU^t-3i;WGoM?+(6j@(`2>ErY< z(i7p8pq<0)Iew=o%Dxv;D-z?=uywYe25Cu9-_6YegVfe6%ZRkE&CQ$f?R=5vKo$6C5L&__?fnZGtJc?1MV z`IoD<@?K)-R9AOZcrEVf(N2*rI)W7iv4gIy9h@0~8xQoC@WKwM5*u`Mi5Xi42L{UW z|ESxFkGV>EENNzu5%hA|YG$t>?K|3(Z|;mRILN867&gjW5ups6FYrduSW7L0bU%){ zQrlT~ZhurBy0w^hXS)#Mdi^>UT~w#MLAfblwFV~ZJh=n&RCkjgbR;6cYB4W$IXr_wZ% zpgu**U2CEg1ZJJqIbtmVTRdRsha>(}gBe^%-p;hJ&iB6yX}rnZYcL~&FQvdv6~Zme z!C_lATTK!~MWh*wx9#)uI2lo`O`-o+5B+hz$8q{&cF7b%g|xt!inJ1PzQkr=C5EkS zGM$uMN&Jb;)R*famOY7ItZ(eIA+_7!yGS4i23cMmXTcQzSt}1mvY(v*(;f^1YAhc-df<$HK2n7Qfsa3m%;IpUml9p01 z>SPC|Mwi4Q#O7V7AhqEWOH_l|eM_2acU?sAamhzPu+hrgb-6Q%WY$Z^#u|`JYzkfK$`x=3*QKhU za4;i)h8HzN{ z>XuN8UEj-T3(-UCZ>twe6sM{dupOk}4HPAid=G8FX}RY@8qZFM78($yb?HRA!@x>I zx0CI3vi|};$JJMyE%s{ySSLL_GzNiD#5~*49)z`Pabvko=%7TGH9Cn16ct^Q zXn!XYc&rn^2#+I%sZ~uw=Y4%ci57@6c9?O+i6vcTR_H4+f96go7jGkuvj^y|%;8c7 z&nXFI2hrLgEIQzYc9{p}43I8-pzk7<|r1z!=8+dxsPM^kib?jEt z=}}~`BpI5Dp^Jbi^;s-F1)YAl0EIjzRhFgh9Vc+mI#iL6fV*DTx6;{3qS>v{?Ot-F znCUKdlvV6-2NuYP8SL@0NPU3J31zvtwsvH6WD*NiW0PxU#ZbDw0-M#{`{(8T-GbP_ z6!tDoX0cCS-;VMM#YC?{R@awn21chv4X?TB_d}VuQ?jWSZ!baI(F26i*1>_q(>2}? z__jZ`!@af}=6$r*2$`13j(<^{I008AAJkXb%YY+kmZQ+K2-@mOa1k%+tjeU0d#5zi zFN$zz-c_jt^Sk}b?8@oHqGNegPng(bg9;xy? zCTuvBC>ACXy>+sG8&iBagUyw*XarRrs;b^Ak11aqv{r?Kmd(yptsLdt<%*q?o|V7T zQ5o4jI5|E(IbjY9aDewfR(BAlE}Ak@kAa_2nIZh4 zRDUd(^4g{l?g=&kgnDpMJvg+euFD#ns_3dA z?7H|+t_9k}#l`7Q>G~dasZZ89PRPW=>z?2-(L07KVgsNp=4aHUu#ODVSw9x&k!7JC zzzqiOEHhhtmgCVOi_5W@;mV%obrPlTW*+mgTw{-dbsA3T#!wYbnsk|^i_rw@w!}y# zWYm+IIE=yOpHwyu285=ebO`I=u|HFn4^B!U*LH4>g3D>Hns&r ziloELewCazk|f}*s`C@M0bM)H4)mL(q~+CU2?vqHsX-#C3DS~zIg;%NdZXGUdHspH zO>)wFflT^96f7t3Hutb{1G`aN2KV=%=;t* zdPl7acjocU_=YXpT0^b5o$FzCDP}FJQGF)iwn&|CYl{^Xs=c~2bMdRcCeVR&WD!cn zi(Wq8q`0K!Ym0$hu$bgXuQT8lvEpl*RtibidEGLb2ommb(R%XqWFqaQBa+8LPB3c# z3@U2mlx6!(UG{fKB^CpkHIUFWZE#^C61fZ9<3tG@Tk_;%O_(pHh4rABh@jIE&*2{( z6ZS<@AEMo){3E|>qEonLpD%=q_SG5PJ|tHEx-H zuVp9|a9}i0$xc8Sf>oo$ZXexHmqc2bHVf{vHTHHhABuP<;ayY=GL$~e1 z{!%NcUpVfJwbou0F~xw#bilsSvQc*Qjz+-R(I8^%#6;kR1{cO zd5HmQ8dIa#{2UI;PGWFz`hzfB6Q5Sz#i}^4PG56X*40;AI1jo;8Er|58czd~rsM=F$l&AH&JeB8q~kO@wd&AYVe%ZS_qyt}VvTrP zs$mX{U6+(ALiH=Q{9KM1&g3|J+rkP!&*li@6ZNc|Gg*8fhAdl}h2sinY_Q8GoqEHL zo)wplY}|5bb;m|AF^g|FJNxMDr5D28vYr&o`cXv9aq~K9E#YSHl$Sf{Z0bYfKyJRTgO)F$RpMl=?JelkY#f8UMiTvH(1(vXBAJDDI_Xic=%2KG!MVot`kg&4Nkx5 zccGC=o@ucn17s8vp?;S{ampnF{|U1D#j+cGaO6YF5l;+~&e z(lQ8yXL$1rr#^8^@}l)T*2?QudlwkqilD8drz|a*@l5nP={Wr*RhjTy=0e_dCO&8{ zW|BbcrI!w9oUO6cesss_H2MUm7?AA6&+W628g@G>1fQ5kGHG(V=Hyy!@6Oc zQZNx>*iS%Yfvd}bTrxLdl>V43pNdQdL+P|uIEvE5(gM-b!;;C(?PPjlJ(|S%Q*PLu zYkG8C{<@8|>=Q%7Quf|C^+bVLSbDRnIJglTqBd&gp7I6D2tN@ikj4fERaZl zK=XlC92A(;L|(7+WZjbcz0gR-$0a{QD>~&fy!p3xe{B+ubM#(9Yg zG28T50<5B%}jNr?2-s2Vo4fA`EPKZTEbz#eXRI)(S({|$%;ol`sI#D|Jx&GSE}QB zFf3}3xF~yXR0;GH*fWW7W?YPAyU$|(|NXPUame0GZlB6BTZ z3dqfM(UwlzZik!DeW9n|;0ELSfoXV#vtkt+dkgEc^o6V5~W|9oGoH) z569!w>gbfmI#;knZ7RpwVIy)ViAj%$;WAZ}-BKjkYV|p-In^9@QJR=t1-B-`&TR$! zd%5PP>hOg;Gsa!cLaFp2s;;X9`Y^7pQy`OfK#T2?AZSK9Dcns%(q1QONU3eVV)BSi zy$)S8hAff8{JIG%X-Bl>5N?v;TUtZ6JCe9CL+#G|ahh~R|SNHa1eM$&=1G6|%8_KfX-hv{-?_v=**f<}Ta~zkvH*`qY)iJty zESekn&q|^-qvQk7C~Qq9+QCq?reY0!!$zC~CasX7jrj@G3pz5vQ6XkO)#;AS)7IvF zq&_pY>Ws@Yj??5^bQ>A3qx!_DqbN;03%PuBLe`v-Ta6t%wr!Z(i5-q`oRnR%dCP{) z8#ipmCTr>ixp$ZKz=c>1hH*60Bs{O0p0#80=U;`QnpDOviS(uXJOu|ljF?&~yfmS! z6}I2ewyM;yZ=+)=IN0FA_%M5B;FKcjZJ9TET@$)0P+ftUg0IsW(oYV(ibr)PiqM~m z^l7FR=y#^t(m9Ilz0j5!C%jZ{!#SJxY_KxA?!unoAaE}tGh1;#0j~TP!YEO)aSuYN4tFfp6r)RV!{I& zlLYp8ZWC_gqd?Vzm^{iplRA7eqOxM|`)GY&a16S07pvP)G}>#9`8tvht}NjWj+R!P zRw&(lPHSJP%Jmccxk#GZ5cj1U?7A_*$7w;NMDH3_NK%*b#aLCr!zu!Am0ne$CCG^| z_s7v2rweK23_A2e*UDm@J>sl_y8YxT^0Cw4Du+(tWJ08Inp}U~{3Ujs^SUTa?8F!` zZ-&tTuGul0a(&R8#M!pjaB|ZTsXvv7w>mCkLG9o1_hR>Gy@l$X4!=gETFqvQ1=DF` zxLMHm|OaRU~2fk63W;SlwygqwI2}6zfQ9vVwTLw;^Oo{`XxNgwd+*c$0f<#4xTKtK{|Hq=fSgV>X*2ocXL%6 zL7~-IK;TTpBp(X>qlm(^(fXEw;5Rg#82E(M4LK`D(&|Gmuq>96 z2(IfZB*R}-dhn$WGeyVOq-9lC6zwBtaqJGQ!F zSj3wpx)QDmb^Zm7dbfmBtanW`F$q5(?ibP2@hs^|#;cPBx;{17W7IH7ceuofcvzEr z(1OV@B+04|j(bvVzWZsO_>??UT%p~aACq4ay;gmCyjU11?b@YA#jt3a9$q`UBAe*c z;07ktsTH*Fg3iFHkk!mV#S4+Tb&0fNVCjgqdIjrvd>d@-@Gq)@n#YG1tjgMPn4>n_ z)`nNlCUzr3Wcykq3u`Vt40H62T!PV^fl?;?ULRCrlE896 zTrogR3IRy8tPqEwJ{ZuP!1!lUh)j{NGQuBBnTTnW{#0l%H7MTmG&^POSSN*C@N(PN zMX8VN1T}pIR)MfAwZLR4h|}ljuemc7f|W#7ltC z;hLK(J&V!2(_V{0A=@@SMz31G#f5MNv~FoEmt;!XagVrA5>MxfU1#JzPG7;bIrJoQ z?u@HeoRX$v^%mERowQzCi+YOFSZ4dQLx%Z@9{IFjGW`*MR*p_Vg0&WGSkhqwFEq2z zG1wBJzoM1TpQTHaDYpTB#4YruEJb65vJ)0zl>^zZLr}EKnzJGdLk~K4ltKgsVNNQ%yPDbob%>Q_Wj<3>hi~Rw%n< z7o;-jFjJX`4eXi~dO4YV$tD{t_7|)kcSLHWMmZPHt|>?^&^SXha-P&bpTrARO%>76U$_36jSkmY1qJx4$&AzDxY;V zwGs5E7|2Ya;zOD-tn#ztjqO-yn60-i-ii6xhQ`L(TC3UGaEbR(DC+}Bq99g3Z5oxi zwyHYCK}ZWo=7yNP!qKZ1niKFODK@Nhlka?#ewJ%CveFq0JE;=3E+KUh@;H7XsN|yD zwG&ryen_b3##d2Z6bu*15ZqPw$2RtDASmW$98?Px#Ax;NlN|#WK<)*+RGK zHsa&-djic{$8P61PLl`4OWdihF}o9kW&l z7p1QvU9}kZKp?D^Vp%a2rO90mxM>#rtwSK;Si#lK?rHRPeZJYoMBasyGQdOqP|soO z?vM1zs+IHzC}bQy?_SOelRiS#l--G)&z6b5AyVEY(Q0ksO zf1WRfYRE+V8IcoZfLq?$F}3grL4hV`5kd=R10u#m z85I4SK_M@%HHr7LVu`17x?6g|rBtjscbUD*J*lZXd>O#`q38DJVm=jToWCJ zC2-L`L&S@cYi}Z8pbS*sEne!xMWk5KEOCFxd?5K7Lcb)%I}XiGqVKIjF^PkPb+5%5 z7-de2S!TDG>0whpco%^kE44mG%R?KYt%)*s8PMu$eZSN`dXJbLnw){MJM;sR%Ry&0 zJ8S2HPfbsSdd^_*=^Af^%O2I~QDmS3%Ur146+`e#DyF+H6F!5(Re)et4kfTjcO$~-Rzt?nVcSX2e?Z%Fv$k{73gfx zstbY0Jvu?9sjLEGztaqMLe4I)P0mbdUm0Do0;QEabl&=6da$bs$ReaVPp9Ghup?6Q z6CEDb5-_irnG&NIacPLtCGhQTWBH1@xJQpdT5YvAhYtbU^41%z1Eu5iNw%mwHi?y> z5vfh~-pTr%bRcpB9aQ+GK6eToT5Nm>6_@@Cks$yi6WlY7%IKDE-LO{(E4;QtI*y~q zUKi3&V()81YQCq^U+L{H=8L7i-a;{7uC&f5=K97|`RDyA6m2MTz7$MqmM_78h+znW zGbXb$!`TvqVeK^F2p+4=STaaHUn;HG!()2O>fha79`TxyktBqDh_dEkbr53Ee{d3* zj7^rE;_CqcwT_abfOdBj*zWGy-C1DjzGV%(*G;Ywm5^Jl88W{voe@^sxod=5JzPjj zjr|K$B&cDj-JJu@*Nm8^Pge76#kMo42D_<+w7wm2Y;>mnD!5f$7t|MVvVxxCgfU#C zG;NzsXHXkO5n^@2uQya8gAX68rJPw_t-`CBocJ=mWy{9x+4h!gSzYzh(_fa!*)Kgf z2S%9B=gQ0QPj2bLC&Oe8$Ye7A!hef0dt7nQ0S9KX2)qBr@W;SG`(CxjGZqaTbjZMg z`#kiZeFqM_dufhwKLS2Le`n9D7U3s`4?J-2lLuuo|4zK59XQDDAL0F3Tyy{Z0e|@S z%;F(?Y}Oaex&+`W@PD61zGaW<-A;3I@H?;3-;sAY=mGL8LkI1NEYVNO3=|RBXyFK* z%%Y|EbFa$qvhmE`2ktYz-yZw#edwO|TXguMBNjhk(UFUeT6FZHV-_8^_lb*wpVmLa z3wvgM`>!y5apu%8m|2`TEfrpp3NO{XPcAOa9F4$`zaVd!{I@uBMk@Uosq|+giSgIs z%(7JaWt#qeKGib+m;A9f)00ZylSXZFXQR0aQ+r7xw@ms06Vsr0?6^u3z?g+5iU|I2>Ak_z{y!e^zz=cK|9 zN`;@A3O_v+K0g&6Oofx0A`y!-BdPcmsqh7&P=7kwN!XI6<(bR zuT6y?oC-fQ6@GXs{D@R|E)||nh1;p{g{kl(Q{j!N@a9x_Ybv}g72c5wUy=&%N`)Vl z3SW^5KPDA^Tq^v8RQQRh@RL*Fr=-Hq$Q&14S(F)$!h2-WPk46}zh~wbQFyP+DPf10 z**mi~3h$G-HVW^Xxj72&m-%B9-am8d9^nJ-lX-X)J|J^#6h1I>OB6mR^Oq=maAw)! z@b?bM%tzt-X0D6Ehi1MSg%8W@wP$$${W1el`0&i*qVWAQABw_9Wd0h3ACNg~ukiPd z%g^$ksHVPk;>DfEH|Jcl?D12PzO;Pyx%rByFHgm>4;r%CM)<@wJGp~!n zCuMGr!Y604`-b_ zJ|Y!PMq-IroH;TTe^e?g(ns>&;z$aV`;Sc`@z>&1Z?ZUZd@4Sh3ZIY)pO^}tlnS4m z3ZIf$iz1a;BqP_MnWdSnK@m%CUlGNhk$E1&k`sqQ9(rdK?#X$@TOV`!G9gmvg=S@Tbvk%~$epkWy*(w%c>PbET3di+`sHGk~58dkW>A-g0iP z(CRN2E6qYHS19!2zh=9bE9Uzeg}!zOW1W5-Td;L5X# zJ$U=M-Vz?w%Jr8ky~X}!d#;#k=jZ40?MkcJr?+k<>77J5qa<-P*E2bY?;e50?> z-;liS&9(ZFo8@+2OCN+&LR+&}{4B`ATE1S?aBn@_oI%?cNg7 zR|@@hi#}?7vx$2Oy*<5^N~zuI&tnog-&=0usqJ>N-Nu7*xp`z_`Z4(mYHhi{QAT{e z(Jw!n>(9^UOSwuRhpJU9;NUE&+MBlSoYjL!@f>_kp)yxOHZ|u8?Y?>FVhYVh85OY6 zKVK=#6$>ukw7sy}_2(-+#koqc+*fK9%X9fgJKrq#_qU|7=9;nqW*GE zqcqnyhiq=6T{Qc9`}^{x{=VKanpCUYF85gl(wnqhZfvb@G%u6vDD>oe8_j$Z+1759 z=I5H_Rnu)XuW{jFvNZ&@hknsaD6XhPj@mpsa$uC$w#LZ!Ezn=6)by?yhI`TlZV%coK* z&y^ZoZeG82!xnjR9vL;?=xyXnbG^Az|GZ=wT1}-g*Q%88^7EAiZswck(a2kkN~?jU zG>=9!m&Z3ZTgCZ85nj!j{qw~I?w5y`(HB)(xk?{8)=H@l**DjmD_6?%bGf;`A}ULN z)Pu3>ZSC5z!Ct+D@0NN|M9rwQ=lTlyxngf$Yra+KFUbdWdG!3IhTYrOD$V6fg?zI= zUn-W$%|a1hobPXyTjfF@GJnB)(KLD*%>rJ$g_o}M7h0uU0ojHgr_f(0Hp}x3Ycz31 zu`__>**Gk?JlAZL@^kZO$>>rGc{J+zBJ`U5<@tR7e7D=%8ynj%w7Uy!bf)w9IrQ-; z@J3%=Do(D^Xrpeo&}nvgbGnc^&Nch`(ATtD^FfpH!<~D4 zu@@Cay378#{#K(|>7PTl-aFrqo~oQjkBPkRb~{E(d-wj{M!S?lHnsEp=ni}5a#Dun z;vBA)+x^{YDo0w)xc*9C@BAFvM}M=gjN8j-&~p{k{bEH5p<7+GM;D9bp1JvEp-^bg zwVU$|)YWzYl^(+whSq#ZT0ob4+u7JALj_t%qtYnM&-c$`q=U1*653UvQ9!k8_qONC zXmXu5|L4PG>} zwboi6EiucooTVAsusxk9ym>@w$<&rhTib@VT)H{_z1OK^i5w)S$cK{~$w!e_ zldmCfB5xtTK;B0Fl>8<6ds6fXlAn9;WjvHTPKfE*GKSA3$H|8=zRj@c9prbOC_E~Y zc@D#`X86qvf0+D?5Yx+VF?=V(zhijMz3ul75#BG8IiBG&$@6%9jNykd+-7(ed8H7I z=NSw?Pl##uD;U0Bh-vye82*qDbGFYh{9W>=LcH7W7zQ$XWUZf&>oOmd`*2BrZ;24k z$qDiNJ|Vv2d?CJjg%J5PCFC?%eh0;&&%saW?`iu-K>8zjPyB>ZpNHRYxTp?cm#X|hvYlP_B-YA5+ z{++!3K_S*-ZWiJrKPN0_GGAr<56C-&m{$K>h?oA05Sg)u^e_FH%)Y|2(BBHr&SZ`d zB9l%Ko}0;>E`-`WCq(CZmhgP!n{XhLnGoVVr-g%=%)^D%Oy)u%GWTNPFuqrabWaeD zWHL_|F3)71CtQK=6^>>yuN5LQZxAB=jlz|g%=;Ps2>A)}b0n&grbm@gqG~8n^h&96 z@_Q$dC^`+h@B$;dP`d=N7{kkr$Jfl8+{@B(El)Nj{Hs<^D>B zuP1LHZzSD#bQ8n3ke?-QCBH#_kG!3{ll(RLNAhpvBIfHp4S2BY#T%lKed> z>l9Mo{zdM!*uwWA?@Jy*9!s7?E+x+-%jDVQ0J)qTC+p-oa+Yk77m*i}my(YruOzP~ zpGiKCd@=b-@_O8ov z@}uM@$pOdd`iO`brWMmo8)$Z$V-9yv^| zBv+AZNR?ml+$O^t$Svef@^bR=6WBBFdYsoi}ZztbFeu%u8{51JR@@wRG z$lJ)DlD{N>PyU7c7rEEoZ2#na$s@>P$&<*Xq?51944+L7kju$&vQDleXUP_M5qU9r zDfwvfO7d#*nWW0;r$P>5_?4u}>$rXc!#9%eBX1&aAwNsrN`8a<9(g-?C;4mgkL2IT zMf#Op6o5=0tW#nVYCy`Gh zuO(kVzLb15`3CZ>Tzp$YF9Nxr$svK8$RV8^|r>PV#c{@#IzHHRN;1>&TaruO;6^zMXsz z`62RV^3&uO$*+;$A#WppO8%1kJ^2^%U*ul?~8P2_eG-M+S? z|F7qJkKl9Hlbgw%q|WQnzOQ8XspPff3(1$0uOr?3&du*X!0R6)KTUp#bo09JGkgd6 z3-b5mUr9Hg)A>H$?_kbH?oS>|o=m!VT!GE{1#{`OE_Z<3EBRS$sY?qb-@ z+n&tuHRN+i)dwK`s~C3kwYM?+9`eKFEu_;2xOv*QdHpu>XXLNRKap;JwkPKk_aP4@ zk0i6Co0s)4Tqe&UtKx4-bC&oFDIWsUQMRo@4mc#SNb8GVyXVEFT-(>s2L;UAH|A^%MNll*t{ zYbo!$r}OQ9`W{fNYJGsJR5?VhBx|J87e0dFd&dvUum4-dkGrZTcNOpS&v!T7NvtRT zTlL=QskiYtmywSnuOf9_0{x%UPv2Ah#NPb<1Ihc5N0TR#?)&dD?d5aFNt?8r(m?@CwrD+gCIEFmj%}h}=dxJ^SMrzKVPXsp~g*&Py0} z`t>(5{C4ual6)#D_VywNy^wVJ^4BqZ1Nlz!1LVg@rzigs!`~pk zPu@ZPf^_=vzcRdNu|0oZ@?i4*q|=L^%OGv#*$D_#xyR z>GafF8NQT!4EZGT>7>(7zlh;ilCLMrfucsuzh^6}(TNT+XpKEp31 zUqj0N7b$0FAL8`PAK~>+l3yUdMmoEZ+Zp~Z^0(xFlm8<3-p8Kf^vd^R_-OJ(aw(Z3 zoj&Ga4KGQ5SngnTslMAGSxpUv=frZY!Ovh=_J_!OzJz==`9{*|f#1vUP2?xY&y%u`M1IHVe}BaAo#b!GKa>9?o!<9= z{p|k3$fL*;NZEHHzwh+Dy$qjA4v{O#8tL@Bk6?H`xtZKaUO_tj?o%1QmV6=ka`JVg z)9b#I;SZ1>BR@@kiFEqh?=yS{`3v&*-YUTgcCmUm?Fu-bVh6{5AO} z@*m`$P$WzJxDRQ## z^3CLpEBUhzc@TLxc?@|Hc{-UV`^fXi5ptZI zCLco1ksHXZzLOzpxKKWAeHRPMf zcaZNRKSF+z`~vwk^1I~iZ*|@;dSr1TeKK|5qU9rDe3f4S2BDx`ApL3;a<$}E6MB08_0XwPV_hY-3~oI z^)LsJhml8-d-Fatd(HQI^?a5O_v-m9AMVxjSw7sW=d*mcSI=kpaIc=v^5I@RpXI~7 zdOpjCd-Z&l5BKW%EFbRG^I1OJtLL+PxL40-`EakE&+_43J)h;ny?Q>&hkNyWmJk20 z>-o;4zOR=&mmDHjk~MN2`3Q17xtZKaUO`?-K9#(dd?ERA@^$15lCSIBRZw~;?1e@*_0{0F%w4AXU;k35t-lFX8) zkv(LYJcq237m%ySwd5?>CO45g$jiwmkXMt>B40qhjC?KmX7Wbz{p3fdlza{OCh{HR`^b-wpCrFPevSMtc{}-E zmdMCHV*PZ{!~LxBS_UJcK-gJdQktd>~mQ&msrN z733tjntT{JPhLcBBQGN#M_xrfgM1$O67tpL8_Bnm?{KS6$;{3`h!@<-&IPel0P-;MDDnhy33(>jOP)&(kt@j>xsH4Uxt`oi?j)}uuOy#JUQ51^d^!0# z@&@vq9GVJea&cc`SJ{c?MY^`^odk<>Ul8 zLq3#jl8+=WCU=pKC7(=QLq3;$G5IR;4dmO%_mCeZZy`TNeuextc^mmN^4H{_$bXP~ z9%=b>AM#N0NHR;FM)r_p@*J{CUO=uQ*OIejo7_b1ATKAMKweEgi+ln3GV-r= z_mdwbKSh3#{5ttP^2g-Q$={KGAv5reCF9yY?6-3N62w&ds0?D6!3*^_x?~=EZ|3&_m{BQDK*RyU26-X5 zg}j7(H2FmGY2>rX>&RD-*OPA{-$j0qyqWwAc`Nx%@(1Kk$X}9wApb^+4?1aY`;mu` zN07&nr;raMi{x440J(ykBv+FUBj?GB$Zh0hFJ{>?FMjl0;KrSKABzwto$suwjStHkxk095Ro5`Kz z737uVQ^{+|7m_b0Uq{|RzLWd_`7!d-}$v2ZXlJ6%!N`8v`BKdXld*qMFpOe2M|3YR?u>9GFJcvA;Jcc}pJe|yw zedKxM2sutplMf;1$PMIH@>23KM z@>k>^$-k3}Pqcj6pS&;m0P=Y9RB{^wu?c}4#$CFPXpGiKS zd@1=F@=fGB$oG*SAwNlef&3czUGjGFzsTQ`|4sgj-1{WUrvu6Rkw=p!l1s@PSs@=p z4wGYKoqRCaATK1hke85;CZ9+?jeItF9r+6Kdh#vgyT}icHrn(IYT~_Y?6;8FD7@9k0qZ>UPC^Yd@=bd@(twM z$oG&RCT}4>M}CF;HhCNQGxFEupU8iZd!AXE_Ou|&mz--LR!Ysv#tik$h#a546 zY{Sm%#ep2b@tnrFT*B4d#GO3A<2=W!yu-(Q#gF{K;AsM#!Z0#pF#-Q(8fIb+=4Vls zVP)20L$+Xhc4J=-;b>0cOfKMZuH#nj;bETQMc&|jKI2<{;s2j-{NMX16vHzb|Kwjx z!Su|^+$_WrEYE7J%O-5iPVC769L{l^$~j!jRouuO+|Oe?%PYLiM|{Z-{LWzM0-ZuL z5@RwxlQK0kGCT9J2urgPYq9~GvmLv#4+nD;Cvpboa~aoi3wQGnPx1n<^B$k_4L|c2 zL#7XO3dg97!$eHZbj-qBEXd+4$Ey7QyJG))ZX2@|JF*A+a~Q{R3TJZ>S8@Zlb03fL z3@`H*AMyp?^Bezf)8&8XKO-^*<1qnV5t5 zS(Ig1nYH-;2ZjIFw*}j?8~btyM{^Qqasiif9k+515Azf+@&@no8Q<~?gJcd|ZzzUm zH2%rIn1bnO9H(*)7jqRiatHVG7|-$wZ}Smf z@&ms!SeC$bhh`+kWPB!NYG!11=3^0-W+m2S12$(nc4Z$9<|t0&49@2=uH_c)<{_Ts z1zzVpKII#J<}ZfK8t4>`Q5lDcn4IaDg}GRe#aWJ3S%;0;iXGX5{W*+dIfb*ih%32) z+qsWNd4`vHix2sN@A-}Yx54(m^PdqJgYlSzshEM;n3siFiWOOd_1TPV*@eA1h$A_H z(>aezxrUp$iwAjv=Xs5H`Gl|ei9Z=4TcA@|Mqz9wWHP2@X69r87GqgfVQn^IOLky) z_Tx~F;bhL@LayL?ZsT4a;b~stO+MgrzT;O0%^v9UJ0mbU<1#T*@*n=oJp7L(S%KAA zk4@Qzo!N^6IfCOkjdQt#tGS6gd4R`xj#qhykNJup`Gdi81UiLbWX56w{>?PZ#2n1e zqAbJ8ti^_G!S?LNz8u2QoWz-2z~x-Wt=z-IJjIK=!TWs1xBS8&IRkw{F+8L3PyWRe zOwX*$%|a}}@~pNCL6Fh+p#PAa4<)4B4=vgxOvMb$#=I=dQmn`ttj}g_%P#EAK^(~moX&Y%$~D}~T|CGW zJkM*q%O`xzPyERcc>|roG74ieA(JsJGczX(uo%m-3Tv|wTe1VYvmb|Y3@39I7jgyH za~t>a2v748Z}I`3^Buo3Xud$7-x-0?8JCHflK=2u=HY)V$qKB_dTh!z?95&q$PpaR zX`IU?T+L0~$pbvjbG*tse9Tw;$R7-zKhP-*BQq8g@NcGJCgxy%7G)V$W-T^k3$|xB z_T>`fjg;;{+ zS&ensgss_$Jvo5GIgV2~hl{z28@Yq~d5mXyg}3>LFZqGr8LVKSQ)otFOvYzYre;QF zXFe8TX;xxQHehqMV^{X!V26bS(u9jS)Aoqm37#dt=N%0*q_5VmQy&Ji@1^-xSjiWlxKLExA>4R_@3YRe;erk z`~GJ{#$Y@qVJc=|Hs)nvmSRQLV0|`YTXtb@4&q2o;B?O8Qm)}-b%mQfg+37L#(nVC6RfW=srRal#i*peOCo&7kJV>p?!xR5Kjp4+&WM|hf- zc#{wKobULRL5l?X{LToB&bUm>l>CSPG7tY_NmgKW)?-t)VQ2Q@K#t&ePUBoI;c9N; zP9ETKp5s;C;bXqyNB&^&qJd6f7@4t{fPXU$GcgDAvnb23GHbCRTd+O5u`h>kG$(N; z7jQY(aVz)mFi-I!Z}2{!@h!hFNU=blPz=v#{F8q%1=BMtbF&ajuso}=E}O75JFzDR za5%?tD(7%9S8*eEa6ganEU)l3AMqtW@H>MQ4|EF6NQ}w&Ov=>E$n4C=A}q~HtjPv! z&UWm|J{-(ZoX8oR&t+W8E!@pRJjn~Z&U<{yH~h?B3|S)3DIB9R4ihms(=iKku^@}H z9ILVp8?zNVvIqNf7{_u7XLAu(as#(>ACK}3FY^{3@&(`X8-FVq=<^37G6v%@2~#lx zvoS9VvlJ_`2J5pK+p-ILa}Y;z0;h8xmvRj^a~BWt1kdvt@A3&>^AmqEM5#chu#Cdk zOvq$R%goHl0xZU|tisxC#Fp&9?(D~*9K*?+#f4nK_1wn2Ji^nw#G8D;=X}Sn3|czS z=XXY6bjD?3rsO~TmwEUfOR@s1vmTqW4Lh?J2XX|*a~kJz30HFyck%#_^Bk}84j=Os zKk^5ImkD$V!^n)q1pJ$6n29-Lj$65hhk1$@ zd4u=)jBojcLCOaDgkpF`8DszTs#7V#xA=PT?4pahQn7nT}bQiv?MnpqcbiOGbR7w zzs$q`SdtZ3o%Pt1ZP=N;IFKVap3^v&OSqbwxRVEXoacCzclemE_>n&tymFvZ7)E9+ zCg9&p!%WP<{4B~ctjt<$$QEqRZtTk;9L-6b$pu`_b==B5Jj_$P$Q!)RXMD>q3{oY~ zCltdo8vo>9Ou_Wb%G@l(5-iVZtji{B%}(se0UXY8oXR;|%vIdT9o)}jJj*M*%}0F6 z5B$zxRRf(uGZJGmK9e#vGcr5#u?S1E5^J&no3kCevJVGy6en^9=W`j?atn9!5Kr;~ zuk#+C@(n-p7eiJHbPC6)jKf4s&UDPeTr9}qEXS&>!^UjIj_kqy9LBMn!r5HJmE6GX z+{dFl!^^zIhkU{J{Kns^2m1WMh>XE_Ou|&mz--LR!Ysv#tik$h#a546 zY{Sm%#ep2b@tnrFT*B4d#GO3A<2=W!yu-(Q#gF{K;I#ss!Z0#pF#-Q(8fIb+=4Vls zVP)20L$+Xhc4J=-;b>0cOfKMZuH#nj;bETQMc&|jKI2<{VUXH^KA{+%(fB9-VhW~b zR_10QmSA~SV_i03Yj$E!4&ZQ(<5bS!Vy@yw?%;kN<5^zeZ9d{le&BZos}txHnvocj z@tKsVnUUFIG@Y7mRq=+hj@|~c%Aq7lyCT%zZkM^ zpi?+TWgI4Aa;9Sz=3+q>XE|179X4hwc4QCs=P-`t6wc-%uH*)8=RO|g8D8csKI99& z=QsXVFVN=?Mq~`eV-luf24-Vk7G^0{WDVA5Gqz{Mr8tbwN zTeA~;asY>O9H(*)7jqRiatHVG7|-$wZ}Smf@&ms!SmQva(2T^GjL)P@&5X>>d@RD! zti+mZz~*enuI$6X9L0&8!TDUqwcNtpJj9c{!0Wunr+mZD{Kb$>0-eG!D&sH_lQSK& zFc%B5ILomr>##9fu_Jr1KZkKFr*JkGaV0l!JNNM@&+syD@gZOEJ-_j{rhz_xFd}0x z9+NN?GcX(TvM@`rB5SZdo3Smsur~*BBqwk>=W!|5a5H!DAW!f-ukkLQ@HId2Cqpy~ zbPCHTjLn2h#j=4(!f;9Lh1A%voH>6*^2`?g5x=jbGd}8xrsY@fX8``S9ynz`HCO;gTdPe zI)!0m#$p2g%{0u!9L&$6EW^sI#fEIb_Uy*K9Kz9@#F<>c#f!Yb`+UZ? z{K6m|0)0X;JfrbX{>2nb&#cVNLM*}Ztj4-*!q)7>o*cm89LK4g!^K?1joiWgJjS!U z!rOerm;Au*4AwEwDKsN7CgU?HQ!^v8GarkvG%K+t8?ZUsu`By7%EY5PQ$~tV!R_w?g?9X8w%PE}A zMO?`Z+|GSG$}_yoTYShDe9v$Et#hEyAB@NtjK?HQ#SF~Gye!O8tjHRy&t`1PF6_-g z9LWis&UswQHQdZyJjfF~&uhHPCw$FM{K*hq0-eG#3S%=NlQAtbGbanM7|XH>YqJqs zvID!bABS=bCvz4Tas}6O8~5@EPxBIQ@&TXo9ltVY*Fc}&8G+Fmmx-B@|L|Yt;eRa2 z3ark0Y|1w5%w8PG5ggBHoXaI#%}w0N13b=iyvjR#%vb!#9}M0t&?yWfGZqu@Z>C`; z=3ssnWf@jxEjDBewr4l?j%V^qdrA|_`#W??QCWO0^bRn}o+wqi&2V1EwdSWe+=F5*gV;CAlgQJ&#t z-r_^P;Cp`KZ@mJ2{$NDLU_2&aDrR6d=4D})Vnxj;EBEj)Pw^se@IIgMEx#~Gzd)Z*49{r%lYcP<(=#h`vk*(L zJgc!To3J%Iu_p&`ILC1+=WsDsaU*wdKacS&ukbb>@g+a-JA?HPbPCN#jLG;+%GAur z?99g^EX_)+$p&oBcI?VN9L!Oi$Qhi^Wn9ZG+|5Hg$qT&Bdwj|_{LEhrIUvv}9HTN0 z6EQi{F$;6CAd9mctFjIovlTnC2m5mv$8rj1a}if^1GjS@kMayJ^A;cS1>f@$4f#vI~225Jz$Xr*j^cat$|g7Z36T&+{7Z@(Ew_ z6Mr(qpg^avjKbJV$Ye~*%*@FGEXJ~|!rE-amh8ap?8l)T!^xb*g$c)7V{F`Z*i8+{`MOlWGS&I$Xg6-LjeK~}qIf*m5 zfXlg#Te*jad5RZ#gZKH2Z~28mh6ehCVt7X5pZtp{n4Vdgn}t|{Rw)xSE@|lLvU5=XjNO_?WNw zkv|xGbf8lhMrJG~;NMKcOw7UjEXp#h%vx;77HrRM?8_k>%}Jce1zgT`+{!&X%u~F` z8@$hFe9JEkGA7U`6vHzb|Kwjx!Su|^+$_WrEYE7J%O-5iPVC769L{l^$~j!jRouuO z+|Oe?%PYLiM|{Z-{LWxw1D!%M5@RwxlQK0kGCT9J2urgPYq9~GvmLv#4+nD;Cvpbo za~aoi3wQGnPx1n<^B$k_4L|c2Lyik{3dg97!$eHZbj-qBEXd+4$EvKu#%#ro?7{vV z#<85j*<8ex+`#SJ$D=&M%e=*he8Knp#^1&V`uxF&jKO$J!c@$_Y|P8TEX9hf!TM~* zw(P>*9K?~F!0DXFrCh_!+{J@D!SlSvyL`ge{KTIOF(J??ETb?s6EYdoGBb0s0E@9K ztFSg3u_ZgOJNt1c$8a)daUoZ5J-2Z$kMJ}v@g^VeIp6UsgH8FfwB? z0sm$iW?~NJXHk}6W!7RtwqSd9V_y#8XinlxF5q&m<5uqBVV>ee-r#*c<6C}Vkja5Q zp%|Xg_$U8j3Z`dP=4K(5V0l(!T{dBBc4AKs;Bb!PRL$CSzh67KH^J$ z;CBX_66h3~kr$#14d4#8Vi8uLx&-spD8FWUV&+m-D=#0z6Ov!)vFZ1v}mShE1XFWD$ z8+K+d4&(@q=QPgc60YVZ?&JX;=Q&>G9X{qOe&i1ZpBd;BhLIVI3HUeDFcWhyKZ~*q zE3+0GvIX0-8~btyM{^Qqasiif9k+515Azf+@&@no8Q<~?gUkx_3B~Y?#y|NNQ!qWV zGB*pc1k1A;>#_-3vlDxA0EcrNr*aM#a}_so2lw+B&+-ay^ATV21HUua>_Df`jKr9X z&!kMvjLgn_EW*;P#F}it=4{8V?8Ctv#fhB3`CP`e+``>F#FM%7OOe8bQD#gKCX zox(9H<1i7EGaa)q7YnjD%dsl!urXV)BYUtvhjA>Ya5filB{y(8_wgvt@G@`lAz$!4 zzwx)Zfj)mQB4aQflQ0!CFdOr-FiWu_Yp_0>u`Ro>HwSSfCvZCFaVghuGk5VIPw+gi z@h+e6H9zquL(B_w3d<;r&4f(Gw9L$$EWlzc%POqRMr_Fr?9P51$}ybGSzO2!T+eOX z%OgC^OT5Vke9m|L%AoTDeST*IMrT|mW=j6Uf0>8>u_P<7I_t41+psfxaUe%$sJBc$lYnkvDjs&-j*K7-V6fPbh|GH2%rIn1bn@If2tTk4w3Ro4Jbzd4lJ8jd%Hkulb2T8DeRm zQ&>h}Y$jwfre$X4WC0dqSyo|fHeyS5V0ZT8P>$hb&f-F@;CgQ3ULN6TUgAwY;B&s? zR|Z`c=<_=xFgoKhF;ns%{>wc4k0n`w)me{C*@m6jivu}=<2j9UxrD2^i930K$9axd zd54eriXZud!IuX*g<)jIVgmlnG|a>t%+I1M!^*71hHSz1?8d$v!qJ?>nOwl-T*s~4 z!^1qqi@d@6e8#u@!XPUGeL^ujqw!Dv#S~1>tjx_qEWz@u#=306*6hTd9Khim$Elpd z#azXW+`;`k#2O>F)cGQ zCkwC`%d!eyhjI)ja~2nJ1=n*M_woo&^Ad0J0iW|7zcT3BK%d_kfzcV4 ziJ6lB@L%TPe=Nxgtj>CD$~NrGUL42~9M5T-%OzaRP29-?JkE2x$~%0_SNzBy48AVV zDGVbs78CGqreP-LV15>58CGU3He?I7XE*lc5RT>~&g23v=Q?iX9vxazT!vzVDPPhPGK0Cv6z5=GYvB_ z2lKNi%dj$Qu_0TqJ-e|lhj26}aV8gVIoEM3_wX=J@gi^VKA-U|zc9$QK%Ya4}bLBX@8=kMS(8@HQXuB|q>xgKZCV z3e8B2$@oml)Xd22%*P@u%}T7v25ioD?8-hI%u$@k8Jy2$T+1!o%|krN3%t&Ie9AZc z%wG(-BhV=vqcRQ?F*(yQ3v;m`i?bZ7vJM-w6+5yA`*Rq_atdd25m#~pw{stl@(eHY z79a8j-}4)P+ZpKd2O}~D<1qGa}#&+0FUz=uksEb^A$hx2ZQekbPB`BjKu`}n`xMdIhdbCS%#Haiw)U= z?b(feIfSD*i8Hx?%ejtQxrc{&iWhl<_xX%(`GrCD2Kt0zct+!&{EI1=o>`fjg;;{+ zS&ensgss_$Jvo5GIgV2~hl{z28@Yq~d5mXyg}3>LFZqGr8EjvmQ)otFOvYzYre;QF zXFe8TX;xxQHehqMV^{X!V26bS(u9jS)Aoqm37#dt=N%0*q_5VmQy&Ji@1^-xSjiWlxKLExA>4R_@3YR+krrz zKNyiQ7>`MqiW!)Vd0CjHSdleYpUv2oUD%t0IFb`Mo%6VqYq*)ac#tP}p4WJnPxzXj z_>&PUb8ww|W-KP)-%P_y%)$ID$}+6XT5QM`Y|n1&%OM=iNu0?A zT+Vge$~`>HQ@qFWW@&d2(9-s0JKl2wu9t(5|$Eb|ML`=?f%)(qO$l@%= zs;tAtY{ic3!Tub^v7Ex$T*Q^!!0p_}qdddQyv2un!T0>e-;M|R{K1Hf!FWu72)zFahaGY`49hP9{$IYtibB5$EIw<&g{j39KrFN#<^U=)!f9LJiy~T$E&=<$9%<) z{K4R-0-eGzGGj3T|7IFyVh-kKQI=t4)?!1pV0(6BUk>4DPU1{1;Bv0xR_@_pp5jH` z;C(*hTYh1X(}6yr7@pDiC;ws!re{{>W+9efc~)axHeqXaVowg>aE{|t&f#LN;zsV^ zejejlUg2#%;!A$ucLqBX=oFff7?bgtl&P7K*_n?;SelhslMUFM?bwxlIGCe2kux}- z%eaL@@$|}I7Ve0CSr1?V;1IOK^A8@R%IPFW-E4N5BBFU zj^z~2<|3}-25#p*9_1Nc<}E(t3%=(!{&p_V=MP3?48~&;reX$WV_p_!DOO|+)@L)e zWf%75Adch&PUk!>qnVFLXSd3*^ zg|*p;E!lzH*^fgxhLbsq3%P>pxs7{ygr|9lH~E0i`Ho*1^g^J|?~K6cjLXDK$$$7S z^YA~GWCd1dJvL<i?R$Wvlbh&1>3V5`*H|Ja}sBA0he#}Hw&=@%d;BmvI$$W6MJ$1hjSdKat;@B6*qDR_wyLf@(OSB5nu8H zzcbk7K&Q}*#F&iFq)g3>%+7o)!qTk7nry)4Y{#zb!@(TIiJZatT*kHB!reT?lf1y| zyvL_}!_WN1kXHho!Z9l2FcFh89kVbO3$i%Nu`27ZFxAU+_J@@wcmiK7TMGV=x|*FcmW}8}qU-OR*wrus)lyExWKc2XQ1Pa60F4 zDc5i_ckv)k@I0^aE}!roDz+x=RDy+>$Y{?Gn&VC%q zF`Ud#-@@ zurqscAV+XKr*STqa5Xn^ClByA&+#hn@G)QUBY!aXjXnV5t5S(Ig1 znYGxEE!dvj*q1{%nv*z_3%H!?xRrZ&n5TG=H+Y}V_?BN7i_Xg6Wx+ zxmk!MSf15bmrdB3o!FBDIGp1+m26nGNSdhh8j#XKQjoFGF*@OK#jAJ>4v$=>Xxq;ick4JfimwAg1`GW8H zjlbOq^!bAk8H4edgsGT;*_fAwS&9`|gZ0^rZP|srIfx@UfzvsUOSy)dxr+yRg6DaS zclm^``H4Rn;%=Z*SVm!NCS)?EWoG7N0TyFfR$*;6VoP>lclP5@j^Sj^;zF+AdT!%h z9^q+T;!Qr_bH3wO2E7;P^E)FjI^!}iQ}Q4F%RKy#C0T*hS&vQGhMn1q137}@IgN9< zgsZuUJ9&V|d5%|khmZM+ANhm9?*}@CVPwW)0{+c3%)}hb&!Q~D%B;nPY{B;I#=acF z(VWDYT)^dA$F1DM!#u@{yutf?#<%>!AP)k4LNPp}@lXE66im;o%*{e9!Sbxex@^MM z?8KfNz~LOnshq>bT*Zyt!TmhOv%JFFe8iXh!0!z9FwiM9BQYl9GbvLuBeOFfi?B2+ zu_ha^Ioq)-`*1KvaUy4MK9_MVw{SNP@gy(sI`8o*-|#bkG328_r*MqQI84OkOvfzD z#eyu(a;(ZaY|K{d$R6y^VI0dToXtgC$qn4jeLTuDyv$pC$QOLiZ~X0XpwAzS$QX>r zBuvE&%*MPd%u=k#8m!M|Y|Ad}%|RT=37pP(T*@`v%w0Ul6Fkpryvrwi%}@Nv5KjV~ z!ZHeDGa-{PEi*GG3$Pf=vI=Xn5nHkYyR#pMattSP78h~_*K-^9@(54!5^wSWpYt8R zGU(GlpWhjQ(HWPCnUeqTU*_R|EXfM2&U$RhHtft^9LNzI&uN^?C0xx-+{ptx&U3uV zJABMn{Ky{+{w&Zb3?nlZ6Yy`QVJ7BaeimgJR%R_WWDB-uH}>Taj^-rJbII)!6Y#$h5RXF6tKE*4~QmSa`cVPm#p zNA_TU4&zu(;cPDAN^anG?&DFO;bq?9L%!g9e&cVi0)75qM8;q|CSfXOU^eDuVU}V= z)?j@$V_SA%Zw}%}PT+LT<5I5SX71uap5S?2<6S=CYkuNShIk$56qZpKn+chWX_=Wh zS%Ae@mQ`4rjo6YM*q!}2lw&xVv$&8exSrd%mq&P-mw1y8_?++fl|kPG`uxrajLx`B z%#{3x|1uB%V@XzEb=G53wqa-X;y{kzcuwP7F5zl!;!Ymmah~H<-r-}u;z#~q@V9|Z zVHlaQn1FvX4KpzZ^Rp<+urh10AzQFLyRk2aa5N`zCKqry*KsTN@GwvDB5&|MpYbif zFvz<=pHK|XX#A6ZF$L2zD|53DORzkvu`ZjiH9N5<2XHvYaVqC%}9*N_)N;w%*gD_$097vO03BSY|eJ<%03*-QJlyboX=%k%Pri^ zLp;d~yv}=k$~XMXUkv#n&?y|FG7b|lInyx zS8@Zlb03fL3@`H*AMyp?^BaHr80hl{BQgf#F$q&K1G6zN3$qj}vIgt38QZc8dvg#+ zassDw9+z?rH**&c@&wQG8t?K6U-J`xGQ_7qr?8B|*i6V|Ov}v7$pS3KvaG_|Y{ZuA z!0znFp&Y}>oW+G)!S&q6y*$Fxyu_P)z~_9&uMGM*(C2qXV06Z1Vy5Ij{Fiz7A4{?V ztFs=PvJE@47YA|#$8#FzatT*+6L<0ekMkU_@(v&K6+iL^gMSHh3d6{Z#RUADX_$#Q zn4d*ihLu^14cUV2*^PZUgrhl$Gr54vxsF@8hlhEJ7kPvC`HXM*g+aas`h;S5M&qCS ziz%3%S(%%KSc2tQjdj_Ct=Wk^Ie^1Cj#D{@i@Ay$xr6(8jAwa;xA}-K`GMaV>|3By zXhvd8#%EHdW=3XbJ{DnVR$@&yU~{%(SN7pxj^ael;CwFQT5jQP9^y$};C0^PQ@-J6 z{$j}QfllEVm2sGe$(fE>n2QBjoaI=Rb=a7#*pWThpTjtoQ#hN8xRM*Vo%?u{XLy;n z_>eF7p5OS}k3gS47?Cj;k4cz{8JLZES(v3*ku_MK&DfS**qehmk`p+c^SG32xS6|n zkSBPa*Last_?n;ilOcWvI)!Bv#%4k$V_IfrP8MJ>mSq*zW+S#_2X<#a4&@k5<}5Dc z3a;li?&T4l<|W?b13u?Fer3>Kfj+-80;4l76Eh|M;lIqo|5%b0Se^CQlx^6Vy*Q8~ zIG)oumrJ;so4At)c%0{Wm3R1GGZqu@Z>C`;=3ssnWf@jx zEjDBewr4l?;Tes8@-L=fdS+#A z7GepOXEoMk6Sih2_T&H#=QvK~94_W6ZsZQ`=P{n;72f6}zT^jfXRzM_okBAbV=_LI zGBqWW@&d2(9-s0JKl2wu1`Biw z$Eb|ML`=?f%)(qO$l@%=s;tAtY{ic3!Tub^v7Ex$T*Q^!!0p_}qdddQyv2un!T0>e z-+~AF{K1Hf!FWu72)w>5kL2}MH=Oh`FoP*?? zbCjHsoCQHaauyU66+s0R5EK*y0YN|n6chyoMNttH6lJPczrD{oo(;3-o;h>xo#X#l zzE#~HU;Xt}cXfr;U0v9l137}@IF*m_NiOA6e3mb9E8pZhe4iik6hGrv{Ek2KH^zz= zu1^9cXF6tO9u{UvKESH1!$xe$4(!f{IfSD*ku&%>7jgxk=JR}+Z}2Vd<6)lQC;Wn! z`2&C9AB-D6T&KiL#f;3s{4B;YtjHRy&!%j{&g{hj9L}+v!daZhC0xz*+{i85!96^{ zqx_iXc#&6ljkg$;AY7mLOvbd#!rUyx5-iUutj&gO!S?LNz8uU^oWSXv!v$Qy(HonSt4vk40IU6D@ip$`yFAEaJk8JfHNWR|{?6Em!}UqX6im--%*!Gy#Rpl9b=jD$ z*pWThk3;zgC-G4}!9`rjXZQkN;Woa__xJ%n;-~zQ-|$EN%0GEul5m}pFf}tVCkya? zmSrW@*9LNzI$EkdbPjV@r; znTLg0k`J&d>#z}9vID#GVGiMFPUH+e&V^jTr};cz<{NyA`*@fq_zAz@W&Xfl_y^;r z4c93#Q!yiRFh7g23@fq*>$54_urqsc0Ecrdr*IbMaS2y*JvVX-cW@66@F+j#IbP%y zUgIrBr3=?5K9eymvoJRcu>{Mr3Tv|=Td+O5u`dU66en;x=Wqd+b1gS;GhgQ}?&TpK z=NX>oC0^wX-e#Qi;W{N^N@ieo=3`NoW(8JfJvL!$c4ANV=P-`pWX|MVF6Jt(HwSVA$8jnjigZWvEWmu6lSf5SVhMn1q12~*xIfb)0k4w0k>$#CzxPyCmfJgZ;&+#I!@EUJ1 zDr>kt@tKTinT5Goh$UE_Ral!1*@ErajeR+oqd0-nIfo0loNKv(oB29-aW4#+%2vlDx=KZkJ)Cvzs}axqtN9be?D+|J$H z&m%m^v%J7>`4eyQ4&!AH*C{E}Ff((pAd9mcE3+0GusPeYEBkN|M{+!;aW?038Q1VR zZsKd)$#;2>$9S5b^J{+3>-?RubA;=YkSUm+*_f9_Sc(s_8tbw#Td^a1upfu=5l-Tx ze1eO(lF#r3zQS#MoA2=he#B4tCBNa1{FQ(5zMSDYC1Gl2Vony|{VdB$tjUMijBVM4 zy*ZF0IF3{K7@y=)KE-GG61VbAzQgzVAy4r$e#P(jGk;^OT;cj8U~;BoR_0-0mgEDh z$~tVsmh8ape3(NxniDyLk8>ec@M%8Jm-zzLM*}ZtisxC$QEqRZtTm!9K{Ko&N*Db-ZvH<#z7oejedT zp5+C8%b$3YcNi~UxK2r#hMAd*1zDWsSedohfX&&CUD=0&IFjQzjk7tQ%eaQmaT8zT zPQJ^7JjT=foL}>MUgz(Ooj+WkgiOKo%*MPd!cu&Y)mWE}*@_+6gZ(&^k8lznAj4B+iPkbh0 zT4rHx7GepOXBF0FL$+Xhc4J=-<|t0!bk5-dF6UZq;AXzgUEIqd# zTmHnGyu)}!!*xo^G|bFgEXd+4$I7h525ioD?8-hI#E~4&X`IdZT*ftgj+^)zck*2x z|){iBxDMvXEx?#5tibEtj4-*%vS8k9_+`Ve1wzuD4*aWuH-X( zfv<2I-{yP#fFJQwe#vk6BY)+eyzl;Sosuv$GchL%@P3wMCD!CaY{s_i!rmOn5gf;< ze2hT_F)Q=1FiY|QR%IPFVoP>l zcRtJ^9La52mY|T#W$^IP1F`UeqoXf>r#dUmy(74nTa`BfcLX3E3qaYVl%d77xv~rj^H>>0e3_i|dm?!uNzu;y5z+dMu1|a>V_IfmZWdw* zmS+{#W<$1Mdv;@A4(2FM;B?O60xsuTZs2CV&RyKgLp;tiJkLwK${W1RI1h&Fl!z&r zf!UdlMOm5^Se^CQgss_$J=vebIEIrslXJP4tGJFY@>Ooh^-0JSOwVl0%OWhr2U(4E*_f@^kv-UtL-`0N@lig(MO?{e_yS+yHondG z_yIrSr~H!N@JIg2KY3rJaGjDcH8U|M3-ErHWhK_+Lu|&j?84q0$PpaJseFu2aw(tU zvwVqL`6l1t`}~ln_!+ZF;?YpeG)J^(=jXaurN#V0aj%lHeyS5V0S*uAso$# zoWaMrkSq8!pXbYbgKu#k5Ay^+;TOEjANULZVB9L)ge?JjCNX!}GkvtGvP6j8iRKr$kK249w1a zEXvZX!0N2WCTz`4?8*Kd#xb1CnVieTT*Y;Kk*{()cXL0F@FdUj0>9-?yvaL^S3O*( zq)fxi%*BE%&T_2GT5Q1PY{#zb!$BO$@tnrloX=%k!{@k(uW={el4lhU=7sshNp6S%CMmEGw}lA7V4MWf%75K#t%zPUT~Kl1up%pXE#3 z$~XBA-{*%s#n1Q^zvIvRjj?Kl>yv=VnT}bRhlN>^53nlhun}9b1H1EK4&i7{`8;3d8+?oVc$g>n3BTZF{=i@O2jkWb*C{bmF(Y#@KZ~&pE3yXbvnkuKGkb9W zhjT2aa2Drr30HGHH*yPia1RggC_m;oUgQ;C<1I$j3D+k+lQAu`FgFXa1k1AuYqKF+ zusyr6F9&lJCvZCFZ~>QdEjMs8U*|6Fn3|cGlLdG`%d!${@*y^3TXtb@4&(@q<5WJzC%KeQ@mapat$dU3 z@O^&BQ~Zoy@jL#^-x#YwxIPJ(oavaAd03bw`2ef34jZv0JFq(+<`9nNM9$#jT*wuC zn$PoPzQMP+kB51JpYRJ_<`4XZe=u&taGeq}6*Dpi^RpPsup(=)KAW-)JF^!Da5%?u z3TJU1mvA-Lb0fEK2lwy*kMd)l<3(QKHQr)Wqi}uVGa1t|3v;s&ORzkvur?dA1>3V5 z`*JWxaRR4v4i|7a*Kz|l^L6gxULN9cp5b|3;#J<@ZN_OFu2UkWWCmtuJ{DzZR$z73 zV-vP!C-!824&xY3=1k7zVy@ykzQ|X(ox8c8M|hHFd4b>ZC*I^8#%mI;Q&Og3X69l+ z7H2tDW-T^gbGBnw_TeCo`8#7b4c8|j zQ!qWVF)xd-6dzWx-{S}Th@bLHe#0O6 zEC1wu&BAp`!qm*foGifmS(cSplMk^O+p-ILb09}>9H;UzKFOtgiqG;TZsnVNhwt-4 zp5kZxir?{P{>E6%!}UqPr^9;}P60h8R zYa6ap5~gM*=41ih&$6t$aVy{CJA9uX@)SSg zSNx7Y^Ebw77p_kNCTBWkWgZr0Nj|`;tiwiZ$qww!hdG3!IgvB?I2UpSpXT#?nQ!nd z?&D#e;3xcom-z#K;UA3KK3u27OvQ}M!Tc=7GOWlNtk0%w!_Mr*0UXY;oWfb0$0c0N z_1wrU+`&COz@z+_=XjAb zpTjtYlR1-fxtOcCjxX|6Zs%_9=MkRdSzh3`{E0Vthw(av>y(sfn3=g)ki}V!m061o z*qrUym3=sfBRQVaIGgjijBEHDH}N&@$P`S^Y|P6d zEX4;|jdj_Wt=N%0*pEZ`2q*DTKEXv?$!GWiU*R^s&G+~LKjNqSlHc%0{>ndjUzc#5 zk}x$hF((V~ewJk=*5pHM# z;STQM0UqVYJjaW?!fU+6sP5tV#Ah<5WftaUA(miyR$*;6WDB-uH}>UVj^YGP=NvBJ za<1hDZszOU#l1Yl<2=Ljyu_=#!P|_}BV4CMOvwz)&U`G&(yYMhtj8v7%}(se{v5_J zoXnY=%f(#9b$pSpayxf(KacPv&+-Dl9Le#V#@U?DWn9DOxQVZEC*S2k9^+|#&ae4Buk&}t?iH?2LZ)DPW@BC!VJSYy zYOKq~Y{ic3!G0XdM>vU(@(C{DNl-J`+A4#l!U37 zi8)z-_p>Z3u_oh1xi2--Ff((pAd9mcE3+0GusPeYEBo+1CT2>eXIAEBWd8S?F2f3} z#yV`sNI%+|?#!O-#~~cW@tn$8oXbUA!L@vjFL4XE^KI_qAs*u?p5q06!ykBq!R^JP z@8cUQR@nGV%GAur?99u;EWvWD#2O6#{3Lol!DXmugVRyb2D_!v1~1QO2XHvYatdd0 z9+z-6*K;Gca0mDB0FUxxp5sMc;Wgf3RP1nn<1-o4G7EFF5KFK;tFSg3vIX0-8~buF zM{xqDa}F19IoEOnH}iGw;$9x&ah~CMUgA~W;BCf<6RuMtrep?YXFe8XX;xr$)?*X4 zW+(P!e-7gqPUcL`Z3u_hm4Gqz(CJ5IlF;g)kb1*-Pu?#D+2J5pa+psfxaR7&NET?c5 z=Wz*Fb3He53wLl25AY~I<~d&E6<*^lMkNf_Cq9!gEweB;3$X;tvkGgoAzQFLyRk0^ za}+0VI_Gc!mvb#Qa5G=$F7D+a9_JaJ=Otd{4c=y)MBzFmVoGLUcIIPImSzQ3XFWDy zYj$E!_UAB;;bhL_TrTD+uH%b*mD{zU z;w;C?ti=Xw&UWm|J{-i69M5T-&G}r$HGGbn_!@WeT^{5yp62KLn&0y}e`o9@;rb+G z3Z`c^=4BC<;)ATlx@^o=?8qMM$Dw?LllUl~;3BT%Gkk%sa2wy|d;EYO@l$@uZ}=mB z<)6GSX}C^Fn3|cGlLdG`%d!${@*y^3TXtb@4&(@q<5WJzC%KeQ@mapat$dU3@O^&B zQ~Zoy@jL#^-xw=dxIPJ(oavaAd03bw`2ef34jZv0JFq(+<`9nNM9$#jT*wuCn$PoP zzQMP+kB51JpYRJ_<`4XZe=u(HaGeq}6*Dpi^RpPsup(=)KAW-)JF^!Da5%?u3TJU1 zmvA-Lb0fEK2lwy*kMd)l<3(QKHQr)Wig116Ga1t|3v;s&ORzkvur?dA1>3V5`*JWx zaRR4v4i|7a*Kz|l^L6gxULN9cp5b|3;#J<@ZN>>s%!NMJ5-}w+Fgx?HC`+>ftFs=P zur)ieC;M|4$8a)daxNEh71!}azRK;~&HX&WlRV1{{FXoQChss_s&Ji>G7U2`7YnjD z%ds+Ru>qU29lNp*2XQ3Fa~fxJK9_L~pW`OJ#+`hZ2YHOA`8mJl_q@*E89Q~jJ_(tE z>6wjrS%jtdAgi%18?zNVvIqNdC?DY@KFTM!h%5OFU*Id;#<%$%Kj26Flwa~2{>WeX zC+`bRz(*hdGc_|YCkya?mSrW@*9LNzI$EkdbPjV@r;ftFs=P zur)ieC;M|4$8a)daxNEh71!}azRK;~&HX&WlRV1{{FXoQChss_#&DgIG7U2`7YnjD z%ds+Ru>qU29lNp*2XQ3Fa~fxJK9_L~pW`OJ#+`hZ2YHOA`8mJl_q@*E89P(BJ_(tE z>6wjrS%jtdAgi%18?zNVvIqNdC?DY@KFTM!h%5OFU*Id;#<%$%Kj26Flwa~2{>WeX zC+`a`yhnfjGc_|YCkya?mSrW@*9LNzI$EkdbPjV@r;kym()w-}WzT%Y(%#OoZF;?zyeG)J^(=jXaurN#V0aj%lHeyS5V0S*uAso$#oWaMrkSq8!pXbYb zgKu#k5Ay^+;TOEjANULZVB9?6IwfW*W@HZLXEByxMb=<_Hf0-jW-kulaE|2^&f+{S z;cBkuMsDE_?%@F*<;Oh7i@d^Xyv3-z;rhg9GNxq~=4K(5V0l(yZ8l^Jwr4l?)ge?JjCNX!}GkvtGvP6j1%lbhV~;9F(orFJM*z9OS1y2vmTqU zH9N5<`*Rq_a586dE*EnZ*YQQZ%I)0E{XD{xJj)CGmOt?(?=W8eaGjDe4Kp(r3$i%N zu`+A10h_ZOyRr`laU{oc8fSApmvIfB<0ihwoqU%Ed5ov|Ilt!jyw2YlyFj=;37LZF znT>f_gr)c(tFbN{vlTnC2m5g-AK@fE$|typEBOpx;49q5xA`7F;79zFU-BFN$Y1#< z?<*LtQxc|TCgx-T-p{hE#F~7F&DfS**qZ}6g5x-qkMT(^xDE%)$ID#xktP8m!NzY{Sm%#Q_}7v7EwLoW~_x z&Gp>KE!@F9Jiw#;nCEzrS9p!L7*!-(pZHA1w9LZXEW{El&nm3VhHSz1?8d$v%u$@c z>72s_T+X%Jz|DM}ySSH!c${Z=o|kx)H+Y+IiiYcyh$)$Y*_n?;S(+7Co%Ps+t=Wk^ z*`LEWhLbsybGewSxQ;LKRc_~Q?&lGnR;+xr}T095?Yb?&P~X$YVUs&-pdK=XL(h*!PF)laMKxp4pg} zMOcatvKs5MFp>JIhTvMitG3yU*&f0=6)XGNuK2ee#@VDlXn=eOt?--nTDB}iv?Mnx@d!+rHQr=2k~y}DfsiG==k7rZnVK^?`VV51knb& zQ_%)5zi9u}^%a?468|nWgFnxR&XbeD>6(8xpWtN`Jza@4`4F42ExWKc2XX|*aVj6< zlU&ND_$*)IR=&x1_&z`6DSpPU_#J=dZ;brTKmzM0InyyK^Dy%J0wqm9z^bgn;OFF{ z>lgg2Y_!48%S9Xf%uKWoa|lOsB4_Y%F60V6&FA?t-{4!^$HP3qPxu8d^9TOIKNvT5 zxZjDHiW!-M`B{u*SdleYpH10@o!N^6IGkfSg|j%1OSqcrxshAAgL`;@NBJ?&@glGA z8gDTwPPjhtnT%V$OvB8~#eyu(a;(f+Y{2Gh$FA(dK^)2PoW|Ll z&t+W0=eUWlaVOv9K_262e$KD?J+Je3#*P=RPeP_(dS+u@7GWtq$ZD+1#%#ro?7@B< z%11bfkMapF;z~Zl7x)Ud@om1x5BL#3<(K@1Kk`@p$@}7m>y(74nTa`BfcLX3E3qaY zVl%d77xv~rj^H>>0e3_i|dm?!uNzu;y5z+dtS%KAAk4@N`o!FE8IgDdCnKL<;i@A#H_#$8B zcJAhW9^pxz+tvSWw;K1A76&+ z@b~d$xDJ0GUxw@O_wi-84*$0wU;bzJxBq(GsG9xuI&8@1j9l00Y`Q1=aR^6oJg0IN zBiH>FnO?!Qe2$y=8h7$t9^^5e=I8vH-}5?uXKdFo5;6rNbqx+{qK{+#zCISN!~fr} zj|Hbc!^h7|!_3UZf(-r~D>}X$E3+0GF!KIrXSyrby{`~1J__5H|t`+GYQejojPojqKK|68uJ|DW2PM&3vNRolNtwzDnSf!+BqBl|a_ zO;6+uKF)=V?AJVP`gy+0H~1F!@i0&D6Mn(V{DHsl55~10lbER(xj#k@)A?D9Wmu7a z-xnkNe*NoxG5)JxkN?^I?g?H8(>aF=xSVUbft&d{cX2Nd@i@=$JTLJoZ}2wbcwHr8 zN@ieo=3`Mt>izfU=-;2Cq3d7&UH)F}fA#Y<@;>>m`kegFZkHm*J%2qPFwgd330HGH zH*yPia1RggC_m;oUgQ;C<1I$n&P47jmCSV7zifa0ch$AJ`PO3-wq_^xWPc9h7*6I) z&gFmg@z($9>+=89adhPM|M%y_-=7oz9X=-_ulN65+ofu@AOBxD|ND~uM7I0eO~1{3 zJjBR(;8Ug}+y4uuzhUIKDYAbWIUgMPyZ^}NK;-)%seKM)VouHrHiV&jensE!DM2tE zKNy0Q5q*EAWKmJ&L(?gvqMC;cPBwlJGJRB3&QNTosHhPkvqnWlpNDJ^6_p{>zaU@v zkim4tkU>oJ@n|sJB{Uu6ALsc=A%pp>G`%KdFu$FqcZUp;pEn)-IT*}8`uH%&7ybQ) zpdST7%M(l&2^sV!s@Skc1`O}oEpYhIuzez9!+VY%9#yPI*Wq2Gigg<{EUMVhp8bo3 z9xPV3T7%9_S~sgTx^u08UAy(~S-oG&!OeR1{-+T&`wsheA^$W%?fzYd^=UF_RL`L` z2aOsS_1C$`@jr>G({p&MLH&n!?cK9k*MYrz{?p#n7&LJB&_VshHSgZFf8T-syx-v^ zYdkXO($Kym|9Lk3iV^f5mTq{@p)CjYkfeEw#!VUy>LFQ=p4~?D?%a1^uR%eTqsO~; z>o&CK$Z*F!GBmU(Y9D^+KRz;`Yxki+j?n4}hXe~1%p*J=tj(xm-3JXA&~sq0HvcWA z*U+v5f}m>68W!t1eE875-9`)#&8PR!K_dnSuZw@Nr3k+N5WEck(MktnNrK_YU##u#y-ea^e(+ZH1(RLi@??Tr!F_8xH` z#)xZokGQij;@aOM?sAN{4)=(=9wV;fJ>o*g0g?3<+6TYe@+OH97rGXDx46)GjYz&O z_lOI9k1P_`^&WAd?;S?sy4@o#bp9?97dnS|xBk_Q5!d4$aV=uR^}I)1ml$!q?h)5N zMqKZE#D%{97Fmuy_lTPoBd+f~;^xJO3!T%wTU}Phi0gNcxD7Gl`rjjNYmB%7_lVma zBW~b5;zHlsi_~S%J>pKshzo7I?zX%aW5f-K5f{2H8ax#hI^GMlA43x{TCkaqZaIVh zhn|WPp8OASk$;vycs|&j`JcuW4`M?9Cgyw_1k;fgT8>aF5)280p=vOMTE*aoS1AHR zpECu6Aru#yUuat$GhgU?hyN^J=rbo~z6LS!6%L+@}?fq8! z9{D;1`EvaW`FaHTLh}vvukJnag??ZCiGLyAoFLztATE@zelXl^d6Q(1ifS4>A8B`6 z-Xd+2MZfMt`9j;(yXET`L?Lis}Pr@Q4lm?J9c^GK2)E;9Pp{?%+BtdF3tp?s0!fCRz#Ki+Sag8%-}?v`&(kT3Fji5v&~v;JKQl7+6}McUo+Z4L4z z2%ZcrZ{#@OpXJ+~J1VMZuuX`xyXD*2DOuF$RN;J)-s1i z+^}-6{&fg~?^eGgWul_$^^Rn@`}$osG+ETr<*}ldx6?iHwG4I?L;G`)7RmhA{#8tx zB5HIH6sljBV7OcV-U;$eC>sQ5cgwdm$Tz8SIA6CQ_HOyA1{cbPN0J0_ko>*8SW)wW&(=u0TfPR3 zQbYxttmu4wg5bL?@0#F;EB*|9kZE_zx2{9bzu-JtsDF{;fPdD%)mLIgg{}cbT4eOE z^-I$y=wI+;C}00zxLg0Wd>1QfO(aPW7a9F)zW%`tG(-FDp?m}Hk+1pHSW)YP=OgWI z`D*q{5w$G{3gru}m%H`vW{__{BuNk#8U1VjZin*e-_U#H>lqv{JQ_O)(C(IR>wpwd z=YzOV|Aq&{-TL?4wOCQ1H5B(e~s_ehezuQ5+&~J%^ z@`c{Vcgr{VMy#mNZ@@%aWc07~n=>qU{RK~k@{I|GyXD&w{NT#Uf2DuJQ$*d=zj61- z*Z5Yfe`$Z{dT_(m;z6EJ|0dic-}oS3rpQ7Dagou#E^nUE|MvcvbdP*Xev1`#Ie0$O z?v`)dBPpU%sNa+z_-^%^_cV>)yM}x;A|0a~<-8-?OLf`$5w8(RZ zf{~c}_X{Vch~AG3E$?H&5Lw<&XXU*b*_O7IR`Fw9tG*E%f_BG5dEm=-<5H@lgLl`?Hb$MFlktcKbt{u;@0pNV2HV z@nWP!Qilve|IyY3am5owMa>T$Sr!bTd?|t#K z>7bJQV5CDz@I-(>$66vUt{O?HrD9Jk`9bJ+igLG_3ejL*ACHV7tVS z-$)miQ<6>N4l&e?}2oAN!}Cbijw?Fq^nBuUP!%5@~e@qDao%zx~?Se zgLFOqb3MTvWondlI_os*gJ#i;ZmuUik1qm6uxaWVhU^iLwtJJGV6~P1Pjbaszx^wh$Ye6n_Ij&O z@39FzOX|uv$O+y4sdvT1E+zG597-p4BK>@l=TPf(7uJDIU~9x@wFSRM{s$HCCZ#hi zdssTl&TUZVbhJy=gl4_i>gApPzuv2C-XF_y_y;vVq3(Z>YT1xVW!CJ){2vJGvMT(G zkZ7-y03TaW&rE{f38nr|52k0yy+%y8*DF7vLZs4W@I^T5w<6uZ+YD79O2K{%>&fr+aEi5UEbdGdk zAv>SyQ0O|FaVVQO2l?6bUd*=qukB{dn*5JOK580(-q0qF>s4X;SXf}ymWdV70|73a zgOd0MxW9v|0e2+wBT6LX%%Px$^sHf%AB6lsv1>?AYYr+W0#f zY&tW>*lXqQ$lK^lM_^2;!23JW*NN{OV_(^pXPsQnGSTFV>q!sW_}3bK*hjz{nJzZ( z4eB;7{*Fr8_+D*Xl0wVR82ba4up&?|yrs4gpelNY^7OuQ3B%B9L-EFD4%i4(;?oz% zB@6(+Klsj_H#+x2zD9mNY8c?s2R-0jB1z+J7y4H52J?yC$fj*%Er-@y3X3CLR1Rue zxfORz|oqvss~$=Y#Y2_p;a}x%|KHaNkS^$YZ>> z$pbGJ~i?aw@Wu3@x>O152zH5hZ$2Rsb|NL`3xf*@> z!TGfFLg!-iW<45bMq@;s@>5USC@>Zy>J*yWB1cC~>WdMjc(kfU+cD}Ikz<$|i|}9Z z7`~vQx|~y$?qshbd7A%X%xRZJE^_B`Hc#u}4O%q1G;m4*6Qjdeiw#qwUNm|UFq!`q zQ?_C9Hp~U6eHs%9RJ9G2iEi}0UbZ@+ZUWv-%++e!cgaM5pRaqmb?O`6382VH{Tz`V(FWgJuq8oWp8nX`LEjk2`aO#_nRbD>B4r4pzCXMdL zq92{AIsI0?_2_y|WAj+F3rbb^Po0{hIXKM8oBhqHbME@Fzd3m!7n;Wk!$?m2F4Z^p zs=9OT(Aj-+uc&;SwmQ{tDx0TPM>;z=^*~ze{9P_JN7c2SQ!iCDpd}8d=G0SVbSmex zXevA%^Jz?Kj#PvCki4-t6^|R5*{Y--Wt~h;F;oj%pQq*ss~nwr{g1WiMBYg~$UFJF z)xNpjmd?5UWBcZMnM3m=&DcDd`(BpEbj}?(JDagORdVX=^r&oG=Uz@-;q#&&d}iRY zx6SAE@Y(BMpGSWhotmTlkI$HiT`DN*e6^ZwI)Z6C?$gw^Q$vg2zKtBG%H+^*OmyVb zvQGW*=A3&MjCrALou{^aIp5zLl;fZ4N#>}%T{yfI0g^hOSF20Dwz4!T zmV8tHl^Y@duW~1rm8>5PcptmcxPWyUR(%aMn0@*d23H^Mtk1NKQ&`KUE^a+oS3!@_i*&~@(F*#-zQ(rAGbQar^9;2Vje_V| zLUT6Q@-!EqMwGXWo%b;E1yJp6RQb`ot(6R_wl4JD|A20r#~6%<)MwgW>A-bWyEkO1NqkFXdkCi@m(?nMy27L>WYk7AIf74C`Y>} zm4>g=QpKnQF8r~;sE4fJ7}cb5w1-g%{Mq+BqtS4a{+vT{lj}pktp{wDwKReNw;d1l z?glKQu4$!Rr#j;U@{O#t%hN^?V@m;~+gWLA#ScPekW>N-%c5o9rq#Gz)o3}r7byz``J#FRc?%j zs|{7Q_o1RvdIHOEjqGJrl|@Y;+1O6iR8mN?iOQ6Qrmw41S3$C=y{wTksihjx5j)jP zsWldQ&FxexC6n}8*e$eETI6aOuBE-Kqmr-`D6Q;N7bTY@TiY#kS7tvz9opE-`YBr? z(E4rd)IcS$0a~J+of@hXl3sheg^|kY+US{I>}AeMcQZWeV5i0@UrDl~-GYl!uu;Qs zo$O^Z>>c80r{*Y2o1o1)+a(t$b;iQ$F7`54MNmVptDW*t?!SjUCp)!L>CqZ>?`Ee~ zEAxAy4&CjPk5bkdUiYw5n;6}ZwGi#8Qm;Xm>v@)j676X=0Nrlb^bzBcaX{CB_+r(@ z-?jLz)vhS`E*8zklGsmY1UzGpvk+4Wn)>h9?-G0+HlHLUD?N{|<{8#du?_|tL(UqE zQH(mICcdKj>Z>R=RTLVCqdCl&d_{o~8Y(n4Fy@z|K{T-u8gr;hVua>4LNK2qqLqzM z%(sbXXCsW}QX4r&=wKtP=K0AyBXqG5Wf}FczMy)jK9j*_Vq-Ch3?5At8L_ENgfYua z1x9RPBQ)kee0fG}Z6gHp_~9HQ+HEN2l@laJwA(P6C$!cuqN7dBYU$UzHzRf}O;v%x z>XWpL=%ktk%48LLiS;m;o3-I;M(k5!u%HKQ^eZuV>R0nbM*2n79B5*vD4vmT+CE9^z-ds)-qP*}AXn_VNlN=SoDBdxCj`?WNICzv}TH8(4mFT_kNZ1cqQIu`0BS5*fCt zoi)zJYRfZBMW0m~VmBc|wSG=T{RWBXzMX9J40u5;TUtYwD&+l%H!V?Zvs4$O9~(HG zFg*9Eh~1J1U_hF>zmldD$FOl~o0HHkair3Qo_L`n{@?7%(@)9_d-z{=S!l3;@H<{ z8(!V4#9GCWuR!9}z3p`Gs@fSEt8NBVMf`W1s`98bYGqM#S8T33Gc_iZ zl-f%izL$(-m@2nNpojXZY;Odlm>af^D2pM*-kE(>?d+X7wPKA|HqoJWA6%;TA~V0K zN?L3VQ*-Yi)GfU{yMo5=2YwF*O-R_s-(RdKCEqKSFLvetIqk8Fm~l1+eYx%K!!E3we%KQ zt*@XTRK~;_%WQQl1FV{iEdK&7mOrJj)M_KQm0Qa_ELhf+l%N&4+6-~D&20(KvOO#; zXrUVDhBCgqW9~0HC zv;i$anKJ(s>S3{qmHnCdQJ2^lBK~2*?>gm7tXbQ!>=s9ql>eVfe5s_uKluOEAzvzT zKQxO9pH8L!!t}7%P1t}c|IcMM^Hu(9iE3s{L2|A0s4OUB;_p)>5{H zJp`E}Xgu&C z(Lee&=^u?7^beS}f8SFY&FJ5Ex~`qH4V9FoL6-iFvnT)XX_)`<-~S(WHTK$L%*RK` zuxI!gMzxcUM(6p zY2j`xUlbLm?bH-|D#6H=b{dB5PDPVVUi0Hqtuxz6wO;)rpVN(Yc2W zD?j!sKpT~^^X*{jeTLF@npZRjEYgnyRv0X0NJB32UFK zDrap7^b+UPpH$WCGCr#6c9{}MUv&+8j(eo`tcY!22{oi5_Osm3?$~s4!{Y8@nK~i~ z<0CiHdJya2QOg~$g`{_yV?G2;yX{2~y) zj0Ip!SDv1`AJX&N0W6=H{Mn>i?-mxw%(nL=pZboTyDm}b&-)22doDeiK6Y3on< zW#dUcJR3`V#xINH>xGm2K^(GjObvzb|8S(z>+Oj%4uNHknG;Q36;C7iGnI(rP#M)_ zR?MV)xjTe8q&vy)u0WExn@RHi7P2_-1^L-jq~}aEX;srvy>tu7)`&wSIj9eD{wSc* zliq~j%~9Sbjbv8;LY(MdDL+1yEcS3G`HpW1|9C?xow?6ut1Ue}|0Ee>F!6o6liiI| z$-@P-0b{=SW1GV438CkW59D))S|s^<5XlrV)EYrAsdPdgvRH8#c@kEUp0m4CY5m>w z3_C-%g5Q$=zq`}(<~ouY-IH)8A0UL<*Gcj&y$($9Ao5Dnj`Fuh+5G=R^5c#Wzaat% z9J7HToX4Aq-+LW-H7lO@1KyBK*+p`(zHjAX^`^)4xA3}Bc4kq}f@$iwnS2{S%|><(;9`TVwoBQ_@8j<&WfwUzQ27|!tSsi-tBh;Vw^ z{G3sT&<=MbE6i2$yvIk%&&nqc*YZ>gM-}l^%Sr3Hm8^`pPH3G=5pvfvgpi@4(qDqe ztCwl?Tpv%i%m)c=rGe1CCQ-XRctiX~{v^}-81dsv6TbU3lKf>6l|CFy$a@m0R1;1; z?$e7buC(=<75gua*@wUt9%}j@+7|&`F8#S zJ=cyVgow9Pdg&zD+R}}l>PW(ITtNI^TM+*2fs~IeL(c{i2C6dXzOnhrq%D4T6(DZMJlVGA=(1ug{ zR6=wRZ(|nWbW0~69%09Z5j()vcPvSEFCss0jwH!_W$3wSD`8ITLo)SmlCA+8PL5fm zv*C0n{}%;P>5H56Of4ecx*JGlTM@}jd_{Tw6G^hzKyysiUsSsrcZh$e56KU%M7Eqy zkw1JBlDUVCIlkzLRN5IAcJO8nA+5jX5x-6=(p`rwI=-5b#3}ldo@YK2&XNO^zk+Kn z@MkPZCSM?3!&LIH1q2S!cwU8eFW+H29j3%uY@`0DB*jzp=UyQl8HJ-&(lNbIV^=FH+Ckp`Z;7hrYuS3 zj3%64ZC}|u4=Q#4h3qawxCGykNV*;Cko;U*OEzss^7EdP?uYUuKk))_nnl~>vAsh+ zib|6QQ!hN-L41ouIE!AA{E>Q8$NT|QI%N~dUzkJk)hCh6LHm3ZK|WM&M)lHvA%wgo z^z1T?JXw}ZID>7g2(2689BM$AkH(NzMQ`F<4_1&epc+hz)h zCC}p~lMkvKdK&x)zwLR#A2g8ijoe8lWd$J^RuDgA1|jGJ2>DxC%BN$otz~X>Ae5}y0&@OakzgKDjgrrsHJisZ!(gvq}oyM?xQ zU_zb>{7O7|=>Cv=;PK6BnI*Ovp{#8bRTM%9tW8!Ur1)g0eWVQ zp;nE!O!!Ua*pMqxTjgQY(lXT@s4g=Qn!~u=jh;VYeWGRN6q95Vyw6(Z6xMrMX8Ca9 z58Y2%BQOGMnMNt(Rke;(-|M!ye*Qs1&bPfMM;1|!AGl;|b6+evY28`QZ3DQqZ>y1a zjK%daZa}XXw8+41)nR*3)OO?tzh45xAz_2z_t2$1z#le?-oG&+g{Z@XhSe}0O@B!J zIxmXWg-bGf!iGDm>W}91X7|J++06FJ0n?Wq{~lOd*ma*l`LT2NA=%2-c>y?o*2fLL z1hOYgXyR?`ysoHm5L^2&)VH(sXTxqVyZtUCcd(z|L2@VSM3ccT_R(1=>}L0r26PDf znnt}n>{6Q0_OksZq6Yie;iI6ipS?K~3J2J!!B9BJUV8)RLu?TZ(udhn7g75oERVAW z?kIa>C?t=ut~9kBXC1zgopid}F5U=eKN zP*A5?(_>ga!){B0dL-**Mp+d5oQBi0Y?+&|aE|Slgo;J8{xtH$u;&oR<<7GWcEOie zcEt%K39Mr|lqIrkN0?1ww@*P!C$mW>0ezdz&V#}oR!N4RcUh1_9QNHSS%Wt3&J*GmEAFSH|#Y7ynf4es1B4uHtctl6|rlbq4171Ss?PB{niM6eq?)n0rV%f z$_F%7F&mZ+$**j)*T8gD9d3jsa8niTfu5J@kNSwv&`Vi6#}kZZ8G}&z=RI25Oy8LW z%o(faLT%=?O~}u(=2}?`ZYT6Q$kxfn$-XA_| zUCRN3|JV~xVQ~sLqKHL_O`_UNnwsh+V(`;0V`sX-e-HMLMfk{9vNf-PTE&W3dTG7b z7A6?*W}7y^hZw|8pq1x#_SH*>yk|%Eg~MOiSt-C;uBtp9l3uFvQ{dfZ)$mkMTUBwF zKy6pe3qZ#lRW+Ccy=YbQHPE}JN-dB08r91Xu?YO~9ee>^En*zd8oJ{yCf7d32*Ck2 zaO%lTyF3%m)ojBi5Zc2onGe7yw$>3e!Y%et9tMj-wlQ{oHbAN8Bmf%kVYJseyiZ3Z z>+ixWplz^mDaMVTAMC&ZYePCK)i$c#5d6l|@-dn<8Q%(x)U<;H3(Yn~qDh-y9R@dA zwD*RUmb*`(dt3FqiD&CYwDxFINrmyCbALpDxt{z*X!XydxnNYkdXRB>=Yp!wENF_- z1sAR0yRqlDp>8YL=IemHkxfEe69a@Feat)A4HhJa*|g?hhO>pZtE-J*ZN8soZO)%z zZQe(+Hus}goBwB7a#|b9+UjwErHa^_pqCD|O09T;hA20e`m4e-`u?iLJb|ON*1DoK z>m=7lD>g_Qi)Z5-Ti{~TWn*E!^`QOWv_F*sPKO5D!08e=4QM?&(8lK1ZuL;H0S}** zyu)QWe+FWuz($a+;XEET>M8s1Z2lXaYjr4%FcsIspO&QqF3@-8%BIlT*p1D@Q4|Kx zT2n#!v3d>4wzB6|!7+cf4^7=W*?dnx>|(3o2nfU88JhPnZqd2tQMPgw7&*ocMGOhIakJz(zx+x0Y#wS-ondsIhm0&K5p+)kA3Q|-lVY%W~Y#{(j#R92d3B2<$TVBwPLdRx>Mi|kj> zi&te(fFxCw+6K%As!h~i8LF40o~>$_fr>p<)xynlE>Bg{g2sBM+Ta1oRlR-*^p>lC zZUcqY>V797xkhb%2t7Y_Kn~1qRX4zS0k>OyliDRjy`U?^05Wf~;Ut9#>k zjEhzGlX0X#A7@o=AarVky+gic)n@RpRu8X|GRMqqpgYey2UA`AuOQ#;8`WWAbwkNO zQ@-UY)V|)|Yv5D;K^n+4Gz~_+$&6aSYd)AF53Sl_X6M=p)4};A(~Qzi!Z5ho<>vt8 zd(Xlb$_?ze2c0l7lXh6+_Ve(2YW04QnLfG*2(zAkKougj!^fZ?N_+Gyq|Rzf|B9kG z?S87)HSOBcC`-~-TnAfe+D&cX$_;+;21vf;4>&@^O-$56VZ9jo8zfKY8(#u5Qh&Av z%&#|2913cavGWD2AE;T5urn(FBApG!QiOZJCOSbZgMCYLRTf*+8D-h*`4F__Bi83A zl1(bluQ0Y*b&X;NTU1%J6!KHuJ&(j+^;QRw0M&?^0NbWY{fHz;b@&BPf>q8#LG4gw zUV!8-Rr~-{d$%eo2u_|v{X2QcrcG_>7MSFNOX^MPt=B)T|5H98xTnJO;|E@i2=khvZY$ z92V3w)zir^l%rZZ6=1n4z5>R<7pfIrpkAs9Vgc={PH+R|raq8?WSM#%MF&09rU_8@ zRL5a9;Z~?$(Mo%tI>ZWUzj^@mQVOWM;)*jUZ<#kISb}p^+MVfrm1H; zf=XBKrA_gDweNH!8R|t-p#D%j?+%h|wTB0q;E_812&gCO86%y@4WNh3c0rp_tbo%_3BDZ zj3*RUX`cO!I(Tco;;@lht=Wq2i(9L~sSv}h(Z@uR4GiZQh7;R0L33emhh~=qcXw(c@EUU=npwVJ z?$K1a1n2i@=1^E~zec?Y3I{b0#=ycMjn)a&5zVX`06VIwLy?T*nsr^E7pl4F2<8dR zBptf{q~^p|C`4$EO@S|`HL^3nA~nn@s7GmH`l8b3G<};xBwF)?c7^9PL0Hyvv6{mP zP>9p?F~Nz8n(>X1T-JhnzUgsbY0`s3>CYnS=$pLw=`ED0xUr@^;e)I zY7%`RlC1fI!k4!-%O22cqe-H9BUST9Z%}EPNxPtTPZL9t()$`y9+C%|D_5cZP&20n zz%n&Cv@?99`3ZL^xW}5cN0B_$Oc;o=XBz%KEaYg~35$apHsYzh^bG2sxI*<#A z0CO9sIROW^b5n8H#07INoFKB3yF)>MUEJUdSP#L%3<`U=6jIpFEy2+>cYt%O3&}&= z>?4po%(Z-uvZI`lR`UFex*brD;a|7^`&*ThxQol z!acROx5R&Drohy-YlP^c|X>-P+16SNaMgG$tfFGG!PYnSAMx})8VA5C$o z+F>1$+|{xtAbC%Fke2A_+T|l4`9S-y1*iCR8mLVX!OvJ$8xydyD> z@+JmmkMk9#!9pk>6Neg|;ET_qbx-mM&477||2Y#>1pi2e*)x3Depra)*?5$lIHr+9V*4~(zDZ&Z(!&uKWQH-c8%Xk!{`lu z$Ve#McfPv&#z9lXPr>53$UpYILmyZj$5P`@<(l!zpq z-%}GP_jxO=;xhOET+8Gh@;Rdcmc_4{4zt<(AS0Mh_@`l@p7Kjh0wsrke;ew#{AY?% zz2rTIfcc7_*aDIT{1!S+c*9?7j--e`LV=xk{FMF>`N*%P+2RwQiy#K~h5wyC`>%Z8 znGkUmwz|Lx3=z3i}8Zyr8~8Sa2K)8-;*aB%1|CFSz6@ggk>@tdQ|5Brgcp`ysg`T-^cY zW#I!wU9SmW{z4;P7xuq~p_{^FESR`k!pJ9ZB0(7aH<*dS{9XV{7Tjs)cUuST34vD8|u%6 zV_gBABTS=_FHh)PfU3L@PNqQQm9TOE^j-^fsC5g3p#zb;5nRpix=<)x4oy%b?CAsM z2jTEmYI1>}27ARq9EJTp3rkxA?3>VYDH2yPbO^K zQj85n9af3^C_?EiZmtRot3@vkRaq+^KFI>&2;SKy46v?FGta@zh!{eZ{7? zVAfCEeG=4GF~1Yk1I1%BU2hXJaQ4jwi^W+G*&$Yc2x^x&^DwHpTbxAekUe5Hg<1EC zRfAEsUwoy3*#jao7_~hl_MsKoVX=BEBuB*nGoX)&2WhAb6Q6a06DP!K69FAA4tRs) zlsInzs*)mJy#mZMk*6Wyp4c2W=D7Rf$aJ7Q5WNP$>_c(vD1c>(o(;f!B-ZE;vya7l zaq#-7Sj!8{XX2nyz|0ZP#6uxhyxkRGFU5~-Ao5Dw8U?CA^f(0SjmX}Ig+eiJ2$CYP zV=&6zi}5dq9^;#CT2yGbXvLcv`cb{}9KlGTc` z<#Cc}d0eetJs_-$7)JlwB$?QN~Clj zXZT!{bO_-I?wqumqRY{e|1RjAmo!^pC{_yc1z4Pv*8vI_rL#_uyeuWqrQ$16?@y@v zHR&{kRIW>@V?f=KhS63oUOGDi3Q5w>WG`9zumJAfks|3lBSjk59ER>nuWF(L(xlvv zP)L{lrW3aNlE-U^Je2slpfaTv*HD%%wQq;yku>}*^qxq=XyNiya+iSlToNaPnIlaP zg`auStve`tAuUEontLU6AB6^aE&cfizzQVK%P4yz&7d$zp%jJd=UkDr2ccx{gH+2G z$ww(_4C-Di6?_2ZXX!T)l3%5l3ZTD9t;&JvCI>u&S$BDHH8}4tZ>3#GfINiWf^Bls zxey7Gs~15bSPpLwCw9np>F8mXypNWXyX8E8DD07MnLzE8@1KFletB;*H0uF5m$n0k z=`a{0-MHxoCOiAV|i@D%z{X%EDNbU64P}0na7bDFN+rSw43R)K&R6S3qBr zy<~WOLylMv>ZbhmAgFkG53NxWWTzAGGf57rfFxN~D0Xv4ULOqg6j`T*$X&VYMo?+; zirUaimv7T)#C>@-9WZ9dttdSFP|lzoUzU958Jy3Sr8UrdERPF@XHVpBbS(c&{)^tM z=W=N}y2zDx(z$4!JmWEvFY<{409&qfo`7V7vYM8Y8Yd2g9QohkPce}EOd6SDl9Yw6ppq3W%?P)Zvb6BLqx=zzBt^-m9G?t%u|-NfWiyqb25^bipAr548@y;YV`;OZBe7G z8vfRFJBPa0I&d8M+6`vFp*pdBQCio5Lbvrk#Q^T7fH-*QFySVuS$}3fa2lMsiqfBB zsc9R|#F-4&D7F^dX#AFzEKP#afZ4PH`OxgI-q33PVLIenOuhx{EvuGAzLj@0o~?uY zfYzoMVNYuIyLk@&Oz9U-=zy*CetyV*@!!Q9W*rT#+z<#kD1 zdo#c50>pgz=zB1^h0msSgCDWtX{ur%3g7`H- z0Nl>ErBGln??JJy9ee@>gLd-k^U)|F{I9fO-oyJXL`C-V4```&fba4OA_w`~RQE%C zz4<^n%GaC+kz@SK<1l-iZ+in}p?v6Yl!fuDIwCp2AD;m0C;8#CVJMuRQ3V!G@jC@1 z5&RiCIXTVu;-P+qKRFxBNZygcr%`+X59qUeem?Zh@qe8{Yee(OOP~;hjBd5^xZm&CU^0KH`X58UD6Zu1lI10Ae#n@)tiRK79= zTJQ1;U!yFIkD_D6dwgyaprrHf>Dt46zSsn?2Ymh{P#OGex~cMz5BMF-O#T^d^RsyG zFfg&^q5hVSIfJr7e#K*`7x6xHP3Rpzkj~oQ z^RpYn-Uogc?TS9~PqrZW#8-NXRx0LS(+2M|UttdPzVHLOpzJH(iB5#S@oQhgtgCQ+ zClWVdKAkVQ3mqtazf6eg3@1E=pI#wZC3sq3-Ag#o9QM2g-EJ^f3pG1I(npw(g=B+p zFcir~VW$WSn}xy)NPGnyT`Srmc%Da@pYSmn$yOnQs_8GBdjl#!@SFkbfkJ;;9d8rl zkD!8tm^@h6E=<>h3KrC~P24GXQ;=boF#RQ{-9oDbSU4oCn}y`Czy`vzBZ7MuC>#}T zy+T!v2|H;JJTAnyMq`BvSzjR%CfscYloLYKMU5R()F51;mTh~qJ&ZSp$T_Zs87vvPN?VyuxP=Twh}Qy)Eo5XdBIQyNvzN? z2h0n?@hYfToREAReqIz*Zos@G{6*pY%Yus58&`x8Z2@*wSeXvJYr^x}z`QOr+lM;b z5T@J*byJu{qtGqkE@8$Cvp1kDL3lD4U`fL7bZ(w3Fv9_MTX21fvOB_)N>E4<7G%Rv zs^C}&B6o#*-|+6H37skAcTf2C1ZLBPhqSi4FVt=e=m)|QS`c9?oCt-7!e6aX=}h4W zet^Mc2@X`hY{79A)E^1f@<<*Fdk4VK6QL4*B#2$g^^XvFCS>&j*mEHZzp%k(C6h*t zTp?Qzg*@R61&Lk=UFnYAOMzPg<|`qd`u(*~ZZq7?7XrOuy+BxA1`fUvM(+paTjAw- zpcD$VyFGLc~7t%|2ir6o-|Ap+jPSy3uo397_S?BjPa{6_1LO+C%-AxaBhRj*G*lBMB8f z*FYgm45m}D6JjyVmM6t7wD}7c&!m8PN*p{1RD_tZ4(g}HZM6Y*MjXEeNu=mTUwD+5 zbQ5LK;^xyxV#K-2;mdjPHch&*qMAO73!=IXyp9vU(r|cDT;~VqOJX*yT`!CI)F4;H z-0NUo6)IhU9fIo~}aP5No%B`b|(MyCqJU0+-^&;3G&9#4-4t6PGCV9SxKu z(L$3(vUvY2ByWqO2O_y6_Iw7B6!8Gf;;Evy1m<0_2@REL;$M%UcTWtan=a{M5Plkk zomM;@7(Wn4%z$2o_!Hd$c__xU0+lI_qDX3%cp?%GW{bbl{e?&3lf{63ECx~B_=(u< z29l?uhE8CgiFGK_|6Gh}ir&l-D|d!uu4tg+?>zAdMPy!x0e^z|QY^O#HF_mZqiVhu zeP~INFPff0vOshm3hIq`i?)|V;#vyKyc7G-!17*<`vj2>;@kny`zW3Y2g)aLJ1x12 z#VYhFeikd!BI}FT;5DePq7$8fd=po7hMueBL$}l1qyYj%+@+es;rue`?s_miBzz2UMa~AP*^2Zod^*xX>5D6ptqD+3r?(-il(4!jZ{1yU~8qd zsnA;|wH^(okF*`XrNlmOIo%xCAZhlXc{WPb4uQEzI`j=@H%rIEk@!kj!DHB#N-qYA zpLG8qB)3Wj$HBV4v@HQ<1Ef9$zzme!k3xN$bl4kZK~jo8>}{8}Uw}febo>(3cSzaO z&{#XA&2+f8OL{#MlDnl^Q4rZHg=~SLebSN;lHJq?u>&Ic7HsjkAp2`RrTP)KK6%Iy9yJ?{xB~=~*ug^-Zoj{$FjHQ7YEt%=#ijf@0 zLGQd2m;owQn%o|G7o_d+@H0+oWQ2u_lJPUBOHzgYaPYD;pa;~iNGs@;&{fHmwu0BB zPnDp4U7EcR3OA&ki-CDldVK?4-;#F5fEh1E#z8Vca-lmpiIOL6ijySGpTJC(M$zW) zwzQfe#do9vibbbLUMpZBRq7H7m+ne$HBe8JoKM4-ds69RV5UnAe}RSj(gLj8u?_xq z3T2s+GsWSvq|Iy5O4(8>oh3h#(ndk@v2?Q>3_X$B(s{^J>A^)9dL~ucgygw&Mh|9= zG`|w`a;4Z_VCG4g8Ax78x$S}SQYu4l>nll2hA*$BNwl%ZmqPKYFl?B8*F)rubl4AN zZ>7<6$+b}G=7u^HNd+EYzLWfE1@T^LOO5qG+C`Y>j+vKA3Ce8gyE*P98>4c^^4s zHp zQEBjv3$ zltjrx?gQ+s9Kk~JoP3aC^wDym5nwSg8w}=oIV=v=W91HKkz9}+A|MhcFWd#pi}LEj zK)EFErNfoW@-T||T#@TiZ2zh(g+bw(yyXm%>+QL7?1~4|hVl zq{&f7pm0xaH4E0$<@z09=)UYn!{`G!o5u1CxqwF6hccT9uuR#BzN0L;)e?X`mb+3^ z_lexHCz7XfDRS_c+~z3W^5?S8SfJ#{_>~U62icQO_VVO4wB30j`?ZJ2OZh!D{-ck=a#P#iiw(tVi{Pt&J|5>OrXmMcya3iVVXXaZZI^!*#^E0qyzQMO8X-vADJDNHaFyp_J> z(rP6l50Yz?4Z$c|t1PEL&^l!R-2m`W&QSbtz4DMkR2!5%BcQNRc}y`1Uqz#Z-WH{M z1u*@Tb<{^&6@?Cq{guDyJTgGJ(heel%2_(S+os%^j5-7<-D!8eUD=>OBv|=McN2Cf zasIHrQ>ncOW_KyWDB`qR(JzHUh_X)yYLBv+A_99A7rLjjPl*mjvR}E|5oQl4?gxQ# zP|5fW%tK0SRVW-*vPIPWh>}XJdsNx(4zOd2C(Rbem99ou4^oC>XOEN?bj|#+a?TI#K2g#xLj9?-f_@kE zOo^mhkP#0zIloj+DepE(BfcZ(;a1wgON;TR)d{xr_hG*ZDD|86ts{4)3$d>8qOoBZR z-K1DZF4xtgLBLbDl?JO7y6Uq~>6N-}wCwfP)u%3AtxKE)lr_3kx+b$$*INri>vSKQ zLc~W`RfZGmb?YcLyg~PC45*DdBYo4GbiMAv>}H+tJ1AeBVFMJl=q6PL(@$641z=ls zWA*4be_b@)NDt7t*FssKZuTmmY}1`Df?kmBJO!_}>w5nT^lliBt$oG7Lq->vvhN5uWr5{)c5J0TtcPy>w5M@azN)wH_;F3wx5K^ zA>F1#h#b~kp{>vn-PB|-kLo;!0{WQlJWV#ob#AnI4b|yaLoZBMn$B%b=uZ6s>ZI;# zS?Go9hIa$>Dc$e2;9!K#fg(Job)gh)IHTJ-AL^01bN3+`rMuVzWoLB-E>Jk9bM1_> zXq`75EXC-qJ_qInT{jBD#OX%SNPAH?eje;y(WTMtsjIpf#-AcMjc~95uI@Hs3SrnPRuglXQd7xu^z)*%RoDP8=>UL@1 zOQx>Y3{)&jxBD(EWb1}C0p=rJS}Q0#)-C9W<^x>!0?d##((1k8Nhr!kN$(A{qfuM2g08U%`T_mg4htL_`! z1N^4@bpZ5S^&5%lrXNZ(m%F|;#S)h3@6!>fhkh_!Mp>?RpaV=#{R9h~U!h-0!RwX! z@HKE^l|HT<^t|+W0TA)l-(L!9wLXsa;cN8cS3_j2{sR5}VV!=~bCmh$-_fsH*6Wv2 z*mZ-xsRJx*)Q_Xn^G*7-6j$A>H_=$x#JHUzU`uQp_gY{nc8?M|AeP`mSnXu@HSd znuPc0C&U7Cuim>k^!Diw{tkQl^%X{<0}kj9zJw%y1HMG*uYX1JoYhyN4Zt~lMMwA&t*=6ZYK*=sZLiMj*U+LSRv$wr3m5b) z8pDY=ebauRF6xthhJ{P|WQw9**0-ZM?utH?jx4Y0pVPhWYx?SR$aP(xK@ox*`a}ta zZt7bdhx#r3&Zbb0*RQJs2NU!>-MLKE5A{Kkq_0HXn5=jC4eGb`gCByrqc58P3n}`e zo1mVmUram2yZY8vj9F>=;QA=Lryq0-^-I^!=m~}U`s(zPn+N*Szk`{f-$Vy|5B05f z!d|BSek=HyrT5XnrELAT(=hZ%ALIc)AM3-qg84-MeiN8a^zdH_zm&@aja*h@V_XNRx!>;dS#)_12Lw&m+j(~hq||B3>_Z}2C*zPwToBK=F;=H}k%kJE1VgWjACdmr^T8bRcfKBYetiuFk~p#E83#uwBV{od0^ zzUrS-0P~xEM<0~A8uEUIx|?Apor1U<#!%1fT2BIZ3r}cYYUNWhBdE& z5@fiY29fQChO{=_Y4Dx|8miHu?>Tu3*>Iy`n4g08-Vhnd{fjV!9*bWP^hLv?-_JYCK9A$9^HLc_>8a%9E zUNX$2HQ!~!;B%m^7#h&4an;cBDy&~K4DtlZbwizT@a%@&rFg?L8bcBcf%qvtmuNUm z<8_i@-E0_2Hl)$g@3tYX6;SRNw$Sy`6hl>tv7{P?cZP*D!(;qrfxBn8T^Y=D!(bXQ z?;E<(UF8RcB8szT7`$mOlWAy9_hz#Um8es*4cQdKePrnTGxQ!Crs+XFG5kVTcAgt1 zWx>xJLwF}Rk!$!k5X?M7Tyu!LFg);pOD_%2`k}F28B%&c{k0){Fp_-3SsI}W3=^H< z=Np4gfxWi|hqq8DG&H1zZjoVTX;AMB+CGqcZ`ea~zz0LxVL*R0B-0V%CqvA0locCt zN$;~^GaZJ1F`WDf>R%0BZ;^a6#4SVOYV1uvYj-oQqd2>}vEgU9w8EHI8@{YG#^=EL zDr5WiV0sx_G=PY=vA8!%LW5YfPp?vvtPGeL(pbYm>ry<3#~Yu))~A zHuN?c>pnu+Cga-|klbv1L<Q02@3wkmJ5&s80XUZGtjuk2!(CNue5>) zGIlQmu7~J|G2SnL$q0_aT48s4KrqkLg9pQ8LbCT z8ijLE2sb|K07IvYH7JA_VVp?kRi}-o55e9UV|o=xMjBUs0yE0!fWIHXMH_#oo8>V^ zzo%&O^TuiOVIkIda6S|+7?;yv6=&Qb!HJ8;Kk2mPlF_{;%w9I$ON8VVqX(@~t{O9G zY`tbIJPOaQ8-rRRxnbNj5sn1a;f^fsRY= z7{@Jw*%V{+WI(4HONFECt}#&u$#mly>c;!V3v>YVz<6{lz%qB<>iScZ8KtDB3N<)%ktTqM;xyBREA(Cf2LC2gg zj4#_m{iX38wcsn`%B@IV8wENP%s1X?gc=nX=h5G7cw;JxuL30eZQq7e%F4nr2gQbCt=X9w;wU3SHUpHcgHO*lN?p zCaC)wlbi@@tto{j?{%iZePF@Iv?L7FMw39V=_b>>Wf0kHnoibzO-E@;-eQW~4yK=J z5v}#NnsVtTslO?!Es_A!E?T$*n(9+DbeqYX24;}y=Z2tmn1&w!^iGrGNjSgD^oE6l zyG?C$PzW)7qs!2HOw$w55_?V0I)J&)wDbY|+;8%D0rdl>yFRdf(DXGJo*gpX%!J5M zQ*v#T9Wza#_w%^v3I$g}O_g4uEX?Ho2Gj{tA#J@*npRLFhnsHD;_H;D0^LH0Fo`r= zoHlK#i6%c|dPU2Tv!*2adk5!C?@ECgZStfECC2o?A5}STdiEY7v8E1tVBvyk7Hu)& zOr71~(nV7_x?*|7)NM1$u9|K;q3oI|iH`HGnnbSweByf+Q20)-EzO*GtpG?k^BJD*JXEXux^ zR?|Jmucpbgclu@;LZgPOxm9b3xS8WaK)IVcHHOGC^BY>XdYHG+h4tm;g|rv-G>6im z^$K&J*RZ$J-0K<)d7G!%j-t)Ef5YAy^B-$b>9yv>6)0P0ju;MTA9J@dP*`ua(wbp| zxi7^rH=3(Zr*1NT9*P=mHn+lWg*jhyoxk9Ozq#5(s0Wy<)2=Sie2)Uq+stWn+!bWL zz7&|-%_^$qPIJx4=#E`xnL?Jk&5LOV9b%qc481+(<}{w|HHY5;bDue`6RNV`Y@k2b zaKQYQj@l2JPtpSNkh#>~5IJm4qEF_CdCX!sanu|}gTOI!7=;&)n=2MTFVx&87not@ z4YWi(VSe2h3Mb8pk3of-6KM)LWo|~x!U%JIE|Sw`ce;dh#+;H2y-4%*6ktY~D^R%o ztoa0;1D!K-w497K%U7WgW6q#U#^=q}Kj2xc`3XhOFPIH9MaG$5j)VF|^HN$JUNU=| zp?=vM)*A{}%sXD9Mpw;#Lr`|j+%XDXUpGJWL8Wh)qZS~!X%3+u#@#Znq77BN8Gru@ zpM^Qx70g6)FZ^{?F3CJ}HVh@3w+;ez+nho_ce`V*zY}#xG5eTN%~Z2`E}-w4qecNG z&0K9UpzoP8Y5*+V+;Axr?web@McD(h4~-!iX2;uTrHAI0eSnf_4%`L{S?1KEP{=kL zZLufwbed=%o5xH;*%Px@MOb)h9{sAoA9nK)qRL-ZUDRMdsC? zfceh+tpUp3o3*6y!91Y@sABV*iIDtkj`;)4`o%oU0F)E z*kobLplq`x!3%o67Tk)*gko7>MVX()!4V2uEr%$?=5MJ*15$t`mWP9ZmelTWVw+`i zD@X=evIl|MZmCEYQGzW+bX8)9B{v1sPD^wf__@pSnPQ{6E#-QE8Dg<6f`fZ3)l#6o z*Ah&a`z+OH{kh*Vc^{YuP!%W~wDh8Ti1B z0+L8e!564USv=_zJ!@(H3e-8vv5xR8+LCb$U@?|8WwUikQKQCCK=>#>- zGU_k1#6`;$71S?TcB_GT*>W@$>Q^k)E`z#i8AvgRYZliys9(1{FM#?D%bP$@H!X|H z1Lc;bRe5+8Z`r5^N`fU^3$uxqJlcBQwv2fOg*%pubR{pv;z>*QRLfo34c@i9qWfoQ zma{Z@-?NA`kfmD;t)YJ3a>5;EA6PC>Z)RAkt%8MzmX=+BnQ2){cSo`;aj&4BZ8=Oo zRCr|R)EL!#Y)PPtHcu>#=*@a+nYRQA&nz=*gL-ZmGX)|!mXOg9$+h&L1wo!A?k9Nm z!V>%#PQ0}Ap9AWZWC7FKV{n?UB@yIWh%XE?9t0j&8 z*3UP~9@=lZTEm{g2{-G`-$A)si|Jr`nRO-o6=4tS!6cw8w;DrG=4l-mk7R{4JPOQ} zR!909Dyyt>8zS+t{z((9x3ypZL{?i5)6#v7wd;O3zt+01KSb792hn@xV|Ab?_XMObser~n4pty~{HLN`_ z1FQ|ZKqS!G`5mlpvwotmR*b?J<{7KcF6c#CAHPCbl(p(y=$*BiXft`vI+0>X(bfW5amH9@njm@Jda)DKW3Aa# z=?m63lVBmv`jDcw7p=J-K)GZMq0_6&*4n4w%N6T>IxDzp{Xi{v&Dy^yB(GbgQYgD& z^`UV4P3y<{NN!ozH%1a~P33@+V7(jz$wce8u}G4vNh&1C)-qjCcH27oIKb{$-_h0K z6zk74E~Q%Aw}ta5YO)Hvjm~>kEtGP-Z}q7I%r;vE{|b~AE4M~Swpv9|0Hw`p z8Ewqkt(@*bvcu~13Jk2%s*JAbc3B-72d~>IhrS-xV|DUzjOc+?IvvM*trYvabdBUXZ)kQ}vIehqqKR^Ak5 z8n@a?nV$(OdlmE^S=}mtXOmX9srX~cY6oSz#!c4Wq?djWW}R>QcO{luKrck7@q zZ&k?#iZ$aiZ+LCPFh7ExEn_VYl6H&=`msAOQnx|j6l3dp7;jPbrunh9B*4gBfQjMs|g98y~cPB82fbUFi#Duqt6M zj8R94>2Ss;+h8byvF&e2MlzJHXhks^Xmc6OXrKtlRmLC1;9X-p+X@oHc(om!v5bm~ zFcim7(1LWGF-%X#4aQ{(qQ^5Nv|cAL8mYJ?k?~_IB$F6{$>>aGG%_)wn~ax)FqFdR zrMFBfV>}fiX^g&IKuKpjK}X9BM(F@ZCWH6?mA;HOC^wkR5Yx@D9L8V0;N4@YSRv!$Du@&@Zf=EMG2@3baH)imx&vO{X7p09xRhag z5bAdrIua>kq!vPH)kzZq8S{Sz~ zfZ58h-GR%q-0fqOQQ)PY z@r(JqVvNbV}^cGLyRSKEE{I5pBD0M4bm+}74($TiJmXtBZ(1`S z=E8X!=I=>Ruw_0;Q((v3N81W}=3X|yPB0()0w^b$jZ|CV!2E!U=T0%#UWbE@%sUj< zKh1pK0b_S!GLq18X5R6@7|t-wl&L?8Rk!T&zUPjd|x?NV+p^ zF2afP%t;;Wc`zNGgJ+)1uWrMv7jumUQ*eP1w{}~FGn3p2q zyf2gWA~5}!tyG@i&n)YL*#KtpMTi74e-^>QWo8GJW&|-e(7Pj;*>DUZSC}ajX9!`c zZ=o}k`DP!W!QQ)@w}HFc^wq z8lMJIY(fbOed;L&0_v=7GT-Twi1ZsFgMcG znOn?ps_x5W_P+v`@|d3mK_Q>%<`0nqrtV*K7BgR&fJg~*lFqQVnU8gYSIV5EmFN!h zyA>d1OauMJ%9;0RCw`Y{LkI8*rj}BfmCR560;ytlap6QYvzM-%)-d%H1gd57TA)|Q z^r5(LJ@XkeS`AFb8O%!~b1l6vo0wmHgVsH!@EAnyGi{GRy_vZq43pKub+^`Q8jX>t@ys0j!5P_#L1hF!zT8te4qChpj&5 zA70?~GaK{Z*#J}O2MZ6Gk9`8YLFS7OfHK6~^F3x_m}!*_-UxH=d6*q#e!dI}W6ZsD zU>s-m{0ETPpfJyT zNOc$1tS_n3!iIHz7KUtD1-($PW1UiCdhA&Pr7(Mf^%O1lCs{&TH5^!nU%?novBXq7 z=g4|{4SYGx3L>waSkJxyXlGUv)sCED9pM7{EGv%*L+4n%bkE&|6-*f%SJs8&;JL9H z=%C`x+BymA=UKUw)9_$@YXzPstMpgc^J3|(p>ToqUI7ewvwrM_Ss&KspU}F<+8z&u zORTk2P2tP>^C#%}u?`#s@n@~0Q%?ZPp$7_qtQsm_z07*;DHsZ3U8HSVFlz}NJFl?R zBj^laZFvs%LRpSeXoa!t&9D&8`gjx6BUtuygDsl1g)VPgWv!>A{5956dg5YOk8wa^ zS*2808OQp7ifpg5Y^jp#2FpUF&+)9sXk|}eeQ5$oWW~{UJCazDbgwCy6-XCQZ?e|Y z&Oe1!%!hg^tE(Os(pYb=!XF@=6?z#YgJq=wFOzk&4k%fy&*>&oHj71<$8uOhw6@-2 zxnF_1xvcBnAbBkRJSgO|_R-kRqmWg061*bTW(r6Zvo5>zvCfBKvf5dfH>0zIm6ZqwJ6U_`pwPt{coQPstQ`7UQ4cFO7xo^o z6fc1EvRSP zqpS_-urS6F(_%Hwime52g5~oY$RpN=Rp3ps=KsVnr&wz#oj%PB`+Oe;$gJ<^a5CarWu+0mAa+1A~GT;vE zasw=!Vn=?0Idf#Iz6I|z`_X17II)-0wLNF{G8SAq$4)(gmJ2(c5|pm&Off9DvE?mL zcW1j$-P(Ef7j(AwU`uG5?a4k$zX>n)uS2R{O|AA2hu4*c1FQP3%X{mL#_2xRkqfyiZc=V4d~Vt+%AZ!r4-Z9uNDNAu7M zVRya+$xwEx5Q7e5r+yE6;cO0VQ6t#X^U#ZAXG$^XDE2{GTcg=4Il#QiE{z4b#(qo) zvoY-DOTdd|_meMiY>)F$zs`Pr3Wjd5^|>$<&vv;4lE8lF74Q<-RrE1|B=$3Orc7o> z?t`J5>~jJrq_BB5KuKl4L5o!y`%4{o>Ff{bK$XEBp;%WYn@Q_Z7JK+KB(vFzt)Z90 z-bgj2x7aR8n5A5{_eu;UkKI8f7WwS#-Egpg{Ribt3)yqW!7E~aPr?3TcKjZY683GX zfxOLD{RUFXe(VJpy2HLhCx$Y%j|7Iw*}uFGa+lo_4MP>|_v_(cB|H6ZSg2y3(t}sc zK63%%t6^8r5wVs%Lg}tLwq-j|>e*K&V7-AIeiNOI?B&Zqn%GXk0K3P&LZiLU{*AUx z&FqQ}@LJe6C_>)Ke(7oO+Svb6MPxgBWiWUh?2=IEb+U^*VW^9pN7p>N*~y=S^stj? zb$h^mm0nA|?Aj2Z^s$9+LZP3%H5On4>_H5K^Vb0VGw$_dV=`Ix$s93}m195^qhf}G+c zzKPK~a`L+2?rBcZLRfd==s4gxbGFc#`3z@!2FO{C%pLa5adzE=qzmT|y_sD(Ptqdi z#<@b#S9i`0n#l7UBW?LTI5k>0;mPq{1b4kSAJMhv3mj<o+);pNFA%&T5K=CU7Ds9h=C>J%gD@ z;=KL@{*1{S4_d5la>oAxN#Tq~!KGBrPyi&;IA2lOcRHtzZdhb+`m$j!lOsL>%q-4A z+A?NyCTPLU;VfT()-4WmKitjbl*D2N^EhX_ftk-K>xX&)$EO9nLXPtwT1A{c9)MTO zIb8};!ijzX3b#3x!7y9Od8-tL?r^NB0I-a+`3tyI!D$WzspNcIfhnlsZ1@Hu)tukP z;Y$t2na;PhoF*#espD*;=e?eD{9|A?aJ2Uz*~n?5m8gjmK8lIF$MH-7xzEXLfkHE< z;B`p0a89m(NGsZEM7lW*6iDvjd`g8` z4><8-Fx$%+P6k*X$9w^!?dQC(2(1CmYqWoP$jPUJ*dXUzHYA5QKXn6an4>s^2^rxu zQi^Gm^95C5jB(yQ425yd2XwBQ;FPAp!Xr-4*C3OePbdL9#d&uQ(9@h7weV$zQ`HYL z%W;r_%yAUdInU`n3u4WEmR^`P+%UQWV9WjUTNtwAZdwB8?YZC90rLd+8!B5o$$gKC zCLOpp*1^wH+^J@WIC94+gm{{Jo95Grd*NU3oVk0{7~dK0(j6GXS#HH^Xr1F8rx>RT z_j|f^>dMv7vD%G0N|}0ht_xk0KhOP*j@2IA7I%!^wt!%y)7cQI`iyt$vh zjPdz!%jh$<7rAPxb-2V$8Ul(hmuZ56AGi1_?D=zdR01r3%j82cko(LHU|!}v*Z`3r zZv6is63lI;knNHG2<{1by+m@&??5k#d(jQ8 zXs!dL%&&4c(AQM1ak-Ruh~XXxhe#~9l+tT)+};Sd8_#X-#P2hKYoPsnBG<1Jtt9R@ zMesVAJG=rjc$53R0#2lGr@w+oD);?S@Y1-)=?9k1T}6*!2G@KMtxT@PUFq8+ z+1$6wVK0Zf{4`p(xE4yRUQtU?}ljy~s}&-JHGTLHI#VpfIRm|2h_?!#!1Vs7C= z_)@~%LKS?sxmkU7 z;yz8s>T0e_0wim=Z&MVYmYYvC&vo3@chRcnhG)a;2Cn95v>LfN)&OhbKB6y6+~ek! z0P{XKEFTKZ+>{l7ZsD%`7ra)kgFm3#xW_0_)z1CnJy_`AuB8M*CpTp^cwO8BBhc&S zPCkQH4>ybwRS&o&6vOT19;FvUAGbafnEhP0Hjn}C6Q4ohAvZPig_lKUHFz^AwZs-BwW zeoPO-40j|M7G}Ax&~9yxyKFUD^IVr=h*7aRv_Z1bPI`U5LMC&wfK@?D&cun+431{BF6j?aKTN?+= zvpoGyjNu&5^%ShT@cb!W=gNDr019rr$4X$&o##)h#(7@)Uby7N+mr^83%qL-qxR-~ zPMZZEo+DK^T;v@)1+YuJA1S!v%NzIzdVaj?lwtJec~cQw0Ixd$&Ij`TS_5}4^W-e( z1@V-_Fci$IrnCJOo~Jt`LwJ*`U@w%nPym!L-V`0+!g(*zsV9P0L=S8v&#M|JQM~65 z!d^5lpJG;5c@sGx*LaUnZD?4kc`j?A5XTFkTQJvo33N~61}~Yu(-Y6z;EK^E z@Q%~cmB_pF6nIIztPCh5^CFqBev|h`0(?o~_0s_^l~*|jUK;P#0eGFx+euTN!E5ja zN+wT8$LcIz#yFs}c?@4*=I{a^g52W0cMiVf@;-SI7V>y|H$pO>xAHbf0ndvfiG@7g zdWaP9TIly#%u9U&k|jJ}igDiN_0e&zly`6$pzrWLqrXZS?=bCm%XwuBK<@Hhr!U%7 z@B(O&tK@Z21w$22PRHtM-Xazptl@2?>`pE3x$|(Tj#ojYU-i8F7h$M@ca%yj8hPRL zXgBemrMKukp3k2!d!Oe^Nswlq=nODhcx&mL+R8isCq&wKAJSW`owueJU>&@}%c0Q8 z+iVT6F5cB>h;;KFeh6LPd7?@g7eAndUt= z3$PiU$9;G`%VU2IC+2t@y7xKH6Vmcz&3|txL~Qt9?uT_-zSTao?D#cFFl*2Mq8cJ6 z_>qy;%N(AhhE6A5k(2|L=zCCvNZy zDna7;pHTuYf$wx2twjFd8bBxUuh8w8WWJF;?{t$t+7BmE_*WZXJ(a(QuGgjU?au=` zoo}F%a0b7l6Rk|XfsWN#{2xnUFPlFx1j!t}*AlpNi=QzKlFPqB;gmf7f5kAA&;Ryq z46}g0ss@sU{B?iBY!QEX15k?jtLYOXC43&mg>Uo!vw~hJ{~%>v@9@{`ghCm=U^{r_ zd?BrFcllqxh|UVW@*}ug$zSv{I;;3c_5-Y%A2<%M8vYn<3v2nlV{o^DzoHqPjr?tN zov4Yw;W9e!@s}H*aG$R}2lZyYp&G3gzCG2kwDOhzpw-6z)(d*={9RR0=-|6724*L} z{arZN#lM$;RyV))S&XlTzw8-6Kj7b52GYxawHv%XzBU71_w%2j8&w1RsUBcHI5smN{J`Q`MdvY0tOnR=!G-~dI0;tJR@zzc z_B>F|2z=;wc2*$T0<$>$KLBwN1b>cBS3$QM6x;->>Y?B+*t8g}^Mb<^dG-(t`e0z5 z0#7QB^%88z0=XbKOc^R~ffGfyd<2Q#f?O0h_oMTYK+OfTui)5qwEP6>72x>`_M8I= z5Oi097by6t5?)^x=v-hZNHE|85-cdC==l|ah>pi00&_mBhYBk4p%*52;t7}y7rZ?J zUm^srKMh`_;3Vx)q69gK0E-rETLP4;0+;PjxF&F-wID{|@f}F4Kt^@jaf0;cAaY$` zQwy*gg76MF7%%8~7Sod;h>HR*QE=W4yd(khBamdlYqW>HDM-_SmnJwF4eRNGSjseI z2sTk{CQ}eZiOnp*4~xOe7Obv;WRBqV&Ct6gcx)cla|J02;b)$pmG&C>f}bfAQ6Lzm z-9@3`5DlzI@H+jonqonkHAG4TL0d4Q+XC;ufLSV-69MIpKz0r8mI)p|1if-WS|_}| zEAV{)=n8>>%5EwJDi5@(1aDGxO10n+mDSb=3||ARR!~pw)(O(-zD&Jxv8z~IhDhS&Gvuy%fD!^?Q6!YLqhag)9 z(kb|93VL0FyPshSx&{vQA~AO5JguxW&|tgQqrv8s3+9t1RE)LHZMq`yr{L%o|1Gn!s^v%*$RKB zf*?Dg^~Vsg7cLowp%cRVKOu5bn5qZQLAd5w@JzWgFmDN^*Pxy&bh`xTJfVpet9)U_ zzc5=MG|&y^LSbwNM2duUAHwTm;qm7oQX(7`0_C=F4V9>s3inV*?~br+Hw={tGdLJ+ zx$qzQx!o0>coBLP!m>7yN?{I_X;ld?&^E1F_&F89)dWfsuy0R zWLtx9`EEGTC=B@vdQHM)3eesY3OQ)q7rsj=v}WPMHt4kopP`UYt58}3^)_KD-9Ks< zzDZ%24&iz>L^_2BLm|>7^xFvQ-9qg@5a|)dQBMDX@bPgN>J=8#75P44gAXM8h4oZs zFd&?ztlmT6xHDRV!sx9S^pNm~3@F1wp&5RT2*0LN@~AL}o}4kElM2w|!oMp)CWL-( z0s4_pb{*3?DSVnjWmCevE1^Cu+)GzgW`y?tL+7lpin2R%!m>tqZ6n%4$st?Ot52b2 zC-SFhwHNJJ2J0t8n`R(+QgpZo>JFkbsy{m=dWi~f9YyZ{gQ3%+zI3#lM4!+u)>-r( zmFk`mU3(F{v!ZwDqV_q_R;s>n5w-7wh^y$WZ{eq#=m8UBa2J(@f}9sEngNQ3D1$C< zc#0&n8S)bSI}e2mqL1nE^%gCqShJ7lS^5)S6uq+oD3?Sd6fgG`;fv6CtBD5bLaV>% z^%#sOK=dU2+yX_TbSk(kx=MS@Ad%@c7z!3uz6Y=?qUUHg6C(Pu9%e&D>0>YyCW>r^ zUbtxHC4fbU;`1?-NRhP=B2l7`DZ>~oT16weDmpC&xh6{Z8zM2HZ)n|(6~$AIAxl0+LQVV^7#(}-@04rIZz6w%*5fTW7H z(a9!Fw1?7p>7sFpw`PdGGJ%&VdX4JOvP2wuqi2iUzJu8u(d-<^Em77Hh~$b+(YHSG zL^Yid$rlBrK)pb;j$(j?qI)~wM3KnxB{)$m`htS*B_hfH7e~)A%x?n_|qV`DWb&1^Q)Y>iD;sIWdsGMp9ABa*`K%rOk9G%DdL`S?K(l1(4i7^a_ zULJ#?hoXNem^vt`q>$c_D2wVthDFh4K#z!SybJYF(O*;_GA5EzPIz48aS9?6qUD*; zdn6Kgp>tC7(r(zB5)J3U>uJ$z5%}BAi0;yeWoT=ECNT*ZG=c*;$@Qw|5+#r0G&eO~-K zq2zMEv+pxD+aGc@h@F z#5?Jk4i~SZy?%r^mc9ZMDgKoUy(n?v=io()Pk)WpRdIt5Pw_SJ7j$beMm$GlBC%pe z4m#t+f7bx>y7+yHF5eI@dIk34#sA!cNP^hg9flIcX4--$iR&`ZnJf;Y$LXdxl?#$0 z9=id|RB;-eG}6TJv}~t~7t&BN#Pw8zl_};^@+(UmNYzZ)Vjkt~bH!72P|p+3Cqq47 z97**d1>#p|-7OTa{13b$@dQ0;#p1OTTPqR&o(A4+amf!LrD7(P%iR(GKo>O1#PU>N zmWw~5ZSP%i8bxg@#7rtMt`vVQ#)zuK2kD4kEgrGJi5l@HI!xAzZ&Q$@PFyKPt6n@5 z3|@oyd&-kEikXpsZW1r1pbw0qb4jIywM!i~H#EMvwT=D0mOVBXmyf74JWSR-f2|o}+$oVl2pj zc)tMTp?F{)Mms3JPJg%|@vHx#H7x#^jvpi98&SX<71x^J(wO)c%5#m2?;Lgy=OqmK z@PvotXNrw_N{+XHcuDptG1?1~O1ie@Ey-F43qF$H<=|bETs?!yx+MAUb=dQjq=mqc zpJexDfcZ;y(}5#E(*81>2$W3y4)x2Dwjo#ul2lED1WTItz@<>hxlpviBx<^p6fSwr z7o8E3xmkckO1RGeEK1TzTYzXu_%?`KmCU{Yv)3dxYK$R9vYm2@v67(2U?EP@L%D+M zl5a<0_J(AJ;zaS1pXjWeAUR37kVMI%V{kr6Vpj{4WXWC!K;M)sz5G>|Ka~RY*oRfmbP68UnLblEV~}tCsi<0=h=hxd*LU$z7^us*||H z!BD;Alnm}RNZxb?X_UnD0jx=~^c|?*lbomJ{=Q`MP4Jo}Y-{jZB&%sF)+&job+Aox zfO53$lH~uv!48Qr7cO;5zM$h=m&A#pz1@=3IPiKTa@rR>kgQ0A*}Sv$le{(qg>lIn zpTORPMEw}ZBS|P-HlLJa{tYrENxBBGX^Aodp3O+!{0XgD$t%CWmpRFf+psV%S^o?4 ztfk8&7>bSb$vlYIN>{q0(@y#;eJsab`u+m&PDr2e!B9?01+?>Ul={-P;mq2($4HX5FJNw-Ym4}L*<>pOq;~6J-B)^iA3FV{ zJ=Y-VFa608_5!4f+d%@QNtDsNEIpbF3qjJXG7KeH`YkQuSET>a>oY{U?R~UDrJL!< z9VY#?3ku=V`9km_q%ztGL`s)Yz&lF%=24i9mby?G#Z@Wq7m#bxAEF`77U6&qShSm+~V_yR^UOMfKR)SPbi&dhultKeZ(yzaQdb0FQdQxvn_fVZ< ziu5pj!XZ^!Ld#Q{H2F3<)1_K^qi0A%X|tXwO{)cFmehk5&TMJ20CScjRW}3kmQ-(q zdam>f`a$POMGLT=6%wS?nvh)Fk2?Qxdu~LF0E>Xy}Qz%wg9?9s-b;rrS$X?pj1icwqPjL(wh`-t&z@9 zSgTgLuo9Sc(lc~0s+U?hf;31o8X(dreRv99H%VWjUCBM^ty{pnFWo^kJk8RdDdgND z?ac*dtMn;XfVD|C{tmr%sV`N3cSyIOn&pmVR&?_C};-RB8bx267?YlT6JX=g zGqmJQNEP(NJ(3=y`J9waHvw}>>h~e6PfPnkpfDqS-VR{1(k2y9=A=75gP-%#?_LGZ zT9#&qNw$&YI$*MFWw+mgx}B`38D{Ne^>nB|A^Ybtcqe7$bj!d&=JYH?PRTN9Eq9a+ zeg#9PWu9*X(@D1X6fm7-=PBZOMkc)lduL^`58&WA*%ZD1Tx7Qkq3$ZXMFBoHSs7iS zbC=ED0N8n13FX{8WWT3?=P9e9_okPuZW`o*te?VK-m+gQ)Z!!Clng@`WzH*L=#s3N zLZrU3q`%SflYK~wmA`BO<%9!d-bUC9lwE%Ut;;g`J{Ss;MV7-tuRd9tk^qcdN2ZV#L&kS)uDUZHH~YcNzKo1I1LwrrI<43)}$ zqiDq)S=_g9sZ3V=0D9#zm-|4uE4$DLQXxD1J3OnDrF%iIN~WO~X0=TJFTiSK(YN4P zt!yLh`RZg}?gFWoh0~d&L1uml>W#8@7vb01Bzy2K^zO<0DD-h(cAKJp&9X11;Y5q< zmMbi@%4Y7tmp0i#4fNV&*f`=DligE5uTxe{r6*mo6Gx%mEsLkue2=Wi8F~+7?UbPG zl?f;j*C+djE&}z-7WDyTK$f2X-b2|tQm7Bg4#z`eNOtBRM22O>lz1PJ71E+JDqBeP zZey~IY>14@v~-M^khM@E;E}Al2O^WQW-6MTlI^0!YFak&IVNjH_BXwjW@TT}O`bU! zhtjI^vV<7uS<73d;k=Dpc@mwr^1>0I*vVxV0BtXyItRTI^2aGmcvAl0AzBXdpjn`t zl0W zo^Eo*I9l#GY|Q0D-6?9zK{ymyyTnye;+9yqb0~&oxb7x@|El1OR>C~uHux)V<#bb zTfX~wv`Xch=!||xeu|QNWpWWk&&%bz?J&N(@`ttW(W%REQ{++olD#6a4VWhs($8Vxq@wsk z5C_GrO7Ko83aFORQISu-v(t)CsB+p#QBUV1XN9i>C}$Ke-2*wRn5Unxs{-GH#WSXO z>l1k9u88u4_4A6Bb`TH6+!Q1|70=Rn(@XK|9+R17bH zy-SKE_kroF*h8mQKgABJ`}J3RK$(gFMGozy0u{|vhIU!u9s$W9#bPJ$f)&|fOvn{Q zEmfR_C|;ugL#RSUmEmEE@^_#YuIQj!FcFFgPZ)|+48IM9C`GXooR3y4rd;w>#gBBk z=$hix3h2cso}_w>Sj9m)R>vtyY2$fa;YCl!4MjT5b-bdEl7a~ek53?(sCd#7m`RF; zPti(Nd{PBpZYrAIfx9URJ1PrHRn*eG>oi3J{UgbA#Uo13WGIr&7)qwXi!LH$DMoF; z%T{n{rOi=n{~o+siWliKBDso|_uxdHqKl64`HF%6&{?1mQJ}R@ao}q}7b(iUfKsej z6$W03VvKScw-p}FuwJStdKH~_6pG*AQkjC60hDsZ)++GsDn5N3k`;=bkAqYyHZ_4% zDTX=#R;|$cLa#=#gO-w7#l{Gz*C~XxAoU9Fb?_P#yEg%>Q4#ePz?u{>A7CQyDL$s7 z-hIWfOz1T$66p3tiz4ne#@DJyrSDy|DUyv4X;+N@4!sUVM+xk8D!gdZ)}@H0-)^@e zW&*zSD0Whr`2&SZBNTcSL65;~pMrS^t$xKMy>o zql!}6ql_tb%t2vXai4OZ6N*;)wLVhZqWX|Y#XojXm{LqprQx*V8LI!BQM^yZ|Feo8 z9pTHIqNfJDdBs~4hOt&YwhkgT%Ae?#kF7Ft9xXei-vT&cujIdm)(PeBpQ3eAdF>kP zIVjcfAg7d#(HM%O@*KsiPAmVS1EZ7j>Jw-=D`T!gMGI%Hb-^lAE$C0($Pso2}?Pul!{W46{6*>e2z{b zKFZ~^SY1?pdJ_tllu^kL@l_TI!1GgHqfLgt@?axG0+i?JV`G8JAS#5utgNJ*Mv!tT zUA+rd=DGm$in6}|Bt-cm<!{s2mZa{F)KMJiS6Fuo{dJ)Qre zmHTLKdR4iS{+r%4jY)- zXXs2+K10XqB<0;Zu#l|WFNNMs|4OHnSBpfgqZ-SaS%rd&&}rF5l?QbifcA1HK{ zsmv*adX{pa1zu+>ADoBRIm)ZsFrr&ZC6!p@Dktc&d7g3wZRGQnDRv^0uSB{1bvSriX`~yerOL8ofZb8vJq`6T<@?#NUamYy*EQ}c{ivX% zO1a%1gRWM-W&@EL<#-K9tunY6&etjL(syy{l{uxrY*2=61X!c;6G~w>DGz)I&+aM5 zJz(g*a+=o2W@XPxsJAGW(#OVHm0P=Ep-nkLKdE+Q&MjE)P=-^!xKr6e-=XVLcKE_V zxAFwttLsrNqHFgLluJjz>s1cZNw`m0^A{ZKS59lt8c-hH1l~jCRk|QNsQmOKctc9Y zVn7copYI0rh>}a6pc+-4rbEn_a`TrU$twiD6o+_EBQRMioUBpSG%|$6(e@^>7%N_NuSw zoq9qQPMfxqD%K-_IjCxiA$dymE^U7tRR?G88@opyjSIMS^!;^&h3|JXB9pzR^>qqGPp}YEBAr zLG{yL_=|a~By_pKNA(iLuP>^;TmarB)nqAJzN)i6K=D&Owim=-RZpAX0M!jT4F;-~ zQHlL!)k%sF1gZ8>R4iEaQWr3UYDuzC<0Qh8laiKtJ?M_NQJ79 z2`4I5IROBxQhgZ;k!sbeRFqw#@}x1;sv6qBt5X@ME}>ralnP)Cs&2a4+odxlRcpgRI#f*hgjlDlZwAm^ zszc8}y<7El2AuCv9m~WpAE=&H!%(m4IOSgYRJ*ByyfhZM z=9KFFXy{F=l4yH3qjHzR`mE|tKCI8FmeSjPUbW#X_-U6SF6!C0(dnxGjY@Ld)LB&j>8`$a0nq2wwQ>*-^(!BMc&d+Q zfak4trO%xDsFw<1=%RYJ37wbJBC28aRX?f6F#Xi5wP^XPKcxbe0QCU`@!8X^_J7%g{y7+p%9@?+kwtV^?&)m zj8cyr28mWbt-#Obs`|4~fL&9k`(d;(YWqj99;@C$2gW#c4t;;(y85|YP`IHUrRt4% z^=isbC#WB4G4@2Y>lbJxsUx01D_K2Sj`_T)e(w#KO;P_zN1;^pB|3qnsfP>UQo1^l zeqb4D`#!WX)xY+km8ISo3H5CCB(1_ZYIZR6ZmFNA3dLOYJY}-;)HZEE$yXow4y^+9 z#d}aMR122CUXl9BJ7^WF$N5k%QGZICw%h72T+u33r}#kRj@pJ^Ze{8h#-U!W-Xe#> zUA0ODLlx?%Hnb|$h4d@0QfnycP_6dYK(9vaOy32lRrgWcv`)Q&0tNNzfk1#YsK*|M zNTYh+cbJ|gwdor`-&4Q58DRI-H`2gsR^Om}c#HZQic+dK2n#iZ4A< zZ+jVF)9T%4ATp!YL_=g&eK-a z&p<$*)y&f_=$z)yLRfIoOi^jDtL6}$``t9pQx4i)^BX<4=QZo7T);yUMk}nq?xD4g0E(Rl8JsA!$Mf_*R;_`Rs%Ev zt6(8e<3sE2Wz7y+^@B7|?Sx3M<~=D;u4t0zxed|eC4q!$uF{94!Zcz^5r%8#H5hG# zW>EngjMSK@;4n(Fj&}FanlRcHUe);3qjgOqrBdA(O-m6JVl@u5SjA~<3(&f*Nqh#- zH#E;D0wrGaS{fu1G}mcUlc@3k|9zy!cL=RyP0hRT^QPt>x}TGxv8dpDs^%K4yJ?zg z3hAY5zFQ2G3{CGjn9bCjrrQZwnlH|Rm#ulH4}Yp0O&A07a!V6VUwp~cY#^`mG%>c| zgml(rC zO~YPv4r)r4gA8e`>0h1?YaS-Sml2JR4a|;eR99hPOj9rlU&b|GodM>AX8#Xx@R8<~ z?XWkgd6mAUFs0eD2ny30_9*^1Gn#J>pf#&$iUQc2#%O`Pc}+++z^t`b_Cno8Yo=YZ zt@hh@VBJpJs|Jd_woQW832m1@pigQy(fuO_?W*sgcS^h96r6C>@~I5%wAMh;b0=+Q z9Ymb9fhiC-t`AcsP_9_sE29o zXy+KNec=R1g!X58RwA{Z)22I0>)QhLXl)Qhp08@1D8qP7`zIA*#%S--8WO8@96>8i zyIKzm*R^A`RNl~rnqVkiJ7fovpmn4zK%#aJy?v9k`)Mnktd+h5y_?!wGzBTzq%5eX zY8O#)ORjdc2%UM_f3Ab%YeQB;vOxP4#RLkqOKFc%r2Vf1){C{jF)$M)+V-6=bX)6Q zjzO1c7t-QbuC1razq{H)DQHz_#j#MR)OvgkQl(Az0$8>7S*lO2(JtB!ky`CXC*fzE zR$UH}dhO|cbT(*>^r4_eZ8PmZo3uWMpm$Fj*9NoqwI8OT)vWzA4y_jLavTevXw`o6 z4BTzgE}^=TcCF?Rfd)%DB7frsx>&uG>|F)_I-yCR!dklLclyb;Y|dS}$E4t!@`|o@d~aw=R)( zNItrEUxmm;-Ox{HUDCOEfcWan^gQ_KZoUHx{Rxt$g)p7ZFi5y=GsS)*bT9A0h$3~r`C;r)x&Vp@M(d_uhsaf379ISq z>3S1^8KXP$7r7Ebk}h3< zzeBRl`&G=@OIh&1XNDXiS2OFVh^6a@{E-4~rupVxhK3j?#!XCDTNt=^U* z`F8s6JOE~|SJR>CgnpGT)KBU!Q~=sRA9M~1j{09|Z*yAz6a|@`^d6buIqSEsL+2U& zCscNNR=@IbSU9Kuk`AFR`sruki>v2rvuHShUVCVI^@4@rX7g(U+sc#Fw ze0u3uQwZ2wziT6)ee_jSq;gU3upIMwNx$|E9Q4({PWL|j^lK?>7og86Lua7=Bn5#k z>km_mI!Hf13VXqN*AZZb==J-d9;%<9ijXk<^+2@3^|rGh5&B>XT14t64`W18`dt+N zysGEVLH(Nk`Fk)FqnGXjbgce6s^^Q-yL5nD*ME8h&L`-{UWL6x{bf3;C+Xi_g@GmO zkGg<&Q~wzKl2i0)w4+Yf$K_&R8TwXQg){X>cAzsyZ+sa}+|obsE_k{6H+(?~^o$1B zE7b2z1ZI(bFD;|D_1{wwaj9N43qSAZL#Sx$uHODjkP3Y&O?jpMX#-j{`s39YQLX+i zy@=}c3$6jIQ9qjvvrT#~twi_qZ&L{PzJ4D?x0>~j=s3`#FQ<>mwCe}1qq9SAX+Wz} z?-&POm%f5hXx;k8gHZ3$*RF!seflGG-t5l^ub>R^L;WQ>{txP1FJWGW^fxKB zF{;m|=+BsbDFY(o`uTKNnADf>0XC&)bYn!*`aya`=kz8K?9JuI>U8zNqY7ihzC!B9c90Nw^&6^M_4Peqy+4L!R- zE*Tb|L#MCd<>Q!EKSSvf_~~!hK>rLfz%WR)*@1=^&qCy~p}Pe`2{PEekIrBNry7!1 z3>kFP3o-n%2fR?jB||ILpvnYhoWXn)Bf4&gq#CRnhQFyoINlJx4I&8!2Op>>8d5_6cGIwe zeu^mu56XF`8b+zEB+c+-JV?61yZ|J_P)`|-Oher_0LwB6DeshRaH7*$uA#LVGm&R7 zeF2hh7|8}$fuVmfNTK0Vst74EWMpAr#fImobfLr`r=9U_gW&^UmKu(k(0RvTPbK|j z2KgE|UvBtw5YTrGo1@`pg+cZ+T2%%nRfbm^yvgetLv%G1Y7J|f09|Lurf*%<8(w-5 zU`>Wy!9clZD0>Ma_YJ$FfYNOE+zFB`hW-UmZ#5jDlw_NsbvGPrH@r^gzYfE(Qp{4P z;WYigx(q+A1xmNUN{5;6F)X5U@dHCNtqi?}(h!h-!>S2D4;oG^1@w?%Z9Pzi4GHPM z95H+p0)}f%GM@Q^qAsv>c5twCz1@ zOs4d`lkrRh)SZok9E|9U(d`Y0oHZ5=fOpQ=NbwLCqaS5{T#f7hKP6(^`3SS*ZnUKr z=6U1zLP&ZTKcE%b)3}yma^A)cGkm#ZeB%-%eT~mi%-_#gPzavCF?ST00mg27Oi!TE zaWB*_8*S(dNI}LoKLRh<$SgwV6=VB%P!BNi-uQJc)RT-+ z|H4ADaYY>TZo(yy6l3gvAgM-wDjQBSc2ig~(|G)UP|q@cPjB>WK`~!WIRR(hhn2k4(yc}Cr8k_ZB$godd?7>D}?rxSui(gU0W^fT1DdCVI4ojc)XQ7%}$# z1u7DAHaacAT+bM{1Yzv6 z#$9itHD^qqx}bSutQOGLrrlq{K^v2%0M>0yZ_$HpXL@oOJhL}>a3FHR6yXNFlcp#N zi#V9pya16?rV84sIGPSR!O&^btMn^(GM%FMr?ZJe(U>!)fplP=H4P`h-Z|5*$H8+k zmCnN#SJT!Sbh?>dr7tqLn?A{bh4Us0h44L0+rEHHo+f`ST3)99UPxXry_OFVZ&SqA zFzaJt(WdmG=?bNFE}5d%LBZFwVji7-CjSWd;&19b4ut^I(hiV7)6!W;UN#-gg~%1t z<8G5thok5E$<#fc(JU;hM=NYm$5XhoUw=|PV+B~C%)s;P^XylbXwz5t6cy)42Q zVohHQFw8iU@d)&;n@V^PxncVGYbeB<+*-j)FfF33bfW2NB@~iO)n7s~*|hi+$W4>D z8&0H{QfLWEHHA=NNQUV))wpDug6XptSth5|7+AJRod(GqlPUrhZkZhD-cqiqnht4s zCa3=(l5bMeF}}bg_J(?)N%J&%}zY8ZyOa^*xZ<`)iz$-N=D06NOSKga$KKV|GFs=&D>?w}VUF&Bx~Ew{ z2LLZ~CtVu2V18>2h_`tqZN+@dKLi8iqWNVNpf8zqv@ZFYtNw5!j0~&uxaiDDw<`qb}N9JqPux=43kQUo(G0*|HdOgaW)+v!)N$lKKHni@V z&&VKBVZKf$_DXa9kC3b~ryNA9+WgFGK&dgCTj6}I+3hG=b>=^55wADr-GO?8xo!-d zjpp<8A(kfdU+XZR_so}n1n<6iBYoDR+5FW}@LJ6CPeZTOTzec2wwd{_z=?Jom`X!fcoMyAIgvHgDJo(qrzq2FVBJm_``tH9w+FRG;}pA$a}fv?6p4m^V;h z_o4X?)#(hHSAPq8LuNOM?+%;)wZqhnn5`(*JZj$f7s!~ogBI~|b0UR(CNNsG9+~}L z0m`I#PbFGY<_g+6Oq&PAaB0SzAxGz|`GaRc=FG*E(waB_Orc|IizXGm*jUz6A+)V! z-_x*QXX&G#jlJc0Z&)~CS^W`a;-saJ!e|Z_b1Y`!l%<&}FdZ%V$6&$P@+0lK&RC4z zuyEG$(R1iLXR)Thl8Ys34J2JH;%s2LS(^WZq`T$!36S%a+Hp*Xho$c)xa4V3&_UYE z;!0Ie7cAVLAmVLFUj&|yWt0kEE?TzI19ZuPe;Ohu^WciK{gSuQJKA>8ue7_3KF zj#K4yq$PM8^r9?_-T;ZV%$|hgRZBeur>|K8w*n=`;z5a=Sjz@FnZ{Xs)1Y_Vaxej% zH!RK+V~Mv6)$mra^*wlWm|YYa5u-|Pi0fLEW2qz%C-F64Us&{l^ej! zw>(FsmqnIZipCUM)Z}i7#Yn%wJC|DAZw*(i^tZvVh)=U6z@rFj?Ie zZz^!?u{_0qp$C>d{{u>|&+E)s_8x!>;~?cmT^T-XIB|%v`7WGr zV;rQ-q&wqVSIBuVR#S!1lacQQ%!|=Wq4Z(KwPq;uW`tLQc7*XwJhb>QT&SMv%Q!m- z>wb*J1YrJ*!x}8sQARkGsRI~KMMFH0QTrsYAjV(qz=9bkR{=Z5cz!=PLm1yuq#DY2 zgyQQkhKVk5IOE4>VK0JV$$+6qhT}_6eVp+gwa!K{_Rya41Y^N(04EvZj{ssBW*?}I zW32B0XFS7wAvhBl?-oK?A|sPd$Rsg_ssHR0qmTA~$&3en0cQ&1{)-S#WxSRPLurh2 zRKHDUY%YYd491JkK|GVO;XG(rj0YBjmd#kX1@4|^yh{f+a~Q8|g3eq<(SH>H#@b`R z&M-Xm;LK;d9}3R1jO#04r~qEWiF1q`I&^%2G50?VUSynK41prXd&_YhiWxa+kSk%V zJ`V>=86Qxwt&EZP7<{?J2p9#eoN@RXKn3GjDgae7-pm56iV-{jP|f&;I^Sy;AAJvH zwTzksaMm#Hu-?MZ zoCns*7^i#UD#K6-U)mU3`B>I#jMipg?Tkjc03D3pB>thVs zF)t(QPg5@al z-5kgTFxOEvH<0=FHPC|aK?cx*nSqpEJjN`b{<9FK=0VsCW%}kpSs3&01&|A8?xs{= z1k+4+K@>Ci1_Vwpf1y24H1n}R&|;X`zTiB`-0=iFi)F@A3L}pB&nQ4Vb59~T6PQzU z_arjw1rSJLIzEcUI>oe5p(B|&;et7&Fi+C0k;>de$BELINt7;1XI`RYKn8Q+KComm zV~Q}pEM~qllw~tRXp?rDxpX}SbC@oaI%$fR%`@zmTCR3 zcZ7M8I+o5c=jaJ`p2?g^vo(|el!Q`B}~m>&`O!Q ze}R=TzjXz6iTQ8~RF^aFj6;nL@?x4rasxEJ!EQybGRnF<+&UD`o!H3 zGlI7N!^|JLpmT)jdJa18GC!sUk5T4+YIwTG{BR#E+-JtnR$+|k{{gUZrkHBw6U;X# z4>rkMKozkm=D`-YJIx$_7IHJp;LpH0%k-j0uA^0-Se46f7JC*|_Q0!SZ#gKDg zHLJnm$f|XMFHWq3^u}{$J#`K=7uKU3m~~~nMFIIC)+c<(xv`p`hJZWk_xmv9!O~Dd z-;=e2_ElaijSs+KmUako-mLFvdwhhom^#ONSoZXS_GSIE9s+)>;HTiAKdYHysiUmN z`T+u1aY5h=WZgXiS`cerJU}qZX&B0mvF=joG=%lqcL1TR`>(-J7;7h;Fbrp%TMQ7v z+Cop$NS2<0;Nz?x>4g%-8eR-=f;C8=k&I@wyTXYW)}e(^eUkMy1!l3VHE%#5j?NAvRNxW2g_-eYXjtRSj%36g4C~`ktZqJQBXtm+Wj*^j zKmlvv0a!oB;@ko4JZpXo0)?y|3c4?_mKDIlMV8+-3>LB4l^85$y|o;wOIW=hL9Ucl zYJiq9R?Tmi<|S6fN3dSb`iHuJD_ECk4_nFd3R5wBt7oko0j+_RZ-TPRtUTHSHL~tEVte4eATZKMWuMTqktb-h|46w|rA#jV8HU_h|SrR%FILO+#2~)Yl zdVCZDL#*5TF_mG~>LLh?uynt|rMs;9XQ5@3RYU)Kb&nM-1~$%W*#O!E%QF{RCRx)| zX_{hPeI6{+tjDQDIKzsf&oIrhe)V22XJP;k^tbs{*>BMT-n~=L(3tyh3XG(>`wamy0g8h2g`%)dk2&DWT!5I z1uyo~l7n{!)8(<(w7|?0_XkMYh&PxKl^cNI6TUJih42v z*soIRF_67UiNPTDW%{UcF#9fjh2$9f7Ul9n*!QUd5Xx?)By1SFG6OD!vv<=2FoJ!C zlG>4MHPv2@v#Y)V7RCO1FX8-dyICI$F1Onu;1G-=@k1hEboM+ez=P|#F z>_^^#co92-g~zgZ42&90!0(F~hKS)*C@>@5h)vG-@;a?G<`azL}=q*30@ zp0nY<1OsP?UW1Mt+cp3v&igXRIdi7}fq)C=IURr-C#MsG?wnoJ-Qd9~Q$dR-he7ES zFAkr&nGSOTDA(o9*-p{u5l-iuxDGy?H6Z}LoUf=z;Kxyju&n-^r-cwd%30V05WxBN zH|PxH=)Z+r5JzW^*#>h;HPCsCvw8qa5W*P`h4oNQ9fgHqoGKYO!#UcG@GOGUM1e#k z=SL+B9q0T*d*&z(=SRq$;GCdzLo}!CJzz1Mev05va+dnSY%C{!2`t2M_E39sJm*(x z(@NlM{}m1ZMModRaEo7 z#4%rkKsjd>?d>Z#Pf@a}lJge@N$f zX*O`&4g*}~6iYGK$Z5C(olTtD*8!S2+XkTJ3g_9?(9*(LSO=_?<3ss^s~k6q`Pw++ zv?;vCsiI$1JID3EofOBBIyXBxlmESeI1!1M!*xyyHPv@>asq($a8`FNPm<{(zkpW8u2`J>!c8*~P6GbvmS|Gc<##K^ICxp9aBd}1eFKw&CxRz&OA)FgUiyXo2*o_5=9FBAO(*RN2 z$`Wv%;679Vd(m7A1&J}-_iqE7zxmfPcR2+)qE~T_VJoncQa3*j!z7M%X?tW^& zPvY*Po9`5N2W_j9xk-J%Qn->AaaB^e`{=$-<8F8da_QU>`UPZghv}J|$?c-hJ&QX| zJE?4LUIoBu?%Nc?<#0_KF!x+;Db;B6xUR#{d6v70RgNYS!&+mllVs6(pU?tqe5ulZF?cD&%xIZ0$OXb`c3Z5&t4%GZn$^C-f z(^cHa&0wkKvgBZ?D113I}Xkc?v@TX(aEj+6`+e7 zA;I8v?nde)>E@&k-+YAy|+PbjJtdVSjM?m zDVH$8bsmHG6t^lKUQcs>q5bU)cV{(Rn&obwGv{;Mz=dG3<4G?<&YpLezQX0e^9%)x zBQHN1G$$T|j+i;~o(O;;7v8!&TpU-P?}y+##EYe4EN;A@53oG$yaWmzJb0I*uo9lU z{cAz<;+dR*9p*jT1g4{`-!Wmj(d5fvG8^>#zhg<@0dxE!R<~=|;om5@`)l<`WJXiWzKmgYvgZC-z?K63f4?rM`w>1v5Y~FnbV5fPfcLB@c z70_4da(Vk{W1Giwr>)l+UbH{3d|ncz%Fgm)mID;6D#J;?FJ~}c^M&B%BybxXBqDTRctTuzNOShId3)9Fspce z4@10~SNkPY*YLifuS3-GEVN~-<6W%>R?j=N7+3=@^l8X7^7hg~Ht~{rp|hDMqx$9* zUew2!SPQS88tYnlN#0nVtGv0NVc{CDm#$GekMk}j*1>!8Rk+m2lT|>ji`PeK^Xt52 zP4KLnC#8yJ4=;z}!5h5&zd*}Po~i)?y*#H1VEsJZx1bI1_E4tg7Vlp!z-`{LgBTp- z%}{Co4zG_Ig@<@7svL~)ylCThm)Cs^*eLJCU*O<9-sg50yw9^1L2it<#{w|Un~8#j zNuHk@e3{~XNeAPmc~$EmH^cL%I?yaH#~-vgUN3di&-2n^K(puH%>Z!V|6qVGj{KY^ zOxlTmlivN#{Kx4Dc8LF(0)uY+xNLal&i};-P7i(z3p7u@CG-VaCk zuV(@H@R@P2=gU{lVCDVzFT{bD~?CGv)9sh_9paMKFKT2`tC>>Oo*3 z{7)%N3*~=B@3=62wl6MmIA2V$O$5J}l0cFC11$J*oImdjxhVci??G8K|2qS)7``A2 z;wSk_QXvq_-$)zxIDQTthKc8w{sfi;{)bcnNaBaszWpjUmpTxMf^4cuwwqMx4~J$Z*l`?DZh|@ zKxO<7=oxv5AD)b8SL5e#lO&^*CQt0@?)slasJM$v1xhxhejl7))iFpTdTNbNmN>fc1HP z-$K~46TBIWL3=^M8rX9Xcz*(Wj)L(NU`~RWXTj+r;M@do6;#oS;gGo2g( zLd#LX#00PafvpA>0tHKtL0OPsd<(!af%Y)8gb2PagO*T1&JO@#g1?Ng5H3jF4uJ^4 z3-lI^6f7M8h!W(E!NLi_tuv5|7Ho8ZmKec%RN6l&c>lk&vf!)DV2KmFO7TmAU}FcA zB?@-R0Fneodd;5_4HSM{278fd*Dl^plt$jS%P~M z^JNPj+>aUM3gT$nk|+3)x`)pQ{Od88FE~I6sk4IR^xG^Dv@V1AIe}9XR2K?9C(u$YxKDZE8bS8Im{F}@kP5|hf?HN#^@5CQU=4!45{Nen4jchzli-C`7-|-% z!a%zs=-dNZiy(;}_pO5al!mz~IB^CRt_cb#G0`sA_yr7g2#(*xR5}G07T}55CFuSY zEIop+CIM~;F06yHn*#hxF@6C8|CfOE3ARx-tzWRE8Z#OYq#gmdE!a*i7K4Ic-Ua6! z!NSKe_aQ-g3pj@bO~1m45kXrf?A;YSun2RwCvc+7?0v!VEEpOSxGw_BxZsDwked*E z@Hhr11=|1GX9WA-1n0D1ijHK=2$HB+Gb`xl!0S0dASLweg#XYR-Ch_o4$MLL0~dxI zg=^k}AtzzWdCb;X`1Dhtxd^8ofcPO{WDS6u@HaNxbr(KLF_?!iii(h)!e{{&%Ufu2 zfb&O$+vzRiBmAAhLSJF-1z>){fX|@JU-)ta3>_8zJpvFY)U!bg5+0-NK(O#`BCun^ zMrub25wd9?9x9Bz3tz&7=eJ=-5kjA5z!E9^{tjrzg`;~M2t(X)QCo$f^uWC;JeP>s zwh2?I`q3`*qF$p8Vdpi-bqX)iHR=-HrL!N`h4WM^xFHNl0Jtd(Xo6g?@MSwV*e49L z#}f1lUv0r!4+vYYL++OF^A(W0EgYeUWl-q!0yu|+W%LXg7KTxNa76fE1eDzsPVEKf zsPH;HC+-Uud<_T3gq8GFiE&~4hZvj`R_%k%DPh@Ch))YYqIT68Vbn92^sMlKBTzOc z+(2cPdEw?muxBq?L>UPO(G|*WIf`mRAmAkOq0+Fks5KH=TtqvmDa}>%)~B%GCK{q& zfV-%j2^J60zwf{$Pm!n&G%wM?au_-+;?aBBN94T^oW3GoN|^eI*2ROxU-Y&Zw4)+k z1N;mSxi>&{plAUVEP_O1R7edLt){U4m}ozJ@GeAji3*~jB3UvFg^Bix0K!FIQ8*bP zN}-K=q)2`agU3ZXeIXDf3J8UT6QWI22Z|O2{)idHh?ac^TAb+gE5PDKdHW%kAo@HQ zS`tO$^kh#Gz3~&YoDyj!z?m#kP!yXYDq}-Ss_3{3SeocE)ilyYpU^HVQ&iy&&MeXP zKj3w?D19EvPK&%Ky3Y}DCZID{ls63L^F*Kji@`IZKQ~}O@+5HAtE%Z7NVXdi_!Wg_7+czsE< zhh9tNqAm3QYL%kA>u{+`k{dBz^;pacET!kix%yHzztF3BAC4?nx-6Juju$ni1&$lg`o9|HdCxW zAR5{NUv7yqD3yC##QqduP~>_AoOeXMk3iXw=*xUKI3oHY0m|-*ik5?ARCJDZ4EIE# z)NFZQq`nT8G10O|KpPjuQ3L0MD2h^ZlcM*i-G54Ctby5S5!)Yfvm(Xc0CS>ec+fd7 z>Zc8ro%q?MSV4R7Udm)Rh`%vl&`})P1vw|N_eESIXYqk7U@qcNXIO9*|4YXl-Nhkm z@I3Pn#{@yZQ>>zAows;3rG$=%w@}vIM;u4txv%)I8VLA_cddlkqhiTvxEmmLrCms% z_*bgt28n-XV$#9lNIIGwB7UzQAXMy3eL-R39rP3q7YEZ>wg~ao5DXp{uW^IUC~+k9 z^PLbEP)asNyw(BWr1-`wa4A;&%VSU-C$6HmTD*X+2TLxNpxC#gDT*;;yen$^TbQ2 zx#f&_kq@lriv_f&JS(oD^x}E3oLZv_#k-z{OBckiQ6Jew@#j2%BJo=;5GWD9NU>X~ zc<~MlmWhKY7`h~`oB^#|>_JbrO0g&X*G-l9a4&RLi|-`>)QJ5eAy+HjPZywG{0yZY z8^o{wfx*jSS8DcZ5@%VlJk8>&P6%8P2QI?}Xc0F*0z<9hH|ZNMZQ_7S5V$6eWWYkZ zSRVtHPVp)V+PcIYv^%>luJ{R9w|Mk7fF5zoA}G5lE=UCE6?aj8U7z@U+I|d(SJ0;L zmiXS2@a49+{~stD6hBi6a7XM>3=1P-+}60E#m|>R^{6=NL+HFG&Y)(R`(oJwC>s<1 zKo6a9@ovh$Oo}&9SU)9Br)S-?_;uQB&4_EcurMpWz{K**iT_7$pn369>YTQhBv7>G zAnBwgBS%RoIpHMf`5I=OB~gE1&_%Mj7lW=6Grfe}BpbE?bCJ=;temp_7SzlB^%#nZINa{Rzxb$tlX=21=fzSR+WX zffC-qk~P$9a!g{SFeXHDX%e(h$(~Cv6fTLS+Gm6$=>yOrB_gW#AD4W;4Q8Vx({#%2 zgoNb}+DXaT55O5K$#@MQPV&;9FcdGDoC0TpMP8 zJvdV(o9N+@CK(I^NS8drhn5V9Gu_^q5;YTY*^;Ss7(6Zc=`XP4NObE!%awd$4=s6; z8wY@$k%T6LC129_0+ygavV92HIms(0Veh;oieBu6l64Qm-3yYLWe~V1>Hii>UM!jY z1A`?J$uO`|i7$OPq)c*#j;vpjY@+I1xx|ZJZk3XbH{ouTo5o;|H$gkb%@`RY&Pevyxe&%}dtN-oj4$GQF$p zr5Z|=IY|v1_~I=6`vK5gq(QF$J0!jJFvQ)YmzF}@T`Cy>%|m*VepQ~*SUv_1O9v?n z?k#ykn@%PC4sws(p`Up#b4S^-={q)?JWi^O!`VVK)7_}6@Uoo zWDk}#Qfhe|oX4gA>;o1hr7 z@zU>J#$bZ|A0Wc zwC87VW=Iq1qlB5#C;r7?mXt$nZ`o1}{oYSYA2LHOM>=-^_Hw2DNl=z24g3n=jPwd^ z4)Uct-@;`)D?LfI-2&+`n&vs_rq7_|y!5~^*ejH}(j)JJG?}&^7o`tg0#+oQri4bZ z)bVGCmq^D0;Y+FXyRV?7OsdU;mP^tK`m$`fwCxLk3Tf*oe5sT=JPf%i>4(38vsyYs zufZDWYZPtQO3zT=Z=JN^WjJ3iour~fgLHx}<7Fvl19Ub@Q|Ra0Bz2(OS+n$OYK^)g zjiH987HRoPIMFIiUk`9qs-tF;HtEllv$`gIgi>tn(us#5*CExr!s|}y7$v#7q(TGi zU6(4&u-7f^+YHVg=~+*3-jJq8!=;y!GP0qB7EjJc1!wP z5Cm>Zi-R#ZB>h(c)x*-Q$xuBaEu-znUFlw`T8>JK+rV;9>bMWI`_gVI;EhRhs1P?U zeUAms3F)Jhcbk;{GXXSd%e2&u>Wwo}XS&a3rCYTSpOePX_nzjZIfo!_CkqJ& zu$MhRA%KG{F$&_2GA?C;on*ITq1su-rY>0**;#r3y2{Gmh1Z8h0|nf?YW_{l0x zK&QX#8`@$Vl?6~h7a;SYTO&}m<44efWUo_EFj$sPA?h)ik$SU3WL`;77AlJxg}pFY zRVS2%%QkI?mI&EZNB9ycJ7fTMT=qp7SfXU9&%x{o*(dbejh3ya%yW#)w+AdIWpi|p zD^@me9IF&3`;(qo@iLwq_7Y?-(sLRR- zEOG^$NRt^T`Ij!+9R`*R*>|sjB~#W-4V+oBkd4rpEfX|A;IypwcMRspSm~HiuIy8~ z+4E#U)K_^%)Sca9%)LSO)g54$WyXKN*(iIBj%_!|b~0eLS(ds7;EF7o zwk9pI-P8utDr=!#@>N;?%dp-iySN9=Uz6>p)70&<`8a?MSzHYkq*Jz^-c?;PG4**| zm!&=p)!njvkAl`Cd+t|YH)O#kIB`?xe5aJWjz+G%b09AJsHMj zXQ)$qLiPwfs3&Fl)P6W6+eC{zExSoyKb(OTNYlIuFa)w0rTEi$w7A2);`L;3HSi_R3fO)Nx>b^5(|@{N?^Uh#!>?+hMi= z@_f3z1LYC)!HOXHuhak-EPv*G_;O5cM~zt_@?*5k4V8cW5NKiYMvA4v<#tpSh>$zrf?uFcGc?7weBQJUca=G#WDkA5})fUX?jJ)J;IFT>c zQjBs|zJyL76v&4oFtKy;@2Et7Uj8PvE)>caQAgwj`GFG9F3LBSfwM@SMtkOBxtw+= zCGx+7pq0w=LNQn-_n>#&C3$5o43*1wQ}U=n-WCGRO1bb5oT!pBD0Zus``v}18u{#N zm`bf&{SFM($(PY#!g{%Y-l+|8cj~aYEbsS#c(Ytc4}mN4&E+uEBKN0Tzg0fg0G(Im z%C~^E$)9@=IpVhW_wG%r61t7{B>%Y9F+gG0EX_! z>pGx%NWO9@IEUrSzXvuVKT-=VcjfovuymvH!hC>x@^~i<-j{oyfb}tXR6INzm#5M1 zc0#`BThJ!u&U3(~sdQQG>8iwZO@wCWxitB|?X0Pa` zUUvsYrUG6&Dh^S%xs#$U0PZ>~noKa{qR2FW(@i0ySkYbabq0WkqMP0%o{Eou0?kXY zfm&7$D_*8!_uh)9tHE+a@%03^;gvV4{}EpzVuEFP~i6QfiI}R%BDCc}!9J1$2feCa6drs#x3$Wnl`}G*}2%Sd%aqp%_kqc%}Zv6G5>lthnJtfK9BoPz%oEW|4wZpR8H zD3WNOny46}baawpayJZ}Qj}7aG+AMw%1??Sg|dFBib?8ZPE&X*KucG25G_M7p@x=B z#SmqevlPq!2W8ocpI8t$t%#;VT#mx<1_W{y>nI+~Q#iVS<&46x0n3xG*h}w~vx+2& zlM57g^Wf(>#rEBhJFi$hi@`$0W%}~R1%-+ldoC&->H#QHbkogHtQa^BT8ZMqhXAFD z0cub!Q;blb$0fz7!_ZQ$c$)&33dQpjR#YmUc^95lDMDwUrCKpE2Cr)r>!<=ytGG)s zbe&=cMNjn##y!Y2D3l41yR0Y+1+7t0Ou3RKh3`%XG%Ie`>%ep{!Fe{VqV4VlVBkuPgHChu*E=?gr>ld~+3YHxzGC5BW_+ z>{5VU#gp9-=u@Oqs;pn}HRb0A6!i{Rms^ULD93VJQBRkDP_dnk?A=imS3qD$@mB)C zu;MWWz=&dwO8a*eeFHEwswkvT<(?wxZCJRksQv*u#}tpyf{ZK7RWLN6c#ED{lZsp| zSf&(~1_(?m{`><=H=|hhI_%9V5~%5QPSMo@3-gLcC|^Ir({gR7k_2!7zBRgA9e@)`KD~>hmG|XXml)+a2Vf_aYt678tNiK$RL3b_JqNS#N_*NIBq;yN2Q5)~ z?GFqlDW_k+;3;MAE3lBPbZddm6lEOEAyvtsoOqh@uStM(We$aY8OrCJ;aR4#jN+v% zrQl!4Wh=LcfSp!8-w!8pln3bDk*geB0Fb9lqNLLqrEx!W<||*Mt8z}cW;w9)%E$hK z6NSnsIv06C`3yDBT~wZX9*b3^d@UP;#mcA!&{?8nvLRQheB?(sU#9#x4t`!zo}>G- zT=@(gVyjR-NYkuT?x)vomGXbZpj9hpsB%!JdTos~eP65^!EtYL;O}jmokG zP}Zb8M_<=zR<=@neMLE12z#a?4FWEvDAI#f_h+MO3i8*8dq8eflVmK=p!_f%F)*Wrj$-pJDXPeDj+bU z9HC9qtaA6~pv@^O=3sALY4;-BwNt4mYG>K zgsUojD>x6S`U5d(H`Ti|O?OqnER=buURwj2r)rT8ocB__S_SN|N=I_us^=evmLsYI zl=ksaX?H=~UzJP+^rNbjRd7B)wR$54165rwf+a}hNi~gNmBI^NA5&FKLuZI;1>KRM zs`WweEKGHe54mtv)J6zIsAg2aB2{10>BHkHdk&OEsrEhzxf80N=pKw#9pM0rQC)Kf zc2ZTtfLyF8R9h&Ao2e>(4J=uzZ>ZNcTXpaa=sd03c^kAG)$lAh zb5&gn!IGzPIRryzR3+4Bm9LtoF2u8{6LavaK;=9Lv*%P>>EOe8)jUNWg{tE#A#g#p zlv05gRnH`2Mn$TMlK{o4wG_9OsB$RsFICO-Vj;^^?%A++Nww;~#(7oNqrfUu-_s_h zQl+Nv2~?>bYJ=)(RS%sDsZkZqVsfxC^W zxDnWEQjMK}K(ngk6M!o!mq=)7QB8ddfmYQcw5h+U>i!-AZK`P6m0weRaS}S)Rg4$0 z1RW~v1z?>jb}~Shs-hh%*HzDr!liE26PXb2Q3d#8@P_J9PguCAT0uYiUX_a&)9h1u zT>|J=eS8mQ2UKeZAaF~ymrC@vRf*IlGN{U=YUdr*qW^(&NcHvw(1uleK83)D>N|QQ z+*R2JgEp%Agl^L@)$de=8dq(gV@MOKSW3!Fs){~a%*-qUWgllB4e(4&3gW5`kTSs*monmrQ?g$hz(?h*^A*SM~zMlvSUg`|mjvrR@DFN-RUO{p45p^RK z+kDjTvY^FRo&O57_^G$krpaHO#{=h4wJ*gs0qUg`x(BMaP+~qv{o_Zl5Ul={f}vyT zpCVx)M4e4Jh*0&rlpG6FD+QQexVp^);t}eDlrxT0H&M##xcaA~m_wABLpRY0^%wMB ziB|LL;Y*BqBb|*nsebNXV6p0ZyI>(sJxcHCc=c^R$R(&>rcaM0s;gdx&Lnl>kKjC| zcFP5ptX@l@LyG#5HPD%=K4^wqnmX(W=uB7ZX``8;P8xbqbZ}^VFL+VepK)hCct3uYQoik+bT3FF?FN{iqYHpHuf=2g`YN z{B{f$s`Dt*eLce_~26ZB(5HG7Y zZ-79fI!TGaCUyNQaIjhJ-~qE&)XNWo)}ns(d-&3-uJ{F$zN&6n4_ceLopKP@)Z&X^ zX;-I?0P9d&s-Uw|&3_MCy3{c-@a(#}mmWIZY6Trq?@@12gXM;L4`oqrs)H#R-m89- zHgJ9FaoSJ!tB*v2HlXfW4Y^xtJ4a}_tTPQvFsc55jxJBDzn%xn zj5^p8gR|<<|Jse!yXi9x^Xh+TXJe;f)6>RYqoJlW2TfintUGFE*8y|V4AW5+XN``w z11_5JM$E`n(?@sRAx+&^0B)LRs9C{X(@q<34^7rP0G^sv)JW^4@ehNc!y3kSn60;F z&HDgHH2st+^U>U!iz;%v+UaN5qFGE$9IcuJ>iE2>@mmkjrqPAKP>1G48?!!> z3EDl)v0TXA*XYi``k2Q55;(^-b9DM*LL;S8`=n-!nlYv{({2!-);!q>ff-E#{j_H_ ztG9t=PV+n6DD#@oZ@^-wee%Dgy*BM1&>Xb67hum(I~xP%owVPlVbEFYKu6rlSmLgaP)_&3h&STofFR)l4T7C{# zLbY?0#0%4Y{5wFn)wX+r6*x8LF=~?EQ#7O3KEmFySIaON*m(~Ey>#d(WOe! zDo?AYIpv?FH7Yov=V>kM<=BByMPT`~&Q!HrpQ7 zd$n)T2B1&-f(t;ucF$R`3}_!0U@Et?M`K~(w)VkQ0E5~c^fSDpb=?8$L)t}VOl(;D zFa;SS+P~>@Sa-F-bR6@(HcA0yV_N${432A;_JL(W+jIarC$(-=!<^EFM}ao2t)MG5 zqs^y73bWcL9DvPhpA>?{PB*Xwn7!@@9iem3bWVp<%I5Ix_6^>DXW0R==k+ec2akX zs`0V9WcuhvobIuwU@u-*wiXjh&^_n}Wr@0&eh4J#zNU`kQ@T$SFq^C^;zD(bZr!(F zN!6|E2bQioTL)T(uK0J%FH^Uj5`3q1j?{XYqgzhvnX9`<`LjITf#m>abk(22P`++E z2jHA8r2_)zbx*QDE7Uz?2W3S%-q0Q21MH@5VjQY_ zb!~MJ@6&C)13&w9>nUqApevxyGv3mDNLlyWx^e<1nbH}W;LEgbtuN$e zbZ`C%+N>^qF$U*!@p6dI>pskbJv;qP9t7<5Ueqk)pkLt!%u)XoB_f^lOZuVOSwFH1 zaxQuSeZ<67KSXDt-1VjOBk|Dxz7;H<`cEm+@zV2Z01oRfzX)+}J(~fRBl;_C(CMRR zzXeWT{nsL3NA*u^fX)EDvk%M$>aPc2@R&ZD-UuQ3KZ+n8s{fYG%Y^Bdg@7eozvni@ zBlOn-fyL?t^wf{jFQIp1y#9qKC`-_HNPs2kqaOz?NgqVwr}Q~gn@H9R`mquz`k;^C zV5+`)JLZt4Z*qXybbSLgooDEGQLLD$|Dze=S^7{4L$mcYRAD@=|85cjIeH_tAmr*_ zr^q8u|2~}tJfr8SU_D^d^&6hVY|HdP_rZBd&!B*yT>tqdXsOT_jDc3E zFAoJ)rT@GDv}(O72VU3c>*!fts~-`AR;SOo1W>P6g+XtDCKS1^k!-dxu)Mz3#?rq9SqJ6{YwO{ z>)U2vs9V37a=$(LZ?iFYQ~&3Szci9E**$$=DqOm+7v)0P zn7)zPx5xE=(9eECpIr&@Nxet_mMQ(a)NeYiPopSyMqf^^kXilTv~i!)5B&h~dHoO6 z|7mA1Q0mIwU^xjn2gAZ0Q08b@M7u~QLpf!hoef zy$Gs34M(Xa>}9yU6D)@fY5yhT48>6xJYv|O#GsEsO7$v#!)z+RQNz3Rg^K_Ke+zD~ zKtpCMlm!_Q+F&Ty;IS2h#|&QgU?{}!9Thr44O<)FON60=3Qm!R&qAT)xIstdiztH^ z?c7cna+@)gXv2w4*o!gv_W_(Vd`icVVhxRSzr-1e&Vwc1@M9AUB^X|@LQA3{gt8S$ zhTki}dCHLf99U8fcDrFc%`iyuXSzX7CD#nYd@E>~hKDKDl4V%604`-46kbq$+7LrE zn;gT@pTL=Gu&l!T@(e6`GMq6a-GQ=v!y1Zh&KjmJ02CM&QSqzLFnt%a3x-XUR=#K` zr6Y+&h7(($y4YY@0xcy5jRP!{8uU~nDl_c)1uT~gZ~X~F5fYS_CISexPFPr!1`@Hh25w;NcE80;{lvcS@5 z7=Hj*mqB_LPFy!UM6qeNVU&K;J%(L$eDH?h!jBNYX^-|%n( zz<|N}E0o~I9_wjo*s@j=6N%G2I4wEYdaA;Y3BV8e!Xdf<*2ypDq9uHg;(=de)& zgWfV@hBeQ_-ne0c5-1afw+~@PlZIi+$xRtnQ+PLRkkt1ni8#Pr{zPQCJ882jf=ygoC58jlLY=WW2K(G-u=HI$RtVqZ?HiU5#H{1j`|# ziywfSvG6na;%=14A?{(Ee;zEJ#;+2f+RKsp(+tQZ7}ry} zJ<*7+8@wNko2Z8;#mJ^@M5^(36=-Qjr#@&&H!duN&J5!y9bd{ezDb=cr;VL&0^}IC zDj;{p_*Nn;7=z>=o*S`x; zWjxl6`BfX6`!L%Y~Mzoq;ZDw`cuY_h0r-|%;&-D8KWE3vSy7pDQ7ijTt}hbyisxi zhU`qvbSl%{w2RJnIGC!YAm?aWeik~NOxIi>=WI%&=ckKFu@vI2rfU?U9y0M~VaUz& z`XIEpn_i^1nun?HA!zY5owtC~%k;@k3?4T5z6K|JOn3h4-Zy2hfdxO)-(?sKFdgaw z2sC}Q10cv$K>40vQ^`NTj+uH!G0hN@=5JUJHJRv`f0(KLDX@f_`d`8vB20c%a*Z_o z91eGnn-=ARGs<-9LkylUWpu*NXw#u15Qs7DrC-%alWRUy$C^H%f?=HLeLoDwoAS3} zFu}BV9|jXm=RXFPWU8Bk+$qynl)gze{Xhlg6w^g#T!2)Q?RCr{&9v_qOf%i|c{-+< zVfySB&@xRP+d#`Q`RswRY||<`Xvs0nQ3QC#BtHdZ7fnm3B35J)t%IM%ra!L0i4xQ6 zbYGX6M(HV4W;#zte=eDXR3n7K&7djvMN=kA=>*^o0t@M)|gi3!+Nc$ zUIw#urppw3)tmg6g0sQ&{S&Z$*|hd1XpJV83pkrhd+D9iY#KQY?25^2GdNpJ^|T3X zHGQ-mw5ukki@@4UA11);HIwf>Osw7X3nffDOj)$8?lhfy9&_k2ncu-QubUpEyRO@m zng&{r$;kk@8>SNS`lhLvKC0Dg`jZm+eI_wgvinV6w?TZsB%mhuTc(HE0JlxYD6Shc zc~fi69n(X9f^*39&SuCBo1DJH#70aHP-@_=X)&D@8Z{+RG3Bn;f5(w&hNmcP3H=M&6ox@!@{g7{uun6Gi{{e`n>6xBItB5 z|3iraNAsptFzaMqv>#45n+v>Q-Nl?43Qkw^W7}cjkeN>*qnnvai6wV)%VPi@<`t)5 z$kXh>1kKC*<{n^&%};&_d*0?EdO{yDAMu82A9LU~u=tu6z7GpW&6f+n8DQSE7qmcg zJ$2#*nRn3A1)Go1;o4*7FpAbf%%K#Kg_>>D!4PIXGl;7hZf>DXc7*u{y1^pNf$O2= zxcP~FphcMvrohk%b59Qjqs>l~NRBbDd=tK$G!MQDEwSdOr5KDe`%^(X-aJNC(ggDo zcYs9m)mPy}lKEc&l$|n9QX(YTtg%5L#XPBmmUQ!n^dXiE^D@e0WSafx$)06?{Wi>I zo88(Ve%k!+D$Fm(%#(s8*IYo4r#$m|s#c#d2OkGZzWI0;XlKp$s2FwLyuKLIEHn>f zz@-c31GfQ+%_B6;60;o>W=qXo6f%~X&Fi7;k~w%C#LLaOPr;W8^WW6FRcT%{4^U-J zrY^Q>^U_|3*O((6fYqA64gjb#|8F7Otv7!rgU$wXjR|Hio8MjuosH&D3KE;l)^EVl zY+g#c$SdZ9lrU{EH&962YW6w^&a39Q?eMzIeD5y^Tr*!>0z>WQ;vjh4VLp)sKReC8 zt0C8A4yP>Kbu+&QEZyc7I<3=VR#B(L4fEk_2;4LuY=mdM=F`-3(q}H9pG?2`Jngau z%q=cZcFTN)>e{!>BP$?2XfC3y^Bwc1Kj6fW*+|>?VY4+8EF)$|>Yu-B-Z=nl)I4c| zg?r`$%Q2Pv=2a5t95c^RT4db3H3FOy<~8$RnKUnX8G}>i!g_E{n?KorY0j9X^k zW_<=Y=ge^{FgS1i?mb|37Ig;ZU~idmfldd@&s3>*v@C0dgU%MsG0mH>-4JFbcu;h{R(Uy72amHBUHiLG`qOgaS zWJ|$&kV~U@+VAGdXzL5+a779LsJx z?wxCSnkol*mZ~QJ&RBf&AaK?qpw_4YOH%-*a?YZq{rh=K7)1hwmL|H{FIfJe2gF6o z${Oe_viy%i&0O;(7){;#+MC*a>zRS z0f4)ePllV5kp4MB=(CKB}5e%J&t!%0^9kE(t;gXM4KL;m#t-+U|%+I>28Z7=+ z>nX?`weF)^F~HhF_JXY6(^D$g>e>%qj#(pi0}HX%(Gk{A>lA%*C(P>M4O+PMlUi;#6bq+W*KUGK>DE#D-DX;EQ`$Alx{)?2+13xQf_B>a&^9Q`v%a_+^E+dG`!;C# z*0nDHoVEVEAG8AN`d)~iw{ot)UZM5SS*X5X{Y3+17p?1Q4kgwmE?7#fD=F3}vvxcM zxl2}M2e5MMbCr;*uue)LS7~kX1!uMOXdJw*vDQ;=rq=rG0&vz@#ochJ-Wo_p_8P2% zRO!8J4X5XIqxIe>v@}^SL_$l8^`jnOt=5vO&~nxK1--S~tP%Th_0s zOX#-sIjS(;vEHJ*)R48g6kynzO9jIb>tcFW-L-xvfU^76g9QL%*3T~CQjJ@mq?l;J zDk%rcq&0}r4O7-Tba-mo`X03{&RD;s>o;%BSPnyWwhL6kwztjD-Q!?;jY`9gwll9{ z(8Xq4f{D4>9+-uNL$*<0tc#oN`5$4(-L`8XI6Z88HK2Lf<|%=B*mmJbsP?v*KEvP< zTkJXL^s&95fSj+bnRY$?HVXwVM{R$RvH;s>ADR!lFO zFxyL9fN-0ZSR!oi(Xs7FTML;zZd-c5$7w5{iPn2oWmd>k&FwB5~u zOR=`NFko@EN9iNn@wWFmU?{;hF9j{p_S+YbOR_Pjk0sewt%P`rEt;-Ts!jPN2GeY> zj$$y~7Lf)4`w}*3r8YO}7%a2x2!qZ`w$0SwSZ@3KaV$@T?SX25N*h}PfhwDtI^3#lo9OIg zjg8Tc+1A?Lr7TXJ?a3to^|n>JV79@Q^CrM$TPU4hX|xsZgw7`0RVvRk+kU=_*X8W7stZTL%$1$UJTk>D9*J+clgu7j~z4YR{ZY$af zfg85Bp9Srv?O%#KdTlOtaInvoNH4yAn+Lr#25dWaVF_;87SJy8w$0@l1O{z}J+N@c zR`Ea3hHUnE;2gF|KE~jP?Q8Pvu8kD|&QaTsTukhq?Pp47-nW%p0q2;_kxucB+iJeU zj3#VBvoJgPe~zv@F3akRmzL!yD_ff8$WgY;$}Ag}X}Nv(-h03PvY{*Cz_A};E?Uplxm4cQFBa-GN zSH=k!wA>i(b7B1eW9ni655@-C2^?a$Q7MQgBjE$MumWEkVdKi~{! zoMnSEf^q3OXvZ1MKSs*h!D*PrF?%3V*#BvV;Rex0pb|K-$9FKyi$l~ zo51j<8RZ0H>S@pt89F+zBr&po0!U^oc>)V38E=t53gb(fmrgN6H{tbZ#+qP&REFnE z^yV-oRp3l#sAxLOV9ct9z!}D7idbhdeqe!?#aKm$pKONwTd|Pn$=~-?6-g{VPFZz3&hAMfZ0;URtiLxF&@&kqMYHZ0!szMdn(+mWE4IR zWmOE1H^EZPxcc8G5gGHSUg{bn`2w`mFlNz);5y^=)eyMBXkHD@TE+)d6;a2q^ng~+ zV66tY$w(Ii*}&Ly1%1E8ctV8?jf|7u!-*!w!?%FE%_yY}T{FXZCzQ1?#9xD@m9gu2 z$h9#XJ@NS48JkO?tb=jmWzaeqTVH{_JB$w~^>&w$wg%$ejK~VKdKmSz9qDCc(hk0l zalI54`We^hj>7=sIx+8j4wv>bB}M>eW*Zg7xG)zlhny=@L<@r((<=<(2be!6L+&7Rgv!_4nJu+I zdN8Y}!0aLB$(PYhPi8f(hF;A0cfsP#JXZ?f!<u~8X^VwHn$dBn+kKP_( zhJOu~K;{=_*b8RrHbeXvGyem$LYPhMURTf7x^C)2-!+d=+%*Ha;(gYF5OwEPac;*ATyph06Jqqy?%vK5yCo*4o z9<3zif(>9vW;#+b@g#FTo$6AU*A_wi6tjkY-lv(BN5PWH{AN99Y0Ni9VLhGsK9$d8 zFdeDp>kKon2gpoj1EssNm=87snazx^hl6LCakMbxFxhmWAeXso132@T9|xe7&-^qH zEa#Xf*JC^jn0sfz(0S(iB80K#j z`q0-oE12r%V78L^{B|I(GgmjjY%TLeT94|OzdV3IJ+u5zsJ_WuO55xP=Dj0exy3A| zDepG(RtAvG%x{*Un=MS!T8w8a^JlW&#`N}ppY2S;5Lz9~1#zHtGRyS>VznO8bo0xF z6+aH7E9({dV{JFqmUK9AfHnJl=sd`}O<^>5)}{wg=E0Kui`F65`6vKSRyqZ9yjW}J z!JaqkSqeV*u%3Mvz?bFs0ICnOKAM4+AL}?J7mlzlZN}5|XX)w79|5duUt$OXS=<1C zAl4f@;L=f+OAUG(%(}l0E*)e2d;_XOSa}c8u~61bT1>-O=>gCg&U#4-fe6;%6!>zS z^=&smBgOc%ccf6#ghF4+G*C!Z=gDrHHD6=X{;f7;OVS1%JF5eexOk98P;3_ zSTb3Qz0un&R@Z5CGn=*XEg;XbN}d8Thjoj}?{isAI(jWwv2yhD7(b^@gcxv)+$PZl(2ee zF2BMmdIHW;*30y2m$3q_gb+H!Jqt(q?xDTx!)@3?j_Oco&0o%tKPKQ80EBYVM23Q|I2c3hgrOq%k z#43CPocCFWs7DW2Dylqs$SS8L@)0X46FP@kTV?_Im^DPfl@Zpzv^^MQC1s&wW31&A zB_3zF3`1ao#dL?gC#~n9x;`1omBNpPp><@Os>@oIB zkuVg(&LP#|>>N6eMX-f*?my06R05rm?5?NaL==1RS3pLyXY@iYjy-oPIOEwbUqV+B z*jE=p=Lxo+ewc}DXGgS>*yp05GnwsZfxt<&Bi*Pxl`;tEU=trpP(N~D%-CB zT}fk?(FC8)Ui}F;GuTPT;qDoB99=fZWM@*iFN=MJ_Uzg0XD*|4mi-K!dUDwBtp>F6v?|%t ztN>N)lvCiWX5XV?(yQ!Sbg%px`>8*mrG|a+Z|J44|27B&i3~Md>1ogd+oxK8_ z_3Uvd1A86pndEgRyNK4DJM6O*0=~<>_XlYA*cH2>tc$($bC~UB^AAC; zhkdUU%6i!iG}e9Wl9yqqpPgcazyP~wJM0azk6uP=h+Rp?vis~qR2Bb#{b?U8472}g zgxq8H;xhmv>~*xfjIs;(;2dMm(4#fZE~iCtf_*a`%AT+j=~z9(*Z4qITl|Gh#zO)FQ6Ua z#MioNii=j&YpoK?~uy4Z%<-M|cN1 z!#F9KkPGL`mZpt&iPK0gb28^1C2~%3!rp;g3MV!SzMSG*tVQcIXU2SVER_>V9}G?7 ztU8ERIwy?}@iUw!F5t}MEch3+EDm=Elx1_C*TRXjoPrMM%;lKwfR@LZb03`foaA!! z_8jNF60`!&M`uAh&*`SEW+CSSrBaGGtc&0*=B#gpmP?$ss9@$YXHy0QN;n*<<-fx5 zp-5CIr$q`U$~b$dj-{OQLm0#>I4&Q<>q^ekpFysQBjvzCHRt^m5V*>b_e1;|=P9a6 zs^N_GL;N~NOv#fQoX_8YXSE!U9T2bMg#Uq7J!dZM2XAs_Q+lm|v+g^zZgH-+!reyB zj}zc*;!If$NXDMcf3HHKb!#WaQ;q#z+H~~7M!@p`LP0? zb#bOK0J=FJ6@%8p(KV~qZ34?U=i7WBCpaHb4tkQ4T>uLX zT<5D`apbaThvdZdco$msbC=NwI&(jzi$E^iGv^@S%KiI2n04b$F9+uVZg~j0d62t? z%KF^72d1NSh?`E;6rSAkBarjrHg>~;H}@_27L*Tn=P79M<^D}uj>Fu_F(Cc8ztE5N z2si0j2>5e1Qa&z#8$vKuq?acgNs&*nPO4*o3Hfnt@p+}V#|J&*gvtI(3q z{pC9h@;UB{foK(Q1L%Ve=ea*U0`dZP&Zp>YF?SJF=wISKzZbO2+&nlx19&Cs@k42^2xD&@zD4+Zc%C%7P`5O0BDrhy_Jc`|4 z=axPNoj16JB6PEstD;4?j(d~dqk3+@C+PG|Zs=Zs2Cf^`I^5zi9)Z@#%~Jq0aX(0b z+1uQ4dK}H%ci(|8t=!cO=tCQKnHxYm_qD%Zp@Z9YAJ#j$tK1=Xhg(fCox5D-D-gKH zouK1KH@8@Wj`eUCeF2tU?&eX@`nVMoGU?|=UIoh#H|RDTywClCB3KW&tLS>&L+)qo z@az$nJr7O{b9cXv@qEnfqb%YGSJwy!N4c*LgL90_rr+5(cibP=C%C^YgJ(~;E0+Q} z$?cNEtOIXDA!v@gv?V|~@eb1QYCo@t@*U2+w>yD!;i=BUkSotZZ`DCw0SDIIc}-bh z@!&0`&E+B9*K~gHHjj6p8LfPtD-}naCi+HQZ z&tl#Z%3fXKtr`RJGH=BI?3M7Msaop_FYi8BN_nfk1+9$t{FgwM^TJm`Sp{#_d>|`% zy%d7F%46wa?;7tQU5>8dz2^nmb>31c6}-V);swuYd8$_c>UiPw;gEXXTB-)U$(!B^ z&IaBKbd&BD?^7y{Z{*#j1-gm1?`weDJl7rwH1l4jYcnmpQ(IxLl~-B}&NklQ68O^2 zi|#|KgD0+rvQ8c@aN!N$wTA$Cm-jN=7Qe^ari6GGudxjR-MlbQ(0X{aKfsAz-tq-_ zjD5W0b?9wBFN$)s1H3)%us+B$P*81%XK@ARect@O!GS-WZq_*R1qonr;@3pM z!hZgoaIiS@pQr7J3xCc}0IvMs>0W^we}n`M@Ru=wJjlOIX%Bb4FO`#d@Qt%!;Sm1} z-S+V0U!#ghFaCMjGJ5kDJ_hjNAEM{(%Xg$?#$kT`N^tt|#nrHPgzxz>Sp4~?W55!? z-}@Dm1@hl105XU_O7q}R{<;qID474nS-5+QZ=|ec2!B7-0)+C

    4H>zi&5K!ue~y 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

    axYi9%YhvvSG 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

    mKXQ=sf*0!F^@KTuXpqVQ#kYC2RDQzzh0BSHYe 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

    u{e&5ezQqW$lV$ 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

    *iVqb2GbpoH&cXu8hU%QU8 zMR8~6#O}fVLASHp7#%b^-Tls}*KGG@M&m}~V5U84wf6M7gYoFbP56HEUF{QS{q9T$ zuNpVzy1kk9+}^=%yK&Im-)$cB#(T56WoLhUFuI8Y3U562kZx>tPqaF{ad&SYEgJ8Q z+MP~oZx`=wba1}vUT3at-LZr08P{(+irAv zqnX)*4xZcW^$unmyPZ~RzuW4~cE>gk_AXz)cs=R2cI!lEzdPGPQt8fKqdA&w&5hXC zGmY^qdb4{lJJySEM(lWJ4-@Hu6Eia>#+`$MW_xC@GivrmyL+9PUZ*)bGjlN0LH%B9 z&Ti4GE?^>J3eB9D>Ge7XlZ7+SmspVR8?cF;|GyRC!SeW(Cid!sHU;An2Y z*V=8jLceLT__UjA_D-~Sd+qLQXWZ`YHb)1|z3$xHn3J`!*Vx;i-LqbZ%Y#ES*F7=n z?9T3@n-8!q_U2~hW}BV4*_keu)VO=lowW(1o3tn|jW3M$9%Fa3PBdpmd(Ay`+rg-_ zzq{8Rw+}F7Tf4ovZfB;^w9&$R!0h99&7HvN**oa&@9$xpG2Qk@d+kQ6JGZ~r9L?;_ z_72n+v4MJ@-P`S*z_c76jA!vmj4XR+u7g$C-alye#+WU;759RG?2Nf4Ta6RF+0m#s zH#>_1foJw-=Ei$Hw6fK0?CoOdU%l?ay_a8lPUL zyW1I6+;c4r!$xqWsSR!y(BJMMMR`2F6Lo4w^tEb{TFHy&Xr z?PC$`Hu24S@sLE|yt zquC}WPGdAWz}y~#XjZgbcNcT5x3}8{aRnJ3cQ9Ge`p(|&-s~)B&3L?@EUCEHh1a)d zFkwh8=XU4DqrKkTF39@K{v0S(w+V`gzOTCdp+~M++vjFR2b~7G>7Y3WayYZw;23t> zySUmtn5&wpxHqR6x?OiPB-5%zCyT?JOnydEecDs9GcYm+dY8~tz z?Cp;*R}Wg4^w`F*wKh9k0Tumrb99Yc1y;$ZH)`$g&+TKUL(azz)>UiN!n8Y>IoR!D z$xYsj`+Ch2jaC~paj)In@ANP~_S*+Dn5hS2Ouf08&fHjz4>XJ{j#sW+yb+5V*Z0g3 zHS>(1HJO$Bm#*$TnBaL0-V?*et_!n#ZTtq^$4APg0-3lNkF~co+P#DWz#oG*;ALj$ zRrT7amb9cL#ZCHAS&mHkWOYq2>r<&Q31 z+Qrf6VDV}{hX0@bKh|nL?eO0_{C$THgKs4M?>nR}RP`PHr9+Bty#8{BCmepi!+-AZ z6%grIujBB%!`D0fF^50x@D7N4tp8aKU*&Mo;U9ZD|I*=Cu|3~ktNk;=AHa73-ui>J z+P@@xf35aE6aG-Gw#xcHT&sP%!_Q#-AGLafl(bkMucWjvZci zNKF*)qrQglT@Jt5;kP@)Ckg*k4*yq&|H5zIH-q&=v?(i!dewV`!IQ%7tA9MHz4nOJeDVQI8-t!#3#9`CnYaFgQe4WFK z4j*y&Hiuv5@H-s-fWx11_zMny-Qn*!{4*q%EbzKHP7TJ3Hxw+KOm?(^~zA&APB zm#OFA{WlzbrNgf$M7{6u@(+2LdJNY8MTgW|+zKK8_r3g=4xbA7pY@*a@TG)kbKA=c z4$nAzz2h%>`7tlQ#mnz;`0a$46Bv%#tsr)!n=Dfg!snwa)t;k-Xn%tc-#<%;e)&Q| z^yeu;^z$ZRy;eIe4zzofWk7uo+P}pz zpuP*=L5m8%=kB`!@f*B%Ipe4{8zj6UT+u7 zWUuw>XC3Z1)O%1_{fUoxnAh*C)!sx1_0Zc0v1xq`;TK|GAe^t&!oKrQSYD{rzL&6H ztNkz`p7)c4=!~BwT&mUnHQ{ot_HP~kTMj=?c(PXe144A#Cka>ZKlc?h`l*E2B%e)) z&b*Uw4f`zNI@S~62F8aFoqR9h8H@wrpjKNaM0>Ufhqapaxh>2imbYuQHxQyz-sJV( zLU^uL`-g-Wr1ubFbN*(+FRInPi|}=|+WQFc+z$|bajo_fUKT%s>;KBj)I+k~zj63$ z4lz}A{TU811y#P&A*PhdFL8(|qH-8tuofy~Xa(mTqAOKK7YX8%1p|K(#(nJ9A9VNz zhmSaXv%|MKe22rYb@(2KVIF*km%rQL`y772;g37~ki!o<`~`;}arjY(A9MIS4nN`W zj~xD)!@qKPi}&kO9NzBmxelN2@I?+^=I|beO@}>)_c`o4TyePJkajPQ>+2kj9A0pE z+2M7Ek2(A@hi`NEPKWPy_>B&~)nVYjzQ@Zy;P6Kre$e61IQ%(>zv%E+9R9k)-*WhI zhk=j#6EFXT!~g2=i1TAlbNDQW&vWwzTM03a`<%)-|O((90q>$`@H;qhd=7@ryTyQ!=HB;_|{+b@^3i& zZHK?-@DCmSsl&k6{2TiRNr!hK*7zt-V<9DcLIz*m2_m*3~`0}g-O;fEZ4*kRziKjP(& zI{cW!-*NZ}hkxWS@a2EyF|3T{(!?Dari-pKjZM{9R8xi zUvc>B4u8wx#~uEG!ys4CeoeaeUmYI7M#b{e96rn8^Blgw;fo!9zQZ7gw7op%@HGyX z9G-S~#^E`KU*d4j;YEj69ny}@cD>QzS2%pT!*@CSI*0Fd_-ziq%VCgn-tXlfb@)>b zf7ap8JNzYwzv}Qe9R9Y$-*fnf4*%5QCmsH^!zVr2+W!oP&vtmH!xuVyiNj+KzrbPF z;VT`^J3Q%d&Ee2tkiT}kJa+h?!#6m5#NnGAzSZG79Dc3C_c;7!hu`7wyB)sI;RhW4 zxWf-Q{IJ7caQG32A9eUKhri>HehnP&KXUkI4*$yGEs!yYe~Lr;ZL<7ahtGHTB8M+? z805pImwOKHbJ%yd;&8*^w!_ys967w;@Up|}4j*&)We(rw@SP6d?eH5NeycKlt?^ul=Bxf7IdsWt{<*^-pWWv2#4{W|$KmrG)*S}9jCLFLSJ&aI9QGZ))?tvx&U<;s;eo@; z4sSRNa@bqE{0@iz$l>2~{(rjneX8}#_2`+$etEvby2HZw;cHO%MNcie51p+IDCi0a{Hd`*Y9*VO+VCdJYKEufeKG>$str|Du24q|9_j_ z>0A6ezSH6NI()ywA9EP=P5;WvzvwXNA%DZm|H0uOJNyfW|IOj2+h520z9+ih{TCX< z#~gmS!?!z>odU!!=%=43Isq|L>*98YpXu-g4)1apzW-CD!$Cg}(}JEqa`=G5s}5zC z!FRpc%U|j6oeux8!}mJ;c8A~X@cSM9h{Kas_cZ5E=x@RO^iGGL=P>Bqga1L>ugh+O`tx2s zUVghn#-*@5vgZJPiLqeuwmfVf_y|4ECI$SO2$u{Wl!`2Zx_<_{R=|KK;LW z`AN8cf0LKr>hP-_ zzT4q9ISl&pf9mD;Is9RVA9TpL9DYyGlmD`pKkD!|9e&*5e|8x3<+EOxQ5m$0CvvA`dS+!F2JPXc+!a}a_1Kg_J9uYzFAn4gj%U#RJ=eX2 ztGS6g8MJ#Jcc0@`-r_w5?cHzOpBdaf8=4Urv~$OECuJID;=j*X{rmG3v~L%4mt_^! zW;L08MIGN zb!BF5Lq~JRWfG=lMh5NA z`P@ZWhLu^1LA!HvchGY{UEM*?0}XZu?adS2GdQ2ixRyaX^KSPcp5z5yW6-|*!2O)> z_?16|2y_bCl_R@@o-<0|PR_Ip+LLp+3$g^uvl@eTte)HG_8I@a~}JpW?U^GZlmO;cV`_ zEW*;P#GqX`==rE-UT@1T?9HG(c%*v*r*j^cGH3_h?B2zL40^umygO+Bz3slwXMD>q z4BCCe{22Inio_U<&tweRdo#OpvH**-9D{b=|2?<$&&NR{ueW3ec4yGOJJdaflR1kE z8MN!JcW>if9^q*Q?YTGHcln4f`GG+@Zpcu9KH(UZv6+ZL`)zu6R_0-0mSWIuTf<$C zP1%N>*^2`?g5x=jbGd}8xrsY@fX8``S9y!~_>^z>nZf@VlK=g6J2WFQI^!`Z(=Zcr zFh7g2EUU0K8?pu4vm5(z2uE`gXL13Ta~-#G4-fMcFY-F?@F8FDJ^%d!aQ^rCpJ5q= zv6zr4n2uSPn}t}C6pcJeejnf$e}B;TE3&)u zvM@_BXom{geS^Ml(ZFAC#y0H4pgpRedk9A{Xos8Tp2J04!T;OOi9Yk=zUBY7-2G!+$$ppu>MVU!cQ(J71u~e>-2G!+$$ppu>MV zU!cQ(J71u~e>-2G!+$$ppu>MVU!cQ(J71u~e>-2G!+$$ppu>MVU!cQ(J71u~|LZ&7 zFZRC7%*g^Q&T_2EI&8$2?7;5q$Dtg<$(+T7T*39+#=Shk)4aqRyvs*?$q)SYpCR+# z?>mHKI7Ve`CSppaXIAE6VU}V=)?ht0WgB*8FAn4gj^{Ma5^#6UIj}aN2@tBlpn29-Lj$65h zhk1$@d7XFokT3Y2-$V-Z3Bj<8!dOhm6imk~%*{e9$qKB_x@^MM?8KfNz~LOnshq>b zT*Zyt!TmhOv%JEa{F_hsnx7c#pCS8y-{)flMq^wiVQOY%cIIPImSJVqVgoj3J9cFs z4(2FMipM1dQe8;c+AxfarPmIi%Ou*z!%U_v`1zCdSS&hH3 zFn5me7*_f9_ zSelhsll9q*ZP|srIfx@UfzvsUOSy)dxr+yRg6H`=Z}UE%@h!jb`=0}y!Y~qJFg}y< z7iMNo7GQCfV^!8+BerA*c4t2h$C zSzh5y{>>+R%})##Gtem%BQP4{G6_>NBeOFfi?R$Wvlbh$Ioq)-`*1KvaUy4MK9_MV zw{SNP@gy(s8vo=2KIc1r@If2tTk4w3Ro4Jbzd4lKpJ8$zopYbif@cTG{PGJ~{F&Ll8_zN>L zCkwDR%dsl!un}9b1G}>yhjI)ja~2nJ1=n*M_woo&^Ad0HE+6qFKk(bQfj%J_j!_w# ziI|elyCT%!Q%xw zg=R!XXFMil8fIb+=4UaMWfj(DL$+Xhc4J=-;b>0cOfKMZuH#nj;bETQMPBC}KI99& z=Qr^KeL^rSqc9c|G6mBy3v;s&OR@s1vo4#kH9N5<2XHvYaVqCIG@Y7mRq=+ zhj@|~c#VJZ0iW|7zw(EKflfa$GGj6UlQS)UWiA$E36^Iy{>H{^#g6R3{v5`!oWj{$ z#FgB@?cB$sJj2WUgMaZcU-2WqOBCqyBg6A&#$jTnVg_boUKU|#R$@)oXEU~C7xv~L zj^qSR=R7Xu8gAw;9^?t0=kL7D`+UZ?{KD@O2RemeB*tKTCgU&6%$zL1;w;CitiwiZ z$qww!ejLg%oXlBV$Q4}AZQRQvJk3kI!Ml9Km;AtQlLY#NWH?4;Y$jq#re{{>VPTeH zMb=o*cm89LK4g!^K?1joiWgJjS!U!khe?PxzXj7%X|9 zQz%AYG{$8Tre;QFXFe8X8CGU3HehqMV^{X!V2hjd@vwrCEtJS)a|=mR;DJgE*2CIGyvjlxw(| zyLgZ%c%HxWHt+Kp-|`E;PZj7ChLIS9@tKUjFf((q0E@F6tFjIou_ZgOJNt1c$8a)d zaUoZ5J-2Z$kMJ}v@doem5nu8HzfB$J6O!Q=m9d$KDVd&GnTLg0iWOOd_1Khc*qOaJ zkRv#r(>Rw)xSE@|lLvU5=XjO3c#lu{hMyTcO`ua~Mr3rxV^XGJCgxy%7GqgfVQn^K z3$|xB_T>87azTkWQ`-T_)?vWuFmQfgs37LZFn1#7n zh$UHp)mfKK*qWW#lLI)M<2aRbxR|TBkvq7b$9R@kc$0tg319OQgQX303dIPF#<)zv z)Xd22%*UcE!^*7125ioD?8-hI%u$@k8Jy2$T+1!o%|krN3%tfZ`GC*)j$iphxRw)xSE@|lLvU5=XjO3c#lu{hMyTcQ{dk>G$S%P<1s1IFcWhyKZ~&} ztFSizc~9>D^=-lS?8d$v!qJ?>nOwl-T*s~4!^1qqi@eS|e8?Ak&u=mZ{&_<%ETb?M z6EX$UF$;6E5KFQGtFtbfur)ieCkJpi$8jp>a4}bLBX@8=kMS(8@FxG}6Tapr2K(o0 zqMBwqi&2V1EwdSWe+=F5*gV;CAlg zQJ&#t{=vWan6LPe-(?N-`H|uIGvhEZQ!xXxF)xd-G%K+t>$4f#vI~225Jz$Xr*j^c zat$|g7Z36T&+~WQ=6ycnTYlm9*#e!yFcM=hK9lhmW@b(nU~!gXRn}o6wqyr(XFm?* z7*6IaF60WX=Qi%;5uWBH-r!w6;!A$ux7h=ILNXkqGBy)2CDSu2^RO^Wu_9}*9-Fca zJF^!DasXs7Ov*IO#2n1eVl2xl ztj&gO!S?LNz8u2QoWz-2z~x-Wt=z-IJjIK=&O3a_7ktleat8W@U|2?BEGA?MrehZ7 zW+9ej1y*NWHeqXaVowg>aE{|t&f#LN;zsV^ejejlUg1st%_n@#PYjkT&?yunFdE}B z2~#s8vojxyvJ5M;78|fR+p#PAa4<)4B4=vhEXWcp&uaXQjoFGF*@OK#jAJ>4v$=>Xxq;ick4Jfim-z?(;$yzz zM}C(l(C0^n=g*A8#7xBu%*MPd!qTk7nyk-eY|Ad}%|RT=37pP(T*@`v%w0Ul6Fkq~ zd7Jn7jBojc-{%c<3d2Z@!T3zZUznLWS%Ae^j#XKQjo6YM*q!}2lw&xVv$&8exSrd% zmq&P-mw1DB`G_z1f#2o}^a;sujLO(d#FR|Wtjxp0EX9hf!Fp`UHtft^9LNzI&uN^? zC0xx-+{ptx&U3uVTfE1oe8bNSoa5Eq zY|T#W$pIYBah%FIT+CJ6$Q|6zV?4_%yve`$gs=ID!3qXCg<=FoV_YU-YG!11=3`No zVP)2012$(nc4Z$9<|t0&49@2=uH_c)<{_Ts1zzKye8A^?$FKaMP@vOKjLeu!z~oHJ zUzv*qS%T$RjlZ!mTd^a1us?@!ET?cb7jY#wa69+$D9`XR|KMMI%vb!#f8VS9fBQef z^Jm6kVy0pSW@BC!VQE%kP1a{Kwq+Og<{*yb1WxBXF6A0-<}M!O37+Tgyv_T3#<%>! z?~4RFg<&MdV0GE#Bi(zTsyEFBa$&nh_bD@tBlpn29-L zj$65hhk1$@d7XFokT3Y2-xLq@3Bj<8!dOhm6imk~%*{e9$qKB_x@^MM?8KfNz~LOn zshq>bT*Zyt!TmhOv%JEa{F_hsnx7b~M4(eBMqo6?WfG=lMrLO|7G)V$W-T^gbGBnw z_TgZT;zZ8id@kc!ZsBeo;z?fMHU7y5e9m|L${$JwI{n1RjL8H{&b0iMxmb`TSf17R z8ym9~JF*A+a~Q{R3TJZ>S8@Zlb03fL3@`H!{>8_9#gF{1RG`m~49}k#hl!br8JLZE zS%jroi8WcD&DfS**qehmk`p+c^SG32xS6|nkSBPazw`fPg;|OfS%dZ1lx^6Vy*Q8~IG)oumrJ;so4At)c%0{WmA810Px*$Q z8N6(uQ)otHbjD*+reP-LV15>3Syo|fHe?I7XE*lc5RT>~&g23v=Q?iX9vO9H(*)7jqRiatHVG z7|-$wZ}M+G;cI?ku=0UUp%{VD7?(+yni-j$`B;=?SedohfX&&CUD=0&If@fGgY&tJ zYq^EHd59-@f!FvaAMiQf@hg9*5a{$1BQquwFgermSLR|tmSA~S<8N%tR_w?g?9X8w z%PE}AMO?`Z+|GSG$}_yoKlm3P^A$hxyNZE6KQcUjW*jDFDrR6d=4BCWO`<0 z9u{UPR%8v_m3w%Yr+AUqd4~`Ag75iF)j*#R z49h5t#e_`3bj-rsEX0zm!0N2aCTz`4?8yNf&T*W|Ib6(D+{hi=&tp8xE4<0S`Gl|e ziNUG`I)!2cMq^wiVQOY%cIIPImSJVqVgoj3J9cFs4(2FMi zpM1dQe8;c+p?aXxPmIi%Ou*z!%U_v`1zCdSS&hH3Fn5me7*_f9_Selhsll9q*ZP|srIfx@UfzvsU zOSy)dxr+yRg6H`=Z}UE%@h!jb`AMqtW@Y`B}J|P*7Q5l@oW<*A3JSJrtW?~NJXEBy# z71m}$wqSd9V_y#8XinlxF5q&m<5uqBVV>eeUgsS?NBeOFfi?R$Wvlbh$Ioq)-`*1KvaUy4MK9_MVw{SNP@gy(s8vo=2KIc1rlhUd?W!^BL*49v#7EW*;P#G0(nW^BtY?9D+O$qAg!d0fgh+{|4($P+xz z-+7z&`HXM*h2Pf?bPB^rjKTO!#$TA3Iaz?kS&mg%hmF{h9oU`yIFw^JnX|Z%E4ZH9 zxR*zGnwNNkcln4f`GMay2=ocbaE!{>OvIE-&#cVD!Ysv#tigJ0$~NrGUL42~9M5T- z%OzaRP29-?JkE2x%3Hk0r+mZD4Bjx%DKsN8I^!`Z(=ZcrFh7g2EUU0K8?pu4vm5(z z2uE`gXL13Ta~-#G4-fMcFY-F?@F8FDJ-=xb=o5lr8HKT!kSUmsS(uxJSdtZ3opsrS zt=Wk^Ie^1Cj#D{@i@Ay$xr6(8jAwa;H~BZ8@HIa%SmQvaP>jH6jLRfU&5X>>d@RZ` ztjt<$z~*enuI$6X9L0&8!TDUqwcNtpJj9c{z-#=I5BQw#_?16233U32kr|T-n4D?( zD|4|RORzkv@i#VRD|TcL_UAB;^jI_GgI*Kjj;@gPs|Jb&kH-sdyE1y`GCi|04-2ytE3yXbu_@cIGkb9$M{qo+aW0o|H8*i55AZn8 z@hWfe9-s0JKQnlXK&Q}*$mop6q)fw1%)$ID#HQ@qIQyu*il!T0>8WuQ+8hGi7SVnU{1I%Z*R7GgqU29lNp* z2XhoBat7yf8P{?Pck>WW@&d2%Pd?ytzT;Q^&^plRCq`yWCSY==<*&@ef-J%Etj6Ei zn6226J=mYaIF?g5n~S)T8@QeOc$8;&nSbyvKISWa(T`%v8+4Y|P6d zEX_)+$@*-@w(P>*9K?~F!0DXFrCh_!+{J@D!Sno`w|Sq>_?BPzecM2%FpR_)jL&5J zg_)U?1z4QrSe13yh%MQH-Pw;rIfj!tiwn7e>$#14d4#8Vi8pwckNA=w_-(sDpO6g4 zsEo}-Ov&`j$~-L0Qmn`ttjDHo!_Mr*fgHi{oW{9a!qwcwojkzfJjbiN#e00pH~h@t z?E{@cGa{oi9+NT+GcgDAvlz>=3Tv|=Td+O5u`h>kG$(N;7jQY(aVz)mFi-I!uk#Kc z@&(`Xn+}0KAsCiX7>fy+g6Wurxmk!MS%KAAmrdB3o!FBDIGp1+m2tdr4)pnv;rTP;Ffmgx1G6zNi?B2+u_o)Y8QZc8 zdvg#+assDw9+z?rH**&c@&wQGci!fGKI2<{;rCqvox(5@V=z9G@fT)hP8MKsmSa`c zVI#I=2X<#a4&@k5<}5Dc3a;li?&T4l<|W?XT|VMVe&DxV1ARg=9HTNe6EP*zGb{73 zFiWu_Yp@=hvJE@47YA|#$8#FzatT*+6L<0ekMkU_@)qy$Dc|rjgLeyb3eAX&&Uj49 zG|a>t%+F#h%POqRhHSz1?8d$v!qJ?>nOwl-T*s~4!^1qqi@eS|e8?Ak&u_X1`h;Lu zMqw-_WD2HZ7UpIlmShE1XI(a7Yj$E!4&ZQ(<5bS!Vy@yw?%;kN<5^zeP5#X%e9cb` z)+5j<6eBPi<1z_TGb6JzAB(aKE3+0GusPeYEBkOTM{y!&a6XrDEw^wt5Ah@~@EZT* z13u?Fe&r861D$?iWX5CyCTCjy%3LhS5-iVZ{Edy-iXGX5{W*+dIfb*ih%32)+qsWN zd4`wy2mj(@zT!uI*DKKHM~3ImjKjoC#SF~Gyez`fti+nE&t`1PF6_-g9LWis&UswQ zHQdZyJjfF~&)<2Q_xX%(`Gw#24s;5`NQ}YwOvYcBnK@a2#aWJ3S%;0-k{#Hc{Wz3k zIGMA!kSn;J+qjoUc$$}ZgLnCeFZqGr_6hU}$#9Iy*i6KfOwX*$!@?}ZimbtUY|1w5 z%w8PG5ggBHoXaI#%}w0N13b=iyvkd=$ESS5&kWu-&?z({GCJciDbp|$b1*-Pu`H{w zHXE`9+p`<{atKFr5@&J&mvbGrat{yl6fg2R@9-gC@IAlj7w8j$VHt(7n2;%$j#-$S zg;C3?nfH<1-n5VP@uJ0TyRDR%IPFVoP>lclP5@j^Sj^;zF+AdT!%h z9^q+T;tk&ABfjJZemgkOCnUo$Dq}MdQ!+iXG7k&06f3d@>#-@@urqscAV+XKr*STq za5Xn^ClByA&+#g6@gAS@4L>vZkU*! z%}Jce1zgT`+{!&X%u~F`>%7B@8#$rOIU^-@DZWdxmR$z73WfQh$ zC-&q34(B*dc^d zOw3fwz--LRA}q~HtjYRp#v(k{DqmBlLc6uU9><1jH(F$1$PFN?4= zE3qc)vl-j63wv`AM{)wEa~_v+4L5Ta5Ap=h^LO6neLmw`e&P2M0-eGz5@Rqvlkpd3 zW=PUb8wGa}#&+0FUz=ukse}@hRW%GlNeG zbPCOgjLvvW$~4Tx9L&#REXyja&4z5j_Uy*K9Kz9@#F<>c#f!YoJAB9& ze9vzt2l|9ySVmziCS(exV;1ISA(mtXR%cx{VQY3`PY&R4j^k9$;bN}hM(*H#9^+YF z;Z6R{Cw$FM3^pauDHJ0x8sjnvQ!^v8Garkx3@fu18?ZUsu`Byoe|$Pz5iYW$6j*@_+6gZ(*-V>yMh zxri&df!n!{M|p;q`3L{vW4_`?em5=9=SPO;&y2&wOvMb$#=I=T(yYXqtj}g_%P#EA zK^(~moX&Y%$~D}~T|CGWJkQ^GoA>#QZ~2AaPY-ko!$^$5_)NxMn3*|QfW=vkRau9P z*peOCo&7kJV>p?!xR5Kjp4+&WM|hf-c!PKOh%fnp-_8j13CVDb%GgZAluXa8%)`Pg z#fq%KdTh!z?95&q$PpaRX`IU?T+L0~$pbvjbG*u1yvL_}!_N#pGtenCBQiSUF)7n9 z6LT;>i?J-Lur?dA1>3V5`*H|Ja}sBA0heyZJgf0HHfAe!WDoY|FplLE&gLSnHwSSfCvZCFaVghu zGk5VIPw+f{=WX8SGrr{)em^hJDGVbq2IDgse_>|kWC0duIaXyIHeyS5V0ZT8P>$hb z&f-F@;CgQ3ULN6TUg8bjMBwqi&2V1EwdSWe+=F5*gV;CAlgQJ&#t{=vWan6LPe->nYx`H|uIGvhEZ zQ!xXxF)xd-G%K+t>$4f#vI~225Jz$Xr*j^cat$|g7Z36T&+~WQ=6ycnTYlm9YXY6Z zFcM=hK9lhmW@b(nU~!gXRn}o6wqyr(XFm?*7*6IaF60WX=Qi%;5uWBH-r!w6;!A$u zw`&7^LNXkqGBy)2CDSu2^RO^Wu_9}*9-FcaJF^!Das$2h>Xs7Ov*IO#2n1eVl2xltj&gO!S?LNz8u2QoWz-2z~x-Wt=z-I zJjIK=&O3a_7ktle)(858U|2?BEGA?MrehZ7W+9ej1y*NWHeqXaVowg>aE{|t&f#LN z;zsV^ejejlUg1st%_n@#PYkvp&?yunFdE}B2~#s8vojxyvJ5M;78|fR+p#PAa4<)4 zB4=vhEXWcp&uaXQjoFGF z*@OK#jAJ>4v$=>Xxq;ick4Jfim-z?(;$yzzM}D^{(C0^n=g*A8#7xBu%*MPd!qTk7 znyk-eY|Ad}%|RT=37pP(T*@`v%w0Ul6Fkq~d7Jn7jBojc-)|0d3d2Z@!T3zZUznLW zS%Ae^j#XKQjo6YM*q!}2lw&xVv$&8exSrd%mq&P-mw1DB`G_z1f!}Tk^a;sujLO(d z#FR|Wtjxp0EX9hf!Fp`UHtft^9LNzI&uN^?C0xx-+{ptx&U3uVTfE1oe8bNSzBSM( zG$S%P<1s1IFcWhyKZ~&}tFSg3vIX0-8~btyM{^Qqasiif9k+515Azf+@;dMEAz$!4 zzu6Y(6M|tGg|V2BDVUB~n45)Ik`-8;b=ici*@-F z#FM=W!|5a5H!DAW!f-f9Gx9=QF72)&t&|CnVFLXSe)fpm37#NE!lzH*^fgxhLbsq z3%P>pxs7{ygr|9lH+Ywi_>v#^?V&)QkPOGDjLk$$$@I+1JS@yotjHRy$EIw<&g{j3 z9KrFN#<^U=)!f9LJiy~T$E&=>dwj|_{LJ8o1D!%MBBL`NlQIo6F$eRr7|XH>YqKF+ zusyr6FNbh6Cvheha5>j;EBEj)Pw^tJ^9~>K1>f_VBY{347?x2OiwT*6>6nGNS%@WB zfz?@;P1u^9*pmY|oZ~o^bGVqRxRE=!pT~HXS9p_u^9f(`6N4QMbPB}?jK;W3!qm*j z?99iaEW^sI#RhE7cI?VN9L!Oi$Qhi^Wn9ZG+|5Hg$qT&3Kly;q`Ho-t!?8f8pBR}j znSjZemcKF=3$g^uvl@S6W42;P_F#Vw<5*7NY%bzTZs2zA<58aBW&Xjx_?WNwk>4E; z^!btD`7`4%F;g)EvoSA=urw>NChM~q+p-ILa}Y;z0;h8xmvRj^a~BWt1kdw#-sXKi z<6C~=_a_3K!Y~qJFg}y<7iMNo7GQCfV^!8+BerA*c4t2h$CSzh5y{>>+R%})$=CeSGqBQP4{G6_>NBeOFfi?R$Wvlbh$ zIoq)-`*1KvaUy4MK9_MVw{SNP@gy(s8vo=2KIc1rOvIE-&#cVD!Ysv#tigJ0$~NrGUL42~9M5T-%OzaRP29-?JkE2x%3Hk0 zr+mZD41O`tDKsN8I^!`Z(=ZcrFh7g2EUU0K8?pu4vm5(z2uE`gXL13Ta~-#G4-fMc zFY-F?@F8FDJ-@jW=o5lr8HKT!kSUmsS(uxJSdtZ3opsrSt=Wk^Ie^1Cj#D{@i@Ay$ zxr6(8jAwa;H~BZ8@HIa%*yTW{P>jH6jLRfU&5X>>d@RZ`tjt<$z~*enuI$6X9L0&8 z!TDUqwcNtpJj9c{z-#=I5BQw#_?16g33U32kr|T-n4D?(D|4|RORzkv@i#VRD|TcL z_UAB;^jI_GgI*Kjj;@gPs|Jb&kH-sdyE zWO`<09u{UPR%8v_m3w%Yr+AUqd4~`Ag75jw zjX<9e49h5t#e_`3bj-rsEX0zm!0N2aCTz`4?8yNf&T*W|Ib6(D+{hi=&tp8xE4<0S z`Gl|eiNXE|bPB}?jK;W3!qm*j?99iaEW^sI#RhE7cI?VN9L!Oi$Qhi^Wn9ZG+|B>P z-d%uORsQ>;UvzhOcQ?`<(jh6`(p}P^ARtIe3JQW!N-0PR2m(?{DM(6p2?BEGVt&@S zZ1?{A>~qiA=iYmc<9Q|@-Z_5j9b#+%2u_L>)ABS)>$8!p2aRHZbCD(BicW^Hc^90ZE5^wSWpECTpU_Q|p zmr0nKnV6FWSd3*^g|*m#&DfTm*^2`?obU2|PUl>H!q537zvfnc#~=6;f8lvvBQ2F&Ll8n3h?Xn}t|{<@q}6un}9ZJ-f0G2XiFHaWZFe zJ{NO2*Ki}Za}N*l7*F#euk#+CFyyyjK2aE(iI|cZn4S4pl%-jTHCUfb*_xf$gZ(*_ zV>p3RIhzZ)l&iR&o4J$wc!Vc;mX~>p5BZD{E(LRn&Uj49G|bFgEXd+4$EvK&hHTDu z?84q0#1S0JNu0rXT*PHu%?;ef-8{gfJjDyV#=CsX7mR#4m{Tk!WD2HdHs)m!mSRO# zXFWDyD|Tde_Tvza=6FuwEH2;@uH-sy;tuZRVV>X_UgAwY;8TXb63izW<1z_TGZS;N z0E@9KtFRUuuo>I3Gkb9$hx1*&&*_}YPxv{%j*S;bt(W=#0mtOvB8~#eyu(a;(bQY{=$p$1d#6K^(!c zoWvQN$32mFv9@l&qgT7JWC`8^NuIDh4DyuthYgW>K5^NGqh zOw3fw$Q;bi*I0&?S(9(@O}61%?8yNf#&RA8^D}&4z5wcI?959K;bE%SoKUd0fP0 zT+I#K#@#%?qddh6yvDnH%omLOFql&;CS(exXEx?#5td>_R%bmnVJmiIclP5Dj^=ny z;VdrT60YPrZsHE^9_O$8jW>9oe=ywRU_Mb9hl!br8JUCm z`5McxGHdb;zR5Oxi#<7j!}ty-avJCGV}8aj_!YNs7x(i={>*c{!rOer=ZyFym{SbK zXELT`7UpIlmSB0l&N^(w7HrS1?8Ctv$#I;_nViqXT+TJz$nD(2gFMF5yvXak$0rQ= zBbZMV#%3a>WCmtuJ{DzZR$>j-XH&LjC-z`}4&@k5;8f1$LN4VhuIFa%6wjrS%jrnk=0p`P1uSZ*`573grhm0Q#gwYxP&XY zj+?lHdwG~Ac!rmFlMncm;hzWdiN?50!qm*foGid%EXyja#RhD~w(QJa9LV8(m+x~r z=kgPN&M)~jxAHswz@PXF&+{tp@OS>nNPh-%ipc~_&UDPmJS@zTtiWol%f@WU4(!Ih ze4C^A9zWoR{D_}&1=sQ$e#`H9h{yRWf8!0_=N}CBBA8E9#$jTnVn*g*e!j*stjwBx zgKx48-(pV=;4r?!iJZnc{FtBd3x35d+{OL;kw5bsukbb>@i`-ggbN8@BqSsT<1-o4 zG7EFF5KFK;UuPXQVhgrsSN7pxj^sE_=1k7#VlL+zZsd0E;XxkbXapF=r@6F8N#xsXe_itD+VJGqZXc#>y%nYZ|m z&ln+mFsJB@$D~Zd%*@4tEY5PQ%Gzwm=4{6k13b!8 zyufR`%g21d$Pt1$#bQFHV0va_UKU{~R%CV7V-vPwM|NjF4&i8y=M>K30xsc7uHz=| z;9ef)37+94-sA&5W%!7}e4;TflQ1Yq0^Fu`N5Z7YA}U-{t$9&bj=A zpYuz8&8_^7Kkz61!t=b!JN%u0GE$^qPBEE)$(fE>nTLg0k`-8ub=jCL*@4~Imv3_v z-{S}TkRS0=uHagJ!*BUL5AisEN6LYcvi?J-LuofGz8QZcmdvPF#^Ig8r>72_?_&LAi*WAkQ z_yd39FFenyyu;u5CnLoS<`k0&n4IaDm3dg0C0T*hSeK32k{#HMefc&=@jZUP5BU*4 z8C>hQtZx6NRyvh$)$Y*_n?;S(=qt zgZ0^zt=Wk^*q=i=h7&lIv$>Ez8jQ@p@yyvxUY!N~D~ImKc^ zreJzzV_p_vDOO~4)?*X4Vn=poKMvt&j^`B4;sP$=O0MH3?%-Y?<_VtRCEnx%K4tj$ z!F-}IE|V}dGchL%uo%m-3Tv?eo3SlBvlj<)IN#;_oX)xYgrDe=<^nU`{cafXSJTS(%50S&|i4jdj_WE!lzH*q3i}6yM_q{E#2CVI#I+dv;|X4(3RX z<7Cd{d@km4uHi;*=N=y9F`ni{UgteNVMyX&K2aE(iI|cZn4S4pl%-jTHCUfb*_xf$ zgZ(*_V>p3RIhzZ)l&iR&o4J$wc!Vc;mX~>p5BZD{k_2;#&Uj49G|bFgEXd+4$EvK& zhHTDu?84q0#1S0JNu0rXT*PHu%?;ef-8{gfJjDyV#=CsX7mS=Vm{Tk!WD2HdHs)m! zmSRO#XFWDyD|Tde_Tvza=6FuwEH2;@uH-sy;tuZRVV>X_UgAwY;8TWA7R)Ca<1z_T zGZS;N0E@9KtFRUuuo>I3Gkb9$hx1*&&*_}YPxv{%j*SA$2gP=#0mtOvB8~#eyu(a;(bQY{=$p$1d#6 zK^(!coWvQN$32mFv9@l&qgT7JWC`8^NuIDh4DyuthYgW=K# z^NGqhOw3fw$Q;bi*I0&?S(9(@O}61%?8yNf#&RA8^D}&4z5wcI?959K;bE%SoKU zd0fP0T+I#K#@#%?qddh6yvDnH%omKDIha!{CS(exXEx?#5td>_R%bmnVJmiIclP5D zj^=ny;VdrT60YPrZsHE^6n#ySePYQ zfz?=-joFeN*o}SpHb?P2e!vg;5kKV$uH`rUmf!ObkMmdl#v8oPKNv1sFrTQ5!^BL* zjLgCOe2ryTnKk(a-((xU#hx6%VSI-ZIgNApF+bxM{EAz+i~IQ_f95$};cY(Rb4JV_ z%qa%rGa1t|3v;s&ORzj&XB{?T3$|xh_TgZTi9Oh#Lpg>MIF+-xkW0CW>$#abxsOM9 zl4p6DxA>6H7$Ijcr|68wq)fxi%*BE%&T_2E+HA;xVnU{1dS+u@7GWt?WOdeK6SiVUc4t2h;b@NM6wcxT zF5yb9<0kIlULNKNp5Z0lqU0EjzOp2XZ*y z<@=n@x%`Bm^Gklst^AHZ@F)Jl^SsJC{GER?Ql4N=F`0nLnT}bRhlN>^63wZ@j_#{Da~02J?x^I84k`%*Y(f&(~On zm06Q-@J+ViTkOdJ9L9Gzk<&PbAM-PQ!LPW5ySSe}@@Jmo72f6}K4-*y!JJ|+K9eym zvoJRcu>{NWb=F}cwqSd9WgiaaNRH!V&g6V9=5ns#MsDXG9^^5e=0#rTJw9Pb{$M^) z7@LWhk{Ott`B;>tS&21RpH11Co!Eo@Ih12Kfm1n~3%Qi5xSpH2llyptCwZ2ad5aJE zj1dY1bBfM*Ov*IO%v>zU;w;Citj&gO&UWm=-Wg;2B=xO+MgLhA$M%CmQ222~#r@bFu)7u`H{w78|e`+p;rzaUh5DUB1uhoXb!6 zIltuB+{*9x1ApQ#JkP7V!{7NQBNYzj6q5;B@;&p#NhNHCwMjKjoC#f;3s{CtgNSeZ5X2H#{G zzQvv#z+rrc6FH4@_%T1@7yOD_xQqMwBY);OUg2#%;&VnU8q6sM<1-o4G7EFF5KFK; zUuPXQVhgrsSN7pxj^sE_=1k7#VlL+zZsd0E;XxkbX$53avlDx;KZkM*CvYlfb0L><71wh!cXA((@FdUjGH>xApD{wQU{28) zk4c$^nVE|PS)Aoqm9^QB&DoA!*qehmf@3*}GdPcnxQwg0f!ny72Y8gHc!Ae=myh{^ zk&6d&ip7LX!Su|=yez^}tjOxD$0lsWj_l5U9Kz8Y&ncY61zf_FT*pn^!M!}p6FkF9 zyvYZA%J3zE`9xz}CShu3VonxdF_vW&)?x!TV_SA+FAn5zzRUMHopbpKKj)YHnp^oD zf8bC2h39#dclbO1WTcY8oMJKolQSK&G7k&0BrC8Q>#{LhvID!ZFW=@UzQ+&vAwS}$ zT*0;chTrmg9^!HS%HMc{_xT6Il?vt)m2sGushE*Dn4hn)3@fuH-{6~U!?)Oz12~ND za3ZI14nO8+{DNO`3wLopf8@_R$1A+eM|{qRrGq)eV0a%)@N<62uep`q@dy6IUwEEZ zd56FAPe!T`%qb=lFgepPEAy~0OR@s1u`V04B|ESi`|@p$;(PpnAMzu9$`xG8Z}=_0 z=OG^Ful$WSc%OeTT*Y8MQ5lDcnTi>igZcRy%dj$Q@(sSpHhhacIe^3X4kvON=kQ~G z#xM94w{REt^GE*7bG*Xae8lIBSSgrO48~_Nrezl9W+9efdA`m%Y{V99&#vsl!5qnP zoXnY=&&6EMHQdPU+{1%B#?!pW>%7M&45=KeSUD%t0ID%t2i8DBli@1!dxq;ibn+JH5r+9(ac$bg)f|08RbBe`;Ou_Wb#=I=T zQmn}8tj8v7#g6RGejLKl9M377#RXi#m0ZV7+`+v(%o9ArOT5Vke9G{z2lI)>xJ<&- z%*325z+x=RDy+o@Y{s_i%w8PG;e40xb2{hp6MoJw`8BulJO03*_zTbTD(~=j{>ezy zf;q)x0w!lVW@R20W=U3HHP&Tgwqyr(V_&|_QGAad@I!vYPq~6?`3=A2_dLYo{FT4) z2JiC^hN~XTCo1DGF;g)kb1*+&V;NRvO}@c5*@kbiCkJpC-{C|~;~aj>&-ewu;uh}W ze*Vaxd5%|jn~(UM5o-i*^fgwn&UZzv$%juxRUF*i95KLhk1f$c!@XpfKM5|PB5QnjLRfU%}mV60xZU| ztioDsz-DaA&g{j39L{(7KBsdoKjG*6l3#NxzvB=5iNEkXuksFm=bwyJH<(jQCSY== zV^-#2VU}bCR%2Z@W=nQpH}>V*9L4we0YBtN{FE!Wmf!GOe$PWZ&R_W(Z}2|TPZ;t>FrO%l%|uMe49w1aEXvZX#2T#6rfkhl?7{vV$}yb4shrJ)T*_5k z&&}M)eLTXGJj=_x#fN;x2n~WcMQ1!FWg2E?E*4~QmSa`cWE3@`B}AMh!|Hwxwxjd7WTshNp6S%Ae@mQ`4b4cLrr z*_pjKki+>d-{*AB;EXF%kO!J$N4LN;|<>D9}L$dm`_y3VPd9Y zM&@9CzQ!`F%$j_IZ?X;FVowg>FuucyoW?o)n4j?re#I@^#r^z|Kl2=~@HQXuIU_a= z<`jeRnT%3VL`*1KvavUdfCg*c8mvap_ay$3%Adm4hFY-F? z@d-oT4CWJsv6+Y|nSt4vk40IUl~{xI*_5r>i9Oh#Lpg>MIF+-xkW0CW>$#abxsOM9 zl4p6DxA>6H7@=7(r|68wq)fxi%*BE%&T_2E+HAqU0EjzOp2XZ*y z<@=n@x%`Bm^Gklst^AHZ@F)Jl^SsJC{GER?Qp;dYF`0nLnT}bRhlN>^63wZ@j_#{Da|I1@no@I84k`%*Y(f&(~On zm06Q-@J+ViTkOdJ9L9Gzk<&PbAM-PQ!LPW5ySSe}@@Jmo72f6}K4-+%!JJ|+K9eym zvoJRcu>{NWb=F}cwqSd9WgiaaNRH!V&g6V9=5ns#MsDXG9^^5e=0#rTJw9Pbn_xas z7@LWhk{Ott`B;>tS&21RpH11Co!Eo@Ih12Kfm1n~3%Qi5xSpH2llyptCwZ2ad5aJE zj1k%fbBfM*Ov*IO%v>zU;w;Citj&gO&UWm=-Wg;2B=xO+MgLhHoFtCmQ222~#r@bFu)7u`H{w78|e`+p;rzaUh5DUB1uhoXb!6 zIltuB+{*9x1ApQ#JkP7V!{7NQBXtPo6q5;t;UoMAm;etkCEGA$wreP-LU_KUM zNtS2e?I$m%6SxfZ(!lAcmj-rAUmAFNzO*a*a4<)594B)o=W{Waa}76gJNNJ)kMT4w z@;dMF2}8mM=Qj#tGZ9lV1G6(9i?TE;u?Fk2DOd$2!;attSMDra*cmvR-?b2E2x zACK@P&+;;F@gbivLWE#W(HW0PnTDB}iv?Mna52mY{ic3&VC%i(Hzey zoW%uP!j)XdP29n~Jj@e3!%Mu$2Ykx#ffat}?~O-eTqa>^W@1hjU@?|u71m+{He*|M zW-kupaK6j;Ih}L)2|wqT{F+<&9e?0Y{DtRvm3R0%|74`V201jRm`uRrOvkLu!@?}d z3arMuY|NJIz;5izw>gUM@dJLykN7E9a4o;#xBQ-mc$~lTH{RfV{=sljg84*c942Ne zW@HZL=W8s(%B;yZ_$J%%E%xL94&ytV$Z4FzkNFwD;8)zjUEI$f`7_V)3UBifpEF|A zU`{a@pUIe(S(uxJSc2vGI_t0zTd+O5vJVGyB*$?wXL3Flb2-;=Be!!85AqmK^CGYF z9-lBIS}>m|jLk$$$qdZSd@Rb+ti&3u&!%k6PVB+{9Lh1Az^R#z}9usyr74+nE3$8j=eay}PxIoEI_w{s5<@)%F^BCqovpD-kD zFrO%l%|uMe49w1aEXvZX#2T#6rfkhl?7{vV$}yb4shrJ)T*_5k&&}M)eLTXGJj=_x z#fN;x2!RuGq1(0SjK`!*!_3UZf-KH*tjgMK$mVRvF6_-g9Ko@i#2K8&MO?z8jQ@p@yyvxUY!N~E0ImKc^reJzzV_p_vDOO~4)?*X4Vn=poKMvt&j^`B4;sP$= zO0MH3?%-Y?<_VtRCEnx%K4tg>!F-}IE|V}dGchL%uo%m-3Tv?eo3SlBvlj<)IN#;_ zoX)xYgrDe=<_w1pLe6eL&lxdsFsB%d&ty!? zEX>V9EWz@8opsoVE!du2*@uHUlH)j;GdZ7&xtwdbk=wb42YHOAd6Cz7k53qqB$!VW z#%3a>WCmtuJ{DzZR$>j-XH&LjC-z`}4&@k5;8f1$LN4VhuIFa%6wjrS%jrnk=0p`P1uSZ*`573grhm0Q#gwYxP&XYj+?lH zdwG~Ac!rmFlMncm;gbjRiN?50!qm*foGid%EXyja#RhD~w(QJa9LV8(m+x~r=kgPN z&M)~jxAHswz@PXF&+{tp@OS>nNP!FQFSq|pz~oHFtjxp0EXfM2#=30Gmh8Z8?8~<~ zitq6Qe#npbDOYeUzu~w1o`-mxzw$TU;C=qVa4CcNL}eT%W-4Z64(8`;EW^sI$v5~W z+wd*+z zLM*}Ze4TaJh%MNjUD=0&Ig;ZznKL<`i@BU@xRKkrhX;9#r+Jard5=#Rk~)}A6vk#E zrep?YXFe8XX;xwl)@M_;W+(Pwe-7msPT*9|=0YyzDz4{d?&Llm;Ypt5W!~aLK4XM5 z!JMKq9+NT+Gcy+pvN+4JDr>VLo3kCeur~*B1jlj`XK)@DaT!;01GjNE5AY~Y@dB^$ zE+6v+Bc~1K6pIO&g6Wx!d0B*|SdrCPk4@N$9oe1zIE14)o>MrB3%G|hxq@r?4Zr30JjCPtmA~-@@AD6a%Mi>bD&sIQQ!yiRFh5^o8CGUZzQH%yhHtSa z2XGkQ;Y3d39DdBt_yxb>7VhGH{>Yzsj#qe_kNBJsGX`^t!T3zZw9LZXEW{El&(~Rp zjo5UIFrR3Q%Op(AOw7pwEXJ~|!dh&=W^BvO?8Si`&Ug7fr*kep;phC4Uvn$J;}86a zzwkV-@(zFJpNy0(m{Uw9U~;BoR_0-0mShE1V_i08OLky4_T}3g#rOCDKjcUJlqGZiy32lMkamSJVq@asY?%9Zuvl z&f&-Wj9>68Zs9KO=a2lE=Xiy;`H0UMF-I_`7>v(kOv^0H%|a}}@_e0j*oZCIo?Y38 zgE^ApIGHm!pNqMiYq*iyxrYaNjHh{#*Ljam7?LxXPZY*xBBo>pW@kPYWocGo4c2E< zwq_^xV1Ewf7*60+&gMccGS&vQFiXGXV{Wyf9Ii6EEiwn4fE4hxFxPyCnm?wCKmw1y8_>|%E1oMf; zxJ<&-%*325z+x=RDy+o@Y{s_i%w8PG;e40xb2{hp6MoJw`8BulJO03*_zTbTD(~=j z{>eyrgE_@y0w!lVW@R20W=U3HHP&Tgwqyr(V_&|_QGAad@I!vYPq~6?`3=A2_dLYo z{FT4)2JiC^hRYYsCo1DGF;g)kb1*+&V;NRvO}@c5*@kbiCkJpC-{C|~;~aj>&-ewu z;uh}We*Vaxd5%|jn~(UM5%ULgioy6y#YEsI^!`Z(=ao0u^@}H9ILW68?rgu zu?u^15Jzw*^fgwn&UZzv$%juxRUF*i95KLhk1f$c!@XpfKM5|a4?@}jLRfU%}mV6 z0xZU|tioDsz-DaA&g{j3j1&@_pBRkCz}q=qUN;R~)_G~*^v+8IyLm4SEbf;UXE|17 zZ8l_cwqqCe<{*yXSWe;$&f_93<7#f;HtyyD9_1-s;5FXmW4>VIaKXnL_IdJz+9{Zx z*_fAMpCd1&U6FyWpMRNO;A?1K8u&W8mj=F;=A|9ko&Rb%1>T|sshE*r-!G6~`!$wf zWd^=Z{$+lFua$ji;OpgH8u*%-m%hcG9Kd0GhZ8xCbNDeo;}`sjTeyq+`6GYkIbPvy zKH_sm3?H2D7>v(kOv^0H%|a}}@_e0j*oZCIo?Y38gE^ApIGHm!pNqMiYq*iyxrYaN zjHh{#*Ljam7!o0vPZY*xBBo>pW@kPYWocGo4c2E#{LhvID!ZFW=@UzQ+&vAwS}$T*0;chTrmg9^!HS%HMc{_xT6IMGfW?m2sGu zshE*Dn4hn)3@fuH-{6~U!?)Oz12~NDa3ZI14nO8+{DNO`3wLopf8@_R$1A+eM|{qR z(SkX}V0yX4IFF0C zjH|hU+qjztc$BAjf!BDKkNJX;0|#s`xBpDY6im--%*!Gy#fq%XdThd0?8xry#~~ce z@eFK+U(R1(c3&EHzTrQ69Q)7lWiYpYjxU2b{BwL6%;BHo%U}-w9A5@=_~-aCn8QEE zm%$wVIlc_$@XzsOFo%DRFM~P!?|yvwKf1sD*Xu@Q?YCEE4c24Wb)6R4?bw+;*`Gr= zisKk|-EX?~94_P%uH-sy;tuZRVV>X_UgAwY;8TWo9U~g!GA!4?Va?0qn18O11#|fS z`}MKF>CfQtGZQie(=!_bZ^wFBA2>Df(o(F*>I{2*G|_Iwj_l5U40~OS)*jC(oW%tU zdp`a@J+A(L`*r?*>h=Aw<@V2dB>4LI=Q?{ZhyPu!v;VJJpN74T{;Sr1HLYjg;G1m2 zw-~m6GeCP7-{C|~W7vMp$J(Fq3x35d+{OL;kw5bsukbb>@i`;fkBPzf4EueIwAxvi zn}t|{|NJgS@b&uF-^KW^em?$>?spIMJQ%|XoXXi;$faDx_1w&z+{Yt4$+Nu7TYSi8 zjNo|{o$;8IX_%S07?$@x+tGivqoLQo{!e+o+JEo%HSBfrU$ve5A6+kn9ryh8e86Pu zhnbwu#azxc+{o?R!-G7=)4a&*yvHXDv7QP0U8&gGiT<+w`Ja_*In%Am+HAf^2d-sk22s^jRe=l?(3iGQ{e|0irG!k+K{v(`&xtv~+1a{hOP`3YO^ zZ_wV#UEIg8^T5Zo!`A;7w68MkxG8M^H0*qE*!%v&wgX|G2T5Q%keul_F|Z;G{mrk% zp+*S_c`sVP*dZZ(Lf_XEFC^sU`=kOV8Bc_^lZ1ra4>fs6$jHC~3!f?^WOk@&LqfKM znjs|Qe5jd2LZ$>(VBxccgd7hwXGq9{Q1gU@ygXmoEF>gp=;H`Xw_vD&cF|A+(|>u~ z8fdo+Z3pIKc&LH)%kzwZ`B|j>a(_S2*-q`3+t0xKUDUo3YG6KJehwyddZCXuRbYCd z2HHhKO&bzYTf2U!f%)&E-6Pb%<9PY`gh2g=q3yuq*<}2-Py>(ag!ZXW1CK8xckh8+ z`?P8uuurd`9mD?Dr`>=)A-UVO>eDJDckAB0Lvn}Sk-JLS>MiP)FW;giyqF z{JYtx+^$c(fxTZ&uu`vfJ^zE52~<=mU%lGD9$PywHs9Zm&L158Z)P{p?<*Pnb=2QS zP_stW7FFxksnV)j+b->T{pIln5-8uQOPAKI+H?*+oVM*+_wCT4Q@8fr1Iy{<|68?g z-K$-{SI4&M)v8;Ec7dfAnozLl-`~@D8%q-#($!>Cmft-yVTy)_;1a8~E%-;HC24hS1ko;N=$* zdQLuczbvBLU+c;Q?hmUAy*~D@>Z-p|*Ya=b8og52>Tl}WzEaovZ|Xur2%En)e^dAN zD|MlL|EtFly3ZNbU%S7loAydw`@gAM@Jd~Wzo}dPN?pglsr&ksx=w#nxAT>{(DQu% z>hT_WrLObe)SY^zuFK!lg|1`6^6UCHbq`*t>-INwp~o;`{dNDFx|pxjg+3?#)#D9a z=ZE#z^Ka@xKLZz5*XwWU^1f0RdK~kwrW<UFdnmf7M^;Ha#qt(DUN|sxI_1hhcTY|E4Z<-yp1R#NX6ie5G#WD|MmQbOWP8 z0=s4}hdZH-SBAi9{^gJ^@Nej-2*GB^U+cpDEK6W~)c-_X&OlA*-@H2AxPf-q5H{V4 zfjeHU3;nI;kib4&*btgu=ukFr3+z^glnLBIhl~wkhinTNx;@GsxP{h*&R46z?cekl z*dGkdI&28*FR(lIZ~D6!=r45tF|@zXc@OI^bQ!+dU+8B=Lf3&|Ls);I&&5~gFJ;5n zp+7tIvcKE`!}^;U`2VZ@%?)BWPyA$Xy zYhZlX5H^3IpD})Q{wlmOe}x0ZVf}@E#`x9#k_KKJ|51OT*K}U(ul_6jg)Zl?{wn>Y zzcQiyg-*Z_Hh-=DQr9t7NJ!hTqJUv_BmYvjKT!7{&EL>K-K+E0_Lclf=r1(SkN(o% zgFt_QLz@3Kge~gL>cU2Z9``H@oq!=Q`sJ|UFVpQ3m~Pg<>n(J-l@8p(a{2x*{jCTb z7kwT!u|Qo|f4}^tu3_MKY3$1>1^)@FJ0AGYtB-eD;79ic1WH1uTP|=5o9?Z@^miuE zUua#}5Z2$dzw{TgS?rLrfuhjWm57K7Y4Nn+qLL}b}nk2 z8$-y2L5o5cf>NUW|Iazk$L-GW4h%EgIsWed%$+-T=3SZl1_SJKTPD-Ro9Ms=#$Zj} zDG#q6gX1BBtT}nPjq$G$zAk+^@Jjo$i#G>eEjZM7+QZ9(w;T0pF5V7&jFIOh?+lVl z-v{s>D-5}dmj-Vf_2ivHa`74tikwBgnu|9BUJIPaYeI7IM!@6yKQ%2D`=7n`>Fa1e zRFZcd$;BJ17P+c0TcycHRTtG>=C1x0XB73dAi4CdfLFr@ zzcm-H{SL;z?d!bD@OAMH92epHU^Okq+i$KflAP6-g|my-a6;td6{WcQOH+R&`O%;d zZ>xv*6cgwU6^C5Oaecq`nc{fg=Hab^caINzYc5`Pzmd+m_4Z@`cg1@bo%yCh;HSm7 zzPYRsoVpNiyN9M65iT&l8hu4TrMg}qGP;=>90k1h)=aK7*cjk8> zs|nBjc)U%wpbv8~>eKaV(*5ymDG(wOQlRtsHQgI&M;(a6UP){D`6R!3<@)!MCMR|A=-Qd}Hb-kLT?*#(uwPOu% z&UmvuMrPqheY##v;#I8$!r#@@RBF8aGJQtc;6$FTSCe?X;2kYP-voHvM~1vkBv<== z3PR!jKWbWx>r3OKw>n;Rd3f_-C}ZX5dt_wU>g)FK`ZtAT&4*qNn&SMW$HRLM9^Z$k zX)zw}6nJ`nJn-LDWrmAoDgJ-m;bL+LAnm&V73^Y9~Yz{AT_hGor9 zr@&jV*MsvhSAUt_5(@v%NllCK_M05WcyHq!Ea7d#IrMMHSi>evA?Dd?TDKK`rR$GO zeq($dg0t$|X?e945MUFh&wDopX!4ji_hGJnUyeop%@bMAJ)W4WrRpMCEIGjQ(hkS; zy@kG69Ov~IMpAwC@WZs9kAQ+1eB7MtZ8b$RhilO?{0KV27{!s-NaPtLwh4Ge%QQy9 WeI3-4$9Dmxe$PgXTqrq#`uzhoq~ibp literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su new file mode 100644 index 0000000..9dfcbbe --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su @@ -0,0 +1,14 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:200:26:HAL_RCC_DeInit 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:219:26:HAL_RCC_OscConfig 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:591:19:HAL_RCC_ClockConfig 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:775:6:HAL_RCC_MCOConfig 56 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:841:6:HAL_RCC_EnableCSS 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:850:6:HAL_RCC_DisableCSS 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:885:17:HAL_RCC_GetSysClockFreq 112 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:941:10:HAL_RCC_GetHCLKFreq 4 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:952:10:HAL_RCC_GetPCLK1Freq 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:964:10:HAL_RCC_GetPCLK2Freq 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:977:13:HAL_RCC_GetOscConfig 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:1056:6:HAL_RCC_GetClockConfig 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:1082:6:HAL_RCC_NMI_IRQHandler 8 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c:1099:13:HAL_RCC_CSSCallback 4 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d new file mode 100644 index 0000000..119c233 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..2556f6f24bd7b98b9815ef1257241729f2074eb7 GIT binary patch literal 1100468 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

    CI2!bF;lO`ZtigW=1k)re}C^m{n5r3cg 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 Q%>m(^l@pKSVs>cTJ$8 z+%5e`* zmHK2X&GhPOQiT_?Aw7q*Y<7Q%xACdz%EmNaK%!(ZX+&RmwMR8EUPR>{QS%9I{2>=a zvh=I#^Em= zXV=5XyNaJ_oO3f)^rDOaRa4-8g0Sry_Mw=gw+32DR>TtfWS|~~x+JWyXU-naK;XlX zGL{(O#_n6_yldfF2;wA11#x9!V>l)_SwU)}Ya#Rx?pmmE8P2e%S$EL#-7=y%vhb-4 zyaCr`?3V=9h+WA^u0gp;kZ1|*cpeFraC^4pc3h8)jbR`N(GD}B>t3EOON4ZMfQ1Ez z05PLrZ{2x!`2r8}m<;pQEn2j;RiYenK6h04m{vEV$V0vK$+nkF4_hhR425C@>r||Y zJKU|tEmY46thpd=-6E~6PaoOu@+itWJ2;}!%BKr?*c3v;*C8bv`9V#03S*7~gIkmd zbhf=EiOxPvzN|ISMun8j^1-;inK;gq_7TMZz;ap|XZ+-1{c^yC&QSPG&*`@3c+vNI zA6#!r``Th~;4fk*>KI6vX(W5#y3Yli!i%@yH!;)36T5WL7X$#Ky#)ar!)jd7^5*!O zO9S*xTK2dq=DXG;^wc4&Z4JPx`T}R-z!ogtzx}-X%by;m55F^vVeH|s%64MK$ezq0 zO79n&m+xU+upi8Ay!n zbTHo|BH8m(hO{V?a%t2*fcu3!gFVL%z0EWnoM-|HA$?H2Q6S(wWP?I}K(*{%0T za|LNqcPFiV6?NGmOIZ(G_i05u-Dhc0P`e?%)0mKwngvJ?5e7eP$W?Jl zG4n0dwtqohv4w$M5?ONRnd%!_px&LAKtay+ertgFi$jCw$X4Y5*x8ET;a?a={87FQ zTBx2SWzpMDuYddQ0TS%?^M^mJK79Wm{i;i}(+<>ex4T-$TYPQ}uLsO0cY@iQthV3= zqAc0=7GerG2zY6??IG52cO{ZjWlSmf2-CPQRl3lID`5P#hLgxU2uFUevMjb|lQGjY zhh96(FZg|l!;VZ3;B4ER3i0%+OIl!1Am|?bjF1ZT32(#Evo`-=6pibM(AS>eDKb3y zAxHdH9CG~B`<%7&BhoAOCz!_Tv>d)5FQ3=huPTVIEtB^M>vip@Ey((i! zS)qs)jI4OcVLKfsJYce0<3ys)DEN@c5>e@nxp)9GAIi9zzgb&?n@m?Clg$DWFOI(1 zZ+NlVoTklSrFPYHmXu?LJDdXWa_)n^#bz7xo3mulF8iMf_g9HCw+DE%-)1Wtk*Pgr1rMd3pdDC}_ zYPbQxwOEo4#GpeWS%X;{Z>EflzeQN0W7ygrc%W}yN(RwfLhhFq86jp%Z5K#{PF$3%E~JU>P(&$qQ+4GE|<3+C!D>Xj-J zOdsXXN)^b@9<`9Ua#55`Y=BeBDg{Resuxkzk;B6E4RV;nAte^Tw{91%+Z-j#R%1q+ z-fX^uXtA0Mtl3lEZ5pV}LFt%Su&A1!1k*dzWLZXf*^K}d18PqR9x?hGP6xY(k%kA; z{9(2)Piv{92I=*7!l7EC9_fe?D{Tc-RnY6zyxOPk2wzug5C9C-qr@qiA03|D5 zt`R$z48wEetWx}noMezs4KY8G9ubr72d91Nci?_VCQRATr*_X!j-CM)v~e zXV85&xyyPPxN!2_4`m|+d#v&bOiO}<_kF=~A-+K_MTF-e>xwEl4lL<;;xe$+_Vjv32He@k@d?|gk4o)N zzy>k$ehvNB6ooL$D}7$g3#6d9|o=k=`(`V=S;jf0zN5{`c&z_&19Y1|G9GyLU^K{PC_HaKK?{BVWe8Cp` zZmD!i(W>`aGmZi`Ots3z2Lm>&fr?LZ)%#>?r&F5u`H3_QaKvD>1w_Ha7_uLnjB5Rj zc_cwb`_=*nkp9a}u=lq}m<-0%r?Bu1fjk{R?a(NV^X(e(4QMgzZ;94N;==;}k2HCu z95yH~1g-MC+8}`eCm19nZgQpxMjvdJ9xs(0-cHP|ilKy>S8(Fbj+Fdz|25|5b}C;l zxn2Q{tj0j)xu19Z3Q4TJ?^o2GL5m0l-O*9pHQ$V1{={9XR{+x^Z-?6uZ~q(bK8AJ7 z+>Lxj=D?A(U9Xq0?SlV=dh}eLR22Y?*hxA&C#7b$*h*cXBXaj1aaDzC?Qu&`33+{6 zxqubT39osXmix^hP8%3&=%f>+^XfWYOd+lW7r6xzy0da#;QpCY)J|H8(^!~3zeqz2 zya?j5j{t4ou&$6zxU1=<0gJQsS_MN-W|J=U;+z~~dbvXla_(*#EVbul48sj!${UPre7{~JV^RKS{Jb(A$ z&y&yZO#j)r<$n+U{D-&i9;8L%yvo9Mv3Xe}BjA-LiCdX$2X+{dXvtkQAbowg5u+rj zZ$#MY;_Pe|$G~TigE?IZPKD@|3?CE5C$@eY9k5;-m>b5}6!?|m%Aq2=N5#@oGs*++ z&AMNl38>5F;q~`_L2M?!&`E}}5cKdn|0Y(EP?)?744=1DF zzWr==VGkdlf?<*JH+gax!`UA?nP3_w4?sOCV3 zAWR0DN&2xm&x|w_Fy6t?(HCZ!fO-x|4rA2EVVdOB8Q!s{S4O-T3(^m)I9UAIz|dju zr~kTr~|VnI>z${##K5^A8~N{pCbdEVUXXe4Q- z6|*x?Hxw#DVEejt^T2xiok zl~KWC@l^odteNri;=3JOc_$kP(GkW)I~Nh+41B0zU6Y>*uJ98L zm3z_H3LfAdC_=fsT?M(+(dCZr>!O#6P?n(!qK?Ip?CGEz%aaBF^Eg4ZU*?B!K6Fn_z*JiLOsUua@u>hCTP>EC=t z4b#K?%ZA9zgZPwId)Pwr`y=;dOB%EfGf+2>Kk%Ksdj0A1!^i#h;s5*c@c#4L*YD`f z_WsikZ$HyxQEXGEXVs-RMRf0lH{62Z+ISC68Qr>S%ggF+_Qc5qN(c9ml5k)#a#MHG z=h&4C46t_*~P4rPKPXW`LLswP;lplag3H_Pv&ZmL?eda>n=Wg|CL zgy1N}kz7ExOX%4VCV8{l{-$EGyHI@t>I*7ou!mp`tmI(XB=?nV^4SZC$!CWfCj<3J zHhntPIHgM;IL0@^I5L*5hi5R2?v|8DidE)n z8l%KC)B;T#V*Fj~1mOjC+Dx58Bde{$?cT=K>E>7MrdK0#c~A02@FXo*qwy_G1t+X# z(_p_xWJP^@UFUS*c%4}we0R0x2_QbW~#zU;uB#2dS7owBisFQGWPUUl_#MeYwiyvud0AWL=9G#B(4mpi6)KDwG!WD zXH4Vja=Sj;)`YI16J;TBZV4XhrfA>OEEo@3D!gH! zFfZe-aU7k^F1Rdj$$S=Fp@yhu!lxB1EYDg3Y3QUBRE^mTRo;8WBp&ROa3t4uHlAD| ztrlz`ujaR#Y{Th+=_|2vIb+@#WHXx0u5Ydv*Kn0W8Y2iF>)YM_ZhhigxeHs|oIF9j zi~XAq?|=99_u@ma3gEJmvp9e2ZJKc}6PwAKt!E9>#Q2nQ({U>K*Ap3VRYkk9$290k zX>033yN^tkhZmp-GQ2L6o9t5;jZvvfp;L%lQ&+R7o$z=Or+ zwU14hU*&mEZh)qVsZ1zhzzkt|p-bm9k-60onYWidNjd{jkT$}q^R@N>cOMTIVzaiF zmf0jY>Wokm;2v12{+$kyI6%bOw@fK90gy_lp{Uvn^W+vIqpj7~SD9itDb33~m zF9*Yt(U{&23g!Zee>}cni*s^0)Zb1-WrFxC)ajYtB86lQ#i~8dVwRe|)eMpVQ8Mvb zW)(wHv};`AGThxU(_Y{>9&_V)hRN*qNX6u~t4zdEXu*tjmPNehvBI{?7hZhfr#iD7 zv$5fH-$}cZ8qJuTD{9E+(59_n$oIu{*XZ6Zn!SdKZJvT{Z`#mQI<|r@t9Onj)7)H* zXLALu`zm7>rZ_C+)=x*6nRz6OC@m(2qpX2sizb%W=j1vx5=3pWz34pwOY#XfZ(D59 zK>D&t&Wn%31+Hzsy&hA1hlZB#I=gMOnA*&;aq#8c9bX` z@tWy>L=5Glll4JKt0^9GH*-c&pT?8s4rqAI@Hj+UGoKTh>`z=BrDL|SlF!6vp*nyq ziz6Fv(oAqu(+N&GLeVyc1~#jBppzZ|wZ|Bl=Hbn7jT(;pId;`Y+nhJ!diRP^C-|cx z!mf8V*cE>4&1cM{slMfEyhiE z)jcJr*M<5({|{|%8Y5Yjorgtt&BASlVvEagF&P{VM^)2P#aJ^kXQqeDjHNQCa_fl5 zS}57c$jr#@^3*o9boYRyEZQPSS+pctv~0t+K-++Rm&{tyicunpVv_kHKw?Zu1i8FH9F)r))2eed0Omvhg40=gPs}jQEm)X+)Y?YTkCYrPRE> zz_|1%Z9LfG8pNxx-MEIKHq8t+J5_^CJVN$JI@8Q{4l&$|lJ+6rg1remz~sug2%?1O z8+p42eQ~m1oO^7E;F{xr5~8-zGmAPy7fO0L*FiL3iQ~MYBM9-}rJ4oxc518GY>sPf z9Rf(bR`*O6gOy2fOn6l$?|0!$Xs|k^42?X$4;1D`)3i!Sq%P)X<7!gZwBgyh27)nZ zEAOq6x>!xbm{?;UDzst~bysXlkgN;}-m3yqa~(qpu?52uGdd@>fT=kcgvqN+g67E@ zc0j`%;h!x+en0m!rLd>tF({G)1YbINLhp2wr*oU2iVY0zP+9p+@58VG|H;ZP6tpPd z9k~bp|IFA6JWH(^R}3gmTI~4l$fV?k15dMD#=tH#z@*U%Kl^ratJl;4D zA?%Z1oyw@VW9ljThFnJ%9+i7R7!KO0aqlP*m$lFW!MY5DMd#2`966nVV(LFu9L3AW z&`O78=4G|X$O5NaCfqe(Q)VAunki=MP+BGU5;eN>EHzmdhR z--rYY4u;8mm(i~az9fXqPGG%KtHg7(W$Fs{l2iyS=tYDu&a$n$z+$HK9cB@bm8)Yf zk`DB`(hUV-#_?Y^Mb&2Npd=~>p!Ve(gsXa?SO$=RcrL0uw@H>7t&%3qTPNh=Ht)k- z%x89B%1mCB`Vd33`*Z9}B@LB5WIpu@~)_Nn|vxI0M1J4MT_kCnkjaS^()mYV3wHL9WUJSL;OR2uBsnBrD}?EQL_bnC}SDpFm6H3Js?qvqr}& zZ467f4KQqivDSsRGOOUzj*SnzdO9)Tsxw2bt)W*@2LA4yQz?+_EcB-4jvfHfghlk0Cq$WjNTjDMgz@UacK%SX0AV1y~EW@>Q zNXAG-Nm*rdB}=hhgHs4Bg6Zo5sjhb({8zQ}J@}W<-@afy=PRlvYE;CPil8moU!vBK zV#KkZRcY~3%xTm*f&)SvtUc5QtxIy(2Zr02+c)EgKmlAlZT>u#H3*z&`}p$lv**iq zf)B?RBawgySX?-u-p@;Q7kEuR7WRT)Y{px8REe_q25vezgw5mVy4{P18MDa(5lRctkloGQDhl&t@4^9;jR_{$75JOlrLt;$$QE+*P0OEr{(HCVf zY4o*Nc`zhvG*`eaAi$xdC#$`^clrVK>%(KuAn%3jB;o3$!AOTzEuu4iDdgoR^CL)` zMT8bLHpyLl1x!$#2M#6M7#Jg}~2_%`*nE(jeTIXL<1aB7*5$km8~u4MzEH~cBJXt>dqN-X3_};J zD!TC1)v;49l)@u`=YS`|ad`u{AwCKp%QGGa#{qWyiYbXztK+$}3^KF*qv4&xG{o!l z5n9v-ZBTkU2y9T4B0SkZ*;dZVu}w&g6+-cuILIRL+5QNTj6weX4 zjK8t#jD(1uNicF4`|i7<734Y}-Utp!AKnO0qBoTGbdXw$nJSEClGxgG5ruS5uJ3ja zT}%uyOFN5DGh>)-jYoSY2ayM)W{MIQP`J^RyuIQ|-Uf~tPQht%4VhYfMdn`%SKcZ* zlHeV*?%^zF+DtRLPf*QVy|o9~kXEY)ay!FGRpO}t>0#Q<#>8eqjwliVLL5Py>C*|ZfmGRL3=<;P|U{uPDowW zWl|>Ns(}JfPeHsTv?-6?U;AOX-uy-6$>VFcdyF~UgC zJ~avngQci%<5<)?c^X8{1@;t)Kd`V2s!~hIvm#r!!jpD}#?~n+mdUwYl>&|`Y!3`( z0kWwG!c-4I7mIqWX2h!;SBFx9d+-&ZT5u-P&I@XLFU zj*-Cww7`9R&k?Freu-X9b6%foNelH2X|nUWY~XkYT6RN_v!EO!QZr`4rH|EMTD(b4 zb3oIQCz^GVV)i3;7vvP=(o->x1B@C$rdxE*oMh0sk-;<$1@bYwFr0%EA)kIgK8eeN zB7P-8C#o9T5W-5#rHwosPMVG$$J?e8M3oI*p)k%oq)1f9Nx=^?ClmVEL~&&}W>u@N z4eb%}R4GwT>5^qKoL*}SK^w)%cwF7-Wn|&rQFpd-Ko(vZ# zW=L^F<)@`^jN?WckE-s#nUVwe$i03DcxeF- zSAg_52;)g>L`i=Sk>vva-UY6?iseh^Jx=u?+%xLdP7mI7myc& zg&!!H?R}YrKy68`Ug&^_kL3a@X}$_jGiJmH5Yy49I==--jj?wW->7qXH0({PPG421 zZV9g1qBU9{^q`Z&zZQhrmF6PH7(6L^xHcllEZBB|ZEo@ai=}LwaSLQ3<&iltfsbP? zFW5cH^C5NCv*n}Zxg=3q1B|htKB>jlcKg*{hdYc0kV=rgX~IP@@SUv~+{j4K1_tlYRxL*JXb03P;j! zcdEfKhtB@k(PIiOw-&M^$*g!S8gsT#D!^i-IhQnjxp#tLS~I746WyE$0X!PQ<0$X= z!|7p2z(zfcs98StL-a6L+;o*5hDdQX0&hpwa@G++m6f$X(&vR`mLl8NP|+YP@d1&F zwqh3AK9SLJ=CK9ist8uiRiH-NrY=ml@ksDe5Q%0c>O3rGZ=(jT4Sic@;fW=voOXN} z30)H}rK6{))?kDoU=F(I>#}z^K0Z9i%s*>@x|<)Rh|&0BY~vjS0S-Dv&v5akX*1Nw zjLDmylT4SmI6uTs)I&d?D1uQkF#B!YI5*!DV&R6qUr%>5& zphJCZI5G8*>lD18?}E^a8+H!m7c~9j{p%DsifFYTnDYXT+=`Mq*F%GabUhTgZVla7 z==ECbfdEq1Icj2uj*q6KWb=3#gPmw#NqWtF&-dtxnxcUfgly!^=(E#mZ3pBRxL~{z zNC<}(hY-5@Hn^Vss9|w4fD)!&ir#P;clDb}n3_|9MSEfk4;x<^mM3UIl2SRIt$_3t z#Z!flXS8=4CM6p-t|oNoR-F#D_aaQU$B}gsB_G*NTM7aOMl#-LMQ}$-KL<&TPgCr# zjE{ycO#v;|yhnkb&V ztFpQ(NGlDe1cIo(otC)|kslKV(}#tf6FjouW`fO?P6@C;q|U5b6HOuu3mK^cL~q$o zK}aD>|HqJ3r?Y2^=gaNq%Y}&Fn)=htGvmi${2)~(RtZ_~%G%*Zr1+|6qQ2*RMt2y@ z8ja6DS$z_xD%04(ie>EJRiLt3#%M_Pu|iEnpkC^%R#ys6gkjL>qre_iiK0TURjVxD zk#C1=rQ!qvmnu2!eVNF=2f0C2;@94nK;CB2>LhbPWcH!WITH z7~=}DY9YMgs1~{o8)x1HP|$U_kp&!2w1Bilo)9z9+?kIKO)t>-}u95jbV7Z#dna%Dci zl_=FS&O&mw-4>MZ<_+X>kgAv^mx_3%@D$V=Je{3HeIGVER69Oup`<}0+XlrBor6t= zg(2yQnJa6LW{~6o58BZR>`pX8rjiesZ`0X^t`WfM)e5~vSlLg#%D5JwZ1|-0z;NkW zV+m6lHAkZ~j{PJzs>lTKE3n`dVnj>NT$5vN1K&ag-4ffVr|`jGK-z~d4_`e#TRxX? z!RsPrsmVsfB?SJvy*rxj!Ni4JLP0;ZfXBn}+(rZzNEbQ4aM|#6Z_B<)(AZfQVCqp& zegRibL_-=k8tnL1!D+-ZS#PT#d9<7hXns>KDE`YYLIgFTZ}{JU-Z(Y{?gcH0pzvZU zDzkjg&|w9b-WNoRup3vmQaLVXg`_}Q-2AxHqNGa<>h-X27=aME*I5n{q=)grp)##Q-tjz}{+FOB^EdbV6(r1ZsPL z%pX?XM%!3-Zx$@KKq4Vkdq4^9NSO@C2vgTI+2L#$6lcT0B+}CAYHNwq(G96?%1T-V zsU9w@bO=EFy6biklNEk~&5Er|Rb^~e9UO;TV5Iys3Q4SDQ42E=5ZK+r&M`>Pd>&SS z`sA2~;P?pPL=p2sH~|ioqF1@CkUgdq#QQilXv!*`Y;gu>_-_>`5-u3_*3xhZs7|Gg ziBy{@6Z43fHzEFjT#uxgqs%;xfrUZd-l_?MyzS;Q9W8UHvGFD_f0Uk**xgl4olWd^N z8IBl;vOz**R>%RZ9SZiyHlu@54?GR2P>ki=6D=IIn=XM* z*1~lVn|?bI_vS8F;d5$_#L;9nI!ONCa_ZIrS_eQtbo%h@A*~LQKMm)1#t-!MJR$i8 zpj+@PZfJ(rfdIPOwY||En`fkk)A&|IkuFN=xHBwJxg%s(F>wV%V+KUX+|BiDQWb>B zxqWy7*@Xw8bfU~?{or01O6rO_7bL%$WX^G5^tvHNeL1r$;B0p700|L5{XD@&<9=O3 z-Y`|5@^{!V4&nB&4Z^B?r%w0)()$8_z&s5x5AOEYrX(k^GgBNH`Yi2nA`A^Nvf;q| zcRD?qYNJ)^U^)klCUmgZhixtm96~{vPNfn?z zDzP{c=SL$dXORmoM+)hZ%`qJ{Zgmwk2Z9ok@o;!N6H^yUni0_su+=yzGzqCzeNsO| za1wVDj72?0!;r|f&8uiS8CMC7=0z-?UeTNzYvy;G%Rs_DXHQl{a0b4PcCF#-|3q z)Wo4|8xz!`Vn3Fvt%PY}InVCuf)gayC6y30)*L4)hc+6ODsby<+YxTwUDcPVeT3<$ zVS`z0K60m;7djByv~Wrp;||o((f$ePD9v(Ng|@U9U&D)4L0UmBOsdy7P?VI>z#%-e zlM4!9#!WHCNRN;2R#8;}(pPE+IWt`4uS=Mk3mpYV>CIwdDj+r2u#(PfV+v&s4N>LG z8)me@apX;)M{QA$G=8zz$eb(X|9Te(KRoV4jcPJP>>;rUM1r&$heZfdEHQP+rZ~pw zXt!kyf{AFevT#G7I6;07yQRjm0*XTglWBjX3=WL@x34@o2JJ^tWAGh-x+EDS6cJPM z^&FR(jH5iHN_^iWm~>YctmY;Gbwl85nMQOXO(z0+!#Lh0SF2#%#Wje@;a<&RR%m6? z)F67YfHDJ{V?=>7X3@Ds5IxN>qs}jeUK{HWt5!CScOTHx8`en-XnHcMEDpLGn_V8W zXx>|Vb$RkkmIkz65P8IeRgehY8J`>vX(T{^q%ftxW{CW~L>NUayOpKOp+j|vk5Vcf zceV~zdIxPJ>BfJdeRN8ZT8u>Y?1R`w!$Gnv_@Q95+HjCD@@{xXLNBk=a?CIr81!7- zQbP3LeEu_nmHR0_X22fZh8S{hhUj;-XHW)rE&-T>d1^%$Wx@z!AtF$n;M;~+^(6EI z!xAlt4XM|Hfc&)c} z=6Vh07fplika?}?#-sR3sPDMOv0C2+6CAW)Fo1%I0|Kre$iG_C~2C>y?pBwomI8fPX0rL{u+8dOg!>L4wo1k?>ChK57yc)Gn0 zH?s409MR89d1j&={sm zk@m1@JYZE9jvZ;GS}5=imaXilZ26{2dlR|>gv)SWqa7X$ItFvBA^qJ-i}+DEI!z}5 zk#>11@RM_>Zqd_#9fSf`Pm&d|ZUQ1AHihaEOgzPJ@s}iUSqXTEE#0moX+j+Vt+q@$ zQ@iIIXlS=Y`JHDVsa*nYYiTSBba`0gJFvi_=}B^RTQx!vzlgSGgTm&?3`O@xH30xJ zKna_I%&kIuAp#UwUrI@txNpS==fm4;;3YG}VR&lsP4UaJVHH(cM><>PQ0n4nV}R*= z1yx~sbdnlJj|z8>2#IHn#%1MTJ5y$aQ`|t^>Iz7lATM1nBg=*u@`o=zz2A{LNb2N<_ zZ$FqrCCMeM7*ZAlCDGs;cJ#mE1)hb()JGT#pC$h^4wi-AKK(~nz zE(w(y8;z{3KAH1-ygf(Au=#wQfoB2MU1lN%ZAuIeUU~5lQHE$69^txe8$1v#Hi3x7 zvl*lU(}V5(>rg2zpAVmXe(%W>yS|vc3j-!bxwz4++;Sc9>KS3f@40~(9DAub19JFN z5W%2{fvwcw48sD1q)v-)?{GA}ZvsNrsTejBj5a}R(bX*=qflY9APyf@^3^L?9>bpz zqz`ulN`|)T5mJEE*kX|)W6jYNrc^@petwbgWX}tjEG70JJlO%U+rm83zw1GvJ%jKG zdqz4jygo~)LM@qUh(w9F7;w5B0#3Ju6U!=n{aTLHqH(o%T*c&xh(XyYLZL#=fJ($# zv3(G9!u3Xrp3~JsOc^CX164VGPqzlum{y41r5vfPzB-q zC+SCuA8SvF5KpfZy6j*^w|w}5yL}JQY@R<^JTfug{=+9rJcI~fGKOdn3x{5(^CMe3 zuDYz19Yt80VK6M<=gnxuG`iY&=1U)J6hcWu9i|!_B79`-oy_)111xhE?tcn7Y) z*jo>9U~z@GO(e*lI1Px~L^`JEhtt>dZ>KjerBv;;01N z@CNElbS#UV;cAM3cEGGg&AON*QQ$a$IrA%&x!0>(TC8Rp?<>~}J`aYQ+cN*!jJVp% zYC~ZM^4y9-M`R^h&;mQU;f0Bh5+x5(JsiWd)89L6UcU*`2|t-x1=ZDQ^JY^{4xGR& zuNbV1Mfo|V_ZiF^_{<&P06!YG4+^~ju(P~O9i*=p+u_;%dgfRhO2s;y-)~KjPG{}% zb9fq2H>hygqwy8Sr&rYE{wnz{=GWm151;z*8Xnw(!i1H7q_!O^wG}eS3JxGscsw1kZ0&MlQE^r`E zak39BPnYLF%hONo|*=_kyd;&g^PwtZL*EY1zm0L^E>NX=w=+M!7;eV4V7cn z+6EYBY-4yMl8|3x*Hqu25!i9&n#b%&r_$}*f!JT08Al;aI>sQKs)8eptqdXXXg`af zZJagBqGm;wG8PAEh0lOKE{90dr$E-&z6fEm_vGQr$@8a=w=WjYUM??&Pai)9=`&Ok zH!1ztmcc4Mv~`dK(3K3a^$)fY49My4tSYV|8q?3s+k?MSz0B+#V!y*T!adS69o^f5 z+=}KZooofqF}kOtBN)vfhXJuGlwcg!C^?0EA~JAksja}ZSaK04s8D;LXE~(UevmDO zRpM+-3!~0F)*5V4HJ2DET8rS|o7y5!=nQ;eL5pd5M2NbG8|`o)ncmLwnZ___rH@NU z{Z*~i@K(um_n+dCYP38ETyiG?Rf^r9K{$R8kZs=DCh9SV1x#rdLK=8XNt)D+34RPo zd4wAHbTH~tUlEoOq!Y2oV9+Qrm{w(|k_}9N$c%*<^ET1tMEoZPfY{67>Q7+Y))~BG ztAQyipuhz(gTDe5)WXH~QNlOAcRP2p41>j^2ZVVgfR<`j#~uArB-Ja%Jv7mG3O!p8 zWuX7^t`g?MLRy+VY=@p=En9UEm z9WbnB6q+Tcs0uwq$ro_lFAhQmtY(FEe0w`FBOsqo)7-V4rqhnmX_`f1veGo*LJ#{FB+aQ_@Jy0|$igze!;DkNh`^BZ#3E5Hl~e2yW-Hahi;{W8 zH=quoPbsOu#yI_e!dJNCj1h*kDEit0cI1(tId*5mz6z9L1*Y6!Uf+h3$qMt9K z>1_G6R}84Xcyu~lo-ZH1x8&*-omRHW!3~9?;f9!vk+_h)I~+5hEn<7DC%At=E>to~ zog~@L(h?H)DwqLrL8A7;2duQzSL-b#Z-a^R@v%achcdLLZu@+ETt+&@7(!BT#YXc6 zdJT^tWJkdvGo(>O)fjyRtedopCUjQAr@?%)$jev->JFhkhE@Py4AqY(pYn*tD?r@> zS(}I`+4>!wPPdOqT9BEipu-nZHdm(-bwX)_VzNxe3MSZQ6FY3E%+V|Gf_t(^K z;(*X749x&wKf^smmE)g)|2gHOjGS`5ElDUr#fc2d{I5cl^vEOkzzR|j*tC!4g)+N@ z*krCA^03iPA{gE>pV1b)G?vTj^`Jm05|@LRj8ZD8Pay&@OB7E6aDOm4zR4U^h6kxi zisp5Q4W$?lGGB94Tr}{3IaNa;rI>{qUb*NAHXmy83+9rN zl{GYExM&$?3g-CMS_QL|K5pjZM#4xoTCNNo+6ky`hP44<=rJPJP#uJv()%f3YZaiL z=}Ey(*>umLRE2k(oHcky_Ay2dn>TP_q(MQn$)P7qrzpW(qRX<-`!L0Uvno80W-#DJ z4&9WFj)r-OkKn+!g5bfB!-#k~#t3IHdFmQ`x>ytmjHJvrZZv;91qr8R6?WWLj>osn zWZ4V)UK$G_Y0#+E2)__q$Lm0i`LAyL)r-ISS_vVFVAZCPy~<%}F*KVeQ?1 z^z>};C^NDS07Rw?w(RnQXM8onmjPyi34sQ9F`!`d^^4VLUCe^thEO(Tt} zwqu~igUu(6p*Z_A$x1nH$Ilmt*~@zAMrZ^CxTm-kP+Z95=1&sB#R%v2fk(Y^wsn8B~&b3$>T-zxJ3f$ z*bb;j%lA5zgsbTX89D{&2eaJ=L5%OXXaQ61KpMdqvg4OYqrP|e6^yYGiUFG+B7n{; z_(fjaq!=1x=bQ~ zlK_JZ?w`sP%`6ie!&M)=rT`)W1c1}h>A^Hx7eO+FT?n1!><*m8V%8E>q?dVoh2T&S zi)vv$W{6gc4i6E??g48{=5Mu$mPXjqv?3x&1<4)4Oy;ua`WCu5|JshNYX5d2P@@eP zV0m^gD2y;hTI%kc>9Q=vt#Eupw{)-O&W{Sio$cxM>GB<9srx)r^K2vk!1BclnE@2# z&nl+t6wRXn9M~qFl)9OAz2vmjz_pMVEH#PsFd2cmiPcfY)>hO&tUQPefxNjGD0HK^ z673ohIrur=i-K~7p5wX$Q8WZmFm(oAwgs$LiVgx3r6^L1+Xv$88hJWv^-@O~6vkmk z`jnSQ!(p1PYUbt%Qyb{6s4Fg0JF9_iwK>cD_RItlOcpYYz?AOzNH&@vbb4}r#0CKU zZ_bbYTRj$g0~nlKe2yhF)0q&mIM6nnUx*hQk03-sc0vz@5gj3wN|@21R$MS5phEHs zUjx`CLcMfIpQMoladi+|q>KSX?81&G6iZ?Vw&WJ1JmgtVF9)TPHM z2qGUgbu|a-7OhniN*6}#2sd4T(in%3t6e@jH;eK38BS{n-SM5fadWo@uMFo~TuGrl zKEyYa?g${g&vtxpj`Hbn^T!gV=A0o<1&Yokdne7DhpulkNO=n=Zlw~^K{;BCXD1-@ z#$biRsbKb>B~UM9tQ8SeW(82MN6|1^JSD_q#(i#D5RM8n_CfONU>zO@q^^bD8@Dq@ zFE0M*G*FMUsevwz>x>f=vzY)jrQDZi2GG&;SR(gWQXk^?8;(QE{0v@&>Y@Cw6p2Kf zGlmaHA`Elzx<`yAUl^Z=b4xxst zMv?K6P2l)llMsBV${K1m6HqsV?;Rc6cn22>_>YKI+}{DWyTXakNwom$SzJi8>=Z|J zx07~N^qsREAIbU3V$q&YKzk-cnl3SP8=qLx?CYB>*~z9MDK7|Wj*xT=g*obN*b!5| zL0`I96;uQvxzwg9iCkHt)su*Qk4@#)tL$zxg#&ky5(_##2BFQ{G%a?M7FWZTKz(Fb zGmIHCyu*FlT&?mCDx5Noj;BY%X1kBGEt>Bou}Q>g$G~&#G#x62@fi>I;0cC7VZiwI zzz$)4m?%` ztaIXk1#9~f9M>9IsK_u&+^%n2tyTxPQed+P{^I`hZ7r2p5PA>{JhrF%E_6vJHN;Ek5Ky(Y zAFjv6xxNC7gJp&Z;V$&-K!deftzH;M$zwGL@b~7K(h|1BqFSdX#}Ltplc>}{Y{t7G z!JCX})|=goEM~zJ_~w^kx%Sz&ntvAH{DEdj%uYllX}Sd@KEx)1Ul`)rNeN}WQc!W_KpHJxE}&q3Z~5E>WdPy*mLMqy zV#wLOlf%pzq*LoHQZ~VTA(L3L{#%tou5DuzYhIeQGOqwi(`pWOwIo3Rsc|Mtvb=SH zkkyhiOE65m840N$pre3QDMO6QJs@swg&dr^W4kmRj#;4D08(S2!>D$twy#3%`Sg7S z|0*gPVcQ9l}ws5+7TuS8-`qI3Gsa*k!bDr%zebpcS=x1ywma59UyTQ+5ic zYvJ3K+Cb-tsGUw%uv4U-V_Zw%5dqP5x1{+*TEY8vQ9;TsnK~fp~w&%H~=Ji+^ zyb6H-2zZk*b?i|dfvl;I_kupHT$C+SBg92&suo`k^ZU^9<39@a^ zE64yroQ!JC9R>{PU?J0OfsKi_WC;1>rx;m3SKqmduDV)~z*w2|201tt?z$?sd->D z(V@s@;^AIcYMci)x`||19+H z0f>5Rk3_&R+~@3$#SkUg=4Ew;V~tTl^-fp>it9rS6js8{tLHCX?k}Ib^YY!(_Wb$c z$qP`MQb`eb0$DlYCf$brPa6p3a5foF3q4e%3v!`kJTCQ#Rfa1tRe{mcG&Cf45UOS5 zWtYH7j}eJv0*V8|BUBQx+sZW^LOr<`VCs{aZyCbz^)D40`%30mR$qu^kvv4QDw|^` znP!mwgmEP<%a`70h`9e@W%>$OfvZ211;9gFLt@v0XRQIJ&v0#*e@14G%a76Q@85xR zV+MwLJOvktDp1s}hYg%*wequ?rOc{AW{7-ZQTNkLh+_684@mBswFp1K?8EdicrM<} zKsT!|{w#1H4M>Neg|WcD&{P)pQ`odz@u=bq4@WiZ;(VBM>29e7MjMS;hPu;jzIscT zn&T)rhMz#v!Q)3-#peC1K zR~QB^k2I{)Eda8uU`(A0e$*Y*wMz{{*Rz=ps5+Q!QZWrE&n+fXaLnth@qDds274bX zJ3cm!AX8Kd?K+(oeQ$EXPlTm8jaWJ$(u@y|Fg4G1uRBy4g;x4fnm80akziD4j>5~b zS_5eZ4?QS%N3=OBJ5YtDE+lO-quACUrm{i$R1i7xeenztv8dkIk~d>fSdpDDp-*N% zYE^2faquJ>u3`-(!F?9=DvvDUc88+qfMg`GLC^{<0-_I(`{w~NJsMy$HT2*~wlJj> z4?!;dP6haGwPyeB(5hI9l^z5m0w?NprK=D*BI|HjA#|?_InH@Dolsq zlaNP&Wr0!_e zrrld_=C;yGJv8zjScvk5iCaP_scgW^w8x2woRLf|A^_it>)YuCN{0ZK$MydCnA=sj z(P+M9d(E5#(=IW%JI>ZJqY6BBIM`3>3VH|=6sXUNXS ze$&?P@usWH-!(pN{p%@^LMiQX<*dM}6?FkcngSfaM9yP!a1j78Sg1TVKW+0=?Ob7E z*B_dRop(TJBBzn_BNdxw3NG44T>9`d;#|Bft&%^=kdy9?{sx8N@fVvfA3uA(d0#z?$P z7{-z@A)J`Aa>W0%BHZ4YzHRtFmJALU=ypsiLSS?6aOH#wqsh!&3cdEzEl>?Qks?q% z3dn?py_5+|H)C&=81Gx-A>)TG; zb}h>oVd?}hx`LP<9wD}JnNhum{f2Yl@a`V;j?=xP>E8Uo>Fw#!$?@Bq8AQE&&lvQh92yRuPF_K7i`2LwLSX<;z1fGM3bAseg(n0yabaHR!! zSQ>t&IQi)I;2KddGwzm2$Hdd-i+7(sf7yKX#JxBXyv!(Yh;jF-;!jMyXPY+av^?}e z;y~g*9)c#jN~pKHP{-$|1~J$GMAC z)&qqNjs40D0|JE{W4EJwutukrI`Kcq4^j2Qr~vg*ny09ztP*%tsBUo-O@t0xz;b>{ zn3{(fXR7+s$zc|Tvm5!^nl|ZGA!>^er=g_r$;=tEEWyq!m%#KqGZc-fyt(a+8Rg7V zow+~Tnb00N8Uuw2y|aujJDMHCGtX27z(xp<>v{q!=nkPpN-Qt{xx6H=Pu(-FuduQV zbOl{mM$^N6afDp5Niwk7L{H>$r0RBmMqj-w=}S#|G-&>UI*^fGw9^hi=OBg7Y|Mxn zC&$sYIzge`rNF6xN6}M^o+h34I*z8=NpnxxqWhw!D=VndLP zo_!z@m;vnDD5#**HI=dcQZ6X|*$pBbLkr!*jT(Y!hV%nFN00+DKS2~SRzhmJfT9pO z6$yMh= zEw12z>j)eqA9f@Ct!<+#4qs4PDYnL(PB}z$RCwiHH%fTL<47(zT&G4N3xUz2!2RyX z-9fJbh5pGAvMOE;&d6+%lUVtbJlPKVa0(l@RGgH_g)_B)%?D$%mNm>a@WC30K_Ea( z?g7?DF*H?}#z>nZQSD|{SE-z;);59J&UA7~lZM$$o9g{mBTR3Uhn>;o*wwJ1vaEpvuN7LmA%w>P5=yySrk$wVINS&#V9hbB2w$4Qmjo6j3ttkd{BCkMKt1{j%i4e} z=S4{)s~SY5CUuCYk!4XWaFS;NyLRU74WlWa!(?ek`HGBXC8-4U-Y(u)EsA)WV^ytOn;WNK}O|wM8d9*Xp6!>p_7pXjG z&*6Eny?=nvpCE@@2o|esswGTs_jw4x@gU?lJcRnFIP*y$S)j2JYzLL8YaqAPehHBzv=qPtM|!rM-mEBs}P{t>iTd z1hfkn_EF&6%mECCBUuP1CM$}IqKW1N+V2T7PlZ{44Oe*HWD4`7gF>WG0qF^$&hl&z zV{n2j^PEv|s~A|wqyTEUO-w(US+UsBd(g1!p7r0(8`F}>oeg77&$~u zwM$K+YFVx)UP!Cj4e9*^kRc0EF?JXZe2)>Z3kDG0NnKl@T~Fmh`&qYCLdO8(T56pbP`{xBggT@}og0}Bq>Y?^?g?zgmL_e9a5?=(9{t%}i z5|BRC@Y;5YG@H3-cb=QD6mX3rv8Z)@D(ftpZ>e5NRAfHD$WXlwO^M}VPhni)s$?tZ zi!FIA3>o&1Zcp|Q`aAP>J^=qt8;2?g+nuSLHc#o$3xRGFn3%IWvS=b&xn&Q7x*(#?@j&8I2US741PYv$U}2e!0)YnrLJ@I7GBT zeU8KI-!Y6Fi|Qi|Y1>%$4@LJCao|4hXM>o#x`1%93A`R#f%DVD{J;r(-#U0;{MNyd zC)!!7m3M*c17#Bt7jFc zJI43vva2YFboGTE_84+X7Z^gkGh(zB`*1T<%=8W){ywV|YeH!;4k%tOS4aY25nP^)-OPe_JLkRi`i zOd_y^#FFLKbi=Sns@cehEK?L!>@pIW75I}Paf<6ITV~VR0qzf?dRq$<=%-!0a8-d<}I_Pcf7U4ptrB zwtw~xA?Bg6jO?A`&o4E#$C#Z*;vh5_-#-TBa{Xqz(}#q8etHk5oVCDux`q%&kBxO;?Q7sW)M3o zm}ZMidt45PW&-xM|Ee_B-`?Tgb8JAtW+qMwM?xV=g3$*;R#fA_N~eKnu-*3l)V7!T zugL@<8yKzs0P@j@Igy2z%7M&OMgeOD1B4iA*3}+CTT%=UQAKQMkYLqmwwW4jvI7_= zj6`J~t5BbcATEO>$gJz~(6ry!!Gk;f;3)|*$&OkfI$;U(x8vwmIwn|LVb8X1wN7^L zWTzoeV6Ia^cm5D2e-xFKmSlV^1ZCfx`B}W_D(ka|ZFBofCOkMiNNjsyyy-yUYSZ^Y z(ywGdMM-e2I1gRqEN&eKjZr?79V!-Hxs)qFO{O|$hc$C%5siz$ zS88C&j4IjHVKpD?D6rS=FC>|j1zgiWFAifK%+pX_Rkf^XlzQ%_+U({i zsW;Nf6=_KIkYnr|1)2R7BWY+Ym^ClCZ|-K|QUy3$NA|4(b5TI;ap?gR@&i*2ZjfPt zlq+0C}v&$`gGyv z{aQm>i+jo;$HU~Lnf=yeMY0xwL{4Lf|LsW`-XE5fcH_Nb3_2misZn!aBZ4F|T9M5r zb7<=g5F%wz_odjplZQ_pzIeB^_qRHo!zq?kUpz%tR^M~is_8vozuVWJ-)MgN&F7zP z;s=%oWq?Jp&1PD6D=TQX5 zLczC)GZ_kjel*-pn<><&od_Tc7}s{MWw`|ig_vD_*O`D&(tVDwHX^>-klfvb!na{iGqt`oDKO`oTpfsfq*X_fT<`8n-cI#I6R=e40b=s}X z4zSnrB_%L0)V}%n{MoCw&S5^f{NU!}9?F*}Up{-Uck{)wn-_?Ri<(DI7cXxv&K|yn z>>wAYc=_(D$7i@Mo}a(_*5di&_Xf+GkKep}*1Y*nw|VoZ)x7!Q<;7d?Jb8sz-@Lqh z_2m2|;)C9NvDEbi>MjrjB`+f{==oP~zIw5EXW0-IM(``l*>pJB-pey@OFakB(RgPT z!(_9Nrs)_PY})Rc0MZMBhHZNr$e1EAJMC+0ZSqK_NB<@)q&}&wW+B+X)y#{uiqyTX>-B?P!Lyvc<%m(SGn_zrX12$%CVtQG&TXoy zV0FU-?M^MzvD!xc)azX}kkc8gr^-(jxWW&ylm;a^WZ_xhGpPX6YDR7{aOl-NP=NGy zqkJU)VSbW9E)Y^hdY27RX`3f^FL1{+C8b$#S=POou~Yl>$-SwE+igXsCTaT=S-|1y zn7W#o$G8coGGZo4!tCwn&enDwtpw^>ta3hrUUN27WT=z?aD8qfEW!$~!SPb8l;a7V zC^TGISzk=tIE2co1C>>8vVuu7ka}kWqyW=k0--tQ--#RI1e@4QB}WcN-et4hZOA3g z&tE-$1%Hrb;aV18^euy5nU*C?A)&^@L0>gpuR_%=;bwYqjt_j(n@eZcMs3}>!;PCK z5;L?z({bXT*$IM99C~Ca>C=Li1kyc3a>hBqXn&k67SrN0^zZwFDA=+rPLx1)zQcw@ z3NA&i0QEik$Z?^#+e=Di_|~SgQ$nmOWR@m7DCix-TDZ|UN9}5J?x?j62q1M$Ydy(N z!EWTI?Ua7pQqx11NY|0x;Lio zxIEp%akHkeMvQ2Hc{w`#zhA5EbC87`sQUx(PWcFA)p|4WB;8(|3TuN&4YXNamlmt32ZN0SU*rUy7!Ay@ z*o<=CYn$lxqEbh4P#oXjX}_lqdT+(rj+p99u~GBMLC`N_9iU?&}JxvP&@IE9E=JB8DSIlaFiI2PPX?+ zTp$)>5TT9aNKyl^rJu_-ohH&6KWIbvyK~TqW=%f06`($FN5W! zh9U#%QTzzYH@XjFO$KdN-aY$>8bIJjwI3^sP2F;H65EV21H($Ew};EFbm&|cfcDf} z1D0zY8391OLGo3dNJ!`WRDn?oSJek2g#B5q(kx{sl{RolAduDTyKR%YF>Q>biqYtj zxgR6BCMAdlzxibf1SUUg=9V=ExVp_YtKW=1?{!{mKRas=A3Z()>I{MxNkMe_WFdY# zGa!)Syu)!&g?opIN&~V9x$7uKPQNO%7EV;-5n`jX(9C$Y6Ifh2NRq&e z4wf!>433iufsJe*5((1@LtMS!JSo$cC zAX>t;YQ_Zgp(i@?c~2}zr)Gux0s_$0ED%f%Xm`kBB{v5pC^8Vy9*h#~ZW_n&y^$s;h)!`SP9-j=qs~egF=2PIe6Tb`wgqCLSkkh{v01?@W;{OZ{9_5$widEH ziRmx~wzTz0Z8DU>Y6TwQjP55RYhP)mat@w!bq&)x335H)Wj$MAHZh$N0>HtfV-|#< zXIMzz;}+*`V;4$-JL+-E2#~!}atH}#))BH{d=;qlHNnmmWX_cA!mF5INV{G>UoIZE zZXiZFCtOd53S8k>zffS|{B9_Qup{H;*tjvA~yyqWrOuwZM4L#lXG(hnMk3wiSQj+ZAkQC{N^VHkBo3;$6(|Tce%NxIe-Bdf|Fg( z1J%Nv3v|6gz1SrJ)w$4*%D+I4>GE6wx}9259L7~V{Whd556KbDsh_J((v7}VUR z0LL)=-^3IZhC&?B3dDmB94n|YgAoQvZii74tDkasETJLjUK3k}zI(lTRgtnzJzigu z%61#|WJh0QN64ta6EpJ~GoW5TPLPV>>HW#x1bVwyJVag;* zm|by~yT@rVp~`k9#{hRCVy8!4LT%Rt_X!dKxXmn zrhF1Bl_oY+e)#c2Cbz)IKj=F#-OQ03#lMZ21<}_Dx{X#Fqo#oYfpEF`YtF=~Nj&j}T zD?=%>m2{dFpq?KE#Zfxt8rKXE8!BVcEX$TO6S{C#MfyEhVENFy*3KB00MnzSiG$z! z(acXwG9FRlbZ_b|Es{8~q^+P>#5x(~&3G0lS6VIy2!}yPqGkaKqkgEfI@UpT{)jIKFvhY+^y4N0b{P8oI)Zww=1$&onI z43NhYM3vDeC*5iT_yWPF4MgtO7&F)ZE z_y|=>tvV+rd4B~ASi1=m5O>)Z!c^m+Zckagnx*lkfB^qOg6gBg$=+>X)>H+50w^kq z2GS1idG_iZ7)a9OidL+H#xS`TkA9oCVtEp}x*4YkwrL0q1PLhl*f zejI@5koz$#CCd|i6>eMVo_25+ERu*4mdKFO@9j*t=fIW>B)NS8r%QN`fG&3&?yG}S z)yi>uwce&CdPh?~61ui>;t80>A~=cJNQ9CeC?e_@Iyd%whz#3|bD0(pdD80oq8QZ@ z7~pKGqm+4*B5kCIj~Z_Cj0^GkLP^~a+%nODdO**C0gYd!=HZXvy@(wn5~fy7lYkm4 zTlcaZGt)9CmogiwNNqq1a=Zrz@Z78>P#XcJ2f{qfG-tjw88y3F7nXZi>vpzhXw|5Y zyQ7f>L2P!rV(N@sgP`y2Ee}rSgrgI322nSR5F{%EI&j|ZIAxeBGzIaDlcAm;SU|`s zszpYElGF`EC=C(JdU$m+XPcc9x!OSFsG{y*W9-R%C6@G3b$)vS))z8kXLmetaX&-X zV10RT@68ZFjg*@$A@r;;aOjC~0m}4LN8E-QuPnt@PSsUm8cwZMkDZv_V|zw=vfX=( z{WJyt3{Od?NpjIG+;n~(+|khi!s$ZSufWbZJc)Lh9JBj*9CxO$g|`o+J@Cw_wto2X z*6#b0M^E1$zI;SOvhs#6Hh;1C{=10qtn|jdKDt;rj`w`0okDnRF5i`ydqh;T(ZRv6 zo#Iq*SoiPf)S`_=6%d6ERE7idiKs=SvT7XBA!djN5EfsasAp^LiF#h>cp@~*)Uy>b z^~{X~4XrQW5=f-$J0#<_-j=hrLqZ3(49Tc{O_Y-rGitI?BtfLmfG{5LANU zO-uAlcNb59sX3$3g%HL{EvD98Lt#KNLJs+6wIa?IiF--Q`D!}jr5$G^o!e`8xPsuf zCXqFzgpB5QZ~N}}I{%Z-&VGPY2_WX<14!vC>VSJd!E1of|l%L`f^>UrM zkH>U4Di&D3$E}wH3 zI;mnY4ppI(2|*UYwG8Jw(5Dud()N4=>Yd~nk|k%^zJ#f{E7~RpGc2F7bpcZ2QxM#H zhtxA;v=%R4K7V-j3jT)(Qq;WuWAe8jgborXjj}Y6{WUDJo zTkMLHUR;bdjnt{gfFMo8#KcK?)uA*LWRbuZ?mc<<(i{`br(_Bbj1^6A=859)e56hg zJ)%IoK1`}t!>}5LyWj@m@>WS-PwoXs)FPATG+F`BqY9CjarRrmKAU)w2KT(0mci-4 z9i&7LKkppdSrWMPTBFj;VtS$`xT_guH9btce9vxc~Bv0&^8rbIrZ`mT4fFyii5a|#y1J{dn3n%qpg&&~u z7ZEt7^z!a-9Ku{8xx-o`l=>jnLaUOk|9H%%q}}fEwd=*)rsj~^(g}$~qEDe9sS@Vh zQrh6zFS4+bQQDvxbY|Bb**vIdC~0wKxV=-mSd6v=%ob>H{1)}+_`{VP;?BtH2&U$G zx&t@&tpw7~BvVO;6vzdQtzK2$TdQ`&gI%=U$lUtY^GCq9O+C3hc z<;3G`O}MO1o869yrE&7yi&`E(t0liRK>B*q>A3Z>7c}yzk0#CuO0)etuo8b8s@P29 zyS+zYk3z^{a0{KUyEvH6H~2f)6Zss=f9+*^#!c`7U-}Y)nA~VQdivy@=9@j7Iu`H% zn-oNdlCAmN4xII_X_3Csc#ZlME;hs$xa|iwGjOk0=b&xzX?LgaC~?gM0RSJ6gVhD6 zT%u-~5j@J1t*(V`4ck2mi)VLXqE}n1IWqwSaQVr6j9APT2Z0BvmDPr*IPAjNovJ*y z3XNZ2Vte`ov`rMpq!ozxt)SCn8gxu?9T!;v9AWYc>l-+73#^&&tqHDyZn+m&1HHz9 z#r0u3wUKohm^rKxO`FLW-QI*^^e{>zSMWeK7j-=4@L$!^r-51&j3c!&sA*oOWn;Vz zgktmy2elYjub>m2jc}(NJ_#_rNMGW4U~4()2usa_(@xWeLE;c2Z-t$cAzxrs z?bJkctu^#!1(H4#az#?aJBKNb4rPsAr_~h)1@&a+@DDrIO;b!S%j4Ru+uX$li;gpG zmC*-ljfV|as5{t@fTgG!4jI*TT!1uKA(s^s!7rh&;yi-h)2O)>uw%hcDn2N9Deb^v z43j*bOwvBY05JG+0_jeEz8mgP6Iz|m6|j1l5qqO~vgyf}8%CCK2Nd9LoCrG3L{_gZ zq$6)gtX+f}sKWGmWqhGhA2tGDs&$^&2uX+=e1{!H>XRrNr@y4-6oKpNaCf}Dvp>Er z1-1m`{tJ@wx`r+=uWfXAgdiN@iP-9R7g5Q<@TlWaM(tv+QQT2EwUmuK<5PIi+Ga+S z1BaQEK0KPn2*pcboe{+R>)YUAd=jNXv-v@{GwFTsf$WH3#55n@KizF6ks4yO zCNDz}ll@~3 zD`Te`UxL#3v?o>i-i!i}S@WtUYGHWRRcy7CScIwnp_{kygHnu>eOQg$#VJ}PYOiRh z2L+KI(>B8LMjvbE5I&=0p;?^?%V?DqSaD96@~XO0{MazRO3Ls>v(E41^uvF!X@?lU zTBUtKtUE{>icdl4Kp3#CZ^X%F^aU9ns63qXsMvc6q(|iz zOgjj`U;{;=wulJVOa%}0QmMX%>yg6UV0wif6mmRd+CB-tKwlT~{>ofbpxO+qd`ICj3~Cj58%I4hlab~0F}7(9Fnt!0H76ukWW-o}lzU)~@c%~8 z{-mlY>KZws!J$$OxnouO9GLBu@x4hN9N$DlnrXJj(3OoKs0xxU?y_hEN~Sn-mlBW6 zn=PSc~$d;OKp@PWL+DM}V7%^z2 z7Vha93{@vSi!L-!(|dlQ6`&>w(iwGFK}@Vyu-keYzhD1++L=wmW{dwA@pl7j7$4Fsc# zfUD>whTGAhyQ9>RauKA@3LB>bEp&DmRc6?bLZuR+a(0kd zg+k``M9$X8)DePqhsJV@O(~C%N@T~3@*o$PL-lQ8`DfX_HAp-F_1&(!wxQ!;9`67X zNztn0?;39&%ppSmKvAo7Y_fbTpaBMtG>FR}^SBcDJ)dL?0^+_<82ZUdEI&<) zLo`T$5Sy-{V=B}Ij7~4tbQSn_hV$0Stl*>@6lUYUK-R@eIO&r86 z5QeVGQ*E8Ny+l~{`GFlk`XZuS+UkJZ8}>>{umV!^@Ku2`Li}=&7QVM!KUv>Kw`-A^ zHA^Sw3)8sr{0)b;A3xvtnVpnNut^dba=&`SWB~Q3SP&)#32R52J10uew=K|$xDT^I z!Y11@^#QfqiqR$f60eo9r+wsndTJV|lfI{LR)Z|^_mfoQ33q$>a{lm~UR9KYD*Xbi zMx)`J^)aago9c5a>m!R(z@jPQHRg_w2tAf|d2a|I4lIGgYg@2{!TyGejxi-86aEn+_f3G0ZmMTC9wGK^;(c`^1T;!=%IXE_B=nyQV?x z{LyT2+*{c z5vl-DAQ|rX^zD;9(4L1l*_g0FJ5*cuI395Rbp=S@WqS+>#J90L&}llvpCCXUaAvc% zHXst70`AssMvW$UUCl6eP-K|fVurae>%$q$0MQM|dbn_l1(&>A2FDSLg6%xaN2>+-SjaPeJU`B5n%PNYiN-5%n_Nf5L9#;4RfS{lC}D}eFs6fYO$^Qs zj`@I)aIe=guUTnATLAR+{u+hBg9l8J!KqvLJj46Iv82n7!kL#P^bA#WC79h2$&wL| zRcIXkB%~3B#^U7a;}HSjv^?8zoz2UHXEk6wuvpU_=?O8ehB$hz>ya_?9+Fk#4tTMf z?A8eQ5=~^&R|m$d2e3)di!I~3B;Dx}ZnT2HBqxCtm5;h%}NGPnk^puFH= zNFBP-T_C&u5P7+H-p0IKL88)TDxa$ob6s`URhhXI)a4#x+8y1axFi`gtpV6-cRvw# z?g%B#nxiF%R-mD*_-$_ImhDHww(nx1jMLL8%&FGNkXK;7=}d4I9E;sn6m&7rT_iD- zg$YMLi97AhAZwWJfw6@GB&s9^VT!pj6I8R@xIG*q))_Ol%%47e^rCtB^m$W?L1k~b z$=ofskjI7BcDvQTiT_$R)@OEUd{?8<_yhdC)_DCFKKWgrXnY3c@HhWhqp|(TZ~K+k z|I%yQpWNL3#K*5SuYK~{wm-E$yf8LjHpFi(Upxr#RYBZXFg}>j#kJvxG`L?>(3=MD{;H=$T#Uy@v+u+sK7Q@5y>4$W=V3F=gP!!yX9Kt0#mg2; zq~~e8b^|{@IvC$PXngDwA3yl^*T3UqZ+zr?U;Dn-e&E`tUi-n7 z|Ch2d@885&*`M7%%F2ZAV@(Hm_{HnB#+#M?ys7^DYV6OOd2_V?e5L*8)jq8UgCEDc z4F3D^dkp@O*nflnIjkZ3`+WGJ>$S$M%KL8VeVeh>t@w*St~GwD(*CE^{$Gl%ek%U5 z_U%ghw%T(q+Fv{T(DhoQTWQ}_``?JIxZu*?wMM_vzOVK_6PxtoFaEgJ7*yI1D*Z9| zvv`-m=W#p@{&QKG^M5~%?;zgEAJ-aNmG^DweZLduf2-2|i^1in!?|Vz{>&5=PRcZg_O8I9h2X@`FnGPglzSc%^(=DK9GJ^GbPHDZf)GKdh9$S}8xS zl%H10U#pZ~RLZX^<@YP)uUE=HUn&1$rTkA-%D+@8|1*{HFIURHQYrt1O8GBV%Ku!Y z{Ff``f1&ZCMa^rCaz(!0_@@i_wZ`8n${%U`Zc+Yd<0s=@A>d<;`$hTVjbAUy-`4og zi}JTO{!vl>j>c!>-sbbZv+++9d4HmDQIx-@ z@h=zUHyVGhDF4aEMRvnc;?Rmwaq)8DnmkE8;AUBi0I|E^WA$+gChWdYSyp8=%j=7fXom-&MKa_7CQtGP=%I^B`>$2Xzf>vzn&1B=Ed4hcUu^t!FOx5MqXGKl#mmRt&Lu5a--Yu2 z`T6AMmc;t&59Z_k4MV-feX*w>HksmxD$B z@^Wj?@3hce>*nc`<@=8wo}Iq8eEtHNO>t-M*4gF7WxsdUT3ohz{fpjW(C!X47Ry%a za-+NGbk6m<%jM$bD;SvbUEN#g{nrJSvVVSo9xcxo-CnPAeuj6qddTj2-rMTha4_o9i&xL^Du@kw zn`ev5v$Ks&3_$<9cd=OX`WyYlW`D6|-vyiqGH`yKMo!;f5ySVJ0owo-qjCbek ztl!`2E--@2&0gDw&u{2-Z(a1et=?dNG;};KK zWaHND-0EHQH#>-j-8*l!7n_}}1;=`$wcNyL_AfV=dJ!_zE>F*~klwwuv2knJyS!|7 zH_m&D_F!>#-rE@T+M632mm58_A9S|t7QO17^K;zO*|@ba81yceTWttXE;jm?cUO0qK^f**t!^W&bpm2ZrU%t?6%s2Tivrkx4+q2cKc`T#bx`v zzqPgGVr`wb&M!94Z4~16;1q53Z!LOfn`ap2OYDpDt&OeCc5iEQqmM1M>|gdbZ2{>f z?aN2YcNXVg=WujxwKo>$?Q;y<<)U|ScHUohFR^4hXM?SNZ==<=*}{6j>f?89-NNoU zzwBRJoMWD`+%6X9-Bzc+b#dNaY@BZnE;SahgL`$ou6UrU<=jX&M|6Xtz4cD zI)jbN)>*gL+St5UTx|8*nx8?hf7V;n-2Be7hfg_5Z4A`KVq?+noo%#wTNfNM?3%&g zY&qzm^B03PHxv8m{%&`<7%UgqN*CBfXKj4*`LcV_=_1zN`PM~u&HcQ&4_q`@wg#I( ztb^VrhVShBtUu^qoVCt2yI3q+1qO4}yZqqgLwj`(-_3Q=#mX35o^5v8XWfm><;8Na z)#C@%y!ztt!tUK%_RiY9PWybT-Rt)H=bbLTxV^RPFZ-QM4F1}Cu{CZj&O7M%5}h7w zb(XzW2g3%8)7k2D&-)h(+cf1uvHa6~HxgC%&(0UU_Spq?GEi!#jZJ;gg-m{{f6?B$ zsJs30(c;Csc6a9z$n>Ip1{{wGUu?Fya9WGSCD!&5NVBHry4z$Lh%UFzww8ME^Zd{yUe{7v^_Hlb38~SX3 zwcj0Z66)5fy}H}&-#WWE?{qqsXP4&}3#`@44i-I*F&wS!9(O>^xV>6D=TU)OvKTBn z7Z+O>IOz~VvWI=uS#+@ME;laE`q*--H{-rR`&O&d1x`Hgwl8`EtdEQC684&mTT}7pf1le=Y1PsEf8%u(YUaxC)#+Uw$onx@G0spN$WmUgU2b zKUthTTAGbS)_nBvMQwd-4$VYubJimg0fn`vuO3}IeDCqoi_nl}BD1f*kOg(#z0=WB zVE|++iFg1qB|*cN%g2m>toDsp@3Z>&`NOC2aYrxCv$4Vu@CB)|u>socJN{;)@nygM z8-D$_{QCW1g9!gozy5EaC0YK5e*F>9f-HZ=ub%=f%yQGOEzqH_gVpHymGVrMN%Qjh zGkztF%Q9(MUibYwng0{5@~~ zKlt_k@#{y}9`6t9;NSN$?_>S%`}Onu9+Z22{aL@B`SpMD>;LZ8pYwI}u3vx6ufO5f z-}US7`}HdvAC7}xKkzGM9jxcLy^cxzE?&1A;%a&QJ};BYd>x|FALsRF8jYXi^`{%) zzN~%Quc*@f6Teb=$>(Ukaiz48<#+u0#IKavvHq9*N+}o1zv0*4^y|Op*Z<0|f8f`j zc+J|k{d(ZnKke6tetqAszwFn)>eqkWum6r;f7`GBrCs`P88NZ(SmFtN2KlSUM_v^3w^{@N&xBU9I{rY$O`rr8VfAs4=^6TqZUwrO& z`}Ifsdc&^+zwZ0>fnP8E`ogcj6rZbEeewR)}^d7zUPW0Ye5WPnydJm%a-g}D{L?;L$2qK6cEeIkA zf`|x$cTMv*zwGm2?|sfb@AaN@<%8>Y-D9pf=QIAZjPcy#Syl$-Wl2_JL$>2Uj^!*a z<3{e`1^&uMj2iyI3ydQklLZX_a?heJ#lZErh~Xcy#_CQS!0~RMpAy#Aqwhov+yk(&t!6^aLgoQ0uZ{Q)G4jA6JzOMe0 zuLFj+tYSqEH+)E2gf>M(n_T9L-r=!L2;N(*eUD_p&TfA~|q_3gOAU)Q(Cg>c`FFMK@t1Gk6! zcAViq9Db;IJHAo@GyMnL2#?>y93q;3p)_7W?0y3!~yGvAD;t;hm#&^=&_@cj)~IxK8hz?NZQfgWtc zkHf-d25c3+zX4l^g{=tKCM;}Sz|vu1TLQKXUq2BTcX%D>!Uqh03%xba)eh7tn2uQ( zdc6v$i!%H!Z|@iWQoJ>Eei0tc+d6c95qcfNhxB%PCw6CF4&rc*W$654raJVxE>*AM zI&R@k?&U!q$wAPUl=M<_d<+CpW3L za}N*j2v0C{zIj=FowxabPZ+pX8+gCHVU$S0Iws>XF;g%dvoIG6uqaEjBCE3w8?rgu zuoJtpF9&fr$8s`faz2-G71wbKcXBU7=f_9Yr+A)Mc$0VekfHPFm+Axzyl-PLHWM;A(=ZcrFdqvuG=C_suF6`h&!%j}4(!U_9KfL* z&54}Oxm?T@T+2<|&d~hifcgke@EkAmI&bp$53au>-rZHwSPiL-X5->gk-z#azL)+{Dm4c#rx3kMIP~@iMRTHXrZ_pEERn zjuIo7YfQ#vVy0j^W??QCU{RK4MOJ4WHe_?QVJ8OGW&~d6z8u8i9Lvd^$@yH$Rb0m{ z+{wK>$fG>P^Sr{Fyvv7t%9o7rPH_Cu7>n_ll&P43*_elgSe#{9nKfCLjoFgz*qJ>U z{4^-xF3eJ_$k6;gG=FPidnv;rXI^F{D1fT|G#^`|J9%WAAc^e zIx(;xNtv3N7~XPwdwZzwQcPWzRalGRt){m>AL_TXRd;4D4&X43<^MRoxVHb#`a`+> zTp^ZVdA{u*hVSS9?&JSIt?#tJ{w(7fZsHDx`b~$_#~JD?URK}WBR=D6{_p0M#r^(I z=l1{UI0_n9ah79M2CfGOJ_n(GVGH$t$B$qx|G#ql_@BK`{%5y``p^HXKbOw?nx7T07#}^|)a6jTO zF$3#F0^cj4zI%3cKEAyU6MlPXbtQ)S?e)}6*_xf$gP}hA5cOzI;@j&prNhD&s6+kr zz&ez`_%?9|_wo=!ef6{I%e=w646K0Ijj7xkYDe z2G)rM@(lIG)2p*FFAK92L;dg?>beZA^Jt~+$WR}=pL#GyaUuiji2~yZ^}jz?ujWQ> z=Qj-Xy^pES@Di`{4nzI!ztyi8S${Sr1M9p3;|cY-Q>!yECkwC`L;dZ*I;gXmXCthJ_{Yt2R z{ip5E892cWJbpC3$57uou&yw0dpc%i9tM67JaBucUtK|6ogc9=KW3;;-A&z>pK&B7 zFw~!(r(Vi0xPf0W)R+EFeUztpk-sq1kN!jbl>ahP_<=33pYJf#hYqZ>3~W!ujLgCO z4E3MOs4MeB)@L(@`p%!Id-78b3F9-+Q+0(EkxWftaUsGnRyU7poghm9EOBez#~WgiY=XgyJ= ze>~0hxm?0kT+dM7c(?ihf8Z%zV5ndGoB9F&;!8%<-;BXHOw5$b!0Zh5hl{97vl45v z9z%WM*6L0S{BB&}{o0>H80rU4QqSZ9F5?=8`oKHXdwGb*d6uF6?+x``zFjXBKAval z*9`T2-;EI*Z+s?W8fIpw-&;@}_?^4JewJfsomFjhsL$I%-Hu(@n*$l@?~YSX1y`Fg-*4+q~++EX9hf!BF3} ziMka#vOD{6Fh_ABXK+40=W1@`c7DTyJjOG;#Ou7nhy0tb7&*L=9C#nZWIQHiYGz_i z7GN=!Wfj(912$({c4jXQ;4qHm6wc-%uHcv4!mqiH-}3~2;uZeNd;F8n8Cb9#$R`@# zV?w^qbj->;{D37{fz|mD8}nm!U^n*VXB^21oX&Y%$}hNqUvUq=<58aGMgGFu{DV*V zFC&FdXahOD!?;YsRLsa6%+I1M!^-@S_1TPV_z8RRQx4@APUb8wzLM*}Ztj0QQ#FlK&uI$4>9KrFN#<^U=Rb0<) z+|2|0fv0$Z*Z3PB@Grh(#Mr@nVlWO9GbJ-HJM*y!OS2MdvL2hVH9N5f`*R3Ka}sBA z0he(NH*p8|@(_>nEHCp0@A46!@in8w3Fh=J<1-o4Ff+qX(}Umh{9nBekju}9u2&RQ zhkw-HK3+vuXQ&Sq>idSSTeNX|Cw6CFhWb&%)nhrCp+4Mv^-`|lI{u$tC;G_a{=f9` zBgmienT+A5`)~6J|Jc9vzdm0uhyVI~!5seU^96JGug@3E;lDm#Fo*y8e8C+4>+=P3 z_^;0w%;CR2UoeON`h3A0{_FDvbNH{%7tGbT*-CZ%3a*gBRt9Tyvkd=&nJAr z2;q&)z;%b{jLk$$!Su|=ye!O8tjHRy%O-5aj_l5U9L!Oi$Qhi^&$*f#xt-teAdm43 zFY!9>@FD-^D@G1qnEv)UALB78Q!^8DvH***EUT~<8?ZUsvNL;e0Eclbr*JkGaRtBR z7Jkir{GKQH6R+@B-s7Kq&an8we4_C^Cgl4}$E?i54_J~FSe+lSF+XMpc4J?D#*v)B z>72)<{DK?!75DHv9_49X6awx}eGG}oimvb#Qb0@#$VgAT-{FyiTJ0J5OzG2ja!JJ|-0h2Q=voJRcu>{Mr z8tbqTTe3a7vJVGw1jln4=W+>GaXq(jHxKX!p5g^w<8OSxzxa|769w~$!8lCJl+3{F z%*P@u%}T7vdTh$p?8F}I&mkPmNu0?AT*fur#2wtrLp;v2yv!TC%SU|1*Nl=lnA5wA z&ty!)%*@4tEY5PQ%Gzwm7Hr2Z?9G83&T*W|Ib6(@T*s~4#r-_OlRVF>yv6%`!WWE? zB$!Wh#%3a>V0va_UKVC4R%8vh0|6(c7N<`k3hn3SoRi8)z-#aNbASc?tVoNd{ey*PlwIF?g5n~S)DUvdk-=01MU z6a0x+_$%-6Pd;bhKeP-S*P`(~Cgl4}$E?i54_J~FSe+lSF+XMpc4J?D#*v)B>72)< z{DK?!75DHv9_49XbT*-CZ%3a*gBRt9Tyvkd=&nJAr2&sbk zL}zR!VhW~bHs)nvmSRQLU|lw0D|Tde_TylV;zZ8ie16W=+{o?xh6j0!XLyO%d4~`A zH(xPw>R?VW8IMVsnwglB1z3z_S%tOOfX&&Ko!N^6IE-UCg|oScEBGb1@N4el_dLO$ zc!j_69{=QXhNTJS6OHdNA>U^@W@R3Jz>=)M>imd}`7t}N8~gGzj^qSR=R7Xu7u>+F zxQE~IC{Obuf8lNZ!KeI}kY{Zsq&#vsl zK^(#HoW{9a!c|<)ZQRWR{DG%~&g23v;~H+_4({b49_LwJ<_+HEBR=D6M#&J&>0QQWGNxf>=3+q> zXE|17Z8l^JwqqCe=0FbTI8NmpF6K(E<5uqCejedTp66BG;(b2h3r5Ho%qKcyGZ9lT zJ+m<{3$qj}vIgt230tuvyR#n$a}+0X2Iup0uI5H==QljaV?4u4yv{p($iMlDkuwEz ziph9P%GAunoGid%EXyja#RhE7w(QJa9Kc~5%PE}AMO?uzxrJYIAHU}b{=_T%mG}53 zpEE3TFrR3Aj|urc(=jXa@B@})1y<)rY|M|@f!)}bpK&B7a60F4DZk(be#Jffjz@W# z7x@cs^AA4dzl@Y6nA1Cq%Op(2jLgCOEXp#h%nw$hb&f-EY=UQ&& zPJYY7{E_GQGjH;DKIT7s!>Cz3+5ApahRAXnSt4vk40FTl~|MY*p#i=i9Oh# zLpYj~IFk#wjBB`wJGhsJc${Z>nKyWskNAwQ86|r#r*|2j$(V+jnTrKkoaI=Rwb_s@ z*p6M;n*%wV<2aRbxR@)sj$65l`+0;Xd7f8!i}(42FBl<5FrVm*%|uMW^vuS*EX-1@ z$QrE6CTzuy?9P51%u$@k8Jy40xtbffo!{^vkMRsI@jCDDA^+wpM$Q?`DJJ7FDN{2O zbFu)7u`H{w78|fR+p;rzaR7&LET?cb7jXr@+BrC8wKVoBk%nt0vzWj_MIf2tTk4yOlH}EU&;deaB)4a%Ec$Gk5Y^9_Eic z$DetVzwf%R7>vWjOvwz)&U`Gw(yYXqtjDHo%}(sW{v5*5oWz-2 zz-3&+P29n~JjCNX%gemMyL`lFe9b8Nf;qj*_)Nw$%*x8L`LS&9`| zgLT=2t=N&>*^h%ciW515^Z7Yfb0fF&8y@5_p5Y~4=N&%e-+aZ$1%mqbA}ZR zjyD?LV?w^qbj->;{D37{fz|mD8#DYb8o$k_1G}*=KjTPF;B?O8Qhvb={EB<{9gp%f zFY*`O<{x~@e;KJzaNO@OE|V}7GcpJBvnb23GCyQ}He(xp!k+w;Lpg?%Ig1OqoNKw6 zJNYdS^GBZJ&%DXs`I!Ik4WoV#%qbQVFgepQ3v;s&ORzkvu?`!tCEK$r`*09Pa6G4R zE|+i>*K-?p^8kO~DPG_;{>BIVi!T|ma4?@3jKjoC$qdZSd@RD!ti+nE$EIw}PVB+{ z9Kz9@#F<>cWn9Be+`+v(#N#~6%e=w6e8gvb%_v2JIlasHOvW_K%v>zU;w;Citj&gO z!FKGz-WyMhxri(HCAaWv?&J47!Jl}Azw#dciI%JFpx3@-vR)1WxBXF69^8z^}N6-|;9<^CExYZT`Wh z{FjkR1ao?aahZgvn2|Y{pG8@QmH8p-vl-j)6ZYh%9Lh1A%voH>?FsE2dz~oHJEX>V9EWz@u#yV`omTb?i?88AE!SS5Nxm?0kT+eOX z%>(>_r+9(a_!}SaFTP~NQo(#;Fb)$lB{MKP^RWm^vl45v9-Fc?JFy4*a|lOs5@&J& zmvId@aR>ME5RdaLFY^ZP@)4i$HKUXc=JYP(Ga1t`Gjp*Zi?bZ7vNjvC1>3O;dvhR% za~!8~4i|GJ*KsR%aX*jnB+v6IZ}C2#@C7533FZ@>v6+Y|n4Z~~mxWo16pp&lg}AeE|^a=zQ=@opXr#D zdH4ZKvI48~BR1y8?7(j9%g;EH6F8moxRhUT1Ha-Pe#fIc&5QhnxA_O3@?S6awx}eGG}oimvb#Qb0@#$VgAT-{FyiTJ0J5O zzG2h~!JJ|-0h2Q=voJRcu>{Mr8tbqTTe3a7vJVGw1jln4=W+>GaXq(jHxKX!p5g^w z<8OSxzxa}YzxDoh{U75nF;g-Fvojxyurw>NChM^&TeA~;us?@zG$(N;7jPNZa1(cM zFAwoJ&+;;F@Gc+m8DBF>rC?6)GCq?r4Kp(r3$i%Nu_|k`AzQE=yRbJ0ayZ9vD(7%9 zS8^S1 z4(4Z3mSJUn$og!?HvEJ=`6-8T3@39I7jik*ax-`GTOQ_*Jjb7TlfUyZ|KS@(tscxN z785Wz(=rQlvk*(LJgcz|8?hzZvn%^>5Jzx4r*STqa23~c8+Y>nf8Z%z;5Gin2mFgK z8L>t%pBRk8#7xNy%+7o)!qTk7nykmBY|T#W!Tub=(VWDYT)<^q!%f`5y*$L@Jj=_x z!Ml9KXMD{lHG?_5%lJ&jG|bFgEXd+4$EvK&hHSxh?84q0$l)Bvshq>bT*-CZ%3a*g zBRt9Tyvkd=&nJAr2pKZ@yyWTEU!RG9HsMH8U|M3$Pf=vI=Xl0h_ZeJF^!Da2UsO z3TJZ>SMW=2;n&>9?|Fhh@d|(CJ^sn(467Z?CmP>lLcY&*%*s6cfF)Uh)%g({^J8{k zH}>Uc9LWis&UswQFSvnUaSy-aQJ&^S{=(b*gHQP{Bh?A!^bX@P2~#m6b1*-PvJ5Np zL)K?Aw&5r2$xk_yV>p?!xRA@amYcbg-|{ejPNwxVle@eGcB_) zHw&=@%d;Bmun}9bJ-f0G2XO?)a~kJz30HAFw{bTQ@CTma1zzKCe89i>k`e0$^NGPY zOw5$b!0gP&A}q~HtjT(8%GT_}9_-H{9L-6b$pu`-HQdA<+{;5e&a=GC8@$U$e8$&| zQZJa(yNu6dOvB8~#eyu(a;(bQY{(XD$1d#6fgH|poXR;|%#~cnt=z@^Ji?Pa&#Sz} z`+UL|j8H$APjtp+BBo$^W@BC!W+_%=4c287wqi$iXFm?+C{E-I&gbV`&5hj7Z+MW$ zc!rmFop<<&_n46HGaa)s4?kc@R$z60#K!!X9oUV1`58xY z0;h8xm+}j4;8)zk?|77_d6B>HHviyL{>w;>f;qjzxJ<%S%*Y(f&!Q~D%KVV^*^F)Y z348KW4&@k5<}5Dca<1iO?&P;T%pZA9|Ok{Ott z`B;RdS&21Sk4@Q{o!Eo@IfSD*i8Hx?%eaP{xPyCnh{t)BmwAJC`H0W>no*htb9$HY znT%ng6-Iay*ZG>IgV2~hl{zA>$sJ>xSvOOlIMAqw|JjV_<|9d z1@no{*i6I}OwVl0%fc+himbu9Y{FLT$nNaN!5qbjoWc40oU6H!+xZO-@)*zX60h?P zAM$U$V&vw*oMJK_lQK0kF((VK7|XH>Yq0^Fvn@Nb7YA?{$8rj1a}ihYOK#!U+{f>E zf$7f5zHqV-(y0)&veYnJp6zqS%KC05gYSkc3?O5<1z_TF(Y#@KZ~*qEAvCvXEV0pC+x{jIh12K znX|Z%%ej`Dxs%`WFn{DZ{>+>Fosans-!SUO!JJ|-0h2Q=voJRcu>{Mr8tbqTTe3a7 zvJVGw1jln4=W+>GaXq(jHxKX!p5g^w<8OSxzxa|7TLtrp!8lCJl+3{F%*P@u%}T7v zdTh$p?8F}I&mkPmNu0?AT*fur#2wtrLp;v2yv!TC%SU|1*NoCSnA5wA&ty!)%*@4t zEY5PQ%Gzwm7Hr2Z?9G83&T*W|Ib6(@T*s~4#r-_OlRVF>yv6%`!WWFtCYVoj#%3a> zV0va_UKVC4R%8vh0|6(hF| z<`k3hn3SoRi8)z-#aNbASc?tVoNd{ey*PlwIF?g5n~S)DUvdk-=01MU6a0x+_$%-6 zPd;Z@yI?-i_#PATeWqhp=HUk{$qKB_kJy+Wvje-aFF)f*PT+LT<5GUX4g89G_#Kb( zG%xZO-sT^C%6}QDeK4nY7?(+yiW!-M`B{`@SeYNPKAW)(KVeUP%Ap*?$(+T7T+X%J z%$@v}hxsGV@n_!T?|jUE_=ZtC1apeT1WeAf%);C(#1bseYOKRXY{~ZQ%03*#5ggBH zoXaI##r53A-8{e_c#0Qzjlb~$|KdwV>=?`^2IDX>Q!)dyGarkvG%K+t>#-?YvlDx; zKZkHMCvheha2eNd6L)Yg5Ait9@-lDmE+6q3Uo%RlU{3EcK9eyGGcy+pvN+4JDr>VL zTd*Cwur~*CILC1+=WsDsavisF7x(iBPx3sk@)qy&312Y6C&7H8Gd2@31=BMd^Rh5Y zu_9}*E}O6wJF+|baWF@5B4=t-Sefb$jassDw9+&b9Zs1qk!|!;Mr+JaT@HYS8 zQ~t|HU4uEj!?;YsRLsa6%+I1M!^-@S_1TPV_z8RRQx4@APUb8whcln6V_?l6A1ao?q@tKTin3=g)ki}V!Rau)2*@ErZg}phD z!#R#qIfsk6lIysYySSf6c#`LNmA81GPxyindIs}}&e%-E6im--%*(kSI>mAG|8sB3=zRz^b z$~^plC0T*h`4JoQV|HLS_T^_B$qAg!d0fgbxPf1B55MD4p5{gV!rT0VPx&t+^$F(m z4&yQjQ!yiRFh7g33@h_P)@L)e;V10LPdSuhIGMA!kjuH2o4J$U@-TnoIsVL>{GE^a z58p6q-(XI$n1IQdmRXpag;;{+S&enrh%MQkUD=0&ID+FjjdQt#tGJ%qxSI#~15fb+ zukklN;9q>ni2Z{3#9$mIW=dvYcIIOdmS!c^WIZ-zYj$D}_U90e<|NMK0xshkZsHE^ z!#KH&>S_%xVLbjD^PreJzzV_p_!DOO|+)@2j6Vn=poKMv+7 zPUH;E=jU9_joi*}c#y|u(fA${@_nXbR_5UcEXfM2 z&X3rbAF~6yu`fU4NKW8%&f`*k!43S1d-xrX@-#2<7vAO{e9C_rX;3hycNmvRn2H&h zgZWvMWmuUXvOb%!4L@N|e#)U7!^xb*gRw)xQgq!jk|e(KkyVU@EU*P1OCOA zj5s)$PYlLkVy0vUW@kPYVQE%kP1a*mwq_^xV1EwbXinlxF5oh*;U@0jULN9cp5L$+W$c42Q0yu*k5o39voSTLuUjK`!*%}mV60xZU|tioDsz~*er&g{hj9LBMn z!r5HJ75tK0_%-+Od!FD=yux33kALzx!-fa*iN^Psknb}cvoa4qU`bYBb$-Og{Fois zjeYqUM{)wEa~_xS3vS?7+{5p9l&5)-zwkEy;8Xs~NF#zdy~DUn!c@%29L&$6EW^tD zkoDP&ZTJa$@>34w7*6IaF645q-=rd5%BxCV%H+{=+wnIx?73EGA%brezl9 zW+9efc~)Z`HeyS*XIJ*&AdcX8PUBoI;VQ1@HtyyD{=iebz-#=C5BL{fGUBLUJ~0@F ziJ6ian4S4pgr!-DHCc~M*_xf$gZ(*#qdAE)xq!>KhMTy9dwGb*d6t)XgLnCe&-j{A zMhA0xm+_g5X_%S0Sdhh8j#XKk4cUV2*oD10ki$8SQ#pr=xsvO+mAkl~M|hIwd6l<# zpHKLL5yk}biO$$e#1u@=Y|P8TEX9hf!Mbe1R_w^`?8m_z#fhB3`TU%#xsluX4G;1d z&+rnj^9~>KZ@yyWvB8{TG9HsMH8U|M3$Pf=vI=Xl0h_ZeJF^!Da2UsO3TJZ>SMW=2 z;n&>9?|Fhh@d|(CJ^sn(3>z2BCmP>lLcY&*%*s6cfF)Uh)%g({^J8{kH}>Uc9LWis z&UswQFSvnUaSy-aQJ&^S{=(b*gHQP{BaIK{^bX@P2~#m6b1*-PvJ5NpL)K?Aw&5r2 z$xk_yV>p?!xRA@amYcbg-|{ejV#lUv6z6#nU-0Yn}t|{^jI_GgIzu*Rb z#XbCvM|qkT`3rCJ4?g9;j5IBn(>sjIBuvGO%)$ID$}+6X4_Tkh*oL35CqLy-j^Sj^ z;zBOxT5je}e#^uBk>~g`Z}N9O=0AMHsMCWv#bN>`XIf@qZWdw*mS;8AVI#I=dv;|X z4&n%o=QPgc60YKUZsTqq;14{-3%thP_<(=$B_qxV<`aW)n3yS8X^Wo9s^cNw3_n1-2|iv?Mn zzH`_xXe`7-3d0pXiLuL`=c- z%*MPd%u=k#8m!AEY{ic3&VC%sQJlyboX^j>nj5*D-|!%h@eD8VI`8ly|K=-3o*m37 zCgU+FQ!^8DvH***EUT~<8?ZUsvNL;e0Eclbr*JkGaRtBR7Jkir{GKQH6R+@B-s7Kq z&agSbe4_C^Cgl4}$E?i54_J~FSe+lSF+XMpc4J?D#*v)B>72)<{DK?!75DHv9_49X zbxsAJdfIsjQFYp?F;{*Q1my9?+m`@DGVPd9a24-hI7GY^tVola#Q?_O&_F#Vw z;b>0cOfKLuuHh!`;9ef$ah~O6-r!w6;xoQxlm)?@-er6yV;W{=E*4~QmSa`cW<$1M zJ9c4j4&-o-<5bS!Vy@&mZsjiS=MkRdd0yo$-scm(V1$Lie4;Zp6EOwTGaK`=FiWu_ zYp^bxuoXM9JNt1kM{y!&a6UihYHs9qe#3)2#xuOc>%7B<{F|>Bc~LN@n2g7yOwCNp z$pS3KvaG^dY{2Gh%g*e@0UXA$oWj{$#1;IKTlh8i@q3=&PrSlkd5?ecIl~qQ^NGgy zn2_%?9kVhIKVV5#V0C`P#{8Ha*o}Sp8Aoygr*j^c@(XU@SKPzzc$BAkk-zXZ|KL;p z%ScOtIlaTUOu|&m$Q;biqAbJ8{E+q8jBWS{d-78bH z^Co}iWB$W8jJhKyufSxjSu)2Uozt7!F*yc4ihsaGcY^zu?S1E5^J&^o3b@Ku?PEe2uE`gXL13T zaSbmSq*z zVgoj3TXtqI4&X436n#y z_yJ3@0;}^QHs;6dz;5iz&p473IGyvjlwWWIzv3Q#$D=&Wi~NPR`3Il!Uq)IL%;_D* zWfG=hM&@9C7G)V$=7+4$W^BVx*pr`fD93OzXK^8yb1gS>C%@%k{>XFunK$`6AM+o+ zVbm{zImKcECTCh^VQv;;36^Iy)?p*IWP5gH9}eOOj^{ManKyWskNAwQ8D&i{r*|2j$(V+jnTrKkoaI=Rwb_s@*p6M;n*%wV<2aRbxR@)s zj$65l`+0;Xd7f8!i}(42FBoBMFrVm*%|uMW^vuS*EX-1@$QrE6CTzuy?9P51%u$@k z8Jy40xtbffo!{^vkMRsI@jCDDA^+wpM*cFGQ%uHVQl@4m=41gDV_8;VEjD0twqH4(!Ih{EQEW@HZL zXHk}6Wq!!|Y{oYHggyBwhjI)ja~2nJIoEPCck){v=8rtbpLvtN^D+P78%Es_%qbQV zFgepQ3v;s&ORzkvu?`!tCEK$r`*09Pa6G4RE|+i>*K-?p^8kO~DPG_;{>BIVi!T{* zV=$i>jKjoC$qdZSd@RD!ti+nE$EIw}PVB+{9Kz9@#F<>cWn9Be+`+v(#N#~6%e=w6 ze8gvb%_y6KIlasHOvW_K%v>zU;w;Citj&gO!FKGz-WyMh zxri(HCAaWv?&J47!Jl}Azw#dciI%JFpx3 z@-vR)1WxBXF69^8z^}N6-|;9<^CExYZT`Wh{Fjlo1#^0bahZgvn2|Y{pG8@QmH8p- zvl-j)6ZYh%9Lh1A%voH>qi9 zN@ieo=3^0-W+m2SJvL=)c480q=MawOB+ldlF5?<*;tuZRAs**hUgizn1y`Fg>#|FAK92E3yXbvI$$UBfGO72XhoBat7z~bFSt_Zs#{V$YVUi zOT5lIe8|7~ijlt#<`k3hn3SoRi8)z-#aNbASc?tVoNd{ey*PlwIF?g5n~S)DUvdk- z=01MU6a0x+_$%-6Pd;bZu3$dV_#PATeWqhp=HUk{$qKB_kJy+Wvje-aFF)f*PT+LT z<5GUX4g89G_#Kb(G%xZO-sT^C%6}PYcQB`S7?(+yiW!-M`B{`@SeYNPKAW)(KVeUP z%Ap*?$(+T7T+X%J%$@v}hxsGV@n_!T?|jUE_=ZvU1apeT1WeAf%);C(#1bseYOKRX zY{~ZQ%03*#5ggBHoXaI##r53A-8{e_c#0Qzjlb~$|KdwV{3e)B48~z%rep?YXFe8T zX;xxQ)?-t)W+(Pwe-7bjPU1{1;4-e^Chp)~9^!GHjAJ>4v$=>X_$9aSYwqLsJi(uM zg}?G1|KxLq?GNS?jqfob-)A~zWgdROlB~e${D_VDF*~pu`|>l6$4f#@DujrryR;LoXlBV z$mLwi&D_avd6+-)9Dn9b{?5nzhi@45yI@YSn1IQdmRXpag;;{+S&enrh%MQkUD=0& zID+FjjdQt#tGJ%qxSI#~15fb+ukklN;9q>nhzEoD#9$mIW=dvYcIIOdmS!c^WIZ-z zYj$D}_U90e<|NMK0xshkZsHE^!#KH&>SI2_C;I%6{tQ!qWV zF)s_V6f3d@>#_-3u_OO4#_lRuimPG3HSX^2?(XgyG`PFFyE}oP0Rq7#Xdr0N;O_43 z?tb_)&v$VyPSv^DPj%Jo-92yj9$DS9rZanSAV+XKr*IbMa~aogBe!!ekMJ}v@g^Ve zIp6UsLmUWn3eRYa%Op(AOw7pwEY5PQ!dh&|7HrRM?8_k>&54}OIb6gQT*ock#RELf zbG*tse9Tw;$RGy;eL^!5V=@7gGaa)s4-2ytE3!K4vI$$W6MJ$1hjSb!b0+6;DOYm? zw{Z^-^As=g2JiD3-|`EC9}08|$Eb|M#7xDE%)$ID#la}F1A1=n#4ckuv^^Bk}84j=OsKQhRP zK%dZz#F$LLa!#u@{yutf? z#<%>!;3or}!Z9l2FfmgxBXcl6i?J*#vnCs`Ioq)-`*1KvaRR4tHWzX^*K#v=azBsp zEU)l3AMqtW@H<1D3UrFd7>v(kOv^0H%|a~63arLDY|K{d$R6y^VI0dzoWZ$V!c|<) zt=!E+Jjn~Z&U<{yH~h?CrvrV$G74ie5mPb)vojxyvJ5M+2J5pK+p-ILa}Y=J7f$8x zT);p17dLSS_wgvt@G@`lAz$!4zcJ*QK&J?d&Uj49G|bFgEXWcp&#J7=Mr_Fr?9P51 z$}#+vzwr+)=1Ts}fA}vC@&wQG8t?K6U-J`#o(=Q~!^n)qgiOKo%*MPd!qWVSKeHa2 zvJE@47YA|#$8!p2aXy!E4L5Q-_woo&^Ad0J0iW|7zcR$RK&SAG#<)zv)Xc=3EWqL{ z$11GFhHSz1?8d$v!qJ?_>72twT)}nR!d*PT<2=W!yu-(Q#g7bfKF}vLBQYiuFgepP zEAy~0OR*xWvo4#kH9N5<2XHvYaWZFe9+z@8H*g#G@GwvDB5&|MpYbifF!+T)r*MqQ zI84k`%*Y(f&tfdg%B;x-Y|eJ<%03*-QJlbOoXv$?&b8dko!rl3Jj*M*%}0F65B$zh z7XzIlG6v%_8PhTgbF&ajvI48I4jZ!-JF*A+a~Q{R5@&EOmv9x=b1QfA5Kr;~uk#+C z@(n*T*rh<9u#CdkOvIGT!0gP&qAbHotik$h#4q)!F@c+ zGrY`Oe8?Ak&uyhjI*mUs)4ar+e8A^?$FB@=HP9(MqcJX%Ff}tVCkwDR%drY;u_0TqJ-e|l zhj26}aysX55m#^>w{RB^@Ho%$D(~a5Eq zY|T#W$pIYBah%MVoX4eH%?;efJv_`)yvQ58&u4tgFARP?&?y|FG7b|n6*Dpi^RpPs zvNCJ30h_ZOyRr`la}+0V8fSAMmvb#Qb0_!n7|-$wZ}Smf@&ms!)Qv!=h>XGbOvbd# z!rUyxlB~dLti#4^#g6R3{v5`!oWvQN%OzaJ_1wzcJj9c{!0Wunr+mZD40bcnCoH2d zHWM)=GcY^zu_(*15^JzNo3Smsur~*BB!A&l{>}yblYem&cW@t%@(eHY79a8j-}4(o z-U@Vz!03#}q)fxi%*BE%!Sbxi+HAy@?7;5q$DtgKfSWL(iOwVl0%OWhzpZGKDu_@cIGkb9$M{qo+a2Drt8P{+lw{tI# z@H8*+CLi!Q-|;I$+zE6F&uEOxBuvdr%*g^Q&T_26T5QM`Y|n1&%OM=iiJZ#{sEotJOvQ}M!Tc=7vaHOSY{2Gh$FA(d z!5qa2oW|K)$mLwi&D_cTJjS!U!rOerm;Au*40S)yDI#MqK9eymvoJRcu_P<78tbqz zTd^a1us?@!EGKaW=W+>GaXq(kHxKb7FYr3=@hRW%GlM+{^a;x-jLk$$$qdZSd@RZ` zti&3u&t`1PF6_-g9LZlemA`WV|KwlX#2wtnqdddQyv2un!T0>ekPic$A}~7RF)7n9 zGjp*ZORzkvvNjvBB|ES?`*A48@K^rEKe(7H`8WUJzdXnjJkM*q%O`xzPYn7f&?gKd zGZqsv1=BMd^Rfs_^C$kydTh!z?95&q$PpaRDV)XmT*fur$nD(ABRtJZyvYZA&UgIE z5RU_$!ZRAN6LYcvi?bZ7uofG#1>3V5`*H|Jb0Vj64i|9+*KrGX@c@tW9Ix^Y zAM+JIGRTuapU{lNm`uRrOvkLu!@?}ZimcAMY{J&;#GV|$;T*@woXL4y%GKP!ZQR4d zJjIK=!TWs1xBSB3PXnF8F)HIQF;g)kb1*-Pu`DaICL6Fh+p#PAa4<)40;h2{7jik* zax-^wKacS&ukbb>@g+a-J3~DSbc)CrjL&3D%Ph>zLM+J&tj0QQ%vS8k9_-Iy9Lq_Z z!MR+*Rb0=l+|5Hg$qT&Bdwj|_{LEm_1AW3W3S%=7Q!)dyGarkx3@fn)>$4f#vI~22 z5J&PCPUY`hz(4sHH*p8|@hH#mGH>xAU+_J@G31LtrwEMBcudMP%*^Am%<4D<=Z$c)8=Ou_Wb#=I=T z()@`(vmTqW4Lh?J2XX|*a|&m1K9_L~H*!1o@(54!5^wSWpYt8RGQ_Jur|^u%xJ<&- z%*325z~U^&Dy+qZY{B;I#=acF(VWQXoWn(2!FAliT|B_!JjbiN!^eEZj|}oU&?ht_ zF(wl*InyyK^RO^Wu_CLpE}O75JFzDRa5%?tGG}rgmvS{Xa2xmVFi-I!Z}2{!@h!hF z_?tkdaE!`0Ow3fw$Q;biVl2zbtjPv!&UWm|J{-(ZoWNv3yFj0?jKbJV#FWgy?99iaEW=8y!TM~*w(P>*9K@0Qg;V)E7w}L1 z#ZBD7eLTuDyv$pC$QOLiZw&c9&?y3=Gai#N4Kp(r3$g^uvnp$|5nHkYyR#pMatwdv zZ~TLcxsreLAO6dOJi+t4#=CsN*Zjnw9|C>CFfwB?AyY6tvoSA=urz<-&#cF$Y{Sm% z#ep2b@tne0oX=%k!;Rd|y*$Fxyu_P)z~_9&uMF`q&?!8lF)ouZH8U|M3$QrLu?lOk zAzQFLyRk2aa5N`!I_Gc^S8yG-a2F5oIM4Aa@9;5S@gswL3iJuhNQ}t@OwM%7$~-L0 zQmn}8tji{B%}(se0UXY8oXnY=$E94&4cx{(Jj_$P$Q!)RXMD>q4E{OLDIB9R4ihsK zGcpJBvlz>=GHbE{o3kCevJVGy6en;RXLBK!b1gS>C-?Ih&+-ay^ATV21HUuWmq4e8 zjKTO!#%7OOe8bNS z_BGHaETb?s6EP(-Fgx?HD9f-CYp_0>u`Ro>HwSSff8kXA&ISCFe{mCca37EI3@`H* zAMyp?^BY5c3v`OW=#0mtOvB8~#eyus@~q0*Y{ZuA!0znFp&Y|s`5XV>Vy@)h{D=SY zAW!f-ukkLQ@HIa%==VUMFpSJtOvn^W&uq-gA}r0H_%rLVDci6!dvPE~a6G4Q7Uy#r z*Ki}Zb1#qZG%xWcAMiQf@hd|F2^u6=(I7#>GaBPE2~#r@bFu)7vmC3i78|k!+p`<{ zatKFrBByf>7jXsGaSM0x0FUz=uksEb^A$fbNYFr^(2T^GOu*z!$E?i5!Ysv#tj@Y@ z!q)7>o*cm89LLF=$$4DL)!e{s+{42>#f!Yb`+UZ?{KDYD0-eG!D&sIQQ!yiRFh7g2 zEGx4n8?ZUsu`ByGk0=7kMS(8@HQXuB|q>xLj@0XipUs@&ty!? zEX>V9EXfM2#yV`wR_w?g?9X8w%SoKUxm?0kT+glC%|krN3%t&Ie9AZc%wQn`eZn#d zV>1y`G6SMDD9`XRZ}A~t@IAjV zWXM3L2#n5nOv*IO%v>zU5-iWEtj$Jj$qww!ejLg%{FT4)4=(0P{>^{*FAwqr&+{7Z z@(Ew_6N82d^a;brjKzdZ!Su|=yez`f{E0ua9-FcaJF^!DasWW@&d2(9-s0JKQmbPK%cOT!q`m2l+3{F%*UcE z!%D2d`fSFw?84q0#F6}kQ~5g=@K655P29nKJjye?%v*fO7ktle3>hKNDFUN29+NT+ zGcy+pvINVsDr>V5Te1VYvmb|Y41eWs{DX_Rl7I6b{>y_r!SlSvyL`ge{KTLU1AW3U zGGj3zQ!qWVF)xd-G=JjHtjDHo!_Mr*fgHi{oWfb0&t+W0joi+?Ji^nw#G8D;=X}Sn z3=t{NDLkVwE|V}dGchL%usF-H3Tv?;Td+O5u`h>kG$(R8=Wr2Ma2>aB7Z30_&+#hn z@G)QUBZEW^^a;&KjL8H{&UDPmJS@yotjOxD%O-5iPVC769L{l^%$c0WrCiMo+{QgT z%u~F`8@$hFe9JEk9wpEz9HTN06EhVvG6(as7|XIUYq9~GvmLv#4+nD;CvX~Pb0L>= zEjM!~_wyLf@(OSB5nu8HzcW}jK`!*!_3UZf-J%EtjgMK z#Fp&9?(D~*9K&Dv8~@;9uH@hRhyU^*Pw+gi@h+e6H9s+Ej6k0-jLcX}$P`S^Y|P6d zEX|+zGwZP_+psfxaUe%#_-3vlDxA0EcrNCvzs}aVb}G1GjMx5Azf+@&@no8Q<~? zgU1eZ3dg97!^BL*jLgCOEXJ~|%$jV#=4{8V?8Ctv#R;6o*<8rwT+7Ye$^AUWv%JFF ze8iXh!0!wdC(tP(V=z9GF)gz&Hw&>OE3g{turXV)BYUtvhjAS4 zU);nU+{dFl!^^zIhkU{J{Kk;+0-Yi-I^!`Z(=ao0u^>yZJgc%c8?hxjusi#4D97+u z{>DGJm@D}=|KYzp$P+xzYrM-Re9cb`8b8n{3?nlZ6EX$UGaK`=2ut%P{>*x8$~NrG zUL42~9M377#ra&uHQdPU+{+_8%}cz=2Yk+V{K^ms0-eG$8sjnvQ!^8DvH**-9ILPv z8?pu4vm5(z2uE`wr*jS$aRt|L3wQAVkMkU_@(v&K6+bda!a$$UjKr8sz~oHFtjxp0 zEX9hf&bn;E*6hTd9Khim$H|<@d0fiX+`w(z!^1qqi@d@6e8#u@!r+Mlox(9H<1jH( zF(Y#@KZ~&}E3+mWusPeYEBkOTM{xqDaW)rnIoEPCcXB_E@hq?KHXrdNKkz$4B@T3o z$QX>zWK7E}%*{e9$qKB-I&92V?8qMM&tV+PNu0sCT*6gc&#m0eLp;d~yv}=k$~XMX zU`Yaf!ZHeDGZ9lV1G6(9i?R$Wu?Fk28QZc8dvg#+@)u6!?_9t?`4=~F2lw$P&+syD z@gZOEJ-;zz(mj=4(!f;9Lh2LmA~;1F6K)9&42hW z5Ap=h^BV8+319OQgC+~~3B$;Y#e_`3^vuS*EW**K;d(^AJz+09Y{s_i!rmOjk^F^I`8yZzPyWSC+`)Z3$}_yoTYShDe9vzTnI_OF z0;4k?lQIo6GZzc81k1B3YqJqsvID!bABS=bf8}rdgNwP6fAb&y%Y!_@^Ss8pe8SiK z#Gq*deZnv@V=*C9Fg>#|FN?4=f8x)q$EIw<&g{j39KrFN!daZpWn9CJ+|Io`!qdFO zn|#3Me8;a0kuK0FJfkr#lQ1;EX-1@$m*=iCTz`4?8yNf&T*W~nViR^ zT+I#K#yvdDQ@qFf@<|MDPD@I0^aE}!r#-@@urqscAV+XKr*IbMa~aogBe!!ekMJ}v@g^VeIp6UsLu3tf z3eRYa%Op(AOw7pwEY5PQ!dh&|7HrRM?8_k>&54}OIb6gQT*ock#RELfbG*tse9Tw; z$RODQeL^!5V=@7gGaa)s4-2ytE3!K4vI$$W6MJ$1hjSb!b0+6;DOYm?w{Z^-^As=g z2JiD3-|`ECXAg7=$Eb|M#7xDE%)$ID#la}F1A1=n#4ckuv^^Bk}84j=OsKQc((K%dZz#F$LL za!#u@{yutf?#<%>!;Q0cb z!Z9l2FfmgxBXcl6i?J*#vnCs`Ioq)-`*1KvaRR4tHWzX^*K#v=azBspEU)l3AMqtW z@H<204|Iyi7>v(kOv^0H%|a~63arLDY|K{d$R6y^VI0dzoWZ$V!c|<)t=!E+Jjn~Z z&U<{yH~h?C1p72twT)}nR!d*PT<2=W!yu-(Q#g7b9B+w@`BQYiuFgepPEAy~0OR*xW zvo4#kH9N5<2XHvYaWZFe9+z@8H*g#G@GwvDB5&|MpYbifFnG~Gr*MqQI84k`%*Y(f z&tfdg%B;x-Y|eJ<%03*-QJlbOoXv$?&b8dko!rl3Jj*M*%}0F65B$zh#R8ooG6v%_ z8PhTgbF&ajvI48I4jZ!-JF*A+a~Q{R5@&EOmv9x=b1QfA5Kr;~uk#+C@(n*TSn)ug zu#CdkOvIGT!0gP&qAbHotik$h#4q)!F@c+GrY`Oe8?Ak z&uyhjI*mUs)4ar+e8A^?$FB@gD$prBqcJX%Ff}tVCkwDR%drY;u_0TqJ-e|lhj26}aysX5 z5m#^>w{RB^@Ho%$D(~%}9*N1We9!%*s40%u=k#>a5EqY|T#W$pIYB zah%MVoX4eH%?;efJv_`)yvQ58&u4tgFAQEL&?y|FG7b|n6*Dpi^RpPsvNCJ30h_ZO zyRr`la}+0V8fSAMmvb#Qb0_!n7|-$wZ}Smf@&ms!RM|kMh>XGbOvbd#!rUyxlB~dL zti#4^#g6R3{v5`!oWvQN%OzaJ_1wzcJj9c{!0Wunr+mZD3|21CCoH2dHWM)=GcY^z zu_(*15^JzNo3Smsur~*BB!A&l{>}yblYem&cW@t%@(eHY79a8j-}4(omJf7_!03#} zq)fxi%*BE%!Sbxi+HAy@?7;5q$DtgKfSWL(iOwVl0%OWhzpZGKDu_@cIGkb9$M{qo+a2Drt8P{+lw{tI#@H8*+CLi!Q z-|;I$R19igZWvEWm%au*?`U2j$PS@gE@*5IE}Np zkjuH2o4J$wd5mXyg}3>LFZqGr8LD!iQ$)sKd?sUBW?^m?Vo6qDHP&Hcwqi&2V1Ewd zSWe;$&gBxW;(Bi7ZXV)EUf^}!<5RxjX9lYh=o6Mv7@LWhk{Ott`B;=?Scx@QpUv2o zUD%t0IFi3`Du3q!{>i_%i95KDM|p;qd5aJEg75i_A*%*DMPPKsV^XGJX69l+mSA~S zWola}F1A1=n#4ckuv^^Bk}84j=OsKQc(YK%dZz#F$LLa!#u@{yutf?#<%>!;PnHY!Z9l2 zFfmgxBXcl6i?J*#vnCs`Ioq)-`*1KvaRR4tHWzX^*K#v=azBspEU)l3AMqtW@H;~_ z2y}|b7>v(kOv^0H%|a~63arLDY|K{d$R6y^VI0dzoWZ$V!c|<)t=!E+Jjn~Z&U<{y zH~h?C4Fi3`G74ie5mPb)vojxyvJ5M+2J5pK+p-ILa}Y=J7f$8xT);p17dLSS_wgvt z@G@`lAz$!4zcFN^K&J?d&Uj49G|bFgEXWcp&#J7=Mr_Fr?9P51$}#+vzwr+)=1Ts} zfA}vC@&wQG8t?K6U-J`#HV*U&!^n)qgiOKo%*MPd!qWVSKeHa2vJE@47YA|#$8!p2 zaXy!E4L5Q-_woo&^Ad0J0iW|7zcNIVK&SAG#<)zv)Xc=3EWqL{$11GFhHSz1?8d$v z!qJ?_>72twT)}nR!d*PT<2=W!yu-(Q#g7cqG|(qBBQYiuFgepPEAy~0OR*xWvo4#k zH9N5<2XHvYaWZFe9+z@8H*g#G@GwvDB5&|MpYbifFnF^-r*MqQI84k`%*Y(f&tfdg z%B;x-Y|eJ<%03*-QJlbOoXv$?&b8dko!rl3Jj*M*%}0F65B$zh%>$hxG6v%_8PhTg zbF&ajvI48I4jZ!-JF*A+a~Q{R5@&EOmv9x=b1QfA5Kr;~uk#+C@(n*TSc^cPu#Cdk zOvIGT!0gP&qAbHotik$h#4q)!F@c+GrY`Oe8?Ak&u6w+eS&+r~6~KDI#MqK9eymvoJRcu_P<78tbqzTd^a1us?@!EGKaW=W+>GaXq(kHxKb7FYr3= z@hRW%GlTtj!2iF;=dg^z*i6Kf%)so-$D%C5O02>9Y{s_i!rmOjk^F^I`8yZzPyWSC z+`)Z3$}_yoTYShDe9vzT`Qr)s|2jorbjD*+reS90VnLQ*c~)g@HeyS5V0ZT8P>$iR z{EdHbF<0_${=G<2X(7)E9+CS(exXEx?#5timp{F(LGlx^6V zy*Q8~IG$5Di}SgRYq*iyxtB+HnwNN!5BQw#_?02T1UiLhG{$8Tre-GQWC0duIaXmU zHe?I7XE*lc5RT?VPUjph;tH4q)!F@c+ zGrY`Oe8?Ak&uyhjI*mUs)4ar+e8A^?$FB?#InXIQqcJX%Ff}tVCkwDR%drY;u_0TqJ-e|l zhj26}aysX55m#^>w{RB^@Ho%$D(~%}9*N1We9!%*s40%u=k#>a5Eq zY|T#W$pIYBah%MVoX4eH%?;efJv_`)yvQ58&u4tgFAV-;VDA5(*TOL><1jH(F(Y#@ zKZ~&}E3+mWusPeYEBkOTM{xqDaW)rnIoEPCcXB_E@hq?KHXrdNKkz$4MGJI_$QX>z zWK7E}%*{e9$qKB-I&92V?8qMM&tV+PNu0sCT*6gc&#m0eLp;d~yv}=k$~XMXV9^78 z!ZHeDGZ9lV1G6(9i?R$Wu?Fk28QZc8dvg#+@)u6!?_9t?`4=~F2lw$P&+syD@gZOE zJ-;#Jj{*4q-v2W?<1s1IFf((pAWN`3tFks5u_ZgOJNt1c$M9GF#y_~2EBQD7;lDh{ z6Fkpryvrwi%})#(GtegtBQq8gG6mB!8}qUVOYl za}F1A1=n#4ckuv^^Bk}84j=OsKQhRV6HWj3e-@gN7?TN@oavaAd03dGSdrCPmrdB3 zo!FBDIGp1+nKL<$OSzgGxQ%;wn5TG=H+Y}V_?BN7JWilfI7Ve0CT1#TWDe$MF_vXz z)?@=VXFGOf9}eayPT(}o=0Yy#T5je}?&mR{8GdPz^xQgq!mAiR}CwYO_d5=%|hMyTMUZ77{Mqz9w zVoGLUcIIPImSH8{>tC@2N!cC|K>mZmj`)*=Xs5H z`Gl|ei9r(t`h;O*#$rOIV0va_UKU|#{=}bIk4@Qzo!N^6IfCOkg|j%H%eaOcxt)7? zgr|9lH~E0i`Ho*1;>QIP|92dPXEerT5~gM*=41gDXE|13EjDBewr4l?QgtGR*OxQB;%iWhl<_xX%(`Gvs~2RemgRK{Uqrea3sV15>3SypCEHehqM zV^{X!V2Lk7kHib_>^z>nZc3<`h;Z^#%3a>WCmtu zJ{DyeR$>j-XEU~C7xv~Lj^r<#%HO$wfATMG;tuZPQJ&#t-r_^P;Cp^!$Yg;|5g48E zn3QRlnYmbyC0L$SS(}a6k{#Hc{Wz3k_$z$ruxc!0-w zj#qhykNJup86;((PiRJBOeSD*rejv-VPTeHMOJ5BHeqXaVowg>aE{|-&g48Uv#^ouN_(Iz?m*#%D67WftaUA(mtXR%0DDW-E4N5BBFU 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 Io&rqwZ>V7yJpcdz literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su new file mode 100644 index 0000000..b3ce977 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su @@ -0,0 +1,12 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:87:19:HAL_RCCEx_PeriphCLKConfig 56 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:489:6:HAL_RCCEx_GetPeriphCLKConfig 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:569:10:HAL_RCCEx_GetPeriphCLKFreq 40 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:2766:6:HAL_RCCEx_SelectLSEMode 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:2803:19:HAL_RCCEx_EnablePLLI2S 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:2886:19:HAL_RCCEx_DisablePLLI2S 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:2916:19:HAL_RCCEx_EnablePLLSAI 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:2990:19:HAL_RCCEx_DisablePLLSAI 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:3051:10:HAL_RCC_GetSysClockFreq 216 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:3143:19:HAL_RCC_DeInit 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:3333:19:HAL_RCC_OscConfig 32 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c:3703:6:HAL_RCC_GetOscConfig 16 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d new file mode 100644 index 0000000..6ebda9e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o new file mode 100644 index 0000000000000000000000000000000000000000..2af186e601cc51bfe73348b17b6594bc5756959b GIT binary patch literal 1079400 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

    ``1)2TW-n1P! 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≤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 ?%A)FVw74yR(|CM?Csk5IJmWke+kH`JK4ZKm>R9 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

    }v!Z8c)4{VH5gDHyuGDYlwq`V)qLkv$6 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í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

    &(Gx0Y~grA zcyu((oEx7sFh!rgD%HH~sba?@MojSoX0+m+!o$)c;UK%6m+e(6(wtL(-wY z>2U5Tw^%TYm+Fy^eWS^RA7&QL!x~oRD3OLi_uv=UVtbG{o%tmw4Uz}ZnlO85cCWgv z_I|ONDv;Mmv_P{!v~*y*DbbYLrRFkIPMQA~k9|tqWU;@*Wx>{GmB?|7 z?3v5C8DL{lv?Eok9($dyu?BniwC;cW{ORqx@4rV9;lB;?c_kr)4h?vWr2!T@Y^kbR z#dQVJdriPtt#_Ek52%0zW1oyMw8db-ZtkFZwbZxUs8GqAw+s=<$!Lv*ht)@8kWk|q zD|h@t8BU^f!J#E47vI@c08%FoZ7(1iq~SYOYce@m+e4BkCJ@5RN@A?$>9W}dLX_WP z+`tX8ZP?xgPnsN~4T~-F*U-~2#+BY0gpq3iTl|g3SrxXBz8?Bg+iuDt44F*HN@u80 zzcZ5%lM6>PTS1>a1q%cPGq(5*td4AZ4I5pZc>tLauCW(!IUXx)J1YNuH5coBpX}4)KEpEEP<#8FZzX`iV3-a zes(jyW;Q>_�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�`SwE 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

    tB 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

    RCErAS^LKBN6i z6fb=(nrNO~8#-fn;k4(A<@HbuB950n4D083(>xf8=LwbICGbL|u%5^hx5C1Co@gBQ zl6b#U=|(c|mn`s7c;Pe?sk|+;DNW+cfb#q$-9&by^Fjb zDKMYKJGmQ@mv|$zx5?&J)AZ!(_W+Wdfy)x6~e(<^S)} zbzUf~AyvGq3(#53lhbjhhWDo%4At^tXzO=_H*E)$I^HTzK-cqF6l1x`3;7uq8hC#N zLhm-uc_lgQke9y+lhw!jW^ys2dP@|gDuEl=Y- zySv~`@a|Fud6H*OA0v9gTSCG9Dc<$>;mb5{p9qpOyy>%`toeV^x1enJ&J<_2#r+tV zJ;|T{A$)P*=TZ*r6#vjP{5;La|5?J*!5^n9Mo#=)6gqb1Pf_WV3qP55&93}KKLgs0 zzl{{!`Rf3 zf&9!@0T#qxPxpC(`B&cuSO`C!Vi0Hf%df%DaQ^gm_!7Zi^axEPzlEwPqxb=|(~0J@ znP_78y~}|a%UAsky*U2oG3Y$Ucc9{>cz!>bP2jhE0Ou3=6GOmE<_}X4A%&mH0az;E zxfBX%{4m-NUf?$rK_Q**cmTW%el^8kGWmZ}zUm_X{cJdq#ea_G^AbPvSy0*h%$G5S z%ly~W7<(T7P5PcpK0h%Y77Fj04Qp^TR{HyUCBq0`C^TnJUK{`TOW+Y~uG(0;ri^U*3{rrOeHc|Za&oQC_{$)D64)W_LjWoo^a*Zc|za|8R z#`p{AxqZw(GY696{22+T2|kN<{*(NeeCR#lFI@raQ~XM*ftlv}(vmR4U-T}_S_?j> znrIurgWbTi6+F8d*6jpuzXh-D1s-_-J1(fFsI-INCkk$!5>$Nvk<)^kKIn85OjSbN zNl>#BV|Nx@qg{!M;B$I;y9zwE!-AXO*d?^pM zfX*|5gS6N86J$M$sq+_HSr3r_firDf0tE+>!3z@H?MG*@AmK|;p@Ji8fEgy>(GM3c z$Xf^pBLu!wTo5T(M8};dflEJTB3dx}V|2y{bbN@!3SL#h-8ex{3apKUk)3)<_^Ss{3T7*wTTi3%=V z7qI?;LX}{_^N_3-)Kb+;jiAy5ky^p8{~fCZ$6~;{DQKs!L);SB)5)ztu!1PQcGbO@e*17r!5-RGjtY+4hA(4+Kob-m3s%!|KQ2h6cj|;-IRm^Y zf&Cw_FfI6l&Q3Fee`rT$EnKu2A~wRUbOXj#X!sB!cEYE>frIwK15~hnT$uL&E}am% zQquaQ(5L~=LAazEh8%^(F>uLAIE#Yl&cdGqF=!W|l`D9z!jZ#(b`!S03q$V05UL*Y z5IRsC(^I&GepD}^X$#c7h1`|s^bv;AF#Ux$eujF0FqyVufkGRK)&~juDBTq-WCZ~; zMED*JGfbFBC;f1tfI^lL!pGK-j1+d#;XF!sgx0fY;jf-(Vua6c#ZY2}W)Dcl2~{hg zeoiQ(4P?A z6iS4l!x&Mi@W@HBCW!hO+aZAy5^ztjxd%|BJDzt|6)(V4RjRh5Vksl z*D2icE-Z8j1Lwg)xA412=-m@`d<5Qo;cEJGdm!wc0M#ROYl2I?!fZ+@KNMCBLb6Y| zdl!C{e&OB~KzSq_rn_eY!U5Vc4hoeinKuexGHQ^MHAK$#X6T>$iquxlN7)}pR`Xlz7YVu;v^u2Ou-PE_z2 zMr1GY`3=4t7rhz_3n%c;sG)aKR6%p?AWESk<5Qxf6!1=qYH73JDB67)U{0c7dTTq2 zDsv&?BKm|f2d*L+rE%RvAF=@LF4F3O;vu?6RT!S4Q$In^OVl$LGvO_Ia0YrlqOWP| z=PO#h0K7Az)$c>WPgG1HHh)nBEl2?()-pI4DEfUJoCp$SZGvR5sQ(L4A)@)oP(Ldg zpi+rY5lUI`#EA-5!q0HgN?SA$BFkQMMv9(}hJ#U}pNF9yExJ#|Nim{zNiY;ET3L+F zI8j*!6wZlWraJO?k(Ck-CWuxZ120jufU-O1MO$d)OA^)7aUfYVL|120L}GU+q>8?e z0+l8@<%cP_AabTHRl4Yq55}G$dXNPwQ&e#P)J0Ja1!1#9C*9Fp5`9j$at^`nLz_WugzKpk6LIUjV8?RG?BpRTj!mvpDJHSRnb`rQWDq2Ff7sfNihA6k_eA7P6=zc-*{{Hy7VS@i-i#=W&YRZa&*)QJHsV+p zP`2W?UxlQd_#)j?u@}#|1(f4rubbeV5dZu%+&wA&ARnC$;?*BO@|3uqHhZVVX8Ln; z6f^80=_LMyw(id2=43eUBK~JLL|nypFTt#vI7$YdyLfmU7CgiUzlOV>Vt1+z^AgWV zfrz)bk5GKXhrA%-D_+$Fku&0->2&5N)^~&FFRu9*m;vIF?GOnRzoNu2gT&7|gBL6= zq0xqjUpNQrXT{%Ba4b|DLVLb2@kT1t2p7MUfF?p5_XF%jimTN?i4s3J4v}c_TT9Uy zBTiz%Uaa`-GDyaWhihOVK`dVckwozu)|iR&;?tCdND^-z2bC;Nqq?;e@u6oyrHYq7 z4Ju7s6b9%EVu?MRNEfFq!4Hrj&JV|kGR12s+H_G|ybPFG;?6o4x+Jz&qsbN*Q<^15 z{1P1|bH&^^fL#_pH3VLsShWI8zPNn@)Ch2qoe&{-s&M|;|0@iod` zT@_!vgkP*g`~l?(O2zFogV)53??SRnoFf6RT)cq7?G@sMpJ14k;$JtRxh@vZM`xAz zYf4jBiy4%JtP!htXllh<_k(vs{4Eve)QLN&bhus|P3zK4aSr9VZi&C73t|o8k`Bz$ zZSf}*6K@o|(z~Nc93PJnHH-i5Kxd2i5T#sO#q$ziwoSa}5K!)jlc`p$UEEFql)GXk zZOl5v_xm8(DgKdC%3Wd!eKez6tg=Azo_IEuD%}@j$B!pYJog$zdc?yg;Y+W$;ThO_ zC|*x7$3F4f1+dUBE}}xPN8*=g2R|SVr&7p4@oLI!4T)bk3CUrxOFHyM#8)ZIG%D_= z%+HuOgep)Ti-TL?*|>P|%iv9jH+aMBr1%5cjyw_X6@WJ-UjICtm=^!^9TaB7lT_Ag zExAn3;&sQ8L4Th?8WP zN)w$WMXO-XMe;J0ExJk$Qen26hi?UT<)_CAe4`$-mkg~ne}tw$3eu{J^>Q1W#>rXWaCO;r)Wl5Q$u43TV{ z26a}lKMU4FCF2xh36r#M19Z5ggLb$Pl6@2-iXadBx8Dr z6ic>H{N<|TZQ44NNH{kDRw`M(8Y0&u3#me}OyX7mm&zqgj+oX8Nhbx1D<#`bLjAfV zilVkvk{=tOP%SC@6`s{do^l1RRLrgTUVc;3^DTyQOHx8R zs|Lvyige$W#C2oPjS_tloM@6bP!6+M5;X>e7RfET;?pW&eGQQ|$=N?Klsl3Gw5x2F zaQ{K)T}ccFk{uE?T}J4XD5>QrD2KnBpe)(ymb(IqY}TbVQ5Tp z#0z?lC4bg|H!fk*rI!gw)(-F{C5KFaej?F#Kx9f{x&pmvN%CQU%}6}yylE}%>xF`i zw4??Kw$hE~fnq0hr)`D3G;uM;a9nz2Cs0mEZ&7WG>GE*r=^>- zF+N8roBqI@q&tH#250FTl&N=->gf;KRqE&sJvZrxbX0JcZlxE4hx86zv-Xs}oew9x zq$}3Lp0_lLKEvZ99c_YHU+K!PFa>9%ad!djC)KP0roZ$QT~`T^ZaWQyKq{~>B0&~hDh)C!0cIR1YJrFm6}$;LYVZ}V|X1d4Wf5PgmkS9L?WeMP@Ex3`d}2D z(Ne<@pkt&T--Pv8=~o$`;-qXk(VmmG(l;97rJfWoNRTpU$xD>Jw*i>vrCnt(lq9|M z5}IV`2Q^Snkshmoda88!fAKo$s`uc;1!)&OPU+J3Wq=Bm;k}D0r4JR&3%Lyz``tm*~B=~XzHYQRdAwSy6-DM-;~~_ZTS{oxtQHM(ihIb!FK8Y zTEV+3by35!4r%=XOnIj?m%c05CA~oB)Nbj-e2CnWraTS3`_fdpyYxU>as^;L(ra|s z>Xj~wgrSGh(`E3iPwJEg$$se^YYgR)bS)PO1JeAxn5;qR-&El}Bz>_In8VU@94L%P zm(hW7RQj3&M8>4mv=@FXy-EkhacSjo7@CkSiv=|){fG{XPo!I@&T&e*q#C?wX(0;= zGg9s7Lx;o zK$$mHQv}Jj9)e!5Ed4l|5ZPHe^_-Pi7*Gh6J)z>&Fquq&`3#pWqitG*%!7`dk+PSm z2q#K5`8GPEWrqZyVq~j*!Hbo(JcXHvlYLG%*b-!i+5wg*E7gKJFUzIMu_Rg0N;Ju` zf9MfSkL3ZN;+)bCQe-%xJ>~R-RGG!wlW6mzh*3kvjEZIWZ z`CpP1&Vzck>_G?Ab7Ts-(w-|@a}&*F+3%F%&672?03~1MMVF@wWH~Oda7C6yYiptG zgDV(jk*p*gO|k65W++^hInWALB0D9ALaB^NRovHPjAk_jhn$n5Ljb)D?d7}V=!+s|VLZ_50> zgxOm%Gi3)FWbuihZp&hVA<`(DLs9o8necab-7GuVfX)`#EA*cQT4jF)1G-Jd+7GjL zWE>bA*j2uU6q)u4q41Gbau+ZDe>1OE4mMbZrQ_C5V^K3_g@Oe2>mPStwP>_REgmfb~bREA-wRkiAL=+du zVOe7ZER4t!Xt5fV?P>*YOva#FWRGQEc7iu9I~Rs2n2^a2Kw(mLl%iWtWFHRzb4r#^ zImKz&7nJCqk%^yyh_&1!1%_KFrxE`5>)Qr{x~sLcvikr)zso@`Eb42w#fizrTs06w56M;9Zq#XzeMH>*=jlDi5~>@0z^i4NztBW@lI^m!G_c zrb52l8%?FWmJWs2<)L(9sFJJSfuU-7I%SM%0_;8=XyZ(VJ+R<#Q7N)*|0eqivPrBN%w% z_p>Fx08=8Ca;>~F8%TLq3 z^?|%56-|%)NFh*q>HIyawR0!m7!b>riw*1}-eA^aJoZ^Ze_Iwqq^*}kJ7#TsQpW^TVsQW8svcU^b z7^vDcP*F?!!5~F39ch9UAJRRI5XAt!H_s~8%V8l@vC|q&m|~L;^uiVQDCQBNsMrGN zNX61-Ku0N9NuZ(?4nF`TMzMJmn6ZjEp93sTQA#yR=M?v6fElm2a|C7+6rJ`ENmRT_ zbA4X1vkTBk3gvbvBrATPbaRSgp%Zwiie-PndYWSWyD)S?v7Dlz=?Vu*$7U$@dt)Xt z75}^i>Y`#kEmm2IVP`a#6r&ArDO=%I2kSYCSrNd@Rd6W)eOVDg1y6Yja|ST;6`pCp zEKqz;3+@%g(&s=GDkM}PRivoBi65s}@pu}TR~0S-P$i1RgW#1awu?bsQ#3w>5tS*v zqH3mcMcJF^tWf;c0JD{f?Y%H`U6Jx3s47J%)gII;Uav%RLlIAbvpU7bzadhuxby-< zZYrMghxJ>EJ}TvDP%Nb9{kB4J2$+qE0osE#DSo1rs9AB854{$JjQ*rr6%{>DXj5d+ zrp$ z2B>MpD8+tf6zm8z*2;VZytYwpQK7L_uG;}acFJ@MoVQmB+JJdn`NJ2mcS3oRiY8Ag zSAGjH2c_jH7&@hlCH2$FJv5(=%6MP!oRr@!#INbBJm3nRi!zc*8eNt7^I^|T8Fn6> z?n?JKP#((1l&SYr=IqB@dnv8IMdPi!O>cA`<&QrB%vY(P%%0(|gBuH6AnWkXn?p)XlQJPx-c2@bL9+IKTFj_Igl*zk*8LkZY10oSh zP9&&ErIyYsQOY6u@N=~Ck`PUda&i@BB379a3_s(PP4s#>r~GIm^x~DjXM##lI#9|y zQMrb`rgC2S&L*HFDJL@_lC0Dp0hOYBw-PR0P#&YiO1knD+RtYwt0wW|WGY{Mik>m$ z0xFQpQa<+%e7U52n)U_R%0en`$x*hv0$*~K7rucLmz9%Ypz@R)+SKGLRez(iK>5@i z*t?<}CO-?63n{Tuq->^_O|kMtx_W*x_)@N1 z^e0d%l+zS?tW-Mvj$h@v@_o7uQKfXZgM-z|#q`psQSPN8hg#(&n!y`N=IcPIQ~r;R z)%D81?m_aV(vRK`x0E6}RyQcGQzZYka@T#BZB*Vcfof8Q&|=lBys;2Xi*i2Yyjztc zJy2*sIcO0s5YDav`Yu z%KuTK>VdM0Vz@oZBlKeERqo0F=0l~40$F`Z)^9M>uUvQ;B9D|Fv6$8Y<#T(0GN@cb z@y{XUQaaHNE9XqYvk~P>RN*$N+>rv_nDX6Kn3u;&1sx8?m3t@yKA{}=83UVCKKKnN zPn5sV9&<{G4H=#|<&H05Z$|l57euU8GZb~VQ7LE)wyJerkhD|T(4o*?#d;CG99Pv- zZuf-hh3{bYq-uf=nhq*6RlJ;1%|8I@v}zOGad%X8)We>W>Sc;7IIG_20H%xT82$0N zs$864-A$EA2?Tf5x4lsCP=z+ao~PZuW4=R~1P?$}=iIic$Nie)or-zbaup z{(1sbb&&uIROuP59D@wfT*RudiP~}t1 zDpB>#Z8YaqZ%}P$lB%Es3dyQks%uVBeY6z{sVd({IGCn7{vN0cDz{XOHeGd+maYs{ z%*)_qswAaQxTxaMraMdJM*n~7lB$soaM`NuEX+%e>h`~Aa#h7N<(E~(*+9ut1ycP> zzG@?VvZg?__c}1Is1DMxx=ZH(Z&a`PU=bX=samJQP;RNpX_6aM4B8>xR&_6ep+=Sc4m3@wE_$?^RSCBM z)}lH~HzitC)06~hQ+ap;^NuQ%&Z+IHGv^?3S7o8MT8HY+0Khs`D_(&@muh|#z`9l2 z+aYpK)xH6|`>Lb#1>py(6O^gwQK{o0(yRLOAJ}`S5>gd^I}V z)Sb<6*IhlE&b}UM<2|_KsV<~Lg_l}H_qDy%63T1)sMGo2`KrI9k3^hNzfcHhKegi{ zNcyYK9)i69^=&#^1gaY-IvJ!c3juVnI+AL>Lexp?(0NvU{s)MJs<%_tBuxD*1r)>8 zKXD-$p{}0*Sfo1dAgCy{FYQ#L)mtf58>3!I8}e9n11(l@>Nfh5I;Xyo3eV!z1`iA+ zLH*5MOje?L76r1-tCPo|kffFzglEa>H?M+9QJ>;MBvmb;`iV64EZRg}P@5@%m#*Fw zht3Rj34JdiQ(cz<>Y`dlpLfbqucBl1CG~<)SkG3oDPoZuUub*Pi*f?KEB?L}aAsoPh>!EW`(&7kh7 z3s+zw@2kC*0s4V@|8g`v>VNqdU$6SpyRiOH{fG(@`qaB=*W9oE_$Zo3>J1bxA5gc@ zes@sqHxFJ9sXG|3H>|Enhr)$Ir^c#h0{-7jC znC7Z4425faJ<&vH4p8(wQZqv(KvA0ceXtO%NoavyjArF4P>9tiXM>8<*vtp-oTimZ zfZ{bx_b~+tnlKJf5;e{qkfu?n;qC>^ zS}A5XT{D&nUWUf+JPc)O-v0y5Ma_4#htAS;&Id0?BhJB0)sFX@=w#&2Fj$D%4~v(G+Rg{|7&dHH)gCcUAKfg(6Bcg>#@#s!67SUDKRc z3t!4Ke}+M%Tr*(<2P-tqCm>R(d1VPKT-Vgn=A=p^cL!#*X59e1uF>T60lHSBiU!IJ z&00TDb(-BTgR0jo-VN%eW(gG*+|m@1yA7K6CV+Wc(?La{jhbysA=#u!4}gVc&Be=5 zXwd|(hGeUz*aE#aO`Z*?I~oTHgSKm`C?j@Pv+HxrXNRV2F?{LNyu1QUm!@<9#?Y-1 z(wpR-W{n9V_ccF9LGOX4k6!FOnl7qw>D7$?fnh$>%)Ad?pXNdf)cZA`u7yjFG!tns zJD}PAJ*Yv=(-e6g(tJu)$HSV7u22}!Ty=uNsK)(sxI3nC9R>7b&2~BfjBE6t!}^3~ z8^u&7H34+5;ECo-x|B4fSs4NKY0dkTJDbt0SP9Bn`>6)%Hrkjqplr3SR1jpReUC2f z*lQoqI)7Yy)ECVOt%g>jliD3z@Eo*@Y2iGjT}qeqPHR!|hbK0cWIt9lfwOwgYh|*@N;cm2cT@IXx(aPvt6|2q72WFi1>mA^o)0R$v7q9); z8ej?9aS8<{YQw$;%6aXoW1y0>S134^tWBVBW{UPjZ|J3JS5oCzns!zR^e$+}>8zcu z{fxrV8CofY*fO=^$KYMm<_|+5OS@+uz%FUi`q5--J1DN7qn&#OD7o5aSHOwO+UHln z>pbmTsz1xu^6r3FpnY{enk!lhJ%5GTiXx~NX}3iHx>&nnCwN!2%M)R?M4PY~n5Ejb zNr+t2K1HQ9W!j5N09~$qq=RIIRzM|cmD(lgpss7Hj>AxuwrM>^TdiG2e{MC}Yf9+V zYMbfy_6^J~I_tCo+NRZOzojC$n_AiP_}y=5Q?7&8pk>f1d|O*W$+kwV%oHuj9w*(5CpoY^Qd?3lQnj z?)VIP-P-HF!}>k#tWb#D*XB}A|AF?V07L1~?p+U&UTtv>z#eLUr80v)tAtqY*-q@(Uz+QmBQUW5!~H{HE3h`8%M`U{vIx-J>U;Hi6os>Z!^0t@uKbqq=i_~_oE&5*AyiE44q z=zP;))=#&GV$J?K75&5kI^%kv1nQ>VL=&V796%GS3#JRLA-e8jjOeVch9)ai=h*yGH4kf59R4ZK8M)bnW0>x}UbNz!enbvIepLOF&M-Nst*Qgz*wa7xo{r4#!F zoqryhbe)D?>>0W%lr+oKEu@6~Mcq?0qAcAr)$r_+PD3|RvvodnvdPgsy$VgP?g+(O zFY7*d3%op?hU(Aqbpzc{FVOkXC)cm&QeOjAsKbA)!xN{AQoxB~-C-)oyQ)iRg?fpu zxDJL&b<&-1;+pQeH{e8>PD{b}a$O6Zge!DGl&GrI`7D6Qb)64IhN^V;{J^W$2{oW< zbT8(?UahXI7V0;2ylgmFr;DR9gL>WkEU4eqeMVKQw{#l%YDR-@E)`YW*7Z^;U8AmX z3!s~H|J;X2vu;~9s21JTY*=X3Nj?Wko37{(n!CEEGvRfI?vw9euTvLu1|#ayEl+}8 zx6VYT)_Xc$33&H)zaK#JKqvYP3O%|%={(k}o2JsJhq@Zdf%WNrdjdoKx&{iSKGNNz zklui9fj68V)cG$4^pNhw-B2Iaadv_?qKl#>VN}l)^*b>Yh1U~8}=r2 z0}tW#q)t=cpAGD{P*45CCY(_UX8qn7Ikxuwxqj&lTPT1;?svu&gkJ}BN zy}ofhB#-M|=mmB{zm%LmsdwE2Lk{|}A2DaA^mDU8oz^EbK+jSCjV=6i(yyl2sIz{~ zM{w6gzsD6kSN%K+8@TE39RirU{tXIGdFYF2L*S`@XphEAuckb#x4wmLllka#_rVEY z{f!Y|p3xg`qw&)ZR$|cp`n?Q*1?W{XFchd~H9{{)zm%?E1?y9-U?D`m_!g|6)z>{l zXQ=*FdQ*n!qbPw8uCMHdLWF)1t-FzW_nUx@(udfe6}$xf>%V|X)IYZwKlpk5v-yxr(o5(-oUBjWh|U!K8#BO6)q7KP zIZc0c5$s*iAG-&UbbbG27|PJUN?Y(u{k&3iUev!tk5iVuZz-Bf`k&}a2if|$bkfMt zyU?ScY+Pne}V{bN7y^6@=SfEDP+M1;4F7b`88neK6%o zn)E(&mTA^^(-nyp{WsCzwd#+jgKEmQ+pylPzeNXtd-_*TLGr$SlNcxu^hNYG?9o3bfoHvXTY8Qj>JMb0>C?MYOs8MJ z!w;i5ow*?67|6Mu3gzN7Hq&EhV^Gi&Zfm$p zU*NVgL`I{rH_QtG^l`(ndC)sySVRgZ4FUy*;$TQ9grQRg*?mBtHU#*haWqVqp>Z;_ zQRK_n@XLBwcQM$sLC@7N_dU4eW(cGdn!DkX5MX*3c<%tr(=eBI+g^sRUx8=dhP4zM z^)Y-bh7-O9hcy`V8N)X$@caz58d&f*EdLxL0fzV(Oje*_$49UiWXP%obg+T96<{HT zzv#em))2QCPJ|j<+<_8icufhBa6`KpO@x8-3tWmeyjub27{k|eDJj-)J`$aAhI3S5 zdd_f|vVrl2K-vN%7`U_zO*9<+5@ydEes}?6NHYB9izeB?H^D-R;kAtbOEvsB3A1U2 z^n0K#7_QM-JKgZ*2LQ`3?5BNQra?Ibl#7Plfq>33d_#fjO9n?hP_hjVPr&&cgMcz4 zxrPY}s$Dkt-v=+xu#+}X`39e8pcEKHU2y4&VTis>QE2#)0*XZj4qYuQHY{=l=2gQ_ zN1#w**f|>trG_>OsA~r00zj7;7Jdcwa>Lv=0bOATrjSsjK}R9W>xQKZ(OG3EC;?ct z!8i%98bcfv_0}3V`@y?m_%#n^>kOAUz^pg?{2Zv8hVtJr%v**lu@Gr6ti1$7w+)-< za(km8AQw%Oq4yEMnhpD@?6k!&>nJc=4VAs%wHb2kz`J88_#2q*hEHrU_Pd6Ml%wr1 z_*1Z>(-24z`7Xnobe!up)Kawfp23S=^Y;x`55W2Z13M39dko$SV4>H*YzOp1!(4j) z`V5=tFw$>WK@s^!hD8(@959@q?D(MJUZIizPveGhd^X0_tas?gsqse#V~vo-t$KYCs1VpQbv9K;zwga3aVU9fZzcBb!T&O(Oq&v|Gvjg0RwAs3B@jTmi~@l~pGyktB(jiF>4 zd9*y`7;W#NGuN0m2Toizdede-&v^JLH2KCrS~v@gPhP>CT`}fJfmvu=^C8rWjPCRY zU2Obp5jw9LU%LnkCB_5$pjT@At`E@HjK?VZQD&T#0A9IKbPReGM%J@%snYoNI}o{U z-0TB|D&x;|v%A_TVS%bKs_C>;YiwNrmu?vUF#x5`m_YX!>Wv;0Z@p=>^8@deaq}QB z8;mt{FuHC0DGE)aF=!4ZtH~G_1h1QodudnFV*Irfn61V~RKwF|e1VqqJI0hcV741w zivV`l=pO*+4&y5$=x@6UNakus&&Am1fJz1*Vf}DeV%RO~Q8Ab1|*^1b(`j7Sa39%``I#b$1ivRSe9-q!)qbX*x$WtX`&l zRDR^BhGfn=tk2Jk84hs>c1iH){Y5L(eKu4LLI|D<}riP#3 zV2tSmU5bb`{q+>Qjx%ke-}aoT>seTcH+iOjN-(+Y0F`LkP8T%Jn`V6t3rVK;UqolJ zsl^X2rI_YWDNm|tDJ@oMruV6s=7Py?1ZLAsb2nfp8Kz?{7<;D4o@!h!ns(DaaLO|M zxD>ogrni^FrEJs7{pidweNQWNu4xxl2wyhYK0=dc@?8h8d{bNp3>BFEbp+TIQyqC$ zXnK{d6BU_0_JCxu$;l3#S52WO;Y5jvO(%^~(~eazbj`%1I*1BWVG$H6P5UTXaov>l z4_vA;y-uHUt2WJa0;R^Z?k<{I(<}Dy?1m{N2Pk!>)%3!wH(68W^`^HB z!L;>XG`CGd>mk`_8m0P>Cez_%z-%_n-w(4brk^SF(P~Pjs9&3jH6JKAV|IUM6hiUm!pgK)K8=%)^x=W=e-6sEFsNXX^7Xv5mo1O}T-UHJFB`AAL)0FM( zHT`uLyoaXlL7?=Ro-YQk-?W`7@gA8f8X+=ZYNSo#py>}Y+#NFQrbTDi^hG?V5z{|! zL1ff4pNfD&*RkfBHRy~pOFst6IrB%frHVHvwnE{&IgN$sNiz4+ovmc^ z*dg#z%=1K$Of~B%WSM3jeFtC{%ugM_uaa(-??q>ZIWrU@ndX1#h=0+%lD=D!Wp*vW zoLw@z-U5|vw(Y@Ca?DFKa4^@rl(uk}&8O&qnrC*{1igIou3a!&U~c{heqJ%3UyRN| zvx1(0BC~~3DaGdbw2irH{(+9;CFa>#XiClh>fyvS^DBR&DKnp=t2pK6cbR~$FsJfC zRhlCi7~gesuL{0YnbRqHUTt1ZnTi_o3v{fmH9zwes2gTCE=20guT((2-fZ{ZJsb13 z!!Ucx>}?Cr8q8n*7acJlUXRX3^S|3LAx-8DeX!naeqRTdTFmwIA&6Gobd;sADQv-DLirJx9KH3X#SisTSMl> zbgUjWmr$5##QcXFreM^3X(yU7b678|KQ@a)fH`jdeFh2>=6#gyoHUnihQbr`u@p2@ z<^u;{XxjX44|p@?kgwp9wI#C;W3aJQIil0n!tg?4XBnaTC3}m%6bi>J1%JZA3CrgP z(44e*HG=108PvnUQ%hz;1aLT{45GOe)wBfoPl0|MfN&o zBGBSA4uv4gCv<8JwrCzhA;dD{1M6ok&9s*awWRHUUYO;%B1nc?RJ31;u(VJlG1B5l z^&wG~ofKe*wy3ExJjU|Ix6q5VXx_t6;w<~FfOpQaa2*ulEsye`kYM?s2vnlwR3~`n zE!Qczmt>Jpy+*R7ZUZc&SQJ!4kZLi}(~)M0p}D?b`DzcK(=8SX_Gei9gMpH1QGE%$ zi|Bb0@O1{N06}$pV zCVe;Nie=9~;1ya*=(|)!mfL>ehHMH z)rWKn@weJZi&cPC4b__lT21#rB*>~r3tq6*e%fS&Sk(Ak@Vv+|>y zMz~c_5T+o)DmxgMkyZh>&_r1k{{_8ht95Y@iLvsd_g}2l|8aEP@i|^!TnDW#s=6qO z_T78$t!Rr5ttzb!Ri*7u_fVRFBr;@3h-?`W*^4X^*&&HUmLOY(NMuPu=I?v@*ZJIg z&-tEn@B2LWx%ZrN?>p}>P|h-9PN6N9@%mrrUmPQD5+t4xOl#8w#_m;UOJtOthK3}@ z$smwq#%kJDr!age9VwMDBL+$u!}(2^o6hJW|MfWr!v+oK8Fmy!%wRlDsb854?FW#{ zVqBxY`OaoM^A0L=7foD z46IY~;*MWJHv282BZZXE+gh@?|BY%T5Gd_-m_7+AmMRQvj3qOQ-8{_pS zK-w8o_n@JJp*jb0o8dbF?VXHY$obyII6%&TZpP^XXy{?g-3oK>Fj8Lw>1Et|9ng0f zJIH6%$C#oePCsMq+bG>*oc;rH0}Q87$PF^~9!1*_<7+jbhZ!yp06oHRGSM5y5a$AA zlrix&D#sW%HbQ)yvF{AX14arhARjU=)B1XXv9u3lk|CoRbBeKHEi_Cslz*UdhEYk5 z(C5w^{0k)y=7%4{++)l~olx>*zWf6?y_mP& z2BtT2!Rx5>Vb0Ktcbs`F8yb9>a`L77F~6s6^$F%~6Ua$soIQRqf94CTAa{zn_e-b^ zU@m+OZGlV=+ExcK-^l|?FjIdFB!oGi7Qvy+4{0|T#@s+D_NSRnGWUH2fjDLXE%M`;U6iAn zz-*WUlE}P$93+WZOh+=3nRkDHNhwUHdT38&Dk%7s#{7n^#5m7vrO0ar^Na~3lQ}a3 zbF-M0biN~-c_0HUIn0hnKrS%1(!%8;bDSbgxfmV@jTq3;&+CjFXC%%7(q(9G1-q13`Gp=Dt!bI&bU z*2Y{;|Ki@xl#}bYgE{8|sJ+d+nhVm&oI_WLbupt}0qJHI()PcH*-#AQ?=W-wA<)bG zbR87kW%kk{v5)!oKD6~S-=>%39&@u1CIY) zXA?$ZhS`1|aJ7A|B>-b!7+Ou~0K#>E>ln>&_+VdC4Ayy47Cl9mktbv9jtml`b z?o^^&MmpJu8h#zZr6WaV)F?7x8Db`{o6a}#UrA)j) z)|);cL9F-4-5$*P<};K+SRRzX63V*tIE)Bmg-M{{G%Mm6bS0eiRvbzZtU9{VB$9RR zYZwv5@{I@P8P>roV2NgZnTsC9una}OJj=Qsf>JDtPr0^ntOb98#Ixp0@Yp1_*lr|12tYs|NlFFL13j%4ZU$;O*I;+M44d+VaGq>%A|bHk*}8TcI45C+)y4unK2k#6^}bJz%-4auYD~Sg$<;eV172O%Ts# zy-%*B0#>`*FYiC#qC%UBQTIPGOt@b7@W!pdbs zpqwS5MOy{y-4K*2S%+y8bCtE3K5kX4=~rP(H7jZhSgx@mxlmNYnooaqSj*y-pj5|N zLtck^)*LOM8(4XCFTizH6!}dXS)0jGaD(+&GQe)K_AUm?E!L-Bp({Qfy5$&uv${y}uy|fk@ZnL`HfWA&v#iJlytgd-r>1Mh93k^N2 zZgL3UVZGA~wY@CP3y{0Z8mC}sA8UOh+WJ|y{=%5uV_D)*IlxMwD=G$A`;UMOv1 z+%Ri9EdfSY(Jp|#&ss_UaWu;M!~>-RaAz-z0kj8u$BQ7x*mW`JiYGgB z6b5>+x6r=dn|=RH$oa6}r}y?a`xQzT@MUkN8QPEiTNngRunTDwbdo(p541mf-yVRS zV!wGAB!C_G5849RZe=h&h`ob?iNWl@pM-`G_JU9FONX-G%?C>u`##OPr`eCvtRK#P zmE!ghY-a{gBH3vaJ&s~;uZQ><_6SWS(QIc55yr49KSOWNvYRPsGM0Ua4mZTHqo*Jq z&yJ>LVFEjh&Q>R~6aGe95<8Vn&m^;_E@7}z*qdh{p2~in4d^uXC2}I9v%hZx=Q;N5 zdXV#M0flEW*gh`;ER(&Dt}x1CS5=@bn>~+(;mKjYO|R$$_UjwKa*^FcKAl|l=d>El zV}D4e6E3mWrJ*gKJ$D*ERRMe6Tj*vXd%7H?h#f>$7qfr&L|X~Fk0N)a>~BJ0SsD8P z{aeCiww})TU149Rm|{7*j-t60>{+@6sFKZUgYj3{_2dq#VoP#iQZ;)4EwHY!Rg?~2 z!%hf?Nww@&Jy`14^(M5{v#&*A1RL19Xb*IqJxE{5Mz-6t0K35sFM+vDY|ptUHM1ud zL2V1WWi!JdB!0=Ll z9p*S(0Q3>gdHUKraSGjFgfl01HA*g=K}thA%3+fC+?8{u1C?%^@*c3bbG~^VeemF{ z{{qm*I5*?bcTdhE#~|RvS-%fPcylJBQR%~Jr*-*pj@Awa`f{}NA@bu$Xo+)zGcyfx zk`q8t41bRO0$6>Dvx`0j0US4qg#>aAc%c-;Nu>)QgE?P609XhohhFqh&KnCcN@1Lu z6b!*>jvJ*JgmZqk04##@?td{i&U%`xqBx`JKsm!{djZ;`Ii<96jNvSZh4@*{(n_?& zaz3I(cO2(ZC&c498RU6R;Aki;kjU9WiI_>88V1^uIgc+uH&ZzCJ_brE=O9g$X`BO6 zC`#u@T|v%qo+yMZ=Q+*v_08buzkzrrr|ZAmEzVsUf^5$8J&+uZSp-tV8L|MSm=oU! zQo?EY00O0)EyF-5<9uhJH;40OHMC#hoT0a>oU@P|Ar+jI0oYQ-u~F7QH77D0mDe~+ zDLX<<{n^9`j)7b=$4UpsS~!o=UuL#)axbCO#@TO$_IA$vHzC)-;Yxvdo8vSJ(#d&; zf^A)#NpeSbbDkbVH+wjtbgb(R=Vw}f_HwHJ1WG?ga0tfV<9tn-IRl(z@}&=RHZBC` z2IIYhxt*Va^AvaKk6;PlzDN$mK<;~` zAVJ)>>3s<1PSZV*A>2^PyFbnSeiS5}n@hPr5!_#BnH|XuBkxEQH~mSB#2KzB6&j+s z2WitA!#zdM=UMK=FA#|3K1HXu16E{)51ZaDo$8QfAzz0BkWTQFu>+?T2$m(A_j z1CqmibTP*B0{1)eyItgFtbklDca{=@^0-&X%YTXc^E=R&&)wS(4F%k=b+D|E`;{}= zinu3IU|=zK;J=Rzw>K3irMO=YELGgNKcS(T`$QPTuW=jh!IpaNj})?N;11A7<2rZv zELd)Foye`+#I@$3vYD$t3hh1IHp;B(!E0h+t`31nC8Ai32QUl7V;O&a%Y;+F?(LAH&7gSmE_5H11PiZZ6oG0-@n=da|4go*j@<@#53ErPuQ1a*XlV|-D z?*oo&}rTs+GU0FV&|YTf|ocB z%qX5H9O7qq)tL~8=6z6)QVg$ChQT_^^CG83EU(rDJ&NOXlm9b;_vKTlOyn6Jg+LN- z-cdj&^SlEcF~iZ&6}YW z^+jG!IY=(=%@4tn$Jx3Hy&ixDC$HpLSk}dRg?!ZAyjME`-NQ?! zBVTuTNqf-N$J_8aIQw~lPoQ*<_Xb6X2Y9Dw`#;EQr$F2gPyabe_jzZ?`!mXWN)0l` zOQik#L*Bp}0Gr_1&0ypwc>$EoG{aM?pl_D<6ZzKc_}3}!YtMIn85$h;fqO6#j{NCq zlwA4S9|v*cOXq;oonK8|@!-2t7WXm!n!O;Nd^yefUi>)9!tmyMlfS@+U$`A8$NAsR zfW?=;?H#D~;ylQwiqY*Qaaw_&!42Q&ME#z4f-CyzeCCYf&4^2R0i>X4ZxTM z^IxP-WC;J){}$`~G|Dy)@44hCeB!X`6-Y%{z4C!6wg0L2Okpn>nJ>v$j|>CB#D1-EijY$ zxud{L;cFW+ngFhp4>DuX2TW6@Th`7+=kAoCNeW zepfQ=tl@Xl(zcG@!hk?Me-&BXz%QGCz;%AXIG`K(3onA@2LD4kjoZY3tPv>9eAZ^L zwD2z`0i~619|g`fKIgxaO8m_u;OyY*yuwt@eu5x^sZxq9`c8H3O*!HhL=F`Ur0nSXFi~P1RnIkJT7>Q3lv|$do)A) z309F$&R;NZBWwv2{7C!hAVK>%hzASOThSIG*tHA-p@K$d3{RNgAzgcTS}=4FZQ+8F zeb5&nST~N!NP*Lj5RVdg(eCVwU>og^&I&%J4M(hCl$NM*f+0#(iWe+90+s~921<@d z6mXx0z9hlwG+-tR!lF=_A~;SHV5;CL@?@k5);OY+E=a3{c!nVAG}LAaO0UA|EWwAA z6O}C(3Ixd!{6uNP7X))CP?aax`8&if2@cU0JzvmEm-7?|wylA9p8n4g4^ZLS1vg98cG#{xLjaX3QD#@{Hh>-Jp`%*-d{tYTEL43 z*fl{`Cc0T8=%ABBHw8O)g5{Q=JsxsRg7xlIYT0_?6JfM&%$ z!N>m4&@XuI94hY#g6P{ZAXu^!;)8-$_Ca7skW>cCh6PX4_hCe^B^H?X1vO#d92I=^ zI>?y7>tA$iTyV7zm=6St8c_LAkTDA~A#kR-by85P!%sCOIC}ZzVl#l7ur*()X-Z6fU3yD=*>G%^=>w z&*?@6AK~2x&~RM1_7DVog$w_NNq$04B}ylRRm0#sDSVbbJ^sQE=|sRO;csIg0m7>k z)(I3oL;37M!n~JYZm@7Zxe!By3d*?*6@I%E8p4F$TvVPGK7I>wk;0Uv;EWPh8PUx% z!WYTeaaNc?(^IT4%Z5^%uz+6lc%j=8bR|J3rztN{xbYe=lZ2wzF`mi7PxWX^5#Bfr zxm4kww8>5r9{3xW>B6CTFzKA|d@D-lg%Zjn$q>G856(>C`*f@%OV~=6v}6mPpeZOv z==KMCn=8Dr9hG^)@Y~RSNqBlYQ1XQ_4KTMr7)*&1g~D&1KwFW}?K;|uh2KYllnB41 ztx&1(awrC?O!yWh`CS(FX94Vra6hFIlncf5-c|^IF`}(fSVimPtHM9!z`Q2x=mAQN zP)Cz-t*;vQijE#dA6wTJ-C?G^4T1j}9F;X9D)6Lu$KB>IK%8i3ssepCp~0b%yv zs2miIW&mYKSb7?2hlRo~AU-0@r>)6-p|u&%qr#O}P#O~+SPOx1VZ?t6dEu&7$UPJm zg+p#a_&ohD)TEFx7o1Z<7HvYOg;g&?U`80GhT2(SAsxcE6K(hfmG+|ko9MKI=&gUD z&ry^}TjxU}=JNnMEJ~n|{J z<%TwQk;ixV0X#)9^xAughUr+Ix9CO?#C=5kPf$88dgl(HeMPUX#KZ0o|4P_Mc%X&J0(h>3l9QB4=KzNC~~HGDM<9HGgyK}?iA1t5%mV36e{{|1SW-v z8fb5ET4enRmW7LKW6&2Nvb_ZoDGD0`OO)tmiYlBDxzeGlXwm92RK|#I1)>jUMaNG< zU#uweJLroOEvMY3cu@x>F(!yU8$ny5=rM|xC5bj{MO(6{ehS)CL=kkFELHT!PatWc zRthepi%QAseol1q0LXdK`?Ocf5N(SAN~Y+wFVU4O(ZhG~J7kM?jiNF~^wxRET@cx5 zy>wBuVk6{oMN28KGEcN+J_h8H={uYoD zk@a`qMthbmD^KNMAqHj;1Vn&=NM zSZYKkXvbbFN^t>ao#=}Y7+5cAUI&y0(VQ1C1lL9N6v}KAWzr;mL$tpO;x|PH=7HQ2 zZ5E)iN%X`Q7|&)=%kQXc5m|pg-&;k+|H8mF(I$%3wTlioz`zdCzAZ4~wn#G$eVroh zAmqA46SYv=Ewa7>eLbShZZPSN$fE|Fy`ty(q5ZBXffiAHq6Hh#)-T$A1C{qg{!_pl z5V7eJ*+J3HZ=i2T^fe{+42w!ABsn6oy$eP6MY<4>QIV9sBx9l}a{G*ns_nq}K=hRg zC=W$%-$rRd)J02&Nzw4zFlkD3L5#|2QPdKU8Bsm?2WLgo7a?FLw!a5k?8PGy5O5Hu z2%*7Ie2gBOLt-^0#~&7d_Z{>d5%-WA%}LyoiIH#?`_LrdB2JHi1~>5swCZvf?>GYu z9%4roDvyb`l4HqJoNNZCmpEe_nBHQ)6X5g_Z(9mQ$HfKDLW8e3grd%V;?=Z~J|X^z zvY<|immC47zj)wDw4D;WQsPU1IE(U80>w<)Ed_}$-v$X5b7^J>5pQ(^2^Dicg1#`Z z?HiEO;}y?Rz{#LLA->VjfrB$UZ5n2SJN&lSzJv!(-iUiyO2v2*HZd+ns_y7 zPZy80L;Re0xg7+~i_2=!qYUv6MbMrpZpnj5S>l&3p)y${N47r&B@!731k`T?v^oKF){k@%G-Ay6z1$^mAH_{sf1 zxh(#UypvbN=dwV`#TFt_S1bO_9c^{uSLoYOFWyd5SBrQy z7>ZiO-p9exCXOTLd%JkoEKKSUpQr51+u|PD3U!Lr^o8vbKThAqZt-`N1JWZNpq$w| z;(f0|QLp$fXQ12_d%XshKCw?NhNoX#LaViV;xyVc4TwwJVcDSg#4}(S5}#iTmSJ(r z`_MNcKH3CwU(Egn0;A$L0->C3nf*JQ(32`E?jz z$0St`(dH@1r8Tsd{HQ<6gmz!@MpLMzokiE0$kL6UX!69-FPr^zZrGIbt`LM89A039X?7y-*^ z341Mi8!m}D2DMR=ng4;DkrX8WI$Gj30L~amIS-s?B@rV4in$fMw?; zv9wsokfg_8=rSc|HUK3{az6|jvLzj#f-^_5Iv1Q5B(b!Ez9{j|L#J~kM6)wmTVxDE0Wa|04kT{ zTti!hWc^bpRZ42xfO1vxgC|Ip=>rku=jwQY&Fo|Y7(jglA&eczC{d!lqxa_1&&xh46Tu0d;(yw-zKvt+*~krI6$;#i*hkgm?AGF<*d_X?q0m-%+D5H`VCECU$S12+vE~#vT+ylwE{a|@0*-3u(3CV5=jF^lOVlB2*y8g~IKN2R~fLdjJsq&=mZwC*8T+@%F=u*^f+8i%%H(r^5s-BWs-_Hka) zg)sp0mVRo5fj-iCbc5<~>5mJ*;w#O~ft;VTn6hY2NS|Mfwv*EG#c1=FE+Y5hDd{(q ze-PMVeqa$dTY((E#%+sMb6DV5Rz zsVwRBV3?aNji#)?9O+YEp>#pI^1s{>X)0wb#<^nNVBs-(qyv{g%||MLV(zkL>pYNX}a5U-VyCF z_Zp;^XeEAK`uF4LL!;E04sYC$4pL0&rt}UiD{e_IZADv?bR~Jknx&lQ(CHRw=@S@` zR;lVJG_*;_Bmird&Y?TiI;1g?(03awXzP^TCjWJpwDU2D-;wr;f!QlvN=fH;rH_0B zmOkmeWnk%-&WyvBdr}i!aW^21qV4~n)Nc-K8Iq2WH*Hv|q6Ci->0;XF+?PJ(i?&he zqj69>CO!2FO5@Ts6f1uqT~B_nhtk@e7@i5KJ%yAfrQTYIPf6dTH*Q)wOCHD>Y5WLm znUx+T@1&i~nH(tgvbmHW=^!)Gx5H6ZaTc~5lKn$pyu-4fIBzraF^|g0`ZVNzW~~g$=;^zv8U|jH4rb^%j8-2 zmVGUREk3e30a%X9>S!(HD|37Z;wKBd2+k9-xv6M7DJ!G2K7W}#h1X8W#wc_eAbWyt zEC`gnCx@aS+0%893zj|i5=e+_8O^4lG9Ow5hsjpb2j#R(#sCSIJ--Qq6(MWSgw>I< z(bd3=lEv=<${E?N^$>`biRrhEkuCTFrL(en`e(FQ*(UOJ#mTzp6^)l!Y1T-RHBpLo zvTO;>m?^TSX$PGu8@mb4G})`<*H4%2p}U06$@m(WdtUZd2jntjb|z@Zl>JNz{#i0B zZGp38PE{De9NG0)7=J;g{~F|?%$5kbT$$}5+VW)Yk@xkIj7<|nzATdVumv)g&rw+@ zTd^CJMY1Frpo?Yi9)(6*Osq8Q%E0oDL(bRld_67swiY#gv0_Czfq(PL%Ya<7OtcXlYmt3<4`8jbD`b3| z?59C=tX=lmd<<5H?B$Qqc3Z}8L#b0Xnu4}2Ss@c(-Lfv)D)h)CyC8Q*_PPx$y)v&i zA#hg~xCAVHvJf2v`ek#!M_2C2ew=~8fQ%mp?Srzk8VC%@cK!~NhGoG5pp3|zGQe_Q z7V#-cTf=wnU)Qv$Cc1 zxwez@XeD4T|NKV?ILOmyQF4^Ow;Te8M90XZV~ptKYx`EL}ycb2!2+s;M) zJ-xn1qCa}%DL+o(ATRlKihX*^M?%ms zA31~mCGogC^9oA7@&&75grB_A3Ug1$H`!2mQm*!dxW7Dn405OB?~pGqK(3<9xIp545xdkvOSZ<-5j1al)C$NOdn<(}YCa-lv>9qVYHB1VZUpE6KLjKJP2t>-CEr<3f zxp^r{XXMA6!4fUcd=$_za!WBvXXQ5X*Tu?zrXve+@&k0|L%durLMcJM;z!t-C|^gP z!6f-%I-s8{Pt`(0iu_j!$EM2XIYWDzyoPSlOqZ|Dhxj?UF$((5%U=irXNFvq1(GS> zwHW4R$rn(FK3neoG*}Ac?~zBMQ2t9PkW#sX!m(xYCAT1c zS^hhPn6Aj(XeU)J52p*1D&(I|q3x=?ZyqqK5sg~cPnEo~Sn>Qd{Bln>T_G;zt zuLet5P(F7LexnJw`#O+Gc_VF%rsN*qp>0}zU@^dE ztQ8Gm2U%G(;=jB+p5VVyh2W&MMY=!oXO?@hYIiDK^qZI$p7rav&2F&6FOStl&&R zE=BQY9Z0HTfczn83cEg#bcO9#782ipo;O0g8E-Df$;c;Id*P?d`89wvw}|T=7~v`d*@9m~D#hs?mpb#nRU? z1RaXF9F%S=Ha!N?saRD9mM+Dsr%>uv^e=>5k79B+hTyJZ8BIZb3O)HM`xRfY!E#Tr zi~=hIikVn&4l1fBPjyH!MBB1q#Wr#sk0>_KV|rh)j`ozJ3VWJq#}qFN!Rm2E>rbeB zpm>^|!H0^c6QIam`5Jk29hCh8sB~0*Y=!tC<=3>OIjnT}7K)B2Kd1q5R_-Bxos06t z3A7zm2Gf_zRT({rN;l=FKSGg*vgSin9#h(>pvY6%LF;5MW&1_2cq{iF!3Z8#{!M`Z zUuD8xVEQQ+(>r!T+0y`)lgd*R3-MQu{DDrNQhr1}od9K#1*Jfxp0?FN%I_&jGgzsm zK@L%NgkeBJmHCtv5vF`V8E2=Je>QpQvSMPPvmFzIbJOJy;TyLv+R=QK?yqUnNOtPtSF-GF||= z6y?wK2Bazlv~x>SI!B>0U3r~S#?C4G9)O%zZkYyjhH}@t=zFH}2X}C0DeGTB+Xdwd zG=dkEDdcX*RlXaD$~>j49+j7rdJC-1SNe(QwNSqL9iWSp3n-bUSQ%Y|wi2b+MUYZu zx&utQtPJ=J23}FRQSwK*@>x0`!m*+ulC>gX?ys7->ZD8I~7I)H% zpbRCaQ?v5960o!=Z#;w%t;(P2!pSz}rLR!guKbrKj}B$XU0~i;I@AHBQ+bV+(p}2D zNOZbe=@x^^9_42gs=cGsk%O;SxrD+c{mLNPRNPa3D+K3&Qf)$MP`SPmEJI2yT@yX5 zZ2bq7_m%6;qco~)qpRk}l&LhSjw^%7RsBF&&4%^~<;R(@dQ$l%?Qf@)E9g(jrj^_1 z%=wHmP67>fDmzMyv{zl}0*iynSPeNxRW7;B52-@Py?9vleJm6mQPq(b)kzgg@0hcy za1%IPRC(JlJV#X~S~|F@%4o83Q>~#?a(9(;D8|J@74)d zK24Rg5(4R}h(xrVQ-#qd`MgTI7o`lQ9X4Z+ApY% zu|Y1X4z9tklB=qUgFv3@(0_+aRMG#yqlh9tQ3fm94 z5>-GGI7?N}rlYbY> z`yM*hqFVJHOlnmfxC6O1)e&-=x2rZihRP1r^Ayp%ttz7RV5cg8ZUF4UA`jZTRlBNC zx})0X0hC_V3*@P}tMXX~(x+NTx7PHlSd>I{Pj%lFU<0Zj!vQv=3ZRYOuLbc8c&N&vQJPRCEJA5g)lI29Q>w!h2bxx~FQIKl z_1p&#pH+QZfHr%zb2W&Ax?me@aa3;_LZ=U@=dPibME&Y4P@L5x+fnJF_U?gYN7eD$ z!Re}=rd%U8b$2$v+|@lZ;Pg<->HFZR4xl3$UTRSt^m(fT=p2!c+B*rH$JN_ud+e*; zOwX>L+V2~Xlj?O8zVKIT+`)26JxWhVfchQ*h-^o-UnEO+LQVhsb16z@hEjh4Ft}p-=vLuwE9jAo`M*4;2&T)tJYHl zAWnVt5IE!2Z~Y9CpnmucFca16=b$!8?Lf|sWVIz7aw%#N3mVeYOP0WvbaitdtUjmy zU?JMhtNmL+GSo@W10_>ET#s&MsjalI&QY@|#&sADOyr&gWV2hKY6fh~}$S94mRp+W8NE68=V z>lVm0st;~J>4v(9?svPXHqdwamfB3qttRyp|>Q`6N zG3o*J1&WRjs>hFGB!<+Nd3Yj+)r=p&GNK+U1Ll1-_ffEns@WbG>v8pSv;%vfzFG$D z57q9UKyE@E5s$7+sskwTWk&s~7qri+7f}AZohI}OD(yAVLg;hQto;RGj+$R`Q97h~ zM*+?wnnTY4+DX$(9|mU)pH}xSn(m$8JgO0F1d6L>XBR5nH2cV9>7g;SL++U72MN@A zYRpU+;iXAQfw|tAgLFB8kEVAGFpq1Vd=({MO$Za>ewt_JqJJkeyUS5Jsk!b1a!Qj$ zai9RrhgX3TsB!oiBuMl4K4=Km%=dvwA(}lE01MUR(dAgDH9xaisniB`BOEY{RUgoGz-Wpmae%^=MB$kqG>6esriDoEm@jCTJU6Rxc#Wi z(ImLQ+zT2by_**`2D-T=SJQJ7(3dm@T9D^!o+3ABf#!uuuoP-m^+2FVvt$^hVok^d zw3ld7$Z1igIYGO~%bLY2V9OPa2d#U`HMeP-RH0c*c?p#oyJtYIYCK|LV3meN>D$$s zjkJ}$rum2R$Z9liQf^_L#ytgNRF4QXUIp>J4Y5Tg(G zH80ddU{v!*A@q%Dnw4M~*O>nVd7w#p8I=z;D3`~?@_R3T9c@O z)iavp|^*%nR;*@(JG$40R9pBM`tGU~Q4rEi`{gza)-mmo5E$>NT})pYFKrAh3%#}9x1!{uJ$Dpf$F+@x zP~@w<@+#U+Xg7a=wv*a_SD?~gn@(@|DebXcFeyMALHqDPZP6HP3DSP|KlC9)YvY3@ zRJ&&sZDHElMNoTM`{E-QnLq4A1r6I8^@tNT3bgaC1SMp zG=IiwPyT?mIPDmDl;XAP$TgRseQ6W)C2F10QJJL8rJYo=cI~6+ZK}5OMTn=lqI?WWgIS*@K{0qASm>EBSQ(Hd!Ttko*$SZuwvf+nj5 z?f)o5cwPGn-NVzUO+Ser^@g_P8lZ1#U1(o?OZx`Bx6N8pCFEMP-`s{=t5!lG~ALf?RPjOLI*ZTC~)9Mb-B24KV5nKR%V(W+^l7}ZAp49qcYWGFbtwbk2E`B1B) z=Ve0stQ;tl+W%3y>Xh~~Hab1673biYn9&AMm}ORbHWK>mbt+oqJLqP}yXB~3kdyh4 zE}uffhjpJ&;NghQMoDQ-Iu#{&xabn-4LGW+-vSm_-Nw&hlACVsO|-e|jGa*Ap{q*4 zD0%53?ZN4-Tly0?eRKuMU^%W^Wk8#+uAP2qKi&B`=-&xl(+g-jsdN7w`uufFTGpS^ zRSuyoK)1gcr9jE>L21n`vf`)3GCf60ggmG{OYkx3r2))P27L zC`q~ya?mF09;d-d(fQLZD@}JL2bk%)#s0ARoGzDz%JaIfXmy{V8+aL&nL7D1fX>pz zI-xRKw^xS&$V8-cbIWvk+U;J}Wlca)x$ad8%T?%#De<~e7eVR9S9RPI zkgL)eet}8Vx+C%Q%U+D09BD_CymOwR!2 zrY^$?rCYkKk>G67nP^GXtZQ41*SAHNN3&_GZv73I)TVn*hf=%lwR7lZht9_x0-d^& z*P*sc_Y55`=+*@-hj@=JXFJ;N=)R@3ey=Woa#il?9;JO%pRR2eNWboG6FBebK2`v1 zK=%X%+lF*Cg#a7YxxWdP5nToC81C!#eF4r<-QLUS`MqlU%1$3go?v^uJ#BCt^vN_iI_f7W?t4hT zz8B=MenlfVkLcZ9putIhuNxYU>N~d5he3Zm9RhCpESl?%>B~z%JoRDZb@$S5p!K}B zeqlWXeDwKGfcWYwieavwK8ie$C-g3kD4oz)tHuD4#D}e~MhPk@~quK%(^D>H&5}Ur7POX#G?4Rg2Mg zehkZE_34!P5T}2JJW=s_4f&T6^*cABl%(HBPLgE(CKEKI=$mOHma1Ps#{kpy@$aE@ zPX7VTMCbKvdOI@pXFddUmfqzBpk(W(jzfEn{uNr0UC?XEy_lzejZ&j7=~we$Qoep@ z3*-v)k9-AEs5c!2XR&?mIJd= z|7#06eO3QnG32WBG4umm(?^l(u|}^BMrE!3-yDe7>$CsGKsM;VB8SFx{cl42?v47z zA}G3{Uqg4i+|vIt2!SU3KT>FD)@S8{rB&Zek6W8wISBD~ecL}Mb?E2QPjy>=PYdl` zdP6HnxBi2VF)ls&Li#rL>R+Nw;azqn*l zJ)-~mD`4K&KS{|nqx$bC8b7ArOOwvHzJmNO5A|zlSwErgr@3xY{{(Heru3tmpU`VzA#nDhpMjSHi*bTLZ4bPoL5^c>E{c7I z7%uHYk3tP!&?+I!uzx4io;K`g0cN-%EE#Q4hRiR)dB%_|0*N+M)0`Y*U_XJ*Fke1Xb1gTn(rCm0GR(W68IkJj@^h8;9{BpX`R!T1zI`&*DpHF(kEon{F75OU`X zZ7NirH{5mvXNI9}Guko@;pc#oWr(7z@oa?Gz=%x?* zC4+G#%*{8PFhQWeu!ufOMFzbeDvJ%ztp-?$Vc#5(Qp1iP(N<<)Q*`dKVS^syS#EfR zBB&LHWpapD8l*JaTr~uR0=mlZKRS{{*Qu6jGSF&QQjL5%q?;K?pP$ zw$k-**A2Jn^Lf({co@*P4DB>@O@@^pL2a|a=mqf>19vyXTMZ|2prPHsr)-K2!!o)p z?6$#n9V5|Y=vfK5Zo|D;u=E(V)3&8Gwy@j1|JMDe#jr6zfa}OD%2H0}g`1LZh9Wf>{QF1n(S_VZf#`rfOe$;qx zKD4_UyXdWQGrG`y9v;RO525{-@x{+k>1hmK3zNKzpN&J#+xXrN2>2L3hz84X<8r!m z%GX%linbu*P1-^Q8`FkCLX5A|k-bpk2QrW_qX$JzP8*9#LBfst%TN?ykb3Y7(Z!7Dcbmz6f7~ux86YIS)=qIIAe`3=0H5oXg!I_cw;N&XC)XnIzb@O z=wASmWZW)5WwNo<2LdU^%s;`IYE(Q0xisU#Q>aWgDk<&loY5f${X1`5^Z~{!!}to# zrkO_nHlSn~-#!VFZ5*P_L5@*L3y=%O`CnlmFB(6l2Q1e(_b^cMjIq(scggq!O?mmo zR@#0P7;9%xDm0$ijkY4==3gLQZ1fFoTtTiFJ1N** zZan)uv8jpX6raTWT2J zVtkA4NNzP6$(A`kB362QSUodG)?O_j9vK4kiqe3gey5wxW_VhT9`IVY3< z7qHsdbZZioE~X`OfqB&ANbjwyX+9+`xtV_ShY{|k58r{+9;UHhfqBf-S^@!2)A;MC z^fHyL!_VPuilAfEKBhg_fqC3?y8tM@COs|a{7gsa(KuoHCLC=iOZ68PJjLA@o9z~mO(3}-xdjBn8o;9tl1c^1dy8|=Mv~U~x5N|qt z11t%qb?F$FL{lYY$|RXqQ1WWB>1T5OrI>6q38b2KyaARp(-unLOgH@`2iQ5&F>=hG zH|2YyGQ;#tH+qz5vZn_u%fzR=%4}1|A85-lRqg}1V0v>4ST34&pM{;5OdH;W)%hk4 zEnEsrF|<}JG&QwBQITn{2m-~X8rsB^m~s!nmQs`BUnrHCc2M;AvZ;A3G+Z%N)3UzY zbo2;NDoiW?OEEO(0(=k#RGEJOr<}g?=`0J8R)Au?Mwk?o#|#4 zSn5p{x`m{{w4M$cUN`MgqnnK;iv`+mnA~WWeACp<2g)r|qYsR4GW|}cshdrk%RyR9 zQT-T@R?}YkR<)U~ybRKATJSQUJ4{Wh(RSO^{WnUTrq17CM3>2t^6R=yBea0*F)f^h zNq0={x53$Kx=fkccTMNNgW5jRVjpPeH~qC1ldXAVroPfZ6 z(*ep1A2r3ihjAG*U8FN<<9MV1{lJu527M1ruhQpb!t?|U@}%ij8|0=;`^a-SZF0MX zF`F@!(!PJz^wnKJ+nJXnpwiy_aGb{A4(-Rv~5HE9kJrsGH*V82m zK4v7b;jJ?7qVxKUke*^byAT4Y=7@h_Qkwau4lL>Bmnr^m&ioHOA?M8}$=nR{KQBWr z)4ZHMidp7&DAhCDEVY9XIp&XPjdH>K)e?wbG@m$wj^&!2C`6xUp3?%kOJ;Y2W@LS?C0N#D3K^SgaeblL3L4MkVX{8Dh1 zo8P$rBPz`Og=niZk4;0-Rdcu=ovt!RX`!gve60uMnt6<7jT*BbW!Ti3U(JAcgL#A| zf$QdDJy6tW&Y(yChB=Iu%QwybDwJ-ScgzQ7llkh$;A}SUpy{y1JVUvRt>zU=puNqU zpAOP)?)eRv9p*znK<>8rM|YGu&AHit?lM0`uJ~^ACp6*qnBC$4cE@Zyf{yi?FFyhe zcg>RnfbKJ&q^qF&%_nIya?iYr{;^}gobWn02hCH#P&8!z{8J3Uu(_}jLpNgnr~~A_ zxg!kFqvp0uXdg2_L$A!ZdG;_+9+;ONM%zR4Wx9J~!u+8hhG5dn4@Tvb`O2#hpEgg@ zCwayk^fbh0%@s7rc9!+mQL?w>je*6%vf(pW?Py894+9Tb_6NhQtJ-h&ZQ zma=;wXDs)P&>n4B<_4={EKl}eJkMH|qnEPu74GSMn(kBnzO<3=tiJixBNkS!F4jad@&DJ-?QwbQ!oRT`4nRqwD`~_d&sh150i#10d)3b#9}@G@%xtE zHPA3>;jaQ2v*ZZTHg4&vfuaYN*J#dqXnFh_v`tuS;}Dp%ycvP6Oj%aG34PO+e!BKz z#$xP+hFQxJS})mIz3O0+y>+VtdgNejQJ_bTRw?cH4p|jNF#fQ0A9=-&STE&+#mPEI zUteeIqjaF$#rpbOupG78$-&}otqF!c4{OmyU>>tBei3Rtt*g$#GB4}u&r#`ZT}sZ1 zAYVd|^+Gu0f~~z2M+mVlp9OTNb;TzT2($8!0s6Gn?^BR)>k|4FM_7Ztf?TBasSK2& ztiSyMbI(|d=`w_9>y84bjj>);q3x_Sg`R>~>%;x1jI;9JL1n!4g&`Q2U|m5eT#42S z>O+!sNHJ-h3S$E4Fg!Zi*7?U;Z$@)S7n#eJ`^n&4Xo^tv?Px!xgKUx>;@=^gyY?>ehj_ zN-OUI1gfnsT>|Dct2=G0Ypf+kaMoJiAjesqHH}i7>a9UDAPv@UXnlR%>PjbB8?7JZ z0_=wM`5JKEv@WGR-YsiU891A)?nIicyOY7vV%1ULsMV^XGxcrO@4tpXyLCOeEIX{b z1(3UKJtan4r}Y{=XI<7?F0iHB>O%L;^jKXU1LqxUZ!5rhtv^yW+Fh&TeaQ7$pXURt z-+G3Y?)R*JQsjKVS}p<0pf!Yic|+FC$H6je{hS`D5o<7c8Sh)$*8ptP`dI_y#;l9i zK+(9>bqJ*g)|XT$J+vyr~xQzX>Wwv*gGUbatZJ8;~l+y`-ATkHzR`Pm%b zN974y7Z)riZ58CT^|$TIht;QS_B43}*tGOS2HNWBG-r^lK?4$Oo3KD2#5S=8rBIvb zG+4rHLmva|wCyztmWJCd(=!-hv)_eMq|L<#r6}7=; zb7AL2oAr6H(Tb>{>uqtD(4z+1)3md>Zo3o#lt$b3UKnx1 z_6dDOZ`z&-fWR$VAnnSVY%iSyX0z=P1NzruyHSl&tF7_^NSp2HXTaHR^P;<)J8b#n zp1N)8%Y$5}ZD$NLblD!I*S_2Kf(06SZ2Ku2`;P6y2TdWe~zv@F6*j`H%u$b(zIocN?T^-n@zJUefHjaKMm6~ElX`EQ$%Eg$Pi@6 z5JdJy5W$6l3|WG*1lfonOL@Pizs~2Ld%owKd!OI9_ndQo&l>u2NT-~zJLAE}kUYeAl)lyC!Enlhg~N<)CHg!WTna#YF}Bk> z*_*L;4lMXEHZw2=Uxp`z4g45wv}y8ZoY?@$0LCp^=ms+GK8e{q!l&WO68Q*xpLJs4-g#hF-_G-Y)V>nO{FQ0M$zZ58A{R+Sf8FiFQJi{2H zGUX!1?_0qvX3V??$+L_!KR92)Xr}_JbBtw7%ylWlO1bj$j8Cap?*b$G2Y7vv@uCCB zB}NbzxXX;Ja*%Sy{R2>Tg)tEc)mIsQu^3SWV_*o(O2)BikZX)8+O<|OZu|y#HABpS zNDX70;)At};a|YK&WNLBb{*qp9L&};exQ|V1LJdV_|nLDB@*x^#t096HyC`{el#^cyhO9gI#BL^>J$l)bvm_=bYv zU5tiT(CTKa?Sbk$j1Ozk>S6T00bDQRtUI*yF-GGd+0W>gqi=w*jy79^jJ5AVWQcLF z0j*(%GY#`DW0n$HMi}>=g%kG}zy1ioC}ZA>V2&}eD427fv7{QUamMNo0hnMcZiC1a zW7%Rbrx|I%U_M|hqc2T9WNdE(V1{wvZ}jbF9-ya<1M~Ew@Wqk&Q#q_VF^%iNbY^;T z(Q;ufF~O`W^YD|uuo7dyrbbVe(j8Am^A1ap!qtBy09 zDA5?n)P4soQA~Hb%A=VJ8elz!S(pgG3Fg;B0K_u=ufl8`({%}4if4XHH+ljyehkc$ z%=t`+Br>}z!AxQvp^t)|V*ZboTgl86x=>Ct-{8XC6y`R1JEbz8z6z4TR3yRAOy*1i z>}4^>T|u&$=~|E+X8V^Qxy-~?!1I_FAHdyw<{_$ZD`1|Cg4c!2UOK3DhN-4-SP^qK zZKR8t`)I9ymbpF>A|*`k7_`nYn`jAF%G`GV%ra&xy}-^h%c(-@0`sUFa2J`zOenj= zT=zJXU1nari4m1E%bMZD6{c$*oVdz#4gjEn8Al7AN=SlSWA42Lkt*hAv?#4+p09(U z8m9DL_*u)0qX_GDrjkNCb#p8?mvlsdp{BlETqq=|X&8;~2!<(V*alev69 zwA^B5Y=cX!%+r*8Y-27Xo$bua^s$@{W(F0hbTZu%KyEV+`vcy^Tu&cr?q>c-7uX%< zsWiCM!}R+K@LuMrJs^F|9h64uXMRT0I>1~s2k=4W%&Wi+F(0I3(8J7KRCsom$)@{n zgn641==YevTm){E*>nch$C$_aF-!NE#t&g(oVkF?HYS+9RE#mnoXP`yin)azNYl)8 zy0srLYqvq#IzXsEjwbhCl^kQv1 z1!dkW$4~%#Sgmf5^kohH0!cqs(hp$zvxIbY>>UWf>`m7sgt12;>-R_;a{K#sG{NI@c5*;J(v#qzoVozbk*pTS-X z>zPL2POvr{#7xApR#IhZ9BcP2ka*VoYIv5wy8Zz~PO{!_20W4VB$Xy6v0e#*mQ$>a z^iw6X#tY!mX_jpVW-x`7{W@@|thto?Ok<_T!s~RF+XBEdSe>+>%Vf=`pCgO)B&9O5 zSzGQwOAgC927p}Fiepfg$C{+bLO$!YHrOj*xl-h-koDf%P<@8QjR3BQ^*b%1F0#HP zKQFOV>*!u#-J&BI4vc5{zZzti>HCApaR9CUSrSH^K zv-bW9Ej6rnDN|U>+CiD+>#WylC0EDN`T$qYT9}V9G_bx~guX`BleA50V!3v}mm940 z^nz|?H6?=C!b+u(>`m4VDu%kndXb8qTUkC-fYipi=89H3Yx!2_>|kxAg+wRocraSG zS&wGHdKYUSZ2-Di1;HS9SdUzRNDqrC$547%J(pmik9C3eas8~uf8g~1tCbEt4zlL` zgMkgPR?#A3m{lf#y}PXGyO11ZZIwaU7;7DsKiy}g(i(c4l@b7*6D%X;Feh27D0Mo; zS`vr8X_l1^DLi0B(He7xwO}Je_OsvGgq8z4rUv74WPeo;;>7l#kJmV}x6*Fcg*`yW z?p@h~tKjtkwl76h+}Nk(uzryJ%6kB~vwi85-68fpDiiTwKTdzHd6=Eh0h~A6m+HNJ z*z2iO!jJvOam3$2w;yq0YD(TX%$*W*fmrQ6U2_W4CYbx{wTnM*^lQybqL#q zs!T%Jcj;707~7r3cZ|Kd9LmDkwPN%|u={7Bb)4No6`zspuyKe)u@BO<8_h0z3#}OT zOSGIk!4^_BK9;?y9)LLZ7Ykr7o}Ke42A059Q=IQ4n|Tj_MD}zaJWFCXQIz8pyPgfz z$!u3Yh@55zP)shBy^R)-Y3!FMHJr{awm@eVn|~I4+3a1k13m07dL4=x|>#dn?5N&#|BV4K9_kKkS4^8T)<-oH)<+q~GrX`-yj8 z{UW>Qci6kcX1)&#m)YHPWtFpcP`2}{XYB6yHGvOKJq>Q6YROI5Se7( zq6O9zdkHN$rrA{#;CsOS=nFXbkRAIS;4|zMB`~|6BiRbL11FV=g&aBS;{bQ!u)HxZ z&K&i8;9NN4{=m6%{OH3=2RK!TBQW}okbiD)%F&1 z&QJ#DENA&TNS1JvpF-puXNXD+OF6rCLQ5IvnfIakJm>c{80G~|-83XGa=xMk!6lB5 z3$$G3WG=(_$~phgE943%^ep&l9SfIkR#w zh8E5g-ElWLJBhS$zFCV|YUhMd?6-q6l?&!=&Mq!mU7RK9fOm7QP#EnFXAKtv>)}Xu zg4xUQVL@3RXB{nH`#H~+fedh}=t(=siP;K2hd8CN@NAfqIR)!?ITPM!jc_*70q=X9 z@6LmX#Qs?*8{@o6dC~ivf>e-kPB#_rOmLR+ATr5Wx*Wg56z8iOfKPK&^a^>v$)}C` zLr&UnfX{GlhJx(p-unt(J8+ArTFa69;g3+}#QmCfks)E+|QI4SSXj#17E_qoD@h#a9=tL z$>ZEeN?$~B57EvoiYua;uW0Vo8Q@~L|D&^dC%BcQES5V(*GnAts}YPgp1WfbeF@y$ z-=O6rH(~>{BywN80m&q;({~U#%@rNMFjKf&&O$Pk>;4@2(zpT7!a_Q?g2Iv++@I*k zWhQrL4pe7xi|L~x+1!&<7@5P3egosn<^Dhs-8}BBr{PjQ_dyEm6>!tEhVkDej*++_{W*}#2~vg(c8?ss3o z&lYaMG?+KJm3D~S;@+pSjaF{qySTjDxVwX4y`B3u9dhpA9(#z*_GR zF0M~3M7p{CbcX*9*Omg(!wrjqvR-c3A@uceKl~N&er^y&Y6iHM;(#0EhP;5*5cdr} z>!#Elnz1mqyE$_iiHd7te9{1ETQS0UoT`<9Xmhj|z1`RU0krR1y^ zPe5B)Z{G7xQ0>QijH>(mc|$iq0(kwi;8_rF!&&qlL;|8e+oiYK8Oo@Abwwh^a!cRA=w;ccQkLMm@6IICzHo)s^ybovzP{rFv3D|0$ zP>z|X;f1xrLM^YJs%x+FE>KLhj`!!AXw~zEDB#w}`{E&(O}vR}IDdoZ)&qDm?;6Fk zT6h~6uyB)S+y~Wdydb)7+j;5qR_owBq+oF;Z{Gq8`R`KXd4vK! z!uy^AVE1@4l!6)MjmrQZ<0aA;!S3_21n3**E%yX`g6BiE*^|7)#xND%*9Di}S=|JVVoV1B_Ym<{2Zy+K0x$0)56#y|Qt zM2_);zJZ}|e(dXDM)22Banf;qGSv@8^4IMIGm76j3nJ0{mXiR)@Du5-I>CRn7^-9W zEtD{fHzDzqf=zjlMpQ~a+e!JN$RPQedwn!iMj zF{JQ0doavY{wG}+W*YxwDEiX*M?BD%!JkKKhD`q25LnOVchCwjkN-dlkrICECRjhm zSF&NDl+W7?KpEdo*Y$aRA3dcm@YShMeUZP94arOV%2Bi~^FQ?gDd*QyeD@09Yd89? z@^{n1vx3j3>}n-H*#fiI_&v1vs^afn3CU`HF_k#g@YAWHwU#fTnYhmPq<2mozq8#`qPq^t;b5orAt{{#rWyG{Ju_6M#wnl`yoX_&X^IH_cCw!@>i;o(doy^8d)d z^vv+jwgBfS@TEY3lVBa~eVql*oP-lDf@>+T?kd<94aoz7o?qdvo8UQGG9DDP(K^dr zkiQt@kluLQAS(&N7Ik3B2g7mM&QM z0z@(db4Fk`Q?T>}j3G<#`F9v!w&07+5XlkTr^i#SAaONB@&un>2RvV}^f_Eh1%g6K zMimKMu40(Q0!|5BIxARDQMgjUDjH^)z$Sp%^Md`fWV|5QFNCs-g72xu<&wbmHMCq7 zJWaJ*<$?@KDPIvNsEX~XAayn*D+KwzXjKZHqw=R~f@X5JN>HYS&T7G!9A;|-pU#1y zTEYKlk$7F;L4&RnyiU8wdcj{5Fl`X9!XViw=>HhFCc!2Os@)J6lVGn|;PnyUEds9- z@cO2}uLoLg33f4oYZW}!4ALfOp}26nV3Oi>9Ri*gaGip|QUGoXg!J<65`<9ANw*+} zZkaoR=cvZ4M{p+(%6bLgZ2+@R(DWWW>lZAb(ysx*567TvP;iE}@k4@6x}AmvQdhL@ z3Kl#Kdn1BGEiBv!@WK~hP6`HQAUP$- z6#+gi&`@mVfuQ~hBp(X;zW{SaaEIR7`-Pi2F$M>r#1lFlg^rY|cM>{gqt8VcT#i0h zVL4qy2ZVbdJ21V3f2{+~TX_2%{PYou`!OPap$jEz0)+kB zp(Rilk_s(Hg~@@y1q(OQcUVJ&8-Ic1F`w9NqvDC45Z`5-kib1RzFO zKxf>Ogs&z+%PHZI1h`~j36)cy7M4=cU5fCR$G}V#N(^u!UHIx{^koS9%b+Dws38Zl zgaLF$Gh1k-&q3LjV*A7gK3ep)evETFwZ6qWyc3a8&_X#X=cf z>}Q33^nfT47S%)NIiZ!7nx#T6t$xddZ%}UHyfBf@+g}u}r-;NQ;TIG?yDao81+HB9 z1x?5m;U_{cuL>Uxfa(h2iZ4Jag*pmqUlZ=7{B4y`qXoQL_yGklYlJcWVAcvbEQnke z4o$$bI^kpK7+<~c8E^D82>q9UGzz!N0B8{o8R5h&;ncTqsa3dm3&z(b{GC4M(k@&W z0(%`o+gdO?g+0TNydzvc8$;<8zCITg`h?3E5a|~dCZTUYc$;2XgTh@N01OG=s7K$3 z@P~&0+!G$pL2Fca^mmAi3AfRy@B6|@DhC`F{(K1bCWM>lo}LtXK8C(2;Q|-59tiJJ zjmtyf#~UFzBlMxt=l!B=SBN->k|{dkC>olF5jlxsDck8Ry7mZgE}~EhRlAC=&~xyB zXwLJ{;wD0uN|IgrHs3?X9&%#8e zBj`IO5;&kQQna8PI-^8yQU*Lm)Up@kglH)hbH|EC=yet+N?!&*yy&O((2^h;c?iHM zQJfiOlSPZ$q4TupFDf)m5j{c|W~%7#C%{Y>y+IrI4AIB5QOOjkI^k}XD0>?Qohw>O zU*XCV)zHa|e9<||suzfO?&vEN<;;b$B2h3s$cja;b)a=t)WCzX5>W#es>?+0sbT%R zXt*7?3!>g-z+DtMJp*NzME5FzyDWO!4qUlta|R@@iUw(iQX#rbv6)KI(szNoCgS$P zr7F?hm%*$SMNp}3jcDOQD617Mrrhpz(LO2%Y!L0~hR#M2hth{lA{)K6Z-}aVpt@O9 za1VVgq7=GiZizb9V9r`a$wH`Z6W!HAq+RsE)3Dbe5+8&}m#Fp)z`I4$d*SXK(XAC2 zQIDuG03yAj-BcyiC(5A=s6=1rG%U;014v6Qy1<%~XFHv;zpm@R^hTO$_=v!BZ#8p4T`eE@31(=@V zAK!v%FLCrfFulbu^aJN3Zj}P(D~_UFkH2^!EnEV`;jv%_icejEmLuX`s#FUS`_R0E zh__XOgo+#KWfLZTj=l$ROk71G;o|41W+6iS#TK-Viv=;z5-HwA<#JJCRT;(?E#CJH z%*KfSd>byE5HqL*C|10YqP=nA$O)*97kkVHNf2+LSMo{mb0+*$iDDkrv78dWunq8J z@$YX!|=%4djKv~if2(2=bAWHR1?5zfvo%rs}Zk z;>}ccQz!oYDYWXv9-|-);!0YTG>R`%c(_UI7L9qiAzn=DtY-0|1dOOf9PuNj=a%>v zIoxd(-=G&?n>hau;5x-JN{rnW@1>PTm-taPIM^-rrx)KH@zeCu=n+eQz)*U{vuPLE zCr+nAqJFV35*7x;rk~L_DE{epSQrvVxq~?@?k3Ofic={@HX>eN!NBf`$0?jSD%Q`1 z$e6gk0)6+z8B`ZLE)JdrdlTa56|gWVe)cCgF(n>(3D&2@HM61Yf%sp_B|j7g{{@j5 zv6+@s`z0JYqv9Y5egsTMiG(f&Cy9n$M9z|jrD(ZGcC zNJ)GPltoF-6hksv@;O}vF_LYx-#j5%bs8jAV%dkjILZ88I3F+B{SI0Qk|%u8Iw{#p z`;|mV>5m{u5|>Zl^(n~^g&UG3VtOu}mbBc1*C~>BK7^rE$&IyOrb&*_b(SuPdI}aY zB(;qIWJ+#O#5zmz#{u+ZOP=3>Im?k`ZUi7#^7h|ol89HJtWxqkRhe9q zOg;--m85eEB&#L5^JvvzB0*{;&wdHObxE@bl68{KP0&&=i625=gXBX>&ooNT(Mhu= z3G)%m;0;Lw6*4qS=KlaES|kfZaQ>#mP7AtQl2M9)v`QY?3XwL+cN9`@m%JB%pT9%0 zir#pglGtz2cU$t(hp^WrX_y6(Zi!+O;JuO^o$$I(vM3zPe#t5-*&L9>(nnziB_VXi zVMvl|f!Se6?g-4@l{`b$wIdQYTH4-|JV)ifqmo1PkQ!~FXw7m?S4hMB3j*N+q-?jgsD8 z1$ead0VV8Xr0HCkJt5sq4~SUl$8|6pClydsI$rt@m0l)DU;GjlPD*vppp_`iG(aRt zDxqZJDe0@Ut4o&FaxwPP(!zJaOp&gqJ#4CU-M8pVlU`qfR=V`pG{7^YZB)CJDOEfV zW|s6grMt4Fd>xoM(%DpNlq+4l1IqHGCmrELzO>8+=L@9$RLfW>eemCILORUG&sZc~ zu@b%%OTX!Zva`}Tbo-V_2e+W_g0xHzz$NLgl-j>6^%_85x%2_uD_5i$^mWdw(hV=e zY=v~{M=)!p&p!!3owSAKtX}#QeN(MLdg3@#H%h;9MqiUuTMW-`NNebkcT-x{1?Da3 zYnuRQm3q@6qfHt~*4w4=M=_KRX*t#5c1jD+q3^czmJ3Li^d7~9yQRBg0KX&k-UppM z(lkmG_ez-`1JEb^{Btn-rQbJ$IUvoQ1R0dhrESuX^u4{9)?w+b5_oo3y4DK=8=79^A0$Y|bA+LzvhBSXZLqAA z13yD#4v)i7sO*nL0EEeYr;zrnTa6*)ScHiIf#(qc2J(JB(Je z>~s3UOpI*j_i*rptc>1Ov9g~R01zj8<5?JrmxbHmXM$`t?c+|$!VkkjqO2tqE+xyf z?jWaS?T65pB3r_Q>Qvd!6u(ZBHPa8CF3Y_Rkqp@#3gu?XT7QK|mP}8dWXqQ2XJR6A zWMyxFnJW{&3}&9}=@K}RFB>|55f#XW=)`oPY>?g-XJp%V!LuTn3q`kzWpUIxD-*v4 zdnK|_KWI58i#&-|schM50Lo-PQ|bD7*#KSa7i1zzf?Sjt)R4R+J5ROlmt}W37<;*F z2R)Fk$gWYY=c;UC9I7j1f)03HDKk@G{+g`iAM{npcE$owEn7z~w;EZG9<5s0zI*7q zE{mfAz&hFfjeytVwFg{-%qtv2X_S3#hP@_PEJb*3$bJZhy=GbJmmn=N-lv#}R+*Ry zT$}8b51_1F_BQ1WJ7h5e%wVUig0?ibF_HKIx@70qLrb^p==Tu0Bg?x6c#o{=CR)9+ zP5+?PCu^b|X20y&FJNInR&fV_K^eypeM7PjS3&2ntcOmE-<1WPL~BH*p%LAaJ^CV? z7?s7-D{@Tceg-=4%lMyQnB%fJze4AP?6?(xNm<+t3~WkviK4{Qvg=a-Jdo{+fxU;a zx|?9m$bO{rIs4`FC@<?WV4ilu|{D}eyG%M+Ht`XPA-omlaZTj;5HSpMew(CH=rhW@R~Tdq8XS@MzpW&`n+ zZ+rrhe)7{tVclQ;Csjlqk$0+LAxQq`akzU_{uotj1%OPBBeBNe}pR`IDbO zGDF@)Mdz9F=y8xN`HvLt%a*6nnmtGU?QOV}E1yfdo;>+aR*-!8`}B@0kc-p+6v{`b z^yG|uD@E^$lZ(j!Ps(i{5tqS>v$3QCO$<2_wCeNc{ z(kl5~I#*sTpE(4VYUEQ?{#z^OP=Niq{FV)>>*Vz`_Ii2NT1Ym?^=S}kl&9@Qt4V&I z-W@mO?^4vES^hljc3b2-Xm5X0{x3a4Zpr;v7-p;d#Jd<#o4hy~)6*_jmtrU#@&alr4%&(rzv`*MGJ%Z$sjszD~?f79z_ zQofr~wNvt5N(xTPpZo#?dmyjMhq8zA9@A$Z^dIwOo)#nl@?#V3RV^-#80s-9DV+Zo-Q~Mph%#bGEm{g z2kwYsA^pTbio(sXcT}QSdjTuSoIe zCG-_5R#6=6oML7-43#RLXo1c$MJ?SH=M|f%VCI72>jD5SDpsupxul4uNYrJ;KhAKX zTyd4^Sgt4%(*eJ#2j`L*?SNif>5r zx?;`C@T^XewgvEdMc!X%H7G{uy8w*}4yD(c6k0J_Hx$z6p{!ZaMRCj)1!p6eHx={d zz|bwl@8{6hs%W4zb-UvJBhb>Jkh_9(DP~`R>TbmXI?ZxN@puaWJ&Ft?NUuUh0n9$d z1FB5zS3E*L>VV?+KHvrw9rFPgQp_uX6T^z2|2}N0SU4ZnM-{!aTN+c0(am*Vu|EU2 zamDybOx=W{c^uO-sYnq*WJ(b`4v}d^KSd`WD5fMZG^3c;iJxk}a$_4r9F%X-3dvEK z`~|c)DK`iKa8~~MCt5Dbd3OPDRsKo`5e_KhsM^O(x%482c~I%OA3EKYNwjkGP;UJl zxWmfC=RrJ`uh90Bs8C36tWAY~P8jE*WFQjR@X`HKu%LX-|v3m&R`lFARml~t6lq^dBo>EHafLpTiaSe2yRxY5=4W%g8)0Qn&DW&qYH02-9fTSx&Vn8yL zMymbEQoc*~U$*k6MvN~<`NR}_$yFYvSY^J_JPqpw%J7$=rBL~s9+P}VnN9h)BBgK# zB#V`gya?P`W#|TswoK_x$&B;Lc0cr8P(Jkxv|Lo)r7ZU)rD8o=mzB#8L$X{cp^}^{ z%1nwNS15fcpkJwMrGVl!<=j+gsZu&p^0`_W?+TF`ug%7IScC#l(`%*A1Ylw0dqz<> zQ?=$F0K8PEUW25!iaj4L`Kazv2EbQkN`YBF)uJF=1^%j*We^EaeXoMDKo#?6;Et&L z8lf{twdPNdqpBagU^ZGcwiO~Vsw1btj8%CJ10JWExC>^y>ZvK1O;8n=pzoyWsu0XX zRh|o!C8@U2l%G;Xj6qAX>Mx34pH?N%V=YBBPG^i#Re1um(p2xSgwAx8h$ZglCZ=D!bS zjVhxEq*nC@l?q;01q8ygI+epKAoZ%*^L&s0wW;K4NVcn(q`ZBP>dRL#=w4Mi3xGb=m-GbdR~`EjKjVPPfnpwms%w;^9a1f) zUEQ$i6AG%`RsEF+=7?%N?G5j#%x^)!W z4bn1nO0}^b%!jJ}x6ztWIa3A0es#Ya01oQzGZ>1a+Hw&VoYZ9$>vC4lp>N-~sDIl6 z;;KHe0DuGPW;%-FrarR^%!BF;l=g5}Kco*398#b75EeYt&(k~nuzKGQ=<`%Rq~*Dn zx}_I=-s(^3clS|0+6uU@dh!1t>8JLjf;E4&<^xCus6VNPNTB*t9RNqvqs?FjsRQUa zcvPKEC5FN3mP)uAqTZW}xeisoLYu-cbt=6EkExe?KqOrKi3-dJwPH7%IIcE5kI9Nu zA6x=Iqtx5S!HiaWUV-%(^?XWGpHO#DG9y-PqFqRw`V0k@;?-~M0!dKs+yI>?)h-)B z64f8B1RzPBO#ARt>TNpAOS1Z4A6lo?uhLE`MQxG;m#Qwbp)XCn=1~CB)z`j<*$nlx zKU$gUXnF`_spsB;*V$@c%JJo>dtZZ=T($KNXvtGw`4Fvqbr~H2DNuj<5R!%J5AQ(r z8Fjh_s*BWEZ{Z$OucU3~IrY~R3_q{_^BgQ(P%9{rb5Xs9-kX=yLEpmOW%Xn9$*Xd8 zBvmM0QODA`x~uAt$3ZI8BbQ;JQtdASxu$;qbr`Br4?Y51wYt3o%o_Ek`Iy#P^**Y? zzphS-2Ch#1CZ#Cq)x9g=M1#6!2Zq_GzU&Jpn$-U+g%dZ_Z~O@@&FY5~Qg2an%Rp|b zH^pHLx71%ffP<~-${J{CQ@^$dt#);IGqiN5|MY;NPW9*8!Mv^BqJ8xy47`k z5V@n?NO_AM^&F}~>{WmJ0IK`cZ&8w`U!CxR{%bQ|7P zueuMwi24zV_uNybQOU}vdUhH_#_&5}L=)M#-TE>U9f2 z9;yqJU^-~#t$SvX)Y$9M=dPJUhkXud z&NrgZQWsv4is%t)~DLV{h!J6lOf=Gy_fhtTxHQOk!7N#lkhU77gO^*o)*A&weGeXlR zf%C^THFUx^Qlq4sD@v1D4b{<_SA<~3Xp*Ro<%Guh1W2srIECNhG?yIUQoLr)D*VI= znzyK=@uWsL2xW@5SiqIrXfiM*=urKLlKX7wUCQK{KR z_xm+XH`TkU`!t!fUG3NW{Wr`GXx>hMy+O@i z)4&aBcu!y`!fG<*OZg1tNahH_Y(GU%QbuVgcG? zr_mRvT~G1rBiiq15ge=?pMqy0+FeT_8LAzn-EO!x|2q02v}GTG9M^WxlP_B9+Xayr z?NSQVozUig1!k;v9tCsawDage7O!=qtx2Lbg^e*JY2T)h`YEmFVtAdbeVKNZ20y3xj=Li-o_S*cB;a_Vc^_Ya}3O8f9ANVWFO1?a2MHYTI5PP=XxfO_p?^fqkJ z7OaM{Ms0%vq)9vSC;&IKvndMDtgSVJ*`iG+mu_lj&A|_FOMCb|v|6>b$1$Qd?S3`J z*RBne0??s7aRjP6wL!G7zODV;AEZlrn$jiR+DB>Ic}F{b7R(;)0a`NlYNfu=(x

    k%qi{D4VEkR#7Q^n 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­xSmUVTzF$tZexZ-8xKp-34{Sl_Rbq8KLa3 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

    Q=tsNZIC3k1qbL77!wJY}7gO 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 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.list b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.list new file mode 100644 index 0000000..dfc2e1a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.list @@ -0,0 +1,8005 @@ + +FreeRTOS_LED.elf: file format elf32-littlearm + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .isr_vector 000001c4 08000000 08000000 00010000 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 1 .text 00002e1c 080001d0 080001d0 000101d0 2**4 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .rodata 00000068 08002fec 08002fec 00012fec 2**2 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .ARM.extab 00000000 08003054 08003054 00020010 2**0 + CONTENTS + 4 .ARM 00000008 08003054 08003054 00013054 2**2 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 5 .preinit_array 00000000 0800305c 0800305c 00020010 2**0 + CONTENTS, ALLOC, LOAD, DATA + 6 .init_array 00000004 0800305c 0800305c 0001305c 2**2 + CONTENTS, ALLOC, LOAD, DATA + 7 .fini_array 00000004 08003060 08003060 00013060 2**2 + CONTENTS, ALLOC, LOAD, DATA + 8 .data 00000010 20000000 08003064 00020000 2**2 + CONTENTS, ALLOC, LOAD, DATA + 9 .bss 00003fd0 20000010 08003074 00020010 2**2 + ALLOC + 10 ._user_heap_stack 00000600 20003fe0 08003074 00023fe0 2**0 + ALLOC + 11 .ARM.attributes 00000030 00000000 00000000 00020010 2**0 + CONTENTS, READONLY + 12 .debug_info 00009aed 00000000 00000000 00020040 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 13 .debug_abbrev 00001e9d 00000000 00000000 00029b2d 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 14 .debug_aranges 00000948 00000000 00000000 0002b9d0 2**3 + CONTENTS, READONLY, DEBUGGING, OCTETS + 15 .debug_ranges 00000850 00000000 00000000 0002c318 2**3 + CONTENTS, READONLY, DEBUGGING, OCTETS + 16 .debug_macro 00021a4e 00000000 00000000 0002cb68 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 17 .debug_line 0000ab30 00000000 00000000 0004e5b6 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 18 .debug_str 000cf5d0 00000000 00000000 000590e6 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 19 .comment 00000050 00000000 00000000 001286b6 2**0 + CONTENTS, READONLY + 20 .debug_frame 000023d4 00000000 00000000 00128708 2**2 + CONTENTS, READONLY, DEBUGGING, OCTETS + +Disassembly of section .text: + +080001d0 <__do_global_dtors_aux>: + 80001d0: b510 push {r4, lr} + 80001d2: 4c05 ldr r4, [pc, #20] ; (80001e8 <__do_global_dtors_aux+0x18>) + 80001d4: 7823 ldrb r3, [r4, #0] + 80001d6: b933 cbnz r3, 80001e6 <__do_global_dtors_aux+0x16> + 80001d8: 4b04 ldr r3, [pc, #16] ; (80001ec <__do_global_dtors_aux+0x1c>) + 80001da: b113 cbz r3, 80001e2 <__do_global_dtors_aux+0x12> + 80001dc: 4804 ldr r0, [pc, #16] ; (80001f0 <__do_global_dtors_aux+0x20>) + 80001de: f3af 8000 nop.w + 80001e2: 2301 movs r3, #1 + 80001e4: 7023 strb r3, [r4, #0] + 80001e6: bd10 pop {r4, pc} + 80001e8: 20000010 .word 0x20000010 + 80001ec: 00000000 .word 0x00000000 + 80001f0: 08002fd4 .word 0x08002fd4 + +080001f4 : + 80001f4: b508 push {r3, lr} + 80001f6: 4b03 ldr r3, [pc, #12] ; (8000204 ) + 80001f8: b11b cbz r3, 8000202 + 80001fa: 4903 ldr r1, [pc, #12] ; (8000208 ) + 80001fc: 4803 ldr r0, [pc, #12] ; (800020c ) + 80001fe: f3af 8000 nop.w + 8000202: bd08 pop {r3, pc} + 8000204: 00000000 .word 0x00000000 + 8000208: 20000014 .word 0x20000014 + 800020c: 08002fd4 .word 0x08002fd4 + +08000210 <__aeabi_uldivmod>: + 8000210: b953 cbnz r3, 8000228 <__aeabi_uldivmod+0x18> + 8000212: b94a cbnz r2, 8000228 <__aeabi_uldivmod+0x18> + 8000214: 2900 cmp r1, #0 + 8000216: bf08 it eq + 8000218: 2800 cmpeq r0, #0 + 800021a: bf1c itt ne + 800021c: f04f 31ff movne.w r1, #4294967295 + 8000220: f04f 30ff movne.w r0, #4294967295 + 8000224: f000 b974 b.w 8000510 <__aeabi_idiv0> + 8000228: f1ad 0c08 sub.w ip, sp, #8 + 800022c: e96d ce04 strd ip, lr, [sp, #-16]! + 8000230: f000 f806 bl 8000240 <__udivmoddi4> + 8000234: f8dd e004 ldr.w lr, [sp, #4] + 8000238: e9dd 2302 ldrd r2, r3, [sp, #8] + 800023c: b004 add sp, #16 + 800023e: 4770 bx lr + +08000240 <__udivmoddi4>: + 8000240: e92d 47f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} + 8000244: 9d08 ldr r5, [sp, #32] + 8000246: 4604 mov r4, r0 + 8000248: 468e mov lr, r1 + 800024a: 2b00 cmp r3, #0 + 800024c: d14d bne.n 80002ea <__udivmoddi4+0xaa> + 800024e: 428a cmp r2, r1 + 8000250: 4694 mov ip, r2 + 8000252: d969 bls.n 8000328 <__udivmoddi4+0xe8> + 8000254: fab2 f282 clz r2, r2 + 8000258: b152 cbz r2, 8000270 <__udivmoddi4+0x30> + 800025a: fa01 f302 lsl.w r3, r1, r2 + 800025e: f1c2 0120 rsb r1, r2, #32 + 8000262: fa20 f101 lsr.w r1, r0, r1 + 8000266: fa0c fc02 lsl.w ip, ip, r2 + 800026a: ea41 0e03 orr.w lr, r1, r3 + 800026e: 4094 lsls r4, r2 + 8000270: ea4f 481c mov.w r8, ip, lsr #16 + 8000274: 0c21 lsrs r1, r4, #16 + 8000276: fbbe f6f8 udiv r6, lr, r8 + 800027a: fa1f f78c uxth.w r7, ip + 800027e: fb08 e316 mls r3, r8, r6, lr + 8000282: ea41 4303 orr.w r3, r1, r3, lsl #16 + 8000286: fb06 f107 mul.w r1, r6, r7 + 800028a: 4299 cmp r1, r3 + 800028c: d90a bls.n 80002a4 <__udivmoddi4+0x64> + 800028e: eb1c 0303 adds.w r3, ip, r3 + 8000292: f106 30ff add.w r0, r6, #4294967295 + 8000296: f080 811f bcs.w 80004d8 <__udivmoddi4+0x298> + 800029a: 4299 cmp r1, r3 + 800029c: f240 811c bls.w 80004d8 <__udivmoddi4+0x298> + 80002a0: 3e02 subs r6, #2 + 80002a2: 4463 add r3, ip + 80002a4: 1a5b subs r3, r3, r1 + 80002a6: b2a4 uxth r4, r4 + 80002a8: fbb3 f0f8 udiv r0, r3, r8 + 80002ac: fb08 3310 mls r3, r8, r0, r3 + 80002b0: ea44 4403 orr.w r4, r4, r3, lsl #16 + 80002b4: fb00 f707 mul.w r7, r0, r7 + 80002b8: 42a7 cmp r7, r4 + 80002ba: d90a bls.n 80002d2 <__udivmoddi4+0x92> + 80002bc: eb1c 0404 adds.w r4, ip, r4 + 80002c0: f100 33ff add.w r3, r0, #4294967295 + 80002c4: f080 810a bcs.w 80004dc <__udivmoddi4+0x29c> + 80002c8: 42a7 cmp r7, r4 + 80002ca: f240 8107 bls.w 80004dc <__udivmoddi4+0x29c> + 80002ce: 4464 add r4, ip + 80002d0: 3802 subs r0, #2 + 80002d2: ea40 4006 orr.w r0, r0, r6, lsl #16 + 80002d6: 1be4 subs r4, r4, r7 + 80002d8: 2600 movs r6, #0 + 80002da: b11d cbz r5, 80002e4 <__udivmoddi4+0xa4> + 80002dc: 40d4 lsrs r4, r2 + 80002de: 2300 movs r3, #0 + 80002e0: e9c5 4300 strd r4, r3, [r5] + 80002e4: 4631 mov r1, r6 + 80002e6: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} + 80002ea: 428b cmp r3, r1 + 80002ec: d909 bls.n 8000302 <__udivmoddi4+0xc2> + 80002ee: 2d00 cmp r5, #0 + 80002f0: f000 80ef beq.w 80004d2 <__udivmoddi4+0x292> + 80002f4: 2600 movs r6, #0 + 80002f6: e9c5 0100 strd r0, r1, [r5] + 80002fa: 4630 mov r0, r6 + 80002fc: 4631 mov r1, r6 + 80002fe: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} + 8000302: fab3 f683 clz r6, r3 + 8000306: 2e00 cmp r6, #0 + 8000308: d14a bne.n 80003a0 <__udivmoddi4+0x160> + 800030a: 428b cmp r3, r1 + 800030c: d302 bcc.n 8000314 <__udivmoddi4+0xd4> + 800030e: 4282 cmp r2, r0 + 8000310: f200 80f9 bhi.w 8000506 <__udivmoddi4+0x2c6> + 8000314: 1a84 subs r4, r0, r2 + 8000316: eb61 0303 sbc.w r3, r1, r3 + 800031a: 2001 movs r0, #1 + 800031c: 469e mov lr, r3 + 800031e: 2d00 cmp r5, #0 + 8000320: d0e0 beq.n 80002e4 <__udivmoddi4+0xa4> + 8000322: e9c5 4e00 strd r4, lr, [r5] + 8000326: e7dd b.n 80002e4 <__udivmoddi4+0xa4> + 8000328: b902 cbnz r2, 800032c <__udivmoddi4+0xec> + 800032a: deff udf #255 ; 0xff + 800032c: fab2 f282 clz r2, r2 + 8000330: 2a00 cmp r2, #0 + 8000332: f040 8092 bne.w 800045a <__udivmoddi4+0x21a> + 8000336: eba1 010c sub.w r1, r1, ip + 800033a: ea4f 471c mov.w r7, ip, lsr #16 + 800033e: fa1f fe8c uxth.w lr, ip + 8000342: 2601 movs r6, #1 + 8000344: 0c20 lsrs r0, r4, #16 + 8000346: fbb1 f3f7 udiv r3, r1, r7 + 800034a: fb07 1113 mls r1, r7, r3, r1 + 800034e: ea40 4101 orr.w r1, r0, r1, lsl #16 + 8000352: fb0e f003 mul.w r0, lr, r3 + 8000356: 4288 cmp r0, r1 + 8000358: d908 bls.n 800036c <__udivmoddi4+0x12c> + 800035a: eb1c 0101 adds.w r1, ip, r1 + 800035e: f103 38ff add.w r8, r3, #4294967295 + 8000362: d202 bcs.n 800036a <__udivmoddi4+0x12a> + 8000364: 4288 cmp r0, r1 + 8000366: f200 80cb bhi.w 8000500 <__udivmoddi4+0x2c0> + 800036a: 4643 mov r3, r8 + 800036c: 1a09 subs r1, r1, r0 + 800036e: b2a4 uxth r4, r4 + 8000370: fbb1 f0f7 udiv r0, r1, r7 + 8000374: fb07 1110 mls r1, r7, r0, r1 + 8000378: ea44 4401 orr.w r4, r4, r1, lsl #16 + 800037c: fb0e fe00 mul.w lr, lr, r0 + 8000380: 45a6 cmp lr, r4 + 8000382: d908 bls.n 8000396 <__udivmoddi4+0x156> + 8000384: eb1c 0404 adds.w r4, ip, r4 + 8000388: f100 31ff add.w r1, r0, #4294967295 + 800038c: d202 bcs.n 8000394 <__udivmoddi4+0x154> + 800038e: 45a6 cmp lr, r4 + 8000390: f200 80bb bhi.w 800050a <__udivmoddi4+0x2ca> + 8000394: 4608 mov r0, r1 + 8000396: eba4 040e sub.w r4, r4, lr + 800039a: ea40 4003 orr.w r0, r0, r3, lsl #16 + 800039e: e79c b.n 80002da <__udivmoddi4+0x9a> + 80003a0: f1c6 0720 rsb r7, r6, #32 + 80003a4: 40b3 lsls r3, r6 + 80003a6: fa22 fc07 lsr.w ip, r2, r7 + 80003aa: ea4c 0c03 orr.w ip, ip, r3 + 80003ae: fa20 f407 lsr.w r4, r0, r7 + 80003b2: fa01 f306 lsl.w r3, r1, r6 + 80003b6: 431c orrs r4, r3 + 80003b8: 40f9 lsrs r1, r7 + 80003ba: ea4f 491c mov.w r9, ip, lsr #16 + 80003be: fa00 f306 lsl.w r3, r0, r6 + 80003c2: fbb1 f8f9 udiv r8, r1, r9 + 80003c6: 0c20 lsrs r0, r4, #16 + 80003c8: fa1f fe8c uxth.w lr, ip + 80003cc: fb09 1118 mls r1, r9, r8, r1 + 80003d0: ea40 4101 orr.w r1, r0, r1, lsl #16 + 80003d4: fb08 f00e mul.w r0, r8, lr + 80003d8: 4288 cmp r0, r1 + 80003da: fa02 f206 lsl.w r2, r2, r6 + 80003de: d90b bls.n 80003f8 <__udivmoddi4+0x1b8> + 80003e0: eb1c 0101 adds.w r1, ip, r1 + 80003e4: f108 3aff add.w sl, r8, #4294967295 + 80003e8: f080 8088 bcs.w 80004fc <__udivmoddi4+0x2bc> + 80003ec: 4288 cmp r0, r1 + 80003ee: f240 8085 bls.w 80004fc <__udivmoddi4+0x2bc> + 80003f2: f1a8 0802 sub.w r8, r8, #2 + 80003f6: 4461 add r1, ip + 80003f8: 1a09 subs r1, r1, r0 + 80003fa: b2a4 uxth r4, r4 + 80003fc: fbb1 f0f9 udiv r0, r1, r9 + 8000400: fb09 1110 mls r1, r9, r0, r1 + 8000404: ea44 4101 orr.w r1, r4, r1, lsl #16 + 8000408: fb00 fe0e mul.w lr, r0, lr + 800040c: 458e cmp lr, r1 + 800040e: d908 bls.n 8000422 <__udivmoddi4+0x1e2> + 8000410: eb1c 0101 adds.w r1, ip, r1 + 8000414: f100 34ff add.w r4, r0, #4294967295 + 8000418: d26c bcs.n 80004f4 <__udivmoddi4+0x2b4> + 800041a: 458e cmp lr, r1 + 800041c: d96a bls.n 80004f4 <__udivmoddi4+0x2b4> + 800041e: 3802 subs r0, #2 + 8000420: 4461 add r1, ip + 8000422: ea40 4008 orr.w r0, r0, r8, lsl #16 + 8000426: fba0 9402 umull r9, r4, r0, r2 + 800042a: eba1 010e sub.w r1, r1, lr + 800042e: 42a1 cmp r1, r4 + 8000430: 46c8 mov r8, r9 + 8000432: 46a6 mov lr, r4 + 8000434: d356 bcc.n 80004e4 <__udivmoddi4+0x2a4> + 8000436: d053 beq.n 80004e0 <__udivmoddi4+0x2a0> + 8000438: b15d cbz r5, 8000452 <__udivmoddi4+0x212> + 800043a: ebb3 0208 subs.w r2, r3, r8 + 800043e: eb61 010e sbc.w r1, r1, lr + 8000442: fa01 f707 lsl.w r7, r1, r7 + 8000446: fa22 f306 lsr.w r3, r2, r6 + 800044a: 40f1 lsrs r1, r6 + 800044c: 431f orrs r7, r3 + 800044e: e9c5 7100 strd r7, r1, [r5] + 8000452: 2600 movs r6, #0 + 8000454: 4631 mov r1, r6 + 8000456: e8bd 87f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, pc} + 800045a: f1c2 0320 rsb r3, r2, #32 + 800045e: 40d8 lsrs r0, r3 + 8000460: fa0c fc02 lsl.w ip, ip, r2 + 8000464: fa21 f303 lsr.w r3, r1, r3 + 8000468: 4091 lsls r1, r2 + 800046a: 4301 orrs r1, r0 + 800046c: ea4f 471c mov.w r7, ip, lsr #16 + 8000470: fa1f fe8c uxth.w lr, ip + 8000474: fbb3 f0f7 udiv r0, r3, r7 + 8000478: fb07 3610 mls r6, r7, r0, r3 + 800047c: 0c0b lsrs r3, r1, #16 + 800047e: ea43 4306 orr.w r3, r3, r6, lsl #16 + 8000482: fb00 f60e mul.w r6, r0, lr + 8000486: 429e cmp r6, r3 + 8000488: fa04 f402 lsl.w r4, r4, r2 + 800048c: d908 bls.n 80004a0 <__udivmoddi4+0x260> + 800048e: eb1c 0303 adds.w r3, ip, r3 + 8000492: f100 38ff add.w r8, r0, #4294967295 + 8000496: d22f bcs.n 80004f8 <__udivmoddi4+0x2b8> + 8000498: 429e cmp r6, r3 + 800049a: d92d bls.n 80004f8 <__udivmoddi4+0x2b8> + 800049c: 3802 subs r0, #2 + 800049e: 4463 add r3, ip + 80004a0: 1b9b subs r3, r3, r6 + 80004a2: b289 uxth r1, r1 + 80004a4: fbb3 f6f7 udiv r6, r3, r7 + 80004a8: fb07 3316 mls r3, r7, r6, r3 + 80004ac: ea41 4103 orr.w r1, r1, r3, lsl #16 + 80004b0: fb06 f30e mul.w r3, r6, lr + 80004b4: 428b cmp r3, r1 + 80004b6: d908 bls.n 80004ca <__udivmoddi4+0x28a> + 80004b8: eb1c 0101 adds.w r1, ip, r1 + 80004bc: f106 38ff add.w r8, r6, #4294967295 + 80004c0: d216 bcs.n 80004f0 <__udivmoddi4+0x2b0> + 80004c2: 428b cmp r3, r1 + 80004c4: d914 bls.n 80004f0 <__udivmoddi4+0x2b0> + 80004c6: 3e02 subs r6, #2 + 80004c8: 4461 add r1, ip + 80004ca: 1ac9 subs r1, r1, r3 + 80004cc: ea46 4600 orr.w r6, r6, r0, lsl #16 + 80004d0: e738 b.n 8000344 <__udivmoddi4+0x104> + 80004d2: 462e mov r6, r5 + 80004d4: 4628 mov r0, r5 + 80004d6: e705 b.n 80002e4 <__udivmoddi4+0xa4> + 80004d8: 4606 mov r6, r0 + 80004da: e6e3 b.n 80002a4 <__udivmoddi4+0x64> + 80004dc: 4618 mov r0, r3 + 80004de: e6f8 b.n 80002d2 <__udivmoddi4+0x92> + 80004e0: 454b cmp r3, r9 + 80004e2: d2a9 bcs.n 8000438 <__udivmoddi4+0x1f8> + 80004e4: ebb9 0802 subs.w r8, r9, r2 + 80004e8: eb64 0e0c sbc.w lr, r4, ip + 80004ec: 3801 subs r0, #1 + 80004ee: e7a3 b.n 8000438 <__udivmoddi4+0x1f8> + 80004f0: 4646 mov r6, r8 + 80004f2: e7ea b.n 80004ca <__udivmoddi4+0x28a> + 80004f4: 4620 mov r0, r4 + 80004f6: e794 b.n 8000422 <__udivmoddi4+0x1e2> + 80004f8: 4640 mov r0, r8 + 80004fa: e7d1 b.n 80004a0 <__udivmoddi4+0x260> + 80004fc: 46d0 mov r8, sl + 80004fe: e77b b.n 80003f8 <__udivmoddi4+0x1b8> + 8000500: 3b02 subs r3, #2 + 8000502: 4461 add r1, ip + 8000504: e732 b.n 800036c <__udivmoddi4+0x12c> + 8000506: 4630 mov r0, r6 + 8000508: e709 b.n 800031e <__udivmoddi4+0xde> + 800050a: 4464 add r4, ip + 800050c: 3802 subs r0, #2 + 800050e: e742 b.n 8000396 <__udivmoddi4+0x156> + +08000510 <__aeabi_idiv0>: + 8000510: 4770 bx lr + 8000512: bf00 nop + +08000514 : +/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ +static StaticTask_t xIdleTaskTCBBuffer; +static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; + +void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) +{ + 8000514: b480 push {r7} + 8000516: b085 sub sp, #20 + 8000518: af00 add r7, sp, #0 + 800051a: 60f8 str r0, [r7, #12] + 800051c: 60b9 str r1, [r7, #8] + 800051e: 607a str r2, [r7, #4] + *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; + 8000520: 68fb ldr r3, [r7, #12] + 8000522: 4a07 ldr r2, [pc, #28] ; (8000540 ) + 8000524: 601a str r2, [r3, #0] + *ppxIdleTaskStackBuffer = &xIdleStack[0]; + 8000526: 68bb ldr r3, [r7, #8] + 8000528: 4a06 ldr r2, [pc, #24] ; (8000544 ) + 800052a: 601a str r2, [r3, #0] + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; + 800052c: 687b ldr r3, [r7, #4] + 800052e: 2280 movs r2, #128 ; 0x80 + 8000530: 601a str r2, [r3, #0] + /* place for user code */ +} + 8000532: bf00 nop + 8000534: 3714 adds r7, #20 + 8000536: 46bd mov sp, r7 + 8000538: f85d 7b04 ldr.w r7, [sp], #4 + 800053c: 4770 bx lr + 800053e: bf00 nop + 8000540: 2000002c .word 0x2000002c + 8000544: 20000080 .word 0x20000080 + +08000548

    : +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + 8000548: b5b0 push {r4, r5, r7, lr} + 800054a: b08e sub sp, #56 ; 0x38 + 800054c: af00 add r7, sp, #0 + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + 800054e: f000 f9c9 bl 80008e4 + /* Configure the system clock */ + SystemClock_Config(); + 8000552: f000 f831 bl 80005b8 + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + 8000556: f000 f89d bl 8000694 + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + 800055a: 4b13 ldr r3, [pc, #76] ; (80005a8 ) + 800055c: f107 041c add.w r4, r7, #28 + 8000560: 461d mov r5, r3 + 8000562: cd0f ldmia r5!, {r0, r1, r2, r3} + 8000564: c40f stmia r4!, {r0, r1, r2, r3} + 8000566: e895 0007 ldmia.w r5, {r0, r1, r2} + 800056a: e884 0007 stmia.w r4, {r0, r1, r2} + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + 800056e: f107 031c add.w r3, r7, #28 + 8000572: 2100 movs r1, #0 + 8000574: 4618 mov r0, r3 + 8000576: f001 fab2 bl 8001ade + 800057a: 4603 mov r3, r0 + 800057c: 4a0b ldr r2, [pc, #44] ; (80005ac ) + 800057e: 6013 str r3, [r2, #0] + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + 8000580: 4b0b ldr r3, [pc, #44] ; (80005b0 ) + 8000582: 463c mov r4, r7 + 8000584: 461d mov r5, r3 + 8000586: cd0f ldmia r5!, {r0, r1, r2, r3} + 8000588: c40f stmia r4!, {r0, r1, r2, r3} + 800058a: e895 0007 ldmia.w r5, {r0, r1, r2} + 800058e: e884 0007 stmia.w r4, {r0, r1, r2} + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + 8000592: 463b mov r3, r7 + 8000594: 2100 movs r1, #0 + 8000596: 4618 mov r0, r3 + 8000598: f001 faa1 bl 8001ade + 800059c: 4603 mov r3, r0 + 800059e: 4a05 ldr r2, [pc, #20] ; (80005b4 ) + 80005a0: 6013 str r3, [r2, #0] + + /* Start scheduler */ + osKernelStart(); + 80005a2: f001 fa95 bl 8001ad0 + + /* We should never get here as control is now taken by the scheduler */ + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + 80005a6: e7fe b.n 80005a6 + 80005a8: 08003004 .word 0x08003004 + 80005ac: 20000280 .word 0x20000280 + 80005b0: 08003020 .word 0x08003020 + 80005b4: 20000284 .word 0x20000284 + +080005b8 : +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + 80005b8: b580 push {r7, lr} + 80005ba: b094 sub sp, #80 ; 0x50 + 80005bc: af00 add r7, sp, #0 + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + 80005be: f107 031c add.w r3, r7, #28 + 80005c2: 2234 movs r2, #52 ; 0x34 + 80005c4: 2100 movs r1, #0 + 80005c6: 4618 mov r0, r3 + 80005c8: f002 fcfc bl 8002fc4 + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + 80005cc: f107 0308 add.w r3, r7, #8 + 80005d0: 2200 movs r2, #0 + 80005d2: 601a str r2, [r3, #0] + 80005d4: 605a str r2, [r3, #4] + 80005d6: 609a str r2, [r3, #8] + 80005d8: 60da str r2, [r3, #12] + 80005da: 611a str r2, [r3, #16] + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + 80005dc: 2300 movs r3, #0 + 80005de: 607b str r3, [r7, #4] + 80005e0: 4b2a ldr r3, [pc, #168] ; (800068c ) + 80005e2: 6c1b ldr r3, [r3, #64] ; 0x40 + 80005e4: 4a29 ldr r2, [pc, #164] ; (800068c ) + 80005e6: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 + 80005ea: 6413 str r3, [r2, #64] ; 0x40 + 80005ec: 4b27 ldr r3, [pc, #156] ; (800068c ) + 80005ee: 6c1b ldr r3, [r3, #64] ; 0x40 + 80005f0: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 80005f4: 607b str r3, [r7, #4] + 80005f6: 687b ldr r3, [r7, #4] + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); + 80005f8: 2300 movs r3, #0 + 80005fa: 603b str r3, [r7, #0] + 80005fc: 4b24 ldr r3, [pc, #144] ; (8000690 ) + 80005fe: 681b ldr r3, [r3, #0] + 8000600: f423 4340 bic.w r3, r3, #49152 ; 0xc000 + 8000604: 4a22 ldr r2, [pc, #136] ; (8000690 ) + 8000606: f443 4380 orr.w r3, r3, #16384 ; 0x4000 + 800060a: 6013 str r3, [r2, #0] + 800060c: 4b20 ldr r3, [pc, #128] ; (8000690 ) + 800060e: 681b ldr r3, [r3, #0] + 8000610: f403 4340 and.w r3, r3, #49152 ; 0xc000 + 8000614: 603b str r3, [r7, #0] + 8000616: 683b ldr r3, [r7, #0] + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + 8000618: 2302 movs r3, #2 + 800061a: 61fb str r3, [r7, #28] + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + 800061c: 2301 movs r3, #1 + 800061e: 62bb str r3, [r7, #40] ; 0x28 + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + 8000620: 2310 movs r3, #16 + 8000622: 62fb str r3, [r7, #44] ; 0x2c + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + 8000624: 2302 movs r3, #2 + 8000626: 637b str r3, [r7, #52] ; 0x34 + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + 8000628: 2300 movs r3, #0 + 800062a: 63bb str r3, [r7, #56] ; 0x38 + RCC_OscInitStruct.PLL.PLLM = 16; + 800062c: 2310 movs r3, #16 + 800062e: 63fb str r3, [r7, #60] ; 0x3c + RCC_OscInitStruct.PLL.PLLN = 336; + 8000630: f44f 73a8 mov.w r3, #336 ; 0x150 + 8000634: 643b str r3, [r7, #64] ; 0x40 + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + 8000636: 2304 movs r3, #4 + 8000638: 647b str r3, [r7, #68] ; 0x44 + RCC_OscInitStruct.PLL.PLLQ = 2; + 800063a: 2302 movs r3, #2 + 800063c: 64bb str r3, [r7, #72] ; 0x48 + RCC_OscInitStruct.PLL.PLLR = 2; + 800063e: 2302 movs r3, #2 + 8000640: 64fb str r3, [r7, #76] ; 0x4c + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + 8000642: f107 031c add.w r3, r7, #28 + 8000646: 4618 mov r0, r3 + 8000648: f000 ff8c bl 8001564 + 800064c: 4603 mov r3, r0 + 800064e: 2b00 cmp r3, #0 + 8000650: d001 beq.n 8000656 + { + Error_Handler(); + 8000652: f000 f8b5 bl 80007c0 + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + 8000656: 230f movs r3, #15 + 8000658: 60bb str r3, [r7, #8] + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + 800065a: 2302 movs r3, #2 + 800065c: 60fb str r3, [r7, #12] + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + 800065e: 2300 movs r3, #0 + 8000660: 613b str r3, [r7, #16] + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + 8000662: f44f 5380 mov.w r3, #4096 ; 0x1000 + 8000666: 617b str r3, [r7, #20] + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + 8000668: 2300 movs r3, #0 + 800066a: 61bb str r3, [r7, #24] + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + 800066c: f107 0308 add.w r3, r7, #8 + 8000670: 2102 movs r1, #2 + 8000672: 4618 mov r0, r3 + 8000674: f000 fc60 bl 8000f38 + 8000678: 4603 mov r3, r0 + 800067a: 2b00 cmp r3, #0 + 800067c: d001 beq.n 8000682 + { + Error_Handler(); + 800067e: f000 f89f bl 80007c0 + } +} + 8000682: bf00 nop + 8000684: 3750 adds r7, #80 ; 0x50 + 8000686: 46bd mov sp, r7 + 8000688: bd80 pop {r7, pc} + 800068a: bf00 nop + 800068c: 40023800 .word 0x40023800 + 8000690: 40007000 .word 0x40007000 + +08000694 : + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + 8000694: b580 push {r7, lr} + 8000696: b08a sub sp, #40 ; 0x28 + 8000698: af00 add r7, sp, #0 + GPIO_InitTypeDef GPIO_InitStruct = {0}; + 800069a: f107 0314 add.w r3, r7, #20 + 800069e: 2200 movs r2, #0 + 80006a0: 601a str r2, [r3, #0] + 80006a2: 605a str r2, [r3, #4] + 80006a4: 609a str r2, [r3, #8] + 80006a6: 60da str r2, [r3, #12] + 80006a8: 611a str r2, [r3, #16] + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + 80006aa: 2300 movs r3, #0 + 80006ac: 613b str r3, [r7, #16] + 80006ae: 4b2d ldr r3, [pc, #180] ; (8000764 ) + 80006b0: 6b1b ldr r3, [r3, #48] ; 0x30 + 80006b2: 4a2c ldr r2, [pc, #176] ; (8000764 ) + 80006b4: f043 0304 orr.w r3, r3, #4 + 80006b8: 6313 str r3, [r2, #48] ; 0x30 + 80006ba: 4b2a ldr r3, [pc, #168] ; (8000764 ) + 80006bc: 6b1b ldr r3, [r3, #48] ; 0x30 + 80006be: f003 0304 and.w r3, r3, #4 + 80006c2: 613b str r3, [r7, #16] + 80006c4: 693b ldr r3, [r7, #16] + __HAL_RCC_GPIOH_CLK_ENABLE(); + 80006c6: 2300 movs r3, #0 + 80006c8: 60fb str r3, [r7, #12] + 80006ca: 4b26 ldr r3, [pc, #152] ; (8000764 ) + 80006cc: 6b1b ldr r3, [r3, #48] ; 0x30 + 80006ce: 4a25 ldr r2, [pc, #148] ; (8000764 ) + 80006d0: f043 0380 orr.w r3, r3, #128 ; 0x80 + 80006d4: 6313 str r3, [r2, #48] ; 0x30 + 80006d6: 4b23 ldr r3, [pc, #140] ; (8000764 ) + 80006d8: 6b1b ldr r3, [r3, #48] ; 0x30 + 80006da: f003 0380 and.w r3, r3, #128 ; 0x80 + 80006de: 60fb str r3, [r7, #12] + 80006e0: 68fb ldr r3, [r7, #12] + __HAL_RCC_GPIOA_CLK_ENABLE(); + 80006e2: 2300 movs r3, #0 + 80006e4: 60bb str r3, [r7, #8] + 80006e6: 4b1f ldr r3, [pc, #124] ; (8000764 ) + 80006e8: 6b1b ldr r3, [r3, #48] ; 0x30 + 80006ea: 4a1e ldr r2, [pc, #120] ; (8000764 ) + 80006ec: f043 0301 orr.w r3, r3, #1 + 80006f0: 6313 str r3, [r2, #48] ; 0x30 + 80006f2: 4b1c ldr r3, [pc, #112] ; (8000764 ) + 80006f4: 6b1b ldr r3, [r3, #48] ; 0x30 + 80006f6: f003 0301 and.w r3, r3, #1 + 80006fa: 60bb str r3, [r7, #8] + 80006fc: 68bb ldr r3, [r7, #8] + __HAL_RCC_GPIOB_CLK_ENABLE(); + 80006fe: 2300 movs r3, #0 + 8000700: 607b str r3, [r7, #4] + 8000702: 4b18 ldr r3, [pc, #96] ; (8000764 ) + 8000704: 6b1b ldr r3, [r3, #48] ; 0x30 + 8000706: 4a17 ldr r2, [pc, #92] ; (8000764 ) + 8000708: f043 0302 orr.w r3, r3, #2 + 800070c: 6313 str r3, [r2, #48] ; 0x30 + 800070e: 4b15 ldr r3, [pc, #84] ; (8000764 ) + 8000710: 6b1b ldr r3, [r3, #48] ; 0x30 + 8000712: f003 0302 and.w r3, r3, #2 + 8000716: 607b str r3, [r7, #4] + 8000718: 687b ldr r3, [r7, #4] + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + 800071a: 2200 movs r2, #0 + 800071c: 2120 movs r1, #32 + 800071e: 4812 ldr r0, [pc, #72] ; (8000768 ) + 8000720: f000 fbf0 bl 8000f04 + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + 8000724: f44f 5300 mov.w r3, #8192 ; 0x2000 + 8000728: 617b str r3, [r7, #20] + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + 800072a: f44f 1304 mov.w r3, #2162688 ; 0x210000 + 800072e: 61bb str r3, [r7, #24] + GPIO_InitStruct.Pull = GPIO_NOPULL; + 8000730: 2300 movs r3, #0 + 8000732: 61fb str r3, [r7, #28] + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + 8000734: f107 0314 add.w r3, r7, #20 + 8000738: 4619 mov r1, r3 + 800073a: 480c ldr r0, [pc, #48] ; (800076c ) + 800073c: f000 fa4e bl 8000bdc + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + 8000740: 2320 movs r3, #32 + 8000742: 617b str r3, [r7, #20] + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + 8000744: 2301 movs r3, #1 + 8000746: 61bb str r3, [r7, #24] + GPIO_InitStruct.Pull = GPIO_NOPULL; + 8000748: 2300 movs r3, #0 + 800074a: 61fb str r3, [r7, #28] + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + 800074c: 2300 movs r3, #0 + 800074e: 623b str r3, [r7, #32] + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + 8000750: f107 0314 add.w r3, r7, #20 + 8000754: 4619 mov r1, r3 + 8000756: 4804 ldr r0, [pc, #16] ; (8000768 ) + 8000758: f000 fa40 bl 8000bdc + +} + 800075c: bf00 nop + 800075e: 3728 adds r7, #40 ; 0x28 + 8000760: 46bd mov sp, r7 + 8000762: bd80 pop {r7, pc} + 8000764: 40023800 .word 0x40023800 + 8000768: 40020000 .word 0x40020000 + 800076c: 40020800 .word 0x40020800 + +08000770 : + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void const * argument) +{ + 8000770: b580 push {r7, lr} + 8000772: b082 sub sp, #8 + 8000774: af00 add r7, sp, #0 + 8000776: 6078 str r0, [r7, #4] + /* USER CODE BEGIN 5 */ + /* Infinite loop */ + for(;;) + { + osDelay(1); + 8000778: 2001 movs r0, #1 + 800077a: f001 f9fc bl 8001b76 + 800077e: e7fb b.n 8000778 + +08000780 : +* @param argument: Not used +* @retval None +*/ +/* USER CODE END Header_StartTask02 */ +void StartTask02(void const * argument) +{ + 8000780: b580 push {r7, lr} + 8000782: b082 sub sp, #8 + 8000784: af00 add r7, sp, #0 + 8000786: 6078 str r0, [r7, #4] + /* USER CODE BEGIN StartTask02 */ + /* Infinite loop */ + for(;;) + { + blinkaled(); + 8000788: f000 f802 bl 8000790 + 800078c: e7fc b.n 8000788 + ... + +08000790 : + } + /* USER CODE END StartTask02 */ +} + +void blinkaled(void) +{ + 8000790: b580 push {r7, lr} + 8000792: af00 add r7, sp, #0 + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + 8000794: 2201 movs r2, #1 + 8000796: 2120 movs r1, #32 + 8000798: 4808 ldr r0, [pc, #32] ; (80007bc ) + 800079a: f000 fbb3 bl 8000f04 + HAL_Delay(1000); + 800079e: f44f 707a mov.w r0, #1000 ; 0x3e8 + 80007a2: f000 f911 bl 80009c8 + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + 80007a6: 2200 movs r2, #0 + 80007a8: 2120 movs r1, #32 + 80007aa: 4804 ldr r0, [pc, #16] ; (80007bc ) + 80007ac: f000 fbaa bl 8000f04 + HAL_Delay(1000); + 80007b0: f44f 707a mov.w r0, #1000 ; 0x3e8 + 80007b4: f000 f908 bl 80009c8 +} + 80007b8: bf00 nop + 80007ba: bd80 pop {r7, pc} + 80007bc: 40020000 .word 0x40020000 + +080007c0 : +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + 80007c0: b480 push {r7} + 80007c2: af00 add r7, sp, #0 + \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"); + 80007c4: b672 cpsid i +} + 80007c6: bf00 nop + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + 80007c8: e7fe b.n 80007c8 + ... + +080007cc : +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + 80007cc: b580 push {r7, lr} + 80007ce: b082 sub sp, #8 + 80007d0: af00 add r7, sp, #0 + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + 80007d2: 2300 movs r3, #0 + 80007d4: 607b str r3, [r7, #4] + 80007d6: 4b12 ldr r3, [pc, #72] ; (8000820 ) + 80007d8: 6c5b ldr r3, [r3, #68] ; 0x44 + 80007da: 4a11 ldr r2, [pc, #68] ; (8000820 ) + 80007dc: f443 4380 orr.w r3, r3, #16384 ; 0x4000 + 80007e0: 6453 str r3, [r2, #68] ; 0x44 + 80007e2: 4b0f ldr r3, [pc, #60] ; (8000820 ) + 80007e4: 6c5b ldr r3, [r3, #68] ; 0x44 + 80007e6: f403 4380 and.w r3, r3, #16384 ; 0x4000 + 80007ea: 607b str r3, [r7, #4] + 80007ec: 687b ldr r3, [r7, #4] + __HAL_RCC_PWR_CLK_ENABLE(); + 80007ee: 2300 movs r3, #0 + 80007f0: 603b str r3, [r7, #0] + 80007f2: 4b0b ldr r3, [pc, #44] ; (8000820 ) + 80007f4: 6c1b ldr r3, [r3, #64] ; 0x40 + 80007f6: 4a0a ldr r2, [pc, #40] ; (8000820 ) + 80007f8: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 + 80007fc: 6413 str r3, [r2, #64] ; 0x40 + 80007fe: 4b08 ldr r3, [pc, #32] ; (8000820 ) + 8000800: 6c1b ldr r3, [r3, #64] ; 0x40 + 8000802: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 8000806: 603b str r3, [r7, #0] + 8000808: 683b ldr r3, [r7, #0] + + /* System interrupt init*/ + /* PendSV_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); + 800080a: 2200 movs r2, #0 + 800080c: 210f movs r1, #15 + 800080e: f06f 0001 mvn.w r0, #1 + 8000812: f000 f9ba bl 8000b8a + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + 8000816: bf00 nop + 8000818: 3708 adds r7, #8 + 800081a: 46bd mov sp, r7 + 800081c: bd80 pop {r7, pc} + 800081e: bf00 nop + 8000820: 40023800 .word 0x40023800 + +08000824 : +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + 8000824: b480 push {r7} + 8000826: af00 add r7, sp, #0 + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) + 8000828: e7fe b.n 8000828 + +0800082a : + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + 800082a: b480 push {r7} + 800082c: af00 add r7, sp, #0 + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + 800082e: e7fe b.n 800082e + +08000830 : + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + 8000830: b480 push {r7} + 8000832: af00 add r7, sp, #0 + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + 8000834: e7fe b.n 8000834 + +08000836 : + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + 8000836: b480 push {r7} + 8000838: af00 add r7, sp, #0 + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + 800083a: e7fe b.n 800083a + +0800083c : + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + 800083c: b480 push {r7} + 800083e: af00 add r7, sp, #0 + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + 8000840: e7fe b.n 8000840 + +08000842 : + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + 8000842: b480 push {r7} + 8000844: af00 add r7, sp, #0 + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + 8000846: bf00 nop + 8000848: 46bd mov sp, r7 + 800084a: f85d 7b04 ldr.w r7, [sp], #4 + 800084e: 4770 bx lr + +08000850 : + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + 8000850: b580 push {r7, lr} + 8000852: af00 add r7, sp, #0 + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + 8000854: f000 f898 bl 8000988 +#if (INCLUDE_xTaskGetSchedulerState == 1 ) + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + 8000858: f001 ff10 bl 800267c + 800085c: 4603 mov r3, r0 + 800085e: 2b01 cmp r3, #1 + 8000860: d001 beq.n 8000866 + { +#endif /* INCLUDE_xTaskGetSchedulerState */ + xPortSysTickHandler(); + 8000862: f002 f951 bl 8002b08 + } +#endif /* INCLUDE_xTaskGetSchedulerState */ + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + 8000866: bf00 nop + 8000868: bd80 pop {r7, pc} + ... + +0800086c : + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + 800086c: b480 push {r7} + 800086e: af00 add r7, sp, #0 + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + 8000870: 4b06 ldr r3, [pc, #24] ; (800088c ) + 8000872: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88 + 8000876: 4a05 ldr r2, [pc, #20] ; (800088c ) + 8000878: f443 0370 orr.w r3, r3, #15728640 ; 0xf00000 + 800087c: f8c2 3088 str.w r3, [r2, #136] ; 0x88 + + /* Configure the Vector Table location -------------------------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +} + 8000880: bf00 nop + 8000882: 46bd mov sp, r7 + 8000884: f85d 7b04 ldr.w r7, [sp], #4 + 8000888: 4770 bx lr + 800088a: bf00 nop + 800088c: e000ed00 .word 0xe000ed00 + +08000890 : + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* set stack pointer */ + 8000890: f8df d034 ldr.w sp, [pc, #52] ; 80008c8 + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + 8000894: 480d ldr r0, [pc, #52] ; (80008cc ) + ldr r1, =_edata + 8000896: 490e ldr r1, [pc, #56] ; (80008d0 ) + ldr r2, =_sidata + 8000898: 4a0e ldr r2, [pc, #56] ; (80008d4 ) + movs r3, #0 + 800089a: 2300 movs r3, #0 + b LoopCopyDataInit + 800089c: e002 b.n 80008a4 + +0800089e : + +CopyDataInit: + ldr r4, [r2, r3] + 800089e: 58d4 ldr r4, [r2, r3] + str r4, [r0, r3] + 80008a0: 50c4 str r4, [r0, r3] + adds r3, r3, #4 + 80008a2: 3304 adds r3, #4 + +080008a4 : + +LoopCopyDataInit: + adds r4, r0, r3 + 80008a4: 18c4 adds r4, r0, r3 + cmp r4, r1 + 80008a6: 428c cmp r4, r1 + bcc CopyDataInit + 80008a8: d3f9 bcc.n 800089e + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + 80008aa: 4a0b ldr r2, [pc, #44] ; (80008d8 ) + ldr r4, =_ebss + 80008ac: 4c0b ldr r4, [pc, #44] ; (80008dc ) + movs r3, #0 + 80008ae: 2300 movs r3, #0 + b LoopFillZerobss + 80008b0: e001 b.n 80008b6 + +080008b2 : + +FillZerobss: + str r3, [r2] + 80008b2: 6013 str r3, [r2, #0] + adds r2, r2, #4 + 80008b4: 3204 adds r2, #4 + +080008b6 : + +LoopFillZerobss: + cmp r2, r4 + 80008b6: 42a2 cmp r2, r4 + bcc FillZerobss + 80008b8: d3fb bcc.n 80008b2 + +/* Call the clock system initialization function.*/ + bl SystemInit + 80008ba: f7ff ffd7 bl 800086c +/* Call static constructors */ + bl __libc_init_array + 80008be: f002 fb5d bl 8002f7c <__libc_init_array> +/* Call the application's entry point.*/ + bl main + 80008c2: f7ff fe41 bl 8000548
    + bx lr + 80008c6: 4770 bx lr + ldr sp, =_estack /* set stack pointer */ + 80008c8: 20020000 .word 0x20020000 + ldr r0, =_sdata + 80008cc: 20000000 .word 0x20000000 + ldr r1, =_edata + 80008d0: 20000010 .word 0x20000010 + ldr r2, =_sidata + 80008d4: 08003064 .word 0x08003064 + ldr r2, =_sbss + 80008d8: 20000010 .word 0x20000010 + ldr r4, =_ebss + 80008dc: 20003fe0 .word 0x20003fe0 + +080008e0 : + * @retval None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + 80008e0: e7fe b.n 80008e0 + ... + +080008e4 : + * 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) +{ + 80008e4: b580 push {r7, lr} + 80008e6: af00 add r7, sp, #0 + /* Configure Flash prefetch, Instruction cache, Data cache */ +#if (INSTRUCTION_CACHE_ENABLE != 0U) + __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); + 80008e8: 4b0e ldr r3, [pc, #56] ; (8000924 ) + 80008ea: 681b ldr r3, [r3, #0] + 80008ec: 4a0d ldr r2, [pc, #52] ; (8000924 ) + 80008ee: f443 7300 orr.w r3, r3, #512 ; 0x200 + 80008f2: 6013 str r3, [r2, #0] +#endif /* INSTRUCTION_CACHE_ENABLE */ + +#if (DATA_CACHE_ENABLE != 0U) + __HAL_FLASH_DATA_CACHE_ENABLE(); + 80008f4: 4b0b ldr r3, [pc, #44] ; (8000924 ) + 80008f6: 681b ldr r3, [r3, #0] + 80008f8: 4a0a ldr r2, [pc, #40] ; (8000924 ) + 80008fa: f443 6380 orr.w r3, r3, #1024 ; 0x400 + 80008fe: 6013 str r3, [r2, #0] +#endif /* DATA_CACHE_ENABLE */ + +#if (PREFETCH_ENABLE != 0U) + __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); + 8000900: 4b08 ldr r3, [pc, #32] ; (8000924 ) + 8000902: 681b ldr r3, [r3, #0] + 8000904: 4a07 ldr r2, [pc, #28] ; (8000924 ) + 8000906: f443 7380 orr.w r3, r3, #256 ; 0x100 + 800090a: 6013 str r3, [r2, #0] +#endif /* PREFETCH_ENABLE */ + + /* Set Interrupt Group Priority */ + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + 800090c: 2003 movs r0, #3 + 800090e: f000 f931 bl 8000b74 + + /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ + HAL_InitTick(TICK_INT_PRIORITY); + 8000912: 200f movs r0, #15 + 8000914: f000 f808 bl 8000928 + + /* Init the low level hardware */ + HAL_MspInit(); + 8000918: f7ff ff58 bl 80007cc + + /* Return function status */ + return HAL_OK; + 800091c: 2300 movs r3, #0 +} + 800091e: 4618 mov r0, r3 + 8000920: bd80 pop {r7, pc} + 8000922: bf00 nop + 8000924: 40023c00 .word 0x40023c00 + +08000928 : + * implementation in user file. + * @param TickPriority Tick interrupt priority. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + 8000928: b580 push {r7, lr} + 800092a: b082 sub sp, #8 + 800092c: af00 add r7, sp, #0 + 800092e: 6078 str r0, [r7, #4] + /* Configure the SysTick to have interrupt in 1ms time basis*/ + if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) + 8000930: 4b12 ldr r3, [pc, #72] ; (800097c ) + 8000932: 681a ldr r2, [r3, #0] + 8000934: 4b12 ldr r3, [pc, #72] ; (8000980 ) + 8000936: 781b ldrb r3, [r3, #0] + 8000938: 4619 mov r1, r3 + 800093a: f44f 737a mov.w r3, #1000 ; 0x3e8 + 800093e: fbb3 f3f1 udiv r3, r3, r1 + 8000942: fbb2 f3f3 udiv r3, r2, r3 + 8000946: 4618 mov r0, r3 + 8000948: f000 f93b bl 8000bc2 + 800094c: 4603 mov r3, r0 + 800094e: 2b00 cmp r3, #0 + 8000950: d001 beq.n 8000956 + { + return HAL_ERROR; + 8000952: 2301 movs r3, #1 + 8000954: e00e b.n 8000974 + } + + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + 8000956: 687b ldr r3, [r7, #4] + 8000958: 2b0f cmp r3, #15 + 800095a: d80a bhi.n 8000972 + { + HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); + 800095c: 2200 movs r2, #0 + 800095e: 6879 ldr r1, [r7, #4] + 8000960: f04f 30ff mov.w r0, #4294967295 + 8000964: f000 f911 bl 8000b8a + uwTickPrio = TickPriority; + 8000968: 4a06 ldr r2, [pc, #24] ; (8000984 ) + 800096a: 687b ldr r3, [r7, #4] + 800096c: 6013 str r3, [r2, #0] + { + return HAL_ERROR; + } + + /* Return function status */ + return HAL_OK; + 800096e: 2300 movs r3, #0 + 8000970: e000 b.n 8000974 + return HAL_ERROR; + 8000972: 2301 movs r3, #1 +} + 8000974: 4618 mov r0, r3 + 8000976: 3708 adds r7, #8 + 8000978: 46bd mov sp, r7 + 800097a: bd80 pop {r7, pc} + 800097c: 20000000 .word 0x20000000 + 8000980: 20000008 .word 0x20000008 + 8000984: 20000004 .word 0x20000004 + +08000988 : + * @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) +{ + 8000988: b480 push {r7} + 800098a: af00 add r7, sp, #0 + uwTick += uwTickFreq; + 800098c: 4b06 ldr r3, [pc, #24] ; (80009a8 ) + 800098e: 781b ldrb r3, [r3, #0] + 8000990: 461a mov r2, r3 + 8000992: 4b06 ldr r3, [pc, #24] ; (80009ac ) + 8000994: 681b ldr r3, [r3, #0] + 8000996: 4413 add r3, r2 + 8000998: 4a04 ldr r2, [pc, #16] ; (80009ac ) + 800099a: 6013 str r3, [r2, #0] +} + 800099c: bf00 nop + 800099e: 46bd mov sp, r7 + 80009a0: f85d 7b04 ldr.w r7, [sp], #4 + 80009a4: 4770 bx lr + 80009a6: bf00 nop + 80009a8: 20000008 .word 0x20000008 + 80009ac: 20000288 .word 0x20000288 + +080009b0 : + * @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) +{ + 80009b0: b480 push {r7} + 80009b2: af00 add r7, sp, #0 + return uwTick; + 80009b4: 4b03 ldr r3, [pc, #12] ; (80009c4 ) + 80009b6: 681b ldr r3, [r3, #0] +} + 80009b8: 4618 mov r0, r3 + 80009ba: 46bd mov sp, r7 + 80009bc: f85d 7b04 ldr.w r7, [sp], #4 + 80009c0: 4770 bx lr + 80009c2: bf00 nop + 80009c4: 20000288 .word 0x20000288 + +080009c8 : + * implementations in user file. + * @param Delay specifies the delay time length, in milliseconds. + * @retval None + */ +__weak void HAL_Delay(uint32_t Delay) +{ + 80009c8: b580 push {r7, lr} + 80009ca: b084 sub sp, #16 + 80009cc: af00 add r7, sp, #0 + 80009ce: 6078 str r0, [r7, #4] + uint32_t tickstart = HAL_GetTick(); + 80009d0: f7ff ffee bl 80009b0 + 80009d4: 60b8 str r0, [r7, #8] + uint32_t wait = Delay; + 80009d6: 687b ldr r3, [r7, #4] + 80009d8: 60fb str r3, [r7, #12] + + /* Add a freq to guarantee minimum wait */ + if (wait < HAL_MAX_DELAY) + 80009da: 68fb ldr r3, [r7, #12] + 80009dc: f1b3 3fff cmp.w r3, #4294967295 + 80009e0: d005 beq.n 80009ee + { + wait += (uint32_t)(uwTickFreq); + 80009e2: 4b0a ldr r3, [pc, #40] ; (8000a0c ) + 80009e4: 781b ldrb r3, [r3, #0] + 80009e6: 461a mov r2, r3 + 80009e8: 68fb ldr r3, [r7, #12] + 80009ea: 4413 add r3, r2 + 80009ec: 60fb str r3, [r7, #12] + } + + while((HAL_GetTick() - tickstart) < wait) + 80009ee: bf00 nop + 80009f0: f7ff ffde bl 80009b0 + 80009f4: 4602 mov r2, r0 + 80009f6: 68bb ldr r3, [r7, #8] + 80009f8: 1ad3 subs r3, r2, r3 + 80009fa: 68fa ldr r2, [r7, #12] + 80009fc: 429a cmp r2, r3 + 80009fe: d8f7 bhi.n 80009f0 + { + } +} + 8000a00: bf00 nop + 8000a02: bf00 nop + 8000a04: 3710 adds r7, #16 + 8000a06: 46bd mov sp, r7 + 8000a08: bd80 pop {r7, pc} + 8000a0a: bf00 nop + 8000a0c: 20000008 .word 0x20000008 + +08000a10 <__NVIC_SetPriorityGrouping>: + 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) +{ + 8000a10: b480 push {r7} + 8000a12: b085 sub sp, #20 + 8000a14: af00 add r7, sp, #0 + 8000a16: 6078 str r0, [r7, #4] + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + 8000a18: 687b ldr r3, [r7, #4] + 8000a1a: f003 0307 and.w r3, r3, #7 + 8000a1e: 60fb str r3, [r7, #12] + + reg_value = SCB->AIRCR; /* read old register configuration */ + 8000a20: 4b0c ldr r3, [pc, #48] ; (8000a54 <__NVIC_SetPriorityGrouping+0x44>) + 8000a22: 68db ldr r3, [r3, #12] + 8000a24: 60bb str r3, [r7, #8] + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + 8000a26: 68ba ldr r2, [r7, #8] + 8000a28: f64f 03ff movw r3, #63743 ; 0xf8ff + 8000a2c: 4013 ands r3, r2 + 8000a2e: 60bb str r3, [r7, #8] + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + 8000a30: 68fb ldr r3, [r7, #12] + 8000a32: 021a lsls r2, r3, #8 + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + 8000a34: 68bb ldr r3, [r7, #8] + 8000a36: 4313 orrs r3, r2 + reg_value = (reg_value | + 8000a38: f043 63bf orr.w r3, r3, #100139008 ; 0x5f80000 + 8000a3c: f443 3300 orr.w r3, r3, #131072 ; 0x20000 + 8000a40: 60bb str r3, [r7, #8] + SCB->AIRCR = reg_value; + 8000a42: 4a04 ldr r2, [pc, #16] ; (8000a54 <__NVIC_SetPriorityGrouping+0x44>) + 8000a44: 68bb ldr r3, [r7, #8] + 8000a46: 60d3 str r3, [r2, #12] +} + 8000a48: bf00 nop + 8000a4a: 3714 adds r7, #20 + 8000a4c: 46bd mov sp, r7 + 8000a4e: f85d 7b04 ldr.w r7, [sp], #4 + 8000a52: 4770 bx lr + 8000a54: e000ed00 .word 0xe000ed00 + +08000a58 <__NVIC_GetPriorityGrouping>: + \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) +{ + 8000a58: b480 push {r7} + 8000a5a: af00 add r7, sp, #0 + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); + 8000a5c: 4b04 ldr r3, [pc, #16] ; (8000a70 <__NVIC_GetPriorityGrouping+0x18>) + 8000a5e: 68db ldr r3, [r3, #12] + 8000a60: 0a1b lsrs r3, r3, #8 + 8000a62: f003 0307 and.w r3, r3, #7 +} + 8000a66: 4618 mov r0, r3 + 8000a68: 46bd mov sp, r7 + 8000a6a: f85d 7b04 ldr.w r7, [sp], #4 + 8000a6e: 4770 bx lr + 8000a70: e000ed00 .word 0xe000ed00 + +08000a74 <__NVIC_SetPriority>: + \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) +{ + 8000a74: b480 push {r7} + 8000a76: b083 sub sp, #12 + 8000a78: af00 add r7, sp, #0 + 8000a7a: 4603 mov r3, r0 + 8000a7c: 6039 str r1, [r7, #0] + 8000a7e: 71fb strb r3, [r7, #7] + if ((int32_t)(IRQn) >= 0) + 8000a80: f997 3007 ldrsb.w r3, [r7, #7] + 8000a84: 2b00 cmp r3, #0 + 8000a86: db0a blt.n 8000a9e <__NVIC_SetPriority+0x2a> + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + 8000a88: 683b ldr r3, [r7, #0] + 8000a8a: b2da uxtb r2, r3 + 8000a8c: 490c ldr r1, [pc, #48] ; (8000ac0 <__NVIC_SetPriority+0x4c>) + 8000a8e: f997 3007 ldrsb.w r3, [r7, #7] + 8000a92: 0112 lsls r2, r2, #4 + 8000a94: b2d2 uxtb r2, r2 + 8000a96: 440b add r3, r1 + 8000a98: f883 2300 strb.w r2, [r3, #768] ; 0x300 + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + 8000a9c: e00a b.n 8000ab4 <__NVIC_SetPriority+0x40> + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + 8000a9e: 683b ldr r3, [r7, #0] + 8000aa0: b2da uxtb r2, r3 + 8000aa2: 4908 ldr r1, [pc, #32] ; (8000ac4 <__NVIC_SetPriority+0x50>) + 8000aa4: 79fb ldrb r3, [r7, #7] + 8000aa6: f003 030f and.w r3, r3, #15 + 8000aaa: 3b04 subs r3, #4 + 8000aac: 0112 lsls r2, r2, #4 + 8000aae: b2d2 uxtb r2, r2 + 8000ab0: 440b add r3, r1 + 8000ab2: 761a strb r2, [r3, #24] +} + 8000ab4: bf00 nop + 8000ab6: 370c adds r7, #12 + 8000ab8: 46bd mov sp, r7 + 8000aba: f85d 7b04 ldr.w r7, [sp], #4 + 8000abe: 4770 bx lr + 8000ac0: e000e100 .word 0xe000e100 + 8000ac4: e000ed00 .word 0xe000ed00 + +08000ac8 : + \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) +{ + 8000ac8: b480 push {r7} + 8000aca: b089 sub sp, #36 ; 0x24 + 8000acc: af00 add r7, sp, #0 + 8000ace: 60f8 str r0, [r7, #12] + 8000ad0: 60b9 str r1, [r7, #8] + 8000ad2: 607a str r2, [r7, #4] + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + 8000ad4: 68fb ldr r3, [r7, #12] + 8000ad6: f003 0307 and.w r3, r3, #7 + 8000ada: 61fb str r3, [r7, #28] + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + 8000adc: 69fb ldr r3, [r7, #28] + 8000ade: f1c3 0307 rsb r3, r3, #7 + 8000ae2: 2b04 cmp r3, #4 + 8000ae4: bf28 it cs + 8000ae6: 2304 movcs r3, #4 + 8000ae8: 61bb str r3, [r7, #24] + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + 8000aea: 69fb ldr r3, [r7, #28] + 8000aec: 3304 adds r3, #4 + 8000aee: 2b06 cmp r3, #6 + 8000af0: d902 bls.n 8000af8 + 8000af2: 69fb ldr r3, [r7, #28] + 8000af4: 3b03 subs r3, #3 + 8000af6: e000 b.n 8000afa + 8000af8: 2300 movs r3, #0 + 8000afa: 617b str r3, [r7, #20] + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + 8000afc: f04f 32ff mov.w r2, #4294967295 + 8000b00: 69bb ldr r3, [r7, #24] + 8000b02: fa02 f303 lsl.w r3, r2, r3 + 8000b06: 43da mvns r2, r3 + 8000b08: 68bb ldr r3, [r7, #8] + 8000b0a: 401a ands r2, r3 + 8000b0c: 697b ldr r3, [r7, #20] + 8000b0e: 409a lsls r2, r3 + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + 8000b10: f04f 31ff mov.w r1, #4294967295 + 8000b14: 697b ldr r3, [r7, #20] + 8000b16: fa01 f303 lsl.w r3, r1, r3 + 8000b1a: 43d9 mvns r1, r3 + 8000b1c: 687b ldr r3, [r7, #4] + 8000b1e: 400b ands r3, r1 + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + 8000b20: 4313 orrs r3, r2 + ); +} + 8000b22: 4618 mov r0, r3 + 8000b24: 3724 adds r7, #36 ; 0x24 + 8000b26: 46bd mov sp, r7 + 8000b28: f85d 7b04 ldr.w r7, [sp], #4 + 8000b2c: 4770 bx lr + ... + +08000b30 : + \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) +{ + 8000b30: b580 push {r7, lr} + 8000b32: b082 sub sp, #8 + 8000b34: af00 add r7, sp, #0 + 8000b36: 6078 str r0, [r7, #4] + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + 8000b38: 687b ldr r3, [r7, #4] + 8000b3a: 3b01 subs r3, #1 + 8000b3c: f1b3 7f80 cmp.w r3, #16777216 ; 0x1000000 + 8000b40: d301 bcc.n 8000b46 + { + return (1UL); /* Reload value impossible */ + 8000b42: 2301 movs r3, #1 + 8000b44: e00f b.n 8000b66 + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + 8000b46: 4a0a ldr r2, [pc, #40] ; (8000b70 ) + 8000b48: 687b ldr r3, [r7, #4] + 8000b4a: 3b01 subs r3, #1 + 8000b4c: 6053 str r3, [r2, #4] + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + 8000b4e: 210f movs r1, #15 + 8000b50: f04f 30ff mov.w r0, #4294967295 + 8000b54: f7ff ff8e bl 8000a74 <__NVIC_SetPriority> + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + 8000b58: 4b05 ldr r3, [pc, #20] ; (8000b70 ) + 8000b5a: 2200 movs r2, #0 + 8000b5c: 609a str r2, [r3, #8] + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + 8000b5e: 4b04 ldr r3, [pc, #16] ; (8000b70 ) + 8000b60: 2207 movs r2, #7 + 8000b62: 601a str r2, [r3, #0] + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ + 8000b64: 2300 movs r3, #0 +} + 8000b66: 4618 mov r0, r3 + 8000b68: 3708 adds r7, #8 + 8000b6a: 46bd mov sp, r7 + 8000b6c: bd80 pop {r7, pc} + 8000b6e: bf00 nop + 8000b70: e000e010 .word 0xe000e010 + +08000b74 : + * @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) +{ + 8000b74: b580 push {r7, lr} + 8000b76: b082 sub sp, #8 + 8000b78: af00 add r7, sp, #0 + 8000b7a: 6078 str r0, [r7, #4] + /* 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); + 8000b7c: 6878 ldr r0, [r7, #4] + 8000b7e: f7ff ff47 bl 8000a10 <__NVIC_SetPriorityGrouping> +} + 8000b82: bf00 nop + 8000b84: 3708 adds r7, #8 + 8000b86: 46bd mov sp, r7 + 8000b88: bd80 pop {r7, pc} + +08000b8a : + * 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) +{ + 8000b8a: b580 push {r7, lr} + 8000b8c: b086 sub sp, #24 + 8000b8e: af00 add r7, sp, #0 + 8000b90: 4603 mov r3, r0 + 8000b92: 60b9 str r1, [r7, #8] + 8000b94: 607a str r2, [r7, #4] + 8000b96: 73fb strb r3, [r7, #15] + uint32_t prioritygroup = 0x00U; + 8000b98: 2300 movs r3, #0 + 8000b9a: 617b str r3, [r7, #20] + + /* Check the parameters */ + assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); + + prioritygroup = NVIC_GetPriorityGrouping(); + 8000b9c: f7ff ff5c bl 8000a58 <__NVIC_GetPriorityGrouping> + 8000ba0: 6178 str r0, [r7, #20] + + NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); + 8000ba2: 687a ldr r2, [r7, #4] + 8000ba4: 68b9 ldr r1, [r7, #8] + 8000ba6: 6978 ldr r0, [r7, #20] + 8000ba8: f7ff ff8e bl 8000ac8 + 8000bac: 4602 mov r2, r0 + 8000bae: f997 300f ldrsb.w r3, [r7, #15] + 8000bb2: 4611 mov r1, r2 + 8000bb4: 4618 mov r0, r3 + 8000bb6: f7ff ff5d bl 8000a74 <__NVIC_SetPriority> +} + 8000bba: bf00 nop + 8000bbc: 3718 adds r7, #24 + 8000bbe: 46bd mov sp, r7 + 8000bc0: bd80 pop {r7, pc} + +08000bc2 : + * @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) +{ + 8000bc2: b580 push {r7, lr} + 8000bc4: b082 sub sp, #8 + 8000bc6: af00 add r7, sp, #0 + 8000bc8: 6078 str r0, [r7, #4] + return SysTick_Config(TicksNumb); + 8000bca: 6878 ldr r0, [r7, #4] + 8000bcc: f7ff ffb0 bl 8000b30 + 8000bd0: 4603 mov r3, r0 +} + 8000bd2: 4618 mov r0, r3 + 8000bd4: 3708 adds r7, #8 + 8000bd6: 46bd mov sp, r7 + 8000bd8: bd80 pop {r7, pc} + ... + +08000bdc : + * @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) +{ + 8000bdc: b480 push {r7} + 8000bde: b089 sub sp, #36 ; 0x24 + 8000be0: af00 add r7, sp, #0 + 8000be2: 6078 str r0, [r7, #4] + 8000be4: 6039 str r1, [r7, #0] + uint32_t position; + uint32_t ioposition = 0x00U; + 8000be6: 2300 movs r3, #0 + 8000be8: 617b str r3, [r7, #20] + uint32_t iocurrent = 0x00U; + 8000bea: 2300 movs r3, #0 + 8000bec: 613b str r3, [r7, #16] + uint32_t temp = 0x00U; + 8000bee: 2300 movs r3, #0 + 8000bf0: 61bb str r3, [r7, #24] + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); + assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); + + /* Configure the port pins */ + for(position = 0U; position < GPIO_NUMBER; position++) + 8000bf2: 2300 movs r3, #0 + 8000bf4: 61fb str r3, [r7, #28] + 8000bf6: e165 b.n 8000ec4 + { + /* Get the IO position */ + ioposition = 0x01U << position; + 8000bf8: 2201 movs r2, #1 + 8000bfa: 69fb ldr r3, [r7, #28] + 8000bfc: fa02 f303 lsl.w r3, r2, r3 + 8000c00: 617b str r3, [r7, #20] + /* Get the current IO position */ + iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; + 8000c02: 683b ldr r3, [r7, #0] + 8000c04: 681b ldr r3, [r3, #0] + 8000c06: 697a ldr r2, [r7, #20] + 8000c08: 4013 ands r3, r2 + 8000c0a: 613b str r3, [r7, #16] + + if(iocurrent == ioposition) + 8000c0c: 693a ldr r2, [r7, #16] + 8000c0e: 697b ldr r3, [r7, #20] + 8000c10: 429a cmp r2, r3 + 8000c12: f040 8154 bne.w 8000ebe + { + /*--------------------- GPIO Mode Configuration ------------------------*/ + /* In case of Output or Alternate function mode selection */ + if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || \ + 8000c16: 683b ldr r3, [r7, #0] + 8000c18: 685b ldr r3, [r3, #4] + 8000c1a: f003 0303 and.w r3, r3, #3 + 8000c1e: 2b01 cmp r3, #1 + 8000c20: d005 beq.n 8000c2e + (GPIO_Init->Mode & GPIO_MODE) == MODE_AF) + 8000c22: 683b ldr r3, [r7, #0] + 8000c24: 685b ldr r3, [r3, #4] + 8000c26: f003 0303 and.w r3, r3, #3 + if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || \ + 8000c2a: 2b02 cmp r3, #2 + 8000c2c: d130 bne.n 8000c90 + { + /* Check the Speed parameter */ + assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + /* Configure the IO Speed */ + temp = GPIOx->OSPEEDR; + 8000c2e: 687b ldr r3, [r7, #4] + 8000c30: 689b ldr r3, [r3, #8] + 8000c32: 61bb str r3, [r7, #24] + temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); + 8000c34: 69fb ldr r3, [r7, #28] + 8000c36: 005b lsls r3, r3, #1 + 8000c38: 2203 movs r2, #3 + 8000c3a: fa02 f303 lsl.w r3, r2, r3 + 8000c3e: 43db mvns r3, r3 + 8000c40: 69ba ldr r2, [r7, #24] + 8000c42: 4013 ands r3, r2 + 8000c44: 61bb str r3, [r7, #24] + temp |= (GPIO_Init->Speed << (position * 2U)); + 8000c46: 683b ldr r3, [r7, #0] + 8000c48: 68da ldr r2, [r3, #12] + 8000c4a: 69fb ldr r3, [r7, #28] + 8000c4c: 005b lsls r3, r3, #1 + 8000c4e: fa02 f303 lsl.w r3, r2, r3 + 8000c52: 69ba ldr r2, [r7, #24] + 8000c54: 4313 orrs r3, r2 + 8000c56: 61bb str r3, [r7, #24] + GPIOx->OSPEEDR = temp; + 8000c58: 687b ldr r3, [r7, #4] + 8000c5a: 69ba ldr r2, [r7, #24] + 8000c5c: 609a str r2, [r3, #8] + + /* Configure the IO Output Type */ + temp = GPIOx->OTYPER; + 8000c5e: 687b ldr r3, [r7, #4] + 8000c60: 685b ldr r3, [r3, #4] + 8000c62: 61bb str r3, [r7, #24] + temp &= ~(GPIO_OTYPER_OT_0 << position) ; + 8000c64: 2201 movs r2, #1 + 8000c66: 69fb ldr r3, [r7, #28] + 8000c68: fa02 f303 lsl.w r3, r2, r3 + 8000c6c: 43db mvns r3, r3 + 8000c6e: 69ba ldr r2, [r7, #24] + 8000c70: 4013 ands r3, r2 + 8000c72: 61bb str r3, [r7, #24] + temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position); + 8000c74: 683b ldr r3, [r7, #0] + 8000c76: 685b ldr r3, [r3, #4] + 8000c78: 091b lsrs r3, r3, #4 + 8000c7a: f003 0201 and.w r2, r3, #1 + 8000c7e: 69fb ldr r3, [r7, #28] + 8000c80: fa02 f303 lsl.w r3, r2, r3 + 8000c84: 69ba ldr r2, [r7, #24] + 8000c86: 4313 orrs r3, r2 + 8000c88: 61bb str r3, [r7, #24] + GPIOx->OTYPER = temp; + 8000c8a: 687b ldr r3, [r7, #4] + 8000c8c: 69ba ldr r2, [r7, #24] + 8000c8e: 605a str r2, [r3, #4] + } + + if((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG) + 8000c90: 683b ldr r3, [r7, #0] + 8000c92: 685b ldr r3, [r3, #4] + 8000c94: f003 0303 and.w r3, r3, #3 + 8000c98: 2b03 cmp r3, #3 + 8000c9a: d017 beq.n 8000ccc + { + /* Check the parameters */ + assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); + + /* Activate the Pull-up or Pull down resistor for the current IO */ + temp = GPIOx->PUPDR; + 8000c9c: 687b ldr r3, [r7, #4] + 8000c9e: 68db ldr r3, [r3, #12] + 8000ca0: 61bb str r3, [r7, #24] + temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); + 8000ca2: 69fb ldr r3, [r7, #28] + 8000ca4: 005b lsls r3, r3, #1 + 8000ca6: 2203 movs r2, #3 + 8000ca8: fa02 f303 lsl.w r3, r2, r3 + 8000cac: 43db mvns r3, r3 + 8000cae: 69ba ldr r2, [r7, #24] + 8000cb0: 4013 ands r3, r2 + 8000cb2: 61bb str r3, [r7, #24] + temp |= ((GPIO_Init->Pull) << (position * 2U)); + 8000cb4: 683b ldr r3, [r7, #0] + 8000cb6: 689a ldr r2, [r3, #8] + 8000cb8: 69fb ldr r3, [r7, #28] + 8000cba: 005b lsls r3, r3, #1 + 8000cbc: fa02 f303 lsl.w r3, r2, r3 + 8000cc0: 69ba ldr r2, [r7, #24] + 8000cc2: 4313 orrs r3, r2 + 8000cc4: 61bb str r3, [r7, #24] + GPIOx->PUPDR = temp; + 8000cc6: 687b ldr r3, [r7, #4] + 8000cc8: 69ba ldr r2, [r7, #24] + 8000cca: 60da str r2, [r3, #12] + } + + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) + 8000ccc: 683b ldr r3, [r7, #0] + 8000cce: 685b ldr r3, [r3, #4] + 8000cd0: f003 0303 and.w r3, r3, #3 + 8000cd4: 2b02 cmp r3, #2 + 8000cd6: d123 bne.n 8000d20 + { + /* 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]; + 8000cd8: 69fb ldr r3, [r7, #28] + 8000cda: 08da lsrs r2, r3, #3 + 8000cdc: 687b ldr r3, [r7, #4] + 8000cde: 3208 adds r2, #8 + 8000ce0: f853 3022 ldr.w r3, [r3, r2, lsl #2] + 8000ce4: 61bb str r3, [r7, #24] + temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; + 8000ce6: 69fb ldr r3, [r7, #28] + 8000ce8: f003 0307 and.w r3, r3, #7 + 8000cec: 009b lsls r3, r3, #2 + 8000cee: 220f movs r2, #15 + 8000cf0: fa02 f303 lsl.w r3, r2, r3 + 8000cf4: 43db mvns r3, r3 + 8000cf6: 69ba ldr r2, [r7, #24] + 8000cf8: 4013 ands r3, r2 + 8000cfa: 61bb str r3, [r7, #24] + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); + 8000cfc: 683b ldr r3, [r7, #0] + 8000cfe: 691a ldr r2, [r3, #16] + 8000d00: 69fb ldr r3, [r7, #28] + 8000d02: f003 0307 and.w r3, r3, #7 + 8000d06: 009b lsls r3, r3, #2 + 8000d08: fa02 f303 lsl.w r3, r2, r3 + 8000d0c: 69ba ldr r2, [r7, #24] + 8000d0e: 4313 orrs r3, r2 + 8000d10: 61bb str r3, [r7, #24] + GPIOx->AFR[position >> 3U] = temp; + 8000d12: 69fb ldr r3, [r7, #28] + 8000d14: 08da lsrs r2, r3, #3 + 8000d16: 687b ldr r3, [r7, #4] + 8000d18: 3208 adds r2, #8 + 8000d1a: 69b9 ldr r1, [r7, #24] + 8000d1c: f843 1022 str.w r1, [r3, r2, lsl #2] + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + 8000d20: 687b ldr r3, [r7, #4] + 8000d22: 681b ldr r3, [r3, #0] + 8000d24: 61bb str r3, [r7, #24] + temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); + 8000d26: 69fb ldr r3, [r7, #28] + 8000d28: 005b lsls r3, r3, #1 + 8000d2a: 2203 movs r2, #3 + 8000d2c: fa02 f303 lsl.w r3, r2, r3 + 8000d30: 43db mvns r3, r3 + 8000d32: 69ba ldr r2, [r7, #24] + 8000d34: 4013 ands r3, r2 + 8000d36: 61bb str r3, [r7, #24] + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); + 8000d38: 683b ldr r3, [r7, #0] + 8000d3a: 685b ldr r3, [r3, #4] + 8000d3c: f003 0203 and.w r2, r3, #3 + 8000d40: 69fb ldr r3, [r7, #28] + 8000d42: 005b lsls r3, r3, #1 + 8000d44: fa02 f303 lsl.w r3, r2, r3 + 8000d48: 69ba ldr r2, [r7, #24] + 8000d4a: 4313 orrs r3, r2 + 8000d4c: 61bb str r3, [r7, #24] + GPIOx->MODER = temp; + 8000d4e: 687b ldr r3, [r7, #4] + 8000d50: 69ba ldr r2, [r7, #24] + 8000d52: 601a str r2, [r3, #0] + + /*--------------------- EXTI Mode Configuration ------------------------*/ + /* Configure the External Interrupt or event for the current IO */ + if((GPIO_Init->Mode & EXTI_MODE) != 0x00U) + 8000d54: 683b ldr r3, [r7, #0] + 8000d56: 685b ldr r3, [r3, #4] + 8000d58: f403 3340 and.w r3, r3, #196608 ; 0x30000 + 8000d5c: 2b00 cmp r3, #0 + 8000d5e: f000 80ae beq.w 8000ebe + { + /* Enable SYSCFG Clock */ + __HAL_RCC_SYSCFG_CLK_ENABLE(); + 8000d62: 2300 movs r3, #0 + 8000d64: 60fb str r3, [r7, #12] + 8000d66: 4b5d ldr r3, [pc, #372] ; (8000edc ) + 8000d68: 6c5b ldr r3, [r3, #68] ; 0x44 + 8000d6a: 4a5c ldr r2, [pc, #368] ; (8000edc ) + 8000d6c: f443 4380 orr.w r3, r3, #16384 ; 0x4000 + 8000d70: 6453 str r3, [r2, #68] ; 0x44 + 8000d72: 4b5a ldr r3, [pc, #360] ; (8000edc ) + 8000d74: 6c5b ldr r3, [r3, #68] ; 0x44 + 8000d76: f403 4380 and.w r3, r3, #16384 ; 0x4000 + 8000d7a: 60fb str r3, [r7, #12] + 8000d7c: 68fb ldr r3, [r7, #12] + + temp = SYSCFG->EXTICR[position >> 2U]; + 8000d7e: 4a58 ldr r2, [pc, #352] ; (8000ee0 ) + 8000d80: 69fb ldr r3, [r7, #28] + 8000d82: 089b lsrs r3, r3, #2 + 8000d84: 3302 adds r3, #2 + 8000d86: f852 3023 ldr.w r3, [r2, r3, lsl #2] + 8000d8a: 61bb str r3, [r7, #24] + temp &= ~(0x0FU << (4U * (position & 0x03U))); + 8000d8c: 69fb ldr r3, [r7, #28] + 8000d8e: f003 0303 and.w r3, r3, #3 + 8000d92: 009b lsls r3, r3, #2 + 8000d94: 220f movs r2, #15 + 8000d96: fa02 f303 lsl.w r3, r2, r3 + 8000d9a: 43db mvns r3, r3 + 8000d9c: 69ba ldr r2, [r7, #24] + 8000d9e: 4013 ands r3, r2 + 8000da0: 61bb str r3, [r7, #24] + temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); + 8000da2: 687b ldr r3, [r7, #4] + 8000da4: 4a4f ldr r2, [pc, #316] ; (8000ee4 ) + 8000da6: 4293 cmp r3, r2 + 8000da8: d025 beq.n 8000df6 + 8000daa: 687b ldr r3, [r7, #4] + 8000dac: 4a4e ldr r2, [pc, #312] ; (8000ee8 ) + 8000dae: 4293 cmp r3, r2 + 8000db0: d01f beq.n 8000df2 + 8000db2: 687b ldr r3, [r7, #4] + 8000db4: 4a4d ldr r2, [pc, #308] ; (8000eec ) + 8000db6: 4293 cmp r3, r2 + 8000db8: d019 beq.n 8000dee + 8000dba: 687b ldr r3, [r7, #4] + 8000dbc: 4a4c ldr r2, [pc, #304] ; (8000ef0 ) + 8000dbe: 4293 cmp r3, r2 + 8000dc0: d013 beq.n 8000dea + 8000dc2: 687b ldr r3, [r7, #4] + 8000dc4: 4a4b ldr r2, [pc, #300] ; (8000ef4 ) + 8000dc6: 4293 cmp r3, r2 + 8000dc8: d00d beq.n 8000de6 + 8000dca: 687b ldr r3, [r7, #4] + 8000dcc: 4a4a ldr r2, [pc, #296] ; (8000ef8 ) + 8000dce: 4293 cmp r3, r2 + 8000dd0: d007 beq.n 8000de2 + 8000dd2: 687b ldr r3, [r7, #4] + 8000dd4: 4a49 ldr r2, [pc, #292] ; (8000efc ) + 8000dd6: 4293 cmp r3, r2 + 8000dd8: d101 bne.n 8000dde + 8000dda: 2306 movs r3, #6 + 8000ddc: e00c b.n 8000df8 + 8000dde: 2307 movs r3, #7 + 8000de0: e00a b.n 8000df8 + 8000de2: 2305 movs r3, #5 + 8000de4: e008 b.n 8000df8 + 8000de6: 2304 movs r3, #4 + 8000de8: e006 b.n 8000df8 + 8000dea: 2303 movs r3, #3 + 8000dec: e004 b.n 8000df8 + 8000dee: 2302 movs r3, #2 + 8000df0: e002 b.n 8000df8 + 8000df2: 2301 movs r3, #1 + 8000df4: e000 b.n 8000df8 + 8000df6: 2300 movs r3, #0 + 8000df8: 69fa ldr r2, [r7, #28] + 8000dfa: f002 0203 and.w r2, r2, #3 + 8000dfe: 0092 lsls r2, r2, #2 + 8000e00: 4093 lsls r3, r2 + 8000e02: 69ba ldr r2, [r7, #24] + 8000e04: 4313 orrs r3, r2 + 8000e06: 61bb str r3, [r7, #24] + SYSCFG->EXTICR[position >> 2U] = temp; + 8000e08: 4935 ldr r1, [pc, #212] ; (8000ee0 ) + 8000e0a: 69fb ldr r3, [r7, #28] + 8000e0c: 089b lsrs r3, r3, #2 + 8000e0e: 3302 adds r3, #2 + 8000e10: 69ba ldr r2, [r7, #24] + 8000e12: f841 2023 str.w r2, [r1, r3, lsl #2] + + /* Clear Rising Falling edge configuration */ + temp = EXTI->RTSR; + 8000e16: 4b3a ldr r3, [pc, #232] ; (8000f00 ) + 8000e18: 689b ldr r3, [r3, #8] + 8000e1a: 61bb str r3, [r7, #24] + temp &= ~((uint32_t)iocurrent); + 8000e1c: 693b ldr r3, [r7, #16] + 8000e1e: 43db mvns r3, r3 + 8000e20: 69ba ldr r2, [r7, #24] + 8000e22: 4013 ands r3, r2 + 8000e24: 61bb str r3, [r7, #24] + if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00U) + 8000e26: 683b ldr r3, [r7, #0] + 8000e28: 685b ldr r3, [r3, #4] + 8000e2a: f403 1380 and.w r3, r3, #1048576 ; 0x100000 + 8000e2e: 2b00 cmp r3, #0 + 8000e30: d003 beq.n 8000e3a + { + temp |= iocurrent; + 8000e32: 69ba ldr r2, [r7, #24] + 8000e34: 693b ldr r3, [r7, #16] + 8000e36: 4313 orrs r3, r2 + 8000e38: 61bb str r3, [r7, #24] + } + EXTI->RTSR = temp; + 8000e3a: 4a31 ldr r2, [pc, #196] ; (8000f00 ) + 8000e3c: 69bb ldr r3, [r7, #24] + 8000e3e: 6093 str r3, [r2, #8] + + temp = EXTI->FTSR; + 8000e40: 4b2f ldr r3, [pc, #188] ; (8000f00 ) + 8000e42: 68db ldr r3, [r3, #12] + 8000e44: 61bb str r3, [r7, #24] + temp &= ~((uint32_t)iocurrent); + 8000e46: 693b ldr r3, [r7, #16] + 8000e48: 43db mvns r3, r3 + 8000e4a: 69ba ldr r2, [r7, #24] + 8000e4c: 4013 ands r3, r2 + 8000e4e: 61bb str r3, [r7, #24] + if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00U) + 8000e50: 683b ldr r3, [r7, #0] + 8000e52: 685b ldr r3, [r3, #4] + 8000e54: f403 1300 and.w r3, r3, #2097152 ; 0x200000 + 8000e58: 2b00 cmp r3, #0 + 8000e5a: d003 beq.n 8000e64 + { + temp |= iocurrent; + 8000e5c: 69ba ldr r2, [r7, #24] + 8000e5e: 693b ldr r3, [r7, #16] + 8000e60: 4313 orrs r3, r2 + 8000e62: 61bb str r3, [r7, #24] + } + EXTI->FTSR = temp; + 8000e64: 4a26 ldr r2, [pc, #152] ; (8000f00 ) + 8000e66: 69bb ldr r3, [r7, #24] + 8000e68: 60d3 str r3, [r2, #12] + + temp = EXTI->EMR; + 8000e6a: 4b25 ldr r3, [pc, #148] ; (8000f00 ) + 8000e6c: 685b ldr r3, [r3, #4] + 8000e6e: 61bb str r3, [r7, #24] + temp &= ~((uint32_t)iocurrent); + 8000e70: 693b ldr r3, [r7, #16] + 8000e72: 43db mvns r3, r3 + 8000e74: 69ba ldr r2, [r7, #24] + 8000e76: 4013 ands r3, r2 + 8000e78: 61bb str r3, [r7, #24] + if((GPIO_Init->Mode & EXTI_EVT) != 0x00U) + 8000e7a: 683b ldr r3, [r7, #0] + 8000e7c: 685b ldr r3, [r3, #4] + 8000e7e: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8000e82: 2b00 cmp r3, #0 + 8000e84: d003 beq.n 8000e8e + { + temp |= iocurrent; + 8000e86: 69ba ldr r2, [r7, #24] + 8000e88: 693b ldr r3, [r7, #16] + 8000e8a: 4313 orrs r3, r2 + 8000e8c: 61bb str r3, [r7, #24] + } + EXTI->EMR = temp; + 8000e8e: 4a1c ldr r2, [pc, #112] ; (8000f00 ) + 8000e90: 69bb ldr r3, [r7, #24] + 8000e92: 6053 str r3, [r2, #4] + + /* Clear EXTI line configuration */ + temp = EXTI->IMR; + 8000e94: 4b1a ldr r3, [pc, #104] ; (8000f00 ) + 8000e96: 681b ldr r3, [r3, #0] + 8000e98: 61bb str r3, [r7, #24] + temp &= ~((uint32_t)iocurrent); + 8000e9a: 693b ldr r3, [r7, #16] + 8000e9c: 43db mvns r3, r3 + 8000e9e: 69ba ldr r2, [r7, #24] + 8000ea0: 4013 ands r3, r2 + 8000ea2: 61bb str r3, [r7, #24] + if((GPIO_Init->Mode & EXTI_IT) != 0x00U) + 8000ea4: 683b ldr r3, [r7, #0] + 8000ea6: 685b ldr r3, [r3, #4] + 8000ea8: f403 3380 and.w r3, r3, #65536 ; 0x10000 + 8000eac: 2b00 cmp r3, #0 + 8000eae: d003 beq.n 8000eb8 + { + temp |= iocurrent; + 8000eb0: 69ba ldr r2, [r7, #24] + 8000eb2: 693b ldr r3, [r7, #16] + 8000eb4: 4313 orrs r3, r2 + 8000eb6: 61bb str r3, [r7, #24] + } + EXTI->IMR = temp; + 8000eb8: 4a11 ldr r2, [pc, #68] ; (8000f00 ) + 8000eba: 69bb ldr r3, [r7, #24] + 8000ebc: 6013 str r3, [r2, #0] + for(position = 0U; position < GPIO_NUMBER; position++) + 8000ebe: 69fb ldr r3, [r7, #28] + 8000ec0: 3301 adds r3, #1 + 8000ec2: 61fb str r3, [r7, #28] + 8000ec4: 69fb ldr r3, [r7, #28] + 8000ec6: 2b0f cmp r3, #15 + 8000ec8: f67f ae96 bls.w 8000bf8 + } + } + } +} + 8000ecc: bf00 nop + 8000ece: bf00 nop + 8000ed0: 3724 adds r7, #36 ; 0x24 + 8000ed2: 46bd mov sp, r7 + 8000ed4: f85d 7b04 ldr.w r7, [sp], #4 + 8000ed8: 4770 bx lr + 8000eda: bf00 nop + 8000edc: 40023800 .word 0x40023800 + 8000ee0: 40013800 .word 0x40013800 + 8000ee4: 40020000 .word 0x40020000 + 8000ee8: 40020400 .word 0x40020400 + 8000eec: 40020800 .word 0x40020800 + 8000ef0: 40020c00 .word 0x40020c00 + 8000ef4: 40021000 .word 0x40021000 + 8000ef8: 40021400 .word 0x40021400 + 8000efc: 40021800 .word 0x40021800 + 8000f00: 40013c00 .word 0x40013c00 + +08000f04 : + * @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) +{ + 8000f04: b480 push {r7} + 8000f06: b083 sub sp, #12 + 8000f08: af00 add r7, sp, #0 + 8000f0a: 6078 str r0, [r7, #4] + 8000f0c: 460b mov r3, r1 + 8000f0e: 807b strh r3, [r7, #2] + 8000f10: 4613 mov r3, r2 + 8000f12: 707b strb r3, [r7, #1] + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + assert_param(IS_GPIO_PIN_ACTION(PinState)); + + if(PinState != GPIO_PIN_RESET) + 8000f14: 787b ldrb r3, [r7, #1] + 8000f16: 2b00 cmp r3, #0 + 8000f18: d003 beq.n 8000f22 + { + GPIOx->BSRR = GPIO_Pin; + 8000f1a: 887a ldrh r2, [r7, #2] + 8000f1c: 687b ldr r3, [r7, #4] + 8000f1e: 619a str r2, [r3, #24] + } + else + { + GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; + } +} + 8000f20: e003 b.n 8000f2a + GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; + 8000f22: 887b ldrh r3, [r7, #2] + 8000f24: 041a lsls r2, r3, #16 + 8000f26: 687b ldr r3, [r7, #4] + 8000f28: 619a str r2, [r3, #24] +} + 8000f2a: bf00 nop + 8000f2c: 370c adds r7, #12 + 8000f2e: 46bd mov sp, r7 + 8000f30: f85d 7b04 ldr.w r7, [sp], #4 + 8000f34: 4770 bx lr + ... + +08000f38 : + * 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) +{ + 8000f38: b580 push {r7, lr} + 8000f3a: b084 sub sp, #16 + 8000f3c: af00 add r7, sp, #0 + 8000f3e: 6078 str r0, [r7, #4] + 8000f40: 6039 str r1, [r7, #0] + uint32_t tickstart; + + /* Check Null pointer */ + if(RCC_ClkInitStruct == NULL) + 8000f42: 687b ldr r3, [r7, #4] + 8000f44: 2b00 cmp r3, #0 + 8000f46: d101 bne.n 8000f4c + { + return HAL_ERROR; + 8000f48: 2301 movs r3, #1 + 8000f4a: e0cc b.n 80010e6 + /* 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()) + 8000f4c: 4b68 ldr r3, [pc, #416] ; (80010f0 ) + 8000f4e: 681b ldr r3, [r3, #0] + 8000f50: f003 030f and.w r3, r3, #15 + 8000f54: 683a ldr r2, [r7, #0] + 8000f56: 429a cmp r2, r3 + 8000f58: d90c bls.n 8000f74 + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + 8000f5a: 4b65 ldr r3, [pc, #404] ; (80010f0 ) + 8000f5c: 683a ldr r2, [r7, #0] + 8000f5e: b2d2 uxtb r2, r2 + 8000f60: 701a strb r2, [r3, #0] + + /* 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) + 8000f62: 4b63 ldr r3, [pc, #396] ; (80010f0 ) + 8000f64: 681b ldr r3, [r3, #0] + 8000f66: f003 030f and.w r3, r3, #15 + 8000f6a: 683a ldr r2, [r7, #0] + 8000f6c: 429a cmp r2, r3 + 8000f6e: d001 beq.n 8000f74 + { + return HAL_ERROR; + 8000f70: 2301 movs r3, #1 + 8000f72: e0b8 b.n 80010e6 + } + } + + /*-------------------------- HCLK Configuration --------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + 8000f74: 687b ldr r3, [r7, #4] + 8000f76: 681b ldr r3, [r3, #0] + 8000f78: f003 0302 and.w r3, r3, #2 + 8000f7c: 2b00 cmp r3, #0 + 8000f7e: d020 beq.n 8000fc2 + { + /* 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) + 8000f80: 687b ldr r3, [r7, #4] + 8000f82: 681b ldr r3, [r3, #0] + 8000f84: f003 0304 and.w r3, r3, #4 + 8000f88: 2b00 cmp r3, #0 + 8000f8a: d005 beq.n 8000f98 + { + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); + 8000f8c: 4b59 ldr r3, [pc, #356] ; (80010f4 ) + 8000f8e: 689b ldr r3, [r3, #8] + 8000f90: 4a58 ldr r2, [pc, #352] ; (80010f4 ) + 8000f92: f443 53e0 orr.w r3, r3, #7168 ; 0x1c00 + 8000f96: 6093 str r3, [r2, #8] + } + + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + 8000f98: 687b ldr r3, [r7, #4] + 8000f9a: 681b ldr r3, [r3, #0] + 8000f9c: f003 0308 and.w r3, r3, #8 + 8000fa0: 2b00 cmp r3, #0 + 8000fa2: d005 beq.n 8000fb0 + { + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); + 8000fa4: 4b53 ldr r3, [pc, #332] ; (80010f4 ) + 8000fa6: 689b ldr r3, [r3, #8] + 8000fa8: 4a52 ldr r2, [pc, #328] ; (80010f4 ) + 8000faa: f443 4360 orr.w r3, r3, #57344 ; 0xe000 + 8000fae: 6093 str r3, [r2, #8] + } + + assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); + 8000fb0: 4b50 ldr r3, [pc, #320] ; (80010f4 ) + 8000fb2: 689b ldr r3, [r3, #8] + 8000fb4: f023 02f0 bic.w r2, r3, #240 ; 0xf0 + 8000fb8: 687b ldr r3, [r7, #4] + 8000fba: 689b ldr r3, [r3, #8] + 8000fbc: 494d ldr r1, [pc, #308] ; (80010f4 ) + 8000fbe: 4313 orrs r3, r2 + 8000fc0: 608b str r3, [r1, #8] + } + + /*------------------------- SYSCLK Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + 8000fc2: 687b ldr r3, [r7, #4] + 8000fc4: 681b ldr r3, [r3, #0] + 8000fc6: f003 0301 and.w r3, r3, #1 + 8000fca: 2b00 cmp r3, #0 + 8000fcc: d044 beq.n 8001058 + { + assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); + + /* HSE is selected as System Clock Source */ + if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + 8000fce: 687b ldr r3, [r7, #4] + 8000fd0: 685b ldr r3, [r3, #4] + 8000fd2: 2b01 cmp r3, #1 + 8000fd4: d107 bne.n 8000fe6 + { + /* Check the HSE ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + 8000fd6: 4b47 ldr r3, [pc, #284] ; (80010f4 ) + 8000fd8: 681b ldr r3, [r3, #0] + 8000fda: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8000fde: 2b00 cmp r3, #0 + 8000fe0: d119 bne.n 8001016 + { + return HAL_ERROR; + 8000fe2: 2301 movs r3, #1 + 8000fe4: e07f b.n 80010e6 + } + } + /* PLL is selected as System Clock Source */ + else if((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || + 8000fe6: 687b ldr r3, [r7, #4] + 8000fe8: 685b ldr r3, [r3, #4] + 8000fea: 2b02 cmp r3, #2 + 8000fec: d003 beq.n 8000ff6 + (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) + 8000fee: 687b ldr r3, [r7, #4] + 8000ff0: 685b ldr r3, [r3, #4] + else if((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || + 8000ff2: 2b03 cmp r3, #3 + 8000ff4: d107 bne.n 8001006 + { + /* Check the PLL ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + 8000ff6: 4b3f ldr r3, [pc, #252] ; (80010f4 ) + 8000ff8: 681b ldr r3, [r3, #0] + 8000ffa: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 8000ffe: 2b00 cmp r3, #0 + 8001000: d109 bne.n 8001016 + { + return HAL_ERROR; + 8001002: 2301 movs r3, #1 + 8001004: e06f b.n 80010e6 + } + /* HSI is selected as System Clock Source */ + else + { + /* Check the HSI ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + 8001006: 4b3b ldr r3, [pc, #236] ; (80010f4 ) + 8001008: 681b ldr r3, [r3, #0] + 800100a: f003 0302 and.w r3, r3, #2 + 800100e: 2b00 cmp r3, #0 + 8001010: d101 bne.n 8001016 + { + return HAL_ERROR; + 8001012: 2301 movs r3, #1 + 8001014: e067 b.n 80010e6 + } + } + + __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); + 8001016: 4b37 ldr r3, [pc, #220] ; (80010f4 ) + 8001018: 689b ldr r3, [r3, #8] + 800101a: f023 0203 bic.w r2, r3, #3 + 800101e: 687b ldr r3, [r7, #4] + 8001020: 685b ldr r3, [r3, #4] + 8001022: 4934 ldr r1, [pc, #208] ; (80010f4 ) + 8001024: 4313 orrs r3, r2 + 8001026: 608b str r3, [r1, #8] + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8001028: f7ff fcc2 bl 80009b0 + 800102c: 60f8 str r0, [r7, #12] + + while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + 800102e: e00a b.n 8001046 + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + 8001030: f7ff fcbe bl 80009b0 + 8001034: 4602 mov r2, r0 + 8001036: 68fb ldr r3, [r7, #12] + 8001038: 1ad3 subs r3, r2, r3 + 800103a: f241 3288 movw r2, #5000 ; 0x1388 + 800103e: 4293 cmp r3, r2 + 8001040: d901 bls.n 8001046 + { + return HAL_TIMEOUT; + 8001042: 2303 movs r3, #3 + 8001044: e04f b.n 80010e6 + while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + 8001046: 4b2b ldr r3, [pc, #172] ; (80010f4 ) + 8001048: 689b ldr r3, [r3, #8] + 800104a: f003 020c and.w r2, r3, #12 + 800104e: 687b ldr r3, [r7, #4] + 8001050: 685b ldr r3, [r3, #4] + 8001052: 009b lsls r3, r3, #2 + 8001054: 429a cmp r2, r3 + 8001056: d1eb bne.n 8001030 + } + } + } + + /* Decreasing the number of wait states because of lower CPU frequency */ + if(FLatency < __HAL_FLASH_GET_LATENCY()) + 8001058: 4b25 ldr r3, [pc, #148] ; (80010f0 ) + 800105a: 681b ldr r3, [r3, #0] + 800105c: f003 030f and.w r3, r3, #15 + 8001060: 683a ldr r2, [r7, #0] + 8001062: 429a cmp r2, r3 + 8001064: d20c bcs.n 8001080 + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + 8001066: 4b22 ldr r3, [pc, #136] ; (80010f0 ) + 8001068: 683a ldr r2, [r7, #0] + 800106a: b2d2 uxtb r2, r2 + 800106c: 701a strb r2, [r3, #0] + + /* 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) + 800106e: 4b20 ldr r3, [pc, #128] ; (80010f0 ) + 8001070: 681b ldr r3, [r3, #0] + 8001072: f003 030f and.w r3, r3, #15 + 8001076: 683a ldr r2, [r7, #0] + 8001078: 429a cmp r2, r3 + 800107a: d001 beq.n 8001080 + { + return HAL_ERROR; + 800107c: 2301 movs r3, #1 + 800107e: e032 b.n 80010e6 + } + } + + /*-------------------------- PCLK1 Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + 8001080: 687b ldr r3, [r7, #4] + 8001082: 681b ldr r3, [r3, #0] + 8001084: f003 0304 and.w r3, r3, #4 + 8001088: 2b00 cmp r3, #0 + 800108a: d008 beq.n 800109e + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); + 800108c: 4b19 ldr r3, [pc, #100] ; (80010f4 ) + 800108e: 689b ldr r3, [r3, #8] + 8001090: f423 52e0 bic.w r2, r3, #7168 ; 0x1c00 + 8001094: 687b ldr r3, [r7, #4] + 8001096: 68db ldr r3, [r3, #12] + 8001098: 4916 ldr r1, [pc, #88] ; (80010f4 ) + 800109a: 4313 orrs r3, r2 + 800109c: 608b str r3, [r1, #8] + } + + /*-------------------------- PCLK2 Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + 800109e: 687b ldr r3, [r7, #4] + 80010a0: 681b ldr r3, [r3, #0] + 80010a2: f003 0308 and.w r3, r3, #8 + 80010a6: 2b00 cmp r3, #0 + 80010a8: d009 beq.n 80010be + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); + 80010aa: 4b12 ldr r3, [pc, #72] ; (80010f4 ) + 80010ac: 689b ldr r3, [r3, #8] + 80010ae: f423 4260 bic.w r2, r3, #57344 ; 0xe000 + 80010b2: 687b ldr r3, [r7, #4] + 80010b4: 691b ldr r3, [r3, #16] + 80010b6: 00db lsls r3, r3, #3 + 80010b8: 490e ldr r1, [pc, #56] ; (80010f4 ) + 80010ba: 4313 orrs r3, r2 + 80010bc: 608b str r3, [r1, #8] + } + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + 80010be: f000 f821 bl 8001104 + 80010c2: 4602 mov r2, r0 + 80010c4: 4b0b ldr r3, [pc, #44] ; (80010f4 ) + 80010c6: 689b ldr r3, [r3, #8] + 80010c8: 091b lsrs r3, r3, #4 + 80010ca: f003 030f and.w r3, r3, #15 + 80010ce: 490a ldr r1, [pc, #40] ; (80010f8 ) + 80010d0: 5ccb ldrb r3, [r1, r3] + 80010d2: fa22 f303 lsr.w r3, r2, r3 + 80010d6: 4a09 ldr r2, [pc, #36] ; (80010fc ) + 80010d8: 6013 str r3, [r2, #0] + + /* Configure the source of time base considering new system clocks settings */ + HAL_InitTick (uwTickPrio); + 80010da: 4b09 ldr r3, [pc, #36] ; (8001100 ) + 80010dc: 681b ldr r3, [r3, #0] + 80010de: 4618 mov r0, r3 + 80010e0: f7ff fc22 bl 8000928 + + return HAL_OK; + 80010e4: 2300 movs r3, #0 +} + 80010e6: 4618 mov r0, r3 + 80010e8: 3710 adds r7, #16 + 80010ea: 46bd mov sp, r7 + 80010ec: bd80 pop {r7, pc} + 80010ee: bf00 nop + 80010f0: 40023c00 .word 0x40023c00 + 80010f4: 40023800 .word 0x40023800 + 80010f8: 08003044 .word 0x08003044 + 80010fc: 20000000 .word 0x20000000 + 8001100: 20000004 .word 0x20000004 + +08001104 : + * + * + * @retval SYSCLK frequency + */ +uint32_t HAL_RCC_GetSysClockFreq(void) +{ + 8001104: e92d 4fb0 stmdb sp!, {r4, r5, r7, r8, r9, sl, fp, lr} + 8001108: b0ae sub sp, #184 ; 0xb8 + 800110a: af00 add r7, sp, #0 + uint32_t pllm = 0U; + 800110c: 2300 movs r3, #0 + 800110e: f8c7 30ac str.w r3, [r7, #172] ; 0xac + uint32_t pllvco = 0U; + 8001112: 2300 movs r3, #0 + 8001114: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + uint32_t pllp = 0U; + 8001118: 2300 movs r3, #0 + 800111a: f8c7 30a8 str.w r3, [r7, #168] ; 0xa8 + uint32_t pllr = 0U; + 800111e: 2300 movs r3, #0 + 8001120: f8c7 30a4 str.w r3, [r7, #164] ; 0xa4 + uint32_t sysclockfreq = 0U; + 8001124: 2300 movs r3, #0 + 8001126: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + 800112a: 4bcb ldr r3, [pc, #812] ; (8001458 ) + 800112c: 689b ldr r3, [r3, #8] + 800112e: f003 030c and.w r3, r3, #12 + 8001132: 2b0c cmp r3, #12 + 8001134: f200 8206 bhi.w 8001544 + 8001138: a201 add r2, pc, #4 ; (adr r2, 8001140 ) + 800113a: f852 f023 ldr.w pc, [r2, r3, lsl #2] + 800113e: bf00 nop + 8001140: 08001175 .word 0x08001175 + 8001144: 08001545 .word 0x08001545 + 8001148: 08001545 .word 0x08001545 + 800114c: 08001545 .word 0x08001545 + 8001150: 0800117d .word 0x0800117d + 8001154: 08001545 .word 0x08001545 + 8001158: 08001545 .word 0x08001545 + 800115c: 08001545 .word 0x08001545 + 8001160: 08001185 .word 0x08001185 + 8001164: 08001545 .word 0x08001545 + 8001168: 08001545 .word 0x08001545 + 800116c: 08001545 .word 0x08001545 + 8001170: 08001375 .word 0x08001375 + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ + { + sysclockfreq = HSI_VALUE; + 8001174: 4bb9 ldr r3, [pc, #740] ; (800145c ) + 8001176: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + break; + 800117a: e1e7 b.n 800154c + } + case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ + { + sysclockfreq = HSE_VALUE; + 800117c: 4bb8 ldr r3, [pc, #736] ; (8001460 ) + 800117e: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + break; + 8001182: e1e3 b.n 800154c + } + 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; + 8001184: 4bb4 ldr r3, [pc, #720] ; (8001458 ) + 8001186: 685b ldr r3, [r3, #4] + 8001188: f003 033f and.w r3, r3, #63 ; 0x3f + 800118c: f8c7 30ac str.w r3, [r7, #172] ; 0xac + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + 8001190: 4bb1 ldr r3, [pc, #708] ; (8001458 ) + 8001192: 685b ldr r3, [r3, #4] + 8001194: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 8001198: 2b00 cmp r3, #0 + 800119a: d071 beq.n 8001280 + { + /* 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); + 800119c: 4bae ldr r3, [pc, #696] ; (8001458 ) + 800119e: 685b ldr r3, [r3, #4] + 80011a0: 099b lsrs r3, r3, #6 + 80011a2: 2200 movs r2, #0 + 80011a4: f8c7 3098 str.w r3, [r7, #152] ; 0x98 + 80011a8: f8c7 209c str.w r2, [r7, #156] ; 0x9c + 80011ac: f8d7 3098 ldr.w r3, [r7, #152] ; 0x98 + 80011b0: f3c3 0308 ubfx r3, r3, #0, #9 + 80011b4: f8c7 3090 str.w r3, [r7, #144] ; 0x90 + 80011b8: 2300 movs r3, #0 + 80011ba: f8c7 3094 str.w r3, [r7, #148] ; 0x94 + 80011be: e9d7 4524 ldrd r4, r5, [r7, #144] ; 0x90 + 80011c2: 4622 mov r2, r4 + 80011c4: 462b mov r3, r5 + 80011c6: f04f 0000 mov.w r0, #0 + 80011ca: f04f 0100 mov.w r1, #0 + 80011ce: 0159 lsls r1, r3, #5 + 80011d0: ea41 61d2 orr.w r1, r1, r2, lsr #27 + 80011d4: 0150 lsls r0, r2, #5 + 80011d6: 4602 mov r2, r0 + 80011d8: 460b mov r3, r1 + 80011da: 4621 mov r1, r4 + 80011dc: 1a51 subs r1, r2, r1 + 80011de: 6439 str r1, [r7, #64] ; 0x40 + 80011e0: 4629 mov r1, r5 + 80011e2: eb63 0301 sbc.w r3, r3, r1 + 80011e6: 647b str r3, [r7, #68] ; 0x44 + 80011e8: f04f 0200 mov.w r2, #0 + 80011ec: f04f 0300 mov.w r3, #0 + 80011f0: e9d7 8910 ldrd r8, r9, [r7, #64] ; 0x40 + 80011f4: 4649 mov r1, r9 + 80011f6: 018b lsls r3, r1, #6 + 80011f8: 4641 mov r1, r8 + 80011fa: ea43 6391 orr.w r3, r3, r1, lsr #26 + 80011fe: 4641 mov r1, r8 + 8001200: 018a lsls r2, r1, #6 + 8001202: 4641 mov r1, r8 + 8001204: 1a51 subs r1, r2, r1 + 8001206: 63b9 str r1, [r7, #56] ; 0x38 + 8001208: 4649 mov r1, r9 + 800120a: eb63 0301 sbc.w r3, r3, r1 + 800120e: 63fb str r3, [r7, #60] ; 0x3c + 8001210: f04f 0200 mov.w r2, #0 + 8001214: f04f 0300 mov.w r3, #0 + 8001218: e9d7 890e ldrd r8, r9, [r7, #56] ; 0x38 + 800121c: 4649 mov r1, r9 + 800121e: 00cb lsls r3, r1, #3 + 8001220: 4641 mov r1, r8 + 8001222: ea43 7351 orr.w r3, r3, r1, lsr #29 + 8001226: 4641 mov r1, r8 + 8001228: 00ca lsls r2, r1, #3 + 800122a: 4610 mov r0, r2 + 800122c: 4619 mov r1, r3 + 800122e: 4603 mov r3, r0 + 8001230: 4622 mov r2, r4 + 8001232: 189b adds r3, r3, r2 + 8001234: 633b str r3, [r7, #48] ; 0x30 + 8001236: 462b mov r3, r5 + 8001238: 460a mov r2, r1 + 800123a: eb42 0303 adc.w r3, r2, r3 + 800123e: 637b str r3, [r7, #52] ; 0x34 + 8001240: f04f 0200 mov.w r2, #0 + 8001244: f04f 0300 mov.w r3, #0 + 8001248: e9d7 450c ldrd r4, r5, [r7, #48] ; 0x30 + 800124c: 4629 mov r1, r5 + 800124e: 024b lsls r3, r1, #9 + 8001250: 4621 mov r1, r4 + 8001252: ea43 53d1 orr.w r3, r3, r1, lsr #23 + 8001256: 4621 mov r1, r4 + 8001258: 024a lsls r2, r1, #9 + 800125a: 4610 mov r0, r2 + 800125c: 4619 mov r1, r3 + 800125e: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac + 8001262: 2200 movs r2, #0 + 8001264: f8c7 3088 str.w r3, [r7, #136] ; 0x88 + 8001268: f8c7 208c str.w r2, [r7, #140] ; 0x8c + 800126c: e9d7 2322 ldrd r2, r3, [r7, #136] ; 0x88 + 8001270: f7fe ffce bl 8000210 <__aeabi_uldivmod> + 8001274: 4602 mov r2, r0 + 8001276: 460b mov r3, r1 + 8001278: 4613 mov r3, r2 + 800127a: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + 800127e: e067 b.n 8001350 + } + 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); + 8001280: 4b75 ldr r3, [pc, #468] ; (8001458 ) + 8001282: 685b ldr r3, [r3, #4] + 8001284: 099b lsrs r3, r3, #6 + 8001286: 2200 movs r2, #0 + 8001288: f8c7 3080 str.w r3, [r7, #128] ; 0x80 + 800128c: f8c7 2084 str.w r2, [r7, #132] ; 0x84 + 8001290: f8d7 3080 ldr.w r3, [r7, #128] ; 0x80 + 8001294: f3c3 0308 ubfx r3, r3, #0, #9 + 8001298: 67bb str r3, [r7, #120] ; 0x78 + 800129a: 2300 movs r3, #0 + 800129c: 67fb str r3, [r7, #124] ; 0x7c + 800129e: e9d7 451e ldrd r4, r5, [r7, #120] ; 0x78 + 80012a2: 4622 mov r2, r4 + 80012a4: 462b mov r3, r5 + 80012a6: f04f 0000 mov.w r0, #0 + 80012aa: f04f 0100 mov.w r1, #0 + 80012ae: 0159 lsls r1, r3, #5 + 80012b0: ea41 61d2 orr.w r1, r1, r2, lsr #27 + 80012b4: 0150 lsls r0, r2, #5 + 80012b6: 4602 mov r2, r0 + 80012b8: 460b mov r3, r1 + 80012ba: 4621 mov r1, r4 + 80012bc: 1a51 subs r1, r2, r1 + 80012be: 62b9 str r1, [r7, #40] ; 0x28 + 80012c0: 4629 mov r1, r5 + 80012c2: eb63 0301 sbc.w r3, r3, r1 + 80012c6: 62fb str r3, [r7, #44] ; 0x2c + 80012c8: f04f 0200 mov.w r2, #0 + 80012cc: f04f 0300 mov.w r3, #0 + 80012d0: e9d7 890a ldrd r8, r9, [r7, #40] ; 0x28 + 80012d4: 4649 mov r1, r9 + 80012d6: 018b lsls r3, r1, #6 + 80012d8: 4641 mov r1, r8 + 80012da: ea43 6391 orr.w r3, r3, r1, lsr #26 + 80012de: 4641 mov r1, r8 + 80012e0: 018a lsls r2, r1, #6 + 80012e2: 4641 mov r1, r8 + 80012e4: ebb2 0a01 subs.w sl, r2, r1 + 80012e8: 4649 mov r1, r9 + 80012ea: eb63 0b01 sbc.w fp, r3, r1 + 80012ee: f04f 0200 mov.w r2, #0 + 80012f2: f04f 0300 mov.w r3, #0 + 80012f6: ea4f 03cb mov.w r3, fp, lsl #3 + 80012fa: ea43 735a orr.w r3, r3, sl, lsr #29 + 80012fe: ea4f 02ca mov.w r2, sl, lsl #3 + 8001302: 4692 mov sl, r2 + 8001304: 469b mov fp, r3 + 8001306: 4623 mov r3, r4 + 8001308: eb1a 0303 adds.w r3, sl, r3 + 800130c: 623b str r3, [r7, #32] + 800130e: 462b mov r3, r5 + 8001310: eb4b 0303 adc.w r3, fp, r3 + 8001314: 627b str r3, [r7, #36] ; 0x24 + 8001316: f04f 0200 mov.w r2, #0 + 800131a: f04f 0300 mov.w r3, #0 + 800131e: e9d7 4508 ldrd r4, r5, [r7, #32] + 8001322: 4629 mov r1, r5 + 8001324: 028b lsls r3, r1, #10 + 8001326: 4621 mov r1, r4 + 8001328: ea43 5391 orr.w r3, r3, r1, lsr #22 + 800132c: 4621 mov r1, r4 + 800132e: 028a lsls r2, r1, #10 + 8001330: 4610 mov r0, r2 + 8001332: 4619 mov r1, r3 + 8001334: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac + 8001338: 2200 movs r2, #0 + 800133a: 673b str r3, [r7, #112] ; 0x70 + 800133c: 677a str r2, [r7, #116] ; 0x74 + 800133e: e9d7 231c ldrd r2, r3, [r7, #112] ; 0x70 + 8001342: f7fe ff65 bl 8000210 <__aeabi_uldivmod> + 8001346: 4602 mov r2, r0 + 8001348: 460b mov r3, r1 + 800134a: 4613 mov r3, r2 + 800134c: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + } + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); + 8001350: 4b41 ldr r3, [pc, #260] ; (8001458 ) + 8001352: 685b ldr r3, [r3, #4] + 8001354: 0c1b lsrs r3, r3, #16 + 8001356: f003 0303 and.w r3, r3, #3 + 800135a: 3301 adds r3, #1 + 800135c: 005b lsls r3, r3, #1 + 800135e: f8c7 30a8 str.w r3, [r7, #168] ; 0xa8 + + sysclockfreq = pllvco/pllp; + 8001362: f8d7 20b4 ldr.w r2, [r7, #180] ; 0xb4 + 8001366: f8d7 30a8 ldr.w r3, [r7, #168] ; 0xa8 + 800136a: fbb2 f3f3 udiv r3, r2, r3 + 800136e: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + break; + 8001372: e0eb b.n 800154c + } + 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; + 8001374: 4b38 ldr r3, [pc, #224] ; (8001458 ) + 8001376: 685b ldr r3, [r3, #4] + 8001378: f003 033f and.w r3, r3, #63 ; 0x3f + 800137c: f8c7 30ac str.w r3, [r7, #172] ; 0xac + if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) + 8001380: 4b35 ldr r3, [pc, #212] ; (8001458 ) + 8001382: 685b ldr r3, [r3, #4] + 8001384: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 8001388: 2b00 cmp r3, #0 + 800138a: d06b beq.n 8001464 + { + /* 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); + 800138c: 4b32 ldr r3, [pc, #200] ; (8001458 ) + 800138e: 685b ldr r3, [r3, #4] + 8001390: 099b lsrs r3, r3, #6 + 8001392: 2200 movs r2, #0 + 8001394: 66bb str r3, [r7, #104] ; 0x68 + 8001396: 66fa str r2, [r7, #108] ; 0x6c + 8001398: 6ebb ldr r3, [r7, #104] ; 0x68 + 800139a: f3c3 0308 ubfx r3, r3, #0, #9 + 800139e: 663b str r3, [r7, #96] ; 0x60 + 80013a0: 2300 movs r3, #0 + 80013a2: 667b str r3, [r7, #100] ; 0x64 + 80013a4: e9d7 4518 ldrd r4, r5, [r7, #96] ; 0x60 + 80013a8: 4622 mov r2, r4 + 80013aa: 462b mov r3, r5 + 80013ac: f04f 0000 mov.w r0, #0 + 80013b0: f04f 0100 mov.w r1, #0 + 80013b4: 0159 lsls r1, r3, #5 + 80013b6: ea41 61d2 orr.w r1, r1, r2, lsr #27 + 80013ba: 0150 lsls r0, r2, #5 + 80013bc: 4602 mov r2, r0 + 80013be: 460b mov r3, r1 + 80013c0: 4621 mov r1, r4 + 80013c2: 1a51 subs r1, r2, r1 + 80013c4: 61b9 str r1, [r7, #24] + 80013c6: 4629 mov r1, r5 + 80013c8: eb63 0301 sbc.w r3, r3, r1 + 80013cc: 61fb str r3, [r7, #28] + 80013ce: f04f 0200 mov.w r2, #0 + 80013d2: f04f 0300 mov.w r3, #0 + 80013d6: e9d7 ab06 ldrd sl, fp, [r7, #24] + 80013da: 4659 mov r1, fp + 80013dc: 018b lsls r3, r1, #6 + 80013de: 4651 mov r1, sl + 80013e0: ea43 6391 orr.w r3, r3, r1, lsr #26 + 80013e4: 4651 mov r1, sl + 80013e6: 018a lsls r2, r1, #6 + 80013e8: 4651 mov r1, sl + 80013ea: ebb2 0801 subs.w r8, r2, r1 + 80013ee: 4659 mov r1, fp + 80013f0: eb63 0901 sbc.w r9, r3, r1 + 80013f4: f04f 0200 mov.w r2, #0 + 80013f8: f04f 0300 mov.w r3, #0 + 80013fc: ea4f 03c9 mov.w r3, r9, lsl #3 + 8001400: ea43 7358 orr.w r3, r3, r8, lsr #29 + 8001404: ea4f 02c8 mov.w r2, r8, lsl #3 + 8001408: 4690 mov r8, r2 + 800140a: 4699 mov r9, r3 + 800140c: 4623 mov r3, r4 + 800140e: eb18 0303 adds.w r3, r8, r3 + 8001412: 613b str r3, [r7, #16] + 8001414: 462b mov r3, r5 + 8001416: eb49 0303 adc.w r3, r9, r3 + 800141a: 617b str r3, [r7, #20] + 800141c: f04f 0200 mov.w r2, #0 + 8001420: f04f 0300 mov.w r3, #0 + 8001424: e9d7 4504 ldrd r4, r5, [r7, #16] + 8001428: 4629 mov r1, r5 + 800142a: 024b lsls r3, r1, #9 + 800142c: 4621 mov r1, r4 + 800142e: ea43 53d1 orr.w r3, r3, r1, lsr #23 + 8001432: 4621 mov r1, r4 + 8001434: 024a lsls r2, r1, #9 + 8001436: 4610 mov r0, r2 + 8001438: 4619 mov r1, r3 + 800143a: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac + 800143e: 2200 movs r2, #0 + 8001440: 65bb str r3, [r7, #88] ; 0x58 + 8001442: 65fa str r2, [r7, #92] ; 0x5c + 8001444: e9d7 2316 ldrd r2, r3, [r7, #88] ; 0x58 + 8001448: f7fe fee2 bl 8000210 <__aeabi_uldivmod> + 800144c: 4602 mov r2, r0 + 800144e: 460b mov r3, r1 + 8001450: 4613 mov r3, r2 + 8001452: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + 8001456: e065 b.n 8001524 + 8001458: 40023800 .word 0x40023800 + 800145c: 00f42400 .word 0x00f42400 + 8001460: 007a1200 .word 0x007a1200 + } + 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); + 8001464: 4b3d ldr r3, [pc, #244] ; (800155c ) + 8001466: 685b ldr r3, [r3, #4] + 8001468: 099b lsrs r3, r3, #6 + 800146a: 2200 movs r2, #0 + 800146c: 4618 mov r0, r3 + 800146e: 4611 mov r1, r2 + 8001470: f3c0 0308 ubfx r3, r0, #0, #9 + 8001474: 653b str r3, [r7, #80] ; 0x50 + 8001476: 2300 movs r3, #0 + 8001478: 657b str r3, [r7, #84] ; 0x54 + 800147a: e9d7 8914 ldrd r8, r9, [r7, #80] ; 0x50 + 800147e: 4642 mov r2, r8 + 8001480: 464b mov r3, r9 + 8001482: f04f 0000 mov.w r0, #0 + 8001486: f04f 0100 mov.w r1, #0 + 800148a: 0159 lsls r1, r3, #5 + 800148c: ea41 61d2 orr.w r1, r1, r2, lsr #27 + 8001490: 0150 lsls r0, r2, #5 + 8001492: 4602 mov r2, r0 + 8001494: 460b mov r3, r1 + 8001496: 4641 mov r1, r8 + 8001498: 1a51 subs r1, r2, r1 + 800149a: 60b9 str r1, [r7, #8] + 800149c: 4649 mov r1, r9 + 800149e: eb63 0301 sbc.w r3, r3, r1 + 80014a2: 60fb str r3, [r7, #12] + 80014a4: f04f 0200 mov.w r2, #0 + 80014a8: f04f 0300 mov.w r3, #0 + 80014ac: e9d7 ab02 ldrd sl, fp, [r7, #8] + 80014b0: 4659 mov r1, fp + 80014b2: 018b lsls r3, r1, #6 + 80014b4: 4651 mov r1, sl + 80014b6: ea43 6391 orr.w r3, r3, r1, lsr #26 + 80014ba: 4651 mov r1, sl + 80014bc: 018a lsls r2, r1, #6 + 80014be: 4651 mov r1, sl + 80014c0: 1a54 subs r4, r2, r1 + 80014c2: 4659 mov r1, fp + 80014c4: eb63 0501 sbc.w r5, r3, r1 + 80014c8: f04f 0200 mov.w r2, #0 + 80014cc: f04f 0300 mov.w r3, #0 + 80014d0: 00eb lsls r3, r5, #3 + 80014d2: ea43 7354 orr.w r3, r3, r4, lsr #29 + 80014d6: 00e2 lsls r2, r4, #3 + 80014d8: 4614 mov r4, r2 + 80014da: 461d mov r5, r3 + 80014dc: 4643 mov r3, r8 + 80014de: 18e3 adds r3, r4, r3 + 80014e0: 603b str r3, [r7, #0] + 80014e2: 464b mov r3, r9 + 80014e4: eb45 0303 adc.w r3, r5, r3 + 80014e8: 607b str r3, [r7, #4] + 80014ea: f04f 0200 mov.w r2, #0 + 80014ee: f04f 0300 mov.w r3, #0 + 80014f2: e9d7 4500 ldrd r4, r5, [r7] + 80014f6: 4629 mov r1, r5 + 80014f8: 028b lsls r3, r1, #10 + 80014fa: 4621 mov r1, r4 + 80014fc: ea43 5391 orr.w r3, r3, r1, lsr #22 + 8001500: 4621 mov r1, r4 + 8001502: 028a lsls r2, r1, #10 + 8001504: 4610 mov r0, r2 + 8001506: 4619 mov r1, r3 + 8001508: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac + 800150c: 2200 movs r2, #0 + 800150e: 64bb str r3, [r7, #72] ; 0x48 + 8001510: 64fa str r2, [r7, #76] ; 0x4c + 8001512: e9d7 2312 ldrd r2, r3, [r7, #72] ; 0x48 + 8001516: f7fe fe7b bl 8000210 <__aeabi_uldivmod> + 800151a: 4602 mov r2, r0 + 800151c: 460b mov r3, r1 + 800151e: 4613 mov r3, r2 + 8001520: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + } + pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); + 8001524: 4b0d ldr r3, [pc, #52] ; (800155c ) + 8001526: 685b ldr r3, [r3, #4] + 8001528: 0f1b lsrs r3, r3, #28 + 800152a: f003 0307 and.w r3, r3, #7 + 800152e: f8c7 30a4 str.w r3, [r7, #164] ; 0xa4 + + sysclockfreq = pllvco/pllr; + 8001532: f8d7 20b4 ldr.w r2, [r7, #180] ; 0xb4 + 8001536: f8d7 30a4 ldr.w r3, [r7, #164] ; 0xa4 + 800153a: fbb2 f3f3 udiv r3, r2, r3 + 800153e: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + break; + 8001542: e003 b.n 800154c + } + default: + { + sysclockfreq = HSI_VALUE; + 8001544: 4b06 ldr r3, [pc, #24] ; (8001560 ) + 8001546: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + break; + 800154a: bf00 nop + } + } + return sysclockfreq; + 800154c: f8d7 30b0 ldr.w r3, [r7, #176] ; 0xb0 +} + 8001550: 4618 mov r0, r3 + 8001552: 37b8 adds r7, #184 ; 0xb8 + 8001554: 46bd mov sp, r7 + 8001556: e8bd 8fb0 ldmia.w sp!, {r4, r5, r7, r8, r9, sl, fp, pc} + 800155a: bf00 nop + 800155c: 40023800 .word 0x40023800 + 8001560: 00f42400 .word 0x00f42400 + +08001564 : + * @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) +{ + 8001564: b580 push {r7, lr} + 8001566: b086 sub sp, #24 + 8001568: af00 add r7, sp, #0 + 800156a: 6078 str r0, [r7, #4] + uint32_t tickstart, pll_config; + + /* Check Null pointer */ + if(RCC_OscInitStruct == NULL) + 800156c: 687b ldr r3, [r7, #4] + 800156e: 2b00 cmp r3, #0 + 8001570: d101 bne.n 8001576 + { + return HAL_ERROR; + 8001572: 2301 movs r3, #1 + 8001574: e28d b.n 8001a92 + } + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + /*------------------------------- HSE Configuration ------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + 8001576: 687b ldr r3, [r7, #4] + 8001578: 681b ldr r3, [r3, #0] + 800157a: f003 0301 and.w r3, r3, #1 + 800157e: 2b00 cmp r3, #0 + 8001580: f000 8083 beq.w 800168a + { + /* 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) ||\ + 8001584: 4b94 ldr r3, [pc, #592] ; (80017d8 ) + 8001586: 689b ldr r3, [r3, #8] + 8001588: f003 030c and.w r3, r3, #12 + 800158c: 2b04 cmp r3, #4 + 800158e: d019 beq.n 80015c4 + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ + 8001590: 4b91 ldr r3, [pc, #580] ; (80017d8 ) + 8001592: 689b ldr r3, [r3, #8] + 8001594: f003 030c and.w r3, r3, #12 + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ + 8001598: 2b08 cmp r3, #8 + 800159a: d106 bne.n 80015aa + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ + 800159c: 4b8e ldr r3, [pc, #568] ; (80017d8 ) + 800159e: 685b ldr r3, [r3, #4] + 80015a0: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 80015a4: f5b3 0f80 cmp.w r3, #4194304 ; 0x400000 + 80015a8: d00c beq.n 80015c4 + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + 80015aa: 4b8b ldr r3, [pc, #556] ; (80017d8 ) + 80015ac: 689b ldr r3, [r3, #8] + 80015ae: f003 030c and.w r3, r3, #12 + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ + 80015b2: 2b0c cmp r3, #12 + 80015b4: d112 bne.n 80015dc + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + 80015b6: 4b88 ldr r3, [pc, #544] ; (80017d8 ) + 80015b8: 685b ldr r3, [r3, #4] + 80015ba: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 80015be: f5b3 0f80 cmp.w r3, #4194304 ; 0x400000 + 80015c2: d10b bne.n 80015dc +#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)) + 80015c4: 4b84 ldr r3, [pc, #528] ; (80017d8 ) + 80015c6: 681b ldr r3, [r3, #0] + 80015c8: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 80015cc: 2b00 cmp r3, #0 + 80015ce: d05b beq.n 8001688 + 80015d0: 687b ldr r3, [r7, #4] + 80015d2: 685b ldr r3, [r3, #4] + 80015d4: 2b00 cmp r3, #0 + 80015d6: d157 bne.n 8001688 + { + return HAL_ERROR; + 80015d8: 2301 movs r3, #1 + 80015da: e25a b.n 8001a92 + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + 80015dc: 687b ldr r3, [r7, #4] + 80015de: 685b ldr r3, [r3, #4] + 80015e0: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 + 80015e4: d106 bne.n 80015f4 + 80015e6: 4b7c ldr r3, [pc, #496] ; (80017d8 ) + 80015e8: 681b ldr r3, [r3, #0] + 80015ea: 4a7b ldr r2, [pc, #492] ; (80017d8 ) + 80015ec: f443 3380 orr.w r3, r3, #65536 ; 0x10000 + 80015f0: 6013 str r3, [r2, #0] + 80015f2: e01d b.n 8001630 + 80015f4: 687b ldr r3, [r7, #4] + 80015f6: 685b ldr r3, [r3, #4] + 80015f8: f5b3 2fa0 cmp.w r3, #327680 ; 0x50000 + 80015fc: d10c bne.n 8001618 + 80015fe: 4b76 ldr r3, [pc, #472] ; (80017d8 ) + 8001600: 681b ldr r3, [r3, #0] + 8001602: 4a75 ldr r2, [pc, #468] ; (80017d8 ) + 8001604: f443 2380 orr.w r3, r3, #262144 ; 0x40000 + 8001608: 6013 str r3, [r2, #0] + 800160a: 4b73 ldr r3, [pc, #460] ; (80017d8 ) + 800160c: 681b ldr r3, [r3, #0] + 800160e: 4a72 ldr r2, [pc, #456] ; (80017d8 ) + 8001610: f443 3380 orr.w r3, r3, #65536 ; 0x10000 + 8001614: 6013 str r3, [r2, #0] + 8001616: e00b b.n 8001630 + 8001618: 4b6f ldr r3, [pc, #444] ; (80017d8 ) + 800161a: 681b ldr r3, [r3, #0] + 800161c: 4a6e ldr r2, [pc, #440] ; (80017d8 ) + 800161e: f423 3380 bic.w r3, r3, #65536 ; 0x10000 + 8001622: 6013 str r3, [r2, #0] + 8001624: 4b6c ldr r3, [pc, #432] ; (80017d8 ) + 8001626: 681b ldr r3, [r3, #0] + 8001628: 4a6b ldr r2, [pc, #428] ; (80017d8 ) + 800162a: f423 2380 bic.w r3, r3, #262144 ; 0x40000 + 800162e: 6013 str r3, [r2, #0] + + /* Check the HSE State */ + if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) + 8001630: 687b ldr r3, [r7, #4] + 8001632: 685b ldr r3, [r3, #4] + 8001634: 2b00 cmp r3, #0 + 8001636: d013 beq.n 8001660 + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 8001638: f7ff f9ba bl 80009b0 + 800163c: 6138 str r0, [r7, #16] + + /* Wait till HSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + 800163e: e008 b.n 8001652 + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + 8001640: f7ff f9b6 bl 80009b0 + 8001644: 4602 mov r2, r0 + 8001646: 693b ldr r3, [r7, #16] + 8001648: 1ad3 subs r3, r2, r3 + 800164a: 2b64 cmp r3, #100 ; 0x64 + 800164c: d901 bls.n 8001652 + { + return HAL_TIMEOUT; + 800164e: 2303 movs r3, #3 + 8001650: e21f b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + 8001652: 4b61 ldr r3, [pc, #388] ; (80017d8 ) + 8001654: 681b ldr r3, [r3, #0] + 8001656: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 800165a: 2b00 cmp r3, #0 + 800165c: d0f0 beq.n 8001640 + 800165e: e014 b.n 800168a + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 8001660: f7ff f9a6 bl 80009b0 + 8001664: 6138 str r0, [r7, #16] + + /* Wait till HSE is bypassed or disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + 8001666: e008 b.n 800167a + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + 8001668: f7ff f9a2 bl 80009b0 + 800166c: 4602 mov r2, r0 + 800166e: 693b ldr r3, [r7, #16] + 8001670: 1ad3 subs r3, r2, r3 + 8001672: 2b64 cmp r3, #100 ; 0x64 + 8001674: d901 bls.n 800167a + { + return HAL_TIMEOUT; + 8001676: 2303 movs r3, #3 + 8001678: e20b b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + 800167a: 4b57 ldr r3, [pc, #348] ; (80017d8 ) + 800167c: 681b ldr r3, [r3, #0] + 800167e: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8001682: 2b00 cmp r3, #0 + 8001684: d1f0 bne.n 8001668 + 8001686: e000 b.n 800168a + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + 8001688: bf00 nop + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + 800168a: 687b ldr r3, [r7, #4] + 800168c: 681b ldr r3, [r3, #0] + 800168e: f003 0302 and.w r3, r3, #2 + 8001692: 2b00 cmp r3, #0 + 8001694: d06f beq.n 8001776 + 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) ||\ + 8001696: 4b50 ldr r3, [pc, #320] ; (80017d8 ) + 8001698: 689b ldr r3, [r3, #8] + 800169a: f003 030c and.w r3, r3, #12 + 800169e: 2b00 cmp r3, #0 + 80016a0: d017 beq.n 80016d2 + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ + 80016a2: 4b4d ldr r3, [pc, #308] ; (80017d8 ) + 80016a4: 689b ldr r3, [r3, #8] + 80016a6: f003 030c and.w r3, r3, #12 + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ + 80016aa: 2b08 cmp r3, #8 + 80016ac: d105 bne.n 80016ba + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ + 80016ae: 4b4a ldr r3, [pc, #296] ; (80017d8 ) + 80016b0: 685b ldr r3, [r3, #4] + 80016b2: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 80016b6: 2b00 cmp r3, #0 + 80016b8: d00b beq.n 80016d2 + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + 80016ba: 4b47 ldr r3, [pc, #284] ; (80017d8 ) + 80016bc: 689b ldr r3, [r3, #8] + 80016be: f003 030c and.w r3, r3, #12 + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ + 80016c2: 2b0c cmp r3, #12 + 80016c4: d11c bne.n 8001700 + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + 80016c6: 4b44 ldr r3, [pc, #272] ; (80017d8 ) + 80016c8: 685b ldr r3, [r3, #4] + 80016ca: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 80016ce: 2b00 cmp r3, #0 + 80016d0: d116 bne.n 8001700 + 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)) + 80016d2: 4b41 ldr r3, [pc, #260] ; (80017d8 ) + 80016d4: 681b ldr r3, [r3, #0] + 80016d6: f003 0302 and.w r3, r3, #2 + 80016da: 2b00 cmp r3, #0 + 80016dc: d005 beq.n 80016ea + 80016de: 687b ldr r3, [r7, #4] + 80016e0: 68db ldr r3, [r3, #12] + 80016e2: 2b01 cmp r3, #1 + 80016e4: d001 beq.n 80016ea + { + return HAL_ERROR; + 80016e6: 2301 movs r3, #1 + 80016e8: e1d3 b.n 8001a92 + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + 80016ea: 4b3b ldr r3, [pc, #236] ; (80017d8 ) + 80016ec: 681b ldr r3, [r3, #0] + 80016ee: f023 02f8 bic.w r2, r3, #248 ; 0xf8 + 80016f2: 687b ldr r3, [r7, #4] + 80016f4: 691b ldr r3, [r3, #16] + 80016f6: 00db lsls r3, r3, #3 + 80016f8: 4937 ldr r1, [pc, #220] ; (80017d8 ) + 80016fa: 4313 orrs r3, r2 + 80016fc: 600b str r3, [r1, #0] + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + 80016fe: e03a b.n 8001776 + } + } + else + { + /* Check the HSI State */ + if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + 8001700: 687b ldr r3, [r7, #4] + 8001702: 68db ldr r3, [r3, #12] + 8001704: 2b00 cmp r3, #0 + 8001706: d020 beq.n 800174a + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + 8001708: 4b34 ldr r3, [pc, #208] ; (80017dc ) + 800170a: 2201 movs r2, #1 + 800170c: 601a str r2, [r3, #0] + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 800170e: f7ff f94f bl 80009b0 + 8001712: 6138 str r0, [r7, #16] + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + 8001714: e008 b.n 8001728 + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + 8001716: f7ff f94b bl 80009b0 + 800171a: 4602 mov r2, r0 + 800171c: 693b ldr r3, [r7, #16] + 800171e: 1ad3 subs r3, r2, r3 + 8001720: 2b02 cmp r3, #2 + 8001722: d901 bls.n 8001728 + { + return HAL_TIMEOUT; + 8001724: 2303 movs r3, #3 + 8001726: e1b4 b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + 8001728: 4b2b ldr r3, [pc, #172] ; (80017d8 ) + 800172a: 681b ldr r3, [r3, #0] + 800172c: f003 0302 and.w r3, r3, #2 + 8001730: 2b00 cmp r3, #0 + 8001732: d0f0 beq.n 8001716 + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + 8001734: 4b28 ldr r3, [pc, #160] ; (80017d8 ) + 8001736: 681b ldr r3, [r3, #0] + 8001738: f023 02f8 bic.w r2, r3, #248 ; 0xf8 + 800173c: 687b ldr r3, [r7, #4] + 800173e: 691b ldr r3, [r3, #16] + 8001740: 00db lsls r3, r3, #3 + 8001742: 4925 ldr r1, [pc, #148] ; (80017d8 ) + 8001744: 4313 orrs r3, r2 + 8001746: 600b str r3, [r1, #0] + 8001748: e015 b.n 8001776 + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + 800174a: 4b24 ldr r3, [pc, #144] ; (80017dc ) + 800174c: 2200 movs r2, #0 + 800174e: 601a str r2, [r3, #0] + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 8001750: f7ff f92e bl 80009b0 + 8001754: 6138 str r0, [r7, #16] + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + 8001756: e008 b.n 800176a + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + 8001758: f7ff f92a bl 80009b0 + 800175c: 4602 mov r2, r0 + 800175e: 693b ldr r3, [r7, #16] + 8001760: 1ad3 subs r3, r2, r3 + 8001762: 2b02 cmp r3, #2 + 8001764: d901 bls.n 800176a + { + return HAL_TIMEOUT; + 8001766: 2303 movs r3, #3 + 8001768: e193 b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + 800176a: 4b1b ldr r3, [pc, #108] ; (80017d8 ) + 800176c: 681b ldr r3, [r3, #0] + 800176e: f003 0302 and.w r3, r3, #2 + 8001772: 2b00 cmp r3, #0 + 8001774: d1f0 bne.n 8001758 + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + 8001776: 687b ldr r3, [r7, #4] + 8001778: 681b ldr r3, [r3, #0] + 800177a: f003 0308 and.w r3, r3, #8 + 800177e: 2b00 cmp r3, #0 + 8001780: d036 beq.n 80017f0 + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + 8001782: 687b ldr r3, [r7, #4] + 8001784: 695b ldr r3, [r3, #20] + 8001786: 2b00 cmp r3, #0 + 8001788: d016 beq.n 80017b8 + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + 800178a: 4b15 ldr r3, [pc, #84] ; (80017e0 ) + 800178c: 2201 movs r2, #1 + 800178e: 601a str r2, [r3, #0] + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 8001790: f7ff f90e bl 80009b0 + 8001794: 6138 str r0, [r7, #16] + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + 8001796: e008 b.n 80017aa + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + 8001798: f7ff f90a bl 80009b0 + 800179c: 4602 mov r2, r0 + 800179e: 693b ldr r3, [r7, #16] + 80017a0: 1ad3 subs r3, r2, r3 + 80017a2: 2b02 cmp r3, #2 + 80017a4: d901 bls.n 80017aa + { + return HAL_TIMEOUT; + 80017a6: 2303 movs r3, #3 + 80017a8: e173 b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + 80017aa: 4b0b ldr r3, [pc, #44] ; (80017d8 ) + 80017ac: 6f5b ldr r3, [r3, #116] ; 0x74 + 80017ae: f003 0302 and.w r3, r3, #2 + 80017b2: 2b00 cmp r3, #0 + 80017b4: d0f0 beq.n 8001798 + 80017b6: e01b b.n 80017f0 + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + 80017b8: 4b09 ldr r3, [pc, #36] ; (80017e0 ) + 80017ba: 2200 movs r2, #0 + 80017bc: 601a str r2, [r3, #0] + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 80017be: f7ff f8f7 bl 80009b0 + 80017c2: 6138 str r0, [r7, #16] + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + 80017c4: e00e b.n 80017e4 + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + 80017c6: f7ff f8f3 bl 80009b0 + 80017ca: 4602 mov r2, r0 + 80017cc: 693b ldr r3, [r7, #16] + 80017ce: 1ad3 subs r3, r2, r3 + 80017d0: 2b02 cmp r3, #2 + 80017d2: d907 bls.n 80017e4 + { + return HAL_TIMEOUT; + 80017d4: 2303 movs r3, #3 + 80017d6: e15c b.n 8001a92 + 80017d8: 40023800 .word 0x40023800 + 80017dc: 42470000 .word 0x42470000 + 80017e0: 42470e80 .word 0x42470e80 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + 80017e4: 4b8a ldr r3, [pc, #552] ; (8001a10 ) + 80017e6: 6f5b ldr r3, [r3, #116] ; 0x74 + 80017e8: f003 0302 and.w r3, r3, #2 + 80017ec: 2b00 cmp r3, #0 + 80017ee: d1ea bne.n 80017c6 + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + 80017f0: 687b ldr r3, [r7, #4] + 80017f2: 681b ldr r3, [r3, #0] + 80017f4: f003 0304 and.w r3, r3, #4 + 80017f8: 2b00 cmp r3, #0 + 80017fa: f000 8097 beq.w 800192c + { + FlagStatus pwrclkchanged = RESET; + 80017fe: 2300 movs r3, #0 + 8001800: 75fb strb r3, [r7, #23] + /* 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()) + 8001802: 4b83 ldr r3, [pc, #524] ; (8001a10 ) + 8001804: 6c1b ldr r3, [r3, #64] ; 0x40 + 8001806: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 800180a: 2b00 cmp r3, #0 + 800180c: d10f bne.n 800182e + { + __HAL_RCC_PWR_CLK_ENABLE(); + 800180e: 2300 movs r3, #0 + 8001810: 60bb str r3, [r7, #8] + 8001812: 4b7f ldr r3, [pc, #508] ; (8001a10 ) + 8001814: 6c1b ldr r3, [r3, #64] ; 0x40 + 8001816: 4a7e ldr r2, [pc, #504] ; (8001a10 ) + 8001818: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 + 800181c: 6413 str r3, [r2, #64] ; 0x40 + 800181e: 4b7c ldr r3, [pc, #496] ; (8001a10 ) + 8001820: 6c1b ldr r3, [r3, #64] ; 0x40 + 8001822: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 8001826: 60bb str r3, [r7, #8] + 8001828: 68bb ldr r3, [r7, #8] + pwrclkchanged = SET; + 800182a: 2301 movs r3, #1 + 800182c: 75fb strb r3, [r7, #23] + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 800182e: 4b79 ldr r3, [pc, #484] ; (8001a14 ) + 8001830: 681b ldr r3, [r3, #0] + 8001832: f403 7380 and.w r3, r3, #256 ; 0x100 + 8001836: 2b00 cmp r3, #0 + 8001838: d118 bne.n 800186c + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + 800183a: 4b76 ldr r3, [pc, #472] ; (8001a14 ) + 800183c: 681b ldr r3, [r3, #0] + 800183e: 4a75 ldr r2, [pc, #468] ; (8001a14 ) + 8001840: f443 7380 orr.w r3, r3, #256 ; 0x100 + 8001844: 6013 str r3, [r2, #0] + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + 8001846: f7ff f8b3 bl 80009b0 + 800184a: 6138 str r0, [r7, #16] + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 800184c: e008 b.n 8001860 + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + 800184e: f7ff f8af bl 80009b0 + 8001852: 4602 mov r2, r0 + 8001854: 693b ldr r3, [r7, #16] + 8001856: 1ad3 subs r3, r2, r3 + 8001858: 2b02 cmp r3, #2 + 800185a: d901 bls.n 8001860 + { + return HAL_TIMEOUT; + 800185c: 2303 movs r3, #3 + 800185e: e118 b.n 8001a92 + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 8001860: 4b6c ldr r3, [pc, #432] ; (8001a14 ) + 8001862: 681b ldr r3, [r3, #0] + 8001864: f403 7380 and.w r3, r3, #256 ; 0x100 + 8001868: 2b00 cmp r3, #0 + 800186a: d0f0 beq.n 800184e + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + 800186c: 687b ldr r3, [r7, #4] + 800186e: 689b ldr r3, [r3, #8] + 8001870: 2b01 cmp r3, #1 + 8001872: d106 bne.n 8001882 + 8001874: 4b66 ldr r3, [pc, #408] ; (8001a10 ) + 8001876: 6f1b ldr r3, [r3, #112] ; 0x70 + 8001878: 4a65 ldr r2, [pc, #404] ; (8001a10 ) + 800187a: f043 0301 orr.w r3, r3, #1 + 800187e: 6713 str r3, [r2, #112] ; 0x70 + 8001880: e01c b.n 80018bc + 8001882: 687b ldr r3, [r7, #4] + 8001884: 689b ldr r3, [r3, #8] + 8001886: 2b05 cmp r3, #5 + 8001888: d10c bne.n 80018a4 + 800188a: 4b61 ldr r3, [pc, #388] ; (8001a10 ) + 800188c: 6f1b ldr r3, [r3, #112] ; 0x70 + 800188e: 4a60 ldr r2, [pc, #384] ; (8001a10 ) + 8001890: f043 0304 orr.w r3, r3, #4 + 8001894: 6713 str r3, [r2, #112] ; 0x70 + 8001896: 4b5e ldr r3, [pc, #376] ; (8001a10 ) + 8001898: 6f1b ldr r3, [r3, #112] ; 0x70 + 800189a: 4a5d ldr r2, [pc, #372] ; (8001a10 ) + 800189c: f043 0301 orr.w r3, r3, #1 + 80018a0: 6713 str r3, [r2, #112] ; 0x70 + 80018a2: e00b b.n 80018bc + 80018a4: 4b5a ldr r3, [pc, #360] ; (8001a10 ) + 80018a6: 6f1b ldr r3, [r3, #112] ; 0x70 + 80018a8: 4a59 ldr r2, [pc, #356] ; (8001a10 ) + 80018aa: f023 0301 bic.w r3, r3, #1 + 80018ae: 6713 str r3, [r2, #112] ; 0x70 + 80018b0: 4b57 ldr r3, [pc, #348] ; (8001a10 ) + 80018b2: 6f1b ldr r3, [r3, #112] ; 0x70 + 80018b4: 4a56 ldr r2, [pc, #344] ; (8001a10 ) + 80018b6: f023 0304 bic.w r3, r3, #4 + 80018ba: 6713 str r3, [r2, #112] ; 0x70 + /* Check the LSE State */ + if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + 80018bc: 687b ldr r3, [r7, #4] + 80018be: 689b ldr r3, [r3, #8] + 80018c0: 2b00 cmp r3, #0 + 80018c2: d015 beq.n 80018f0 + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 80018c4: f7ff f874 bl 80009b0 + 80018c8: 6138 str r0, [r7, #16] + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + 80018ca: e00a b.n 80018e2 + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + 80018cc: f7ff f870 bl 80009b0 + 80018d0: 4602 mov r2, r0 + 80018d2: 693b ldr r3, [r7, #16] + 80018d4: 1ad3 subs r3, r2, r3 + 80018d6: f241 3288 movw r2, #5000 ; 0x1388 + 80018da: 4293 cmp r3, r2 + 80018dc: d901 bls.n 80018e2 + { + return HAL_TIMEOUT; + 80018de: 2303 movs r3, #3 + 80018e0: e0d7 b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + 80018e2: 4b4b ldr r3, [pc, #300] ; (8001a10 ) + 80018e4: 6f1b ldr r3, [r3, #112] ; 0x70 + 80018e6: f003 0302 and.w r3, r3, #2 + 80018ea: 2b00 cmp r3, #0 + 80018ec: d0ee beq.n 80018cc + 80018ee: e014 b.n 800191a + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 80018f0: f7ff f85e bl 80009b0 + 80018f4: 6138 str r0, [r7, #16] + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + 80018f6: e00a b.n 800190e + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + 80018f8: f7ff f85a bl 80009b0 + 80018fc: 4602 mov r2, r0 + 80018fe: 693b ldr r3, [r7, #16] + 8001900: 1ad3 subs r3, r2, r3 + 8001902: f241 3288 movw r2, #5000 ; 0x1388 + 8001906: 4293 cmp r3, r2 + 8001908: d901 bls.n 800190e + { + return HAL_TIMEOUT; + 800190a: 2303 movs r3, #3 + 800190c: e0c1 b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + 800190e: 4b40 ldr r3, [pc, #256] ; (8001a10 ) + 8001910: 6f1b ldr r3, [r3, #112] ; 0x70 + 8001912: f003 0302 and.w r3, r3, #2 + 8001916: 2b00 cmp r3, #0 + 8001918: d1ee bne.n 80018f8 + } + } + } + + /* Restore clock configuration if changed */ + if(pwrclkchanged == SET) + 800191a: 7dfb ldrb r3, [r7, #23] + 800191c: 2b01 cmp r3, #1 + 800191e: d105 bne.n 800192c + { + __HAL_RCC_PWR_CLK_DISABLE(); + 8001920: 4b3b ldr r3, [pc, #236] ; (8001a10 ) + 8001922: 6c1b ldr r3, [r3, #64] ; 0x40 + 8001924: 4a3a ldr r2, [pc, #232] ; (8001a10 ) + 8001926: f023 5380 bic.w r3, r3, #268435456 ; 0x10000000 + 800192a: 6413 str r3, [r2, #64] ; 0x40 + } + } + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + 800192c: 687b ldr r3, [r7, #4] + 800192e: 699b ldr r3, [r3, #24] + 8001930: 2b00 cmp r3, #0 + 8001932: f000 80ad beq.w 8001a90 + { + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + 8001936: 4b36 ldr r3, [pc, #216] ; (8001a10 ) + 8001938: 689b ldr r3, [r3, #8] + 800193a: f003 030c and.w r3, r3, #12 + 800193e: 2b08 cmp r3, #8 + 8001940: d060 beq.n 8001a04 + { + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + 8001942: 687b ldr r3, [r7, #4] + 8001944: 699b ldr r3, [r3, #24] + 8001946: 2b02 cmp r3, #2 + 8001948: d145 bne.n 80019d6 + 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(); + 800194a: 4b33 ldr r3, [pc, #204] ; (8001a18 ) + 800194c: 2200 movs r2, #0 + 800194e: 601a str r2, [r3, #0] + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 8001950: f7ff f82e bl 80009b0 + 8001954: 6138 str r0, [r7, #16] + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + 8001956: e008 b.n 800196a + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + 8001958: f7ff f82a bl 80009b0 + 800195c: 4602 mov r2, r0 + 800195e: 693b ldr r3, [r7, #16] + 8001960: 1ad3 subs r3, r2, r3 + 8001962: 2b02 cmp r3, #2 + 8001964: d901 bls.n 800196a + { + return HAL_TIMEOUT; + 8001966: 2303 movs r3, #3 + 8001968: e093 b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + 800196a: 4b29 ldr r3, [pc, #164] ; (8001a10 ) + 800196c: 681b ldr r3, [r3, #0] + 800196e: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 8001972: 2b00 cmp r3, #0 + 8001974: d1f0 bne.n 8001958 + } + } + + /* Configure the main PLL clock source, multiplication and division factors. */ + WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ + 8001976: 687b ldr r3, [r7, #4] + 8001978: 69da ldr r2, [r3, #28] + 800197a: 687b ldr r3, [r7, #4] + 800197c: 6a1b ldr r3, [r3, #32] + 800197e: 431a orrs r2, r3 + 8001980: 687b ldr r3, [r7, #4] + 8001982: 6a5b ldr r3, [r3, #36] ; 0x24 + 8001984: 019b lsls r3, r3, #6 + 8001986: 431a orrs r2, r3 + 8001988: 687b ldr r3, [r7, #4] + 800198a: 6a9b ldr r3, [r3, #40] ; 0x28 + 800198c: 085b lsrs r3, r3, #1 + 800198e: 3b01 subs r3, #1 + 8001990: 041b lsls r3, r3, #16 + 8001992: 431a orrs r2, r3 + 8001994: 687b ldr r3, [r7, #4] + 8001996: 6adb ldr r3, [r3, #44] ; 0x2c + 8001998: 061b lsls r3, r3, #24 + 800199a: 431a orrs r2, r3 + 800199c: 687b ldr r3, [r7, #4] + 800199e: 6b1b ldr r3, [r3, #48] ; 0x30 + 80019a0: 071b lsls r3, r3, #28 + 80019a2: 491b ldr r1, [pc, #108] ; (8001a10 ) + 80019a4: 4313 orrs r3, r2 + 80019a6: 604b str r3, [r1, #4] + (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ + (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ + (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos) | \ + (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))); + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + 80019a8: 4b1b ldr r3, [pc, #108] ; (8001a18 ) + 80019aa: 2201 movs r2, #1 + 80019ac: 601a str r2, [r3, #0] + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 80019ae: f7fe ffff bl 80009b0 + 80019b2: 6138 str r0, [r7, #16] + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + 80019b4: e008 b.n 80019c8 + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + 80019b6: f7fe fffb bl 80009b0 + 80019ba: 4602 mov r2, r0 + 80019bc: 693b ldr r3, [r7, #16] + 80019be: 1ad3 subs r3, r2, r3 + 80019c0: 2b02 cmp r3, #2 + 80019c2: d901 bls.n 80019c8 + { + return HAL_TIMEOUT; + 80019c4: 2303 movs r3, #3 + 80019c6: e064 b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + 80019c8: 4b11 ldr r3, [pc, #68] ; (8001a10 ) + 80019ca: 681b ldr r3, [r3, #0] + 80019cc: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 80019d0: 2b00 cmp r3, #0 + 80019d2: d0f0 beq.n 80019b6 + 80019d4: e05c b.n 8001a90 + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + 80019d6: 4b10 ldr r3, [pc, #64] ; (8001a18 ) + 80019d8: 2200 movs r2, #0 + 80019da: 601a str r2, [r3, #0] + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + 80019dc: f7fe ffe8 bl 80009b0 + 80019e0: 6138 str r0, [r7, #16] + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + 80019e2: e008 b.n 80019f6 + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + 80019e4: f7fe ffe4 bl 80009b0 + 80019e8: 4602 mov r2, r0 + 80019ea: 693b ldr r3, [r7, #16] + 80019ec: 1ad3 subs r3, r2, r3 + 80019ee: 2b02 cmp r3, #2 + 80019f0: d901 bls.n 80019f6 + { + return HAL_TIMEOUT; + 80019f2: 2303 movs r3, #3 + 80019f4: e04d b.n 8001a92 + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + 80019f6: 4b06 ldr r3, [pc, #24] ; (8001a10 ) + 80019f8: 681b ldr r3, [r3, #0] + 80019fa: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 80019fe: 2b00 cmp r3, #0 + 8001a00: d1f0 bne.n 80019e4 + 8001a02: e045 b.n 8001a90 + } + } + else + { + /* Check if there is a request to disable the PLL used as System clock source */ + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + 8001a04: 687b ldr r3, [r7, #4] + 8001a06: 699b ldr r3, [r3, #24] + 8001a08: 2b01 cmp r3, #1 + 8001a0a: d107 bne.n 8001a1c + { + return HAL_ERROR; + 8001a0c: 2301 movs r3, #1 + 8001a0e: e040 b.n 8001a92 + 8001a10: 40023800 .word 0x40023800 + 8001a14: 40007000 .word 0x40007000 + 8001a18: 42470060 .word 0x42470060 + } + else + { + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; + 8001a1c: 4b1f ldr r3, [pc, #124] ; (8001a9c ) + 8001a1e: 685b ldr r3, [r3, #4] + 8001a20: 60fb str r3, [r7, #12] +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + 8001a22: 687b ldr r3, [r7, #4] + 8001a24: 699b ldr r3, [r3, #24] + 8001a26: 2b01 cmp r3, #1 + 8001a28: d030 beq.n 8001a8c + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + 8001a2a: 68fb ldr r3, [r7, #12] + 8001a2c: f403 0280 and.w r2, r3, #4194304 ; 0x400000 + 8001a30: 687b ldr r3, [r7, #4] + 8001a32: 69db ldr r3, [r3, #28] + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + 8001a34: 429a cmp r2, r3 + 8001a36: d129 bne.n 8001a8c + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + 8001a38: 68fb ldr r3, [r7, #12] + 8001a3a: f003 023f and.w r2, r3, #63 ; 0x3f + 8001a3e: 687b ldr r3, [r7, #4] + 8001a40: 6a1b ldr r3, [r3, #32] + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + 8001a42: 429a cmp r2, r3 + 8001a44: d122 bne.n 8001a8c + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + 8001a46: 68fa ldr r2, [r7, #12] + 8001a48: f647 73c0 movw r3, #32704 ; 0x7fc0 + 8001a4c: 4013 ands r3, r2 + 8001a4e: 687a ldr r2, [r7, #4] + 8001a50: 6a52 ldr r2, [r2, #36] ; 0x24 + 8001a52: 0192 lsls r2, r2, #6 + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + 8001a54: 4293 cmp r3, r2 + 8001a56: d119 bne.n 8001a8c + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + 8001a58: 68fb ldr r3, [r7, #12] + 8001a5a: f403 3240 and.w r2, r3, #196608 ; 0x30000 + 8001a5e: 687b ldr r3, [r7, #4] + 8001a60: 6a9b ldr r3, [r3, #40] ; 0x28 + 8001a62: 085b lsrs r3, r3, #1 + 8001a64: 3b01 subs r3, #1 + 8001a66: 041b lsls r3, r3, #16 + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + 8001a68: 429a cmp r2, r3 + 8001a6a: d10f bne.n 8001a8c + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + 8001a6c: 68fb ldr r3, [r7, #12] + 8001a6e: f003 6270 and.w r2, r3, #251658240 ; 0xf000000 + 8001a72: 687b ldr r3, [r7, #4] + 8001a74: 6adb ldr r3, [r3, #44] ; 0x2c + 8001a76: 061b lsls r3, r3, #24 + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + 8001a78: 429a cmp r2, r3 + 8001a7a: d107 bne.n 8001a8c + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) + 8001a7c: 68fb ldr r3, [r7, #12] + 8001a7e: f003 42e0 and.w r2, r3, #1879048192 ; 0x70000000 + 8001a82: 687b ldr r3, [r7, #4] + 8001a84: 6b1b ldr r3, [r3, #48] ; 0x30 + 8001a86: 071b lsls r3, r3, #28 + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + 8001a88: 429a cmp r2, r3 + 8001a8a: d001 beq.n 8001a90 + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + 8001a8c: 2301 movs r3, #1 + 8001a8e: e000 b.n 8001a92 + } + } + } + } + return HAL_OK; + 8001a90: 2300 movs r3, #0 +} + 8001a92: 4618 mov r0, r3 + 8001a94: 3718 adds r7, #24 + 8001a96: 46bd mov sp, r7 + 8001a98: bd80 pop {r7, pc} + 8001a9a: bf00 nop + 8001a9c: 40023800 .word 0x40023800 + +08001aa0 : + +extern void xPortSysTickHandler(void); + +/* Convert from CMSIS type osPriority to FreeRTOS priority number */ +static unsigned portBASE_TYPE makeFreeRtosPriority (osPriority priority) +{ + 8001aa0: b480 push {r7} + 8001aa2: b085 sub sp, #20 + 8001aa4: af00 add r7, sp, #0 + 8001aa6: 4603 mov r3, r0 + 8001aa8: 80fb strh r3, [r7, #6] + unsigned portBASE_TYPE fpriority = tskIDLE_PRIORITY; + 8001aaa: 2300 movs r3, #0 + 8001aac: 60fb str r3, [r7, #12] + + if (priority != osPriorityError) { + 8001aae: f9b7 3006 ldrsh.w r3, [r7, #6] + 8001ab2: 2b84 cmp r3, #132 ; 0x84 + 8001ab4: d005 beq.n 8001ac2 + fpriority += (priority - osPriorityIdle); + 8001ab6: f9b7 2006 ldrsh.w r2, [r7, #6] + 8001aba: 68fb ldr r3, [r7, #12] + 8001abc: 4413 add r3, r2 + 8001abe: 3303 adds r3, #3 + 8001ac0: 60fb str r3, [r7, #12] + } + + return fpriority; + 8001ac2: 68fb ldr r3, [r7, #12] +} + 8001ac4: 4618 mov r0, r3 + 8001ac6: 3714 adds r7, #20 + 8001ac8: 46bd mov sp, r7 + 8001aca: f85d 7b04 ldr.w r7, [sp], #4 + 8001ace: 4770 bx lr + +08001ad0 : +* @param argument pointer that is passed to the thread function as start argument. +* @retval status code that indicates the execution status of the function +* @note MUST REMAIN UNCHANGED: \b osKernelStart shall be consistent in every CMSIS-RTOS. +*/ +osStatus osKernelStart (void) +{ + 8001ad0: b580 push {r7, lr} + 8001ad2: af00 add r7, sp, #0 + vTaskStartScheduler(); + 8001ad4: f000 fade bl 8002094 + + return osOK; + 8001ad8: 2300 movs r3, #0 +} + 8001ada: 4618 mov r0, r3 + 8001adc: bd80 pop {r7, pc} + +08001ade : +* @param argument pointer that is passed to the thread function as start argument. +* @retval thread ID for reference by other functions or NULL in case of error. +* @note MUST REMAIN UNCHANGED: \b osThreadCreate shall be consistent in every CMSIS-RTOS. +*/ +osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument) +{ + 8001ade: b5f0 push {r4, r5, r6, r7, lr} + 8001ae0: b089 sub sp, #36 ; 0x24 + 8001ae2: af04 add r7, sp, #16 + 8001ae4: 6078 str r0, [r7, #4] + 8001ae6: 6039 str r1, [r7, #0] + TaskHandle_t handle; + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + if((thread_def->buffer != NULL) && (thread_def->controlblock != NULL)) { + 8001ae8: 687b ldr r3, [r7, #4] + 8001aea: 695b ldr r3, [r3, #20] + 8001aec: 2b00 cmp r3, #0 + 8001aee: d020 beq.n 8001b32 + 8001af0: 687b ldr r3, [r7, #4] + 8001af2: 699b ldr r3, [r3, #24] + 8001af4: 2b00 cmp r3, #0 + 8001af6: d01c beq.n 8001b32 + handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, + 8001af8: 687b ldr r3, [r7, #4] + 8001afa: 685c ldr r4, [r3, #4] + 8001afc: 687b ldr r3, [r7, #4] + 8001afe: 681d ldr r5, [r3, #0] + 8001b00: 687b ldr r3, [r7, #4] + 8001b02: 691e ldr r6, [r3, #16] + 8001b04: 687b ldr r3, [r7, #4] + 8001b06: f9b3 3008 ldrsh.w r3, [r3, #8] + 8001b0a: 4618 mov r0, r3 + 8001b0c: f7ff ffc8 bl 8001aa0 + 8001b10: 4601 mov r1, r0 + thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority), + thread_def->buffer, thread_def->controlblock); + 8001b12: 687b ldr r3, [r7, #4] + 8001b14: 695b ldr r3, [r3, #20] + 8001b16: 687a ldr r2, [r7, #4] + 8001b18: 6992 ldr r2, [r2, #24] + handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, + 8001b1a: 9202 str r2, [sp, #8] + 8001b1c: 9301 str r3, [sp, #4] + 8001b1e: 9100 str r1, [sp, #0] + 8001b20: 683b ldr r3, [r7, #0] + 8001b22: 4632 mov r2, r6 + 8001b24: 4629 mov r1, r5 + 8001b26: 4620 mov r0, r4 + 8001b28: f000 f8ed bl 8001d06 + 8001b2c: 4603 mov r3, r0 + 8001b2e: 60fb str r3, [r7, #12] + 8001b30: e01c b.n 8001b6c + } + else { + if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, + 8001b32: 687b ldr r3, [r7, #4] + 8001b34: 685c ldr r4, [r3, #4] + 8001b36: 687b ldr r3, [r7, #4] + 8001b38: 681d ldr r5, [r3, #0] + thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority), + 8001b3a: 687b ldr r3, [r7, #4] + 8001b3c: 691b ldr r3, [r3, #16] + if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, + 8001b3e: b29e uxth r6, r3 + 8001b40: 687b ldr r3, [r7, #4] + 8001b42: f9b3 3008 ldrsh.w r3, [r3, #8] + 8001b46: 4618 mov r0, r3 + 8001b48: f7ff ffaa bl 8001aa0 + 8001b4c: 4602 mov r2, r0 + 8001b4e: f107 030c add.w r3, r7, #12 + 8001b52: 9301 str r3, [sp, #4] + 8001b54: 9200 str r2, [sp, #0] + 8001b56: 683b ldr r3, [r7, #0] + 8001b58: 4632 mov r2, r6 + 8001b5a: 4629 mov r1, r5 + 8001b5c: 4620 mov r0, r4 + 8001b5e: f000 f92f bl 8001dc0 + 8001b62: 4603 mov r3, r0 + 8001b64: 2b01 cmp r3, #1 + 8001b66: d001 beq.n 8001b6c + &handle) != pdPASS) { + return NULL; + 8001b68: 2300 movs r3, #0 + 8001b6a: e000 b.n 8001b6e + &handle) != pdPASS) { + return NULL; + } +#endif + + return handle; + 8001b6c: 68fb ldr r3, [r7, #12] +} + 8001b6e: 4618 mov r0, r3 + 8001b70: 3714 adds r7, #20 + 8001b72: 46bd mov sp, r7 + 8001b74: bdf0 pop {r4, r5, r6, r7, pc} + +08001b76 : +* @brief Wait for Timeout (Time Delay) +* @param millisec time delay value +* @retval status code that indicates the execution status of the function. +*/ +osStatus osDelay (uint32_t millisec) +{ + 8001b76: b580 push {r7, lr} + 8001b78: b084 sub sp, #16 + 8001b7a: af00 add r7, sp, #0 + 8001b7c: 6078 str r0, [r7, #4] +#if INCLUDE_vTaskDelay + TickType_t ticks = millisec / portTICK_PERIOD_MS; + 8001b7e: 687b ldr r3, [r7, #4] + 8001b80: 60fb str r3, [r7, #12] + + vTaskDelay(ticks ? ticks : 1); /* Minimum delay = 1 tick */ + 8001b82: 68fb ldr r3, [r7, #12] + 8001b84: 2b00 cmp r3, #0 + 8001b86: d001 beq.n 8001b8c + 8001b88: 68fb ldr r3, [r7, #12] + 8001b8a: e000 b.n 8001b8e + 8001b8c: 2301 movs r3, #1 + 8001b8e: 4618 mov r0, r3 + 8001b90: f000 fa4c bl 800202c + + return osOK; + 8001b94: 2300 movs r3, #0 +#else + (void) millisec; + + return osErrorResource; +#endif +} + 8001b96: 4618 mov r0, r3 + 8001b98: 3710 adds r7, #16 + 8001b9a: 46bd mov sp, r7 + 8001b9c: bd80 pop {r7, pc} + +08001b9e : +/*----------------------------------------------------------- + * PUBLIC LIST API documented in list.h + *----------------------------------------------------------*/ + +void vListInitialise( List_t * const pxList ) +{ + 8001b9e: b480 push {r7} + 8001ba0: b083 sub sp, #12 + 8001ba2: af00 add r7, sp, #0 + 8001ba4: 6078 str r0, [r7, #4] + /* The list structure contains a list item which is used to mark the + end of the list. To initialise the list the list end is inserted + as the only list entry. */ + pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + 8001ba6: 687b ldr r3, [r7, #4] + 8001ba8: f103 0208 add.w r2, r3, #8 + 8001bac: 687b ldr r3, [r7, #4] + 8001bae: 605a str r2, [r3, #4] + + /* The list end value is the highest possible value in the list to + ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + 8001bb0: 687b ldr r3, [r7, #4] + 8001bb2: f04f 32ff mov.w r2, #4294967295 + 8001bb6: 609a str r2, [r3, #8] + + /* The list end next and previous pointers point to itself so we know + when the list is empty. */ + pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + 8001bb8: 687b ldr r3, [r7, #4] + 8001bba: f103 0208 add.w r2, r3, #8 + 8001bbe: 687b ldr r3, [r7, #4] + 8001bc0: 60da str r2, [r3, #12] + pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + 8001bc2: 687b ldr r3, [r7, #4] + 8001bc4: f103 0208 add.w r2, r3, #8 + 8001bc8: 687b ldr r3, [r7, #4] + 8001bca: 611a str r2, [r3, #16] + + pxList->uxNumberOfItems = ( UBaseType_t ) 0U; + 8001bcc: 687b ldr r3, [r7, #4] + 8001bce: 2200 movs r2, #0 + 8001bd0: 601a str r2, [r3, #0] + + /* Write known values into the list if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); + listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); +} + 8001bd2: bf00 nop + 8001bd4: 370c adds r7, #12 + 8001bd6: 46bd mov sp, r7 + 8001bd8: f85d 7b04 ldr.w r7, [sp], #4 + 8001bdc: 4770 bx lr + +08001bde : +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( ListItem_t * const pxItem ) +{ + 8001bde: b480 push {r7} + 8001be0: b083 sub sp, #12 + 8001be2: af00 add r7, sp, #0 + 8001be4: 6078 str r0, [r7, #4] + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pxContainer = NULL; + 8001be6: 687b ldr r3, [r7, #4] + 8001be8: 2200 movs r2, #0 + 8001bea: 611a str r2, [r3, #16] + + /* Write known values into the list item if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); +} + 8001bec: bf00 nop + 8001bee: 370c adds r7, #12 + 8001bf0: 46bd mov sp, r7 + 8001bf2: f85d 7b04 ldr.w r7, [sp], #4 + 8001bf6: 4770 bx lr + +08001bf8 : +/*-----------------------------------------------------------*/ + +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ + 8001bf8: b480 push {r7} + 8001bfa: b085 sub sp, #20 + 8001bfc: af00 add r7, sp, #0 + 8001bfe: 6078 str r0, [r7, #4] + 8001c00: 6039 str r1, [r7, #0] +ListItem_t * const pxIndex = pxList->pxIndex; + 8001c02: 687b ldr r3, [r7, #4] + 8001c04: 685b ldr r3, [r3, #4] + 8001c06: 60fb str r3, [r7, #12] + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert a new list item into pxList, but rather than sort the list, + makes the new list item the last item to be removed by a call to + listGET_OWNER_OF_NEXT_ENTRY(). */ + pxNewListItem->pxNext = pxIndex; + 8001c08: 683b ldr r3, [r7, #0] + 8001c0a: 68fa ldr r2, [r7, #12] + 8001c0c: 605a str r2, [r3, #4] + pxNewListItem->pxPrevious = pxIndex->pxPrevious; + 8001c0e: 68fb ldr r3, [r7, #12] + 8001c10: 689a ldr r2, [r3, #8] + 8001c12: 683b ldr r3, [r7, #0] + 8001c14: 609a str r2, [r3, #8] + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + pxIndex->pxPrevious->pxNext = pxNewListItem; + 8001c16: 68fb ldr r3, [r7, #12] + 8001c18: 689b ldr r3, [r3, #8] + 8001c1a: 683a ldr r2, [r7, #0] + 8001c1c: 605a str r2, [r3, #4] + pxIndex->pxPrevious = pxNewListItem; + 8001c1e: 68fb ldr r3, [r7, #12] + 8001c20: 683a ldr r2, [r7, #0] + 8001c22: 609a str r2, [r3, #8] + + /* Remember which list the item is in. */ + pxNewListItem->pxContainer = pxList; + 8001c24: 683b ldr r3, [r7, #0] + 8001c26: 687a ldr r2, [r7, #4] + 8001c28: 611a str r2, [r3, #16] + + ( pxList->uxNumberOfItems )++; + 8001c2a: 687b ldr r3, [r7, #4] + 8001c2c: 681b ldr r3, [r3, #0] + 8001c2e: 1c5a adds r2, r3, #1 + 8001c30: 687b ldr r3, [r7, #4] + 8001c32: 601a str r2, [r3, #0] +} + 8001c34: bf00 nop + 8001c36: 3714 adds r7, #20 + 8001c38: 46bd mov sp, r7 + 8001c3a: f85d 7b04 ldr.w r7, [sp], #4 + 8001c3e: 4770 bx lr + +08001c40 : +/*-----------------------------------------------------------*/ + +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ + 8001c40: b480 push {r7} + 8001c42: b085 sub sp, #20 + 8001c44: af00 add r7, sp, #0 + 8001c46: 6078 str r0, [r7, #4] + 8001c48: 6039 str r1, [r7, #0] +ListItem_t *pxIterator; +const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; + 8001c4a: 683b ldr r3, [r7, #0] + 8001c4c: 681b ldr r3, [r3, #0] + 8001c4e: 60bb str r3, [r7, #8] + new list item should be placed after it. This ensures that TCBs which are + stored in ready lists (all of which have the same xItemValue value) get a + share of the CPU. However, if the xItemValue is the same as the back marker + the iteration loop below will not end. Therefore the value is checked + first, and the algorithm slightly modified if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + 8001c50: 68bb ldr r3, [r7, #8] + 8001c52: f1b3 3fff cmp.w r3, #4294967295 + 8001c56: d103 bne.n 8001c60 + { + pxIterator = pxList->xListEnd.pxPrevious; + 8001c58: 687b ldr r3, [r7, #4] + 8001c5a: 691b ldr r3, [r3, #16] + 8001c5c: 60fb str r3, [r7, #12] + 8001c5e: e00c b.n 8001c7a + 4) Using a queue or semaphore before it has been initialised or + before the scheduler has been started (are interrupts firing + before vTaskStartScheduler() has been called?). + **********************************************************************/ + + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */ + 8001c60: 687b ldr r3, [r7, #4] + 8001c62: 3308 adds r3, #8 + 8001c64: 60fb str r3, [r7, #12] + 8001c66: e002 b.n 8001c6e + 8001c68: 68fb ldr r3, [r7, #12] + 8001c6a: 685b ldr r3, [r3, #4] + 8001c6c: 60fb str r3, [r7, #12] + 8001c6e: 68fb ldr r3, [r7, #12] + 8001c70: 685b ldr r3, [r3, #4] + 8001c72: 681b ldr r3, [r3, #0] + 8001c74: 68ba ldr r2, [r7, #8] + 8001c76: 429a cmp r2, r3 + 8001c78: d2f6 bcs.n 8001c68 + /* There is nothing to do here, just iterating to the wanted + insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + 8001c7a: 68fb ldr r3, [r7, #12] + 8001c7c: 685a ldr r2, [r3, #4] + 8001c7e: 683b ldr r3, [r7, #0] + 8001c80: 605a str r2, [r3, #4] + pxNewListItem->pxNext->pxPrevious = pxNewListItem; + 8001c82: 683b ldr r3, [r7, #0] + 8001c84: 685b ldr r3, [r3, #4] + 8001c86: 683a ldr r2, [r7, #0] + 8001c88: 609a str r2, [r3, #8] + pxNewListItem->pxPrevious = pxIterator; + 8001c8a: 683b ldr r3, [r7, #0] + 8001c8c: 68fa ldr r2, [r7, #12] + 8001c8e: 609a str r2, [r3, #8] + pxIterator->pxNext = pxNewListItem; + 8001c90: 68fb ldr r3, [r7, #12] + 8001c92: 683a ldr r2, [r7, #0] + 8001c94: 605a str r2, [r3, #4] + + /* Remember which list the item is in. This allows fast removal of the + item later. */ + pxNewListItem->pxContainer = pxList; + 8001c96: 683b ldr r3, [r7, #0] + 8001c98: 687a ldr r2, [r7, #4] + 8001c9a: 611a str r2, [r3, #16] + + ( pxList->uxNumberOfItems )++; + 8001c9c: 687b ldr r3, [r7, #4] + 8001c9e: 681b ldr r3, [r3, #0] + 8001ca0: 1c5a adds r2, r3, #1 + 8001ca2: 687b ldr r3, [r7, #4] + 8001ca4: 601a str r2, [r3, #0] +} + 8001ca6: bf00 nop + 8001ca8: 3714 adds r7, #20 + 8001caa: 46bd mov sp, r7 + 8001cac: f85d 7b04 ldr.w r7, [sp], #4 + 8001cb0: 4770 bx lr + +08001cb2 : +/*-----------------------------------------------------------*/ + +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) +{ + 8001cb2: b480 push {r7} + 8001cb4: b085 sub sp, #20 + 8001cb6: af00 add r7, sp, #0 + 8001cb8: 6078 str r0, [r7, #4] +/* The list item knows which list it is in. Obtain the list from the list +item. */ +List_t * const pxList = pxItemToRemove->pxContainer; + 8001cba: 687b ldr r3, [r7, #4] + 8001cbc: 691b ldr r3, [r3, #16] + 8001cbe: 60fb str r3, [r7, #12] + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + 8001cc0: 687b ldr r3, [r7, #4] + 8001cc2: 685b ldr r3, [r3, #4] + 8001cc4: 687a ldr r2, [r7, #4] + 8001cc6: 6892 ldr r2, [r2, #8] + 8001cc8: 609a str r2, [r3, #8] + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + 8001cca: 687b ldr r3, [r7, #4] + 8001ccc: 689b ldr r3, [r3, #8] + 8001cce: 687a ldr r2, [r7, #4] + 8001cd0: 6852 ldr r2, [r2, #4] + 8001cd2: 605a str r2, [r3, #4] + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + 8001cd4: 68fb ldr r3, [r7, #12] + 8001cd6: 685b ldr r3, [r3, #4] + 8001cd8: 687a ldr r2, [r7, #4] + 8001cda: 429a cmp r2, r3 + 8001cdc: d103 bne.n 8001ce6 + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + 8001cde: 687b ldr r3, [r7, #4] + 8001ce0: 689a ldr r2, [r3, #8] + 8001ce2: 68fb ldr r3, [r7, #12] + 8001ce4: 605a str r2, [r3, #4] + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxItemToRemove->pxContainer = NULL; + 8001ce6: 687b ldr r3, [r7, #4] + 8001ce8: 2200 movs r2, #0 + 8001cea: 611a str r2, [r3, #16] + ( pxList->uxNumberOfItems )--; + 8001cec: 68fb ldr r3, [r7, #12] + 8001cee: 681b ldr r3, [r3, #0] + 8001cf0: 1e5a subs r2, r3, #1 + 8001cf2: 68fb ldr r3, [r7, #12] + 8001cf4: 601a str r2, [r3, #0] + + return pxList->uxNumberOfItems; + 8001cf6: 68fb ldr r3, [r7, #12] + 8001cf8: 681b ldr r3, [r3, #0] +} + 8001cfa: 4618 mov r0, r3 + 8001cfc: 3714 adds r7, #20 + 8001cfe: 46bd mov sp, r7 + 8001d00: f85d 7b04 ldr.w r7, [sp], #4 + 8001d04: 4770 bx lr + +08001d06 : + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) + { + 8001d06: b580 push {r7, lr} + 8001d08: b08e sub sp, #56 ; 0x38 + 8001d0a: af04 add r7, sp, #16 + 8001d0c: 60f8 str r0, [r7, #12] + 8001d0e: 60b9 str r1, [r7, #8] + 8001d10: 607a str r2, [r7, #4] + 8001d12: 603b str r3, [r7, #0] + TCB_t *pxNewTCB; + TaskHandle_t xReturn; + + configASSERT( puxStackBuffer != NULL ); + 8001d14: 6b7b ldr r3, [r7, #52] ; 0x34 + 8001d16: 2b00 cmp r3, #0 + 8001d18: d10a bne.n 8001d30 + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI; + + __asm volatile + 8001d1a: f04f 0350 mov.w r3, #80 ; 0x50 + 8001d1e: f383 8811 msr BASEPRI, r3 + 8001d22: f3bf 8f6f isb sy + 8001d26: f3bf 8f4f dsb sy + 8001d2a: 623b str r3, [r7, #32] + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} + 8001d2c: bf00 nop + 8001d2e: e7fe b.n 8001d2e + configASSERT( pxTaskBuffer != NULL ); + 8001d30: 6bbb ldr r3, [r7, #56] ; 0x38 + 8001d32: 2b00 cmp r3, #0 + 8001d34: d10a bne.n 8001d4c + __asm volatile + 8001d36: f04f 0350 mov.w r3, #80 ; 0x50 + 8001d3a: f383 8811 msr BASEPRI, r3 + 8001d3e: f3bf 8f6f isb sy + 8001d42: f3bf 8f4f dsb sy + 8001d46: 61fb str r3, [r7, #28] +} + 8001d48: bf00 nop + 8001d4a: e7fe b.n 8001d4a + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticTask_t equals the size of the real task + structure. */ + volatile size_t xSize = sizeof( StaticTask_t ); + 8001d4c: 2354 movs r3, #84 ; 0x54 + 8001d4e: 613b str r3, [r7, #16] + configASSERT( xSize == sizeof( TCB_t ) ); + 8001d50: 693b ldr r3, [r7, #16] + 8001d52: 2b54 cmp r3, #84 ; 0x54 + 8001d54: d00a beq.n 8001d6c + __asm volatile + 8001d56: f04f 0350 mov.w r3, #80 ; 0x50 + 8001d5a: f383 8811 msr BASEPRI, r3 + 8001d5e: f3bf 8f6f isb sy + 8001d62: f3bf 8f4f dsb sy + 8001d66: 61bb str r3, [r7, #24] +} + 8001d68: bf00 nop + 8001d6a: e7fe b.n 8001d6a + ( void ) xSize; /* Prevent lint warning when configASSERT() is not used. */ + 8001d6c: 693b ldr r3, [r7, #16] + } + #endif /* configASSERT_DEFINED */ + + + if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) ) + 8001d6e: 6bbb ldr r3, [r7, #56] ; 0x38 + 8001d70: 2b00 cmp r3, #0 + 8001d72: d01e beq.n 8001db2 + 8001d74: 6b7b ldr r3, [r7, #52] ; 0x34 + 8001d76: 2b00 cmp r3, #0 + 8001d78: d01b beq.n 8001db2 + { + /* The memory used for the task's TCB and stack are passed into this + function - use them. */ + pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + 8001d7a: 6bbb ldr r3, [r7, #56] ; 0x38 + 8001d7c: 627b str r3, [r7, #36] ; 0x24 + pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer; + 8001d7e: 6a7b ldr r3, [r7, #36] ; 0x24 + 8001d80: 6b7a ldr r2, [r7, #52] ; 0x34 + 8001d82: 631a str r2, [r3, #48] ; 0x30 + + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + 8001d84: 6a7b ldr r3, [r7, #36] ; 0x24 + 8001d86: 2202 movs r2, #2 + 8001d88: f883 2051 strb.w r2, [r3, #81] ; 0x51 + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL ); + 8001d8c: 2300 movs r3, #0 + 8001d8e: 9303 str r3, [sp, #12] + 8001d90: 6a7b ldr r3, [r7, #36] ; 0x24 + 8001d92: 9302 str r3, [sp, #8] + 8001d94: f107 0314 add.w r3, r7, #20 + 8001d98: 9301 str r3, [sp, #4] + 8001d9a: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001d9c: 9300 str r3, [sp, #0] + 8001d9e: 683b ldr r3, [r7, #0] + 8001da0: 687a ldr r2, [r7, #4] + 8001da2: 68b9 ldr r1, [r7, #8] + 8001da4: 68f8 ldr r0, [r7, #12] + 8001da6: f000 f850 bl 8001e4a + prvAddNewTaskToReadyList( pxNewTCB ); + 8001daa: 6a78 ldr r0, [r7, #36] ; 0x24 + 8001dac: f000 f8d4 bl 8001f58 + 8001db0: e001 b.n 8001db6 + } + else + { + xReturn = NULL; + 8001db2: 2300 movs r3, #0 + 8001db4: 617b str r3, [r7, #20] + } + + return xReturn; + 8001db6: 697b ldr r3, [r7, #20] + } + 8001db8: 4618 mov r0, r3 + 8001dba: 3728 adds r7, #40 ; 0x28 + 8001dbc: 46bd mov sp, r7 + 8001dbe: bd80 pop {r7, pc} + +08001dc0 : + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) + { + 8001dc0: b580 push {r7, lr} + 8001dc2: b08c sub sp, #48 ; 0x30 + 8001dc4: af04 add r7, sp, #16 + 8001dc6: 60f8 str r0, [r7, #12] + 8001dc8: 60b9 str r1, [r7, #8] + 8001dca: 603b str r3, [r7, #0] + 8001dcc: 4613 mov r3, r2 + 8001dce: 80fb strh r3, [r7, #6] + #else /* portSTACK_GROWTH */ + { + StackType_t *pxStack; + + /* Allocate space for the stack used by the task being created. */ + pxStack = pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ + 8001dd0: 88fb ldrh r3, [r7, #6] + 8001dd2: 009b lsls r3, r3, #2 + 8001dd4: 4618 mov r0, r3 + 8001dd6: f000 fee7 bl 8002ba8 + 8001dda: 6178 str r0, [r7, #20] + + if( pxStack != NULL ) + 8001ddc: 697b ldr r3, [r7, #20] + 8001dde: 2b00 cmp r3, #0 + 8001de0: d00e beq.n 8001e00 + { + /* Allocate space for the TCB. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */ + 8001de2: 2054 movs r0, #84 ; 0x54 + 8001de4: f000 fee0 bl 8002ba8 + 8001de8: 61f8 str r0, [r7, #28] + + if( pxNewTCB != NULL ) + 8001dea: 69fb ldr r3, [r7, #28] + 8001dec: 2b00 cmp r3, #0 + 8001dee: d003 beq.n 8001df8 + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxStack; + 8001df0: 69fb ldr r3, [r7, #28] + 8001df2: 697a ldr r2, [r7, #20] + 8001df4: 631a str r2, [r3, #48] ; 0x30 + 8001df6: e005 b.n 8001e04 + } + else + { + /* The stack cannot be used as the TCB was not created. Free + it again. */ + vPortFree( pxStack ); + 8001df8: 6978 ldr r0, [r7, #20] + 8001dfa: f000 ffa1 bl 8002d40 + 8001dfe: e001 b.n 8001e04 + } + } + else + { + pxNewTCB = NULL; + 8001e00: 2300 movs r3, #0 + 8001e02: 61fb str r3, [r7, #28] + } + } + #endif /* portSTACK_GROWTH */ + + if( pxNewTCB != NULL ) + 8001e04: 69fb ldr r3, [r7, #28] + 8001e06: 2b00 cmp r3, #0 + 8001e08: d017 beq.n 8001e3a + { + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + task was created dynamically in case it is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; + 8001e0a: 69fb ldr r3, [r7, #28] + 8001e0c: 2200 movs r2, #0 + 8001e0e: f883 2051 strb.w r2, [r3, #81] ; 0x51 + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); + 8001e12: 88fa ldrh r2, [r7, #6] + 8001e14: 2300 movs r3, #0 + 8001e16: 9303 str r3, [sp, #12] + 8001e18: 69fb ldr r3, [r7, #28] + 8001e1a: 9302 str r3, [sp, #8] + 8001e1c: 6afb ldr r3, [r7, #44] ; 0x2c + 8001e1e: 9301 str r3, [sp, #4] + 8001e20: 6abb ldr r3, [r7, #40] ; 0x28 + 8001e22: 9300 str r3, [sp, #0] + 8001e24: 683b ldr r3, [r7, #0] + 8001e26: 68b9 ldr r1, [r7, #8] + 8001e28: 68f8 ldr r0, [r7, #12] + 8001e2a: f000 f80e bl 8001e4a + prvAddNewTaskToReadyList( pxNewTCB ); + 8001e2e: 69f8 ldr r0, [r7, #28] + 8001e30: f000 f892 bl 8001f58 + xReturn = pdPASS; + 8001e34: 2301 movs r3, #1 + 8001e36: 61bb str r3, [r7, #24] + 8001e38: e002 b.n 8001e40 + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + 8001e3a: f04f 33ff mov.w r3, #4294967295 + 8001e3e: 61bb str r3, [r7, #24] + } + + return xReturn; + 8001e40: 69bb ldr r3, [r7, #24] + } + 8001e42: 4618 mov r0, r3 + 8001e44: 3720 adds r7, #32 + 8001e46: 46bd mov sp, r7 + 8001e48: bd80 pop {r7, pc} + +08001e4a : + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t *pxNewTCB, + const MemoryRegion_t * const xRegions ) +{ + 8001e4a: b580 push {r7, lr} + 8001e4c: b088 sub sp, #32 + 8001e4e: af00 add r7, sp, #0 + 8001e50: 60f8 str r0, [r7, #12] + 8001e52: 60b9 str r1, [r7, #8] + 8001e54: 607a str r2, [r7, #4] + 8001e56: 603b str r3, [r7, #0] + grows from high memory to low (as per the 80x86) or vice versa. + portSTACK_GROWTH is used to make the result positive or negative as required + by the port. */ + #if( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] ); + 8001e58: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e5a: 6b1a ldr r2, [r3, #48] ; 0x30 + 8001e5c: 687b ldr r3, [r7, #4] + 8001e5e: f103 4380 add.w r3, r3, #1073741824 ; 0x40000000 + 8001e62: 3b01 subs r3, #1 + 8001e64: 009b lsls r3, r3, #2 + 8001e66: 4413 add r3, r2 + 8001e68: 61bb str r3, [r7, #24] + pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */ + 8001e6a: 69bb ldr r3, [r7, #24] + 8001e6c: f023 0307 bic.w r3, r3, #7 + 8001e70: 61bb str r3, [r7, #24] + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + 8001e72: 69bb ldr r3, [r7, #24] + 8001e74: f003 0307 and.w r3, r3, #7 + 8001e78: 2b00 cmp r3, #0 + 8001e7a: d00a beq.n 8001e92 + __asm volatile + 8001e7c: f04f 0350 mov.w r3, #80 ; 0x50 + 8001e80: f383 8811 msr BASEPRI, r3 + 8001e84: f3bf 8f6f isb sy + 8001e88: f3bf 8f4f dsb sy + 8001e8c: 617b str r3, [r7, #20] +} + 8001e8e: bf00 nop + 8001e90: e7fe b.n 8001e90 + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + } + #endif /* portSTACK_GROWTH */ + + /* Store the task name in the TCB. */ + if( pcName != NULL ) + 8001e92: 68bb ldr r3, [r7, #8] + 8001e94: 2b00 cmp r3, #0 + 8001e96: d01f beq.n 8001ed8 + { + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + 8001e98: 2300 movs r3, #0 + 8001e9a: 61fb str r3, [r7, #28] + 8001e9c: e012 b.n 8001ec4 + { + pxNewTCB->pcTaskName[ x ] = pcName[ x ]; + 8001e9e: 68ba ldr r2, [r7, #8] + 8001ea0: 69fb ldr r3, [r7, #28] + 8001ea2: 4413 add r3, r2 + 8001ea4: 7819 ldrb r1, [r3, #0] + 8001ea6: 6b3a ldr r2, [r7, #48] ; 0x30 + 8001ea8: 69fb ldr r3, [r7, #28] + 8001eaa: 4413 add r3, r2 + 8001eac: 3334 adds r3, #52 ; 0x34 + 8001eae: 460a mov r2, r1 + 8001eb0: 701a strb r2, [r3, #0] + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + configMAX_TASK_NAME_LEN characters just in case the memory after the + string is not accessible (extremely unlikely). */ + if( pcName[ x ] == ( char ) 0x00 ) + 8001eb2: 68ba ldr r2, [r7, #8] + 8001eb4: 69fb ldr r3, [r7, #28] + 8001eb6: 4413 add r3, r2 + 8001eb8: 781b ldrb r3, [r3, #0] + 8001eba: 2b00 cmp r3, #0 + 8001ebc: d006 beq.n 8001ecc + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + 8001ebe: 69fb ldr r3, [r7, #28] + 8001ec0: 3301 adds r3, #1 + 8001ec2: 61fb str r3, [r7, #28] + 8001ec4: 69fb ldr r3, [r7, #28] + 8001ec6: 2b0f cmp r3, #15 + 8001ec8: d9e9 bls.n 8001e9e + 8001eca: e000 b.n 8001ece + { + break; + 8001ecc: bf00 nop + } + } + + /* Ensure the name string is terminated in the case that the string length + was greater or equal to configMAX_TASK_NAME_LEN. */ + pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; + 8001ece: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001ed0: 2200 movs r2, #0 + 8001ed2: f883 2043 strb.w r2, [r3, #67] ; 0x43 + 8001ed6: e003 b.n 8001ee0 + } + else + { + /* The task has not been given a name, so just ensure there is a NULL + terminator when it is read out. */ + pxNewTCB->pcTaskName[ 0 ] = 0x00; + 8001ed8: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001eda: 2200 movs r2, #0 + 8001edc: f883 2034 strb.w r2, [r3, #52] ; 0x34 + } + + /* This is used as an array index so must ensure it's not too large. First + remove the privilege bit if one is present. */ + if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + 8001ee0: 6abb ldr r3, [r7, #40] ; 0x28 + 8001ee2: 2b06 cmp r3, #6 + 8001ee4: d901 bls.n 8001eea + { + uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + 8001ee6: 2306 movs r3, #6 + 8001ee8: 62bb str r3, [r7, #40] ; 0x28 + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxNewTCB->uxPriority = uxPriority; + 8001eea: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001eec: 6aba ldr r2, [r7, #40] ; 0x28 + 8001eee: 62da str r2, [r3, #44] ; 0x2c + #if ( configUSE_MUTEXES == 1 ) + { + pxNewTCB->uxBasePriority = uxPriority; + 8001ef0: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001ef2: 6aba ldr r2, [r7, #40] ; 0x28 + 8001ef4: 645a str r2, [r3, #68] ; 0x44 + pxNewTCB->uxMutexesHeld = 0; + 8001ef6: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001ef8: 2200 movs r2, #0 + 8001efa: 649a str r2, [r3, #72] ; 0x48 + } + #endif /* configUSE_MUTEXES */ + + vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); + 8001efc: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001efe: 3304 adds r3, #4 + 8001f00: 4618 mov r0, r3 + 8001f02: f7ff fe6c bl 8001bde + vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); + 8001f06: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001f08: 3318 adds r3, #24 + 8001f0a: 4618 mov r0, r3 + 8001f0c: f7ff fe67 bl 8001bde + + /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get + back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); + 8001f10: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001f12: 6b3a ldr r2, [r7, #48] ; 0x30 + 8001f14: 611a str r2, [r3, #16] + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + 8001f16: 6abb ldr r3, [r7, #40] ; 0x28 + 8001f18: f1c3 0207 rsb r2, r3, #7 + 8001f1c: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001f1e: 619a str r2, [r3, #24] + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); + 8001f20: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001f22: 6b3a ldr r2, [r7, #48] ; 0x30 + 8001f24: 625a str r2, [r3, #36] ; 0x24 + } + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + pxNewTCB->ulNotifiedValue = 0; + 8001f26: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001f28: 2200 movs r2, #0 + 8001f2a: 64da str r2, [r3, #76] ; 0x4c + pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + 8001f2c: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001f2e: 2200 movs r2, #0 + 8001f30: f883 2050 strb.w r2, [r3, #80] ; 0x50 + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + 8001f34: 683a ldr r2, [r7, #0] + 8001f36: 68f9 ldr r1, [r7, #12] + 8001f38: 69b8 ldr r0, [r7, #24] + 8001f3a: f000 fc23 bl 8002784 + 8001f3e: 4602 mov r2, r0 + 8001f40: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001f42: 601a str r2, [r3, #0] + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #endif /* portUSING_MPU_WRAPPERS */ + + if( pxCreatedTask != NULL ) + 8001f44: 6afb ldr r3, [r7, #44] ; 0x2c + 8001f46: 2b00 cmp r3, #0 + 8001f48: d002 beq.n 8001f50 + { + /* Pass the handle out in an anonymous way. The handle can be used to + change the created task's priority, delete the created task, etc.*/ + *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; + 8001f4a: 6afb ldr r3, [r7, #44] ; 0x2c + 8001f4c: 6b3a ldr r2, [r7, #48] ; 0x30 + 8001f4e: 601a str r2, [r3, #0] + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} + 8001f50: bf00 nop + 8001f52: 3720 adds r7, #32 + 8001f54: 46bd mov sp, r7 + 8001f56: bd80 pop {r7, pc} + +08001f58 : +/*-----------------------------------------------------------*/ + +static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) +{ + 8001f58: b580 push {r7, lr} + 8001f5a: b082 sub sp, #8 + 8001f5c: af00 add r7, sp, #0 + 8001f5e: 6078 str r0, [r7, #4] + /* Ensure interrupts don't access the task lists while the lists are being + updated. */ + taskENTER_CRITICAL(); + 8001f60: f000 fd40 bl 80029e4 + { + uxCurrentNumberOfTasks++; + 8001f64: 4b2a ldr r3, [pc, #168] ; (8002010 ) + 8001f66: 681b ldr r3, [r3, #0] + 8001f68: 3301 adds r3, #1 + 8001f6a: 4a29 ldr r2, [pc, #164] ; (8002010 ) + 8001f6c: 6013 str r3, [r2, #0] + if( pxCurrentTCB == NULL ) + 8001f6e: 4b29 ldr r3, [pc, #164] ; (8002014 ) + 8001f70: 681b ldr r3, [r3, #0] + 8001f72: 2b00 cmp r3, #0 + 8001f74: d109 bne.n 8001f8a + { + /* There are no other tasks, or all the other tasks are in + the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + 8001f76: 4a27 ldr r2, [pc, #156] ; (8002014 ) + 8001f78: 687b ldr r3, [r7, #4] + 8001f7a: 6013 str r3, [r2, #0] + + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) + 8001f7c: 4b24 ldr r3, [pc, #144] ; (8002010 ) + 8001f7e: 681b ldr r3, [r3, #0] + 8001f80: 2b01 cmp r3, #1 + 8001f82: d110 bne.n 8001fa6 + { + /* This is the first task to be created so do the preliminary + initialisation required. We will not recover if this call + fails, but we will report the failure. */ + prvInitialiseTaskLists(); + 8001f84: f000 fabc bl 8002500 + 8001f88: e00d b.n 8001fa6 + else + { + /* If the scheduler is not already running, make this task the + current task if it is the highest priority task to be created + so far. */ + if( xSchedulerRunning == pdFALSE ) + 8001f8a: 4b23 ldr r3, [pc, #140] ; (8002018 ) + 8001f8c: 681b ldr r3, [r3, #0] + 8001f8e: 2b00 cmp r3, #0 + 8001f90: d109 bne.n 8001fa6 + { + if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) + 8001f92: 4b20 ldr r3, [pc, #128] ; (8002014 ) + 8001f94: 681b ldr r3, [r3, #0] + 8001f96: 6ada ldr r2, [r3, #44] ; 0x2c + 8001f98: 687b ldr r3, [r7, #4] + 8001f9a: 6adb ldr r3, [r3, #44] ; 0x2c + 8001f9c: 429a cmp r2, r3 + 8001f9e: d802 bhi.n 8001fa6 + { + pxCurrentTCB = pxNewTCB; + 8001fa0: 4a1c ldr r2, [pc, #112] ; (8002014 ) + 8001fa2: 687b ldr r3, [r7, #4] + 8001fa4: 6013 str r3, [r2, #0] + { + mtCOVERAGE_TEST_MARKER(); + } + } + + uxTaskNumber++; + 8001fa6: 4b1d ldr r3, [pc, #116] ; (800201c ) + 8001fa8: 681b ldr r3, [r3, #0] + 8001faa: 3301 adds r3, #1 + 8001fac: 4a1b ldr r2, [pc, #108] ; (800201c ) + 8001fae: 6013 str r3, [r2, #0] + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); + + prvAddTaskToReadyList( pxNewTCB ); + 8001fb0: 687b ldr r3, [r7, #4] + 8001fb2: 6adb ldr r3, [r3, #44] ; 0x2c + 8001fb4: 2201 movs r2, #1 + 8001fb6: 409a lsls r2, r3 + 8001fb8: 4b19 ldr r3, [pc, #100] ; (8002020 ) + 8001fba: 681b ldr r3, [r3, #0] + 8001fbc: 4313 orrs r3, r2 + 8001fbe: 4a18 ldr r2, [pc, #96] ; (8002020 ) + 8001fc0: 6013 str r3, [r2, #0] + 8001fc2: 687b ldr r3, [r7, #4] + 8001fc4: 6ada ldr r2, [r3, #44] ; 0x2c + 8001fc6: 4613 mov r3, r2 + 8001fc8: 009b lsls r3, r3, #2 + 8001fca: 4413 add r3, r2 + 8001fcc: 009b lsls r3, r3, #2 + 8001fce: 4a15 ldr r2, [pc, #84] ; (8002024 ) + 8001fd0: 441a add r2, r3 + 8001fd2: 687b ldr r3, [r7, #4] + 8001fd4: 3304 adds r3, #4 + 8001fd6: 4619 mov r1, r3 + 8001fd8: 4610 mov r0, r2 + 8001fda: f7ff fe0d bl 8001bf8 + + portSETUP_TCB( pxNewTCB ); + } + taskEXIT_CRITICAL(); + 8001fde: f000 fd31 bl 8002a44 + + if( xSchedulerRunning != pdFALSE ) + 8001fe2: 4b0d ldr r3, [pc, #52] ; (8002018 ) + 8001fe4: 681b ldr r3, [r3, #0] + 8001fe6: 2b00 cmp r3, #0 + 8001fe8: d00e beq.n 8002008 + { + /* If the created task is of a higher priority than the current task + then it should run now. */ + if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority ) + 8001fea: 4b0a ldr r3, [pc, #40] ; (8002014 ) + 8001fec: 681b ldr r3, [r3, #0] + 8001fee: 6ada ldr r2, [r3, #44] ; 0x2c + 8001ff0: 687b ldr r3, [r7, #4] + 8001ff2: 6adb ldr r3, [r3, #44] ; 0x2c + 8001ff4: 429a cmp r2, r3 + 8001ff6: d207 bcs.n 8002008 + { + taskYIELD_IF_USING_PREEMPTION(); + 8001ff8: 4b0b ldr r3, [pc, #44] ; (8002028 ) + 8001ffa: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 8001ffe: 601a str r2, [r3, #0] + 8002000: f3bf 8f4f dsb sy + 8002004: f3bf 8f6f isb sy + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} + 8002008: bf00 nop + 800200a: 3708 adds r7, #8 + 800200c: 46bd mov sp, r7 + 800200e: bd80 pop {r7, pc} + 8002010: 2000038c .word 0x2000038c + 8002014: 2000028c .word 0x2000028c + 8002018: 20000398 .word 0x20000398 + 800201c: 200003a8 .word 0x200003a8 + 8002020: 20000394 .word 0x20000394 + 8002024: 20000290 .word 0x20000290 + 8002028: e000ed04 .word 0xe000ed04 + +0800202c : +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( const TickType_t xTicksToDelay ) + { + 800202c: b580 push {r7, lr} + 800202e: b084 sub sp, #16 + 8002030: af00 add r7, sp, #0 + 8002032: 6078 str r0, [r7, #4] + BaseType_t xAlreadyYielded = pdFALSE; + 8002034: 2300 movs r3, #0 + 8002036: 60fb str r3, [r7, #12] + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( TickType_t ) 0U ) + 8002038: 687b ldr r3, [r7, #4] + 800203a: 2b00 cmp r3, #0 + 800203c: d017 beq.n 800206e + { + configASSERT( uxSchedulerSuspended == 0 ); + 800203e: 4b13 ldr r3, [pc, #76] ; (800208c ) + 8002040: 681b ldr r3, [r3, #0] + 8002042: 2b00 cmp r3, #0 + 8002044: d00a beq.n 800205c + __asm volatile + 8002046: f04f 0350 mov.w r3, #80 ; 0x50 + 800204a: f383 8811 msr BASEPRI, r3 + 800204e: f3bf 8f6f isb sy + 8002052: f3bf 8f4f dsb sy + 8002056: 60bb str r3, [r7, #8] +} + 8002058: bf00 nop + 800205a: e7fe b.n 800205a + vTaskSuspendAll(); + 800205c: f000 f87a bl 8002154 + list or removed from the blocked list until the scheduler + is resumed. + + This task cannot be in an event list as it is the currently + executing task. */ + prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); + 8002060: 2100 movs r1, #0 + 8002062: 6878 ldr r0, [r7, #4] + 8002064: f000 fb28 bl 80026b8 + } + xAlreadyYielded = xTaskResumeAll(); + 8002068: f000 f882 bl 8002170 + 800206c: 60f8 str r0, [r7, #12] + mtCOVERAGE_TEST_MARKER(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + 800206e: 68fb ldr r3, [r7, #12] + 8002070: 2b00 cmp r3, #0 + 8002072: d107 bne.n 8002084 + { + portYIELD_WITHIN_API(); + 8002074: 4b06 ldr r3, [pc, #24] ; (8002090 ) + 8002076: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 800207a: 601a str r2, [r3, #0] + 800207c: f3bf 8f4f dsb sy + 8002080: f3bf 8f6f isb sy + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + 8002084: bf00 nop + 8002086: 3710 adds r7, #16 + 8002088: 46bd mov sp, r7 + 800208a: bd80 pop {r7, pc} + 800208c: 200003b4 .word 0x200003b4 + 8002090: e000ed04 .word 0xe000ed04 + +08002094 : + +#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ +/*-----------------------------------------------------------*/ + +void vTaskStartScheduler( void ) +{ + 8002094: b580 push {r7, lr} + 8002096: b08a sub sp, #40 ; 0x28 + 8002098: af04 add r7, sp, #16 +BaseType_t xReturn; + + /* Add the idle task at the lowest priority. */ + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t *pxIdleTaskTCBBuffer = NULL; + 800209a: 2300 movs r3, #0 + 800209c: 60bb str r3, [r7, #8] + StackType_t *pxIdleTaskStackBuffer = NULL; + 800209e: 2300 movs r3, #0 + 80020a0: 607b str r3, [r7, #4] + uint32_t ulIdleTaskStackSize; + + /* The Idle task is created using user provided RAM - obtain the + address of the RAM then create the idle task. */ + vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); + 80020a2: 463a mov r2, r7 + 80020a4: 1d39 adds r1, r7, #4 + 80020a6: f107 0308 add.w r3, r7, #8 + 80020aa: 4618 mov r0, r3 + 80020ac: f7fe fa32 bl 8000514 + xIdleTaskHandle = xTaskCreateStatic( prvIdleTask, + 80020b0: 6839 ldr r1, [r7, #0] + 80020b2: 687b ldr r3, [r7, #4] + 80020b4: 68ba ldr r2, [r7, #8] + 80020b6: 9202 str r2, [sp, #8] + 80020b8: 9301 str r3, [sp, #4] + 80020ba: 2300 movs r3, #0 + 80020bc: 9300 str r3, [sp, #0] + 80020be: 2300 movs r3, #0 + 80020c0: 460a mov r2, r1 + 80020c2: 491e ldr r1, [pc, #120] ; (800213c ) + 80020c4: 481e ldr r0, [pc, #120] ; (8002140 ) + 80020c6: f7ff fe1e bl 8001d06 + 80020ca: 4603 mov r3, r0 + 80020cc: 4a1d ldr r2, [pc, #116] ; (8002144 ) + 80020ce: 6013 str r3, [r2, #0] + ( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */ + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + pxIdleTaskStackBuffer, + pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + + if( xIdleTaskHandle != NULL ) + 80020d0: 4b1c ldr r3, [pc, #112] ; (8002144 ) + 80020d2: 681b ldr r3, [r3, #0] + 80020d4: 2b00 cmp r3, #0 + 80020d6: d002 beq.n 80020de + { + xReturn = pdPASS; + 80020d8: 2301 movs r3, #1 + 80020da: 617b str r3, [r7, #20] + 80020dc: e001 b.n 80020e2 + } + else + { + xReturn = pdFAIL; + 80020de: 2300 movs r3, #0 + 80020e0: 617b str r3, [r7, #20] + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TIMERS */ + + if( xReturn == pdPASS ) + 80020e2: 697b ldr r3, [r7, #20] + 80020e4: 2b01 cmp r3, #1 + 80020e6: d116 bne.n 8002116 + __asm volatile + 80020e8: f04f 0350 mov.w r3, #80 ; 0x50 + 80020ec: f383 8811 msr BASEPRI, r3 + 80020f0: f3bf 8f6f isb sy + 80020f4: f3bf 8f4f dsb sy + 80020f8: 613b str r3, [r7, #16] +} + 80020fa: bf00 nop + for additional information. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + xNextTaskUnblockTime = portMAX_DELAY; + 80020fc: 4b12 ldr r3, [pc, #72] ; (8002148 ) + 80020fe: f04f 32ff mov.w r2, #4294967295 + 8002102: 601a str r2, [r3, #0] + xSchedulerRunning = pdTRUE; + 8002104: 4b11 ldr r3, [pc, #68] ; (800214c ) + 8002106: 2201 movs r2, #1 + 8002108: 601a str r2, [r3, #0] + xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; + 800210a: 4b11 ldr r3, [pc, #68] ; (8002150 ) + 800210c: 2200 movs r2, #0 + 800210e: 601a str r2, [r3, #0] + + traceTASK_SWITCHED_IN(); + + /* Setting up the timer tick is hardware specific and thus in the + portable interface. */ + if( xPortStartScheduler() != pdFALSE ) + 8002110: f000 fbc6 bl 80028a0 + } + + /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, + meaning xIdleTaskHandle is not used anywhere else. */ + ( void ) xIdleTaskHandle; +} + 8002114: e00e b.n 8002134 + configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); + 8002116: 697b ldr r3, [r7, #20] + 8002118: f1b3 3fff cmp.w r3, #4294967295 + 800211c: d10a bne.n 8002134 + __asm volatile + 800211e: f04f 0350 mov.w r3, #80 ; 0x50 + 8002122: f383 8811 msr BASEPRI, r3 + 8002126: f3bf 8f6f isb sy + 800212a: f3bf 8f4f dsb sy + 800212e: 60fb str r3, [r7, #12] +} + 8002130: bf00 nop + 8002132: e7fe b.n 8002132 +} + 8002134: bf00 nop + 8002136: 3718 adds r7, #24 + 8002138: 46bd mov sp, r7 + 800213a: bd80 pop {r7, pc} + 800213c: 0800303c .word 0x0800303c + 8002140: 080024d1 .word 0x080024d1 + 8002144: 200003b0 .word 0x200003b0 + 8002148: 200003ac .word 0x200003ac + 800214c: 20000398 .word 0x20000398 + 8002150: 20000390 .word 0x20000390 + +08002154 : + vPortEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + 8002154: b480 push {r7} + 8002156: af00 add r7, sp, #0 + do not otherwise exhibit real time behaviour. */ + portSOFTWARE_BARRIER(); + + /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment + is used to allow calls to vTaskSuspendAll() to nest. */ + ++uxSchedulerSuspended; + 8002158: 4b04 ldr r3, [pc, #16] ; (800216c ) + 800215a: 681b ldr r3, [r3, #0] + 800215c: 3301 adds r3, #1 + 800215e: 4a03 ldr r2, [pc, #12] ; (800216c ) + 8002160: 6013 str r3, [r2, #0] + + /* Enforces ordering for ports and optimised compilers that may otherwise place + the above increment elsewhere. */ + portMEMORY_BARRIER(); +} + 8002162: bf00 nop + 8002164: 46bd mov sp, r7 + 8002166: f85d 7b04 ldr.w r7, [sp], #4 + 800216a: 4770 bx lr + 800216c: 200003b4 .word 0x200003b4 + +08002170 : + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskResumeAll( void ) +{ + 8002170: b580 push {r7, lr} + 8002172: b084 sub sp, #16 + 8002174: af00 add r7, sp, #0 +TCB_t *pxTCB = NULL; + 8002176: 2300 movs r3, #0 + 8002178: 60fb str r3, [r7, #12] +BaseType_t xAlreadyYielded = pdFALSE; + 800217a: 2300 movs r3, #0 + 800217c: 60bb str r3, [r7, #8] + + /* If uxSchedulerSuspended is zero then this function does not match a + previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended ); + 800217e: 4b41 ldr r3, [pc, #260] ; (8002284 ) + 8002180: 681b ldr r3, [r3, #0] + 8002182: 2b00 cmp r3, #0 + 8002184: d10a bne.n 800219c + __asm volatile + 8002186: f04f 0350 mov.w r3, #80 ; 0x50 + 800218a: f383 8811 msr BASEPRI, r3 + 800218e: f3bf 8f6f isb sy + 8002192: f3bf 8f4f dsb sy + 8002196: 603b str r3, [r7, #0] +} + 8002198: bf00 nop + 800219a: e7fe b.n 800219a + /* It is possible that an ISR caused a task to be removed from an event + list while the scheduler was suspended. If this was the case then the + removed task will have been added to the xPendingReadyList. Once the + scheduler has been resumed it is safe to move all the pending ready + tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + 800219c: f000 fc22 bl 80029e4 + { + --uxSchedulerSuspended; + 80021a0: 4b38 ldr r3, [pc, #224] ; (8002284 ) + 80021a2: 681b ldr r3, [r3, #0] + 80021a4: 3b01 subs r3, #1 + 80021a6: 4a37 ldr r2, [pc, #220] ; (8002284 ) + 80021a8: 6013 str r3, [r2, #0] + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + 80021aa: 4b36 ldr r3, [pc, #216] ; (8002284 ) + 80021ac: 681b ldr r3, [r3, #0] + 80021ae: 2b00 cmp r3, #0 + 80021b0: d161 bne.n 8002276 + { + if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) + 80021b2: 4b35 ldr r3, [pc, #212] ; (8002288 ) + 80021b4: 681b ldr r3, [r3, #0] + 80021b6: 2b00 cmp r3, #0 + 80021b8: d05d beq.n 8002276 + { + /* Move any readied tasks from the pending list into the + appropriate ready list. */ + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) + 80021ba: e02e b.n 800221a + { + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + 80021bc: 4b33 ldr r3, [pc, #204] ; (800228c ) + 80021be: 68db ldr r3, [r3, #12] + 80021c0: 68db ldr r3, [r3, #12] + 80021c2: 60fb str r3, [r7, #12] + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + 80021c4: 68fb ldr r3, [r7, #12] + 80021c6: 3318 adds r3, #24 + 80021c8: 4618 mov r0, r3 + 80021ca: f7ff fd72 bl 8001cb2 + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + 80021ce: 68fb ldr r3, [r7, #12] + 80021d0: 3304 adds r3, #4 + 80021d2: 4618 mov r0, r3 + 80021d4: f7ff fd6d bl 8001cb2 + prvAddTaskToReadyList( pxTCB ); + 80021d8: 68fb ldr r3, [r7, #12] + 80021da: 6adb ldr r3, [r3, #44] ; 0x2c + 80021dc: 2201 movs r2, #1 + 80021de: 409a lsls r2, r3 + 80021e0: 4b2b ldr r3, [pc, #172] ; (8002290 ) + 80021e2: 681b ldr r3, [r3, #0] + 80021e4: 4313 orrs r3, r2 + 80021e6: 4a2a ldr r2, [pc, #168] ; (8002290 ) + 80021e8: 6013 str r3, [r2, #0] + 80021ea: 68fb ldr r3, [r7, #12] + 80021ec: 6ada ldr r2, [r3, #44] ; 0x2c + 80021ee: 4613 mov r3, r2 + 80021f0: 009b lsls r3, r3, #2 + 80021f2: 4413 add r3, r2 + 80021f4: 009b lsls r3, r3, #2 + 80021f6: 4a27 ldr r2, [pc, #156] ; (8002294 ) + 80021f8: 441a add r2, r3 + 80021fa: 68fb ldr r3, [r7, #12] + 80021fc: 3304 adds r3, #4 + 80021fe: 4619 mov r1, r3 + 8002200: 4610 mov r0, r2 + 8002202: f7ff fcf9 bl 8001bf8 + + /* If the moved task has a priority higher than the current + task then a yield must be performed. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + 8002206: 68fb ldr r3, [r7, #12] + 8002208: 6ada ldr r2, [r3, #44] ; 0x2c + 800220a: 4b23 ldr r3, [pc, #140] ; (8002298 ) + 800220c: 681b ldr r3, [r3, #0] + 800220e: 6adb ldr r3, [r3, #44] ; 0x2c + 8002210: 429a cmp r2, r3 + 8002212: d302 bcc.n 800221a + { + xYieldPending = pdTRUE; + 8002214: 4b21 ldr r3, [pc, #132] ; (800229c ) + 8002216: 2201 movs r2, #1 + 8002218: 601a str r2, [r3, #0] + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) + 800221a: 4b1c ldr r3, [pc, #112] ; (800228c ) + 800221c: 681b ldr r3, [r3, #0] + 800221e: 2b00 cmp r3, #0 + 8002220: d1cc bne.n 80021bc + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( pxTCB != NULL ) + 8002222: 68fb ldr r3, [r7, #12] + 8002224: 2b00 cmp r3, #0 + 8002226: d001 beq.n 800222c + which may have prevented the next unblock time from being + re-calculated, in which case re-calculate it now. Mainly + important for low power tickless implementations, where + this can prevent an unnecessary exit from low power + state. */ + prvResetNextTaskUnblockTime(); + 8002228: f000 fa08 bl 800263c + /* If any ticks occurred while the scheduler was suspended then + they should be processed now. This ensures the tick count does + not slip, and that any delayed tasks are resumed at the correct + time. */ + { + TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */ + 800222c: 4b1c ldr r3, [pc, #112] ; (80022a0 ) + 800222e: 681b ldr r3, [r3, #0] + 8002230: 607b str r3, [r7, #4] + + if( xPendedCounts > ( TickType_t ) 0U ) + 8002232: 687b ldr r3, [r7, #4] + 8002234: 2b00 cmp r3, #0 + 8002236: d010 beq.n 800225a + { + do + { + if( xTaskIncrementTick() != pdFALSE ) + 8002238: f000 f836 bl 80022a8 + 800223c: 4603 mov r3, r0 + 800223e: 2b00 cmp r3, #0 + 8002240: d002 beq.n 8002248 + { + xYieldPending = pdTRUE; + 8002242: 4b16 ldr r3, [pc, #88] ; (800229c ) + 8002244: 2201 movs r2, #1 + 8002246: 601a str r2, [r3, #0] + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --xPendedCounts; + 8002248: 687b ldr r3, [r7, #4] + 800224a: 3b01 subs r3, #1 + 800224c: 607b str r3, [r7, #4] + } while( xPendedCounts > ( TickType_t ) 0U ); + 800224e: 687b ldr r3, [r7, #4] + 8002250: 2b00 cmp r3, #0 + 8002252: d1f1 bne.n 8002238 + + xPendedTicks = 0; + 8002254: 4b12 ldr r3, [pc, #72] ; (80022a0 ) + 8002256: 2200 movs r2, #0 + 8002258: 601a str r2, [r3, #0] + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xYieldPending != pdFALSE ) + 800225a: 4b10 ldr r3, [pc, #64] ; (800229c ) + 800225c: 681b ldr r3, [r3, #0] + 800225e: 2b00 cmp r3, #0 + 8002260: d009 beq.n 8002276 + { + #if( configUSE_PREEMPTION != 0 ) + { + xAlreadyYielded = pdTRUE; + 8002262: 2301 movs r3, #1 + 8002264: 60bb str r3, [r7, #8] + } + #endif + taskYIELD_IF_USING_PREEMPTION(); + 8002266: 4b0f ldr r3, [pc, #60] ; (80022a4 ) + 8002268: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 800226c: 601a str r2, [r3, #0] + 800226e: f3bf 8f4f dsb sy + 8002272: f3bf 8f6f isb sy + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + 8002276: f000 fbe5 bl 8002a44 + + return xAlreadyYielded; + 800227a: 68bb ldr r3, [r7, #8] +} + 800227c: 4618 mov r0, r3 + 800227e: 3710 adds r7, #16 + 8002280: 46bd mov sp, r7 + 8002282: bd80 pop {r7, pc} + 8002284: 200003b4 .word 0x200003b4 + 8002288: 2000038c .word 0x2000038c + 800228c: 2000034c .word 0x2000034c + 8002290: 20000394 .word 0x20000394 + 8002294: 20000290 .word 0x20000290 + 8002298: 2000028c .word 0x2000028c + 800229c: 200003a0 .word 0x200003a0 + 80022a0: 2000039c .word 0x2000039c + 80022a4: e000ed04 .word 0xe000ed04 + +080022a8 : + +#endif /* INCLUDE_xTaskAbortDelay */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskIncrementTick( void ) +{ + 80022a8: b580 push {r7, lr} + 80022aa: b086 sub sp, #24 + 80022ac: af00 add r7, sp, #0 +TCB_t * pxTCB; +TickType_t xItemValue; +BaseType_t xSwitchRequired = pdFALSE; + 80022ae: 2300 movs r3, #0 + 80022b0: 617b str r3, [r7, #20] + + /* Called by the portable layer each time a tick interrupt occurs. + Increments the tick then checks to see if the new tick value will cause any + tasks to be unblocked. */ + traceTASK_INCREMENT_TICK( xTickCount ); + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + 80022b2: 4b4e ldr r3, [pc, #312] ; (80023ec ) + 80022b4: 681b ldr r3, [r3, #0] + 80022b6: 2b00 cmp r3, #0 + 80022b8: f040 808e bne.w 80023d8 + { + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1; + 80022bc: 4b4c ldr r3, [pc, #304] ; (80023f0 ) + 80022be: 681b ldr r3, [r3, #0] + 80022c0: 3301 adds r3, #1 + 80022c2: 613b str r3, [r7, #16] + + /* Increment the RTOS tick, switching the delayed and overflowed + delayed lists if it wraps to 0. */ + xTickCount = xConstTickCount; + 80022c4: 4a4a ldr r2, [pc, #296] ; (80023f0 ) + 80022c6: 693b ldr r3, [r7, #16] + 80022c8: 6013 str r3, [r2, #0] + + if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */ + 80022ca: 693b ldr r3, [r7, #16] + 80022cc: 2b00 cmp r3, #0 + 80022ce: d120 bne.n 8002312 + { + taskSWITCH_DELAYED_LISTS(); + 80022d0: 4b48 ldr r3, [pc, #288] ; (80023f4 ) + 80022d2: 681b ldr r3, [r3, #0] + 80022d4: 681b ldr r3, [r3, #0] + 80022d6: 2b00 cmp r3, #0 + 80022d8: d00a beq.n 80022f0 + __asm volatile + 80022da: f04f 0350 mov.w r3, #80 ; 0x50 + 80022de: f383 8811 msr BASEPRI, r3 + 80022e2: f3bf 8f6f isb sy + 80022e6: f3bf 8f4f dsb sy + 80022ea: 603b str r3, [r7, #0] +} + 80022ec: bf00 nop + 80022ee: e7fe b.n 80022ee + 80022f0: 4b40 ldr r3, [pc, #256] ; (80023f4 ) + 80022f2: 681b ldr r3, [r3, #0] + 80022f4: 60fb str r3, [r7, #12] + 80022f6: 4b40 ldr r3, [pc, #256] ; (80023f8 ) + 80022f8: 681b ldr r3, [r3, #0] + 80022fa: 4a3e ldr r2, [pc, #248] ; (80023f4 ) + 80022fc: 6013 str r3, [r2, #0] + 80022fe: 4a3e ldr r2, [pc, #248] ; (80023f8 ) + 8002300: 68fb ldr r3, [r7, #12] + 8002302: 6013 str r3, [r2, #0] + 8002304: 4b3d ldr r3, [pc, #244] ; (80023fc ) + 8002306: 681b ldr r3, [r3, #0] + 8002308: 3301 adds r3, #1 + 800230a: 4a3c ldr r2, [pc, #240] ; (80023fc ) + 800230c: 6013 str r3, [r2, #0] + 800230e: f000 f995 bl 800263c + + /* See if this tick has made a timeout expire. Tasks are stored in + the queue in the order of their wake time - meaning once one task + has been found whose block time has not expired there is no need to + look any further down the list. */ + if( xConstTickCount >= xNextTaskUnblockTime ) + 8002312: 4b3b ldr r3, [pc, #236] ; (8002400 ) + 8002314: 681b ldr r3, [r3, #0] + 8002316: 693a ldr r2, [r7, #16] + 8002318: 429a cmp r2, r3 + 800231a: d348 bcc.n 80023ae + { + for( ;; ) + { + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + 800231c: 4b35 ldr r3, [pc, #212] ; (80023f4 ) + 800231e: 681b ldr r3, [r3, #0] + 8002320: 681b ldr r3, [r3, #0] + 8002322: 2b00 cmp r3, #0 + 8002324: d104 bne.n 8002330 + /* The delayed list is empty. Set xNextTaskUnblockTime + to the maximum possible value so it is extremely + unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass + next time through. */ + xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + 8002326: 4b36 ldr r3, [pc, #216] ; (8002400 ) + 8002328: f04f 32ff mov.w r2, #4294967295 + 800232c: 601a str r2, [r3, #0] + break; + 800232e: e03e b.n 80023ae + { + /* The delayed list is not empty, get the value of the + item at the head of the delayed list. This is the time + at which the task at the head of the delayed list must + be removed from the Blocked state. */ + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + 8002330: 4b30 ldr r3, [pc, #192] ; (80023f4 ) + 8002332: 681b ldr r3, [r3, #0] + 8002334: 68db ldr r3, [r3, #12] + 8002336: 68db ldr r3, [r3, #12] + 8002338: 60bb str r3, [r7, #8] + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); + 800233a: 68bb ldr r3, [r7, #8] + 800233c: 685b ldr r3, [r3, #4] + 800233e: 607b str r3, [r7, #4] + + if( xConstTickCount < xItemValue ) + 8002340: 693a ldr r2, [r7, #16] + 8002342: 687b ldr r3, [r7, #4] + 8002344: 429a cmp r2, r3 + 8002346: d203 bcs.n 8002350 + /* It is not time to unblock this item yet, but the + item value is the time at which the task at the head + of the blocked list must be removed from the Blocked + state - so record the item value in + xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + 8002348: 4a2d ldr r2, [pc, #180] ; (8002400 ) + 800234a: 687b ldr r3, [r7, #4] + 800234c: 6013 str r3, [r2, #0] + break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */ + 800234e: e02e b.n 80023ae + { + mtCOVERAGE_TEST_MARKER(); + } + + /* It is time to remove the item from the Blocked state. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + 8002350: 68bb ldr r3, [r7, #8] + 8002352: 3304 adds r3, #4 + 8002354: 4618 mov r0, r3 + 8002356: f7ff fcac bl 8001cb2 + + /* Is the task waiting on an event also? If so remove + it from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + 800235a: 68bb ldr r3, [r7, #8] + 800235c: 6a9b ldr r3, [r3, #40] ; 0x28 + 800235e: 2b00 cmp r3, #0 + 8002360: d004 beq.n 800236c + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + 8002362: 68bb ldr r3, [r7, #8] + 8002364: 3318 adds r3, #24 + 8002366: 4618 mov r0, r3 + 8002368: f7ff fca3 bl 8001cb2 + mtCOVERAGE_TEST_MARKER(); + } + + /* Place the unblocked task into the appropriate ready + list. */ + prvAddTaskToReadyList( pxTCB ); + 800236c: 68bb ldr r3, [r7, #8] + 800236e: 6adb ldr r3, [r3, #44] ; 0x2c + 8002370: 2201 movs r2, #1 + 8002372: 409a lsls r2, r3 + 8002374: 4b23 ldr r3, [pc, #140] ; (8002404 ) + 8002376: 681b ldr r3, [r3, #0] + 8002378: 4313 orrs r3, r2 + 800237a: 4a22 ldr r2, [pc, #136] ; (8002404 ) + 800237c: 6013 str r3, [r2, #0] + 800237e: 68bb ldr r3, [r7, #8] + 8002380: 6ada ldr r2, [r3, #44] ; 0x2c + 8002382: 4613 mov r3, r2 + 8002384: 009b lsls r3, r3, #2 + 8002386: 4413 add r3, r2 + 8002388: 009b lsls r3, r3, #2 + 800238a: 4a1f ldr r2, [pc, #124] ; (8002408 ) + 800238c: 441a add r2, r3 + 800238e: 68bb ldr r3, [r7, #8] + 8002390: 3304 adds r3, #4 + 8002392: 4619 mov r1, r3 + 8002394: 4610 mov r0, r2 + 8002396: f7ff fc2f bl 8001bf8 + { + /* Preemption is on, but a context switch should + only be performed if the unblocked task has a + priority that is equal to or higher than the + currently executing task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + 800239a: 68bb ldr r3, [r7, #8] + 800239c: 6ada ldr r2, [r3, #44] ; 0x2c + 800239e: 4b1b ldr r3, [pc, #108] ; (800240c ) + 80023a0: 681b ldr r3, [r3, #0] + 80023a2: 6adb ldr r3, [r3, #44] ; 0x2c + 80023a4: 429a cmp r2, r3 + 80023a6: d3b9 bcc.n 800231c + { + xSwitchRequired = pdTRUE; + 80023a8: 2301 movs r3, #1 + 80023aa: 617b str r3, [r7, #20] + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + 80023ac: e7b6 b.n 800231c + /* Tasks of equal priority to the currently running task will share + processing time (time slice) if preemption is on, and the application + writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 ) + 80023ae: 4b17 ldr r3, [pc, #92] ; (800240c ) + 80023b0: 681b ldr r3, [r3, #0] + 80023b2: 6ada ldr r2, [r3, #44] ; 0x2c + 80023b4: 4914 ldr r1, [pc, #80] ; (8002408 ) + 80023b6: 4613 mov r3, r2 + 80023b8: 009b lsls r3, r3, #2 + 80023ba: 4413 add r3, r2 + 80023bc: 009b lsls r3, r3, #2 + 80023be: 440b add r3, r1 + 80023c0: 681b ldr r3, [r3, #0] + 80023c2: 2b01 cmp r3, #1 + 80023c4: d901 bls.n 80023ca + { + xSwitchRequired = pdTRUE; + 80023c6: 2301 movs r3, #1 + 80023c8: 617b str r3, [r7, #20] + } + #endif /* configUSE_TICK_HOOK */ + + #if ( configUSE_PREEMPTION == 1 ) + { + if( xYieldPending != pdFALSE ) + 80023ca: 4b11 ldr r3, [pc, #68] ; (8002410 ) + 80023cc: 681b ldr r3, [r3, #0] + 80023ce: 2b00 cmp r3, #0 + 80023d0: d007 beq.n 80023e2 + { + xSwitchRequired = pdTRUE; + 80023d2: 2301 movs r3, #1 + 80023d4: 617b str r3, [r7, #20] + 80023d6: e004 b.n 80023e2 + } + #endif /* configUSE_PREEMPTION */ + } + else + { + ++xPendedTicks; + 80023d8: 4b0e ldr r3, [pc, #56] ; (8002414 ) + 80023da: 681b ldr r3, [r3, #0] + 80023dc: 3301 adds r3, #1 + 80023de: 4a0d ldr r2, [pc, #52] ; (8002414 ) + 80023e0: 6013 str r3, [r2, #0] + vApplicationTickHook(); + } + #endif + } + + return xSwitchRequired; + 80023e2: 697b ldr r3, [r7, #20] +} + 80023e4: 4618 mov r0, r3 + 80023e6: 3718 adds r7, #24 + 80023e8: 46bd mov sp, r7 + 80023ea: bd80 pop {r7, pc} + 80023ec: 200003b4 .word 0x200003b4 + 80023f0: 20000390 .word 0x20000390 + 80023f4: 20000344 .word 0x20000344 + 80023f8: 20000348 .word 0x20000348 + 80023fc: 200003a4 .word 0x200003a4 + 8002400: 200003ac .word 0x200003ac + 8002404: 20000394 .word 0x20000394 + 8002408: 20000290 .word 0x20000290 + 800240c: 2000028c .word 0x2000028c + 8002410: 200003a0 .word 0x200003a0 + 8002414: 2000039c .word 0x2000039c + +08002418 : + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +void vTaskSwitchContext( void ) +{ + 8002418: b480 push {r7} + 800241a: b087 sub sp, #28 + 800241c: af00 add r7, sp, #0 + if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) + 800241e: 4b27 ldr r3, [pc, #156] ; (80024bc ) + 8002420: 681b ldr r3, [r3, #0] + 8002422: 2b00 cmp r3, #0 + 8002424: d003 beq.n 800242e + { + /* The scheduler is currently suspended - do not allow a context + switch. */ + xYieldPending = pdTRUE; + 8002426: 4b26 ldr r3, [pc, #152] ; (80024c0 ) + 8002428: 2201 movs r2, #1 + 800242a: 601a str r2, [r3, #0] + for additional information. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + } +} + 800242c: e03f b.n 80024ae + xYieldPending = pdFALSE; + 800242e: 4b24 ldr r3, [pc, #144] ; (80024c0 ) + 8002430: 2200 movs r2, #0 + 8002432: 601a str r2, [r3, #0] + taskSELECT_HIGHEST_PRIORITY_TASK(); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + 8002434: 4b23 ldr r3, [pc, #140] ; (80024c4 ) + 8002436: 681b ldr r3, [r3, #0] + 8002438: 60fb str r3, [r7, #12] + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + 800243a: 68fb ldr r3, [r7, #12] + 800243c: fab3 f383 clz r3, r3 + 8002440: 72fb strb r3, [r7, #11] + return ucReturn; + 8002442: 7afb ldrb r3, [r7, #11] + 8002444: f1c3 031f rsb r3, r3, #31 + 8002448: 617b str r3, [r7, #20] + 800244a: 491f ldr r1, [pc, #124] ; (80024c8 ) + 800244c: 697a ldr r2, [r7, #20] + 800244e: 4613 mov r3, r2 + 8002450: 009b lsls r3, r3, #2 + 8002452: 4413 add r3, r2 + 8002454: 009b lsls r3, r3, #2 + 8002456: 440b add r3, r1 + 8002458: 681b ldr r3, [r3, #0] + 800245a: 2b00 cmp r3, #0 + 800245c: d10a bne.n 8002474 + __asm volatile + 800245e: f04f 0350 mov.w r3, #80 ; 0x50 + 8002462: f383 8811 msr BASEPRI, r3 + 8002466: f3bf 8f6f isb sy + 800246a: f3bf 8f4f dsb sy + 800246e: 607b str r3, [r7, #4] +} + 8002470: bf00 nop + 8002472: e7fe b.n 8002472 + 8002474: 697a ldr r2, [r7, #20] + 8002476: 4613 mov r3, r2 + 8002478: 009b lsls r3, r3, #2 + 800247a: 4413 add r3, r2 + 800247c: 009b lsls r3, r3, #2 + 800247e: 4a12 ldr r2, [pc, #72] ; (80024c8 ) + 8002480: 4413 add r3, r2 + 8002482: 613b str r3, [r7, #16] + 8002484: 693b ldr r3, [r7, #16] + 8002486: 685b ldr r3, [r3, #4] + 8002488: 685a ldr r2, [r3, #4] + 800248a: 693b ldr r3, [r7, #16] + 800248c: 605a str r2, [r3, #4] + 800248e: 693b ldr r3, [r7, #16] + 8002490: 685a ldr r2, [r3, #4] + 8002492: 693b ldr r3, [r7, #16] + 8002494: 3308 adds r3, #8 + 8002496: 429a cmp r2, r3 + 8002498: d104 bne.n 80024a4 + 800249a: 693b ldr r3, [r7, #16] + 800249c: 685b ldr r3, [r3, #4] + 800249e: 685a ldr r2, [r3, #4] + 80024a0: 693b ldr r3, [r7, #16] + 80024a2: 605a str r2, [r3, #4] + 80024a4: 693b ldr r3, [r7, #16] + 80024a6: 685b ldr r3, [r3, #4] + 80024a8: 68db ldr r3, [r3, #12] + 80024aa: 4a08 ldr r2, [pc, #32] ; (80024cc ) + 80024ac: 6013 str r3, [r2, #0] +} + 80024ae: bf00 nop + 80024b0: 371c adds r7, #28 + 80024b2: 46bd mov sp, r7 + 80024b4: f85d 7b04 ldr.w r7, [sp], #4 + 80024b8: 4770 bx lr + 80024ba: bf00 nop + 80024bc: 200003b4 .word 0x200003b4 + 80024c0: 200003a0 .word 0x200003a0 + 80024c4: 20000394 .word 0x20000394 + 80024c8: 20000290 .word 0x20000290 + 80024cc: 2000028c .word 0x2000028c + +080024d0 : + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + 80024d0: b580 push {r7, lr} + 80024d2: b082 sub sp, #8 + 80024d4: af00 add r7, sp, #0 + 80024d6: 6078 str r0, [r7, #4] + + for( ;; ) + { + /* See if any tasks have deleted themselves - if so then the idle task + is responsible for freeing the deleted task's TCB and stack. */ + prvCheckTasksWaitingTermination(); + 80024d8: f000 f852 bl 8002580 + + A critical region is not required here as we are just reading from + the list, and an occasional incorrect value will not matter. If + the ready list at the idle priority contains more than one task + then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) + 80024dc: 4b06 ldr r3, [pc, #24] ; (80024f8 ) + 80024de: 681b ldr r3, [r3, #0] + 80024e0: 2b01 cmp r3, #1 + 80024e2: d9f9 bls.n 80024d8 + { + taskYIELD(); + 80024e4: 4b05 ldr r3, [pc, #20] ; (80024fc ) + 80024e6: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 80024ea: 601a str r2, [r3, #0] + 80024ec: f3bf 8f4f dsb sy + 80024f0: f3bf 8f6f isb sy + prvCheckTasksWaitingTermination(); + 80024f4: e7f0 b.n 80024d8 + 80024f6: bf00 nop + 80024f8: 20000290 .word 0x20000290 + 80024fc: e000ed04 .word 0xe000ed04 + +08002500 : + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseTaskLists( void ) +{ + 8002500: b580 push {r7, lr} + 8002502: b082 sub sp, #8 + 8002504: af00 add r7, sp, #0 +UBaseType_t uxPriority; + + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) + 8002506: 2300 movs r3, #0 + 8002508: 607b str r3, [r7, #4] + 800250a: e00c b.n 8002526 + { + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); + 800250c: 687a ldr r2, [r7, #4] + 800250e: 4613 mov r3, r2 + 8002510: 009b lsls r3, r3, #2 + 8002512: 4413 add r3, r2 + 8002514: 009b lsls r3, r3, #2 + 8002516: 4a12 ldr r2, [pc, #72] ; (8002560 ) + 8002518: 4413 add r3, r2 + 800251a: 4618 mov r0, r3 + 800251c: f7ff fb3f bl 8001b9e + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) + 8002520: 687b ldr r3, [r7, #4] + 8002522: 3301 adds r3, #1 + 8002524: 607b str r3, [r7, #4] + 8002526: 687b ldr r3, [r7, #4] + 8002528: 2b06 cmp r3, #6 + 800252a: d9ef bls.n 800250c + } + + vListInitialise( &xDelayedTaskList1 ); + 800252c: 480d ldr r0, [pc, #52] ; (8002564 ) + 800252e: f7ff fb36 bl 8001b9e + vListInitialise( &xDelayedTaskList2 ); + 8002532: 480d ldr r0, [pc, #52] ; (8002568 ) + 8002534: f7ff fb33 bl 8001b9e + vListInitialise( &xPendingReadyList ); + 8002538: 480c ldr r0, [pc, #48] ; (800256c ) + 800253a: f7ff fb30 bl 8001b9e + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( &xTasksWaitingTermination ); + 800253e: 480c ldr r0, [pc, #48] ; (8002570 ) + 8002540: f7ff fb2d bl 8001b9e + } + #endif /* INCLUDE_vTaskDelete */ + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( &xSuspendedTaskList ); + 8002544: 480b ldr r0, [pc, #44] ; (8002574 ) + 8002546: f7ff fb2a bl 8001b9e + } + #endif /* INCLUDE_vTaskSuspend */ + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + 800254a: 4b0b ldr r3, [pc, #44] ; (8002578 ) + 800254c: 4a05 ldr r2, [pc, #20] ; (8002564 ) + 800254e: 601a str r2, [r3, #0] + pxOverflowDelayedTaskList = &xDelayedTaskList2; + 8002550: 4b0a ldr r3, [pc, #40] ; (800257c ) + 8002552: 4a05 ldr r2, [pc, #20] ; (8002568 ) + 8002554: 601a str r2, [r3, #0] +} + 8002556: bf00 nop + 8002558: 3708 adds r7, #8 + 800255a: 46bd mov sp, r7 + 800255c: bd80 pop {r7, pc} + 800255e: bf00 nop + 8002560: 20000290 .word 0x20000290 + 8002564: 2000031c .word 0x2000031c + 8002568: 20000330 .word 0x20000330 + 800256c: 2000034c .word 0x2000034c + 8002570: 20000360 .word 0x20000360 + 8002574: 20000378 .word 0x20000378 + 8002578: 20000344 .word 0x20000344 + 800257c: 20000348 .word 0x20000348 + +08002580 : +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + 8002580: b580 push {r7, lr} + 8002582: b082 sub sp, #8 + 8002584: af00 add r7, sp, #0 + { + TCB_t *pxTCB; + + /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL() + being called too often in the idle task. */ + while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + 8002586: e019 b.n 80025bc + { + taskENTER_CRITICAL(); + 8002588: f000 fa2c bl 80029e4 + { + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + 800258c: 4b10 ldr r3, [pc, #64] ; (80025d0 ) + 800258e: 68db ldr r3, [r3, #12] + 8002590: 68db ldr r3, [r3, #12] + 8002592: 607b str r3, [r7, #4] + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + 8002594: 687b ldr r3, [r7, #4] + 8002596: 3304 adds r3, #4 + 8002598: 4618 mov r0, r3 + 800259a: f7ff fb8a bl 8001cb2 + --uxCurrentNumberOfTasks; + 800259e: 4b0d ldr r3, [pc, #52] ; (80025d4 ) + 80025a0: 681b ldr r3, [r3, #0] + 80025a2: 3b01 subs r3, #1 + 80025a4: 4a0b ldr r2, [pc, #44] ; (80025d4 ) + 80025a6: 6013 str r3, [r2, #0] + --uxDeletedTasksWaitingCleanUp; + 80025a8: 4b0b ldr r3, [pc, #44] ; (80025d8 ) + 80025aa: 681b ldr r3, [r3, #0] + 80025ac: 3b01 subs r3, #1 + 80025ae: 4a0a ldr r2, [pc, #40] ; (80025d8 ) + 80025b0: 6013 str r3, [r2, #0] + } + taskEXIT_CRITICAL(); + 80025b2: f000 fa47 bl 8002a44 + + prvDeleteTCB( pxTCB ); + 80025b6: 6878 ldr r0, [r7, #4] + 80025b8: f000 f810 bl 80025dc + while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + 80025bc: 4b06 ldr r3, [pc, #24] ; (80025d8 ) + 80025be: 681b ldr r3, [r3, #0] + 80025c0: 2b00 cmp r3, #0 + 80025c2: d1e1 bne.n 8002588 + } + } + #endif /* INCLUDE_vTaskDelete */ +} + 80025c4: bf00 nop + 80025c6: bf00 nop + 80025c8: 3708 adds r7, #8 + 80025ca: 46bd mov sp, r7 + 80025cc: bd80 pop {r7, pc} + 80025ce: bf00 nop + 80025d0: 20000360 .word 0x20000360 + 80025d4: 2000038c .word 0x2000038c + 80025d8: 20000374 .word 0x20000374 + +080025dc : +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t *pxTCB ) + { + 80025dc: b580 push {r7, lr} + 80025de: b084 sub sp, #16 + 80025e0: af00 add r7, sp, #0 + 80025e2: 6078 str r0, [r7, #4] + #elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* The task could have been allocated statically or dynamically, so + check what was statically allocated before trying to free the + memory. */ + if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) + 80025e4: 687b ldr r3, [r7, #4] + 80025e6: f893 3051 ldrb.w r3, [r3, #81] ; 0x51 + 80025ea: 2b00 cmp r3, #0 + 80025ec: d108 bne.n 8002600 + { + /* Both the stack and TCB were allocated dynamically, so both + must be freed. */ + vPortFree( pxTCB->pxStack ); + 80025ee: 687b ldr r3, [r7, #4] + 80025f0: 6b1b ldr r3, [r3, #48] ; 0x30 + 80025f2: 4618 mov r0, r3 + 80025f4: f000 fba4 bl 8002d40 + vPortFree( pxTCB ); + 80025f8: 6878 ldr r0, [r7, #4] + 80025fa: f000 fba1 bl 8002d40 + configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + 80025fe: e018 b.n 8002632 + else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) + 8002600: 687b ldr r3, [r7, #4] + 8002602: f893 3051 ldrb.w r3, [r3, #81] ; 0x51 + 8002606: 2b01 cmp r3, #1 + 8002608: d103 bne.n 8002612 + vPortFree( pxTCB ); + 800260a: 6878 ldr r0, [r7, #4] + 800260c: f000 fb98 bl 8002d40 + } + 8002610: e00f b.n 8002632 + configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); + 8002612: 687b ldr r3, [r7, #4] + 8002614: f893 3051 ldrb.w r3, [r3, #81] ; 0x51 + 8002618: 2b02 cmp r3, #2 + 800261a: d00a beq.n 8002632 + __asm volatile + 800261c: f04f 0350 mov.w r3, #80 ; 0x50 + 8002620: f383 8811 msr BASEPRI, r3 + 8002624: f3bf 8f6f isb sy + 8002628: f3bf 8f4f dsb sy + 800262c: 60fb str r3, [r7, #12] +} + 800262e: bf00 nop + 8002630: e7fe b.n 8002630 + } + 8002632: bf00 nop + 8002634: 3710 adds r7, #16 + 8002636: 46bd mov sp, r7 + 8002638: bd80 pop {r7, pc} + ... + +0800263c : + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +static void prvResetNextTaskUnblockTime( void ) +{ + 800263c: b480 push {r7} + 800263e: b083 sub sp, #12 + 8002640: af00 add r7, sp, #0 +TCB_t *pxTCB; + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + 8002642: 4b0c ldr r3, [pc, #48] ; (8002674 ) + 8002644: 681b ldr r3, [r3, #0] + 8002646: 681b ldr r3, [r3, #0] + 8002648: 2b00 cmp r3, #0 + 800264a: d104 bne.n 8002656 + { + /* The new current delayed list is empty. Set xNextTaskUnblockTime to + the maximum possible value so it is extremely unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass until + there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + 800264c: 4b0a ldr r3, [pc, #40] ; (8002678 ) + 800264e: f04f 32ff mov.w r2, #4294967295 + 8002652: 601a str r2, [r3, #0] + which the task at the head of the delayed list should be removed + from the Blocked state. */ + ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); + } +} + 8002654: e008 b.n 8002668 + ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + 8002656: 4b07 ldr r3, [pc, #28] ; (8002674 ) + 8002658: 681b ldr r3, [r3, #0] + 800265a: 68db ldr r3, [r3, #12] + 800265c: 68db ldr r3, [r3, #12] + 800265e: 607b str r3, [r7, #4] + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); + 8002660: 687b ldr r3, [r7, #4] + 8002662: 685b ldr r3, [r3, #4] + 8002664: 4a04 ldr r2, [pc, #16] ; (8002678 ) + 8002666: 6013 str r3, [r2, #0] +} + 8002668: bf00 nop + 800266a: 370c adds r7, #12 + 800266c: 46bd mov sp, r7 + 800266e: f85d 7b04 ldr.w r7, [sp], #4 + 8002672: 4770 bx lr + 8002674: 20000344 .word 0x20000344 + 8002678: 200003ac .word 0x200003ac + +0800267c : +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + BaseType_t xTaskGetSchedulerState( void ) + { + 800267c: b480 push {r7} + 800267e: b083 sub sp, #12 + 8002680: af00 add r7, sp, #0 + BaseType_t xReturn; + + if( xSchedulerRunning == pdFALSE ) + 8002682: 4b0b ldr r3, [pc, #44] ; (80026b0 ) + 8002684: 681b ldr r3, [r3, #0] + 8002686: 2b00 cmp r3, #0 + 8002688: d102 bne.n 8002690 + { + xReturn = taskSCHEDULER_NOT_STARTED; + 800268a: 2301 movs r3, #1 + 800268c: 607b str r3, [r7, #4] + 800268e: e008 b.n 80026a2 + } + else + { + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + 8002690: 4b08 ldr r3, [pc, #32] ; (80026b4 ) + 8002692: 681b ldr r3, [r3, #0] + 8002694: 2b00 cmp r3, #0 + 8002696: d102 bne.n 800269e + { + xReturn = taskSCHEDULER_RUNNING; + 8002698: 2302 movs r3, #2 + 800269a: 607b str r3, [r7, #4] + 800269c: e001 b.n 80026a2 + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + 800269e: 2300 movs r3, #0 + 80026a0: 607b str r3, [r7, #4] + } + } + + return xReturn; + 80026a2: 687b ldr r3, [r7, #4] + } + 80026a4: 4618 mov r0, r3 + 80026a6: 370c adds r7, #12 + 80026a8: 46bd mov sp, r7 + 80026aa: f85d 7b04 ldr.w r7, [sp], #4 + 80026ae: 4770 bx lr + 80026b0: 20000398 .word 0x20000398 + 80026b4: 200003b4 .word 0x200003b4 + +080026b8 : + +#endif +/*-----------------------------------------------------------*/ + +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) +{ + 80026b8: b580 push {r7, lr} + 80026ba: b084 sub sp, #16 + 80026bc: af00 add r7, sp, #0 + 80026be: 6078 str r0, [r7, #4] + 80026c0: 6039 str r1, [r7, #0] +TickType_t xTimeToWake; +const TickType_t xConstTickCount = xTickCount; + 80026c2: 4b29 ldr r3, [pc, #164] ; (8002768 ) + 80026c4: 681b ldr r3, [r3, #0] + 80026c6: 60fb str r3, [r7, #12] + } + #endif + + /* Remove the task from the ready list before adding it to the blocked list + as the same list item is used for both lists. */ + if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + 80026c8: 4b28 ldr r3, [pc, #160] ; (800276c ) + 80026ca: 681b ldr r3, [r3, #0] + 80026cc: 3304 adds r3, #4 + 80026ce: 4618 mov r0, r3 + 80026d0: f7ff faef bl 8001cb2 + 80026d4: 4603 mov r3, r0 + 80026d6: 2b00 cmp r3, #0 + 80026d8: d10b bne.n 80026f2 + { + /* The current task must be in a ready list, so there is no need to + check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB cannot change as it is the calling task. pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */ + 80026da: 4b24 ldr r3, [pc, #144] ; (800276c ) + 80026dc: 681b ldr r3, [r3, #0] + 80026de: 6adb ldr r3, [r3, #44] ; 0x2c + 80026e0: 2201 movs r2, #1 + 80026e2: fa02 f303 lsl.w r3, r2, r3 + 80026e6: 43da mvns r2, r3 + 80026e8: 4b21 ldr r3, [pc, #132] ; (8002770 ) + 80026ea: 681b ldr r3, [r3, #0] + 80026ec: 4013 ands r3, r2 + 80026ee: 4a20 ldr r2, [pc, #128] ; (8002770 ) + 80026f0: 6013 str r3, [r2, #0] + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) ) + 80026f2: 687b ldr r3, [r7, #4] + 80026f4: f1b3 3fff cmp.w r3, #4294967295 + 80026f8: d10a bne.n 8002710 + 80026fa: 683b ldr r3, [r7, #0] + 80026fc: 2b00 cmp r3, #0 + 80026fe: d007 beq.n 8002710 + { + /* Add the task to the suspended task list instead of a delayed task + list to ensure it is not woken by a timing event. It will block + indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) ); + 8002700: 4b1a ldr r3, [pc, #104] ; (800276c ) + 8002702: 681b ldr r3, [r3, #0] + 8002704: 3304 adds r3, #4 + 8002706: 4619 mov r1, r3 + 8002708: 481a ldr r0, [pc, #104] ; (8002774 ) + 800270a: f7ff fa75 bl 8001bf8 + + /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */ + ( void ) xCanBlockIndefinitely; + } + #endif /* INCLUDE_vTaskSuspend */ +} + 800270e: e026 b.n 800275e + xTimeToWake = xConstTickCount + xTicksToWait; + 8002710: 68fa ldr r2, [r7, #12] + 8002712: 687b ldr r3, [r7, #4] + 8002714: 4413 add r3, r2 + 8002716: 60bb str r3, [r7, #8] + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + 8002718: 4b14 ldr r3, [pc, #80] ; (800276c ) + 800271a: 681b ldr r3, [r3, #0] + 800271c: 68ba ldr r2, [r7, #8] + 800271e: 605a str r2, [r3, #4] + if( xTimeToWake < xConstTickCount ) + 8002720: 68ba ldr r2, [r7, #8] + 8002722: 68fb ldr r3, [r7, #12] + 8002724: 429a cmp r2, r3 + 8002726: d209 bcs.n 800273c + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + 8002728: 4b13 ldr r3, [pc, #76] ; (8002778 ) + 800272a: 681a ldr r2, [r3, #0] + 800272c: 4b0f ldr r3, [pc, #60] ; (800276c ) + 800272e: 681b ldr r3, [r3, #0] + 8002730: 3304 adds r3, #4 + 8002732: 4619 mov r1, r3 + 8002734: 4610 mov r0, r2 + 8002736: f7ff fa83 bl 8001c40 +} + 800273a: e010 b.n 800275e + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + 800273c: 4b0f ldr r3, [pc, #60] ; (800277c ) + 800273e: 681a ldr r2, [r3, #0] + 8002740: 4b0a ldr r3, [pc, #40] ; (800276c ) + 8002742: 681b ldr r3, [r3, #0] + 8002744: 3304 adds r3, #4 + 8002746: 4619 mov r1, r3 + 8002748: 4610 mov r0, r2 + 800274a: f7ff fa79 bl 8001c40 + if( xTimeToWake < xNextTaskUnblockTime ) + 800274e: 4b0c ldr r3, [pc, #48] ; (8002780 ) + 8002750: 681b ldr r3, [r3, #0] + 8002752: 68ba ldr r2, [r7, #8] + 8002754: 429a cmp r2, r3 + 8002756: d202 bcs.n 800275e + xNextTaskUnblockTime = xTimeToWake; + 8002758: 4a09 ldr r2, [pc, #36] ; (8002780 ) + 800275a: 68bb ldr r3, [r7, #8] + 800275c: 6013 str r3, [r2, #0] +} + 800275e: bf00 nop + 8002760: 3710 adds r7, #16 + 8002762: 46bd mov sp, r7 + 8002764: bd80 pop {r7, pc} + 8002766: bf00 nop + 8002768: 20000390 .word 0x20000390 + 800276c: 2000028c .word 0x2000028c + 8002770: 20000394 .word 0x20000394 + 8002774: 20000378 .word 0x20000378 + 8002778: 20000348 .word 0x20000348 + 800277c: 20000344 .word 0x20000344 + 8002780: 200003ac .word 0x200003ac + +08002784 : + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + 8002784: b480 push {r7} + 8002786: b085 sub sp, #20 + 8002788: af00 add r7, sp, #0 + 800278a: 60f8 str r0, [r7, #12] + 800278c: 60b9 str r1, [r7, #8] + 800278e: 607a str r2, [r7, #4] + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + 8002790: 68fb ldr r3, [r7, #12] + 8002792: 3b04 subs r3, #4 + 8002794: 60fb str r3, [r7, #12] + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + 8002796: 68fb ldr r3, [r7, #12] + 8002798: f04f 7280 mov.w r2, #16777216 ; 0x1000000 + 800279c: 601a str r2, [r3, #0] + pxTopOfStack--; + 800279e: 68fb ldr r3, [r7, #12] + 80027a0: 3b04 subs r3, #4 + 80027a2: 60fb str r3, [r7, #12] + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + 80027a4: 68bb ldr r3, [r7, #8] + 80027a6: f023 0201 bic.w r2, r3, #1 + 80027aa: 68fb ldr r3, [r7, #12] + 80027ac: 601a str r2, [r3, #0] + pxTopOfStack--; + 80027ae: 68fb ldr r3, [r7, #12] + 80027b0: 3b04 subs r3, #4 + 80027b2: 60fb str r3, [r7, #12] + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + 80027b4: 4a0c ldr r2, [pc, #48] ; (80027e8 ) + 80027b6: 68fb ldr r3, [r7, #12] + 80027b8: 601a str r2, [r3, #0] + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + 80027ba: 68fb ldr r3, [r7, #12] + 80027bc: 3b14 subs r3, #20 + 80027be: 60fb str r3, [r7, #12] + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + 80027c0: 687a ldr r2, [r7, #4] + 80027c2: 68fb ldr r3, [r7, #12] + 80027c4: 601a str r2, [r3, #0] + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + 80027c6: 68fb ldr r3, [r7, #12] + 80027c8: 3b04 subs r3, #4 + 80027ca: 60fb str r3, [r7, #12] + *pxTopOfStack = portINITIAL_EXC_RETURN; + 80027cc: 68fb ldr r3, [r7, #12] + 80027ce: f06f 0202 mvn.w r2, #2 + 80027d2: 601a str r2, [r3, #0] + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + 80027d4: 68fb ldr r3, [r7, #12] + 80027d6: 3b20 subs r3, #32 + 80027d8: 60fb str r3, [r7, #12] + + return pxTopOfStack; + 80027da: 68fb ldr r3, [r7, #12] +} + 80027dc: 4618 mov r0, r3 + 80027de: 3714 adds r7, #20 + 80027e0: 46bd mov sp, r7 + 80027e2: f85d 7b04 ldr.w r7, [sp], #4 + 80027e6: 4770 bx lr + 80027e8: 080027ed .word 0x080027ed + +080027ec : +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + 80027ec: b480 push {r7} + 80027ee: b085 sub sp, #20 + 80027f0: af00 add r7, sp, #0 +volatile uint32_t ulDummy = 0; + 80027f2: 2300 movs r3, #0 + 80027f4: 607b str r3, [r7, #4] + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + 80027f6: 4b12 ldr r3, [pc, #72] ; (8002840 ) + 80027f8: 681b ldr r3, [r3, #0] + 80027fa: f1b3 3fff cmp.w r3, #4294967295 + 80027fe: d00a beq.n 8002816 + __asm volatile + 8002800: f04f 0350 mov.w r3, #80 ; 0x50 + 8002804: f383 8811 msr BASEPRI, r3 + 8002808: f3bf 8f6f isb sy + 800280c: f3bf 8f4f dsb sy + 8002810: 60fb str r3, [r7, #12] +} + 8002812: bf00 nop + 8002814: e7fe b.n 8002814 + __asm volatile + 8002816: f04f 0350 mov.w r3, #80 ; 0x50 + 800281a: f383 8811 msr BASEPRI, r3 + 800281e: f3bf 8f6f isb sy + 8002822: f3bf 8f4f dsb sy + 8002826: 60bb str r3, [r7, #8] +} + 8002828: bf00 nop + portDISABLE_INTERRUPTS(); + while( ulDummy == 0 ) + 800282a: bf00 nop + 800282c: 687b ldr r3, [r7, #4] + 800282e: 2b00 cmp r3, #0 + 8002830: d0fc beq.n 800282c + about code appearing after this function is called - making ulDummy + volatile makes the compiler think the function could return and + therefore not output an 'unreachable code' warning for code that appears + after it. */ + } +} + 8002832: bf00 nop + 8002834: bf00 nop + 8002836: 3714 adds r7, #20 + 8002838: 46bd mov sp, r7 + 800283a: f85d 7b04 ldr.w r7, [sp], #4 + 800283e: 4770 bx lr + 8002840: 2000000c .word 0x2000000c + ... + +08002850 : +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + 8002850: 4b07 ldr r3, [pc, #28] ; (8002870 ) + 8002852: 6819 ldr r1, [r3, #0] + 8002854: 6808 ldr r0, [r1, #0] + 8002856: e8b0 4ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 800285a: f380 8809 msr PSP, r0 + 800285e: f3bf 8f6f isb sy + 8002862: f04f 0000 mov.w r0, #0 + 8002866: f380 8811 msr BASEPRI, r0 + 800286a: 4770 bx lr + 800286c: f3af 8000 nop.w + +08002870 : + 8002870: 2000028c .word 0x2000028c + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} + 8002874: bf00 nop + 8002876: bf00 nop + +08002878 : +{ + /* Start the first task. This also clears the bit that indicates the FPU is + in use in case the FPU was used before the scheduler was started - which + would otherwise result in the unnecessary leaving of space in the SVC stack + for lazy saving of FPU registers. */ + __asm volatile( + 8002878: 4808 ldr r0, [pc, #32] ; (800289c ) + 800287a: 6800 ldr r0, [r0, #0] + 800287c: 6800 ldr r0, [r0, #0] + 800287e: f380 8808 msr MSP, r0 + 8002882: f04f 0000 mov.w r0, #0 + 8002886: f380 8814 msr CONTROL, r0 + 800288a: b662 cpsie i + 800288c: b661 cpsie f + 800288e: f3bf 8f4f dsb sy + 8002892: f3bf 8f6f isb sy + 8002896: df00 svc 0 + 8002898: bf00 nop + " dsb \n" + " isb \n" + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} + 800289a: bf00 nop + 800289c: e000ed08 .word 0xe000ed08 + +080028a0 : + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + 80028a0: b580 push {r7, lr} + 80028a2: b086 sub sp, #24 + 80028a4: af00 add r7, sp, #0 + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + the r0p1 parts. r0p1 parts should use the port from the + /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + 80028a6: 4b46 ldr r3, [pc, #280] ; (80029c0 ) + 80028a8: 681b ldr r3, [r3, #0] + 80028aa: 4a46 ldr r2, [pc, #280] ; (80029c4 ) + 80028ac: 4293 cmp r3, r2 + 80028ae: d10a bne.n 80028c6 + __asm volatile + 80028b0: f04f 0350 mov.w r3, #80 ; 0x50 + 80028b4: f383 8811 msr BASEPRI, r3 + 80028b8: f3bf 8f6f isb sy + 80028bc: f3bf 8f4f dsb sy + 80028c0: 613b str r3, [r7, #16] +} + 80028c2: bf00 nop + 80028c4: e7fe b.n 80028c4 + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + 80028c6: 4b3e ldr r3, [pc, #248] ; (80029c0 ) + 80028c8: 681b ldr r3, [r3, #0] + 80028ca: 4a3f ldr r2, [pc, #252] ; (80029c8 ) + 80028cc: 4293 cmp r3, r2 + 80028ce: d10a bne.n 80028e6 + __asm volatile + 80028d0: f04f 0350 mov.w r3, #80 ; 0x50 + 80028d4: f383 8811 msr BASEPRI, r3 + 80028d8: f3bf 8f6f isb sy + 80028dc: f3bf 8f4f dsb sy + 80028e0: 60fb str r3, [r7, #12] +} + 80028e2: bf00 nop + 80028e4: e7fe b.n 80028e4 + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + 80028e6: 4b39 ldr r3, [pc, #228] ; (80029cc ) + 80028e8: 617b str r3, [r7, #20] + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + 80028ea: 697b ldr r3, [r7, #20] + 80028ec: 781b ldrb r3, [r3, #0] + 80028ee: b2db uxtb r3, r3 + 80028f0: 607b str r3, [r7, #4] + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + 80028f2: 697b ldr r3, [r7, #20] + 80028f4: 22ff movs r2, #255 ; 0xff + 80028f6: 701a strb r2, [r3, #0] + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + 80028f8: 697b ldr r3, [r7, #20] + 80028fa: 781b ldrb r3, [r3, #0] + 80028fc: b2db uxtb r3, r3 + 80028fe: 70fb strb r3, [r7, #3] + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + 8002900: 78fb ldrb r3, [r7, #3] + 8002902: b2db uxtb r3, r3 + 8002904: f003 0350 and.w r3, r3, #80 ; 0x50 + 8002908: b2da uxtb r2, r3 + 800290a: 4b31 ldr r3, [pc, #196] ; (80029d0 ) + 800290c: 701a strb r2, [r3, #0] + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + 800290e: 4b31 ldr r3, [pc, #196] ; (80029d4 ) + 8002910: 2207 movs r2, #7 + 8002912: 601a str r2, [r3, #0] + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + 8002914: e009 b.n 800292a + { + ulMaxPRIGROUPValue--; + 8002916: 4b2f ldr r3, [pc, #188] ; (80029d4 ) + 8002918: 681b ldr r3, [r3, #0] + 800291a: 3b01 subs r3, #1 + 800291c: 4a2d ldr r2, [pc, #180] ; (80029d4 ) + 800291e: 6013 str r3, [r2, #0] + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + 8002920: 78fb ldrb r3, [r7, #3] + 8002922: b2db uxtb r3, r3 + 8002924: 005b lsls r3, r3, #1 + 8002926: b2db uxtb r3, r3 + 8002928: 70fb strb r3, [r7, #3] + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + 800292a: 78fb ldrb r3, [r7, #3] + 800292c: b2db uxtb r3, r3 + 800292e: f003 0380 and.w r3, r3, #128 ; 0x80 + 8002932: 2b80 cmp r3, #128 ; 0x80 + 8002934: d0ef beq.n 8002916 + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + priority bits matches the number of priority bits actually queried + from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + 8002936: 4b27 ldr r3, [pc, #156] ; (80029d4 ) + 8002938: 681b ldr r3, [r3, #0] + 800293a: f1c3 0307 rsb r3, r3, #7 + 800293e: 2b04 cmp r3, #4 + 8002940: d00a beq.n 8002958 + __asm volatile + 8002942: f04f 0350 mov.w r3, #80 ; 0x50 + 8002946: f383 8811 msr BASEPRI, r3 + 800294a: f3bf 8f6f isb sy + 800294e: f3bf 8f4f dsb sy + 8002952: 60bb str r3, [r7, #8] +} + 8002954: bf00 nop + 8002956: e7fe b.n 8002956 + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + 8002958: 4b1e ldr r3, [pc, #120] ; (80029d4 ) + 800295a: 681b ldr r3, [r3, #0] + 800295c: 021b lsls r3, r3, #8 + 800295e: 4a1d ldr r2, [pc, #116] ; (80029d4 ) + 8002960: 6013 str r3, [r2, #0] + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + 8002962: 4b1c ldr r3, [pc, #112] ; (80029d4 ) + 8002964: 681b ldr r3, [r3, #0] + 8002966: f403 63e0 and.w r3, r3, #1792 ; 0x700 + 800296a: 4a1a ldr r2, [pc, #104] ; (80029d4 ) + 800296c: 6013 str r3, [r2, #0] + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + 800296e: 687b ldr r3, [r7, #4] + 8002970: b2da uxtb r2, r3 + 8002972: 697b ldr r3, [r7, #20] + 8002974: 701a strb r2, [r3, #0] + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + 8002976: 4b18 ldr r3, [pc, #96] ; (80029d8 ) + 8002978: 681b ldr r3, [r3, #0] + 800297a: 4a17 ldr r2, [pc, #92] ; (80029d8 ) + 800297c: f443 0370 orr.w r3, r3, #15728640 ; 0xf00000 + 8002980: 6013 str r3, [r2, #0] + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + 8002982: 4b15 ldr r3, [pc, #84] ; (80029d8 ) + 8002984: 681b ldr r3, [r3, #0] + 8002986: 4a14 ldr r2, [pc, #80] ; (80029d8 ) + 8002988: f043 4370 orr.w r3, r3, #4026531840 ; 0xf0000000 + 800298c: 6013 str r3, [r2, #0] + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + 800298e: f000 f8dd bl 8002b4c + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + 8002992: 4b12 ldr r3, [pc, #72] ; (80029dc ) + 8002994: 2200 movs r2, #0 + 8002996: 601a str r2, [r3, #0] + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + 8002998: f000 f8fc bl 8002b94 + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + 800299c: 4b10 ldr r3, [pc, #64] ; (80029e0 ) + 800299e: 681b ldr r3, [r3, #0] + 80029a0: 4a0f ldr r2, [pc, #60] ; (80029e0 ) + 80029a2: f043 4340 orr.w r3, r3, #3221225472 ; 0xc0000000 + 80029a6: 6013 str r3, [r2, #0] + + /* Start the first task. */ + prvPortStartFirstTask(); + 80029a8: f7ff ff66 bl 8002878 + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. Call + vTaskSwitchContext() so link time optimisation does not remove the + symbol. */ + vTaskSwitchContext(); + 80029ac: f7ff fd34 bl 8002418 + prvTaskExitError(); + 80029b0: f7ff ff1c bl 80027ec + + /* Should not get here! */ + return 0; + 80029b4: 2300 movs r3, #0 +} + 80029b6: 4618 mov r0, r3 + 80029b8: 3718 adds r7, #24 + 80029ba: 46bd mov sp, r7 + 80029bc: bd80 pop {r7, pc} + 80029be: bf00 nop + 80029c0: e000ed00 .word 0xe000ed00 + 80029c4: 410fc271 .word 0x410fc271 + 80029c8: 410fc270 .word 0x410fc270 + 80029cc: e000e400 .word 0xe000e400 + 80029d0: 200003b8 .word 0x200003b8 + 80029d4: 200003bc .word 0x200003bc + 80029d8: e000ed20 .word 0xe000ed20 + 80029dc: 2000000c .word 0x2000000c + 80029e0: e000ef34 .word 0xe000ef34 + +080029e4 : + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + 80029e4: b480 push {r7} + 80029e6: b083 sub sp, #12 + 80029e8: af00 add r7, sp, #0 + __asm volatile + 80029ea: f04f 0350 mov.w r3, #80 ; 0x50 + 80029ee: f383 8811 msr BASEPRI, r3 + 80029f2: f3bf 8f6f isb sy + 80029f6: f3bf 8f4f dsb sy + 80029fa: 607b str r3, [r7, #4] +} + 80029fc: bf00 nop + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + 80029fe: 4b0f ldr r3, [pc, #60] ; (8002a3c ) + 8002a00: 681b ldr r3, [r3, #0] + 8002a02: 3301 adds r3, #1 + 8002a04: 4a0d ldr r2, [pc, #52] ; (8002a3c ) + 8002a06: 6013 str r3, [r2, #0] + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + 8002a08: 4b0c ldr r3, [pc, #48] ; (8002a3c ) + 8002a0a: 681b ldr r3, [r3, #0] + 8002a0c: 2b01 cmp r3, #1 + 8002a0e: d10f bne.n 8002a30 + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + 8002a10: 4b0b ldr r3, [pc, #44] ; (8002a40 ) + 8002a12: 681b ldr r3, [r3, #0] + 8002a14: b2db uxtb r3, r3 + 8002a16: 2b00 cmp r3, #0 + 8002a18: d00a beq.n 8002a30 + __asm volatile + 8002a1a: f04f 0350 mov.w r3, #80 ; 0x50 + 8002a1e: f383 8811 msr BASEPRI, r3 + 8002a22: f3bf 8f6f isb sy + 8002a26: f3bf 8f4f dsb sy + 8002a2a: 603b str r3, [r7, #0] +} + 8002a2c: bf00 nop + 8002a2e: e7fe b.n 8002a2e + } +} + 8002a30: bf00 nop + 8002a32: 370c adds r7, #12 + 8002a34: 46bd mov sp, r7 + 8002a36: f85d 7b04 ldr.w r7, [sp], #4 + 8002a3a: 4770 bx lr + 8002a3c: 2000000c .word 0x2000000c + 8002a40: e000ed04 .word 0xe000ed04 + +08002a44 : +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + 8002a44: b480 push {r7} + 8002a46: b083 sub sp, #12 + 8002a48: af00 add r7, sp, #0 + configASSERT( uxCriticalNesting ); + 8002a4a: 4b12 ldr r3, [pc, #72] ; (8002a94 ) + 8002a4c: 681b ldr r3, [r3, #0] + 8002a4e: 2b00 cmp r3, #0 + 8002a50: d10a bne.n 8002a68 + __asm volatile + 8002a52: f04f 0350 mov.w r3, #80 ; 0x50 + 8002a56: f383 8811 msr BASEPRI, r3 + 8002a5a: f3bf 8f6f isb sy + 8002a5e: f3bf 8f4f dsb sy + 8002a62: 607b str r3, [r7, #4] +} + 8002a64: bf00 nop + 8002a66: e7fe b.n 8002a66 + uxCriticalNesting--; + 8002a68: 4b0a ldr r3, [pc, #40] ; (8002a94 ) + 8002a6a: 681b ldr r3, [r3, #0] + 8002a6c: 3b01 subs r3, #1 + 8002a6e: 4a09 ldr r2, [pc, #36] ; (8002a94 ) + 8002a70: 6013 str r3, [r2, #0] + if( uxCriticalNesting == 0 ) + 8002a72: 4b08 ldr r3, [pc, #32] ; (8002a94 ) + 8002a74: 681b ldr r3, [r3, #0] + 8002a76: 2b00 cmp r3, #0 + 8002a78: d105 bne.n 8002a86 + 8002a7a: 2300 movs r3, #0 + 8002a7c: 603b str r3, [r7, #0] +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + 8002a7e: 683b ldr r3, [r7, #0] + 8002a80: f383 8811 msr BASEPRI, r3 + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) : "memory" + ); +} + 8002a84: bf00 nop + { + portENABLE_INTERRUPTS(); + } +} + 8002a86: bf00 nop + 8002a88: 370c adds r7, #12 + 8002a8a: 46bd mov sp, r7 + 8002a8c: f85d 7b04 ldr.w r7, [sp], #4 + 8002a90: 4770 bx lr + 8002a92: bf00 nop + 8002a94: 2000000c .word 0x2000000c + ... + +08002aa0 : + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + 8002aa0: f3ef 8009 mrs r0, PSP + 8002aa4: f3bf 8f6f isb sy + 8002aa8: 4b15 ldr r3, [pc, #84] ; (8002b00 ) + 8002aaa: 681a ldr r2, [r3, #0] + 8002aac: f01e 0f10 tst.w lr, #16 + 8002ab0: bf08 it eq + 8002ab2: ed20 8a10 vstmdbeq r0!, {s16-s31} + 8002ab6: e920 4ff0 stmdb r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 8002aba: 6010 str r0, [r2, #0] + 8002abc: e92d 0009 stmdb sp!, {r0, r3} + 8002ac0: f04f 0050 mov.w r0, #80 ; 0x50 + 8002ac4: f380 8811 msr BASEPRI, r0 + 8002ac8: f3bf 8f4f dsb sy + 8002acc: f3bf 8f6f isb sy + 8002ad0: f7ff fca2 bl 8002418 + 8002ad4: f04f 0000 mov.w r0, #0 + 8002ad8: f380 8811 msr BASEPRI, r0 + 8002adc: bc09 pop {r0, r3} + 8002ade: 6819 ldr r1, [r3, #0] + 8002ae0: 6808 ldr r0, [r1, #0] + 8002ae2: e8b0 4ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 8002ae6: f01e 0f10 tst.w lr, #16 + 8002aea: bf08 it eq + 8002aec: ecb0 8a10 vldmiaeq r0!, {s16-s31} + 8002af0: f380 8809 msr PSP, r0 + 8002af4: f3bf 8f6f isb sy + 8002af8: 4770 bx lr + 8002afa: bf00 nop + 8002afc: f3af 8000 nop.w + +08002b00 : + 8002b00: 2000028c .word 0x2000028c + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} + 8002b04: bf00 nop + 8002b06: bf00 nop + +08002b08 : +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + 8002b08: b580 push {r7, lr} + 8002b0a: b082 sub sp, #8 + 8002b0c: af00 add r7, sp, #0 + __asm volatile + 8002b0e: f04f 0350 mov.w r3, #80 ; 0x50 + 8002b12: f383 8811 msr BASEPRI, r3 + 8002b16: f3bf 8f6f isb sy + 8002b1a: f3bf 8f4f dsb sy + 8002b1e: 607b str r3, [r7, #4] +} + 8002b20: bf00 nop + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + 8002b22: f7ff fbc1 bl 80022a8 + 8002b26: 4603 mov r3, r0 + 8002b28: 2b00 cmp r3, #0 + 8002b2a: d003 beq.n 8002b34 + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + 8002b2c: 4b06 ldr r3, [pc, #24] ; (8002b48 ) + 8002b2e: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 8002b32: 601a str r2, [r3, #0] + 8002b34: 2300 movs r3, #0 + 8002b36: 603b str r3, [r7, #0] + __asm volatile + 8002b38: 683b ldr r3, [r7, #0] + 8002b3a: f383 8811 msr BASEPRI, r3 +} + 8002b3e: bf00 nop + } + } + portENABLE_INTERRUPTS(); +} + 8002b40: bf00 nop + 8002b42: 3708 adds r7, #8 + 8002b44: 46bd mov sp, r7 + 8002b46: bd80 pop {r7, pc} + 8002b48: e000ed04 .word 0xe000ed04 + +08002b4c : +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) +{ + 8002b4c: b480 push {r7} + 8002b4e: af00 add r7, sp, #0 + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + 8002b50: 4b0b ldr r3, [pc, #44] ; (8002b80 ) + 8002b52: 2200 movs r2, #0 + 8002b54: 601a str r2, [r3, #0] + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + 8002b56: 4b0b ldr r3, [pc, #44] ; (8002b84 ) + 8002b58: 2200 movs r2, #0 + 8002b5a: 601a str r2, [r3, #0] + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + 8002b5c: 4b0a ldr r3, [pc, #40] ; (8002b88 ) + 8002b5e: 681b ldr r3, [r3, #0] + 8002b60: 4a0a ldr r2, [pc, #40] ; (8002b8c ) + 8002b62: fba2 2303 umull r2, r3, r2, r3 + 8002b66: 099b lsrs r3, r3, #6 + 8002b68: 4a09 ldr r2, [pc, #36] ; (8002b90 ) + 8002b6a: 3b01 subs r3, #1 + 8002b6c: 6013 str r3, [r2, #0] + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + 8002b6e: 4b04 ldr r3, [pc, #16] ; (8002b80 ) + 8002b70: 2207 movs r2, #7 + 8002b72: 601a str r2, [r3, #0] +} + 8002b74: bf00 nop + 8002b76: 46bd mov sp, r7 + 8002b78: f85d 7b04 ldr.w r7, [sp], #4 + 8002b7c: 4770 bx lr + 8002b7e: bf00 nop + 8002b80: e000e010 .word 0xe000e010 + 8002b84: e000e018 .word 0xe000e018 + 8002b88: 20000000 .word 0x20000000 + 8002b8c: 10624dd3 .word 0x10624dd3 + 8002b90: e000e014 .word 0xe000e014 + +08002b94 : +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + 8002b94: f8df 000c ldr.w r0, [pc, #12] ; 8002ba4 + 8002b98: 6801 ldr r1, [r0, #0] + 8002b9a: f441 0170 orr.w r1, r1, #15728640 ; 0xf00000 + 8002b9e: 6001 str r1, [r0, #0] + 8002ba0: 4770 bx lr + " \n" + " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 " + ); +} + 8002ba2: bf00 nop + 8002ba4: e000ed88 .word 0xe000ed88 + +08002ba8 : +static size_t xBlockAllocatedBit = 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ + 8002ba8: b580 push {r7, lr} + 8002baa: b08a sub sp, #40 ; 0x28 + 8002bac: af00 add r7, sp, #0 + 8002bae: 6078 str r0, [r7, #4] +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +void *pvReturn = NULL; + 8002bb0: 2300 movs r3, #0 + 8002bb2: 61fb str r3, [r7, #28] + + vTaskSuspendAll(); + 8002bb4: f7ff face bl 8002154 + { + /* If this is the first call to malloc then the heap will require + initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + 8002bb8: 4b5b ldr r3, [pc, #364] ; (8002d28 ) + 8002bba: 681b ldr r3, [r3, #0] + 8002bbc: 2b00 cmp r3, #0 + 8002bbe: d101 bne.n 8002bc4 + { + prvHeapInit(); + 8002bc0: f000 f920 bl 8002e04 + + /* Check the requested block size is not so large that the top bit is + set. The top bit of the block size member of the BlockLink_t structure + is used to determine who owns the block - the application or the + kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + 8002bc4: 4b59 ldr r3, [pc, #356] ; (8002d2c ) + 8002bc6: 681a ldr r2, [r3, #0] + 8002bc8: 687b ldr r3, [r7, #4] + 8002bca: 4013 ands r3, r2 + 8002bcc: 2b00 cmp r3, #0 + 8002bce: f040 8093 bne.w 8002cf8 + { + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + 8002bd2: 687b ldr r3, [r7, #4] + 8002bd4: 2b00 cmp r3, #0 + 8002bd6: d01d beq.n 8002c14 + { + xWantedSize += xHeapStructSize; + 8002bd8: 2208 movs r2, #8 + 8002bda: 687b ldr r3, [r7, #4] + 8002bdc: 4413 add r3, r2 + 8002bde: 607b str r3, [r7, #4] + + /* Ensure that blocks are always aligned to the required number + of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + 8002be0: 687b ldr r3, [r7, #4] + 8002be2: f003 0307 and.w r3, r3, #7 + 8002be6: 2b00 cmp r3, #0 + 8002be8: d014 beq.n 8002c14 + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + 8002bea: 687b ldr r3, [r7, #4] + 8002bec: f023 0307 bic.w r3, r3, #7 + 8002bf0: 3308 adds r3, #8 + 8002bf2: 607b str r3, [r7, #4] + configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 ); + 8002bf4: 687b ldr r3, [r7, #4] + 8002bf6: f003 0307 and.w r3, r3, #7 + 8002bfa: 2b00 cmp r3, #0 + 8002bfc: d00a beq.n 8002c14 + __asm volatile + 8002bfe: f04f 0350 mov.w r3, #80 ; 0x50 + 8002c02: f383 8811 msr BASEPRI, r3 + 8002c06: f3bf 8f6f isb sy + 8002c0a: f3bf 8f4f dsb sy + 8002c0e: 617b str r3, [r7, #20] +} + 8002c10: bf00 nop + 8002c12: e7fe b.n 8002c12 + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + 8002c14: 687b ldr r3, [r7, #4] + 8002c16: 2b00 cmp r3, #0 + 8002c18: d06e beq.n 8002cf8 + 8002c1a: 4b45 ldr r3, [pc, #276] ; (8002d30 ) + 8002c1c: 681b ldr r3, [r3, #0] + 8002c1e: 687a ldr r2, [r7, #4] + 8002c20: 429a cmp r2, r3 + 8002c22: d869 bhi.n 8002cf8 + { + /* Traverse the list from the start (lowest address) block until + one of adequate size is found. */ + pxPreviousBlock = &xStart; + 8002c24: 4b43 ldr r3, [pc, #268] ; (8002d34 ) + 8002c26: 623b str r3, [r7, #32] + pxBlock = xStart.pxNextFreeBlock; + 8002c28: 4b42 ldr r3, [pc, #264] ; (8002d34 ) + 8002c2a: 681b ldr r3, [r3, #0] + 8002c2c: 627b str r3, [r7, #36] ; 0x24 + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + 8002c2e: e004 b.n 8002c3a + { + pxPreviousBlock = pxBlock; + 8002c30: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c32: 623b str r3, [r7, #32] + pxBlock = pxBlock->pxNextFreeBlock; + 8002c34: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c36: 681b ldr r3, [r3, #0] + 8002c38: 627b str r3, [r7, #36] ; 0x24 + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + 8002c3a: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c3c: 685b ldr r3, [r3, #4] + 8002c3e: 687a ldr r2, [r7, #4] + 8002c40: 429a cmp r2, r3 + 8002c42: d903 bls.n 8002c4c + 8002c44: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c46: 681b ldr r3, [r3, #0] + 8002c48: 2b00 cmp r3, #0 + 8002c4a: d1f1 bne.n 8002c30 + } + + /* If the end marker was reached then a block of adequate size + was not found. */ + if( pxBlock != pxEnd ) + 8002c4c: 4b36 ldr r3, [pc, #216] ; (8002d28 ) + 8002c4e: 681b ldr r3, [r3, #0] + 8002c50: 6a7a ldr r2, [r7, #36] ; 0x24 + 8002c52: 429a cmp r2, r3 + 8002c54: d050 beq.n 8002cf8 + { + /* Return the memory space pointed to - jumping over the + BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + 8002c56: 6a3b ldr r3, [r7, #32] + 8002c58: 681b ldr r3, [r3, #0] + 8002c5a: 2208 movs r2, #8 + 8002c5c: 4413 add r3, r2 + 8002c5e: 61fb str r3, [r7, #28] + + /* This block is being returned for use so must be taken out + of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + 8002c60: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c62: 681a ldr r2, [r3, #0] + 8002c64: 6a3b ldr r3, [r7, #32] + 8002c66: 601a str r2, [r3, #0] + + /* If the block is larger than required it can be split into + two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + 8002c68: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c6a: 685a ldr r2, [r3, #4] + 8002c6c: 687b ldr r3, [r7, #4] + 8002c6e: 1ad2 subs r2, r2, r3 + 8002c70: 2308 movs r3, #8 + 8002c72: 005b lsls r3, r3, #1 + 8002c74: 429a cmp r2, r3 + 8002c76: d91f bls.n 8002cb8 + { + /* This block is to be split into two. Create a new + block following the number of bytes requested. The void + cast is used to prevent byte alignment warnings from the + compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + 8002c78: 6a7a ldr r2, [r7, #36] ; 0x24 + 8002c7a: 687b ldr r3, [r7, #4] + 8002c7c: 4413 add r3, r2 + 8002c7e: 61bb str r3, [r7, #24] + configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + 8002c80: 69bb ldr r3, [r7, #24] + 8002c82: f003 0307 and.w r3, r3, #7 + 8002c86: 2b00 cmp r3, #0 + 8002c88: d00a beq.n 8002ca0 + __asm volatile + 8002c8a: f04f 0350 mov.w r3, #80 ; 0x50 + 8002c8e: f383 8811 msr BASEPRI, r3 + 8002c92: f3bf 8f6f isb sy + 8002c96: f3bf 8f4f dsb sy + 8002c9a: 613b str r3, [r7, #16] +} + 8002c9c: bf00 nop + 8002c9e: e7fe b.n 8002c9e + + /* Calculate the sizes of two blocks split from the + single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + 8002ca0: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002ca2: 685a ldr r2, [r3, #4] + 8002ca4: 687b ldr r3, [r7, #4] + 8002ca6: 1ad2 subs r2, r2, r3 + 8002ca8: 69bb ldr r3, [r7, #24] + 8002caa: 605a str r2, [r3, #4] + pxBlock->xBlockSize = xWantedSize; + 8002cac: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002cae: 687a ldr r2, [r7, #4] + 8002cb0: 605a str r2, [r3, #4] + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + 8002cb2: 69b8 ldr r0, [r7, #24] + 8002cb4: f000 f908 bl 8002ec8 + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + 8002cb8: 4b1d ldr r3, [pc, #116] ; (8002d30 ) + 8002cba: 681a ldr r2, [r3, #0] + 8002cbc: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002cbe: 685b ldr r3, [r3, #4] + 8002cc0: 1ad3 subs r3, r2, r3 + 8002cc2: 4a1b ldr r2, [pc, #108] ; (8002d30 ) + 8002cc4: 6013 str r3, [r2, #0] + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + 8002cc6: 4b1a ldr r3, [pc, #104] ; (8002d30 ) + 8002cc8: 681a ldr r2, [r3, #0] + 8002cca: 4b1b ldr r3, [pc, #108] ; (8002d38 ) + 8002ccc: 681b ldr r3, [r3, #0] + 8002cce: 429a cmp r2, r3 + 8002cd0: d203 bcs.n 8002cda + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + 8002cd2: 4b17 ldr r3, [pc, #92] ; (8002d30 ) + 8002cd4: 681b ldr r3, [r3, #0] + 8002cd6: 4a18 ldr r2, [pc, #96] ; (8002d38 ) + 8002cd8: 6013 str r3, [r2, #0] + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + 8002cda: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002cdc: 685a ldr r2, [r3, #4] + 8002cde: 4b13 ldr r3, [pc, #76] ; (8002d2c ) + 8002ce0: 681b ldr r3, [r3, #0] + 8002ce2: 431a orrs r2, r3 + 8002ce4: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002ce6: 605a str r2, [r3, #4] + pxBlock->pxNextFreeBlock = NULL; + 8002ce8: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002cea: 2200 movs r2, #0 + 8002cec: 601a str r2, [r3, #0] + xNumberOfSuccessfulAllocations++; + 8002cee: 4b13 ldr r3, [pc, #76] ; (8002d3c ) + 8002cf0: 681b ldr r3, [r3, #0] + 8002cf2: 3301 adds r3, #1 + 8002cf4: 4a11 ldr r2, [pc, #68] ; (8002d3c ) + 8002cf6: 6013 str r3, [r2, #0] + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + 8002cf8: f7ff fa3a bl 8002170 + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 ); + 8002cfc: 69fb ldr r3, [r7, #28] + 8002cfe: f003 0307 and.w r3, r3, #7 + 8002d02: 2b00 cmp r3, #0 + 8002d04: d00a beq.n 8002d1c + __asm volatile + 8002d06: f04f 0350 mov.w r3, #80 ; 0x50 + 8002d0a: f383 8811 msr BASEPRI, r3 + 8002d0e: f3bf 8f6f isb sy + 8002d12: f3bf 8f4f dsb sy + 8002d16: 60fb str r3, [r7, #12] +} + 8002d18: bf00 nop + 8002d1a: e7fe b.n 8002d1a + return pvReturn; + 8002d1c: 69fb ldr r3, [r7, #28] +} + 8002d1e: 4618 mov r0, r3 + 8002d20: 3728 adds r7, #40 ; 0x28 + 8002d22: 46bd mov sp, r7 + 8002d24: bd80 pop {r7, pc} + 8002d26: bf00 nop + 8002d28: 20003fc8 .word 0x20003fc8 + 8002d2c: 20003fdc .word 0x20003fdc + 8002d30: 20003fcc .word 0x20003fcc + 8002d34: 20003fc0 .word 0x20003fc0 + 8002d38: 20003fd0 .word 0x20003fd0 + 8002d3c: 20003fd4 .word 0x20003fd4 + +08002d40 : +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + 8002d40: b580 push {r7, lr} + 8002d42: b086 sub sp, #24 + 8002d44: af00 add r7, sp, #0 + 8002d46: 6078 str r0, [r7, #4] +uint8_t *puc = ( uint8_t * ) pv; + 8002d48: 687b ldr r3, [r7, #4] + 8002d4a: 617b str r3, [r7, #20] +BlockLink_t *pxLink; + + if( pv != NULL ) + 8002d4c: 687b ldr r3, [r7, #4] + 8002d4e: 2b00 cmp r3, #0 + 8002d50: d04d beq.n 8002dee + { + /* The memory being freed will have an BlockLink_t structure immediately + before it. */ + puc -= xHeapStructSize; + 8002d52: 2308 movs r3, #8 + 8002d54: 425b negs r3, r3 + 8002d56: 697a ldr r2, [r7, #20] + 8002d58: 4413 add r3, r2 + 8002d5a: 617b str r3, [r7, #20] + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + 8002d5c: 697b ldr r3, [r7, #20] + 8002d5e: 613b str r3, [r7, #16] + + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + 8002d60: 693b ldr r3, [r7, #16] + 8002d62: 685a ldr r2, [r3, #4] + 8002d64: 4b24 ldr r3, [pc, #144] ; (8002df8 ) + 8002d66: 681b ldr r3, [r3, #0] + 8002d68: 4013 ands r3, r2 + 8002d6a: 2b00 cmp r3, #0 + 8002d6c: d10a bne.n 8002d84 + __asm volatile + 8002d6e: f04f 0350 mov.w r3, #80 ; 0x50 + 8002d72: f383 8811 msr BASEPRI, r3 + 8002d76: f3bf 8f6f isb sy + 8002d7a: f3bf 8f4f dsb sy + 8002d7e: 60fb str r3, [r7, #12] +} + 8002d80: bf00 nop + 8002d82: e7fe b.n 8002d82 + configASSERT( pxLink->pxNextFreeBlock == NULL ); + 8002d84: 693b ldr r3, [r7, #16] + 8002d86: 681b ldr r3, [r3, #0] + 8002d88: 2b00 cmp r3, #0 + 8002d8a: d00a beq.n 8002da2 + __asm volatile + 8002d8c: f04f 0350 mov.w r3, #80 ; 0x50 + 8002d90: f383 8811 msr BASEPRI, r3 + 8002d94: f3bf 8f6f isb sy + 8002d98: f3bf 8f4f dsb sy + 8002d9c: 60bb str r3, [r7, #8] +} + 8002d9e: bf00 nop + 8002da0: e7fe b.n 8002da0 + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + 8002da2: 693b ldr r3, [r7, #16] + 8002da4: 685a ldr r2, [r3, #4] + 8002da6: 4b14 ldr r3, [pc, #80] ; (8002df8 ) + 8002da8: 681b ldr r3, [r3, #0] + 8002daa: 4013 ands r3, r2 + 8002dac: 2b00 cmp r3, #0 + 8002dae: d01e beq.n 8002dee + { + if( pxLink->pxNextFreeBlock == NULL ) + 8002db0: 693b ldr r3, [r7, #16] + 8002db2: 681b ldr r3, [r3, #0] + 8002db4: 2b00 cmp r3, #0 + 8002db6: d11a bne.n 8002dee + { + /* The block is being returned to the heap - it is no longer + allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + 8002db8: 693b ldr r3, [r7, #16] + 8002dba: 685a ldr r2, [r3, #4] + 8002dbc: 4b0e ldr r3, [pc, #56] ; (8002df8 ) + 8002dbe: 681b ldr r3, [r3, #0] + 8002dc0: 43db mvns r3, r3 + 8002dc2: 401a ands r2, r3 + 8002dc4: 693b ldr r3, [r7, #16] + 8002dc6: 605a str r2, [r3, #4] + + vTaskSuspendAll(); + 8002dc8: f7ff f9c4 bl 8002154 + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + 8002dcc: 693b ldr r3, [r7, #16] + 8002dce: 685a ldr r2, [r3, #4] + 8002dd0: 4b0a ldr r3, [pc, #40] ; (8002dfc ) + 8002dd2: 681b ldr r3, [r3, #0] + 8002dd4: 4413 add r3, r2 + 8002dd6: 4a09 ldr r2, [pc, #36] ; (8002dfc ) + 8002dd8: 6013 str r3, [r2, #0] + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + 8002dda: 6938 ldr r0, [r7, #16] + 8002ddc: f000 f874 bl 8002ec8 + xNumberOfSuccessfulFrees++; + 8002de0: 4b07 ldr r3, [pc, #28] ; (8002e00 ) + 8002de2: 681b ldr r3, [r3, #0] + 8002de4: 3301 adds r3, #1 + 8002de6: 4a06 ldr r2, [pc, #24] ; (8002e00 ) + 8002de8: 6013 str r3, [r2, #0] + } + ( void ) xTaskResumeAll(); + 8002dea: f7ff f9c1 bl 8002170 + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} + 8002dee: bf00 nop + 8002df0: 3718 adds r7, #24 + 8002df2: 46bd mov sp, r7 + 8002df4: bd80 pop {r7, pc} + 8002df6: bf00 nop + 8002df8: 20003fdc .word 0x20003fdc + 8002dfc: 20003fcc .word 0x20003fcc + 8002e00: 20003fd8 .word 0x20003fd8 + +08002e04 : + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + 8002e04: b480 push {r7} + 8002e06: b085 sub sp, #20 + 8002e08: af00 add r7, sp, #0 +BlockLink_t *pxFirstFreeBlock; +uint8_t *pucAlignedHeap; +size_t uxAddress; +size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; + 8002e0a: f44f 5370 mov.w r3, #15360 ; 0x3c00 + 8002e0e: 60bb str r3, [r7, #8] + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + 8002e10: 4b27 ldr r3, [pc, #156] ; (8002eb0 ) + 8002e12: 60fb str r3, [r7, #12] + + if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + 8002e14: 68fb ldr r3, [r7, #12] + 8002e16: f003 0307 and.w r3, r3, #7 + 8002e1a: 2b00 cmp r3, #0 + 8002e1c: d00c beq.n 8002e38 + { + uxAddress += ( portBYTE_ALIGNMENT - 1 ); + 8002e1e: 68fb ldr r3, [r7, #12] + 8002e20: 3307 adds r3, #7 + 8002e22: 60fb str r3, [r7, #12] + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + 8002e24: 68fb ldr r3, [r7, #12] + 8002e26: f023 0307 bic.w r3, r3, #7 + 8002e2a: 60fb str r3, [r7, #12] + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + 8002e2c: 68ba ldr r2, [r7, #8] + 8002e2e: 68fb ldr r3, [r7, #12] + 8002e30: 1ad3 subs r3, r2, r3 + 8002e32: 4a1f ldr r2, [pc, #124] ; (8002eb0 ) + 8002e34: 4413 add r3, r2 + 8002e36: 60bb str r3, [r7, #8] + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + 8002e38: 68fb ldr r3, [r7, #12] + 8002e3a: 607b str r3, [r7, #4] + + /* xStart is used to hold a pointer to the first item in the list of free + blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + 8002e3c: 4a1d ldr r2, [pc, #116] ; (8002eb4 ) + 8002e3e: 687b ldr r3, [r7, #4] + 8002e40: 6013 str r3, [r2, #0] + xStart.xBlockSize = ( size_t ) 0; + 8002e42: 4b1c ldr r3, [pc, #112] ; (8002eb4 ) + 8002e44: 2200 movs r2, #0 + 8002e46: 605a str r2, [r3, #4] + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + 8002e48: 687b ldr r3, [r7, #4] + 8002e4a: 68ba ldr r2, [r7, #8] + 8002e4c: 4413 add r3, r2 + 8002e4e: 60fb str r3, [r7, #12] + uxAddress -= xHeapStructSize; + 8002e50: 2208 movs r2, #8 + 8002e52: 68fb ldr r3, [r7, #12] + 8002e54: 1a9b subs r3, r3, r2 + 8002e56: 60fb str r3, [r7, #12] + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + 8002e58: 68fb ldr r3, [r7, #12] + 8002e5a: f023 0307 bic.w r3, r3, #7 + 8002e5e: 60fb str r3, [r7, #12] + pxEnd = ( void * ) uxAddress; + 8002e60: 68fb ldr r3, [r7, #12] + 8002e62: 4a15 ldr r2, [pc, #84] ; (8002eb8 ) + 8002e64: 6013 str r3, [r2, #0] + pxEnd->xBlockSize = 0; + 8002e66: 4b14 ldr r3, [pc, #80] ; (8002eb8 ) + 8002e68: 681b ldr r3, [r3, #0] + 8002e6a: 2200 movs r2, #0 + 8002e6c: 605a str r2, [r3, #4] + pxEnd->pxNextFreeBlock = NULL; + 8002e6e: 4b12 ldr r3, [pc, #72] ; (8002eb8 ) + 8002e70: 681b ldr r3, [r3, #0] + 8002e72: 2200 movs r2, #0 + 8002e74: 601a str r2, [r3, #0] + + /* To start with there is a single free block that is sized to take up the + entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + 8002e76: 687b ldr r3, [r7, #4] + 8002e78: 603b str r3, [r7, #0] + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + 8002e7a: 683b ldr r3, [r7, #0] + 8002e7c: 68fa ldr r2, [r7, #12] + 8002e7e: 1ad2 subs r2, r2, r3 + 8002e80: 683b ldr r3, [r7, #0] + 8002e82: 605a str r2, [r3, #4] + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + 8002e84: 4b0c ldr r3, [pc, #48] ; (8002eb8 ) + 8002e86: 681a ldr r2, [r3, #0] + 8002e88: 683b ldr r3, [r7, #0] + 8002e8a: 601a str r2, [r3, #0] + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + 8002e8c: 683b ldr r3, [r7, #0] + 8002e8e: 685b ldr r3, [r3, #4] + 8002e90: 4a0a ldr r2, [pc, #40] ; (8002ebc ) + 8002e92: 6013 str r3, [r2, #0] + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + 8002e94: 683b ldr r3, [r7, #0] + 8002e96: 685b ldr r3, [r3, #4] + 8002e98: 4a09 ldr r2, [pc, #36] ; (8002ec0 ) + 8002e9a: 6013 str r3, [r2, #0] + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); + 8002e9c: 4b09 ldr r3, [pc, #36] ; (8002ec4 ) + 8002e9e: f04f 4200 mov.w r2, #2147483648 ; 0x80000000 + 8002ea2: 601a str r2, [r3, #0] +} + 8002ea4: bf00 nop + 8002ea6: 3714 adds r7, #20 + 8002ea8: 46bd mov sp, r7 + 8002eaa: f85d 7b04 ldr.w r7, [sp], #4 + 8002eae: 4770 bx lr + 8002eb0: 200003c0 .word 0x200003c0 + 8002eb4: 20003fc0 .word 0x20003fc0 + 8002eb8: 20003fc8 .word 0x20003fc8 + 8002ebc: 20003fd0 .word 0x20003fd0 + 8002ec0: 20003fcc .word 0x20003fcc + 8002ec4: 20003fdc .word 0x20003fdc + +08002ec8 : +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) +{ + 8002ec8: b480 push {r7} + 8002eca: b085 sub sp, #20 + 8002ecc: af00 add r7, sp, #0 + 8002ece: 6078 str r0, [r7, #4] +BlockLink_t *pxIterator; +uint8_t *puc; + + /* Iterate through the list until a block is found that has a higher address + than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + 8002ed0: 4b28 ldr r3, [pc, #160] ; (8002f74 ) + 8002ed2: 60fb str r3, [r7, #12] + 8002ed4: e002 b.n 8002edc + 8002ed6: 68fb ldr r3, [r7, #12] + 8002ed8: 681b ldr r3, [r3, #0] + 8002eda: 60fb str r3, [r7, #12] + 8002edc: 68fb ldr r3, [r7, #12] + 8002ede: 681b ldr r3, [r3, #0] + 8002ee0: 687a ldr r2, [r7, #4] + 8002ee2: 429a cmp r2, r3 + 8002ee4: d8f7 bhi.n 8002ed6 + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + 8002ee6: 68fb ldr r3, [r7, #12] + 8002ee8: 60bb str r3, [r7, #8] + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + 8002eea: 68fb ldr r3, [r7, #12] + 8002eec: 685b ldr r3, [r3, #4] + 8002eee: 68ba ldr r2, [r7, #8] + 8002ef0: 4413 add r3, r2 + 8002ef2: 687a ldr r2, [r7, #4] + 8002ef4: 429a cmp r2, r3 + 8002ef6: d108 bne.n 8002f0a + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + 8002ef8: 68fb ldr r3, [r7, #12] + 8002efa: 685a ldr r2, [r3, #4] + 8002efc: 687b ldr r3, [r7, #4] + 8002efe: 685b ldr r3, [r3, #4] + 8002f00: 441a add r2, r3 + 8002f02: 68fb ldr r3, [r7, #12] + 8002f04: 605a str r2, [r3, #4] + pxBlockToInsert = pxIterator; + 8002f06: 68fb ldr r3, [r7, #12] + 8002f08: 607b str r3, [r7, #4] + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + 8002f0a: 687b ldr r3, [r7, #4] + 8002f0c: 60bb str r3, [r7, #8] + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + 8002f0e: 687b ldr r3, [r7, #4] + 8002f10: 685b ldr r3, [r3, #4] + 8002f12: 68ba ldr r2, [r7, #8] + 8002f14: 441a add r2, r3 + 8002f16: 68fb ldr r3, [r7, #12] + 8002f18: 681b ldr r3, [r3, #0] + 8002f1a: 429a cmp r2, r3 + 8002f1c: d118 bne.n 8002f50 + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + 8002f1e: 68fb ldr r3, [r7, #12] + 8002f20: 681a ldr r2, [r3, #0] + 8002f22: 4b15 ldr r3, [pc, #84] ; (8002f78 ) + 8002f24: 681b ldr r3, [r3, #0] + 8002f26: 429a cmp r2, r3 + 8002f28: d00d beq.n 8002f46 + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + 8002f2a: 687b ldr r3, [r7, #4] + 8002f2c: 685a ldr r2, [r3, #4] + 8002f2e: 68fb ldr r3, [r7, #12] + 8002f30: 681b ldr r3, [r3, #0] + 8002f32: 685b ldr r3, [r3, #4] + 8002f34: 441a add r2, r3 + 8002f36: 687b ldr r3, [r7, #4] + 8002f38: 605a str r2, [r3, #4] + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + 8002f3a: 68fb ldr r3, [r7, #12] + 8002f3c: 681b ldr r3, [r3, #0] + 8002f3e: 681a ldr r2, [r3, #0] + 8002f40: 687b ldr r3, [r7, #4] + 8002f42: 601a str r2, [r3, #0] + 8002f44: e008 b.n 8002f58 + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + 8002f46: 4b0c ldr r3, [pc, #48] ; (8002f78 ) + 8002f48: 681a ldr r2, [r3, #0] + 8002f4a: 687b ldr r3, [r7, #4] + 8002f4c: 601a str r2, [r3, #0] + 8002f4e: e003 b.n 8002f58 + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + 8002f50: 68fb ldr r3, [r7, #12] + 8002f52: 681a ldr r2, [r3, #0] + 8002f54: 687b ldr r3, [r7, #4] + 8002f56: 601a str r2, [r3, #0] + + /* If the block being inserted plugged a gab, so was merged with the block + before and the block after, then it's pxNextFreeBlock pointer will have + already been set, and should not be set here as that would make it point + to itself. */ + if( pxIterator != pxBlockToInsert ) + 8002f58: 68fa ldr r2, [r7, #12] + 8002f5a: 687b ldr r3, [r7, #4] + 8002f5c: 429a cmp r2, r3 + 8002f5e: d002 beq.n 8002f66 + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + 8002f60: 68fb ldr r3, [r7, #12] + 8002f62: 687a ldr r2, [r7, #4] + 8002f64: 601a str r2, [r3, #0] + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} + 8002f66: bf00 nop + 8002f68: 3714 adds r7, #20 + 8002f6a: 46bd mov sp, r7 + 8002f6c: f85d 7b04 ldr.w r7, [sp], #4 + 8002f70: 4770 bx lr + 8002f72: bf00 nop + 8002f74: 20003fc0 .word 0x20003fc0 + 8002f78: 20003fc8 .word 0x20003fc8 + +08002f7c <__libc_init_array>: + 8002f7c: b570 push {r4, r5, r6, lr} + 8002f7e: 4d0d ldr r5, [pc, #52] ; (8002fb4 <__libc_init_array+0x38>) + 8002f80: 4c0d ldr r4, [pc, #52] ; (8002fb8 <__libc_init_array+0x3c>) + 8002f82: 1b64 subs r4, r4, r5 + 8002f84: 10a4 asrs r4, r4, #2 + 8002f86: 2600 movs r6, #0 + 8002f88: 42a6 cmp r6, r4 + 8002f8a: d109 bne.n 8002fa0 <__libc_init_array+0x24> + 8002f8c: 4d0b ldr r5, [pc, #44] ; (8002fbc <__libc_init_array+0x40>) + 8002f8e: 4c0c ldr r4, [pc, #48] ; (8002fc0 <__libc_init_array+0x44>) + 8002f90: f000 f820 bl 8002fd4 <_init> + 8002f94: 1b64 subs r4, r4, r5 + 8002f96: 10a4 asrs r4, r4, #2 + 8002f98: 2600 movs r6, #0 + 8002f9a: 42a6 cmp r6, r4 + 8002f9c: d105 bne.n 8002faa <__libc_init_array+0x2e> + 8002f9e: bd70 pop {r4, r5, r6, pc} + 8002fa0: f855 3b04 ldr.w r3, [r5], #4 + 8002fa4: 4798 blx r3 + 8002fa6: 3601 adds r6, #1 + 8002fa8: e7ee b.n 8002f88 <__libc_init_array+0xc> + 8002faa: f855 3b04 ldr.w r3, [r5], #4 + 8002fae: 4798 blx r3 + 8002fb0: 3601 adds r6, #1 + 8002fb2: e7f2 b.n 8002f9a <__libc_init_array+0x1e> + 8002fb4: 0800305c .word 0x0800305c + 8002fb8: 0800305c .word 0x0800305c + 8002fbc: 0800305c .word 0x0800305c + 8002fc0: 08003060 .word 0x08003060 + +08002fc4 : + 8002fc4: 4402 add r2, r0 + 8002fc6: 4603 mov r3, r0 + 8002fc8: 4293 cmp r3, r2 + 8002fca: d100 bne.n 8002fce + 8002fcc: 4770 bx lr + 8002fce: f803 1b01 strb.w r1, [r3], #1 + 8002fd2: e7f9 b.n 8002fc8 + +08002fd4 <_init>: + 8002fd4: b5f8 push {r3, r4, r5, r6, r7, lr} + 8002fd6: bf00 nop + 8002fd8: bcf8 pop {r3, r4, r5, r6, r7} + 8002fda: bc08 pop {r3} + 8002fdc: 469e mov lr, r3 + 8002fde: 4770 bx lr + +08002fe0 <_fini>: + 8002fe0: b5f8 push {r3, r4, r5, r6, r7, lr} + 8002fe2: bf00 nop + 8002fe4: bcf8 pop {r3, r4, r5, r6, r7} + 8002fe6: bc08 pop {r3} + 8002fe8: 469e mov lr, r3 + 8002fea: 4770 bx lr diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map new file mode 100644 index 0000000..9898438 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map @@ -0,0 +1,4459 @@ +Archive member included to satisfy reference by file (symbol) + +c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-errno.o) + ./Core/Src/syscalls.o (__errno) +c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-exit.o) + c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (exit) +c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) + c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-exit.o) (_global_impure_ptr) +c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (__libc_init_array) +c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memcpy-stub.o) + ./Middlewares/Third_Party/FreeRTOS/Source/queue.o (memcpy) +c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (memset) +c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) + ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o (__aeabi_uldivmod) +c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) + c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) (__udivmoddi4) +c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_dvmd_tls.o) + c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) (__aeabi_ldiv0) + +Discarded input sections + + .text 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + .data 0x0000000000000000 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + .rodata 0x0000000000000000 0x24 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + .text 0x0000000000000000 0x7c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .ARM.extab 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .ARM.exidx 0x0000000000000000 0x10 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .ARM.attributes + 0x0000000000000000 0x1c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/freertos.o + .text 0x0000000000000000 0x0 ./Core/Src/freertos.o + .data 0x0000000000000000 0x0 ./Core/Src/freertos.o + .bss 0x0000000000000000 0x0 ./Core/Src/freertos.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .text 0x0000000000000000 0x0 ./Core/Src/main.o + .data 0x0000000000000000 0x0 ./Core/Src/main.o + .bss 0x0000000000000000 0x0 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x16749 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x367e ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x5c ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xc90 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x9fe ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x115 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x1a0 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x16d ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x287 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x5f ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x132 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x29c ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x11a ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xe8 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x89 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x126 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x15a ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xde ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x26 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x504 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xb5 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xaa ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o + .text 0x0000000000000000 0x0 ./Core/Src/stm32f4xx_hal_msp.o + .data 0x0000000000000000 0x0 ./Core/Src/stm32f4xx_hal_msp.o + .bss 0x0000000000000000 0x0 ./Core/Src/stm32f4xx_hal_msp.o + .text.HAL_UART_MspInit + 0x0000000000000000 0x90 ./Core/Src/stm32f4xx_hal_msp.o + .text.HAL_UART_MspDeInit + 0x0000000000000000 0x3c ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x16749 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x367e ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x5c ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0xc90 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x9fe ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x115 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x1a0 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x16d ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x287 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x5f ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x132 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x29c ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x11a ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0xe8 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x89 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x126 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/stm32f4xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_it.o + .text 0x0000000000000000 0x0 ./Core/Src/stm32f4xx_it.o + .data 0x0000000000000000 0x0 ./Core/Src/stm32f4xx_it.o + .bss 0x0000000000000000 0x0 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x16749 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x367e ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x5c ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0xc90 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x9fe ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x115 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x1a0 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x16d ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x287 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x5f ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x132 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x29c ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x11a ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0xe8 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x89 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x126 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0xe4 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x15a ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0xde ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x26 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0x504 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0xb5 ./Core/Src/stm32f4xx_it.o + .debug_macro 0x0000000000000000 0xaa ./Core/Src/stm32f4xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .text 0x0000000000000000 0x0 ./Core/Src/syscalls.o + .data 0x0000000000000000 0x0 ./Core/Src/syscalls.o + .bss 0x0000000000000000 0x0 ./Core/Src/syscalls.o + .bss.__env 0x0000000000000000 0x4 ./Core/Src/syscalls.o + .data.environ 0x0000000000000000 0x4 ./Core/Src/syscalls.o + .text.initialise_monitor_handles + 0x0000000000000000 0xe ./Core/Src/syscalls.o + .text._getpid 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .text._kill 0x0000000000000000 0x20 ./Core/Src/syscalls.o + .text._exit 0x0000000000000000 0x14 ./Core/Src/syscalls.o + .text._read 0x0000000000000000 0x3a ./Core/Src/syscalls.o + .text._write 0x0000000000000000 0x38 ./Core/Src/syscalls.o + .text._close 0x0000000000000000 0x18 ./Core/Src/syscalls.o + .text._fstat 0x0000000000000000 0x20 ./Core/Src/syscalls.o + .text._isatty 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .text._lseek 0x0000000000000000 0x1a ./Core/Src/syscalls.o + .text._open 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .text._wait 0x0000000000000000 0x1e ./Core/Src/syscalls.o + .text._unlink 0x0000000000000000 0x1e ./Core/Src/syscalls.o + .text._times 0x0000000000000000 0x18 ./Core/Src/syscalls.o + .text._stat 0x0000000000000000 0x20 ./Core/Src/syscalls.o + .text._link 0x0000000000000000 0x20 ./Core/Src/syscalls.o + .text._fork 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .text._execve 0x0000000000000000 0x22 ./Core/Src/syscalls.o + .debug_info 0x0000000000000000 0x6e0 ./Core/Src/syscalls.o + .debug_abbrev 0x0000000000000000 0x1b3 ./Core/Src/syscalls.o + .debug_aranges + 0x0000000000000000 0xa8 ./Core/Src/syscalls.o + .debug_ranges 0x0000000000000000 0x98 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x24c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x4c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1e ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x94 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x34 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x57 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x341 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x43 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x34 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x71 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x12a ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x35 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x52 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x52 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0xd5 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x3d ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x35 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x12c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x29 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x241 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x145 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x189 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0xce ./Core/Src/syscalls.o + .debug_line 0x0000000000000000 0x7fe ./Core/Src/syscalls.o + .debug_str 0x0000000000000000 0x8a6b ./Core/Src/syscalls.o + .comment 0x0000000000000000 0x51 ./Core/Src/syscalls.o + .debug_frame 0x0000000000000000 0x2ac ./Core/Src/syscalls.o + .ARM.attributes + 0x0000000000000000 0x34 ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .text 0x0000000000000000 0x0 ./Core/Src/sysmem.o + .data 0x0000000000000000 0x0 ./Core/Src/sysmem.o + .bss 0x0000000000000000 0x0 ./Core/Src/sysmem.o + .bss.__sbrk_heap_end + 0x0000000000000000 0x4 ./Core/Src/sysmem.o + .text._sbrk 0x0000000000000000 0x6c ./Core/Src/sysmem.o + .debug_info 0x0000000000000000 0x171 ./Core/Src/sysmem.o + .debug_abbrev 0x0000000000000000 0xbb ./Core/Src/sysmem.o + .debug_aranges + 0x0000000000000000 0x20 ./Core/Src/sysmem.o + .debug_ranges 0x0000000000000000 0x10 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0xff ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x4c ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x1e ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x94 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x34 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x43 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x57 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x34 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x71 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x12a ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x23b ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/sysmem.o + .debug_line 0x0000000000000000 0x4f4 ./Core/Src/sysmem.o + .debug_str 0x0000000000000000 0x5da7 ./Core/Src/sysmem.o + .comment 0x0000000000000000 0x51 ./Core/Src/sysmem.o + .debug_frame 0x0000000000000000 0x34 ./Core/Src/sysmem.o + .ARM.attributes + 0x0000000000000000 0x34 ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f4xx.o + .text 0x0000000000000000 0x0 ./Core/Src/system_stm32f4xx.o + .data 0x0000000000000000 0x0 ./Core/Src/system_stm32f4xx.o + .bss 0x0000000000000000 0x0 ./Core/Src/system_stm32f4xx.o + .rodata.APBPrescTable + 0x0000000000000000 0x8 ./Core/Src/system_stm32f4xx.o + .text.SystemCoreClockUpdate + 0x0000000000000000 0x100 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x16749 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x367e ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x5c ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0xc90 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x9fe ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x115 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x1a0 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x16d ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x287 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x5f ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x132 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x29c ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x11a ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0xe8 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x89 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000000000 0x126 ./Core/Src/system_stm32f4xx.o + .text 0x0000000000000000 0x14 ./Core/Startup/startup_stm32f446retx.o + .data 0x0000000000000000 0x0 ./Core/Startup/startup_stm32f446retx.o + .bss 0x0000000000000000 0x0 ./Core/Startup/startup_stm32f446retx.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_DeInit + 0x0000000000000000 0x58 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_MspInit + 0x0000000000000000 0xe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_MspDeInit + 0x0000000000000000 0xe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_GetTickPrio + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_SetTickFreq + 0x0000000000000000 0x50 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_GetTickFreq + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_SuspendTick + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_ResumeTick + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_GetHalVersion + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_GetREVID + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_GetDEVID + 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_DBGMCU_EnableDBGSleepMode + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_DBGMCU_DisableDBGSleepMode + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_DBGMCU_EnableDBGStopMode + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_DBGMCU_DisableDBGStopMode + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_DBGMCU_EnableDBGStandbyMode + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_DBGMCU_DisableDBGStandbyMode + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_EnableCompensationCell + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_DisableCompensationCell + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_GetUIDw0 + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_GetUIDw1 + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_GetUIDw2 + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_EnableIRQ + 0x0000000000000000 0x3c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_DisableIRQ + 0x0000000000000000 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_GetPendingIRQ + 0x0000000000000000 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_SetPendingIRQ + 0x0000000000000000 0x3c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_ClearPendingIRQ + 0x0000000000000000 0x3c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_GetActive + 0x0000000000000000 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_GetPriority + 0x0000000000000000 0x50 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.NVIC_DecodePriority + 0x0000000000000000 0x6e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_SystemReset + 0x0000000000000000 0x2c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_EnableIRQ + 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_DisableIRQ + 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_SystemReset + 0x0000000000000000 0x8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_MPU_Disable + 0x0000000000000000 0x30 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_MPU_Enable + 0x0000000000000000 0x40 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_MPU_ConfigRegion + 0x0000000000000000 0x88 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_GetPriorityGrouping + 0x0000000000000000 0xe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_GetPriority + 0x0000000000000000 0x2c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_SetPendingIRQ + 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_GetPendingIRQ + 0x0000000000000000 0x1e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_ClearPendingIRQ + 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_GetActive + 0x0000000000000000 0x1e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_SYSTICK_CLKSourceConfig + 0x0000000000000000 0x38 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_SYSTICK_IRQHandler + 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_SYSTICK_Callback + 0x0000000000000000 0xe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_Init + 0x0000000000000000 0x15c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_DeInit + 0x0000000000000000 0xbc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_Start + 0x0000000000000000 0x76 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_Start_IT + 0x0000000000000000 0xb0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_Abort + 0x0000000000000000 0xe0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_Abort_IT + 0x0000000000000000 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_PollForTransfer + 0x0000000000000000 0x1be ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_IRQHandler + 0x0000000000000000 0x314 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_RegisterCallback + 0x0000000000000000 0xa8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_UnRegisterCallback + 0x0000000000000000 0xd4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_GetState + 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.HAL_DMA_GetError + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.DMA_SetConfig + 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.DMA_CalcBaseAndBitshift + 0x0000000000000000 0x6c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .text.DMA_CheckFifoParam + 0x0000000000000000 0xf8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .rodata.flagBitshiftOffset.0 + 0x0000000000000000 0x8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_info 0x0000000000000000 0x94f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_abbrev 0x0000000000000000 0x25b ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_aranges + 0x0000000000000000 0x90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_ranges 0x0000000000000000 0x80 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1c0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_line 0x0000000000000000 0xede ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_str 0x0000000000000000 0xc2484 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .debug_frame 0x0000000000000000 0x250 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .text.HAL_DMAEx_MultiBufferStart + 0x0000000000000000 0x96 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .text.HAL_DMAEx_MultiBufferStart_IT + 0x0000000000000000 0x1290 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .text.HAL_DMAEx_ChangeMemory + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .text.DMA_MultiBufferSetConfig + 0x0000000000000000 0x4c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_info 0x0000000000000000 0x541 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_abbrev 0x0000000000000000 0x195 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_aranges + 0x0000000000000000 0x38 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_ranges 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_line 0x0000000000000000 0x130d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_str 0x0000000000000000 0xc223e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .debug_frame 0x0000000000000000 0xac ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text.HAL_EXTI_SetConfigLine + 0x0000000000000000 0x150 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text.HAL_EXTI_GetConfigLine + 0x0000000000000000 0xf4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text.HAL_EXTI_ClearConfigLine + 0x0000000000000000 0xc0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text.HAL_EXTI_RegisterCallback + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text.HAL_EXTI_GetHandle + 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text.HAL_EXTI_IRQHandler + 0x0000000000000000 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text.HAL_EXTI_GetPending + 0x0000000000000000 0x40 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text.HAL_EXTI_ClearPending + 0x0000000000000000 0x30 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .text.HAL_EXTI_GenerateSWI + 0x0000000000000000 0x30 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_info 0x0000000000000000 0x56f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_abbrev 0x0000000000000000 0x1b5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_aranges + 0x0000000000000000 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_ranges 0x0000000000000000 0x50 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_line 0x0000000000000000 0x969 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_str 0x0000000000000000 0xc20e5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .debug_frame 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .bss.pFlash 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_Program + 0x0000000000000000 0xa8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_Program_IT + 0x0000000000000000 0x9c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_IRQHandler + 0x0000000000000000 0x140 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_EndOfOperationCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_OperationErrorCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_Unlock + 0x0000000000000000 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_Lock + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_OB_Unlock + 0x0000000000000000 0x38 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_OB_Lock + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_OB_Launch + 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.HAL_FLASH_GetError + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.FLASH_WaitForLastOperation + 0x0000000000000000 0x80 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.FLASH_Program_DoubleWord + 0x0000000000000000 0x64 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.FLASH_Program_Word + 0x0000000000000000 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.FLASH_Program_HalfWord + 0x0000000000000000 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.FLASH_Program_Byte + 0x0000000000000000 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .text.FLASH_SetErrorCode + 0x0000000000000000 0xcc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_info 0x0000000000000000 0x5d2 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_abbrev 0x0000000000000000 0x281 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_aranges + 0x0000000000000000 0xa0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_ranges 0x0000000000000000 0x90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1c0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_line 0x0000000000000000 0xa0c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_str 0x0000000000000000 0xc225a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .debug_frame 0x0000000000000000 0x274 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.HAL_FLASHEx_Erase + 0x0000000000000000 0xe0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.HAL_FLASHEx_Erase_IT + 0x0000000000000000 0xac ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBProgram + 0x0000000000000000 0xdc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBGetConfig + 0x0000000000000000 0x46 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.HAL_FLASHEx_AdvOBProgram + 0x0000000000000000 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.HAL_FLASHEx_AdvOBGetConfig + 0x0000000000000000 0x24 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.HAL_FLASHEx_OB_SelectPCROP + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.HAL_FLASHEx_OB_DeSelectPCROP + 0x0000000000000000 0x30 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_MassErase + 0x0000000000000000 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_Erase_Sector + 0x0000000000000000 0x90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_EnableWRP + 0x0000000000000000 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_DisableWRP + 0x0000000000000000 0x40 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_EnablePCROP + 0x0000000000000000 0x40 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_DisablePCROP + 0x0000000000000000 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_RDP_LevelConfig + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_UserConfig + 0x0000000000000000 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_BOR_LevelConfig + 0x0000000000000000 0x3c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_GetUser + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_GetWRP + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_GetRDP + 0x0000000000000000 0x40 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_OB_GetBOR + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .text.FLASH_FlushCaches + 0x0000000000000000 0x8c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_info 0x0000000000000000 0x843 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_abbrev 0x0000000000000000 0x25e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_aranges + 0x0000000000000000 0xc8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_ranges 0x0000000000000000 0xb8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1c0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_line 0x0000000000000000 0xb1e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_str 0x0000000000000000 0xc237d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .debug_frame 0x0000000000000000 0x334 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .RamFunc 0x0000000000000000 0x110 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_info 0x0000000000000000 0x3c9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_abbrev 0x0000000000000000 0x105 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_aranges + 0x0000000000000000 0x38 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_ranges 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_line 0x0000000000000000 0x6d5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_str 0x0000000000000000 0xc20b7 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .debug_frame 0x0000000000000000 0xb0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .text.HAL_GPIO_DeInit + 0x0000000000000000 0x1e8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .text.HAL_GPIO_ReadPin + 0x0000000000000000 0x30 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .text.HAL_GPIO_TogglePin + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .text.HAL_GPIO_LockPin + 0x0000000000000000 0x50 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .text.HAL_GPIO_EXTI_IRQHandler + 0x0000000000000000 0x30 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .text.HAL_GPIO_EXTI_Callback + 0x0000000000000000 0x16 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_DeInit + 0x0000000000000000 0x2c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_EnableBkUpAccess + 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_DisableBkUpAccess + 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_ConfigPVD + 0x0000000000000000 0xc0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_EnablePVD + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_DisablePVD + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_EnableWakeUpPin + 0x0000000000000000 0x24 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_DisableWakeUpPin + 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_EnterSLEEPMode + 0x0000000000000000 0x38 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_EnterSTOPMode + 0x0000000000000000 0x58 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_EnterSTANDBYMode + 0x0000000000000000 0x30 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_PVD_IRQHandler + 0x0000000000000000 0x24 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_PVDCallback + 0x0000000000000000 0xe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_EnableSleepOnExit + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_DisableSleepOnExit + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_EnableSEVOnPend + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .text.HAL_PWR_DisableSEVOnPend + 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_info 0x0000000000000000 0x765 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_abbrev 0x0000000000000000 0x192 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_aranges + 0x0000000000000000 0xa0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_ranges 0x0000000000000000 0x90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1d2 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_line 0x0000000000000000 0x886 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_str 0x0000000000000000 0xc22c5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .debug_frame 0x0000000000000000 0x264 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text.HAL_PWREx_EnableBkUpReg + 0x0000000000000000 0x4c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text.HAL_PWREx_DisableBkUpReg + 0x0000000000000000 0x4c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text.HAL_PWREx_EnableFlashPowerDown + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text.HAL_PWREx_DisableFlashPowerDown + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text.HAL_PWREx_GetVoltageRange + 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text.HAL_PWREx_ControlVoltageScaling + 0x0000000000000000 0xf4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text.HAL_PWREx_EnableOverDrive + 0x0000000000000000 0xa0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text.HAL_PWREx_DisableOverDrive + 0x0000000000000000 0xa0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .text.HAL_PWREx_EnterUnderDriveSTOPMode + 0x0000000000000000 0xa4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_info 0x0000000000000000 0x702 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_abbrev 0x0000000000000000 0x1c9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_aranges + 0x0000000000000000 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_ranges 0x0000000000000000 0x50 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1d2 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_line 0x0000000000000000 0x8a9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_str 0x0000000000000000 0xc2267 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .debug_frame 0x0000000000000000 0x14c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_DeInit + 0x0000000000000000 0x10 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_OscConfig + 0x0000000000000000 0x500 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_MCOConfig + 0x0000000000000000 0xd0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_EnableCSS + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_DisableCSS + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_GetSysClockFreq + 0x0000000000000000 0x20c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_GetHCLKFreq + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_GetPCLK1Freq + 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_GetPCLK2Freq + 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_GetOscConfig + 0x0000000000000000 0x128 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_GetClockConfig + 0x0000000000000000 0x64 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_NMI_IRQHandler + 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .text.HAL_RCC_CSSCallback + 0x0000000000000000 0xe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCCEx_PeriphCLKConfig + 0x0000000000000000 0x654 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCCEx_GetPeriphCLKConfig + 0x0000000000000000 0x18c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCCEx_GetPeriphCLKFreq + 0x0000000000000000 0x490 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCCEx_SelectLSEMode + 0x0000000000000000 0x3c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCCEx_EnablePLLI2S + 0x0000000000000000 0xa0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCCEx_DisablePLLI2S + 0x0000000000000000 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCCEx_EnablePLLSAI + 0x0000000000000000 0x9c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCCEx_DisablePLLSAI + 0x0000000000000000 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCC_DeInit + 0x0000000000000000 0x1f0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .text.HAL_RCC_GetOscConfig + 0x0000000000000000 0x138 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_info 0x0000000000000000 0x6f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_abbrev 0x0000000000000000 0x29 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_aranges + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1bb ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_line 0x0000000000000000 0x688 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .debug_str 0x0000000000000000 0xc1ea5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_info 0x0000000000000000 0x6f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_abbrev 0x0000000000000000 0x29 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_aranges + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_line 0x0000000000000000 0x68b ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .debug_str 0x0000000000000000 0xc1ea8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_Init + 0x0000000000000000 0x9a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_HalfDuplex_Init + 0x0000000000000000 0xaa ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_LIN_Init + 0x0000000000000000 0xcc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_MultiProcessor_Init + 0x0000000000000000 0xe0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_DeInit + 0x0000000000000000 0x5e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_MspInit + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_MspDeInit + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_Transmit + 0x0000000000000000 0x124 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_Receive + 0x0000000000000000 0x144 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_Transmit_IT + 0x0000000000000000 0x8a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_Receive_IT + 0x0000000000000000 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_Transmit_DMA + 0x0000000000000000 0xfc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_Receive_DMA + 0x0000000000000000 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_DMAPause + 0x0000000000000000 0x158 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_DMAResume + 0x0000000000000000 0x13a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_DMAStop + 0x0000000000000000 0xfe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UARTEx_ReceiveToIdle + 0x0000000000000000 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UARTEx_ReceiveToIdle_IT + 0x0000000000000000 0xca ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UARTEx_ReceiveToIdle_DMA + 0x0000000000000000 0xca ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_Abort + 0x0000000000000000 0x1d6 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_AbortTransmit + 0x0000000000000000 0xd0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_AbortReceive + 0x0000000000000000 0x146 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_Abort_IT + 0x0000000000000000 0x228 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_AbortTransmit_IT + 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_AbortReceive_IT + 0x0000000000000000 0x164 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_IRQHandler + 0x0000000000000000 0x51c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_TxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_TxHalfCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_RxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_RxHalfCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_ErrorCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_AbortCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_AbortTransmitCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_AbortReceiveCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UARTEx_RxEventCallback + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_LIN_SendBreak + 0x0000000000000000 0x78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_MultiProcessor_EnterMuteMode + 0x0000000000000000 0x78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_MultiProcessor_ExitMuteMode + 0x0000000000000000 0x78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_HalfDuplex_EnableTransmitter + 0x0000000000000000 0x68 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_HalfDuplex_EnableReceiver + 0x0000000000000000 0x68 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_GetState + 0x0000000000000000 0x3c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.HAL_UART_GetError + 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMATransmitCplt + 0x0000000000000000 0x9a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMATxHalfCplt + 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMAReceiveCplt + 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMARxHalfCplt + 0x0000000000000000 0x36 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMAError + 0x0000000000000000 0x94 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_WaitOnFlagUntilTimeout + 0x0000000000000000 0xdc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_Start_Receive_IT + 0x0000000000000000 0x7c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_Start_Receive_DMA + 0x0000000000000000 0x13c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_EndTxTransfer + 0x0000000000000000 0x50 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_EndRxTransfer + 0x0000000000000000 0xc6 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMAAbortOnError + 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMATxAbortCallback + 0x0000000000000000 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMARxAbortCallback + 0x0000000000000000 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMATxOnlyAbortCallback + 0x0000000000000000 0x2a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_DMARxOnlyAbortCallback + 0x0000000000000000 0x30 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_Transmit_IT + 0x0000000000000000 0xa0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_EndTransmit_IT + 0x0000000000000000 0x30 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_Receive_IT + 0x0000000000000000 0x176 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .text.UART_SetConfig + 0x0000000000000000 0x4e8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_info 0x0000000000000000 0x31bc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_abbrev 0x0000000000000000 0x2f4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_aranges + 0x0000000000000000 0x200 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_ranges 0x0000000000000000 0x220 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x1bb ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x16749 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x367e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x5c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0xc90 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x9fe ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x115 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x1a0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x16d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x287 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x5f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x132 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x29c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x11a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0xe8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x89 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x295 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_macro 0x0000000000000000 0x126 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_line 0x0000000000000000 0x2a1f ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_str 0x0000000000000000 0xc2a3d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .debug_frame 0x0000000000000000 0x92c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.makeCmsisPriority + 0x0000000000000000 0x2c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.inHandlerMode + 0x0000000000000000 0x24 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osKernelRunning + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osKernelSysTick + 0x0000000000000000 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadGetId + 0x0000000000000000 0xe ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadTerminate + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadYield + 0x0000000000000000 0x24 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadSetPriority + 0x0000000000000000 0x2a ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadGetPriority + 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osTimerCreate + 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osTimerStart + 0x0000000000000000 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osTimerStop + 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osTimerDelete + 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osSignalSet + 0x0000000000000000 0x80 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osSignalWait + 0x0000000000000000 0x98 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMutexCreate + 0x0000000000000000 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMutexWait + 0x0000000000000000 0x9c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMutexRelease + 0x0000000000000000 0x6c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMutexDelete + 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osSemaphoreCreate + 0x0000000000000000 0x64 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osSemaphoreWait + 0x0000000000000000 0x9c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osSemaphoreRelease + 0x0000000000000000 0x6c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osSemaphoreDelete + 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osPoolCreate + 0x0000000000000000 0xba ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osPoolAlloc + 0x0000000000000000 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osPoolCAlloc + 0x0000000000000000 0x2a ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osPoolFree + 0x0000000000000000 0x82 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMessageCreate + 0x0000000000000000 0x50 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMessagePut + 0x0000000000000000 0x80 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMessageGet + 0x0000000000000000 0xe8 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMailCreate + 0x0000000000000000 0xb0 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMailAlloc + 0x0000000000000000 0x2a ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMailCAlloc + 0x0000000000000000 0x46 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMailPut + 0x0000000000000000 0x7c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMailGet + 0x0000000000000000 0xe8 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMailFree + 0x0000000000000000 0x2a ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osSystickHandler + 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadSuspend + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadResume + 0x0000000000000000 0x44 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadSuspendAll + 0x0000000000000000 0xe ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadResumeAll + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osDelayUntil + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osAbortDelay + 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osThreadList + 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMessagePeek + 0x0000000000000000 0x96 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMessageWaiting + 0x0000000000000000 0x2c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMessageAvailableSpace + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osMessageDelete + 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osRecursiveMutexCreate + 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osRecursiveMutexRelease + 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osRecursiveMutexWait + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osSemaphoreGetCount + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x94 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x174 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x43 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x57 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x71 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x12a ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x341 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x35 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0xaa ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x91 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x8d ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x7e ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0x19 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000000000 0xf2 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_info 0x0000000000000000 0x76 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_abbrev 0x0000000000000000 0x29 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_aranges + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0xe3 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x174 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x8e ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0xaa ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_macro 0x0000000000000000 0x43 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_line 0x0000000000000000 0x4bb ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .debug_str 0x0000000000000000 0x82a9 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .comment 0x0000000000000000 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .ARM.attributes + 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.xEventGroupCreateStatic + 0x0000000000000000 0x6e ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.xEventGroupCreate + 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.xEventGroupSync + 0x0000000000000000 0x15c ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.xEventGroupWaitBits + 0x0000000000000000 0x19c ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.xEventGroupClearBits + 0x0000000000000000 0x70 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.xEventGroupGetBitsFromISR + 0x0000000000000000 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.xEventGroupSetBits + 0x0000000000000000 0x116 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.vEventGroupDelete + 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.vEventGroupSetBitsCallback + 0x0000000000000000 0x1a ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.vEventGroupClearBitsCallback + 0x0000000000000000 0x1a ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .text.prvTestWaitCondition + 0x0000000000000000 0x44 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_info 0x0000000000000000 0xad0 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_abbrev 0x0000000000000000 0x2d4 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_aranges + 0x0000000000000000 0x70 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_ranges 0x0000000000000000 0x60 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x1e0 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x94 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x10e ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x8d ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x43 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x57 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x71 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x12a ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x341 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x29 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0xaa ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x91 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_macro 0x0000000000000000 0x19 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_line 0x0000000000000000 0xa91 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_str 0x0000000000000000 0xbba1 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .comment 0x0000000000000000 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .debug_frame 0x0000000000000000 0x1a4 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .ARM.attributes + 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x94 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x10e ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x8d ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x43 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x57 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x71 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x12a ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x341 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x29 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .bss.xQueueRegistry + 0x0000000000000000 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueGenericReset + 0x0000000000000000 0xd0 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueGenericCreateStatic + 0x0000000000000000 0xf0 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueGenericCreate + 0x0000000000000000 0x74 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.prvInitialiseNewQueue + 0x0000000000000000 0x3e ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.prvInitialiseMutex + 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueCreateMutex + 0x0000000000000000 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueCreateMutexStatic + 0x0000000000000000 0x36 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueGenericSend + 0x0000000000000000 0x1fc ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueGenericSendFromISR + 0x0000000000000000 0x136 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueGiveFromISR + 0x0000000000000000 0x11a ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueReceive + 0x0000000000000000 0x1c0 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueSemaphoreTake + 0x0000000000000000 0x218 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueuePeek + 0x0000000000000000 0x1c4 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueReceiveFromISR + 0x0000000000000000 0x100 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueuePeekFromISR + 0x0000000000000000 0xd2 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.uxQueueMessagesWaiting + 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.uxQueueSpacesAvailable + 0x0000000000000000 0x46 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.uxQueueMessagesWaitingFromISR + 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.vQueueDelete + 0x0000000000000000 0x46 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.prvGetDisinheritPriorityAfterTimeout + 0x0000000000000000 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.prvCopyDataToQueue + 0x0000000000000000 0xd4 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.prvCopyDataFromQueue + 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.prvUnlockQueue + 0x0000000000000000 0xa4 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.prvIsQueueEmpty + 0x0000000000000000 0x2c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueIsQueueEmptyFromISR + 0x0000000000000000 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.prvIsQueueFull + 0x0000000000000000 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.xQueueIsQueueFullFromISR + 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.vQueueAddToRegistry + 0x0000000000000000 0x54 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.pcQueueGetName + 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .text.vQueueUnregisterQueue + 0x0000000000000000 0x54 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_info 0x0000000000000000 0x18e1 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_abbrev 0x0000000000000000 0x3a1 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_aranges + 0x0000000000000000 0x108 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_ranges 0x0000000000000000 0xf8 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x216 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x94 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x10e ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x8d ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x43 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x57 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x71 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x12a ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x341 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x29 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x35 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0xaa ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_macro 0x0000000000000000 0x87 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_line 0x0000000000000000 0x1488 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_str 0x0000000000000000 0xbfe4 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .comment 0x0000000000000000 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .debug_frame 0x0000000000000000 0x46c ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .ARM.attributes + 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/queue.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferGenericCreate + 0x0000000000000000 0xb6 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferGenericCreateStatic + 0x0000000000000000 0x102 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.vStreamBufferDelete + 0x0000000000000000 0x4e ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferReset + 0x0000000000000000 0x6c ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferSetTriggerLevel + 0x0000000000000000 0x5c ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferSpacesAvailable + 0x0000000000000000 0x66 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferBytesAvailable + 0x0000000000000000 0x3a ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferSend + 0x0000000000000000 0x16a ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferSendFromISR + 0x0000000000000000 0xe2 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.prvWriteMessageToBuffer + 0x0000000000000000 0x7a ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferReceive + 0x0000000000000000 0x12a ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferNextMessageLengthBytes + 0x0000000000000000 0x92 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferReceiveFromISR + 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.prvReadMessageFromBuffer + 0x0000000000000000 0x64 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferIsEmpty + 0x0000000000000000 0x50 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferIsFull + 0x0000000000000000 0x60 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferSendCompletedFromISR + 0x0000000000000000 0x86 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.xStreamBufferReceiveCompletedFromISR + 0x0000000000000000 0x86 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.prvWriteBytesToBuffer + 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.prvReadBytesFromBuffer + 0x0000000000000000 0xf4 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.prvBytesInBuffer + 0x0000000000000000 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .text.prvInitialiseNewStreamBuffer + 0x0000000000000000 0x66 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_info 0x0000000000000000 0x13e2 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_abbrev 0x0000000000000000 0x354 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_aranges + 0x0000000000000000 0xc8 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_ranges 0x0000000000000000 0xb8 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x1e0 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x8e ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x52 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x174 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x43 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x71 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x12a ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x341 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x35 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0xaa ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_macro 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_line 0x0000000000000000 0xf6d ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_str 0x0000000000000000 0xbb13 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .comment 0x0000000000000000 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .debug_frame 0x0000000000000000 0x350 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .ARM.attributes + 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskDelete + 0x0000000000000000 0x120 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.uxTaskPriorityGet + 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.uxTaskPriorityGetFromISR + 0x0000000000000000 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskPrioritySet + 0x0000000000000000 0x154 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskSuspend + 0x0000000000000000 0x124 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.prvTaskIsTaskSuspended + 0x0000000000000000 0x64 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskResume + 0x0000000000000000 0xbc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskResumeFromISR + 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskEndScheduler + 0x0000000000000000 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskGetTickCount + 0x0000000000000000 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskGetTickCountFromISR + 0x0000000000000000 0x24 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.uxTaskGetNumberOfTasks + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.pcTaskGetName + 0x0000000000000000 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskCatchUpTicks + 0x0000000000000000 0x54 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskPlaceOnEventList + 0x0000000000000000 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskPlaceOnUnorderedEventList + 0x0000000000000000 0x78 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskRemoveFromEventList + 0x0000000000000000 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskRemoveFromUnorderedEventList + 0x0000000000000000 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskSetTimeOutState + 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskInternalSetTimeOutState + 0x0000000000000000 0x2c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskCheckForTimeOut + 0x0000000000000000 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskMissedYield + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskGetCurrentTaskHandle + 0x0000000000000000 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskPriorityInherit + 0x0000000000000000 0xec ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskPriorityDisinherit + 0x0000000000000000 0x10c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskPriorityDisinheritAfterTimeout + 0x0000000000000000 0x11c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.uxTaskResetEventItemValue + 0x0000000000000000 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.pvTaskIncrementMutexHeldCount + 0x0000000000000000 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.ulTaskNotifyTake + 0x0000000000000000 0x90 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskNotifyWait + 0x0000000000000000 0xb4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskGenericNotify + 0x0000000000000000 0x16c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskGenericNotifyFromISR + 0x0000000000000000 0x1b4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskNotifyGiveFromISR + 0x0000000000000000 0x124 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskNotifyStateClear + 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.ulTaskNotifyValueClear + 0x0000000000000000 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x94 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x10e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x8d ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x43 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x57 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x71 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x12a ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x341 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x29 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x35 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0xaa ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x0000000000000000 0x91 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_info 0x0000000000000000 0x76 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_abbrev 0x0000000000000000 0x29 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_aranges + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x1be ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x94 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x10e ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x8d ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x43 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x57 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x71 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x12a ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x341 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x29 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0xaa ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x87 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_macro 0x0000000000000000 0x97 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_line 0x0000000000000000 0x613 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .debug_str 0x0000000000000000 0xbb59 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .comment 0x0000000000000000 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .ARM.attributes + 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/timers.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .rodata.pcInterruptPriorityRegisters + 0x0000000000000000 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .text.vPortEndScheduler + 0x0000000000000000 0x38 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .text.vPortValidateInterruptPriority + 0x0000000000000000 0x80 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x174 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x8e ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000000000 0xaa ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .group 0x0000000000000000 0xc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .text 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .data 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .bss 0x0000000000000000 0x0 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .rodata.xHeapStructSize + 0x0000000000000000 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .text.xPortGetFreeHeapSize + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .text.xPortGetMinimumEverFreeHeapSize + 0x0000000000000000 0x18 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .text.vPortInitialiseBlocks + 0x0000000000000000 0xe ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .text.vPortGetHeapStats + 0x0000000000000000 0xbc ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0xa78 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x1e ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x22 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x4c ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x94 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x10e ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x8d ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x43 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x57 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x71 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x12a ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x341 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x16 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x29 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x103 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x6a ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x1df ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0xe4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x15a ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0xde ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x26 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0x504 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0xb5 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_macro 0x0000000000000000 0xaa ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .text 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-errno.o) + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-errno.o) + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-errno.o) + .text.__errno 0x0000000000000000 0xc c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-errno.o) + .debug_frame 0x0000000000000000 0x20 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-errno.o) + .ARM.attributes + 0x0000000000000000 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-errno.o) + .text 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-exit.o) + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-exit.o) + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-exit.o) + .text.exit 0x0000000000000000 0x28 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-exit.o) + .debug_frame 0x0000000000000000 0x28 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-exit.o) + .ARM.attributes + 0x0000000000000000 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-exit.o) + .text 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) + .data._impure_ptr + 0x0000000000000000 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) + .data.impure_data + 0x0000000000000000 0x60 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) + .rodata._global_impure_ptr + 0x0000000000000000 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) + .ARM.attributes + 0x0000000000000000 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-impure.o) + .text 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + .text 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memcpy-stub.o) + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memcpy-stub.o) + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memcpy-stub.o) + .text.memcpy 0x0000000000000000 0x1c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memcpy-stub.o) + .debug_frame 0x0000000000000000 0x28 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memcpy-stub.o) + .ARM.attributes + 0x0000000000000000 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memcpy-stub.o) + .text 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) + .ARM.extab 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_dvmd_tls.o) + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_dvmd_tls.o) + .text 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .rodata 0x0000000000000000 0x24 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .eh_frame 0x0000000000000000 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .ARM.attributes + 0x0000000000000000 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .text 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + .data 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + .bss 0x0000000000000000 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + +Memory Configuration + +Name Origin Length Attributes +RAM 0x0000000020000000 0x0000000000020000 xrw +FLASH 0x0000000008000000 0x0000000000080000 xr +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +LOAD ./Core/Src/freertos.o +LOAD ./Core/Src/main.o +LOAD ./Core/Src/stm32f4xx_hal_msp.o +LOAD ./Core/Src/stm32f4xx_it.o +LOAD ./Core/Src/syscalls.o +LOAD ./Core/Src/sysmem.o +LOAD ./Core/Src/system_stm32f4xx.o +LOAD ./Core/Startup/startup_stm32f446retx.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o +LOAD ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/croutine.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/list.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/queue.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/timers.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o +LOAD ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o +START GROUP +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libm.a +END GROUP +START GROUP +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a +END GROUP +START GROUP +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libnosys.a +END GROUP +START GROUP +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libnosys.a +END GROUP +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + 0x0000000020020000 _estack = (ORIGIN (RAM) + LENGTH (RAM)) + 0x0000000000000200 _Min_Heap_Size = 0x200 + 0x0000000000000400 _Min_Stack_Size = 0x400 + +.isr_vector 0x0000000008000000 0x1c4 + 0x0000000008000000 . = ALIGN (0x4) + *(.isr_vector) + .isr_vector 0x0000000008000000 0x1c4 ./Core/Startup/startup_stm32f446retx.o + 0x0000000008000000 g_pfnVectors + 0x00000000080001c4 . = ALIGN (0x4) + +.text 0x00000000080001d0 0x2e1c + 0x00000000080001d0 . = ALIGN (0x4) + *(.text) + .text 0x00000000080001d0 0x40 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + .text 0x0000000008000210 0x30 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) + 0x0000000008000210 __aeabi_uldivmod + .text 0x0000000008000240 0x2d0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) + 0x0000000008000240 __udivmoddi4 + .text 0x0000000008000510 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_dvmd_tls.o) + 0x0000000008000510 __aeabi_idiv0 + 0x0000000008000510 __aeabi_ldiv0 + *(.text*) + .text.vApplicationGetIdleTaskMemory + 0x0000000008000514 0x34 ./Core/Src/freertos.o + 0x0000000008000514 vApplicationGetIdleTaskMemory + .text.main 0x0000000008000548 0x70 ./Core/Src/main.o + 0x0000000008000548 main + .text.SystemClock_Config + 0x00000000080005b8 0xdc ./Core/Src/main.o + 0x00000000080005b8 SystemClock_Config + .text.MX_GPIO_Init + 0x0000000008000694 0xdc ./Core/Src/main.o + .text.StartDefaultTask + 0x0000000008000770 0x10 ./Core/Src/main.o + 0x0000000008000770 StartDefaultTask + .text.StartTask02 + 0x0000000008000780 0xe ./Core/Src/main.o + 0x0000000008000780 StartTask02 + *fill* 0x000000000800078e 0x2 + .text.blinkaled + 0x0000000008000790 0x30 ./Core/Src/main.o + 0x0000000008000790 blinkaled + .text.Error_Handler + 0x00000000080007c0 0xa ./Core/Src/main.o + 0x00000000080007c0 Error_Handler + *fill* 0x00000000080007ca 0x2 + .text.HAL_MspInit + 0x00000000080007cc 0x58 ./Core/Src/stm32f4xx_hal_msp.o + 0x00000000080007cc HAL_MspInit + .text.NMI_Handler + 0x0000000008000824 0x6 ./Core/Src/stm32f4xx_it.o + 0x0000000008000824 NMI_Handler + .text.HardFault_Handler + 0x000000000800082a 0x6 ./Core/Src/stm32f4xx_it.o + 0x000000000800082a HardFault_Handler + .text.MemManage_Handler + 0x0000000008000830 0x6 ./Core/Src/stm32f4xx_it.o + 0x0000000008000830 MemManage_Handler + .text.BusFault_Handler + 0x0000000008000836 0x6 ./Core/Src/stm32f4xx_it.o + 0x0000000008000836 BusFault_Handler + .text.UsageFault_Handler + 0x000000000800083c 0x6 ./Core/Src/stm32f4xx_it.o + 0x000000000800083c UsageFault_Handler + .text.DebugMon_Handler + 0x0000000008000842 0xe ./Core/Src/stm32f4xx_it.o + 0x0000000008000842 DebugMon_Handler + .text.SysTick_Handler + 0x0000000008000850 0x1a ./Core/Src/stm32f4xx_it.o + 0x0000000008000850 SysTick_Handler + *fill* 0x000000000800086a 0x2 + .text.SystemInit + 0x000000000800086c 0x24 ./Core/Src/system_stm32f4xx.o + 0x000000000800086c SystemInit + .text.Reset_Handler + 0x0000000008000890 0x50 ./Core/Startup/startup_stm32f446retx.o + 0x0000000008000890 Reset_Handler + .text.Default_Handler + 0x00000000080008e0 0x2 ./Core/Startup/startup_stm32f446retx.o + 0x00000000080008e0 RTC_Alarm_IRQHandler + 0x00000000080008e0 EXTI2_IRQHandler + 0x00000000080008e0 TIM8_CC_IRQHandler + 0x00000000080008e0 FMPI2C1_EV_IRQHandler + 0x00000000080008e0 SPI4_IRQHandler + 0x00000000080008e0 TIM1_CC_IRQHandler + 0x00000000080008e0 DMA2_Stream5_IRQHandler + 0x00000000080008e0 DMA1_Stream5_IRQHandler + 0x00000000080008e0 PVD_IRQHandler + 0x00000000080008e0 SDIO_IRQHandler + 0x00000000080008e0 TAMP_STAMP_IRQHandler + 0x00000000080008e0 CAN2_RX1_IRQHandler + 0x00000000080008e0 EXTI3_IRQHandler + 0x00000000080008e0 TIM8_TRG_COM_TIM14_IRQHandler + 0x00000000080008e0 TIM1_UP_TIM10_IRQHandler + 0x00000000080008e0 TIM8_UP_TIM13_IRQHandler + 0x00000000080008e0 I2C3_ER_IRQHandler + 0x00000000080008e0 EXTI0_IRQHandler + 0x00000000080008e0 I2C2_EV_IRQHandler + 0x00000000080008e0 DMA1_Stream2_IRQHandler + 0x00000000080008e0 CAN1_RX0_IRQHandler + 0x00000000080008e0 FPU_IRQHandler + 0x00000000080008e0 OTG_HS_WKUP_IRQHandler + 0x00000000080008e0 CAN2_SCE_IRQHandler + 0x00000000080008e0 DMA2_Stream2_IRQHandler + 0x00000000080008e0 SPI1_IRQHandler + 0x00000000080008e0 TIM6_DAC_IRQHandler + 0x00000000080008e0 TIM1_BRK_TIM9_IRQHandler + 0x00000000080008e0 DCMI_IRQHandler + 0x00000000080008e0 CAN2_RX0_IRQHandler + 0x00000000080008e0 DMA2_Stream3_IRQHandler + 0x00000000080008e0 SAI2_IRQHandler + 0x00000000080008e0 USART6_IRQHandler + 0x00000000080008e0 USART3_IRQHandler + 0x00000000080008e0 CAN1_RX1_IRQHandler + 0x00000000080008e0 UART5_IRQHandler + 0x00000000080008e0 DMA2_Stream0_IRQHandler + 0x00000000080008e0 TIM4_IRQHandler + 0x00000000080008e0 QUADSPI_IRQHandler + 0x00000000080008e0 I2C1_EV_IRQHandler + 0x00000000080008e0 DMA1_Stream6_IRQHandler + 0x00000000080008e0 DMA1_Stream1_IRQHandler + 0x00000000080008e0 UART4_IRQHandler + 0x00000000080008e0 TIM3_IRQHandler + 0x00000000080008e0 RCC_IRQHandler + 0x00000000080008e0 TIM8_BRK_TIM12_IRQHandler + 0x00000000080008e0 Default_Handler + 0x00000000080008e0 CEC_IRQHandler + 0x00000000080008e0 EXTI15_10_IRQHandler + 0x00000000080008e0 ADC_IRQHandler + 0x00000000080008e0 DMA1_Stream7_IRQHandler + 0x00000000080008e0 TIM7_IRQHandler + 0x00000000080008e0 CAN2_TX_IRQHandler + 0x00000000080008e0 TIM5_IRQHandler + 0x00000000080008e0 DMA2_Stream7_IRQHandler + 0x00000000080008e0 I2C3_EV_IRQHandler + 0x00000000080008e0 EXTI9_5_IRQHandler + 0x00000000080008e0 RTC_WKUP_IRQHandler + 0x00000000080008e0 SPDIF_RX_IRQHandler + 0x00000000080008e0 SPI2_IRQHandler + 0x00000000080008e0 OTG_HS_EP1_IN_IRQHandler + 0x00000000080008e0 DMA1_Stream0_IRQHandler + 0x00000000080008e0 CAN1_TX_IRQHandler + 0x00000000080008e0 FMPI2C1_ER_IRQHandler + 0x00000000080008e0 EXTI4_IRQHandler + 0x00000000080008e0 OTG_HS_EP1_OUT_IRQHandler + 0x00000000080008e0 WWDG_IRQHandler + 0x00000000080008e0 TIM2_IRQHandler + 0x00000000080008e0 OTG_FS_WKUP_IRQHandler + 0x00000000080008e0 TIM1_TRG_COM_TIM11_IRQHandler + 0x00000000080008e0 OTG_HS_IRQHandler + 0x00000000080008e0 EXTI1_IRQHandler + 0x00000000080008e0 USART2_IRQHandler + 0x00000000080008e0 I2C2_ER_IRQHandler + 0x00000000080008e0 DMA2_Stream1_IRQHandler + 0x00000000080008e0 CAN1_SCE_IRQHandler + 0x00000000080008e0 FLASH_IRQHandler + 0x00000000080008e0 DMA2_Stream4_IRQHandler + 0x00000000080008e0 USART1_IRQHandler + 0x00000000080008e0 OTG_FS_IRQHandler + 0x00000000080008e0 SPI3_IRQHandler + 0x00000000080008e0 DMA1_Stream4_IRQHandler + 0x00000000080008e0 I2C1_ER_IRQHandler + 0x00000000080008e0 FMC_IRQHandler + 0x00000000080008e0 DMA2_Stream6_IRQHandler + 0x00000000080008e0 SAI1_IRQHandler + 0x00000000080008e0 DMA1_Stream3_IRQHandler + *fill* 0x00000000080008e2 0x2 + .text.HAL_Init + 0x00000000080008e4 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x00000000080008e4 HAL_Init + .text.HAL_InitTick + 0x0000000008000928 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x0000000008000928 HAL_InitTick + .text.HAL_IncTick + 0x0000000008000988 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x0000000008000988 HAL_IncTick + .text.HAL_GetTick + 0x00000000080009b0 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x00000000080009b0 HAL_GetTick + .text.HAL_Delay + 0x00000000080009c8 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x00000000080009c8 HAL_Delay + .text.__NVIC_SetPriorityGrouping + 0x0000000008000a10 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_GetPriorityGrouping + 0x0000000008000a58 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.__NVIC_SetPriority + 0x0000000008000a74 0x54 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.NVIC_EncodePriority + 0x0000000008000ac8 0x66 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + *fill* 0x0000000008000b2e 0x2 + .text.SysTick_Config + 0x0000000008000b30 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .text.HAL_NVIC_SetPriorityGrouping + 0x0000000008000b74 0x16 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x0000000008000b74 HAL_NVIC_SetPriorityGrouping + .text.HAL_NVIC_SetPriority + 0x0000000008000b8a 0x38 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x0000000008000b8a HAL_NVIC_SetPriority + .text.HAL_SYSTICK_Config + 0x0000000008000bc2 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x0000000008000bc2 HAL_SYSTICK_Config + *fill* 0x0000000008000bda 0x2 + .text.HAL_GPIO_Init + 0x0000000008000bdc 0x328 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + 0x0000000008000bdc HAL_GPIO_Init + .text.HAL_GPIO_WritePin + 0x0000000008000f04 0x32 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + 0x0000000008000f04 HAL_GPIO_WritePin + *fill* 0x0000000008000f36 0x2 + .text.HAL_RCC_ClockConfig + 0x0000000008000f38 0x1cc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + 0x0000000008000f38 HAL_RCC_ClockConfig + .text.HAL_RCC_GetSysClockFreq + 0x0000000008001104 0x460 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + 0x0000000008001104 HAL_RCC_GetSysClockFreq + .text.HAL_RCC_OscConfig + 0x0000000008001564 0x53c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + 0x0000000008001564 HAL_RCC_OscConfig + .text.makeFreeRtosPriority + 0x0000000008001aa0 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .text.osKernelStart + 0x0000000008001ad0 0xe ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0x0000000008001ad0 osKernelStart + .text.osThreadCreate + 0x0000000008001ade 0x98 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0x0000000008001ade osThreadCreate + .text.osDelay 0x0000000008001b76 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0x0000000008001b76 osDelay + .text.vListInitialise + 0x0000000008001b9e 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001b9e vListInitialise + .text.vListInitialiseItem + 0x0000000008001bde 0x1a ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001bde vListInitialiseItem + .text.vListInsertEnd + 0x0000000008001bf8 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001bf8 vListInsertEnd + .text.vListInsert + 0x0000000008001c40 0x72 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001c40 vListInsert + .text.uxListRemove + 0x0000000008001cb2 0x54 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001cb2 uxListRemove + .text.xTaskCreateStatic + 0x0000000008001d06 0xba ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008001d06 xTaskCreateStatic + .text.xTaskCreate + 0x0000000008001dc0 0x8a ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008001dc0 xTaskCreate + .text.prvInitialiseNewTask + 0x0000000008001e4a 0x10e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.prvAddNewTaskToReadyList + 0x0000000008001f58 0xd4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.vTaskDelay + 0x000000000800202c 0x68 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x000000000800202c vTaskDelay + .text.vTaskStartScheduler + 0x0000000008002094 0xc0 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008002094 vTaskStartScheduler + .text.vTaskSuspendAll + 0x0000000008002154 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008002154 vTaskSuspendAll + .text.xTaskResumeAll + 0x0000000008002170 0x138 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008002170 xTaskResumeAll + .text.xTaskIncrementTick + 0x00000000080022a8 0x170 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x00000000080022a8 xTaskIncrementTick + .text.vTaskSwitchContext + 0x0000000008002418 0xb8 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008002418 vTaskSwitchContext + .text.prvIdleTask + 0x00000000080024d0 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.prvInitialiseTaskLists + 0x0000000008002500 0x80 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.prvCheckTasksWaitingTermination + 0x0000000008002580 0x5c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.prvDeleteTCB + 0x00000000080025dc 0x5e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + *fill* 0x000000000800263a 0x2 + .text.prvResetNextTaskUnblockTime + 0x000000000800263c 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.xTaskGetSchedulerState + 0x000000000800267c 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x000000000800267c xTaskGetSchedulerState + .text.prvAddCurrentTaskToDelayedList + 0x00000000080026b8 0xcc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .text.pxPortInitialiseStack + 0x0000000008002784 0x68 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002784 pxPortInitialiseStack + .text.prvTaskExitError + 0x00000000080027ec 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + *fill* 0x0000000008002844 0xc + .text.SVC_Handler + 0x0000000008002850 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002850 SVC_Handler + .text.prvPortStartFirstTask + 0x0000000008002878 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .text.xPortStartScheduler + 0x00000000080028a0 0x144 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x00000000080028a0 xPortStartScheduler + .text.vPortEnterCritical + 0x00000000080029e4 0x60 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x00000000080029e4 vPortEnterCritical + .text.vPortExitCritical + 0x0000000008002a44 0x54 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002a44 vPortExitCritical + *fill* 0x0000000008002a98 0x8 + .text.PendSV_Handler + 0x0000000008002aa0 0x68 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002aa0 PendSV_Handler + .text.xPortSysTickHandler + 0x0000000008002b08 0x44 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002b08 xPortSysTickHandler + .text.vPortSetupTimerInterrupt + 0x0000000008002b4c 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002b4c vPortSetupTimerInterrupt + .text.vPortEnableVFP + 0x0000000008002b94 0x14 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .text.pvPortMalloc + 0x0000000008002ba8 0x198 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + 0x0000000008002ba8 pvPortMalloc + .text.vPortFree + 0x0000000008002d40 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + 0x0000000008002d40 vPortFree + .text.prvHeapInit + 0x0000000008002e04 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .text.prvInsertBlockIntoFreeList + 0x0000000008002ec8 0xb4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .text.__libc_init_array + 0x0000000008002f7c 0x48 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + 0x0000000008002f7c __libc_init_array + .text.memset 0x0000000008002fc4 0x10 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + 0x0000000008002fc4 memset + *(.glue_7) + .glue_7 0x0000000008002fd4 0x0 linker stubs + *(.glue_7t) + .glue_7t 0x0000000008002fd4 0x0 linker stubs + *(.eh_frame) + .eh_frame 0x0000000008002fd4 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + *(.init) + .init 0x0000000008002fd4 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + 0x0000000008002fd4 _init + .init 0x0000000008002fd8 0x8 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + *(.fini) + .fini 0x0000000008002fe0 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + 0x0000000008002fe0 _fini + .fini 0x0000000008002fe4 0x8 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + 0x0000000008002fec . = ALIGN (0x4) + 0x0000000008002fec _etext = . + +.vfp11_veneer 0x0000000008002fec 0x0 + .vfp11_veneer 0x0000000008002fec 0x0 linker stubs + +.v4_bx 0x0000000008002fec 0x0 + .v4_bx 0x0000000008002fec 0x0 linker stubs + +.iplt 0x0000000008002fec 0x0 + .iplt 0x0000000008002fec 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + +.rodata 0x0000000008002fec 0x68 + 0x0000000008002fec . = ALIGN (0x4) + *(.rodata) + .rodata 0x0000000008002fec 0x50 ./Core/Src/main.o + .rodata 0x000000000800303c 0x5 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + *(.rodata*) + *fill* 0x0000000008003041 0x3 + .rodata.AHBPrescTable + 0x0000000008003044 0x10 ./Core/Src/system_stm32f4xx.o + 0x0000000008003044 AHBPrescTable + 0x0000000008003054 . = ALIGN (0x4) + +.ARM.extab 0x0000000008003054 0x0 + 0x0000000008003054 . = ALIGN (0x4) + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x0000000008003054 . = ALIGN (0x4) + +.ARM 0x0000000008003054 0x8 + 0x0000000008003054 . = ALIGN (0x4) + 0x0000000008003054 __exidx_start = . + *(.ARM.exidx*) + .ARM.exidx 0x0000000008003054 0x8 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) + 0x000000000800305c __exidx_end = . + 0x000000000800305c . = ALIGN (0x4) + +.rel.dyn 0x000000000800305c 0x0 + .rel.iplt 0x000000000800305c 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + +.preinit_array 0x000000000800305c 0x0 + 0x000000000800305c . = ALIGN (0x4) + 0x000000000800305c PROVIDE (__preinit_array_start = .) + *(.preinit_array*) + 0x000000000800305c PROVIDE (__preinit_array_end = .) + 0x000000000800305c . = ALIGN (0x4) + +.init_array 0x000000000800305c 0x4 + 0x000000000800305c . = ALIGN (0x4) + 0x000000000800305c PROVIDE (__init_array_start = .) + *(SORT_BY_NAME(.init_array.*)) + *(.init_array*) + .init_array 0x000000000800305c 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + 0x0000000008003060 PROVIDE (__init_array_end = .) + 0x0000000008003060 . = ALIGN (0x4) + +.fini_array 0x0000000008003060 0x4 + 0x0000000008003060 . = ALIGN (0x4) + [!provide] PROVIDE (__fini_array_start = .) + *(SORT_BY_NAME(.fini_array.*)) + *(.fini_array*) + .fini_array 0x0000000008003060 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + [!provide] PROVIDE (__fini_array_end = .) + 0x0000000008003064 . = ALIGN (0x4) + 0x0000000008003064 _sidata = LOADADDR (.data) + +.data 0x0000000020000000 0x10 load address 0x0000000008003064 + 0x0000000020000000 . = ALIGN (0x4) + 0x0000000020000000 _sdata = . + *(.data) + *(.data*) + .data.SystemCoreClock + 0x0000000020000000 0x4 ./Core/Src/system_stm32f4xx.o + 0x0000000020000000 SystemCoreClock + .data.uwTickPrio + 0x0000000020000004 0x4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x0000000020000004 uwTickPrio + .data.uwTickFreq + 0x0000000020000008 0x1 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x0000000020000008 uwTickFreq + *fill* 0x0000000020000009 0x3 + .data.uxCriticalNesting + 0x000000002000000c 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + *(.RamFunc) + *(.RamFunc*) + 0x0000000020000010 . = ALIGN (0x4) + 0x0000000020000010 _edata = . + +.igot.plt 0x0000000020000010 0x0 load address 0x0000000008003074 + .igot.plt 0x0000000020000010 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + 0x0000000020000010 . = ALIGN (0x4) + +.bss 0x0000000020000010 0x3fd0 load address 0x0000000008003074 + 0x0000000020000010 _sbss = . + 0x0000000020000010 __bss_start__ = _sbss + *(.bss) + .bss 0x0000000020000010 0x1c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + *(.bss*) + .bss.xIdleTaskTCBBuffer + 0x000000002000002c 0x54 ./Core/Src/freertos.o + .bss.xIdleStack + 0x0000000020000080 0x200 ./Core/Src/freertos.o + .bss.defaultTaskHandle + 0x0000000020000280 0x4 ./Core/Src/main.o + 0x0000000020000280 defaultTaskHandle + .bss.BlinkLEDHandle + 0x0000000020000284 0x4 ./Core/Src/main.o + 0x0000000020000284 BlinkLEDHandle + .bss.uwTick 0x0000000020000288 0x4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x0000000020000288 uwTick + .bss.pxCurrentTCB + 0x000000002000028c 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x000000002000028c pxCurrentTCB + .bss.pxReadyTasksLists + 0x0000000020000290 0x8c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xDelayedTaskList1 + 0x000000002000031c 0x14 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xDelayedTaskList2 + 0x0000000020000330 0x14 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.pxDelayedTaskList + 0x0000000020000344 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.pxOverflowDelayedTaskList + 0x0000000020000348 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xPendingReadyList + 0x000000002000034c 0x14 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xTasksWaitingTermination + 0x0000000020000360 0x14 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.uxDeletedTasksWaitingCleanUp + 0x0000000020000374 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xSuspendedTaskList + 0x0000000020000378 0x14 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.uxCurrentNumberOfTasks + 0x000000002000038c 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xTickCount + 0x0000000020000390 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.uxTopReadyPriority + 0x0000000020000394 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xSchedulerRunning + 0x0000000020000398 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xPendedTicks + 0x000000002000039c 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xYieldPending + 0x00000000200003a0 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xNumOfOverflows + 0x00000000200003a4 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.uxTaskNumber + 0x00000000200003a8 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xNextTaskUnblockTime + 0x00000000200003ac 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.xIdleTaskHandle + 0x00000000200003b0 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.uxSchedulerSuspended + 0x00000000200003b4 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .bss.ucMaxSysCallPriority + 0x00000000200003b8 0x1 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + *fill* 0x00000000200003b9 0x3 + .bss.ulMaxPRIGROUPValue + 0x00000000200003bc 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .bss.ucHeap 0x00000000200003c0 0x3c00 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .bss.xStart 0x0000000020003fc0 0x8 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .bss.pxEnd 0x0000000020003fc8 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .bss.xFreeBytesRemaining + 0x0000000020003fcc 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .bss.xMinimumEverFreeBytesRemaining + 0x0000000020003fd0 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .bss.xNumberOfSuccessfulAllocations + 0x0000000020003fd4 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .bss.xNumberOfSuccessfulFrees + 0x0000000020003fd8 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .bss.xBlockAllocatedBit + 0x0000000020003fdc 0x4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + *(COMMON) + 0x0000000020003fe0 . = ALIGN (0x4) + 0x0000000020003fe0 _ebss = . + 0x0000000020003fe0 __bss_end__ = _ebss + +._user_heap_stack + 0x0000000020003fe0 0x600 load address 0x0000000008003074 + 0x0000000020003fe0 . = ALIGN (0x8) + [!provide] PROVIDE (end = .) + 0x0000000020003fe0 PROVIDE (_end = .) + 0x00000000200041e0 . = (. + _Min_Heap_Size) + *fill* 0x0000000020003fe0 0x200 + 0x00000000200045e0 . = (. + _Min_Stack_Size) + *fill* 0x00000000200041e0 0x400 + 0x00000000200045e0 . = ALIGN (0x8) + +/DISCARD/ + libc.a(*) + libm.a(*) + libgcc.a(*) + +.ARM.attributes + 0x0000000000000000 0x30 + *(.ARM.attributes) + .ARM.attributes + 0x0000000000000000 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + .ARM.attributes + 0x000000000000001e 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + .ARM.attributes + 0x0000000000000052 0x34 ./Core/Src/freertos.o + .ARM.attributes + 0x0000000000000086 0x34 ./Core/Src/main.o + .ARM.attributes + 0x00000000000000ba 0x34 ./Core/Src/stm32f4xx_hal_msp.o + .ARM.attributes + 0x00000000000000ee 0x34 ./Core/Src/stm32f4xx_it.o + .ARM.attributes + 0x0000000000000122 0x34 ./Core/Src/system_stm32f4xx.o + .ARM.attributes + 0x0000000000000156 0x21 ./Core/Startup/startup_stm32f446retx.o + .ARM.attributes + 0x0000000000000177 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .ARM.attributes + 0x00000000000001ab 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .ARM.attributes + 0x00000000000001df 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .ARM.attributes + 0x0000000000000213 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .ARM.attributes + 0x0000000000000247 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .ARM.attributes + 0x000000000000027b 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .ARM.attributes + 0x00000000000002af 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .ARM.attributes + 0x00000000000002e3 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .ARM.attributes + 0x0000000000000317 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .ARM.attributes + 0x000000000000034b 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .ARM.attributes + 0x000000000000037f 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + .ARM.attributes + 0x00000000000003b3 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + .ARM.attributes + 0x00000000000003e7 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) + .ARM.attributes + 0x0000000000000405 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) + .ARM.attributes + 0x0000000000000439 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_dvmd_tls.o) + .ARM.attributes + 0x0000000000000457 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o +OUTPUT(FreeRTOS_LED.elf elf32-littlearm) +LOAD linker stubs +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc.a +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libm.a +LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a + +.debug_info 0x0000000000000000 0x9aed + .debug_info 0x0000000000000000 0x294 ./Core/Src/freertos.o + .debug_info 0x0000000000000294 0xb40 ./Core/Src/main.o + .debug_info 0x0000000000000dd4 0xc0f ./Core/Src/stm32f4xx_hal_msp.o + .debug_info 0x00000000000019e3 0x125 ./Core/Src/stm32f4xx_it.o + .debug_info 0x0000000000001b08 0x55b ./Core/Src/system_stm32f4xx.o + .debug_info 0x0000000000002063 0x22 ./Core/Startup/startup_stm32f446retx.o + .debug_info 0x0000000000002085 0x9d2 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_info 0x0000000000002a57 0xe39 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_info 0x0000000000003890 0x7be ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_info 0x000000000000404e 0x9ab ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_info 0x00000000000049f9 0x9ec ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_info 0x00000000000053e5 0x1c41 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_info 0x0000000000007026 0x2d1 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_info 0x00000000000072f7 0x1de4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_info 0x00000000000090db 0x507 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_info 0x00000000000095e2 0x50b ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + +.debug_abbrev 0x0000000000000000 0x1e9d + .debug_abbrev 0x0000000000000000 0xcd ./Core/Src/freertos.o + .debug_abbrev 0x00000000000000cd 0x285 ./Core/Src/main.o + .debug_abbrev 0x0000000000000352 0x1b9 ./Core/Src/stm32f4xx_hal_msp.o + .debug_abbrev 0x000000000000050b 0x98 ./Core/Src/stm32f4xx_it.o + .debug_abbrev 0x00000000000005a3 0x116 ./Core/Src/system_stm32f4xx.o + .debug_abbrev 0x00000000000006b9 0x12 ./Core/Startup/startup_stm32f446retx.o + .debug_abbrev 0x00000000000006cb 0x20d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_abbrev 0x00000000000008d8 0x316 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_abbrev 0x0000000000000bee 0x1c4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_abbrev 0x0000000000000db2 0x2aa ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_abbrev 0x000000000000105c 0x1fb ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_abbrev 0x0000000000001257 0x39b ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_abbrev 0x00000000000015f2 0xf2 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_abbrev 0x00000000000016e4 0x34e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_abbrev 0x0000000000001a32 0x259 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_abbrev 0x0000000000001c8b 0x212 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + +.debug_aranges 0x0000000000000000 0x948 + .debug_aranges + 0x0000000000000000 0x20 ./Core/Src/freertos.o + .debug_aranges + 0x0000000000000020 0x50 ./Core/Src/main.o + .debug_aranges + 0x0000000000000070 0x30 ./Core/Src/stm32f4xx_hal_msp.o + .debug_aranges + 0x00000000000000a0 0x50 ./Core/Src/stm32f4xx_it.o + .debug_aranges + 0x00000000000000f0 0x28 ./Core/Src/system_stm32f4xx.o + .debug_aranges + 0x0000000000000118 0x28 ./Core/Startup/startup_stm32f446retx.o + .debug_aranges + 0x0000000000000140 0xf0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_aranges + 0x0000000000000230 0x118 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_aranges + 0x0000000000000348 0x58 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_aranges + 0x00000000000003a0 0x88 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_aranges + 0x0000000000000428 0x78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_aranges + 0x00000000000004a0 0x1d8 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_aranges + 0x0000000000000678 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_aranges + 0x00000000000006b8 0x1b8 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_aranges + 0x0000000000000870 0x80 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_aranges + 0x00000000000008f0 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + +.debug_ranges 0x0000000000000000 0x850 + .debug_ranges 0x0000000000000000 0x10 ./Core/Src/freertos.o + .debug_ranges 0x0000000000000010 0x40 ./Core/Src/main.o + .debug_ranges 0x0000000000000050 0x20 ./Core/Src/stm32f4xx_hal_msp.o + .debug_ranges 0x0000000000000070 0x40 ./Core/Src/stm32f4xx_it.o + .debug_ranges 0x00000000000000b0 0x18 ./Core/Src/system_stm32f4xx.o + .debug_ranges 0x00000000000000c8 0x20 ./Core/Startup/startup_stm32f446retx.o + .debug_ranges 0x00000000000000e8 0xe0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_ranges 0x00000000000001c8 0x108 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_ranges 0x00000000000002d0 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_ranges 0x0000000000000318 0x78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_ranges 0x0000000000000390 0x68 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_ranges 0x00000000000003f8 0x1c8 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_ranges 0x00000000000005c0 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_ranges 0x00000000000005f0 0x1a8 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_ranges 0x0000000000000798 0x70 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_ranges 0x0000000000000808 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + +.debug_macro 0x0000000000000000 0x21a4e + .debug_macro 0x0000000000000000 0x231 ./Core/Src/freertos.o + .debug_macro 0x0000000000000231 0xa78 ./Core/Src/freertos.o + .debug_macro 0x0000000000000ca9 0x174 ./Core/Src/freertos.o + .debug_macro 0x0000000000000e1d 0x22 ./Core/Src/freertos.o + .debug_macro 0x0000000000000e3f 0x8e ./Core/Src/freertos.o + .debug_macro 0x0000000000000ecd 0x51 ./Core/Src/freertos.o + .debug_macro 0x0000000000000f1e 0x103 ./Core/Src/freertos.o + .debug_macro 0x0000000000001021 0x6a ./Core/Src/freertos.o + .debug_macro 0x000000000000108b 0x1df ./Core/Src/freertos.o + .debug_macro 0x000000000000126a 0xe4 ./Core/Src/freertos.o + .debug_macro 0x000000000000134e 0x15a ./Core/Src/freertos.o + .debug_macro 0x00000000000014a8 0xde ./Core/Src/freertos.o + .debug_macro 0x0000000000001586 0x1c ./Core/Src/freertos.o + .debug_macro 0x00000000000015a2 0x26 ./Core/Src/freertos.o + .debug_macro 0x00000000000015c8 0x504 ./Core/Src/freertos.o + .debug_macro 0x0000000000001acc 0xb5 ./Core/Src/freertos.o + .debug_macro 0x0000000000001b81 0xaa ./Core/Src/freertos.o + .debug_macro 0x0000000000001c2b 0x295 ./Core/Src/freertos.o + .debug_macro 0x0000000000001ec0 0x2e ./Core/Src/freertos.o + .debug_macro 0x0000000000001eee 0x28 ./Core/Src/freertos.o + .debug_macro 0x0000000000001f16 0x1c ./Core/Src/freertos.o + .debug_macro 0x0000000000001f32 0x22 ./Core/Src/freertos.o + .debug_macro 0x0000000000001f54 0xd9 ./Core/Src/freertos.o + .debug_macro 0x000000000000202d 0x102d ./Core/Src/freertos.o + .debug_macro 0x000000000000305a 0x11f ./Core/Src/freertos.o + .debug_macro 0x0000000000003179 0x16749 ./Core/Src/freertos.o + .debug_macro 0x00000000000198c2 0x6d ./Core/Src/freertos.o + .debug_macro 0x000000000001992f 0x367e ./Core/Src/freertos.o + .debug_macro 0x000000000001cfad 0x5c ./Core/Src/freertos.o + .debug_macro 0x000000000001d009 0xc90 ./Core/Src/freertos.o + .debug_macro 0x000000000001dc99 0x9fe ./Core/Src/freertos.o + .debug_macro 0x000000000001e697 0x115 ./Core/Src/freertos.o + .debug_macro 0x000000000001e7ac 0x1a0 ./Core/Src/freertos.o + .debug_macro 0x000000000001e94c 0xa5 ./Core/Src/freertos.o + .debug_macro 0x000000000001e9f1 0x16d ./Core/Src/freertos.o + .debug_macro 0x000000000001eb5e 0x287 ./Core/Src/freertos.o + .debug_macro 0x000000000001ede5 0x5f ./Core/Src/freertos.o + .debug_macro 0x000000000001ee44 0x236 ./Core/Src/freertos.o + .debug_macro 0x000000000001f07a 0x132 ./Core/Src/freertos.o + .debug_macro 0x000000000001f1ac 0x29c ./Core/Src/freertos.o + .debug_macro 0x000000000001f448 0x2e ./Core/Src/freertos.o + .debug_macro 0x000000000001f476 0x11a ./Core/Src/freertos.o + .debug_macro 0x000000000001f590 0xe8 ./Core/Src/freertos.o + .debug_macro 0x000000000001f678 0x89 ./Core/Src/freertos.o + .debug_macro 0x000000000001f701 0x295 ./Core/Src/freertos.o + .debug_macro 0x000000000001f996 0x126 ./Core/Src/freertos.o + .debug_macro 0x000000000001fabc 0x58 ./Core/Src/freertos.o + .debug_macro 0x000000000001fb14 0x27c ./Core/Src/main.o + .debug_macro 0x000000000001fd90 0xe4 ./Core/Src/main.o + .debug_macro 0x000000000001fe74 0x91 ./Core/Src/main.o + .debug_macro 0x000000000001ff05 0x8d ./Core/Src/main.o + .debug_macro 0x000000000001ff92 0x7e ./Core/Src/main.o + .debug_macro 0x0000000000020010 0x19 ./Core/Src/main.o + .debug_macro 0x0000000000020029 0xf2 ./Core/Src/main.o + .debug_macro 0x000000000002011b 0x1c9 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x00000000000202e4 0x23b ./Core/Src/stm32f4xx_it.o + .debug_macro 0x000000000002051f 0x1ba ./Core/Src/system_stm32f4xx.o + .debug_macro 0x00000000000206d9 0x21a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x00000000000208f3 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000020aad 0x1c0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000020c6d 0x1de ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x0000000000020e4b 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000021005 0x1fe ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000021203 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000021213 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000021233 0xc7 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x00000000000212fa 0x187 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000021481 0x279 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x00000000000216fa 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x000000000002170a 0x196 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x00000000000218a0 0x1ae ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + +.debug_line 0x0000000000000000 0xab30 + .debug_line 0x0000000000000000 0x791 ./Core/Src/freertos.o + .debug_line 0x0000000000000791 0x915 ./Core/Src/main.o + .debug_line 0x00000000000010a6 0x6e0 ./Core/Src/stm32f4xx_hal_msp.o + .debug_line 0x0000000000001786 0x83b ./Core/Src/stm32f4xx_it.o + .debug_line 0x0000000000001fc1 0x714 ./Core/Src/system_stm32f4xx.o + .debug_line 0x00000000000026d5 0x88 ./Core/Startup/startup_stm32f446retx.o + .debug_line 0x000000000000275d 0x97a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_line 0x00000000000030d7 0xc29 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_line 0x0000000000003d00 0xada ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_line 0x00000000000047da 0xd02 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_line 0x00000000000054dc 0x138d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_line 0x0000000000006869 0x11cc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_line 0x0000000000007a35 0x707 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_line 0x000000000000813c 0x1917 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_line 0x0000000000009a53 0x7ac ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_line 0x000000000000a1ff 0x931 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + +.debug_str 0x0000000000000000 0xcf5d0 + .debug_str 0x0000000000000000 0xc5c10 ./Core/Src/freertos.o + 0xc5ed2 (size before relaxing) + .debug_str 0x00000000000c5c10 0x2818 ./Core/Src/main.o + 0xc8676 (size before relaxing) + .debug_str 0x00000000000c8428 0x965 ./Core/Src/stm32f4xx_hal_msp.o + 0xc2b4a (size before relaxing) + .debug_str 0x00000000000c8d8d 0xd9 ./Core/Src/stm32f4xx_it.o + 0xc5e33 (size before relaxing) + .debug_str 0x00000000000c8e66 0xdb ./Core/Src/system_stm32f4xx.o + 0xc208f (size before relaxing) + .debug_str 0x00000000000c8f41 0x36 ./Core/Startup/startup_stm32f446retx.o + 0x69 (size before relaxing) + .debug_str 0x00000000000c8f77 0x60d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0xc2c54 (size before relaxing) + .debug_str 0x00000000000c9584 0x344 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0xc2962 (size before relaxing) + .debug_str 0x00000000000c98c8 0x121 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + 0xc220a (size before relaxing) + .debug_str 0x00000000000c99e9 0x233 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + 0xc24c8 (size before relaxing) + .debug_str 0x00000000000c9c1c 0x324 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + 0xc24fb (size before relaxing) + .debug_str 0x00000000000c9f40 0x38ab ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0xe352 (size before relaxing) + .debug_str 0x00000000000cd7eb 0x20f ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0xa651 (size before relaxing) + .debug_str 0x00000000000cd9fa 0x1126 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0xc9bc (size before relaxing) + .debug_str 0x00000000000ceb20 0x783 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x85c2 (size before relaxing) + .debug_str 0x00000000000cf2a3 0x32d ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + 0xaf93 (size before relaxing) + +.comment 0x0000000000000000 0x50 + .comment 0x0000000000000000 0x50 ./Core/Src/freertos.o + 0x51 (size before relaxing) + .comment 0x0000000000000050 0x51 ./Core/Src/main.o + .comment 0x0000000000000050 0x51 ./Core/Src/stm32f4xx_hal_msp.o + .comment 0x0000000000000050 0x51 ./Core/Src/stm32f4xx_it.o + .comment 0x0000000000000050 0x51 ./Core/Src/system_stm32f4xx.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .comment 0x0000000000000050 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .comment 0x0000000000000050 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .comment 0x0000000000000050 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .comment 0x0000000000000050 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .comment 0x0000000000000050 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + +.debug_frame 0x0000000000000000 0x23d4 + .debug_frame 0x0000000000000000 0x38 ./Core/Src/freertos.o + .debug_frame 0x0000000000000038 0xf0 ./Core/Src/main.o + .debug_frame 0x0000000000000128 0x7c ./Core/Src/stm32f4xx_hal_msp.o + .debug_frame 0x00000000000001a4 0xc4 ./Core/Src/stm32f4xx_it.o + .debug_frame 0x0000000000000268 0x58 ./Core/Src/system_stm32f4xx.o + .debug_frame 0x00000000000002c0 0x374 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_frame 0x0000000000000634 0x498 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_frame 0x0000000000000acc 0x14c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_frame 0x0000000000000c18 0x1f4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_frame 0x0000000000000e0c 0x1e8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_frame 0x0000000000000ff4 0x80c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_frame 0x0000000000001800 0xd8 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_frame 0x00000000000018d8 0x77c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_frame 0x0000000000002054 0x1a8 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_frame 0x00000000000021fc 0x12c ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_frame 0x0000000000002328 0x2c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + .debug_frame 0x0000000000002354 0x20 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + .debug_frame 0x0000000000002374 0x2c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) + .debug_frame 0x00000000000023a0 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d new file mode 100644 index 0000000..6f93a0c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d @@ -0,0 +1,38 @@ +Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o: \ + ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c \ + ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h \ + ../Core/Inc/FreeRTOSConfig.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/list.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h: +../Core/Inc/FreeRTOSConfig.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h: +../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/list.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o new file mode 100644 index 0000000000000000000000000000000000000000..ff3e09eb34d083fc6388434379349d34de9db050 GIT binary patch literal 127384 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

    +u*F!QFmiLH5hG!N(#UnOPtqpG zc9lnjI0;=~ppscoVpAQ6jInd{?1|UHMg`CrSsCMw{INMjQU0_BvvmlUw84>!hsTC6 z{~%=EGt1ye_UI8ObxQp4I}i!Op2+*snFY(-6E%TyksdL4*lp7@2tc=^rZ|Jk!d@#J zu+MSx0$m<#_AybjgDDo^S^F_Iwfm_%yUQ`sIXZ3{fRKipJa1EWLMe@x!bY?WV?AGh z4-KR7;lrJg1qer78{|q#ts+AV=`eZ&DHf;`1!J83G?L4i8qty)w)rsbs}CH7NYG}( zkM5N4O==@fafauBjVa7%4j9?hFWBxTqh4MN3!Z)f<;S{RIOuk2zE%yiAEaXxty(os zWMHRuwCy&j!`KYA4LF?$Y_3_tl9>gQZGGZ{zN(3O=zVFH&p|*4QgbZyq1@2(T(*wm z4le0j*Ks$UH#+OP2Q7?PPcHOzu=}+GQ*z5h{Zfpr(dq&Wb-mdNg%EI^0CVZOEi?-9 z(WzFN!?(#-WVho5L(a?>V!_eEvI34(=9OOjTWX5j5&528~j% zP}+|88jO5pjBVI!_A>dd(;0RRHl(A&>kx6Y6Z_<7Ym3K5!a;fxW%M&oThpyqNN?nan8mC)R8gfv!wkq3P^Z+&! z4&oi~ZQPHq;BH}maz*-K?hSLR%@r5XCP5kaG)sChJHD>&V>w0~GrNfs+LX!+G@p-2 z=uAePt;zVFx!O1+$OvCkM-y%Py=NCnRLPk$8k3uWrg)cPq>1i5my3op<_%N^Vc*)O z%THK_jS+cDWsK7>s-tIV;S9Wm6@^g9;%1(UampLabjphJr?yO-{)jre>2Vj5g$?rQQ$5TVJ(z z>-Zen4cKmmP6->=+B&y>2!Uc@P6LG^m5AKXIHwBm_3khYZ~P;9&=?p*G?gi+Ris`Z zZ40L@Uf6ZrZ*tHt*xI41$o^`DI|SKpg|ubo##_a5*pM zT-M!nyU8Bxm>f^#JauCX6|5o(myMwcTjX)Z)DaP?lTO%3AH_*r>j%~_0`~AG9*J5% zU!f!77k#rKv@w-2Dtt!&_?+94@3RD zX#pzeiBuYw=l>HEML2*!y`CGN*=7Rm%|Vd0zEW&`Ckp16Kad!hBg8o}=Hl$xjL4b9 zgLW9}0aoAQ4P(4f1r5IsoO%O^T4)|e`vn?&xY36-lCOrb)!y6R+tc6G(N*f}>Fnz0 z?#1ED#XgcHo6WZWrFCsEor7yOtYj>Vu?X)alO9u+S07jbt&<8D{oig}a+8@_^36k% zl8 zu3{n-oPn}q9C6WbvX#FH(O%XJY=~~yR-T?N!*8C;JDi4wvg(uTL8tn7TE+p~rtiDPxWMHa17 z*vFE-MrRwDF=eds!rs-`%D9xYudi=Uw<^*qJ6ICA@xlFw z!Aj1ekeD(V5j%0rn1xZ{gJcAnu?pVCpW0EU$CJPerCsQZEPOfUFt}Dlj)~bZ$3TS* z3-#)%1n0UTI;5zD7#5vSBBpJQZ3b}z%Bb~fS0Gqaai5Qq6Ho_7OVY*Oy4KT|MoQC- z8%!G6M=#!xW6-8IzttU2!!cM{G$nW8ZLl-4<7pLR2C_Gv&*u;AurfTk!{iszKP`1P zK`@G=JaSY5Y#my$ZF&Bpkw+Vvq&@kQW)bj?Z|(+$|8hS}bOave16~zQ)F!Mp+XO`$*R`hiYc)0_BLCP7tnKJJ@nJx_BL72Q`-oJcG`YKrv{VGb!^#goW%$c*?yeZ z4!(+K6p$&yn)SrYchk*<)RxlS87i+Kk-oBUGF>gey1H!atJ-|s{5!3l3I7EDkv2Q8 z_7lUeqgz%DTv&*BP6kjl*3ZRX;1a!8eDt%8r+@gVjc3o-9e!aPZWnleXLlGbch6 zrI@P`Df6ZPnRk)b`FrK`vVEpN;b|8b%nH}6sgO+JO zonPTyI4n235Sb!pR>)`ot{=gt3}Y9@H*kTDKy+mCI2cE0HlB8!DRRdUzzq6(7uF5y zAHPXw1~`)jepCEac65M?J?7#qdG}d-83Wk)H?Syn5HZ^!JT!xm>;duyV@EL3yiKL1 z&+dJu&%so1yG=5?65Oss-?bIYo`>Tcx&+r<_zo8-1zbxSxz|ZsxPXQyJY)g^#}x+> z0msh{U$}Nfa2g|zWbCqTl{yzo1x}@>wjcUhM7PAkN`);K*G=moC8pZf*toP{CkjGX z$9uZ)C+}cs-o-m?MWY>s?G`g@e5}Kvoj-a!il+_G!gqDRN0b(n)-WD!>_HBM?< zvUhR{<~sEPe}tr@R|JlkhW@$VhK7Z3a^u}kAq@?qQK3BZfICr1Hsf;nbq7*xC+Wis zfX$Qn{G}2OTQ@*$*qc%>pbd;tuY&s%y4{Tx*qOLBTW6@7@EQ#nIAp-bHmz0W1Zg zXJ=n;Hx6a*qx5qcdNU_r^KWndpz>XHp8*o%Z2uEB+ggN@fvFDH6h3Bju(6AaP2W6m z(t;?rIn82dRp$51;;6=TUYO|5SwiK3Sa1b`%>`0HDfK96gfeXatRf_l%l1r-VzI)& zLkv?Av_a>nVd5>nM7z)?1EV+?9g$*qE;7~Q1ufu~s~8$EY@5e!f=49Ro%Q4I=O9CD z!yrgMc9gjr5okhnhxZs?!Ks?XJt0j`rRS~#ZS#~_qd+-p!z~vDpMwBv<0goI2UlR~ z;lIJA$I=aEGHfbFF^L&0e_#y#yMkvJBOo-zwOrktxlX!fb8}5@m^3!rsUc)gYNpoF z$=WtE((d>^8&Pqm z8{$JfpOeZoU~o4(J2UImeIQOep7^4a3ASA}!pJFHkM=VRP{Ly4m5IXXLBiW=BL2EX z>C9?VR1>?Yni+K(U)<&&0?wC`pczD5AxB9@__PMKF9kc~MbjzMf;ac3uFiUJ4tpVu zVKYb3Dc)#=xk`E06h;PkuULF&e&VWn8D`JMT&Ki=S^8*Et4`Sxj6e&lYs?ciSRn# zK_2$*@j(O>Sb@rev$;6O4dIB(Ge!>DESLmq|CbLe%zXybfT?(iN<21a?p)XU5WL>I z0%n>r@}B^M0MbKqKga$%GXuVqubm1hMeI&usYWQpXr@X?}XzURFws2>3q z03o#(UFhh`ARg2lSQoc?L&FfBewi7h8jWDj=Z+?Y^mPji4py1`V%Zhtogm?qA1x)5 zn3H_?k`#SN!W0NSXs*S(!O+{5-$E(6KckrTkcOoSNUtc;-0|@j-F<(Nmw$6Ez%Ty| zmwlKcu3tw@qYg{kJb;r3xL%>*OnVmyeH(G9Sk>XxUgV)E^5%3<7kkt~^f(FH=qMI0 zSRYc&xgJ|)cqXKzkvwE3(RcikCXD$jJ38a{cz$@<+MdOQG66Ll6>V)aO*akGF?}#Z z@uFa0<{>efFZe&WfH?K4EG%|nAzZy~1fxFBZ-?gPoZimo(@F1~Ks+bf&n|Ik4BQ6% zN|gy?Qij*~>H-#!Id8C6Cz8nmYEjOrgFw*~_5EXqG8Hhni_LginGq%T>fSwZt{j_s4WW{jMZvA!|p4J8DjBlYaF!IYzAZ`^fiHg%b zV3C&@x3gZbna?GJBN=V633m4#J+`~%#=8^b^2*Gq=3s2?v1vOML-tgJ;5@aHM~E!3 zC@FR;L+USCx5RehonW1oFuFIFN$lmFYzbx_kR);T7(K^&Ykq_5C7Mz@YaF!UbQ$J2 z++YWnd9i@2D4bvYvq-0QwprH7in+boq-?!GWXxg4z&2t`>?=>X3qMbOdlG_J;^MU0pY3zu}#j~CaLhXm<22CZ#zPH2su!ij2ntJMmTs9-xh+GdM$sYu z^4^6-Y@4f|J30RZ9`0whZZJovpYl{9d#R;csQg|Dw^4f^S`x!dY|}8EFJO!^&KM{* zMH~xF?gx4eY|I%|l3OXrE~$V9FFL;z{{Eyd(nUlHP6k{KmJ3hFXwQOETM|BS!@%Ik z5M{7>7--J|kuc(I0N1(&iZ8eqXly6$)}s7+zo%lvVT?Ozu?5j-k1OD=D_b_$G&u{7 zs4aBZh^Pt60e%u=WiGQQ{|UX>_k$zm79l(?h1*ZF%}e-c(YxKNpL5$NgN1XGPGd@IKnM- zBZGJ-vTm7nmNwH9u(a7*fg25EGfR_|*!ir2*)~Ohv@0?@LEBHcVKlg%=6l1?qt8@R zQ5`%C-Ic$@N;l_SW5X(~c0nUu#n&5Bg!8OZo0w`_hr2v~_7nVKVc$b)K^<}$;mIVu zO^?X3F#`412%`tv=FbH@OEoQ--mTF&Cm8eymBd47193_mi(bxrl9XBK2*#(O`57Xf zc-Atn_cr-4hepOV=4EK%h@;ca`c+%A&=8>8WG&2IIn(jj*v-2t*a&QFLDRdI%4Kc* zV0gzFZJPyWTwe&M@Hma)WpwYX?WxJ<%1Il!h8hw_E%IuNda)a9ZuigE5aeJN;*ery zIH@V-6kg4wjNV>Gd{~pI>?WS6rf@tj2-CozohD(Q&#}gM5tW^L=*o65e#_0>CA>M3 ztZsR3+c39j>QP@@gmnvS7uq} z%^oCAkfYt{;$2U~4~7>=ci=_?5StMZZn5|FXj?cAyC9&(bR10{%|&LKWF+2m!}tr6 z2fdr?Nm8M_pap|~=3gdhft^2%;-hn9HjSEE*60YLYc7F#tM?8c*|Uq0IoN9!B-b4; z=_yV)6Vq$i_FnP}4tqHNrecixNwaZi!>X0*s6p@QmTWl<>fX>sJKg>}L%4&IDMKD( z6Q0LInK&HmT1FHdV-8g(?Q%jU)){Ct;9^^qLdL#mqqhNmOdA(wS$4uhLkvq^ zn2??%Ix;fAqj+^%72abo*a&wPI}p%<^1D=@ldWZWHH@|Jg#KL2rnvz>@vKSIz34*ZSuUm;I4a#$fgCm0`vW9h3ofB#h#G#3G zIlmaEiGrYvQ$JX!n*z#A7h=3r&SR^IB$QU`K|45ur-niJxcF$o7dEVm zIHVyz_hxO*#shpUq_@_*cBWQyxfh~NY#3|9-UjOw|I2q+wYiZk(Om5c*b=#EEY}~H zFWONcKpqqfBfxn~0z{^ffL|)T(KeXtVc*qOc+6uUc1@)n4crd=wveIFK@dsLERs9y znfL6}ma#q$FO6Y8-YB|y#-h22K~8ZMgkIw~_HgYGgV;da>TEs{M-UbaI8tf^!Me2Z zIW3KusI3q7fCx8P8%NLth|@C#yEHsF8=EYSV|>8;B9ZD|j4bF`W3fvD=9dcxN-LFI z#k3DVt^5#t=cep5QHEzUX39rGsHgVpHp0$p4fe;-q9GucxBJbV32R(wj=zUr0;9{C zfqEM3!-wm_bh1v8DY}g@jM@=99n;%!`POi3p1{d{3YoP{Rd^0iN_`3zPcPdmFH;?7Fk5voqmn=H~T^X7K9866?5G29pXQfphKl zDd*|kXm^$}zM)-2BkMBbGy=s_99i53RTk@}i?X9QmWZ30TG`Qn>B>ixpIDTyr8?rRcIPS^cna3&P%7Ss(Q_eXd=F9hB}3t@H|=3>gHOM@0Lnx;A#M&O<(k$v}6< zbbn%_DW@Uo!+2uQN1Y5r^3+2eu9mVOmZdwbm|I@+EH%4D2=s%+iwYc6<|EA;e_zBI zc|7ru4n{U>MR_r|xW5m!H1kY{nx;ncD$i);Y|HcF4^eiAp>b~3rq!!SrdOHY88}h% zd&u2v0uy>P1}|hmc(5t*HgLX8qJX^oVl)bl{s|Z^P(d1ZHIu=2@w{)FjzfFqDbI&I zW4eaFtpPD7(3EvPyQVA&we)G=vL;L_!_jhr)mKG5u$i`iVO*Qqw@`3321ihf_il$U zu3C=|p}C9gEptAi*de$cqhX)X@_H``3^(uY(P#c1u`&Vc;z1f5`H}}`aO4IV;-(ml zUtim`ZGJnP^eBvRrnxS|@Ab_}k4r-C1}DnT?sDlmf(_FdTP?H%29|=RM1iFsxrI1- z7#F|jT1uxE2n^q8Do8%3tc6`)aAp^M{TIa?Y$5c<^4Vyz703C8lQM{FBN5iY4ACY|e#DB2BM zy1-$rDYtt4(14Q|z`75D)Vh8OL%M%qlQU|xJfp#K@C`dz#J-aY; zA&P@y#Wp?O3paN?38Ty;2!lRgG3eQd-lV>8GDZism7tMyq$<>HlXuOy14{AL?n}6N z&wUD_ERv&y{+3$QEb5J$iYpK%a~6k7rVJKct|Er(92w@+&B{OdwA#8k8Xea{>lwN= zL@xlZ2D4jm@8O`82R9frg7nu z!rkMB&8w2?p6TiRxQ@{*A*b88rjCR8Ti|hz%>hrRz&-Fk^}R&1&osK!L2FD75MwIX zCi;D|8*1EA&N!Y*92RI6y?U_eFdi z%bBBQLUyJLj%{IJDh!!5J~P+ONDpQ~hNiRFO^gO7Iv%PJFgPK6+%&d&94jFC2fUb> zNV&}$w$R39Epu*w3;5$UwPgwR;sr7yR(r@h{`u~?4Gdf`zcq`vpGmy?B1Q#@)dH%M^-MReq=;IR)N&u!caWz=IcE8vivYBB73WI4T%BE!myjIugk z5$3ylhO89o&rEAtEAKF}Y8*I1JgtBg4koH?;vvb{IKH6k&-ek37|tC)yfm5G<@V*X z8)m9B8Gx7L*ow@~@?g9iL!ZT~8hbgOd#>45dM`(MIPxy%<+yUyicRbz=&TtO%NVTreD!_dgZXil-WC2_YI=N`ueA{(9)EH?=ShL7D8Iy3cYa}GWRR!^{10Kd+W zW(*Xjm+S+>@S1jNm-!Vn31_}%AJ4^bQNLEt%>GHyD%@Cx#l(2SuvQ{L(M0#h-qahV z*(T6rYBrDKEuixz^0$XZXSU{&a_7%sIoGc06Ri=aD@|=`M=5bam@R0ktyexa@Xf23(aae0@7IEHS zFUb`0X=fUKKqF9-CW-tdA<6rh%ZIA9m!@-3cezs8?SEMSi6qa zx7lss^VnvKR$HO4o}F=-nfiK83(IgEY^*O+4a?ZKP1il^zw>?Goqr#E`_{Vm`EXdq zTKaKyWpd+}ZK&}Z_Stn-Pf9zU*le5(Te-Avt(7Vb`u3Xey$X2de%IdNGw;pU)yLl5 zsk*{)cje2qvD|2bXEyuJ0`B*})%YVFzif-gyZ0*i0>G={GFSX*?;h5bdnb-NwLR&Q z|2+hM_;(`xEcgsyGx`;lS&4G~ew#;+b?+NKBc_pIUib_?KWuxKXXAozzpB}|aNm%Y zTltrkdx3pZI?illuWr!iZY>LF$VK)28Gc{5283DD8D1h?~3x- zA=$4r>5lTdvrPQen)F8by-|LDl;59lt{2i${pnx)qcu4zDt}g#e|D6Ac9ef^lz(oN ze}0sIew05D9T;D4(lu_G?W>qWqEQ z{YJ9F_^UM;i^`8h?>82e-yD_S9OZ9~^0!9$mqhuOMERFS`IkodkB{;nALWln`QuT3 zIm$2F_h#dz9F?y`Yi z^e_I=noLLKr=$0uj>^wO{wV*-DF4bR|EefI8wo7fnp_>_Ume~5q$vMMQT{bi{xwnlbx}UK?(El^Tp#6M zpJn2&*5qkX{?nrT8>0LhqWl}9{2QbEr$_lukMeJd($9+0&yLbJN9pHA>2F8re~Hq! zL}_w`*{?OpC^4_LCNIu1Eqz;*ep!^hJxaeaO20Zv|811MBTBzMO1~jWzbQ&{XOsO} zlecCG{MDNLU6g)Dl)gJkbH|wdT9fx?3H;TXygy3c6Qw^Gr9T{{{~=0$EJ}YON`ER! zeTCr{&JN5YLxz`DE;*){mm%-y<|=9N=vdUmtK^-HkWQq@=rV@IfBe* z`a3i^JD0v+vMZN9EO}WjeR%TOT>1zyvB7U~(wR%&KY2nfePnW5E`3z;sa*Q# z1CrBQgX)uGlE>!K4@{n!OCOuOHCXYHatnZ=8NG|=b9(I`sCz6hlTZ>l3bWepPD>5mp&~ljQRK7DE+TdIyV?lKG%6j=NccWT;m~~`*@^t zFOPKY<&Zu+dOpTq@M}#L2Px8z`$y^gZmczdfG_y9CPxP;-p}1&_G`uX3xBQ21H&ZB z9~-3~6s3=g(hrW(4~f#pN9hxy^oddWp;7u_QTpLg`Vmq3kx}|lQMwSNPm0n@qV&m8 z`jjYrYLq@Lc^kT%ql!IoEcU~H9}EGu{+E=`mN*vs;qOQJzgK?2^06Ndh79jNHA?p) z&F9@}<-3yAQU2B_T~&Gae%;Azl>bcSyZ7r&UKZuQUioZ^W0U^mZlzDR^jXQLqVnHR z{@Ip)cJi|*e{nDc_K1af_$@$4SN*63WkX)cNN5Zkmiez&x zJ(yILzQ*!bCcBaLKR*8%QTnAS@7i~D^7<(M-O4ZG-ea-9{aBR$?I`_!RQ@(Ae?jt} zQT~Gh62SL)G}3I3omPH*(i7#cjnbE>JSpL^$;M=Rl)p#$Rm&evZiw<<5vAX*^6q^{ zl8-3u-e)ZNs?zRxo0ET2nw-(G$=2joNc$hZ=a7J;F?}@B{Jsz4-?7Oh$wQ<3qMm4UT%KQ zB}=3H9_6pJ`}ZWPqWrB&geiP*%A1rw+-;Q+F9@izSqx{Dy-;K}flWC>h z`#mkWK9{~BxlL*Jy*DOr$)%s3B!L~#Df4z1pPe){pG76Ki}@4!@|GZ{RFl2arS@Wb zUsoSak(ul+_VgEfij%c!Z$~#GzgBuCCntI)N+m0X155VqoSGQNc@lFlVQb&sUTUA1 ztWI{9CW__BVyU}YD))AD_4br;^8I8_SGlvZVmG?`P`<0w-qlemBVciNsiW4_Gg+E| z6uYZd>Fq6cb(K5H#V)&Hs#dE_?#2zhz3r90zV5E>N>}$J;-*!K-4h+fj{crvWwO}O z+h6SMwi_l97Zhhi&f%8M&i2W2wWCt2bWKzc|FPIp>f_09rLMl}M71(mEq2;1&ho-; zDB&obuAa_HSEV}9*@w?BPV`m#yC{}T^;4_QdbGR(p~N<+MCfXk-dSY>glLlO|iOK%Ho@ytCR&UKUt$#pwv4legtLWKktqY;P@tBFqL{Awd@n*dk z>iso){|Z``eOKy7e`7MhKe!Wv0VO*-F!1mtT@#btTa)=C%XFk ziW8Gv-KAn*xm4*c_IC8)le%l2cx+iWXgIO6C(6BjeK<>{5A|arbx(Hol-M{hBf&7n zF`}H;*(1*a$=&V z58u;`iBLw@_H>tVYpphc=h-vhvj!9Md3Q$zlcL;Jp2W=S=q>j2^mI;4ba(f6l`&Ck zm@57|+zp*w?U)V4Qg6AZZ?c4XJ9>L3(F&!`&T4mOZ(ldgwdZH}1M~)GcHy8oJgEy) zywXz!3FzzZ!JAZjCu;pQjK`kIB745G>W0+r*_kJ(S31!vrQXg;U#YiPwc$5e>Meml zl)8Fr<^EES<_B$&rpq|PosTKD;~`z8j$*aHzt}lZDPu(TS9@{FBt8oVxpno}`|+MK zOvZ6b4@gO=bFveoucxoCvsmlv=_&V4V6aV;K;-&+dff1x-o0mh?`(PZZje&khPNwC z_Jb7mb=GP?A~G5V@~HTNy_tw8Y-$in0VW^E@3 zR9CUw-B~MvT=x`vy1KhNCwf6w?1ju_g^4yJfb|>w$_2sG}+aGsoha4gN{})MLJ9UMG%PY{$AJjFtgsheU>-$xA*se z4s>9uc6MWucXU;IYdHO^+*d^GdzfjtCcEn! zt0k--9i_?2WUaqat#-K{Nmo-0{ZdCeW<>`+quSZog~0(zf^Vsm(AXHy6;xv%UM0$Nz=u2g%wdJqnv8z0tJ=D`N?;IzPc&c&2}j^e<`>Ykl; zu#+p{!#{Wr=(Gea0c%-B`(dJt*dD$Z6Xy6K3)T7z-0F;dWz}qVy1$)~p}R%7zA$_a z;k4`3#aXj_L;E;Ixb?Yq8g}{uVQ?xd?JWfvVaMNs2m8wifJJ9rpG1!T z$hr*NZl^b`Sm%d#@%SHq?Vrx z1`&GhISXRKuv4bSt#B$bzG#Qcxf`C8?B|X@c`kHiM`dpMyJ&cBO1r=P zH&}6H`_ifk@93sfkoHB~9V}tPJxk_JQk|L04j4<{#Uj1pD_w)zsl%@A?9ViV1BM}S z8hfDo*KeH5Ms(Guk@H3wNY7Vhi6E+8T09+s=*K>Cfkzs1-&8ZHuIug87x;zL>z?hh9q+LE*rA(OknuqAnd($^3V*L{myOme&U$QJBb zU3to<7C)fHB)*GLFD0joAJ}4cu!|Qb3HPImk5&ChQ}Vg^INgu(_S}cIB$x5}!&;I) zBCd}SAJJm_|HY4LNhq;gTxfwLEXar1(UX`yxy2;DywA#=+L8?O`f1sFai6=mt;N01 z=`G2*OrOyLO9xl(e4>BupHZ*1W3eSUoAm%M5pw^(xT7VZT#0yxkb8PQ&%U>-CAnSc zcMwZz=T5a_kJ=CKy@L68Z_536e~EZjOHw7`doR`Xc_O~!4MZr93PiluMk4OF{>A%P z`<>Zh8cx2S^$(tFPwq*Ife=)?8#mK)OaMAV7u6+^28Pos}Daj{NBERTq zNpceLM#!6qHzWxyv6z3JaJ6uQkmHj17YnxucL`~!!2D~4c!Z^I5xz+HTH%|79~6E? zNVys7`Hc`$)Y1 z9wt0V_-NsBVVAI9c%E>z@G{|~aHnuqxKH>b;q}622yYg?KzN(*mBKrOZxa5U@cqKC z3co4*zVK(lhhl>AJ5LjK3eOc@Alxk6F1$i`z3{oh+l6luzEAiG;Wvao68=Vb7}h+# z$3uiC3yZ>Ygck_62y4PQ;kCl&2wy6^Q}{077lr>S{DpAQ;qE<-7cLc2@5T39CA>tq zQ}{&Tjl!1--zzLHHse^&PzL zbHWzL1PRFM0|3R+@bW{!jB8TM1)z|_muvnum!61MKE_ehKT1sTG&P0 zpCl`k9uXHm zcph;kNj54yF5E$!PLd}o{S4ttgs&y;NRqcI{eI$9l6+k0FA*ovE=vDW*aC)PQ5Ee% z#Cx42TuPh(U#9f=#LJRoNa=CmZsAqL$0f;4O20&Sr|><(PYS;-yq5?j^H)kA28NvP zalEiiSR#U18&rB!c#ZIx#LY?a5~c4HenR+VBAA}Y`0v8s64xim5nv?w9w!Qm!n27NB*}$JKUTOy zc$M%*;@Tv6q0;XVevr62Nj|UicZ5fQfwcZ6B7cqW@w)y5;>sl1uk_P}FA~0A_zB{Q zB>9@s|0etoBACxZv7z8|9xOan*dts)#Af3nrOU$0h1Uw7D|{L8tR#7(((e;~TKGNT zeMD?Z{;2dZFm2&`Je=5_Bxfl77~zG&ONHBsok_A+=^KPE6uwq?xA4QnVv>A8>F){e zBevr`lzsphe7?t-!t;geiDx9qW0l?^yi$0R@HXKc#HC5{PNhF8{HpMK#78H|&y{XH z(LMJ#VS#um-b3m0ghRs1ggc2RC&`sc-z0pA@U6o46HiK#Pb>Wm;lB%iON4pP5!jgV z`yVPijR>=#ZlzZVHw!0-_&2TeJ|e#92Blvpd?gWm{YItlCSt6AROv4Zzc2iq@P05^ zS_E3~KqAKn5w!8qN_P^mhMc4HS|Zlg#|kgk^{a^BL2gp|#lqJM-%bS2_+h2LApEZI z7s3{7Joz3+3m+zI6PAQv`;tXZ0o^8|UNnh4zd*$MwGr{&7?SoqeMEfc`9!n}NQJf6 zFcCLzC8A9(BceaH6VYG0iRjmTM2v%Lh!{6F5;4ARCSn}kO2qiRorv*%2N4gyi->u2 zHxcvh9%5gTe2jP&_!Q#ViP?>kUVNKr(35+Kpg;E!L7#q2T#Ns-06`BS$}zfm3~?jA zp9s2LAdcbtiJS5L#I2A|5HG>^6R}QV%bqN{EJ##69?a;$D0|aX-GFcqP7{cs0JC_+)%P@mhQje(b+PgohLH zAFy49#}Lt<=rY3-i0D@g1H%Flg-#K+5z)`fghe85E(y`}*6(O?!}E!#6isc&CgwQ6 zl4Lkc#CSlH8lov}TwE%=jCfLFavS1yrZG--3U?DRUgm}Sh!{6l39lhy{9G@*k%)2h zOySK$jHg?Kw-WJDw+U}2VtlM2yET3cpH3V|`utZ6e0!_k{Nn*Cxr2h4&FLUVkC{HF15C{9c%F9ANxHglTv< z5#t!5NyB4^W9Wb32}F$RhYJhDt>}MY8xiAtnXpL2c!wy?u#b3IVs_ZX^O?r@hiJ=i zEwPIJ7Y-9KA0V1 zJxMU+jSinC#1Kpt-K2T+OzdBD9bKO+dKUO%;VcF@(SV$lH_&77beM@iMML}z9=zIg+(vcc*XsnXFhKJ z3h}li`4;h|N%BJ?@_#P;4e@1=Px1S49inQ(lZh|axVatsWu{+|B>l=?L40MBK(v`G zdKJD?*B>w3M#LnXCcY*~_7MM8{ruV_@$$Q8^ZFg?&(|ep@6Y#mEw8^`^zzOmc{kIz z{vqNUz*i{!W#St#|A=o&lJDyJ4~0J!{)&i318KE-?k{|x@OYu`XOJu_w^Vqh5TwMe zKSnqpTqE2d92H(H92ffj#}u)8Y#iXbFr+Pwp=$UPA+juuA!LZ5U})n4nXgb9O={QC z6ozjTzDxK4;YWm@6xujJJvL5&-_Z5%3V$g4sqmM=-w9jPzK02q5{Kry2yR^5yA%uA1r*B z@Fd}*h0BFq!hYd-!d1cxg%=682p=b`2&aTI!ac$(h1Uvi5I#%zJmHIkFBiT>c&G3! z!gmVaC;X7`e|)I;~%K>@xn(4PZll}dU<`f z(vJ}i2-gTV2uFn%3&(|CzQ051%Y}P|R|}sae7exf|DUh)ON6fwzE=1~;oF4o5`IAV z5#c9=pBH{b_zmHAg+CPjRQOBb?}ROfxb{3uc$Dx#!V`t`dm{ZlRd|N5L)a@kM>r^4 zCma%P5_u+EBzzk&xF4c{z2G^g^JHPLihmTU#dr0rFt$DUL@Qie4MZ%oD$9m_Xw{P zUMsvo_$=Y`gf9}lT=*K{ox-;W-zj{b@I%6n3qLFTlJK8}-x2;m_!HsJg})L0QF!S6 zT)W<1_(0+D!bb?{2gmkbDm+uzEqsh{K)6P@K{zVBSU4`M33muD7w#2aEqsdb>B8p- zpD%og@D;+>3g0MvoA6!24+uXZ{G{;n!mkLuKIywk|4{f-;V*^16Sf@Y+R5vi7!QZ- zM!!GeiNZ$-PZgda>=5<}y2<;(;U?i@g=OJ3;k3}}ul6fVKSRFHQ-wDP|3>&i zq1SJ{O6k`L-z>k&67Ju38i#c`!;!X3iPg?oip3!fr>x9F?EkfEkv0rM!ox(Yx$s>?|t z<-1D%oA77CUkm>zyr1@wem{Pk(q6s;(>8m*rNW}n@55mtXZfpyCjZ0pN0q)r==a|y z=R^LCt~cwazjXX~Ia{;(4|W{&sGZIct`uG<91;5G9I5n!gbx*-By1CUdf@N#bSF;x z`F*hO`=`pCnmzBoYo0WFzW?68);L(Dc3&^_a<@yAE(^B{XM|S>uNGb}yh#X=td0K{ z32zs^RtQm}<-c9{Ug3v?pAdTa+Ey=;dmQG>?uD9wR(n_(-9bryZ!h z4@6i0)baISCD(+g+S>J1!q*GmBD`DZ<(dDW^rwYi6#ldDUxYstn*IfJ>Q_qtr|?j< z=aE7$zkI0DCkfkxX9{7$Z13ykmMfJuxj3E!Q(w!!SZMkYT=()y#=GHqZ1QoS=|O-` z(e-Bty`0kY9ms#VuK%s@jY89FAm7U;Kd9>;7k*Co72!99UM~4#rGGB`t*}M%GjBiZ z<&h83^+yQ3J?$Avd%IdMhdf``*9g6x?IxwYy{(r&db``pmGA9upRBaE!}W4UZ;$&D z<$Jr_*D3AobG^LL+v$Ep`QBdl3rhc!(90R`Rr;sG{}BE`cu1@3PcL6QR_POk1>vKG z?LseCJX`5_KL5G&@<8{+&pFV#-vG(YpKfrwcG7a?YHu})%gx=ra5lWvT^m-}NcY==g>-zb^HNuTTuaCM^>5A|P!pnuG=SF>A59Rfr z&r-hWvyuN2rC%xZ`X|#{BmbSc{(j*{gr5?6z0*G_{g;lD|0(nQCF;*t2t6O>$Ishz z-S4M7fAA4q|D^Eq!k8cXf9>Sft+<{1eEWvl?YqJs3V$m6rO@-Qe%>9Xap?DSHe5{{;9lGxKqn^JykY4zIYd_wh_Ie9_m4_{O?aSo@%abZ=N@di zct8CA)*Cm!{2BfK!a?B$LT}Ho zRq1izq;Og|FZ6Z{*D3vU;myJq3STDl_6u)N`fb8@3;$mDF`>6x__EU95PnbiBjNuM zdV2)~bF_WoVZx(@4;DUL=10JmG4gw@(;Tn(<6|--K{VxLfG$5}u^= zQ-zFs%KM%te6i5mBiy0%n}zQXzEAjJp|?Z$N2R|e{I>81!haWf`-9&r-Fk?7kHx|V z3QrJvyMxn|UM?&NA0u2L^!5hBN^cQ9URV?E6nZ;@Cn|ld@J8Wtgf9?!`vUJzd8e+w zRroI9Jwk6+@EN7QB>cMYyTX4HdV7LjEB!~Ir`!Kk`<9JbXEq5h6;^~#5MD0aCw#K- zX~Jg-ZxMRF@0CiwPI#B_uk~GLtG+?u1;UGjTZQAoN#V3`UU;SOIw7Wr&6AsjFBHB^ z_!{9~>pLE!`UZq+gd2oo!p90Hgj2%Z!o9*L37;x_rtq)*zAIGkI^nQzi}3NnnsBFZ zPS{Lub)ffrr0zdexJ=k3JWJ@?bFI=t!p*|R39G^#!dc;dVKaG5v+EDjeM^K(g+*bn z@Lb_4;dt7I$PLc;420RAw zDu~A>$p+$au#+Y}BuPF%JRwQ`iTKbY`6UsJbPVdE-_DuDlageTcryG}h#2&Y4^01y z_YyI+tRLZ+I0EMEGY!4CcNE z05R#_NJOW7k_ckOA!sZ5DRdI2&|btH@IxR@!~UE&1OFT%7Nxt1ASUMbx(DC) zK%_wg*AOvzcMw6`pGv$M@^>N@uXhozm7l;}@H^u8K|k7hg7o=JqfL!2AibSww8b-t zNZ(AvH{GH18;Hlq{{;CTV;cSaZRLNDh<-Oc1@cWVg#I_Z1k%e|kdK#GPegi{i1Dyf z>D@$(i<^};xf8~R=?zfc{2@-lI8eUX)nmLQi(Gxiw`1J2DZPw{@iVOS7;!25qm;gi zcn174l)jzVj_*_2_~at|yOjPh5##L0Rv_Nz7$U}7QRxy9N}E%ak@-ti=VL;->38#5#x5B(pM2Nes5RW z__~ewKBX-_#zpY|QTje2#`SR+BYfToM2zn~rOzf}oL{Q+WkihkYm~Nl78v&yrvmrC zf!8ksy-@z=h!bc}rGHGU;=4#kQ2rPq=0#EI5)t!bz0$)(%oB@Cf$}?<#(cS1`L_@; zZ|+w5y~N8gK9&9+5%cJ9(jVM^BoXsznbH=20`qEE=`kYa*SymEh?r-$DSbN;^X>_8u287^NcGA-0uIHukD*p5G{1RoU~8O%_Z%;&^}$>foN{E z+DI7sH_OTg0Cv~&VSw9bYdhWbe1yXK>pm`FeGUSXSt!CVCl_h3J_Av(5LK}LdKN{{ zzm%)U#Sg46A4U?a&&5-G%)s2U5ZMc10n;Z0!2xsET!_Hv5&{M0t|&@a`0y-nVEt7K z2NqrqV~W*XZ(Q1k8mlYb=v{owJ%yhO@5#sGYnapMQR!_B9v4LG3+v-$7v(O#swjNE zNmOLfj;1|Ax8|FT4 zUww|E^3`Vq@%ZX9vrv4#fob{n3%0y;YN_I z%$9d;tAX~CXu3=FS1g2ZSY+qau9~kC)I4dg%uG)sQf*jfa<)8;LO6xJy*!WT&=Y&+ z`5cR7i*?~3e_R*A%B8;&{yGx>et>^(!9Oh9_Af4XKCb(6Z(X1qScJ6P+ZHH?r9UnA zcMFumlAe}(`vT>52j$+eK)I`ea_?NA+>JrGyB8>TOHl4z3zWM(DEICK%Do{d_nrmH z@tu5symx_e9}ddBZ-H{33(CEJfpT9D%6(vga`y)1?pdJRFM@J^zd*SJe7gVM4=zxS z`vqU_LkpBUAt=W-YBuhvFZcC*WPx(Upxi$!Q10xY+(#EEw>Bupy-~CG8w<*Pe1US8 z1?4`mKsoN8{P%uxfpXOI`*NRJpxpIAxlb=pj{7uU-)9ymcUw^IvkR2FBPhqQ-K_n% zAN0@t`~v0f3CjKB0_8pxl>5R0<+$(k&;8;8<-Qk``_cmC?hDF&IVeZD8nP0Qef#~M ziQtEAsQpgDf0>1CqW$7>{P`PC&!+XN#7LoQp|J*gW5SHUUoA>&kFE@@0 zVL9r(PVt3+z8tn(xpLf>L+p_Ld^v30k|Xf%eC2%mDi@2C>)>+y<9OkBJ_rB8=RN}! zoPcZo=j*!(7sC4P4eC1+dA`2a;qS0M+U*r^&HsFTufc_|zWY!gpUd~_z&~FfXvFEbBF8uTLk-mrZU4o8o)P7%$>T5%NY%kUaF-BS+>3dk; zcGTCX{q94#@coKGeZ4__r0-#U*Py;rknex|4*p2D!*Z`ixzk;i{nxik0foZn_Tjn5 zpaj1I;+FI~Rz&rE2KAk7HM#%z`shy(*0&b*wV?>>V|m}smqqnaug7x!=j*#Ps&9AD zE|i7)`evQy*G1(vqFkXtx#vgacA*?~2>$2mdu>$inN7-lAS(9; zl)J`P21L?+wC4@mZy&zbkNcG>$8q+hsJ>;8|1=u+pO5OhIq2WjL47}t>iaP2YecW8 z?+@Sa_MpDCL4A}TqG;M5zd(JrA?<(ud)YBzeRl=l3-MdpzYmS-qnv7|uT15bq@8kD z-^YUb)~g)buPdtW_o(kQR-hlU?RREW-?xMBh4?RhzYC-KmK^3}!Kx-5f3$}V-|xQQ z{f2}3wng>bi253}AMK~Z`VN0mHeN=8`mT-YI|Yrv>MI2GjRp15P9p5zn^9k* z_Iq(uUmxo8^abM3wEbvT5!Uw()W>~-{~_Cc?}+MKi~2ZDNnf_&AIBB@_w!MGJU{Tm zxbA?L&P96k>f4$ENlDAgZslxG_EbZdBi`!S`Mo)c4z{zQ?1!>yYn%$hO}D zKxe~tq27h##Q%Ib+M$Qz;Ev$AW zNA=x>`tD@~`tiB^ogLNpxuCuZ^8Nd5iR!!cNEb`aD#3sJ_cHEA_`Ua{zBc5u-)i{h z>)RF8xAv&U{q}^YzGGm(%kN`-+k*P8kLsI6eXEi0fByZrE{E@TLQvln3j6nCe2=g{ z?nZrA`N~v|$rncT6;Pk=j~yz<_oW?9SYHXuOQZg{GpesIsBb!`??X|24}U=8_G8?U z@Oy`Y@0|(i`)X9*YSi}-aZd{JSzWsh4)psfCW4rjDua9v}!uQ)A zydQaCUmxR|gzYzv`d0eNRF26bP%f-*chG)NgQWG*9x1HvZq(O^pJW{Ou)Z6E_aje_ zY#Wb*QGJX%+~|AHi|V^MsE;-ZzCOlR3E%IVP3j~66P9CK<3{~vQylX4fMT-Yw33)PTqtL!&S zB+_T@J<)774j7*%tnUNM;cJ1p?|(jz@oN0v%)6w+>B8f3&ySva9~?P8h8y|ZXXBrL zF7>lveVy1;vYh|w9ja`ZN)K-2>e=cnSZjt54-lz((jktVyiz7W}JwKb6}(kR(fdWx!_j9sa6p zo#uRRR^M|`ANh6vYgS(o^<9QSe7{@quUUQHM1A4@tyz6HqrQUbd+`GG{T}tPJ^Zg( zeRrY0J5Y%4NB+Ip``x@Ezn^Ya-_}>RBpG?x1)5k_e%y{ zEKgryv--Y@`Y3zk_r7w0`sP>W=~c7(u7Tq#=@9FC^#b)h1NGq*(_gdtZbf}-QHu5b zE&et8-cO^xEop7d$Md&Q-*(l3Ldf!_wyhvTTypZ_zZrz&?l>KjHT-|zo6cK)tW1W_EH z1p`;4I6)y6fmCu>-G5;)m>3I**jU(TlXSK=HiAXEw5fy?$>ERVz!=Y8mtZ8EAQB`b z0Y%a!q)HR?^PRhwJ(j#-AH17k-`mf=-I?8)oxPoXje7AtzD~Qvb=<_`9r2=H7eDcu zsK;yFC|AC1UI@4HZ6$ac@H8%I;>Fj6XZ26_-(GyD@Wu>A>hUVed3mfRc%u`HsT(B0 ztHG<|r{lMl;EmCEJi=~b=wkWKtYmRcbMe}!x4+Ne?HL3=%NBY2@bsTK@jfPa4<~zb zN8=L3<5gb5!zkWo)Qj)t6nz+j;Ah!leDzm(|D}`Qy|@*^E_M@-cftcCJxf%48>koG z)9G^OZ?&1%m#+!lBD|{>9H|#y9bOH);`@er@vXzVFoZ*2Jl+hv7JlMwp&oDZP6%%d zM(XjZt67`_U%YOD_k_l1sRZu;p2|Tydro)W_3s)N`}q>Q#=9(Dm&N;mdi(np-t!W? z`)hfB=x2gAemBH#`x(+ZewFuG>^CdE?F6p_?~1`lJ>CMm5$xjqLcRUngLjPG#N##K zRWXXUgL=I03^uMCjMU?`+w{k=i>LF`c$zoU)?sm2xJP}zs9aCXwu#^1{YT?N7Qam( z-acwP&AX{}>Zs%agF?4|_wxFcP5QUs*QBxJR5}y$(>$HZn^dN=FszE%7j0K^Scq@# zQ+|K+2fM|m2MaW#b8#hpE-~@SdHr2&v)`0Q*Kz#1mwRJk|5zek71c2rXuiY9Y!<$7 V-(zC2>yQrm9d)vxIYmv(?>}hA4jljh literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su new file mode 100644 index 0000000..ab773ef --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su @@ -0,0 +1,56 @@ +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:103:31:makeFreeRtosPriority 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:116:19:makeCmsisPriority 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:130:12:inHandlerMode 16 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:150:10:osKernelStart 8 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:165:9:osKernelRunning 8 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:184:10:osKernelSysTick 8 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:202:12:osThreadCreate 56 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:240:12:osThreadGetId 8 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:255:10:osThreadTerminate 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:270:10:osThreadYield 4 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:284:10:osThreadSetPriority 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:300:12:osThreadGetPriority 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:322:10:osDelay 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:357:11:osTimerCreate 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:404:10:osTimerStart 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:443:10:osTimerStop 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:472:10:osTimerDelete 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:502:9:osSignalSet 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:543:9:osSignalWait 48 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:597:11:osMutexCreate 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:626:10:osMutexWait 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:666:10:osMutexRelease 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:690:10:osMutexDelete 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:712:15:osSemaphoreCreate 32 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:779:9:osSemaphoreWait 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:819:10:osSemaphoreRelease 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:846:10:osSemaphoreDelete 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:883:10:osPoolCreate 32 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:936:7:osPoolAlloc 48 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:977:7:osPoolCAlloc 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:996:10:osPoolFree 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1040:14:osMessageCreate 32 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1067:10:osMessagePut 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1099:9:osMessageGet 56 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1168:11:osMailCreate 40 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1214:7:osMailAlloc 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1236:7:osMailCAlloc 24 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1257:10:osMailPut 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1290:9:osMailGet 56 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1346:10:osMailFree 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1362:6:osSystickHandler 8 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1432:10:osThreadSuspend 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1448:10:osThreadResume 16 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1472:10:osThreadSuspendAll 8 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1483:10:osThreadResumeAll 8 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1500:10:osDelayUntil 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1520:10:osAbortDelay 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1541:10:osThreadList 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1555:9:osMessagePeek 48 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1596:10:osMessageWaiting 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1612:10:osMessageAvailableSpace 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1622:10:osMessageDelete 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1638:11:osRecursiveMutexCreate 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1664:10:osRecursiveMutexRelease 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1685:10:osRecursiveMutexWait 16 static +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c:1724:10:osSemaphoreGetCount 16 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk new file mode 100644 index 0000000..5f19967 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk @@ -0,0 +1,27 @@ +################################################################################ +# Automatically-generated file. Do not edit! +# Toolchain: GNU Tools for STM32 (10.3-2021.10) +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c + +OBJS += \ +./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + +C_DEPS += \ +./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d + + +# Each subdirectory must supply rules for building sources it contributes +Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/%.o Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/%.su: ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/%.c Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk + arm-none-eabi-gcc "$<" -mcpu=cortex-m4 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F446xx -c -I../Core/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I../Drivers/CMSIS/Include -I../Middlewares/Third_Party/FreeRTOS/Source/include -I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "$@" + +clean: clean-Middlewares-2f-Third_Party-2f-FreeRTOS-2f-Source-2f-CMSIS_RTOS + +clean-Middlewares-2f-Third_Party-2f-FreeRTOS-2f-Source-2f-CMSIS_RTOS: + -$(RM) ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su + +.PHONY: clean-Middlewares-2f-Third_Party-2f-FreeRTOS-2f-Source-2f-CMSIS_RTOS + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d new file mode 100644 index 0000000..917ef11 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d @@ -0,0 +1,22 @@ +Middlewares/Third_Party/FreeRTOS/Source/croutine.o: \ + ../Middlewares/Third_Party/FreeRTOS/Source/croutine.c \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h \ + ../Core/Inc/FreeRTOSConfig.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/list.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h +../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h: +../Core/Inc/FreeRTOSConfig.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h: +../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/list.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o new file mode 100644 index 0000000000000000000000000000000000000000..b386ce7396d7462256efad10aaa60e426a43e049 GIT binary patch literal 55704 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 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su new file mode 100644 index 0000000..85c9323 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su @@ -0,0 +1,5 @@ +../Middlewares/Third_Party/FreeRTOS/Source/list.c:37:6:vListInitialise 16 static +../Middlewares/Third_Party/FreeRTOS/Source/list.c:62:6:vListInitialiseItem 16 static +../Middlewares/Third_Party/FreeRTOS/Source/list.c:74:6:vListInsertEnd 24 static +../Middlewares/Third_Party/FreeRTOS/Source/list.c:103:6:vListInsert 24 static +../Middlewares/Third_Party/FreeRTOS/Source/list.c:170:13:uxListRemove 24 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d new file mode 100644 index 0000000..24dc560 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d @@ -0,0 +1,20 @@ +Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o: \ + ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h \ + ../Core/Inc/FreeRTOSConfig.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/list.h +../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h: +../Core/Inc/FreeRTOSConfig.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h: +../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/list.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o new file mode 100644 index 0000000000000000000000000000000000000000..f8bd8312c66d5c5d26e502029fe84bbd104b19b6 GIT binary patch literal 65768 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 Vl85nXFUVfKSK+@iJU1|U{|DVLA_M>c literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su new file mode 100644 index 0000000..03dea47 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su @@ -0,0 +1,8 @@ +../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c:115:7:pvPortMalloc 48 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c:266:6:vPortFree 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c:315:8:xPortGetFreeHeapSize 4 static +../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c:321:8:xPortGetMinimumEverFreeHeapSize 4 static +../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c:327:6:vPortInitialiseBlocks 4 static +../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c:333:13:prvHeapInit 24 static +../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c:381:13:prvInsertBlockIntoFreeList 24 static +../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c:442:6:vPortGetHeapStats 32 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk new file mode 100644 index 0000000..2afaa9b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk @@ -0,0 +1,27 @@ +################################################################################ +# Automatically-generated file. Do not edit! +# Toolchain: GNU Tools for STM32 (10.3-2021.10) +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c + +OBJS += \ +./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + +C_DEPS += \ +./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d + + +# Each subdirectory must supply rules for building sources it contributes +Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/%.o Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/%.su: ../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/%.c Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk + arm-none-eabi-gcc "$<" -mcpu=cortex-m4 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F446xx -c -I../Core/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I../Drivers/CMSIS/Include -I../Middlewares/Third_Party/FreeRTOS/Source/include -I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "$@" + +clean: clean-Middlewares-2f-Third_Party-2f-FreeRTOS-2f-Source-2f-portable-2f-MemMang + +clean-Middlewares-2f-Third_Party-2f-FreeRTOS-2f-Source-2f-portable-2f-MemMang: + -$(RM) ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su + +.PHONY: clean-Middlewares-2f-Third_Party-2f-FreeRTOS-2f-Source-2f-portable-2f-MemMang + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d new file mode 100644 index 0000000..23ff8db --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d @@ -0,0 +1,24 @@ +Middlewares/Third_Party/FreeRTOS/Source/queue.o: \ + ../Middlewares/Third_Party/FreeRTOS/Source/queue.c \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h \ + ../Core/Inc/FreeRTOSConfig.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/list.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h +../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h: +../Core/Inc/FreeRTOSConfig.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h: +../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/list.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o new file mode 100644 index 0000000000000000000000000000000000000000..6b8e381fb15e3770cc0a1306811f16cde4e8ad38 GIT binary patch literal 110612 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�~n# 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 Bq@Dl( literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su new file mode 100644 index 0000000..d1bc387 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su @@ -0,0 +1,52 @@ +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:581:15:xTaskCreateStatic 64 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:733:13:xTaskCreate 56 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:824:13:prvInitialiseNewTask 40 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1077:13:prvAddNewTaskToReadyList 16 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1162:7:vTaskDelete 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1341:7:vTaskDelay 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1478:14:uxTaskPriorityGet 24 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1500:14:uxTaskPriorityGetFromISR 40 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1540:7:vTaskPrioritySet 40 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1704:7:vTaskSuspend 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1805:20:prvTaskIsTaskSuspended 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1851:7:vTaskResume 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1905:13:xTaskResumeFromISR 48 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:1975:6:vTaskStartScheduler 48 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2099:6:vTaskEndScheduler 16 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2110:6:vTaskSuspendAll 4 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2194:12:xTaskResumeAll 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2304:12:xTaskGetTickCount 16 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2319:12:xTaskGetTickCountFromISR 16 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2350:13:uxTaskGetNumberOfTasks 4 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2358:7:pcTaskGetName 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2609:12:xTaskCatchUpTicks 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2707:12:xTaskIncrementTick 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:2989:6:vTaskSwitchContext 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3064:6:vTaskPlaceOnEventList 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3081:6:vTaskPlaceOnUnorderedEventList 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3138:12:xTaskRemoveFromEventList 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3206:6:vTaskRemoveFromUnorderedEventList 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3254:6:vTaskSetTimeOutState 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3266:6:vTaskInternalSetTimeOutState 16 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3274:12:xTaskCheckForTimeOut 40 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3337:6:vTaskMissedYield 4 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3392:8:prvIdleTask 16 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3607:13:prvInitialiseTaskLists 16 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3639:13:prvCheckTasksWaitingTermination 16 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3887:14:prvDeleteTCB 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3943:13:prvResetNextTaskUnblockTime 16 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3969:15:xTaskGetCurrentTaskHandle 16 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:3986:13:xTaskGetSchedulerState 16 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:4014:13:xTaskPriorityInherit 24 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:4104:13:xTaskPriorityDisinherit 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:4184:7:vTaskPriorityDisinheritAfterTimeout 40 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:4602:12:uxTaskResetEventItemValue 16 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:4618:15:pvTaskIncrementMutexHeldCount 4 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:4635:11:ulTaskNotifyTake 24 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:4703:13:xTaskNotifyWait 32 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:4783:13:xTaskGenericNotify 48 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:4897:13:xTaskGenericNotifyFromISR 64 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:5026:7:vTaskNotifyGiveFromISR 48 static,ignoring_inline_asm +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:5112:13:xTaskNotifyStateClear 24 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:5143:11:ulTaskNotifyValueClear 24 static +../Middlewares/Third_Party/FreeRTOS/Source/tasks.c:5177:13:prvAddCurrentTaskToDelayedList 24 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d new file mode 100644 index 0000000..221036f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d @@ -0,0 +1,26 @@ +Middlewares/Third_Party/FreeRTOS/Source/timers.o: \ + ../Middlewares/Third_Party/FreeRTOS/Source/timers.c \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h \ + ../Core/Inc/FreeRTOSConfig.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/list.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h +../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h: +../Core/Inc/FreeRTOSConfig.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h: +../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/list.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o new file mode 100644 index 0000000000000000000000000000000000000000..72635fce73b34ca69a919afee5a7105d65c32d8d GIT binary patch literal 79620 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%0AMyff)&aZwFHXmcE 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 R8#J(!b*+46Ivt;Oe*{@YBya!# literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su new file mode 100644 index 0000000..e69de29 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/makefile b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/makefile new file mode 100644 index 0000000..02a2f2b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/makefile @@ -0,0 +1,98 @@ +################################################################################ +# Automatically-generated file. Do not edit! +# Toolchain: GNU Tools for STM32 (10.3-2021.10) +################################################################################ + +-include ../makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk +-include Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk +-include Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk +-include Middlewares/Third_Party/FreeRTOS/Source/subdir.mk +-include Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk +-include Core/Startup/subdir.mk +-include Core/Src/subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(S_DEPS)),) +-include $(S_DEPS) +endif +ifneq ($(strip $(S_UPPER_DEPS)),) +-include $(S_UPPER_DEPS) +endif +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +endif + +-include ../makefile.defs + +OPTIONAL_TOOL_DEPS := \ +$(wildcard ../makefile.defs) \ +$(wildcard ../makefile.init) \ +$(wildcard ../makefile.targets) \ + + +BUILD_ARTIFACT_NAME := FreeRTOS_LED +BUILD_ARTIFACT_EXTENSION := elf +BUILD_ARTIFACT_PREFIX := +BUILD_ARTIFACT := $(BUILD_ARTIFACT_PREFIX)$(BUILD_ARTIFACT_NAME)$(if $(BUILD_ARTIFACT_EXTENSION),.$(BUILD_ARTIFACT_EXTENSION),) + +# Add inputs and outputs from these tool invocations to the build variables +EXECUTABLES += \ +FreeRTOS_LED.elf \ + +MAP_FILES += \ +FreeRTOS_LED.map \ + +SIZE_OUTPUT += \ +default.size.stdout \ + +OBJDUMP_LIST += \ +FreeRTOS_LED.list \ + + +# All Target +all: main-build + +# Main-build Target +main-build: FreeRTOS_LED.elf secondary-outputs + +# Tool invocations +FreeRTOS_LED.elf FreeRTOS_LED.map: $(OBJS) $(USER_OBJS) C:\Users\chen_\Desktop\FreeRTOS\FreeRTOS_LED\STM32F446RETX_FLASH.ld makefile objects.list $(OPTIONAL_TOOL_DEPS) + arm-none-eabi-gcc -o "FreeRTOS_LED.elf" @"objects.list" $(USER_OBJS) $(LIBS) -mcpu=cortex-m4 -T"C:\Users\chen_\Desktop\FreeRTOS\FreeRTOS_LED\STM32F446RETX_FLASH.ld" --specs=nosys.specs -Wl,-Map="FreeRTOS_LED.map" -Wl,--gc-sections -static --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -Wl,--start-group -lc -lm -Wl,--end-group + @echo 'Finished building target: $@' + @echo ' ' + +default.size.stdout: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS) + arm-none-eabi-size $(EXECUTABLES) + @echo 'Finished building: $@' + @echo ' ' + +FreeRTOS_LED.list: $(EXECUTABLES) makefile objects.list $(OPTIONAL_TOOL_DEPS) + arm-none-eabi-objdump -h -S $(EXECUTABLES) > "FreeRTOS_LED.list" + @echo 'Finished building: $@' + @echo ' ' + +# Other Targets +clean: + -$(RM) FreeRTOS_LED.elf FreeRTOS_LED.list FreeRTOS_LED.map default.size.stdout + -@echo ' ' + +secondary-outputs: $(SIZE_OUTPUT) $(OBJDUMP_LIST) + +fail-specified-linker-script-missing: + @echo 'Error: Cannot find the specified linker script. Check the linker settings in the build configuration.' + @exit 2 + +warn-no-linker-script-specified: + @echo 'Warning: No linker script specified. Check the linker settings in the build configuration.' + +.PHONY: all clean dependents main-build fail-specified-linker-script-missing warn-no-linker-script-specified + +-include ../makefile.targets diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list new file mode 100644 index 0000000..46ec73f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list @@ -0,0 +1,34 @@ +"./Core/Src/freertos.o" +"./Core/Src/main.o" +"./Core/Src/stm32f4xx_hal_msp.o" +"./Core/Src/stm32f4xx_it.o" +"./Core/Src/syscalls.o" +"./Core/Src/sysmem.o" +"./Core/Src/system_stm32f4xx.o" +"./Core/Startup/startup_stm32f446retx.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o" +"./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o" +"./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o" +"./Middlewares/Third_Party/FreeRTOS/Source/croutine.o" +"./Middlewares/Third_Party/FreeRTOS/Source/event_groups.o" +"./Middlewares/Third_Party/FreeRTOS/Source/list.o" +"./Middlewares/Third_Party/FreeRTOS/Source/queue.o" +"./Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o" +"./Middlewares/Third_Party/FreeRTOS/Source/tasks.o" +"./Middlewares/Third_Party/FreeRTOS/Source/timers.o" +"./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o" +"./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o" diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.mk b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.mk new file mode 100644 index 0000000..e423e31 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.mk @@ -0,0 +1,9 @@ +################################################################################ +# Automatically-generated file. Do not edit! +# Toolchain: GNU Tools for STM32 (10.3-2021.10) +################################################################################ + +USER_OBJS := + +LIBS := + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/sources.mk b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/sources.mk new file mode 100644 index 0000000..d93d49f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/sources.mk @@ -0,0 +1,31 @@ +################################################################################ +# Automatically-generated file. Do not edit! +# Toolchain: GNU Tools for STM32 (10.3-2021.10) +################################################################################ + +ELF_SRCS := +OBJ_SRCS := +S_SRCS := +C_SRCS := +S_UPPER_SRCS := +O_SRCS := +SIZE_OUTPUT := +OBJDUMP_LIST := +SU_FILES := +EXECUTABLES := +OBJS := +MAP_FILES := +S_DEPS := +S_UPPER_DEPS := +C_DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +Core/Src \ +Core/Startup \ +Drivers/STM32F4xx_HAL_Driver/Src \ +Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS \ +Middlewares/Third_Party/FreeRTOS/Source \ +Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F \ +Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang \ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h new file mode 100644 index 0000000..6b064e8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h @@ -0,0 +1,15981 @@ +/** + ****************************************************************************** + * @file stm32f446xx.h + * @author MCD Application Team + * @brief CMSIS STM32F446xx Device Peripheral Access Layer Header File. + * + * This file contains: + * - Data structures and the address mapping for all peripherals + * - peripherals registers declarations and bits definition + * - Macros to access peripheral’s registers hardware + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS_Device + * @{ + */ + +/** @addtogroup stm32f446xx + * @{ + */ + +#ifndef __STM32F446xx_H +#define __STM32F446xx_H + +#ifdef __cplusplus + extern "C" { +#endif /* __cplusplus */ + +/** @addtogroup Configuration_section_for_CMSIS + * @{ + */ + +/** + * @brief Configuration of the Cortex-M4 Processor and Core Peripherals + */ +#define __CM4_REV 0x0001U /*!< Core revision r0p1 */ +#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */ +#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */ +#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */ +#define __FPU_PRESENT 1U /*!< FPU present */ + +/** + * @} + */ + +/** @addtogroup Peripheral_interrupt_number_definition + * @{ + */ + +/** + * @brief STM32F4XX Interrupt Number Definition, according to the selected device + * in @ref Library_configuration_section + */ +typedef enum +{ +/****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */ +/****** STM32 specific Interrupt Numbers **********************************************************************/ + WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */ + TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */ + RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCC_IRQn = 5, /*!< RCC global Interrupt */ + EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */ + EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */ + EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */ + EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */ + EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */ + DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */ + DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */ + DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */ + DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */ + DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */ + DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */ + DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */ + ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */ + CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */ + CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */ + TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */ + TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */ + TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */ + TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ + TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ + TIM4_IRQn = 30, /*!< TIM4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */ + OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */ + TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */ + TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */ + TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */ + TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare global interrupt */ + DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */ + FMC_IRQn = 48, /*!< FMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TIM5_IRQn = 50, /*!< TIM5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */ + TIM7_IRQn = 55, /*!< TIM7 global interrupt */ + DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */ + DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */ + DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */ + DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */ + DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */ + 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 */ + FPU_IRQn = 81, /*!< FPU global interrupt */ + SPI4_IRQn = 84, /*!< SPI4 global Interrupt */ + SAI1_IRQn = 87, /*!< SAI1 global Interrupt */ + SAI2_IRQn = 91, /*!< SAI2 global Interrupt */ + QUADSPI_IRQn = 92, /*!< QuadSPI global Interrupt */ + CEC_IRQn = 93, /*!< CEC global Interrupt */ + SPDIF_RX_IRQn = 94, /*!< SPDIF-RX global Interrupt */ + FMPI2C1_EV_IRQn = 95, /*!< FMPI2C1 Event Interrupt */ + FMPI2C1_ER_IRQn = 96 /*!< FMPI2C1 Error Interrupt */ +} IRQn_Type; + +/** + * @} + */ + +#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ +#include "system_stm32f4xx.h" +#include + +/** @addtogroup Peripheral_registers_structures + * @{ + */ + +/** + * @brief Analog to Digital Converter + */ + +typedef struct +{ + __IO uint32_t SR; /*!< ADC status register, Address offset: 0x00 */ + __IO uint32_t CR1; /*!< ADC control register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< ADC control register 2, Address offset: 0x08 */ + __IO uint32_t SMPR1; /*!< ADC sample time register 1, Address offset: 0x0C */ + __IO uint32_t SMPR2; /*!< ADC sample time register 2, Address offset: 0x10 */ + __IO uint32_t JOFR1; /*!< ADC injected channel data offset register 1, Address offset: 0x14 */ + __IO uint32_t JOFR2; /*!< ADC injected channel data offset register 2, Address offset: 0x18 */ + __IO uint32_t JOFR3; /*!< ADC injected channel data offset register 3, Address offset: 0x1C */ + __IO uint32_t JOFR4; /*!< ADC injected channel data offset register 4, Address offset: 0x20 */ + __IO uint32_t HTR; /*!< ADC watchdog higher threshold register, Address offset: 0x24 */ + __IO uint32_t LTR; /*!< ADC watchdog lower threshold register, Address offset: 0x28 */ + __IO uint32_t SQR1; /*!< ADC regular sequence register 1, Address offset: 0x2C */ + __IO uint32_t SQR2; /*!< ADC regular sequence register 2, Address offset: 0x30 */ + __IO uint32_t SQR3; /*!< ADC regular sequence register 3, Address offset: 0x34 */ + __IO uint32_t JSQR; /*!< ADC injected sequence register, Address offset: 0x38*/ + __IO uint32_t JDR1; /*!< ADC injected data register 1, Address offset: 0x3C */ + __IO uint32_t JDR2; /*!< ADC injected data register 2, Address offset: 0x40 */ + __IO uint32_t JDR3; /*!< ADC injected data register 3, Address offset: 0x44 */ + __IO uint32_t JDR4; /*!< ADC injected data register 4, Address offset: 0x48 */ + __IO uint32_t DR; /*!< ADC regular data register, Address offset: 0x4C */ +} ADC_TypeDef; + +typedef struct +{ + __IO uint32_t CSR; /*!< ADC Common status register, Address offset: ADC1 base address + 0x300 */ + __IO uint32_t CCR; /*!< ADC common control register, Address offset: ADC1 base address + 0x304 */ + __IO uint32_t CDR; /*!< ADC common regular data register for dual + AND triple modes, Address offset: ADC1 base address + 0x308 */ +} ADC_Common_TypeDef; + + +/** + * @brief Controller Area Network TxMailBox + */ + +typedef struct +{ + __IO uint32_t TIR; /*!< CAN TX mailbox identifier register */ + __IO uint32_t TDTR; /*!< CAN mailbox data length control and time stamp register */ + __IO uint32_t TDLR; /*!< CAN mailbox data low register */ + __IO uint32_t TDHR; /*!< CAN mailbox data high register */ +} CAN_TxMailBox_TypeDef; + +/** + * @brief Controller Area Network FIFOMailBox + */ + +typedef struct +{ + __IO uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */ + __IO uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */ + __IO uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */ + __IO uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */ +} CAN_FIFOMailBox_TypeDef; + +/** + * @brief Controller Area Network FilterRegister + */ + +typedef struct +{ + __IO uint32_t FR1; /*!< CAN Filter bank register 1 */ + __IO uint32_t FR2; /*!< CAN Filter bank register 1 */ +} CAN_FilterRegister_TypeDef; + +/** + * @brief Controller Area Network + */ + +typedef struct +{ + __IO uint32_t MCR; /*!< CAN master control register, Address offset: 0x00 */ + __IO uint32_t MSR; /*!< CAN master status register, Address offset: 0x04 */ + __IO uint32_t TSR; /*!< CAN transmit status register, Address offset: 0x08 */ + __IO uint32_t RF0R; /*!< CAN receive FIFO 0 register, Address offset: 0x0C */ + __IO uint32_t RF1R; /*!< CAN receive FIFO 1 register, Address offset: 0x10 */ + __IO uint32_t IER; /*!< CAN interrupt enable register, Address offset: 0x14 */ + __IO uint32_t ESR; /*!< CAN error status register, Address offset: 0x18 */ + __IO uint32_t BTR; /*!< CAN bit timing register, Address offset: 0x1C */ + uint32_t RESERVED0[88]; /*!< Reserved, 0x020 - 0x17F */ + CAN_TxMailBox_TypeDef sTxMailBox[3]; /*!< CAN Tx MailBox, Address offset: 0x180 - 0x1AC */ + CAN_FIFOMailBox_TypeDef sFIFOMailBox[2]; /*!< CAN FIFO MailBox, Address offset: 0x1B0 - 0x1CC */ + uint32_t RESERVED1[12]; /*!< Reserved, 0x1D0 - 0x1FF */ + __IO uint32_t FMR; /*!< CAN filter master register, Address offset: 0x200 */ + __IO uint32_t FM1R; /*!< CAN filter mode register, Address offset: 0x204 */ + uint32_t RESERVED2; /*!< Reserved, 0x208 */ + __IO uint32_t FS1R; /*!< CAN filter scale register, Address offset: 0x20C */ + uint32_t RESERVED3; /*!< Reserved, 0x210 */ + __IO uint32_t FFA1R; /*!< CAN filter FIFO assignment register, Address offset: 0x214 */ + uint32_t RESERVED4; /*!< Reserved, 0x218 */ + __IO uint32_t FA1R; /*!< CAN filter activation register, Address offset: 0x21C */ + uint32_t RESERVED5[8]; /*!< Reserved, 0x220-0x23F */ + CAN_FilterRegister_TypeDef sFilterRegister[28]; /*!< CAN Filter Register, Address offset: 0x240-0x31C */ +} CAN_TypeDef; + + +/** + * @brief Consumer Electronics Control + */ + +typedef struct +{ + __IO uint32_t CR; /*!< CEC control register, Address offset:0x00 */ + __IO uint32_t CFGR; /*!< CEC configuration register, Address offset:0x04 */ + __IO uint32_t TXDR; /*!< CEC Tx data register , Address offset:0x08 */ + __IO uint32_t RXDR; /*!< CEC Rx Data Register, Address offset:0x0C */ + __IO uint32_t ISR; /*!< CEC Interrupt and Status Register, Address offset:0x10 */ + __IO uint32_t IER; /*!< CEC interrupt enable register, Address offset:0x14 */ +}CEC_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 External Interrupt/Event Controller + */ + +typedef struct +{ + __IO uint32_t IMR; /*!< EXTI Interrupt mask register, Address offset: 0x00 */ + __IO uint32_t EMR; /*!< EXTI Event mask register, Address offset: 0x04 */ + __IO uint32_t RTSR; /*!< EXTI Rising trigger selection register, Address offset: 0x08 */ + __IO uint32_t FTSR; /*!< EXTI Falling trigger selection register, Address offset: 0x0C */ + __IO uint32_t SWIER; /*!< EXTI Software interrupt event register, Address offset: 0x10 */ + __IO uint32_t PR; /*!< EXTI Pending register, Address offset: 0x14 */ +} EXTI_TypeDef; + +/** + * @brief FLASH Registers + */ + +typedef struct +{ + __IO uint32_t ACR; /*!< FLASH access control register, Address offset: 0x00 */ + __IO uint32_t KEYR; /*!< FLASH key register, Address offset: 0x04 */ + __IO uint32_t OPTKEYR; /*!< FLASH option key register, Address offset: 0x08 */ + __IO uint32_t SR; /*!< FLASH status register, Address offset: 0x0C */ + __IO uint32_t CR; /*!< FLASH control register, Address offset: 0x10 */ + __IO uint32_t OPTCR; /*!< FLASH option control register , Address offset: 0x14 */ + __IO uint32_t OPTCR1; /*!< FLASH option control register 1, Address offset: 0x18 */ +} FLASH_TypeDef; + +/** + * @brief Flexible Memory Controller + */ + +typedef struct +{ + __IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */ +} FMC_Bank1_TypeDef; + +/** + * @brief Flexible Memory Controller Bank1E + */ + +typedef struct +{ + __IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */ +} FMC_Bank1E_TypeDef; + +/** + * @brief Flexible Memory Controller Bank3 + */ + +typedef struct +{ + __IO uint32_t PCR; /*!< NAND Flash control register, Address offset: 0x80 */ + __IO uint32_t SR; /*!< NAND Flash FIFO status and interrupt register, Address offset: 0x84 */ + __IO uint32_t PMEM; /*!< NAND Flash Common memory space timing register, Address offset: 0x88 */ + __IO uint32_t PATT; /*!< NAND Flash Attribute memory space timing register, Address offset: 0x8C */ + uint32_t RESERVED; /*!< Reserved, 0x90 */ + __IO uint32_t ECCR; /*!< NAND Flash ECC result registers, Address offset: 0x94 */ +} FMC_Bank3_TypeDef; + +/** + * @brief Flexible Memory Controller Bank5_6 + */ + +typedef struct +{ + __IO uint32_t SDCR[2]; /*!< SDRAM Control registers , Address offset: 0x140-0x144 */ + __IO uint32_t SDTR[2]; /*!< SDRAM Timing registers , Address offset: 0x148-0x14C */ + __IO uint32_t SDCMR; /*!< SDRAM Command Mode register, Address offset: 0x150 */ + __IO uint32_t SDRTR; /*!< SDRAM Refresh Timer register, Address offset: 0x154 */ + __IO uint32_t SDSR; /*!< SDRAM Status register, Address offset: 0x158 */ +} FMC_Bank5_6_TypeDef; + +/** + * @brief General Purpose I/O + */ + +typedef struct +{ + __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ + __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ + __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ + __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ + __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ + __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ + __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ + __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ + __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ +} GPIO_TypeDef; + +/** + * @brief System configuration controller + */ + +typedef struct +{ + __IO uint32_t MEMRMP; /*!< SYSCFG memory remap register, Address offset: 0x00 */ + __IO uint32_t PMC; /*!< SYSCFG peripheral mode configuration register, Address offset: 0x04 */ + __IO uint32_t EXTICR[4]; /*!< SYSCFG external interrupt configuration registers, Address offset: 0x08-0x14 */ + uint32_t RESERVED[2]; /*!< Reserved, 0x18-0x1C */ + __IO uint32_t CMPCR; /*!< SYSCFG Compensation cell control register, Address offset: 0x20 */ + uint32_t RESERVED1[2]; /*!< Reserved, 0x24-0x28 */ + __IO uint32_t CFGR; /*!< SYSCFG Configuration register, Address offset: 0x2C */ +} SYSCFG_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< I2C Control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< I2C Control register 2, Address offset: 0x04 */ + __IO uint32_t OAR1; /*!< I2C Own address register 1, Address offset: 0x08 */ + __IO uint32_t OAR2; /*!< I2C Own address register 2, Address offset: 0x0C */ + __IO uint32_t DR; /*!< I2C Data register, Address offset: 0x10 */ + __IO uint32_t SR1; /*!< I2C Status register 1, Address offset: 0x14 */ + __IO uint32_t SR2; /*!< I2C Status register 2, Address offset: 0x18 */ + __IO uint32_t CCR; /*!< I2C Clock control register, Address offset: 0x1C */ + __IO uint32_t TRISE; /*!< I2C TRISE register, Address offset: 0x20 */ + __IO uint32_t FLTR; /*!< I2C FLTR register, Address offset: 0x24 */ +} I2C_TypeDef; + +/** + * @brief Inter-integrated Circuit Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< FMPI2C Control register 1, Address offset: 0x00 */ + __IO uint32_t CR2; /*!< FMPI2C Control register 2, Address offset: 0x04 */ + __IO uint32_t OAR1; /*!< FMPI2C Own address 1 register, Address offset: 0x08 */ + __IO uint32_t OAR2; /*!< FMPI2C Own address 2 register, Address offset: 0x0C */ + __IO uint32_t TIMINGR; /*!< FMPI2C Timing register, Address offset: 0x10 */ + __IO uint32_t TIMEOUTR; /*!< FMPI2C Timeout register, Address offset: 0x14 */ + __IO uint32_t ISR; /*!< FMPI2C Interrupt and status register, Address offset: 0x18 */ + __IO uint32_t ICR; /*!< FMPI2C Interrupt clear register, Address offset: 0x1C */ + __IO uint32_t PECR; /*!< FMPI2C PEC register, Address offset: 0x20 */ + __IO uint32_t RXDR; /*!< FMPI2C Receive data register, Address offset: 0x24 */ + __IO uint32_t TXDR; /*!< FMPI2C Transmit data register, Address offset: 0x28 */ +} FMPI2C_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 */ + __IO uint32_t PLLSAICFGR; /*!< RCC PLLSAI configuration register, Address offset: 0x88 */ + __IO uint32_t DCKCFGR; /*!< RCC Dedicated Clocks configuration register, Address offset: 0x8C */ + __IO uint32_t CKGATENR; /*!< RCC Clocks Gated ENable Register, Address offset: 0x90 */ + __IO uint32_t DCKCFGR2; /*!< RCC Dedicated Clocks configuration register 2, Address offset: 0x94 */ +} RCC_TypeDef; + +/** + * @brief Real-Time Clock + */ + +typedef struct +{ + __IO uint32_t TR; /*!< RTC time register, Address offset: 0x00 */ + __IO uint32_t DR; /*!< RTC date register, Address offset: 0x04 */ + __IO uint32_t CR; /*!< RTC control register, Address offset: 0x08 */ + __IO uint32_t ISR; /*!< RTC initialization and status register, Address offset: 0x0C */ + __IO uint32_t PRER; /*!< RTC prescaler register, Address offset: 0x10 */ + __IO uint32_t WUTR; /*!< RTC wakeup timer register, Address offset: 0x14 */ + __IO uint32_t CALIBR; /*!< RTC calibration register, Address offset: 0x18 */ + __IO uint32_t ALRMAR; /*!< RTC alarm A register, Address offset: 0x1C */ + __IO uint32_t ALRMBR; /*!< RTC alarm B register, Address offset: 0x20 */ + __IO uint32_t WPR; /*!< RTC write protection register, Address offset: 0x24 */ + __IO uint32_t SSR; /*!< RTC sub second register, Address offset: 0x28 */ + __IO uint32_t SHIFTR; /*!< RTC shift control register, Address offset: 0x2C */ + __IO uint32_t TSTR; /*!< RTC time stamp time register, Address offset: 0x30 */ + __IO uint32_t TSDR; /*!< RTC time stamp date register, Address offset: 0x34 */ + __IO uint32_t TSSSR; /*!< RTC time-stamp sub second register, Address offset: 0x38 */ + __IO uint32_t CALR; /*!< RTC calibration register, Address offset: 0x3C */ + __IO uint32_t TAFCR; /*!< RTC tamper and alternate function configuration register, Address offset: 0x40 */ + __IO uint32_t ALRMASSR;/*!< RTC alarm A sub second register, Address offset: 0x44 */ + __IO uint32_t ALRMBSSR;/*!< RTC alarm B sub second register, Address offset: 0x48 */ + uint32_t RESERVED7; /*!< Reserved, 0x4C */ + __IO uint32_t BKP0R; /*!< RTC backup register 1, Address offset: 0x50 */ + __IO uint32_t BKP1R; /*!< RTC backup register 1, Address offset: 0x54 */ + __IO uint32_t BKP2R; /*!< RTC backup register 2, Address offset: 0x58 */ + __IO uint32_t BKP3R; /*!< RTC backup register 3, Address offset: 0x5C */ + __IO uint32_t BKP4R; /*!< RTC backup register 4, Address offset: 0x60 */ + __IO uint32_t BKP5R; /*!< RTC backup register 5, Address offset: 0x64 */ + __IO uint32_t BKP6R; /*!< RTC backup register 6, Address offset: 0x68 */ + __IO uint32_t BKP7R; /*!< RTC backup register 7, Address offset: 0x6C */ + __IO uint32_t BKP8R; /*!< RTC backup register 8, Address offset: 0x70 */ + __IO uint32_t BKP9R; /*!< RTC backup register 9, Address offset: 0x74 */ + __IO uint32_t BKP10R; /*!< RTC backup register 10, Address offset: 0x78 */ + __IO uint32_t BKP11R; /*!< RTC backup register 11, Address offset: 0x7C */ + __IO uint32_t BKP12R; /*!< RTC backup register 12, Address offset: 0x80 */ + __IO uint32_t BKP13R; /*!< RTC backup register 13, Address offset: 0x84 */ + __IO uint32_t BKP14R; /*!< RTC backup register 14, Address offset: 0x88 */ + __IO uint32_t BKP15R; /*!< RTC backup register 15, Address offset: 0x8C */ + __IO uint32_t BKP16R; /*!< RTC backup register 16, Address offset: 0x90 */ + __IO uint32_t BKP17R; /*!< RTC backup register 17, Address offset: 0x94 */ + __IO uint32_t BKP18R; /*!< RTC backup register 18, Address offset: 0x98 */ + __IO uint32_t BKP19R; /*!< RTC backup register 19, Address offset: 0x9C */ +} RTC_TypeDef; + +/** + * @brief Serial Audio Interface + */ + +typedef struct +{ + __IO uint32_t GCR; /*!< SAI global configuration register, Address offset: 0x00 */ +} SAI_TypeDef; + +typedef struct +{ + __IO uint32_t CR1; /*!< SAI block x configuration register 1, Address offset: 0x04 */ + __IO uint32_t CR2; /*!< SAI block x configuration register 2, Address offset: 0x08 */ + __IO uint32_t FRCR; /*!< SAI block x frame configuration register, Address offset: 0x0C */ + __IO uint32_t SLOTR; /*!< SAI block x slot register, Address offset: 0x10 */ + __IO uint32_t IMR; /*!< SAI block x interrupt mask register, Address offset: 0x14 */ + __IO uint32_t SR; /*!< SAI block x status register, Address offset: 0x18 */ + __IO uint32_t CLRFR; /*!< SAI block x clear flag register, Address offset: 0x1C */ + __IO uint32_t DR; /*!< SAI block x data register, Address offset: 0x20 */ +} SAI_Block_TypeDef; + +/** + * @brief SD host Interface + */ + +typedef struct +{ + __IO uint32_t POWER; /*!< SDIO power control register, Address offset: 0x00 */ + __IO uint32_t CLKCR; /*!< SDI clock control register, Address offset: 0x04 */ + __IO uint32_t ARG; /*!< SDIO argument register, Address offset: 0x08 */ + __IO uint32_t CMD; /*!< SDIO command register, Address offset: 0x0C */ + __IO const uint32_t RESPCMD; /*!< SDIO command response register, Address offset: 0x10 */ + __IO const uint32_t RESP1; /*!< SDIO response 1 register, Address offset: 0x14 */ + __IO const uint32_t RESP2; /*!< SDIO response 2 register, Address offset: 0x18 */ + __IO const uint32_t RESP3; /*!< SDIO response 3 register, Address offset: 0x1C */ + __IO const uint32_t RESP4; /*!< SDIO response 4 register, Address offset: 0x20 */ + __IO uint32_t DTIMER; /*!< SDIO data timer register, Address offset: 0x24 */ + __IO uint32_t DLEN; /*!< SDIO data length register, Address offset: 0x28 */ + __IO uint32_t DCTRL; /*!< SDIO data control register, Address offset: 0x2C */ + __IO const uint32_t DCOUNT; /*!< SDIO data counter register, Address offset: 0x30 */ + __IO const uint32_t STA; /*!< SDIO status register, Address offset: 0x34 */ + __IO uint32_t ICR; /*!< SDIO interrupt clear register, Address offset: 0x38 */ + __IO uint32_t MASK; /*!< SDIO mask register, Address offset: 0x3C */ + uint32_t RESERVED0[2]; /*!< Reserved, 0x40-0x44 */ + __IO const uint32_t FIFOCNT; /*!< SDIO FIFO counter register, Address offset: 0x48 */ + uint32_t RESERVED1[13]; /*!< Reserved, 0x4C-0x7C */ + __IO uint32_t FIFO; /*!< SDIO data FIFO register, Address offset: 0x80 */ +} SDIO_TypeDef; + +/** + * @brief Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR1; /*!< SPI control register 1 (not used in I2S mode), Address offset: 0x00 */ + __IO uint32_t CR2; /*!< SPI control register 2, Address offset: 0x04 */ + __IO uint32_t SR; /*!< SPI status register, Address offset: 0x08 */ + __IO uint32_t DR; /*!< SPI data register, Address offset: 0x0C */ + __IO uint32_t CRCPR; /*!< SPI CRC polynomial register (not used in I2S mode), Address offset: 0x10 */ + __IO uint32_t RXCRCR; /*!< SPI RX CRC register (not used in I2S mode), Address offset: 0x14 */ + __IO uint32_t TXCRCR; /*!< SPI TX CRC register (not used in I2S mode), Address offset: 0x18 */ + __IO uint32_t I2SCFGR; /*!< SPI_I2S configuration register, Address offset: 0x1C */ + __IO uint32_t I2SPR; /*!< SPI_I2S prescaler register, Address offset: 0x20 */ +} SPI_TypeDef; + +/** + * @brief QUAD Serial Peripheral Interface + */ + +typedef struct +{ + __IO uint32_t CR; /*!< QUADSPI Control register, Address offset: 0x00 */ + __IO uint32_t DCR; /*!< QUADSPI Device Configuration register, Address offset: 0x04 */ + __IO uint32_t SR; /*!< QUADSPI Status register, Address offset: 0x08 */ + __IO uint32_t FCR; /*!< QUADSPI Flag Clear register, Address offset: 0x0C */ + __IO uint32_t DLR; /*!< QUADSPI Data Length register, Address offset: 0x10 */ + __IO uint32_t CCR; /*!< QUADSPI Communication Configuration register, Address offset: 0x14 */ + __IO uint32_t AR; /*!< QUADSPI Address register, Address offset: 0x18 */ + __IO uint32_t ABR; /*!< QUADSPI Alternate Bytes register, Address offset: 0x1C */ + __IO uint32_t DR; /*!< QUADSPI Data register, Address offset: 0x20 */ + __IO uint32_t PSMKR; /*!< QUADSPI Polling Status Mask register, Address offset: 0x24 */ + __IO uint32_t PSMAR; /*!< QUADSPI Polling Status Match register, Address offset: 0x28 */ + __IO uint32_t PIR; /*!< QUADSPI Polling Interval register, Address offset: 0x2C */ + __IO uint32_t LPTR; /*!< QUADSPI Low Power Timeout register, Address offset: 0x30 */ +} QUADSPI_TypeDef; + +/** + * @brief SPDIFRX Interface + */ + +typedef struct +{ + __IO uint32_t CR; /*!< Control register, Address offset: 0x00 */ + __IO uint16_t IMR; /*!< Interrupt mask register, Address offset: 0x04 */ + uint16_t RESERVED0; /*!< Reserved, 0x06 */ + __IO uint32_t SR; /*!< Status register, Address offset: 0x08 */ + __IO uint16_t IFCR; /*!< Interrupt Flag Clear register, Address offset: 0x0C */ + uint16_t RESERVED1; /*!< Reserved, 0x0E */ + __IO uint32_t DR; /*!< Data input register, Address offset: 0x10 */ + __IO uint32_t CSR; /*!< Channel Status register, Address offset: 0x14 */ + __IO uint32_t DIR; /*!< Debug Information register, Address offset: 0x18 */ + uint16_t RESERVED2; /*!< Reserved, 0x1A */ +} SPDIFRX_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 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 Reserved5[3]; /*!< Reserved 040h-048h */ + __IO uint32_t GHWCFG3; /*!< User HW config3 04Ch */ + uint32_t Reserved6; /*!< Reserved 050h */ + __IO uint32_t GLPMCFG; /*!< LPM Register 054h */ + uint32_t Reserved; /*!< Reserved 058h */ + __IO uint32_t GDFIFOCFG; /*!< DFIFO Software Config Register 05Ch */ + uint32_t Reserved43[40]; /*!< Reserved 058h-0FFh */ + __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 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 FMC_R_BASE 0xA0000000UL /*!< FMC registers base address */ +#define QSPI_R_BASE 0xA0001000UL /*!< QuadSPI 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 0x0807FFFFUL /*!< 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 */ + +/* 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 SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) +#define SPDIFRX_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 FMPI2C1_BASE (APB1PERIPH_BASE + 0x6000UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) +#define CAN2_BASE (APB1PERIPH_BASE + 0x6800UL) +#define CEC_BASE (APB1PERIPH_BASE + 0x6C00UL) +#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 SPI4_BASE (APB2PERIPH_BASE + 0x3400UL) +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x3800UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00UL) +#define TIM9_BASE (APB2PERIPH_BASE + 0x4000UL) +#define TIM10_BASE (APB2PERIPH_BASE + 0x4400UL) +#define TIM11_BASE (APB2PERIPH_BASE + 0x4800UL) +#define SAI1_BASE (APB2PERIPH_BASE + 0x5800UL) +#define SAI1_Block_A_BASE (SAI1_BASE + 0x004UL) +#define SAI1_Block_B_BASE (SAI1_BASE + 0x024UL) +#define SAI2_BASE (APB2PERIPH_BASE + 0x5C00UL) +#define SAI2_Block_A_BASE (SAI2_BASE + 0x004UL) +#define SAI2_Block_B_BASE (SAI2_BASE + 0x024UL) + +/*!< 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 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) + +/*!< AHB2 peripherals */ +#define DCMI_BASE (AHB2PERIPH_BASE + 0x50000UL) + +/*!< FMC Bankx registers base address */ +#define FMC_Bank1_R_BASE (FMC_R_BASE + 0x0000UL) +#define FMC_Bank1E_R_BASE (FMC_R_BASE + 0x0104UL) +#define FMC_Bank3_R_BASE (FMC_R_BASE + 0x0080UL) +#define FMC_Bank5_6_R_BASE (FMC_R_BASE + 0x0140UL) + + +/*!< Debug MCU registers base address */ +#define DBGMCU_BASE 0xE0042000UL +/*!< USB registers base address */ +#define USB_OTG_HS_PERIPH_BASE 0x40040000UL +#define USB_OTG_FS_PERIPH_BASE 0x50000000UL + +#define USB_OTG_GLOBAL_BASE 0x000UL +#define USB_OTG_DEVICE_BASE 0x800UL +#define USB_OTG_IN_ENDPOINT_BASE 0x900UL +#define USB_OTG_OUT_ENDPOINT_BASE 0xB00UL +#define USB_OTG_EP_REG_SIZE 0x20UL +#define USB_OTG_HOST_BASE 0x400UL +#define USB_OTG_HOST_PORT_BASE 0x440UL +#define USB_OTG_HOST_CHANNEL_BASE 0x500UL +#define USB_OTG_HOST_CHANNEL_SIZE 0x20UL +#define USB_OTG_PCGCCTL_BASE 0xE00UL +#define USB_OTG_FIFO_BASE 0x1000UL +#define USB_OTG_FIFO_SIZE 0x1000UL + +#define UID_BASE 0x1FFF7A10UL /*!< Unique device ID register base address */ +#define FLASHSIZE_BASE 0x1FFF7A22UL /*!< FLASH Size register base address */ +#define PACKAGE_BASE 0x1FFF7BF0UL /*!< Package size register base address */ +/** + * @} + */ + +/** @addtogroup Peripheral_declaration + * @{ + */ +#define TIM2 ((TIM_TypeDef *) TIM2_BASE) +#define TIM3 ((TIM_TypeDef *) TIM3_BASE) +#define TIM4 ((TIM_TypeDef *) TIM4_BASE) +#define TIM5 ((TIM_TypeDef *) TIM5_BASE) +#define TIM6 ((TIM_TypeDef *) TIM6_BASE) +#define TIM7 ((TIM_TypeDef *) TIM7_BASE) +#define TIM12 ((TIM_TypeDef *) TIM12_BASE) +#define TIM13 ((TIM_TypeDef *) TIM13_BASE) +#define TIM14 ((TIM_TypeDef *) TIM14_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define WWDG ((WWDG_TypeDef *) WWDG_BASE) +#define IWDG ((IWDG_TypeDef *) IWDG_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define SPDIFRX ((SPDIFRX_TypeDef *) SPDIFRX_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 FMPI2C1 ((FMPI2C_TypeDef *) FMPI2C1_BASE) +#define CAN1 ((CAN_TypeDef *) CAN1_BASE) +#define CAN2 ((CAN_TypeDef *) CAN2_BASE) +#define CEC ((CEC_TypeDef *) CEC_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 SPI4 ((SPI_TypeDef *) SPI4_BASE) +#define SYSCFG ((SYSCFG_TypeDef *) SYSCFG_BASE) +#define EXTI ((EXTI_TypeDef *) EXTI_BASE) +#define TIM9 ((TIM_TypeDef *) TIM9_BASE) +#define TIM10 ((TIM_TypeDef *) TIM10_BASE) +#define TIM11 ((TIM_TypeDef *) TIM11_BASE) +#define SAI1 ((SAI_TypeDef *) SAI1_BASE) +#define SAI1_Block_A ((SAI_Block_TypeDef *)SAI1_Block_A_BASE) +#define SAI1_Block_B ((SAI_Block_TypeDef *)SAI1_Block_B_BASE) +#define SAI2 ((SAI_TypeDef *) SAI2_BASE) +#define SAI2_Block_A ((SAI_Block_TypeDef *)SAI2_Block_A_BASE) +#define SAI2_Block_B ((SAI_Block_TypeDef *)SAI2_Block_B_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 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 DCMI ((DCMI_TypeDef *) DCMI_BASE) +#define FMC_Bank1 ((FMC_Bank1_TypeDef *) FMC_Bank1_R_BASE) +#define FMC_Bank1E ((FMC_Bank1E_TypeDef *) FMC_Bank1E_R_BASE) +#define FMC_Bank3 ((FMC_Bank3_TypeDef *) FMC_Bank3_R_BASE) +#define FMC_Bank5_6 ((FMC_Bank5_6_TypeDef *) FMC_Bank5_6_R_BASE) +#define QUADSPI ((QUADSPI_TypeDef *) QSPI_R_BASE) +#define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_BASE) +#define USB_OTG_FS ((USB_OTG_GlobalTypeDef *) USB_OTG_FS_PERIPH_BASE) +#define USB_OTG_HS ((USB_OTG_GlobalTypeDef *) USB_OTG_HS_PERIPH_BASE) + +/** + * @} + */ + +/** @addtogroup Exported_constants + * @{ + */ + +/** @addtogroup Hardware_Constant_Definition + * @{ + */ +#define LSI_STARTUP_TIME 40U /*!< LSI Maximum startup time in us */ +/** + * @} + */ + + /** @addtogroup Peripheral_Registers_Bits_Definition + * @{ + */ + +/******************************************************************************/ +/* Peripheral Registers_Bits_Definition */ +/******************************************************************************/ + +/******************************************************************************/ +/* */ +/* Analog to Digital Converter */ +/* */ +/******************************************************************************/ +/* + * @brief Specific device feature definitions (not present on all devices in the STM32F4 serie) + */ +#define ADC_MULTIMODE_SUPPORT /*!>= 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/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_armclang.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_armclang.h new file mode 100644 index 0000000..162a400 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_armclang.h @@ -0,0 +1,1869 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler armclang (Arm Compiler 6) header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for Arm Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF); + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF); + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF); + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_compiler.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_compiler.h new file mode 100644 index 0000000..94212eb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_compiler.h @@ -0,0 +1,266 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * Arm Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * Arm Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI Arm Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __STATIC_INLINE + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_gcc.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 0000000..2d9db15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,2085 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.0.4 + * @date 09. April 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + __extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_iccarm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_iccarm.h new file mode 100644 index 0000000..11c4af0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_iccarm.h @@ -0,0 +1,935 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.7 + * @date 19. June 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __TZ_get_PSPLIM_NS() (0U) + #define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) + #else + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #endif + + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_version.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_version.h new file mode 100644 index 0000000..660f612 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mbl.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mbl.h new file mode 100644 index 0000000..251e4ed --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mbl.h @@ -0,0 +1,1918 @@ +/**************************************************************************//** + * @file core_armv8mbl.h + * @brief CMSIS Armv8-M Baseline Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 22. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MBL_H_GENERIC +#define __CORE_ARMV8MBL_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MBL + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __ARMv8MBL_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MBL_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MBL_CMSIS_VERSION ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MBL_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M ( 2U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MBL_H_DEPENDANT +#define __CORE_ARMV8MBL_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MBL_REV + #define __ARMv8MBL_REV 0x0000U + #warning "__ARMv8MBL_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MBL */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MBL_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mml.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mml.h new file mode 100644 index 0000000..3a3148e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mml.h @@ -0,0 +1,2927 @@ +/**************************************************************************//** + * @file core_armv8mml.h + * @brief CMSIS Armv8-M Mainline Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 06. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_ARMV8MML_H_GENERIC +#define __CORE_ARMV8MML_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_ARMv8MML + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS Armv8MML definitions */ +#define __ARMv8MML_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __ARMv8MML_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __ARMv8MML_CMSIS_VERSION ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \ + __ARMv8MML_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (81U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined(__ARM_FEATURE_DSP) + #if defined(__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_ARMV8MML_H_DEPENDANT +#define __CORE_ARMV8MML_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __ARMv8MML_REV + #define __ARMv8MML_REV 0x0000U + #warning "__ARMv8MML_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group ARMv8MML */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Sizes Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Sizes Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[809U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) Software Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) Software Lock Status Register */ + uint32_t RESERVED4[4U]; + __IM uint32_t TYPE; /*!< Offset: 0xFC8 (R/ ) Device Identifier Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_SWOSCALER_Pos 0U /*!< TPI ACPR: SWOSCALER Position */ +#define TPI_ACPR_SWOSCALER_Msk (0xFFFFUL /*<< TPI_ACPR_SWOSCALER_Pos*/) /*!< TPI ACPR: SWOSCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI Periodic Synchronization Control Register Definitions */ +#define TPI_PSCR_PSCount_Pos 0U /*!< TPI PSCR: PSCount Position */ +#define TPI_PSCR_PSCount_Msk (0x1FUL /*<< TPI_PSCR_PSCount_Pos*/) /*!< TPI PSCR: TPSCount Mask */ + +/* TPI Software Lock Status Register Definitions */ +#define TPI_LSR_nTT_Pos 1U /*!< TPI LSR: Not thirty-two bit. Position */ +#define TPI_LSR_nTT_Msk (0x1UL << TPI_LSR_nTT_Pos) /*!< TPI LSR: Not thirty-two bit. Mask */ + +#define TPI_LSR_SLK_Pos 1U /*!< TPI LSR: Software Lock status Position */ +#define TPI_LSR_SLK_Msk (0x1UL << TPI_LSR_SLK_Pos) /*!< TPI LSR: Software Lock status Mask */ + +#define TPI_LSR_SLI_Pos 0U /*!< TPI LSR: Software Lock implemented Position */ +#define TPI_LSR_SLI_Msk (0x1UL /*<< TPI_LSR_SLI_Pos*/) /*!< TPI LSR: Software Lock implemented Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFO depth Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFO depth Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_ARMV8MML_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0.h new file mode 100644 index 0000000..f929bba --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0.h @@ -0,0 +1,949 @@ +/**************************************************************************//** + * @file core_cm0.h + * @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0_H_GENERIC +#define __CORE_CM0_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M0 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0 definitions */ +#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \ + __CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0_H_DEPENDANT +#define __CORE_CM0_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0_REV + #define __CM0_REV 0x0000U + #warning "__CM0_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M0 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0plus.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0plus.h new file mode 100644 index 0000000..424011a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0plus.h @@ -0,0 +1,1083 @@ +/**************************************************************************//** + * @file core_cm0plus.h + * @brief CMSIS Cortex-M0+ Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM0PLUS_H_GENERIC +#define __CORE_CM0PLUS_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex-M0+ + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM0+ definitions */ +#define __CM0PLUS_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM0PLUS_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM0PLUS_CMSIS_VERSION ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \ + __CM0PLUS_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (0U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM0PLUS_H_DEPENDANT +#define __CORE_CM0PLUS_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM0PLUS_REV + #define __CM0PLUS_REV 0x0000U + #warning "__CM0PLUS_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex-M0+ */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 8U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M0+ header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M0+ */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; + +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM0PLUS_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm1.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm1.h new file mode 100644 index 0000000..0ed678e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm1.h @@ -0,0 +1,976 @@ +/**************************************************************************//** + * @file core_cm1.h + * @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File + * @version V1.0.0 + * @date 23. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM1_H_GENERIC +#define __CORE_CM1_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M1 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM1 definitions */ +#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \ + __CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (1U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM1_H_DEPENDANT +#define __CORE_CM1_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM1_REV + #define __CM1_REV 0x0100U + #warning "__CM1_REV not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M1 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + uint32_t RESERVED0; + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */ + +#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */ +#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the Cortex-M1 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for Cortex-M1 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + Address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)0x0U; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)0x0U; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM1_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm23.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm23.h new file mode 100644 index 0000000..acbc5df --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm23.h @@ -0,0 +1,1993 @@ +/**************************************************************************//** + * @file core_cm23.h + * @brief CMSIS Cortex-M23 Core Peripheral Access Layer Header File + * @version V5.0.7 + * @date 22. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM23_H_GENERIC +#define __CORE_CM23_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M23 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS definitions */ +#define __CM23_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM23_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM23_CMSIS_VERSION ((__CM23_CMSIS_VERSION_MAIN << 16U) | \ + __CM23_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (23U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM23_H_DEPENDANT +#define __CORE_CM23_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM23_REV + #define __CM23_REV 0x0000U + #warning "__CM23_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __VTOR_PRESENT + #define __VTOR_PRESENT 0U + #warning "__VTOR_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif + + #ifndef __ETM_PRESENT + #define __ETM_PRESENT 0U + #warning "__ETM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MTB_PRESENT + #define __MTB_PRESENT 0U + #warning "__MTB_PRESENT not defined in device header file; using default!" + #endif + +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M23 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint32_t IPR[124U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ +#else + uint32_t RESERVED0; +#endif + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED1; + __IOM uint32_t SHPR[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t RESERVED0[6U]; + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x3UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + uint32_t RESERVED0[7U]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 1U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: EN Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: EN Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#endif +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_DWTENA_Pos 24U /*!< CoreDebug DEMCR: DWTENA Position */ +#define CoreDebug_DEMCR_DWTENA_Msk (1UL << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for Cortex-M23 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for Cortex-M23 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + +#define __NVIC_SetPriorityGrouping(X) (void)(X) +#define __NVIC_GetPriorityGrouping() (0U) + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + If VTOR is not present address 0 must be mapped to SRAM. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U) + uint32_t *vectors = (uint32_t *)SCB->VTOR; +#else + uint32_t *vectors = (uint32_t *)0x0U; +#endif + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[_IP_IDX(IRQn)] = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM23_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm3.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm3.h new file mode 100644 index 0000000..74bff64 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm3.h @@ -0,0 +1,1941 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M3 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16U) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (3U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200U + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if defined (__CM3_REV) && (__CM3_REV < 0x0201U) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1U]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm33.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm33.h new file mode 100644 index 0000000..6cd2db7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm33.h @@ -0,0 +1,3002 @@ +/**************************************************************************//** + * @file core_cm33.h + * @brief CMSIS Cortex-M33 Core Peripheral Access Layer Header File + * @version V5.0.9 + * @date 06. July 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM33_H_GENERIC +#define __CORE_CM33_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M33 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM33 definitions */ +#define __CM33_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM33_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM33_CMSIS_VERSION ((__CM33_CMSIS_VERSION_MAIN << 16U) | \ + __CM33_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (33U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined (__TARGET_FPU_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined (__ARM_PCS_VFP) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined (__ARMVFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + + #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U) + #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U) + #define __DSP_USED 1U + #else + #error "Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)" + #define __DSP_USED 0U + #endif + #else + #define __DSP_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined (__TI_VFP_SUPPORT__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined (__FPU_VFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM33_H_DEPENDANT +#define __CORE_CM33_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM33_REV + #define __CM33_REV 0x0000U + #warning "__CM33_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __SAUREGION_PRESENT + #define __SAUREGION_PRESENT 0U + #warning "__SAUREGION_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DSP_PRESENT + #define __DSP_PRESENT 0U + #warning "__DSP_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M33 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core SAU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_IT_Pos 25U /*!< xPSR: IT Position */ +#define xPSR_IT_Msk (3UL << xPSR_IT_Pos) /*!< xPSR: IT Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack-pointer select */ + uint32_t FPCA:1; /*!< bit: 2 Floating-point context active */ + uint32_t SFPA:1; /*!< bit: 3 Secure floating-point active */ + uint32_t _reserved1:28; /*!< bit: 4..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SFPA_Pos 3U /*!< CONTROL: SFPA Position */ +#define CONTROL_SFPA_Msk (1UL << CONTROL_SFPA_Pos) /*!< CONTROL: SFPA Mask */ + +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[16U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[16U]; + __IOM uint32_t ICER[16U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[16U]; + __IOM uint32_t ISPR[16U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[16U]; + __IOM uint32_t ICPR[16U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[16U]; + __IOM uint32_t IABR[16U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[16U]; + __IOM uint32_t ITNS[16U]; /*!< Offset: 0x280 (R/W) Interrupt Non-Secure State Register */ + uint32_t RESERVED5[16U]; + __IOM uint8_t IPR[496U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED6[580U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[6U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IOM uint32_t NSACR; /*!< Offset: 0x08C (R/W) Non-Secure Access Control Register */ + uint32_t RESERVED3[92U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_PENDNMISET_Pos 31U /*!< SCB ICSR: PENDNMISET Position */ +#define SCB_ICSR_PENDNMISET_Msk (1UL << SCB_ICSR_PENDNMISET_Pos) /*!< SCB ICSR: PENDNMISET Mask */ + +#define SCB_ICSR_NMIPENDSET_Pos SCB_ICSR_PENDNMISET_Pos /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */ +#define SCB_ICSR_NMIPENDSET_Msk SCB_ICSR_PENDNMISET_Msk /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */ + +#define SCB_ICSR_PENDNMICLR_Pos 30U /*!< SCB ICSR: PENDNMICLR Position */ +#define SCB_ICSR_PENDNMICLR_Msk (1UL << SCB_ICSR_PENDNMICLR_Pos) /*!< SCB ICSR: PENDNMICLR Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_STTNS_Pos 24U /*!< SCB ICSR: STTNS Position (Security Extension) */ +#define SCB_ICSR_STTNS_Msk (1UL << SCB_ICSR_STTNS_Pos) /*!< SCB ICSR: STTNS Mask (Security Extension) */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIS_Pos 14U /*!< SCB AIRCR: PRIS Position */ +#define SCB_AIRCR_PRIS_Msk (1UL << SCB_AIRCR_PRIS_Pos) /*!< SCB AIRCR: PRIS Mask */ + +#define SCB_AIRCR_BFHFNMINS_Pos 13U /*!< SCB AIRCR: BFHFNMINS Position */ +#define SCB_AIRCR_BFHFNMINS_Msk (1UL << SCB_AIRCR_BFHFNMINS_Pos) /*!< SCB AIRCR: BFHFNMINS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQS_Pos 3U /*!< SCB AIRCR: SYSRESETREQS Position */ +#define SCB_AIRCR_SYSRESETREQS_Msk (1UL << SCB_AIRCR_SYSRESETREQS_Pos) /*!< SCB AIRCR: SYSRESETREQS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEPS_Pos 3U /*!< SCB SCR: SLEEPDEEPS Position */ +#define SCB_SCR_SLEEPDEEPS_Msk (1UL << SCB_SCR_SLEEPDEEPS_Pos) /*!< SCB SCR: SLEEPDEEPS Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: BP Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: BP Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: IC Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: IC Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: DC Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: DC Mask */ + +#define SCB_CCR_STKOFHFNMIGN_Pos 10U /*!< SCB CCR: STKOFHFNMIGN Position */ +#define SCB_CCR_STKOFHFNMIGN_Msk (1UL << SCB_CCR_STKOFHFNMIGN_Pos) /*!< SCB CCR: STKOFHFNMIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_HARDFAULTPENDED_Pos 21U /*!< SCB SHCSR: HARDFAULTPENDED Position */ +#define SCB_SHCSR_HARDFAULTPENDED_Msk (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos) /*!< SCB SHCSR: HARDFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTPENDED_Pos 20U /*!< SCB SHCSR: SECUREFAULTPENDED Position */ +#define SCB_SHCSR_SECUREFAULTPENDED_Msk (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos) /*!< SCB SHCSR: SECUREFAULTPENDED Mask */ + +#define SCB_SHCSR_SECUREFAULTENA_Pos 19U /*!< SCB SHCSR: SECUREFAULTENA Position */ +#define SCB_SHCSR_SECUREFAULTENA_Msk (1UL << SCB_SHCSR_SECUREFAULTENA_Pos) /*!< SCB SHCSR: SECUREFAULTENA Mask */ + +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_NMIACT_Pos 5U /*!< SCB SHCSR: NMIACT Position */ +#define SCB_SHCSR_NMIACT_Msk (1UL << SCB_SHCSR_NMIACT_Pos) /*!< SCB SHCSR: NMIACT Mask */ + +#define SCB_SHCSR_SECUREFAULTACT_Pos 4U /*!< SCB SHCSR: SECUREFAULTACT Position */ +#define SCB_SHCSR_SECUREFAULTACT_Msk (1UL << SCB_SHCSR_SECUREFAULTACT_Pos) /*!< SCB SHCSR: SECUREFAULTACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_HARDFAULTACT_Pos 2U /*!< SCB SHCSR: HARDFAULTACT Position */ +#define SCB_SHCSR_HARDFAULTACT_Msk (1UL << SCB_SHCSR_HARDFAULTACT_Pos) /*!< SCB SHCSR: HARDFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_STKOF_Pos (SCB_CFSR_USGFAULTSR_Pos + 4U) /*!< SCB CFSR (UFSR): STKOF Position */ +#define SCB_CFSR_STKOF_Msk (1UL << SCB_CFSR_STKOF_Pos) /*!< SCB CFSR (UFSR): STKOF Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Non-Secure Access Control Register Definitions */ +#define SCB_NSACR_CP11_Pos 11U /*!< SCB NSACR: CP11 Position */ +#define SCB_NSACR_CP11_Msk (1UL << SCB_NSACR_CP11_Pos) /*!< SCB NSACR: CP11 Mask */ + +#define SCB_NSACR_CP10_Pos 10U /*!< SCB NSACR: CP10 Position */ +#define SCB_NSACR_CP10_Msk (1UL << SCB_NSACR_CP10_Pos) /*!< SCB NSACR: CP10 Mask */ + +#define SCB_NSACR_CPn_Pos 0U /*!< SCB NSACR: CPn Position */ +#define SCB_NSACR_CPn_Msk (1UL /*<< SCB_NSACR_CPn_Pos*/) /*!< SCB NSACR: CPn Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t CPPWR; /*!< Offset: 0x00C (R/W) Coprocessor Power Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) ITM Device Architecture Register */ + uint32_t RESERVED6[4U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Stimulus Port Register Definitions */ +#define ITM_STIM_DISABLED_Pos 1U /*!< ITM STIM: DISABLED Position */ +#define ITM_STIM_DISABLED_Msk (0x1UL << ITM_STIM_DISABLED_Pos) /*!< ITM STIM: DISABLED Mask */ + +#define ITM_STIM_FIFOREADY_Pos 0U /*!< ITM STIM: FIFOREADY Position */ +#define ITM_STIM_FIFOREADY_Msk (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/) /*!< ITM STIM: FIFOREADY Mask */ + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TRACEBUSID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TRACEBUSID_Msk (0x7FUL << ITM_TCR_TRACEBUSID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPRESCALE_Pos 8U /*!< ITM TCR: TSPRESCALE Position */ +#define ITM_TCR_TSPRESCALE_Msk (3UL << ITM_TCR_TSPRESCALE_Pos) /*!< ITM TCR: TSPRESCALE Mask */ + +#define ITM_TCR_STALLENA_Pos 5U /*!< ITM TCR: STALLENA Position */ +#define ITM_TCR_STALLENA_Msk (1UL << ITM_TCR_STALLENA_Pos) /*!< ITM TCR: STALLENA Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + uint32_t RESERVED3[1U]; + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED4[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + uint32_t RESERVED5[1U]; + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED6[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + uint32_t RESERVED7[1U]; + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED8[1U]; + __IOM uint32_t COMP4; /*!< Offset: 0x060 (R/W) Comparator Register 4 */ + uint32_t RESERVED9[1U]; + __IOM uint32_t FUNCTION4; /*!< Offset: 0x068 (R/W) Function Register 4 */ + uint32_t RESERVED10[1U]; + __IOM uint32_t COMP5; /*!< Offset: 0x070 (R/W) Comparator Register 5 */ + uint32_t RESERVED11[1U]; + __IOM uint32_t FUNCTION5; /*!< Offset: 0x078 (R/W) Function Register 5 */ + uint32_t RESERVED12[1U]; + __IOM uint32_t COMP6; /*!< Offset: 0x080 (R/W) Comparator Register 6 */ + uint32_t RESERVED13[1U]; + __IOM uint32_t FUNCTION6; /*!< Offset: 0x088 (R/W) Function Register 6 */ + uint32_t RESERVED14[1U]; + __IOM uint32_t COMP7; /*!< Offset: 0x090 (R/W) Comparator Register 7 */ + uint32_t RESERVED15[1U]; + __IOM uint32_t FUNCTION7; /*!< Offset: 0x098 (R/W) Function Register 7 */ + uint32_t RESERVED16[1U]; + __IOM uint32_t COMP8; /*!< Offset: 0x0A0 (R/W) Comparator Register 8 */ + uint32_t RESERVED17[1U]; + __IOM uint32_t FUNCTION8; /*!< Offset: 0x0A8 (R/W) Function Register 8 */ + uint32_t RESERVED18[1U]; + __IOM uint32_t COMP9; /*!< Offset: 0x0B0 (R/W) Comparator Register 9 */ + uint32_t RESERVED19[1U]; + __IOM uint32_t FUNCTION9; /*!< Offset: 0x0B8 (R/W) Function Register 9 */ + uint32_t RESERVED20[1U]; + __IOM uint32_t COMP10; /*!< Offset: 0x0C0 (R/W) Comparator Register 10 */ + uint32_t RESERVED21[1U]; + __IOM uint32_t FUNCTION10; /*!< Offset: 0x0C8 (R/W) Function Register 10 */ + uint32_t RESERVED22[1U]; + __IOM uint32_t COMP11; /*!< Offset: 0x0D0 (R/W) Comparator Register 11 */ + uint32_t RESERVED23[1U]; + __IOM uint32_t FUNCTION11; /*!< Offset: 0x0D8 (R/W) Function Register 11 */ + uint32_t RESERVED24[1U]; + __IOM uint32_t COMP12; /*!< Offset: 0x0E0 (R/W) Comparator Register 12 */ + uint32_t RESERVED25[1U]; + __IOM uint32_t FUNCTION12; /*!< Offset: 0x0E8 (R/W) Function Register 12 */ + uint32_t RESERVED26[1U]; + __IOM uint32_t COMP13; /*!< Offset: 0x0F0 (R/W) Comparator Register 13 */ + uint32_t RESERVED27[1U]; + __IOM uint32_t FUNCTION13; /*!< Offset: 0x0F8 (R/W) Function Register 13 */ + uint32_t RESERVED28[1U]; + __IOM uint32_t COMP14; /*!< Offset: 0x100 (R/W) Comparator Register 14 */ + uint32_t RESERVED29[1U]; + __IOM uint32_t FUNCTION14; /*!< Offset: 0x108 (R/W) Function Register 14 */ + uint32_t RESERVED30[1U]; + __IOM uint32_t COMP15; /*!< Offset: 0x110 (R/W) Comparator Register 15 */ + uint32_t RESERVED31[1U]; + __IOM uint32_t FUNCTION15; /*!< Offset: 0x118 (R/W) Function Register 15 */ + uint32_t RESERVED32[934U]; + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ + uint32_t RESERVED33[1U]; + __IM uint32_t DEVARCH; /*!< Offset: 0xFBC (R/ ) Device Architecture Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCDISS_Pos 23U /*!< DWT CTRL: CYCDISS Position */ +#define DWT_CTRL_CYCDISS_Msk (0x1UL << DWT_CTRL_CYCDISS_Pos) /*!< DWT CTRL: CYCDISS Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_ID_Pos 27U /*!< DWT FUNCTION: ID Position */ +#define DWT_FUNCTION_ID_Msk (0x1FUL << DWT_FUNCTION_ID_Pos) /*!< DWT FUNCTION: ID Mask */ + +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_ACTION_Pos 4U /*!< DWT FUNCTION: ACTION Position */ +#define DWT_FUNCTION_ACTION_Msk (0x1UL << DWT_FUNCTION_ACTION_Pos) /*!< DWT FUNCTION: ACTION Mask */ + +#define DWT_FUNCTION_MATCH_Pos 0U /*!< DWT FUNCTION: MATCH Position */ +#define DWT_FUNCTION_MATCH_Msk (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/) /*!< DWT FUNCTION: MATCH Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IOM uint32_t PSCR; /*!< Offset: 0x308 (R/W) Periodic Synchronization Control Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t ITFTTD0; /*!< Offset: 0xEEC (R/ ) Integration Test FIFO Test Data 0 Register */ + __IOM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/W) Integration Test ATB Control Register 2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) Integration Test ATB Control Register 0 */ + __IM uint32_t ITFTTD1; /*!< Offset: 0xEFC (R/ ) Integration Test FIFO Test Data 1 Register */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) Device Configuration Register */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) Device Type Identifier Register */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_FOnMan_Pos 6U /*!< TPI FFCR: FOnMan Position */ +#define TPI_FFCR_FOnMan_Msk (0x1UL << TPI_FFCR_FOnMan_Pos) /*!< TPI FFCR: FOnMan Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration Test FIFO Test Data 0 Register Definitions */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */ +#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data2_Pos 16U /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */ +#define TPI_ITFTTD0_ATB_IF1_data2_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data1_Pos 8U /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */ +#define TPI_ITFTTD0_ATB_IF1_data1_Msk (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos) /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */ + +#define TPI_ITFTTD0_ATB_IF1_data0_Pos 0U /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */ +#define TPI_ITFTTD0_ATB_IF1_data0_Msk (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */ + +/* TPI Integration Test ATB Control Register 2 Register Definitions */ +#define TPI_ITATBCTR2_AFVALID2S_Pos 1U /*!< TPI ITATBCTR2: AFVALID2S Position */ +#define TPI_ITATBCTR2_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos) /*!< TPI ITATBCTR2: AFVALID2SS Mask */ + +#define TPI_ITATBCTR2_AFVALID1S_Pos 1U /*!< TPI ITATBCTR2: AFVALID1S Position */ +#define TPI_ITATBCTR2_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos) /*!< TPI ITATBCTR2: AFVALID1SS Mask */ + +#define TPI_ITATBCTR2_ATREADY2S_Pos 0U /*!< TPI ITATBCTR2: ATREADY2S Position */ +#define TPI_ITATBCTR2_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/) /*!< TPI ITATBCTR2: ATREADY2S Mask */ + +#define TPI_ITATBCTR2_ATREADY1S_Pos 0U /*!< TPI ITATBCTR2: ATREADY1S Position */ +#define TPI_ITATBCTR2_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/) /*!< TPI ITATBCTR2: ATREADY1S Mask */ + +/* TPI Integration Test FIFO Test Data 1 Register Definitions */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos 29U /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos 27U /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */ +#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */ + +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos 26U /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */ +#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos) /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */ + +#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos 24U /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */ +#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data2_Pos 16U /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */ +#define TPI_ITFTTD1_ATB_IF2_data2_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data1_Pos 8U /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */ +#define TPI_ITFTTD1_ATB_IF2_data1_Msk (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos) /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */ + +#define TPI_ITFTTD1_ATB_IF2_data0_Pos 0U /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */ +#define TPI_ITFTTD1_ATB_IF2_data0_Msk (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */ + +/* TPI Integration Test ATB Control Register 0 Definitions */ +#define TPI_ITATBCTR0_AFVALID2S_Pos 1U /*!< TPI ITATBCTR0: AFVALID2S Position */ +#define TPI_ITATBCTR0_AFVALID2S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos) /*!< TPI ITATBCTR0: AFVALID2SS Mask */ + +#define TPI_ITATBCTR0_AFVALID1S_Pos 1U /*!< TPI ITATBCTR0: AFVALID1S Position */ +#define TPI_ITATBCTR0_AFVALID1S_Msk (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos) /*!< TPI ITATBCTR0: AFVALID1SS Mask */ + +#define TPI_ITATBCTR0_ATREADY2S_Pos 0U /*!< TPI ITATBCTR0: ATREADY2S Position */ +#define TPI_ITATBCTR0_ATREADY2S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/) /*!< TPI ITATBCTR0: ATREADY2S Mask */ + +#define TPI_ITATBCTR0_ATREADY1S_Pos 0U /*!< TPI ITATBCTR0: ATREADY1S Position */ +#define TPI_ITATBCTR0_ATREADY1S_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/) /*!< TPI ITATBCTR0: ATREADY1S Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_FIFOSZ_Pos 6U /*!< TPI DEVID: FIFOSZ Position */ +#define TPI_DEVID_FIFOSZ_Msk (0x7UL << TPI_DEVID_FIFOSZ_Pos) /*!< TPI DEVID: FIFOSZ Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) MPU Region Limit Address Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Region Base Address Register Alias 1 */ + __IOM uint32_t RLAR_A1; /*!< Offset: 0x018 (R/W) MPU Region Limit Address Register Alias 1 */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Region Base Address Register Alias 2 */ + __IOM uint32_t RLAR_A2; /*!< Offset: 0x020 (R/W) MPU Region Limit Address Register Alias 2 */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Region Base Address Register Alias 3 */ + __IOM uint32_t RLAR_A3; /*!< Offset: 0x028 (R/W) MPU Region Limit Address Register Alias 3 */ + uint32_t RESERVED0[1]; + union { + __IOM uint32_t MAIR[2]; + struct { + __IOM uint32_t MAIR0; /*!< Offset: 0x030 (R/W) MPU Memory Attribute Indirection Register 0 */ + __IOM uint32_t MAIR1; /*!< Offset: 0x034 (R/W) MPU Memory Attribute Indirection Register 1 */ + }; + }; +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_BASE_Pos 5U /*!< MPU RBAR: BASE Position */ +#define MPU_RBAR_BASE_Msk (0x7FFFFFFUL << MPU_RBAR_BASE_Pos) /*!< MPU RBAR: BASE Mask */ + +#define MPU_RBAR_SH_Pos 3U /*!< MPU RBAR: SH Position */ +#define MPU_RBAR_SH_Msk (0x3UL << MPU_RBAR_SH_Pos) /*!< MPU RBAR: SH Mask */ + +#define MPU_RBAR_AP_Pos 1U /*!< MPU RBAR: AP Position */ +#define MPU_RBAR_AP_Msk (0x3UL << MPU_RBAR_AP_Pos) /*!< MPU RBAR: AP Mask */ + +#define MPU_RBAR_XN_Pos 0U /*!< MPU RBAR: XN Position */ +#define MPU_RBAR_XN_Msk (01UL /*<< MPU_RBAR_XN_Pos*/) /*!< MPU RBAR: XN Mask */ + +/* MPU Region Limit Address Register Definitions */ +#define MPU_RLAR_LIMIT_Pos 5U /*!< MPU RLAR: LIMIT Position */ +#define MPU_RLAR_LIMIT_Msk (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos) /*!< MPU RLAR: LIMIT Mask */ + +#define MPU_RLAR_AttrIndx_Pos 1U /*!< MPU RLAR: AttrIndx Position */ +#define MPU_RLAR_AttrIndx_Msk (0x7UL << MPU_RLAR_AttrIndx_Pos) /*!< MPU RLAR: AttrIndx Mask */ + +#define MPU_RLAR_EN_Pos 0U /*!< MPU RLAR: Region enable bit Position */ +#define MPU_RLAR_EN_Msk (1UL /*<< MPU_RLAR_EN_Pos*/) /*!< MPU RLAR: Region enable bit Disable Mask */ + +/* MPU Memory Attribute Indirection Register 0 Definitions */ +#define MPU_MAIR0_Attr3_Pos 24U /*!< MPU MAIR0: Attr3 Position */ +#define MPU_MAIR0_Attr3_Msk (0xFFUL << MPU_MAIR0_Attr3_Pos) /*!< MPU MAIR0: Attr3 Mask */ + +#define MPU_MAIR0_Attr2_Pos 16U /*!< MPU MAIR0: Attr2 Position */ +#define MPU_MAIR0_Attr2_Msk (0xFFUL << MPU_MAIR0_Attr2_Pos) /*!< MPU MAIR0: Attr2 Mask */ + +#define MPU_MAIR0_Attr1_Pos 8U /*!< MPU MAIR0: Attr1 Position */ +#define MPU_MAIR0_Attr1_Msk (0xFFUL << MPU_MAIR0_Attr1_Pos) /*!< MPU MAIR0: Attr1 Mask */ + +#define MPU_MAIR0_Attr0_Pos 0U /*!< MPU MAIR0: Attr0 Position */ +#define MPU_MAIR0_Attr0_Msk (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/) /*!< MPU MAIR0: Attr0 Mask */ + +/* MPU Memory Attribute Indirection Register 1 Definitions */ +#define MPU_MAIR1_Attr7_Pos 24U /*!< MPU MAIR1: Attr7 Position */ +#define MPU_MAIR1_Attr7_Msk (0xFFUL << MPU_MAIR1_Attr7_Pos) /*!< MPU MAIR1: Attr7 Mask */ + +#define MPU_MAIR1_Attr6_Pos 16U /*!< MPU MAIR1: Attr6 Position */ +#define MPU_MAIR1_Attr6_Msk (0xFFUL << MPU_MAIR1_Attr6_Pos) /*!< MPU MAIR1: Attr6 Mask */ + +#define MPU_MAIR1_Attr5_Pos 8U /*!< MPU MAIR1: Attr5 Position */ +#define MPU_MAIR1_Attr5_Msk (0xFFUL << MPU_MAIR1_Attr5_Pos) /*!< MPU MAIR1: Attr5 Mask */ + +#define MPU_MAIR1_Attr4_Pos 0U /*!< MPU MAIR1: Attr4 Position */ +#define MPU_MAIR1_Attr4_Msk (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/) /*!< MPU MAIR1: Attr4 Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SAU Security Attribution Unit (SAU) + \brief Type definitions for the Security Attribution Unit (SAU) + @{ + */ + +/** + \brief Structure type to access the Security Attribution Unit (SAU). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SAU Control Register */ + __IM uint32_t TYPE; /*!< Offset: 0x004 (R/ ) SAU Type Register */ +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) SAU Region Number Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) SAU Region Base Address Register */ + __IOM uint32_t RLAR; /*!< Offset: 0x010 (R/W) SAU Region Limit Address Register */ +#else + uint32_t RESERVED0[3]; +#endif + __IOM uint32_t SFSR; /*!< Offset: 0x014 (R/W) Secure Fault Status Register */ + __IOM uint32_t SFAR; /*!< Offset: 0x018 (R/W) Secure Fault Address Register */ +} SAU_Type; + +/* SAU Control Register Definitions */ +#define SAU_CTRL_ALLNS_Pos 1U /*!< SAU CTRL: ALLNS Position */ +#define SAU_CTRL_ALLNS_Msk (1UL << SAU_CTRL_ALLNS_Pos) /*!< SAU CTRL: ALLNS Mask */ + +#define SAU_CTRL_ENABLE_Pos 0U /*!< SAU CTRL: ENABLE Position */ +#define SAU_CTRL_ENABLE_Msk (1UL /*<< SAU_CTRL_ENABLE_Pos*/) /*!< SAU CTRL: ENABLE Mask */ + +/* SAU Type Register Definitions */ +#define SAU_TYPE_SREGION_Pos 0U /*!< SAU TYPE: SREGION Position */ +#define SAU_TYPE_SREGION_Msk (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/) /*!< SAU TYPE: SREGION Mask */ + +#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) +/* SAU Region Number Register Definitions */ +#define SAU_RNR_REGION_Pos 0U /*!< SAU RNR: REGION Position */ +#define SAU_RNR_REGION_Msk (0xFFUL /*<< SAU_RNR_REGION_Pos*/) /*!< SAU RNR: REGION Mask */ + +/* SAU Region Base Address Register Definitions */ +#define SAU_RBAR_BADDR_Pos 5U /*!< SAU RBAR: BADDR Position */ +#define SAU_RBAR_BADDR_Msk (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos) /*!< SAU RBAR: BADDR Mask */ + +/* SAU Region Limit Address Register Definitions */ +#define SAU_RLAR_LADDR_Pos 5U /*!< SAU RLAR: LADDR Position */ +#define SAU_RLAR_LADDR_Msk (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos) /*!< SAU RLAR: LADDR Mask */ + +#define SAU_RLAR_NSC_Pos 1U /*!< SAU RLAR: NSC Position */ +#define SAU_RLAR_NSC_Msk (1UL << SAU_RLAR_NSC_Pos) /*!< SAU RLAR: NSC Mask */ + +#define SAU_RLAR_ENABLE_Pos 0U /*!< SAU RLAR: ENABLE Position */ +#define SAU_RLAR_ENABLE_Msk (1UL /*<< SAU_RLAR_ENABLE_Pos*/) /*!< SAU RLAR: ENABLE Mask */ + +#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */ + +/* Secure Fault Status Register Definitions */ +#define SAU_SFSR_LSERR_Pos 7U /*!< SAU SFSR: LSERR Position */ +#define SAU_SFSR_LSERR_Msk (1UL << SAU_SFSR_LSERR_Pos) /*!< SAU SFSR: LSERR Mask */ + +#define SAU_SFSR_SFARVALID_Pos 6U /*!< SAU SFSR: SFARVALID Position */ +#define SAU_SFSR_SFARVALID_Msk (1UL << SAU_SFSR_SFARVALID_Pos) /*!< SAU SFSR: SFARVALID Mask */ + +#define SAU_SFSR_LSPERR_Pos 5U /*!< SAU SFSR: LSPERR Position */ +#define SAU_SFSR_LSPERR_Msk (1UL << SAU_SFSR_LSPERR_Pos) /*!< SAU SFSR: LSPERR Mask */ + +#define SAU_SFSR_INVTRAN_Pos 4U /*!< SAU SFSR: INVTRAN Position */ +#define SAU_SFSR_INVTRAN_Msk (1UL << SAU_SFSR_INVTRAN_Pos) /*!< SAU SFSR: INVTRAN Mask */ + +#define SAU_SFSR_AUVIOL_Pos 3U /*!< SAU SFSR: AUVIOL Position */ +#define SAU_SFSR_AUVIOL_Msk (1UL << SAU_SFSR_AUVIOL_Pos) /*!< SAU SFSR: AUVIOL Mask */ + +#define SAU_SFSR_INVER_Pos 2U /*!< SAU SFSR: INVER Position */ +#define SAU_SFSR_INVER_Msk (1UL << SAU_SFSR_INVER_Pos) /*!< SAU SFSR: INVER Mask */ + +#define SAU_SFSR_INVIS_Pos 1U /*!< SAU SFSR: INVIS Position */ +#define SAU_SFSR_INVIS_Msk (1UL << SAU_SFSR_INVIS_Pos) /*!< SAU SFSR: INVIS Mask */ + +#define SAU_SFSR_INVEP_Pos 0U /*!< SAU SFSR: INVEP Position */ +#define SAU_SFSR_INVEP_Msk (1UL /*<< SAU_SFSR_INVEP_Pos*/) /*!< SAU SFSR: INVEP Mask */ + +/*@} end of group CMSIS_SAU */ +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_LSPENS_Pos 29U /*!< FPCCR: LSPENS Position */ +#define FPU_FPCCR_LSPENS_Msk (1UL << FPU_FPCCR_LSPENS_Pos) /*!< FPCCR: LSPENS bit Mask */ + +#define FPU_FPCCR_CLRONRET_Pos 28U /*!< FPCCR: CLRONRET Position */ +#define FPU_FPCCR_CLRONRET_Msk (1UL << FPU_FPCCR_CLRONRET_Pos) /*!< FPCCR: CLRONRET bit Mask */ + +#define FPU_FPCCR_CLRONRETS_Pos 27U /*!< FPCCR: CLRONRETS Position */ +#define FPU_FPCCR_CLRONRETS_Msk (1UL << FPU_FPCCR_CLRONRETS_Pos) /*!< FPCCR: CLRONRETS bit Mask */ + +#define FPU_FPCCR_TS_Pos 26U /*!< FPCCR: TS Position */ +#define FPU_FPCCR_TS_Msk (1UL << FPU_FPCCR_TS_Pos) /*!< FPCCR: TS bit Mask */ + +#define FPU_FPCCR_UFRDY_Pos 10U /*!< FPCCR: UFRDY Position */ +#define FPU_FPCCR_UFRDY_Msk (1UL << FPU_FPCCR_UFRDY_Pos) /*!< FPCCR: UFRDY bit Mask */ + +#define FPU_FPCCR_SPLIMVIOL_Pos 9U /*!< FPCCR: SPLIMVIOL Position */ +#define FPU_FPCCR_SPLIMVIOL_Msk (1UL << FPU_FPCCR_SPLIMVIOL_Pos) /*!< FPCCR: SPLIMVIOL bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_SFRDY_Pos 7U /*!< FPCCR: SFRDY Position */ +#define FPU_FPCCR_SFRDY_Msk (1UL << FPU_FPCCR_SFRDY_Pos) /*!< FPCCR: SFRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_S_Pos 2U /*!< FPCCR: Security status of the FP context bit Position */ +#define FPU_FPCCR_S_Msk (1UL << FPU_FPCCR_S_Pos) /*!< FPCCR: Security status of the FP context bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + uint32_t RESERVED4[1U]; + __IOM uint32_t DAUTHCTRL; /*!< Offset: 0x014 (R/W) Debug Authentication Control Register */ + __IOM uint32_t DSCSR; /*!< Offset: 0x018 (R/W) Debug Security Control and Status Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESTART_ST_Pos 26U /*!< CoreDebug DHCSR: S_RESTART_ST Position */ +#define CoreDebug_DHCSR_S_RESTART_ST_Msk (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos) /*!< CoreDebug DHCSR: S_RESTART_ST Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/* Debug Authentication Control Register Definitions */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos 3U /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */ +#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */ + +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos 2U /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos) /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */ + +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos 1U /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */ +#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos) /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */ + +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos 0U /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */ +#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */ + +/* Debug Security Control and Status Register Definitions */ +#define CoreDebug_DSCSR_CDS_Pos 16U /*!< CoreDebug DSCSR: CDS Position */ +#define CoreDebug_DSCSR_CDS_Msk (1UL << CoreDebug_DSCSR_CDS_Pos) /*!< CoreDebug DSCSR: CDS Mask */ + +#define CoreDebug_DSCSR_SBRSEL_Pos 1U /*!< CoreDebug DSCSR: SBRSEL Position */ +#define CoreDebug_DSCSR_SBRSEL_Msk (1UL << CoreDebug_DSCSR_SBRSEL_Pos) /*!< CoreDebug DSCSR: SBRSEL Mask */ + +#define CoreDebug_DSCSR_SBRSELEN_Pos 0U /*!< CoreDebug DSCSR: SBRSELEN Position */ +#define CoreDebug_DSCSR_SBRSELEN_Msk (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/) /*!< CoreDebug DSCSR: SBRSELEN Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ + #define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ + #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ + #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ + #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ + #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ + #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ + #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ + #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + + #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ + #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ + #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ + #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ + #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ + #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ + #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE ) /*!< Core Debug configuration struct */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ + #endif + + #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SAU_BASE (SCS_BASE + 0x0DD0UL) /*!< Security Attribution Unit */ + #define SAU ((SAU_Type *) SAU_BASE ) /*!< Security Attribution Unit */ + #endif + + #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ + #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + #define SCS_BASE_NS (0xE002E000UL) /*!< System Control Space Base Address (non-secure address space) */ + #define CoreDebug_BASE_NS (0xE002EDF0UL) /*!< Core Debug Base Address (non-secure address space) */ + #define SysTick_BASE_NS (SCS_BASE_NS + 0x0010UL) /*!< SysTick Base Address (non-secure address space) */ + #define NVIC_BASE_NS (SCS_BASE_NS + 0x0100UL) /*!< NVIC Base Address (non-secure address space) */ + #define SCB_BASE_NS (SCS_BASE_NS + 0x0D00UL) /*!< System Control Block Base Address (non-secure address space) */ + + #define SCnSCB_NS ((SCnSCB_Type *) SCS_BASE_NS ) /*!< System control Register not in SCB(non-secure address space) */ + #define SCB_NS ((SCB_Type *) SCB_BASE_NS ) /*!< SCB configuration struct (non-secure address space) */ + #define SysTick_NS ((SysTick_Type *) SysTick_BASE_NS ) /*!< SysTick configuration struct (non-secure address space) */ + #define NVIC_NS ((NVIC_Type *) NVIC_BASE_NS ) /*!< NVIC configuration struct (non-secure address space) */ + #define CoreDebug_NS ((CoreDebug_Type *) CoreDebug_BASE_NS) /*!< Core Debug configuration struct (non-secure address space) */ + + #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE_NS (SCS_BASE_NS + 0x0D90UL) /*!< Memory Protection Unit (non-secure address space) */ + #define MPU_NS ((MPU_Type *) MPU_BASE_NS ) /*!< Memory Protection Unit (non-secure address space) */ + #endif + + #define FPU_BASE_NS (SCS_BASE_NS + 0x0F30UL) /*!< Floating Point Unit (non-secure address space) */ + #define FPU_NS ((FPU_Type *) FPU_BASE_NS ) /*!< Floating Point Unit (non-secure address space) */ + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* Special LR values for Secure/Non-Secure call handling and exception handling */ + +/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS */ +#define FNC_RETURN (0xFEFFFFFFUL) /* bit [0] ignored when processing a branch */ + +/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */ +#define EXC_RETURN_PREFIX (0xFF000000UL) /* bits [31:24] set to indicate an EXC_RETURN value */ +#define EXC_RETURN_S (0x00000040UL) /* bit [6] stack used to push registers: 0=Non-secure 1=Secure */ +#define EXC_RETURN_DCRS (0x00000020UL) /* bit [5] stacking rules for called registers: 0=skipped 1=saved */ +#define EXC_RETURN_FTYPE (0x00000010UL) /* bit [4] allocate stack for floating-point context: 0=done 1=skipped */ +#define EXC_RETURN_MODE (0x00000008UL) /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode */ +#define EXC_RETURN_SPSEL (0x00000002UL) /* bit [1] stack pointer used to restore context: 0=MSP 1=PSP */ +#define EXC_RETURN_ES (0x00000001UL) /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */ + +/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking */ +#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) /* Value for processors with floating-point extension: */ +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125AUL) /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE */ +#else +#define EXC_INTEGRITY_SIGNATURE (0xFEFA125BUL) /* Value for processors without floating-point extension */ +#endif + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Get Interrupt Target State + \details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + \return 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Target State + \details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |= ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Clear Interrupt Target State + \details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 if interrupt is assigned to Secure + 1 if interrupt is assigned to Non Secure + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL))); + return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief Set Priority Grouping (non-secure) + \details Sets the non-secure priority grouping field when in secure state using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB_NS->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB_NS->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping (non-secure) + \details Reads the priority grouping field from the non-secure NVIC when in secure state. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void) +{ + return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt (non-secure) + \details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status (non-secure) + \details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt (non-secure) + \details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Pending Interrupt (non-secure) + \details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt (non-secure) + \details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt (non-secure) + \details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt (non-secure) + \details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority (non-secure) + \details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every non-secure processor exception. + */ +__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC_NS->IPR[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority (non-secure) + \details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} +#endif /* defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv8.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## SAU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SAUFunctions SAU Functions + \brief Functions that configure the SAU. + @{ + */ + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) + +/** + \brief Enable SAU + \details Enables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Enable(void) +{ + SAU->CTRL |= (SAU_CTRL_ENABLE_Msk); +} + + + +/** + \brief Disable SAU + \details Disables the Security Attribution Unit (SAU). + */ +__STATIC_INLINE void TZ_SAU_Disable(void) +{ + SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk); +} + +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +/*@} end of CMSIS_Core_SAUFunctions */ + + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) +/** + \brief System Tick Configuration (non-secure) + \details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function TZ_SysTick_Config_NS is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick_NS->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick_NS->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick_NS->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} +#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */ + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM33_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm4.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm4.h new file mode 100644 index 0000000..7d56873 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm4.h @@ -0,0 +1,2129 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM4_H_GENERIC +#define __CORE_CM4_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M4 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (4U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000U + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm7.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm7.h new file mode 100644 index 0000000..a14dc62 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm7.h @@ -0,0 +1,2671 @@ +/**************************************************************************//** + * @file core_cm7.h + * @brief CMSIS Cortex-M7 Core Peripheral Access Layer Header File + * @version V5.0.8 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM7_H_GENERIC +#define __CORE_CM7_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M7 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM7 definitions */ +#define __CM7_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM7_CMSIS_VERSION_SUB ( __CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM7_CMSIS_VERSION ((__CM7_CMSIS_VERSION_MAIN << 16U) | \ + __CM7_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (7U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM7_H_DEPENDANT +#define __CORE_CM7_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM7_REV + #define __CM7_REV 0x0000U + #warning "__CM7_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __ICACHE_PRESENT + #define __ICACHE_PRESENT 0U + #warning "__ICACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DCACHE_PRESENT + #define __DCACHE_PRESENT 0U + #warning "__DCACHE_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __DTCM_PRESENT + #define __DTCM_PRESENT 0U + #warning "__DTCM_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M7 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHPR[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t ID_PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t ID_DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ID_AFR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t ID_MFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ID_ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t CLIDR; /*!< Offset: 0x078 (R/ ) Cache Level ID register */ + __IM uint32_t CTR; /*!< Offset: 0x07C (R/ ) Cache Type register */ + __IM uint32_t CCSIDR; /*!< Offset: 0x080 (R/ ) Cache Size ID Register */ + __IOM uint32_t CSSELR; /*!< Offset: 0x084 (R/W) Cache Size Selection Register */ + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED3[93U]; + __OM uint32_t STIR; /*!< Offset: 0x200 ( /W) Software Triggered Interrupt Register */ + uint32_t RESERVED4[15U]; + __IM uint32_t MVFR0; /*!< Offset: 0x240 (R/ ) Media and VFP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x244 (R/ ) Media and VFP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x248 (R/ ) Media and VFP Feature Register 2 */ + uint32_t RESERVED5[1U]; + __OM uint32_t ICIALLU; /*!< Offset: 0x250 ( /W) I-Cache Invalidate All to PoU */ + uint32_t RESERVED6[1U]; + __OM uint32_t ICIMVAU; /*!< Offset: 0x258 ( /W) I-Cache Invalidate by MVA to PoU */ + __OM uint32_t DCIMVAC; /*!< Offset: 0x25C ( /W) D-Cache Invalidate by MVA to PoC */ + __OM uint32_t DCISW; /*!< Offset: 0x260 ( /W) D-Cache Invalidate by Set-way */ + __OM uint32_t DCCMVAU; /*!< Offset: 0x264 ( /W) D-Cache Clean by MVA to PoU */ + __OM uint32_t DCCMVAC; /*!< Offset: 0x268 ( /W) D-Cache Clean by MVA to PoC */ + __OM uint32_t DCCSW; /*!< Offset: 0x26C ( /W) D-Cache Clean by Set-way */ + __OM uint32_t DCCIMVAC; /*!< Offset: 0x270 ( /W) D-Cache Clean and Invalidate by MVA to PoC */ + __OM uint32_t DCCISW; /*!< Offset: 0x274 ( /W) D-Cache Clean and Invalidate by Set-way */ + uint32_t RESERVED7[6U]; + __IOM uint32_t ITCMCR; /*!< Offset: 0x290 (R/W) Instruction Tightly-Coupled Memory Control Register */ + __IOM uint32_t DTCMCR; /*!< Offset: 0x294 (R/W) Data Tightly-Coupled Memory Control Registers */ + __IOM uint32_t AHBPCR; /*!< Offset: 0x298 (R/W) AHBP Control Register */ + __IOM uint32_t CACR; /*!< Offset: 0x29C (R/W) L1 Cache Control Register */ + __IOM uint32_t AHBSCR; /*!< Offset: 0x2A0 (R/W) AHB Slave Control Register */ + uint32_t RESERVED8[1U]; + __IOM uint32_t ABFSR; /*!< Offset: 0x2A8 (R/W) Auxiliary Bus Fault Status Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_BP_Pos 18U /*!< SCB CCR: Branch prediction enable bit Position */ +#define SCB_CCR_BP_Msk (1UL << SCB_CCR_BP_Pos) /*!< SCB CCR: Branch prediction enable bit Mask */ + +#define SCB_CCR_IC_Pos 17U /*!< SCB CCR: Instruction cache enable bit Position */ +#define SCB_CCR_IC_Msk (1UL << SCB_CCR_IC_Pos) /*!< SCB CCR: Instruction cache enable bit Mask */ + +#define SCB_CCR_DC_Pos 16U /*!< SCB CCR: Cache enable bit Position */ +#define SCB_CCR_DC_Msk (1UL << SCB_CCR_DC_Pos) /*!< SCB CCR: Cache enable bit Mask */ + +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/* SCB Cache Level ID Register Definitions */ +#define SCB_CLIDR_LOUU_Pos 27U /*!< SCB CLIDR: LoUU Position */ +#define SCB_CLIDR_LOUU_Msk (7UL << SCB_CLIDR_LOUU_Pos) /*!< SCB CLIDR: LoUU Mask */ + +#define SCB_CLIDR_LOC_Pos 24U /*!< SCB CLIDR: LoC Position */ +#define SCB_CLIDR_LOC_Msk (7UL << SCB_CLIDR_LOC_Pos) /*!< SCB CLIDR: LoC Mask */ + +/* SCB Cache Type Register Definitions */ +#define SCB_CTR_FORMAT_Pos 29U /*!< SCB CTR: Format Position */ +#define SCB_CTR_FORMAT_Msk (7UL << SCB_CTR_FORMAT_Pos) /*!< SCB CTR: Format Mask */ + +#define SCB_CTR_CWG_Pos 24U /*!< SCB CTR: CWG Position */ +#define SCB_CTR_CWG_Msk (0xFUL << SCB_CTR_CWG_Pos) /*!< SCB CTR: CWG Mask */ + +#define SCB_CTR_ERG_Pos 20U /*!< SCB CTR: ERG Position */ +#define SCB_CTR_ERG_Msk (0xFUL << SCB_CTR_ERG_Pos) /*!< SCB CTR: ERG Mask */ + +#define SCB_CTR_DMINLINE_Pos 16U /*!< SCB CTR: DminLine Position */ +#define SCB_CTR_DMINLINE_Msk (0xFUL << SCB_CTR_DMINLINE_Pos) /*!< SCB CTR: DminLine Mask */ + +#define SCB_CTR_IMINLINE_Pos 0U /*!< SCB CTR: ImInLine Position */ +#define SCB_CTR_IMINLINE_Msk (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/) /*!< SCB CTR: ImInLine Mask */ + +/* SCB Cache Size ID Register Definitions */ +#define SCB_CCSIDR_WT_Pos 31U /*!< SCB CCSIDR: WT Position */ +#define SCB_CCSIDR_WT_Msk (1UL << SCB_CCSIDR_WT_Pos) /*!< SCB CCSIDR: WT Mask */ + +#define SCB_CCSIDR_WB_Pos 30U /*!< SCB CCSIDR: WB Position */ +#define SCB_CCSIDR_WB_Msk (1UL << SCB_CCSIDR_WB_Pos) /*!< SCB CCSIDR: WB Mask */ + +#define SCB_CCSIDR_RA_Pos 29U /*!< SCB CCSIDR: RA Position */ +#define SCB_CCSIDR_RA_Msk (1UL << SCB_CCSIDR_RA_Pos) /*!< SCB CCSIDR: RA Mask */ + +#define SCB_CCSIDR_WA_Pos 28U /*!< SCB CCSIDR: WA Position */ +#define SCB_CCSIDR_WA_Msk (1UL << SCB_CCSIDR_WA_Pos) /*!< SCB CCSIDR: WA Mask */ + +#define SCB_CCSIDR_NUMSETS_Pos 13U /*!< SCB CCSIDR: NumSets Position */ +#define SCB_CCSIDR_NUMSETS_Msk (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos) /*!< SCB CCSIDR: NumSets Mask */ + +#define SCB_CCSIDR_ASSOCIATIVITY_Pos 3U /*!< SCB CCSIDR: Associativity Position */ +#define SCB_CCSIDR_ASSOCIATIVITY_Msk (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos) /*!< SCB CCSIDR: Associativity Mask */ + +#define SCB_CCSIDR_LINESIZE_Pos 0U /*!< SCB CCSIDR: LineSize Position */ +#define SCB_CCSIDR_LINESIZE_Msk (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/) /*!< SCB CCSIDR: LineSize Mask */ + +/* SCB Cache Size Selection Register Definitions */ +#define SCB_CSSELR_LEVEL_Pos 1U /*!< SCB CSSELR: Level Position */ +#define SCB_CSSELR_LEVEL_Msk (7UL << SCB_CSSELR_LEVEL_Pos) /*!< SCB CSSELR: Level Mask */ + +#define SCB_CSSELR_IND_Pos 0U /*!< SCB CSSELR: InD Position */ +#define SCB_CSSELR_IND_Msk (1UL /*<< SCB_CSSELR_IND_Pos*/) /*!< SCB CSSELR: InD Mask */ + +/* SCB Software Triggered Interrupt Register Definitions */ +#define SCB_STIR_INTID_Pos 0U /*!< SCB STIR: INTID Position */ +#define SCB_STIR_INTID_Msk (0x1FFUL /*<< SCB_STIR_INTID_Pos*/) /*!< SCB STIR: INTID Mask */ + +/* SCB D-Cache Invalidate by Set-way Register Definitions */ +#define SCB_DCISW_WAY_Pos 30U /*!< SCB DCISW: Way Position */ +#define SCB_DCISW_WAY_Msk (3UL << SCB_DCISW_WAY_Pos) /*!< SCB DCISW: Way Mask */ + +#define SCB_DCISW_SET_Pos 5U /*!< SCB DCISW: Set Position */ +#define SCB_DCISW_SET_Msk (0x1FFUL << SCB_DCISW_SET_Pos) /*!< SCB DCISW: Set Mask */ + +/* SCB D-Cache Clean by Set-way Register Definitions */ +#define SCB_DCCSW_WAY_Pos 30U /*!< SCB DCCSW: Way Position */ +#define SCB_DCCSW_WAY_Msk (3UL << SCB_DCCSW_WAY_Pos) /*!< SCB DCCSW: Way Mask */ + +#define SCB_DCCSW_SET_Pos 5U /*!< SCB DCCSW: Set Position */ +#define SCB_DCCSW_SET_Msk (0x1FFUL << SCB_DCCSW_SET_Pos) /*!< SCB DCCSW: Set Mask */ + +/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */ +#define SCB_DCCISW_WAY_Pos 30U /*!< SCB DCCISW: Way Position */ +#define SCB_DCCISW_WAY_Msk (3UL << SCB_DCCISW_WAY_Pos) /*!< SCB DCCISW: Way Mask */ + +#define SCB_DCCISW_SET_Pos 5U /*!< SCB DCCISW: Set Position */ +#define SCB_DCCISW_SET_Msk (0x1FFUL << SCB_DCCISW_SET_Pos) /*!< SCB DCCISW: Set Mask */ + +/* Instruction Tightly-Coupled Memory Control Register Definitions */ +#define SCB_ITCMCR_SZ_Pos 3U /*!< SCB ITCMCR: SZ Position */ +#define SCB_ITCMCR_SZ_Msk (0xFUL << SCB_ITCMCR_SZ_Pos) /*!< SCB ITCMCR: SZ Mask */ + +#define SCB_ITCMCR_RETEN_Pos 2U /*!< SCB ITCMCR: RETEN Position */ +#define SCB_ITCMCR_RETEN_Msk (1UL << SCB_ITCMCR_RETEN_Pos) /*!< SCB ITCMCR: RETEN Mask */ + +#define SCB_ITCMCR_RMW_Pos 1U /*!< SCB ITCMCR: RMW Position */ +#define SCB_ITCMCR_RMW_Msk (1UL << SCB_ITCMCR_RMW_Pos) /*!< SCB ITCMCR: RMW Mask */ + +#define SCB_ITCMCR_EN_Pos 0U /*!< SCB ITCMCR: EN Position */ +#define SCB_ITCMCR_EN_Msk (1UL /*<< SCB_ITCMCR_EN_Pos*/) /*!< SCB ITCMCR: EN Mask */ + +/* Data Tightly-Coupled Memory Control Register Definitions */ +#define SCB_DTCMCR_SZ_Pos 3U /*!< SCB DTCMCR: SZ Position */ +#define SCB_DTCMCR_SZ_Msk (0xFUL << SCB_DTCMCR_SZ_Pos) /*!< SCB DTCMCR: SZ Mask */ + +#define SCB_DTCMCR_RETEN_Pos 2U /*!< SCB DTCMCR: RETEN Position */ +#define SCB_DTCMCR_RETEN_Msk (1UL << SCB_DTCMCR_RETEN_Pos) /*!< SCB DTCMCR: RETEN Mask */ + +#define SCB_DTCMCR_RMW_Pos 1U /*!< SCB DTCMCR: RMW Position */ +#define SCB_DTCMCR_RMW_Msk (1UL << SCB_DTCMCR_RMW_Pos) /*!< SCB DTCMCR: RMW Mask */ + +#define SCB_DTCMCR_EN_Pos 0U /*!< SCB DTCMCR: EN Position */ +#define SCB_DTCMCR_EN_Msk (1UL /*<< SCB_DTCMCR_EN_Pos*/) /*!< SCB DTCMCR: EN Mask */ + +/* AHBP Control Register Definitions */ +#define SCB_AHBPCR_SZ_Pos 1U /*!< SCB AHBPCR: SZ Position */ +#define SCB_AHBPCR_SZ_Msk (7UL << SCB_AHBPCR_SZ_Pos) /*!< SCB AHBPCR: SZ Mask */ + +#define SCB_AHBPCR_EN_Pos 0U /*!< SCB AHBPCR: EN Position */ +#define SCB_AHBPCR_EN_Msk (1UL /*<< SCB_AHBPCR_EN_Pos*/) /*!< SCB AHBPCR: EN Mask */ + +/* L1 Cache Control Register Definitions */ +#define SCB_CACR_FORCEWT_Pos 2U /*!< SCB CACR: FORCEWT Position */ +#define SCB_CACR_FORCEWT_Msk (1UL << SCB_CACR_FORCEWT_Pos) /*!< SCB CACR: FORCEWT Mask */ + +#define SCB_CACR_ECCEN_Pos 1U /*!< SCB CACR: ECCEN Position */ +#define SCB_CACR_ECCEN_Msk (1UL << SCB_CACR_ECCEN_Pos) /*!< SCB CACR: ECCEN Mask */ + +#define SCB_CACR_SIWT_Pos 0U /*!< SCB CACR: SIWT Position */ +#define SCB_CACR_SIWT_Msk (1UL /*<< SCB_CACR_SIWT_Pos*/) /*!< SCB CACR: SIWT Mask */ + +/* AHBS Control Register Definitions */ +#define SCB_AHBSCR_INITCOUNT_Pos 11U /*!< SCB AHBSCR: INITCOUNT Position */ +#define SCB_AHBSCR_INITCOUNT_Msk (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos) /*!< SCB AHBSCR: INITCOUNT Mask */ + +#define SCB_AHBSCR_TPRI_Pos 2U /*!< SCB AHBSCR: TPRI Position */ +#define SCB_AHBSCR_TPRI_Msk (0x1FFUL << SCB_AHBPCR_TPRI_Pos) /*!< SCB AHBSCR: TPRI Mask */ + +#define SCB_AHBSCR_CTL_Pos 0U /*!< SCB AHBSCR: CTL Position*/ +#define SCB_AHBSCR_CTL_Msk (3UL /*<< SCB_AHBPCR_CTL_Pos*/) /*!< SCB AHBSCR: CTL Mask */ + +/* Auxiliary Bus Fault Status Register Definitions */ +#define SCB_ABFSR_AXIMTYPE_Pos 8U /*!< SCB ABFSR: AXIMTYPE Position*/ +#define SCB_ABFSR_AXIMTYPE_Msk (3UL << SCB_ABFSR_AXIMTYPE_Pos) /*!< SCB ABFSR: AXIMTYPE Mask */ + +#define SCB_ABFSR_EPPB_Pos 4U /*!< SCB ABFSR: EPPB Position*/ +#define SCB_ABFSR_EPPB_Msk (1UL << SCB_ABFSR_EPPB_Pos) /*!< SCB ABFSR: EPPB Mask */ + +#define SCB_ABFSR_AXIM_Pos 3U /*!< SCB ABFSR: AXIM Position*/ +#define SCB_ABFSR_AXIM_Msk (1UL << SCB_ABFSR_AXIM_Pos) /*!< SCB ABFSR: AXIM Mask */ + +#define SCB_ABFSR_AHBP_Pos 2U /*!< SCB ABFSR: AHBP Position*/ +#define SCB_ABFSR_AHBP_Msk (1UL << SCB_ABFSR_AHBP_Pos) /*!< SCB ABFSR: AHBP Mask */ + +#define SCB_ABFSR_DTCM_Pos 1U /*!< SCB ABFSR: DTCM Position*/ +#define SCB_ABFSR_DTCM_Msk (1UL << SCB_ABFSR_DTCM_Pos) /*!< SCB ABFSR: DTCM Mask */ + +#define SCB_ABFSR_ITCM_Pos 0U /*!< SCB ABFSR: ITCM Position*/ +#define SCB_ABFSR_ITCM_Msk (1UL /*<< SCB_ABFSR_ITCM_Pos*/) /*!< SCB ABFSR: ITCM Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos 12U /*!< ACTLR: DISITMATBFLUSH Position */ +#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos) /*!< ACTLR: DISITMATBFLUSH Mask */ + +#define SCnSCB_ACTLR_DISRAMODE_Pos 11U /*!< ACTLR: DISRAMODE Position */ +#define SCnSCB_ACTLR_DISRAMODE_Msk (1UL << SCnSCB_ACTLR_DISRAMODE_Pos) /*!< ACTLR: DISRAMODE Mask */ + +#define SCnSCB_ACTLR_FPEXCODIS_Pos 10U /*!< ACTLR: FPEXCODIS Position */ +#define SCnSCB_ACTLR_FPEXCODIS_Msk (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos) /*!< ACTLR: FPEXCODIS Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + uint32_t RESERVED3[981U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( W) Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R ) Lock Status Register */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ + __IM uint32_t MVFR2; /*!< Offset: 0x018 (R/ ) Media and FP Feature Register 2 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/* Media and FP Feature Register 2 Definitions */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ +#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */ +#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */ + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = SCB->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U) + { + return 2U; /* Double + Single precision FPU */ + } + else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ########################## Cache functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_CacheFunctions Cache Functions + \brief Functions that configure Instruction and Data cache. + @{ + */ + +/* Cache Size ID Register Macros */ +#define CCSIDR_WAYS(x) (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos) +#define CCSIDR_SETS(x) (((x) & SCB_CCSIDR_NUMSETS_Msk ) >> SCB_CCSIDR_NUMSETS_Pos ) + + +/** + \brief Enable I-Cache + \details Turns on I-Cache + */ +__STATIC_INLINE void SCB_EnableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + SCB->CCR |= (uint32_t)SCB_CCR_IC_Msk; /* enable I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable I-Cache + \details Turns off I-Cache + */ +__STATIC_INLINE void SCB_DisableICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk; /* disable I-Cache */ + SCB->ICIALLU = 0UL; /* invalidate I-Cache */ + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate I-Cache + \details Invalidates I-Cache + */ +__STATIC_INLINE void SCB_InvalidateICache (void) +{ + #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U) + __DSB(); + __ISB(); + SCB->ICIALLU = 0UL; + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Enable D-Cache + \details Turns on D-Cache + */ +__STATIC_INLINE void SCB_EnableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + __DSB(); + + SCB->CCR |= (uint32_t)SCB_CCR_DC_Msk; /* enable D-Cache */ + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Disable D-Cache + \details Turns off D-Cache + */ +__STATIC_INLINE void SCB_DisableDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk; /* disable D-Cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Invalidate D-Cache + \details Invalidates D-Cache + */ +__STATIC_INLINE void SCB_InvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) | + ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean D-Cache + \details Cleans D-Cache + */ +__STATIC_INLINE void SCB_CleanDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) | + ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief Clean & Invalidate D-Cache + \details Cleans and Invalidates D-Cache + */ +__STATIC_INLINE void SCB_CleanInvalidateDCache (void) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + uint32_t ccsidr; + uint32_t sets; + uint32_t ways; + + SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/ /* Level 1 data cache */ + __DSB(); + + ccsidr = SCB->CCSIDR; + + /* clean & invalidate D-Cache */ + sets = (uint32_t)(CCSIDR_SETS(ccsidr)); + do { + ways = (uint32_t)(CCSIDR_WAYS(ccsidr)); + do { + SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) | + ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk) ); + #if defined ( __CC_ARM ) + __schedule_barrier(); + #endif + } while (ways-- != 0U); + } while(sets-- != 0U); + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Invalidate by address + \details Invalidates D-Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t)addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean by address + \details Cleans D-Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/** + \brief D-Cache Clean and Invalidate by address + \details Cleans and invalidates D_Cache for the given address + \param[in] addr address (aligned to 32-byte boundary) + \param[in] dsize size of memory block (in number of bytes) +*/ +__STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize) +{ + #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U) + int32_t op_size = dsize; + uint32_t op_addr = (uint32_t) addr; + int32_t linesize = 32; /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */ + + __DSB(); + + while (op_size > 0) { + SCB->DCCIMVAC = op_addr; + op_addr += (uint32_t)linesize; + op_size -= linesize; + } + + __DSB(); + __ISB(); + #endif +} + + +/*@} end of CMSIS_Core_CacheFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM7_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc000.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc000.h new file mode 100644 index 0000000..9b67c92 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc000.h @@ -0,0 +1,1022 @@ +/**************************************************************************//** + * @file core_sc000.h + * @brief CMSIS SC000 Core Peripheral Access Layer Header File + * @version V5.0.5 + * @date 28. May 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC000_H_GENERIC +#define __CORE_SC000_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC000 definitions */ +#define __SC000_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC000_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC000_CMSIS_VERSION ((__SC000_CMSIS_VERSION_MAIN << 16U) | \ + __SC000_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (000U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC000_H_DEPENDANT +#define __CORE_SC000_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC000_REV + #define __SC000_REV 0x0000U + #warning "__SC000_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 2U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC000 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t _reserved0:1; /*!< bit: 0 Reserved */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[31U]; + __IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[31U]; + __IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[31U]; + __IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[31U]; + uint32_t RESERVED4[64U]; + __IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */ +} NVIC_Type; + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + uint32_t RESERVED0[1U]; + __IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + uint32_t RESERVED1[154U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 8U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0xFFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor. + Therefore they are not covered by the SC000 header file. + @{ + */ +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else +/*#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping not available for SC000 */ +/*#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping not available for SC000 */ + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +/*#define NVIC_GetActive __NVIC_GetActive not available for SC000 */ + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + +/* Interrupt Priorities are WORD accessible only under Armv6-M */ +/* The following MACROS handle generation of the register offset and byte masks */ +#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL) +#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) ) +#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) ) + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } + else + { + SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) | + (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn))); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + SCB_AIRCR_SYSRESETREQ_Msk); + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC000_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc300.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc300.h new file mode 100644 index 0000000..3e8a471 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc300.h @@ -0,0 +1,1915 @@ +/**************************************************************************//** + * @file core_sc300.h + * @brief CMSIS SC300 Core Peripheral Access Layer Header File + * @version V5.0.6 + * @date 04. June 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_SC300_H_GENERIC +#define __CORE_SC300_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
    + Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
    + Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup SC3000 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS SC300 definitions */ +#define __SC300_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __SC300_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __SC300_CMSIS_VERSION ((__SC300_CMSIS_VERSION_MAIN << 16U) | \ + __SC300_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_SC (300U) /*!< Cortex secure core */ + +/** __FPU_USED indicates whether an FPU is used or not. + This core does not support an FPU at all +*/ +#define __FPU_USED 0U + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_SC300_H_DEPENDANT +#define __CORE_SC300_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __SC300_REV + #define __SC300_REV 0x0000U + #warning "__SC300_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group SC300 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + uint32_t RESERVED1[129U]; + __IOM uint32_t SFCR; /*!< Offset: 0x290 (R/W) Security Features Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLBASE_Pos 29U /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + uint32_t RESERVED1[1U]; +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITATBCTR2: ATREADY2 Position */ +#define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITATBCTR2: ATREADY2 Mask */ + +#define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITATBCTR2: ATREADY1 Position */ +#define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITATBCTR2: ATREADY1 Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITATBCTR0: ATREADY2 Position */ +#define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITATBCTR0: ATREADY2 Mask */ + +#define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITATBCTR0: ATREADY1 Position */ +#define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITATBCTR0: ATREADY1 Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + +/* The following EXC_RETURN values are saved the LR on exception entry */ +#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */ +#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */ +#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */ + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + return 0U; /* No FPU */ +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_SC300_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv7.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv7.h new file mode 100644 index 0000000..0142203 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv7.h @@ -0,0 +1,270 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for Armv7-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes + +#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access +#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only +#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only +#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access +#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only +#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Memory Access Attributes +* +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +*/ +#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \ + ((((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk)) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \ + ((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((AccessAttributes) ) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk))) + +/** +* MPU Region Attribute and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size) + +/** +* MPU Memory Access Attribute for strongly ordered memory. +* - TEX: 000b +* - Shareable +* - Non-cacheable +* - Non-bufferable +*/ +#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U) + +/** +* MPU Memory Access Attribute for device memory. +* - TEX: 000b (if non-shareable) or 010b (if shareable) +* - Shareable or non-shareable +* - Non-cacheable +* - Bufferable (if shareable) or non-bufferable (if non-shareable) +* +* \param IsShareable Configures the device memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U)) + +/** +* MPU Memory Access Attribute for normal memory. +* - TEX: 1BBb (reflecting outer cacheability rules) +* - Shareable or non-shareable +* - Cacheable or non-cacheable (reflecting inner cacheability rules) +* - Bufferable or non-bufferable (reflecting inner cacheability rules) +* +* \param OuterCp Configures the outer cache policy. +* \param InnerCp Configures the inner cache policy. +* \param IsShareable Configures the memory as shareable or non-shareable. +*/ +#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U)) + +/** +* MPU Memory Access Attribute non-cacheable policy. +*/ +#define ARM_MPU_CACHEP_NOCACHE 0U + +/** +* MPU Memory Access Attribute write-back, write and read allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_WRA 1U + +/** +* MPU Memory Access Attribute write-through, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WT_NWA 2U + +/** +* MPU Memory Access Attribute write-back, no write allocate policy. +*/ +#define ARM_MPU_CACHEP_WB_NWA 3U + + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv8.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv8.h new file mode 100644 index 0000000..62571da --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv8.h @@ -0,0 +1,333 @@ +/****************************************************************************** + * @file mpu_armv8.h + * @brief CMSIS MPU API for Armv8-M MPU + * @version V5.0.4 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV8_H +#define ARM_MPU_ARMV8_H + +/** \brief Attribute for device memory (outer only) */ +#define ARM_MPU_ATTR_DEVICE ( 0U ) + +/** \brief Attribute for non-cacheable, normal memory */ +#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U ) + +/** \brief Attribute for normal memory (outer and inner) +* \param NT Non-Transient: Set to 1 for non-transient data. +* \param WB Write-Back: Set to 1 to use write-back update policy. +* \param RA Read Allocation: Set to 1 to use cache allocation on read miss. +* \param WA Write Allocation: Set to 1 to use cache allocation on write miss. +*/ +#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \ + (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U)) + +/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U) + +/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGnRE (1U) + +/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_nGRE (2U) + +/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */ +#define ARM_MPU_ATTR_DEVICE_GRE (3U) + +/** \brief Memory Attribute +* \param O Outer memory attributes +* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes +*/ +#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U))) + +/** \brief Normal memory non-shareable */ +#define ARM_MPU_SH_NON (0U) + +/** \brief Normal memory outer shareable */ +#define ARM_MPU_SH_OUTER (2U) + +/** \brief Normal memory inner shareable */ +#define ARM_MPU_SH_INNER (3U) + +/** \brief Memory access permissions +* \param RO Read-Only: Set to 1 for read-only memory. +* \param NP Non-Privileged: Set to 1 for non-privileged memory. +*/ +#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U)) + +/** \brief Region Base Address Register value +* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned. +* \param SH Defines the Shareability domain for this memory region. +* \param RO Read-Only: Set to 1 for a read-only memory region. +* \param NP Non-Privileged: Set to 1 for a non-privileged memory region. +* \oaram XN eXecute Never: Set to 1 for a non-executable memory region. +*/ +#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \ + ((BASE & MPU_RBAR_BASE_Msk) | \ + ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \ + ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \ + ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk)) + +/** \brief Region Limit Address Register value +* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended. +* \param IDX The attribute index to be associated with this memory region. +*/ +#define ARM_MPU_RLAR(LIMIT, IDX) \ + ((LIMIT & MPU_RLAR_LIMIT_Msk) | \ + ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \ + (MPU_RLAR_EN_Msk)) + +/** +* Struct for a single MPU Region +*/ +typedef struct { + uint32_t RBAR; /*!< Region Base Address Register value */ + uint32_t RLAR; /*!< Region Limit Address Register value */ +} ARM_MPU_Region_t; + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +#ifdef MPU_NS +/** Enable the Non-secure MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the Non-secure MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable_NS(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} +#endif + +/** Set the memory attribute encoding to the given MPU. +* \param mpu Pointer to the MPU to be configured. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr) +{ + const uint8_t reg = idx / 4U; + const uint32_t pos = ((idx % 4U) * 8U); + const uint32_t mask = 0xFFU << pos; + + if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) { + return; // invalid index + } + + mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask)); +} + +/** Set the memory attribute encoding. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU, idx, attr); +} + +#ifdef MPU_NS +/** Set the memory attribute encoding to the Non-secure MPU. +* \param idx The attribute index to be set [0-7] +* \param attr The attribute value to be set. +*/ +__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr) +{ + ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr); +} +#endif + +/** Clear and disable the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr) +{ + mpu->RNR = rnr; + mpu->RLAR = 0U; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU, rnr); +} + +#ifdef MPU_NS +/** Clear and disable the given Non-secure MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr) +{ + ARM_MPU_ClrRegionEx(MPU_NS, rnr); +} +#endif + +/** Configure the given MPU region of the given MPU. +* \param mpu Pointer to MPU to be used. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + mpu->RNR = rnr; + mpu->RBAR = rbar; + mpu->RLAR = rlar; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar); +} + +#ifdef MPU_NS +/** Configure the given Non-secure MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rlar Value for RLAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar) +{ + ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar); +} +#endif + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table to the given MPU. +* \param mpu Pointer to the MPU registers to be used. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + if (cnt == 1U) { + mpu->RNR = rnr; + orderedCpy(&(mpu->RBAR), &(table->RBAR), rowWordSize); + } else { + uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U); + uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES; + + mpu->RNR = rnrBase; + while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) { + uint32_t c = MPU_TYPE_RALIASES - rnrOffset; + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize); + table += c; + cnt -= c; + rnrOffset = 0U; + rnrBase += MPU_TYPE_RALIASES; + mpu->RNR = rnrBase; + } + + orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize); + } +} + +/** Load the given number of MPU regions from a table. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU, rnr, table, cnt); +} + +#ifdef MPU_NS +/** Load the given number of MPU regions from a table to the Non-secure MPU. +* \param rnr First region number to be configured. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) +{ + ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt); +} +#endif + +#endif + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/tz_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/tz_context.h new file mode 100644 index 0000000..0d09749 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/tz_context.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * @file tz_context.h + * @brief Context Management for Armv8-M TrustZone + * @version V1.0.1 + * @date 10. January 2018 + ******************************************************************************/ +/* + * Copyright (c) 2017-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef TZ_CONTEXT_H +#define TZ_CONTEXT_H + +#include + +#ifndef TZ_MODULEID_T +#define TZ_MODULEID_T +/// \details Data type that identifies secure software modules called by a process. +typedef uint32_t TZ_ModuleId_t; +#endif + +/// \details TZ Memory ID identifies an allocated memory slot. +typedef uint32_t TZ_MemoryId_t; + +/// Initialize secure context memory system +/// \return execution status (1: success, 0: error) +uint32_t TZ_InitContextSystem_S (void); + +/// Allocate context memory for calling secure software modules in TrustZone +/// \param[in] module identifies software modules called from non-secure mode +/// \return value != 0 id TrustZone memory slot identifier +/// \return value 0 no memory available or internal error +TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module); + +/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id); + +/// Load secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_LoadContext_S (TZ_MemoryId_t id); + +/// Store secure context (called on RTOS thread context switch) +/// \param[in] id TrustZone memory slot identifier +/// \return execution status (1: success, 0: error) +uint32_t TZ_StoreContext_S (TZ_MemoryId_t id); + +#endif // TZ_CONTEXT_H diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/LICENSE.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/LICENSE.txt new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h new file mode 100644 index 0000000..934f1f9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -0,0 +1,4014 @@ +/** + ****************************************************************************** + * @file stm32_hal_legacy.h + * @author MCD Application Team + * @brief This file contains aliases definition for the STM32Cube HAL constants + * macros and functions maintained for legacy purpose. + ****************************************************************************** + * @attention + * + * Copyright (c) 2021 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32_HAL_LEGACY +#define STM32_HAL_LEGACY + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup HAL_AES_Aliased_Defines HAL CRYP Aliased Defines maintained for legacy purpose + * @{ + */ +#define AES_FLAG_RDERR CRYP_FLAG_RDERR +#define AES_FLAG_WRERR CRYP_FLAG_WRERR +#define AES_CLEARFLAG_CCF CRYP_CLEARFLAG_CCF +#define AES_CLEARFLAG_RDERR CRYP_CLEARFLAG_RDERR +#define AES_CLEARFLAG_WRERR CRYP_CLEARFLAG_WRERR +#if defined(STM32U5) || defined(STM32H7) || defined(STM32MP1) +#define CRYP_DATATYPE_32B CRYP_NO_SWAP +#define CRYP_DATATYPE_16B CRYP_HALFWORD_SWAP +#define CRYP_DATATYPE_8B CRYP_BYTE_SWAP +#define CRYP_DATATYPE_1B CRYP_BIT_SWAP +#if defined(STM32U5) +#define CRYP_CCF_CLEAR CRYP_CLEAR_CCF +#define CRYP_ERR_CLEAR CRYP_CLEAR_RWEIF +#endif /* STM32U5 */ +#endif /* STM32U5 || STM32H7 || STM32MP1 */ +/** + * @} + */ + +/** @defgroup HAL_ADC_Aliased_Defines HAL ADC Aliased Defines maintained for legacy purpose + * @{ + */ +#define ADC_RESOLUTION12b ADC_RESOLUTION_12B +#define ADC_RESOLUTION10b ADC_RESOLUTION_10B +#define ADC_RESOLUTION8b ADC_RESOLUTION_8B +#define ADC_RESOLUTION6b ADC_RESOLUTION_6B +#define OVR_DATA_OVERWRITTEN ADC_OVR_DATA_OVERWRITTEN +#define OVR_DATA_PRESERVED ADC_OVR_DATA_PRESERVED +#define EOC_SINGLE_CONV ADC_EOC_SINGLE_CONV +#define EOC_SEQ_CONV ADC_EOC_SEQ_CONV +#define EOC_SINGLE_SEQ_CONV ADC_EOC_SINGLE_SEQ_CONV +#define REGULAR_GROUP ADC_REGULAR_GROUP +#define INJECTED_GROUP ADC_INJECTED_GROUP +#define REGULAR_INJECTED_GROUP ADC_REGULAR_INJECTED_GROUP +#define AWD_EVENT ADC_AWD_EVENT +#define AWD1_EVENT ADC_AWD1_EVENT +#define AWD2_EVENT ADC_AWD2_EVENT +#define AWD3_EVENT ADC_AWD3_EVENT +#define OVR_EVENT ADC_OVR_EVENT +#define JQOVF_EVENT ADC_JQOVF_EVENT +#define ALL_CHANNELS ADC_ALL_CHANNELS +#define REGULAR_CHANNELS ADC_REGULAR_CHANNELS +#define INJECTED_CHANNELS ADC_INJECTED_CHANNELS +#define SYSCFG_FLAG_SENSOR_ADC ADC_FLAG_SENSOR +#define SYSCFG_FLAG_VREF_ADC ADC_FLAG_VREFINT +#define ADC_CLOCKPRESCALER_PCLK_DIV1 ADC_CLOCK_SYNC_PCLK_DIV1 +#define ADC_CLOCKPRESCALER_PCLK_DIV2 ADC_CLOCK_SYNC_PCLK_DIV2 +#define ADC_CLOCKPRESCALER_PCLK_DIV4 ADC_CLOCK_SYNC_PCLK_DIV4 +#define ADC_CLOCKPRESCALER_PCLK_DIV6 ADC_CLOCK_SYNC_PCLK_DIV6 +#define ADC_CLOCKPRESCALER_PCLK_DIV8 ADC_CLOCK_SYNC_PCLK_DIV8 +#define ADC_EXTERNALTRIG0_T6_TRGO ADC_EXTERNALTRIGCONV_T6_TRGO +#define ADC_EXTERNALTRIG1_T21_CC2 ADC_EXTERNALTRIGCONV_T21_CC2 +#define ADC_EXTERNALTRIG2_T2_TRGO ADC_EXTERNALTRIGCONV_T2_TRGO +#define ADC_EXTERNALTRIG3_T2_CC4 ADC_EXTERNALTRIGCONV_T2_CC4 +#define ADC_EXTERNALTRIG4_T22_TRGO ADC_EXTERNALTRIGCONV_T22_TRGO +#define ADC_EXTERNALTRIG7_EXT_IT11 ADC_EXTERNALTRIGCONV_EXT_IT11 +#define ADC_CLOCK_ASYNC ADC_CLOCK_ASYNC_DIV1 +#define ADC_EXTERNALTRIG_EDGE_NONE ADC_EXTERNALTRIGCONVEDGE_NONE +#define ADC_EXTERNALTRIG_EDGE_RISING ADC_EXTERNALTRIGCONVEDGE_RISING +#define ADC_EXTERNALTRIG_EDGE_FALLING ADC_EXTERNALTRIGCONVEDGE_FALLING +#define ADC_EXTERNALTRIG_EDGE_RISINGFALLING ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING +#define ADC_SAMPLETIME_2CYCLE_5 ADC_SAMPLETIME_2CYCLES_5 + +#define HAL_ADC_STATE_BUSY_REG HAL_ADC_STATE_REG_BUSY +#define HAL_ADC_STATE_BUSY_INJ HAL_ADC_STATE_INJ_BUSY +#define HAL_ADC_STATE_EOC_REG HAL_ADC_STATE_REG_EOC +#define HAL_ADC_STATE_EOC_INJ HAL_ADC_STATE_INJ_EOC +#define HAL_ADC_STATE_ERROR HAL_ADC_STATE_ERROR_INTERNAL +#define HAL_ADC_STATE_BUSY HAL_ADC_STATE_BUSY_INTERNAL +#define HAL_ADC_STATE_AWD HAL_ADC_STATE_AWD1 + +#if defined(STM32H7) +#define ADC_CHANNEL_VBAT_DIV4 ADC_CHANNEL_VBAT +#endif /* STM32H7 */ + +#if defined(STM32U5) +#define ADC_SAMPLETIME_5CYCLE ADC_SAMPLETIME_5CYCLES +#define ADC_SAMPLETIME_391CYCLES_5 ADC_SAMPLETIME_391CYCLES +#define ADC4_SAMPLETIME_160CYCLES_5 ADC4_SAMPLETIME_814CYCLES_5 +#endif /* STM32U5 */ + +/** + * @} + */ + +/** @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 +#if defined(STM32U5) +#define MPU_DEVICE_nGnRnE MPU_DEVICE_NGNRNE +#define MPU_DEVICE_nGnRE MPU_DEVICE_NGNRE +#define MPU_DEVICE_nGRE MPU_DEVICE_NGRE +#endif /* STM32U5 */ +/** + * @} + */ + +/** @defgroup CRC_Aliases CRC API aliases + * @{ + */ +#if defined(STM32C0) +#else +#define HAL_CRC_Input_Data_Reverse HAL_CRCEx_Input_Data_Reverse /*!< Aliased to HAL_CRCEx_Input_Data_Reverse for inter STM32 series compatibility */ +#define HAL_CRC_Output_Data_Reverse HAL_CRCEx_Output_Data_Reverse /*!< Aliased to HAL_CRCEx_Output_Data_Reverse for inter STM32 series compatibility */ +#endif +/** + * @} + */ + +/** @defgroup HAL_CRC_Aliased_Defines HAL CRC Aliased Defines maintained for legacy purpose + * @{ + */ + +#define CRC_OUTPUTDATA_INVERSION_DISABLED CRC_OUTPUTDATA_INVERSION_DISABLE +#define CRC_OUTPUTDATA_INVERSION_ENABLED CRC_OUTPUTDATA_INVERSION_ENABLE + +/** + * @} + */ + +/** @defgroup HAL_DAC_Aliased_Defines HAL DAC Aliased Defines maintained for legacy purpose + * @{ + */ + +#define DAC1_CHANNEL_1 DAC_CHANNEL_1 +#define DAC1_CHANNEL_2 DAC_CHANNEL_2 +#define DAC2_CHANNEL_1 DAC_CHANNEL_1 +#define DAC_WAVE_NONE 0x00000000U +#define DAC_WAVE_NOISE DAC_CR_WAVE1_0 +#define DAC_WAVE_TRIANGLE DAC_CR_WAVE1_1 +#define DAC_WAVEGENERATION_NONE DAC_WAVE_NONE +#define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE +#define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE + +#if defined(STM32G4) || defined(STM32H7) || defined (STM32U5) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32U5) +#define DAC_TRIGGER_STOP_LPTIM1_OUT DAC_TRIGGER_STOP_LPTIM1_CH1 +#define DAC_TRIGGER_STOP_LPTIM3_OUT DAC_TRIGGER_STOP_LPTIM3_CH1 +#define DAC_TRIGGER_LPTIM1_OUT DAC_TRIGGER_LPTIM1_CH1 +#define DAC_TRIGGER_LPTIM3_OUT DAC_TRIGGER_LPTIM3_CH1 +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) || defined(STM32G4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + +/** + * @} + */ + +/** @defgroup HAL_DMA_Aliased_Defines HAL DMA Aliased Defines maintained for legacy purpose + * @{ + */ +#define HAL_REMAPDMA_ADC_DMA_CH2 DMA_REMAP_ADC_DMA_CH2 +#define HAL_REMAPDMA_USART1_TX_DMA_CH4 DMA_REMAP_USART1_TX_DMA_CH4 +#define HAL_REMAPDMA_USART1_RX_DMA_CH5 DMA_REMAP_USART1_RX_DMA_CH5 +#define HAL_REMAPDMA_TIM16_DMA_CH4 DMA_REMAP_TIM16_DMA_CH4 +#define HAL_REMAPDMA_TIM17_DMA_CH2 DMA_REMAP_TIM17_DMA_CH2 +#define HAL_REMAPDMA_USART3_DMA_CH32 DMA_REMAP_USART3_DMA_CH32 +#define HAL_REMAPDMA_TIM16_DMA_CH6 DMA_REMAP_TIM16_DMA_CH6 +#define HAL_REMAPDMA_TIM17_DMA_CH7 DMA_REMAP_TIM17_DMA_CH7 +#define HAL_REMAPDMA_SPI2_DMA_CH67 DMA_REMAP_SPI2_DMA_CH67 +#define HAL_REMAPDMA_USART2_DMA_CH67 DMA_REMAP_USART2_DMA_CH67 +#define HAL_REMAPDMA_I2C1_DMA_CH76 DMA_REMAP_I2C1_DMA_CH76 +#define HAL_REMAPDMA_TIM1_DMA_CH6 DMA_REMAP_TIM1_DMA_CH6 +#define HAL_REMAPDMA_TIM2_DMA_CH7 DMA_REMAP_TIM2_DMA_CH7 +#define HAL_REMAPDMA_TIM3_DMA_CH6 DMA_REMAP_TIM3_DMA_CH6 + +#define IS_HAL_REMAPDMA IS_DMA_REMAP +#define __HAL_REMAPDMA_CHANNEL_ENABLE __HAL_DMA_REMAP_CHANNEL_ENABLE +#define __HAL_REMAPDMA_CHANNEL_DISABLE __HAL_DMA_REMAP_CHANNEL_DISABLE + +#if defined(STM32L4) + +#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI1 HAL_DMAMUX1_REQ_GEN_EXTI1 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI2 HAL_DMAMUX1_REQ_GEN_EXTI2 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI3 HAL_DMAMUX1_REQ_GEN_EXTI3 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI4 HAL_DMAMUX1_REQ_GEN_EXTI4 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI5 HAL_DMAMUX1_REQ_GEN_EXTI5 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI6 HAL_DMAMUX1_REQ_GEN_EXTI6 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI7 HAL_DMAMUX1_REQ_GEN_EXTI7 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI8 HAL_DMAMUX1_REQ_GEN_EXTI8 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI9 HAL_DMAMUX1_REQ_GEN_EXTI9 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI10 HAL_DMAMUX1_REQ_GEN_EXTI10 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI11 HAL_DMAMUX1_REQ_GEN_EXTI11 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI12 HAL_DMAMUX1_REQ_GEN_EXTI12 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI13 HAL_DMAMUX1_REQ_GEN_EXTI13 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI14 HAL_DMAMUX1_REQ_GEN_EXTI14 +#define HAL_DMAMUX1_REQUEST_GEN_EXTI15 HAL_DMAMUX1_REQ_GEN_EXTI15 +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH3_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH3_EVT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT +#define HAL_DMAMUX1_REQUEST_GEN_DSI_TE HAL_DMAMUX1_REQ_GEN_DSI_TE +#define HAL_DMAMUX1_REQUEST_GEN_DSI_EOT HAL_DMAMUX1_REQ_GEN_DSI_EOT +#define HAL_DMAMUX1_REQUEST_GEN_DMA2D_EOT HAL_DMAMUX1_REQ_GEN_DMA2D_EOT +#define HAL_DMAMUX1_REQUEST_GEN_LTDC_IT HAL_DMAMUX1_REQ_GEN_LTDC_IT + +#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT +#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING +#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING +#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING + +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + +#endif /* STM32L4 */ + +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#define DMA_REQUEST_TIM16_TRIG_COM DMA_REQUEST_TIM16_COM +#define DMA_REQUEST_TIM17_TRIG_COM DMA_REQUEST_TIM17_COM + +#define LL_DMAMUX_REQ_TIM16_TRIG_COM LL_DMAMUX_REQ_TIM16_COM +#define LL_DMAMUX_REQ_TIM17_TRIG_COM LL_DMAMUX_REQ_TIM17_COM +#endif + +#if defined(STM32H7) + +#define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC2 DMA_REQUEST_DAC1_CH2 + +#define BDMA_REQUEST_LP_UART1_RX BDMA_REQUEST_LPUART1_RX +#define BDMA_REQUEST_LP_UART1_TX BDMA_REQUEST_LPUART1_TX + +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH0_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH0_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH1_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH1_EVT +#define HAL_DMAMUX1_REQUEST_GEN_DMAMUX1_CH2_EVT HAL_DMAMUX1_REQ_GEN_DMAMUX1_CH2_EVT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM1_OUT HAL_DMAMUX1_REQ_GEN_LPTIM1_OUT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX1_REQ_GEN_LPTIM2_OUT +#define HAL_DMAMUX1_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX1_REQ_GEN_LPTIM3_OUT +#define HAL_DMAMUX1_REQUEST_GEN_EXTI0 HAL_DMAMUX1_REQ_GEN_EXTI0 +#define HAL_DMAMUX1_REQUEST_GEN_TIM12_TRGO HAL_DMAMUX1_REQ_GEN_TIM12_TRGO + +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH0_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH0_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH1_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH1_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH2_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH2_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH3_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH3_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH4_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH4_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH5_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH5_EVT +#define HAL_DMAMUX2_REQUEST_GEN_DMAMUX2_CH6_EVT HAL_DMAMUX2_REQ_GEN_DMAMUX2_CH6_EVT +#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_RX_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_WKUP HAL_DMAMUX2_REQ_GEN_LPUART1_TX_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM2_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM2_OUT HAL_DMAMUX2_REQ_GEN_LPTIM2_OUT +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM3_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM3_OUT HAL_DMAMUX2_REQ_GEN_LPTIM3_OUT +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM4_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM4_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_LPTIM5_WKUP HAL_DMAMUX2_REQ_GEN_LPTIM5_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_I2C4_WKUP HAL_DMAMUX2_REQ_GEN_I2C4_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_SPI6_WKUP HAL_DMAMUX2_REQ_GEN_SPI6_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_COMP1_OUT HAL_DMAMUX2_REQ_GEN_COMP1_OUT +#define HAL_DMAMUX2_REQUEST_GEN_COMP2_OUT HAL_DMAMUX2_REQ_GEN_COMP2_OUT +#define HAL_DMAMUX2_REQUEST_GEN_RTC_WKUP HAL_DMAMUX2_REQ_GEN_RTC_WKUP +#define HAL_DMAMUX2_REQUEST_GEN_EXTI0 HAL_DMAMUX2_REQ_GEN_EXTI0 +#define HAL_DMAMUX2_REQUEST_GEN_EXTI2 HAL_DMAMUX2_REQ_GEN_EXTI2 +#define HAL_DMAMUX2_REQUEST_GEN_I2C4_IT_EVT HAL_DMAMUX2_REQ_GEN_I2C4_IT_EVT +#define HAL_DMAMUX2_REQUEST_GEN_SPI6_IT HAL_DMAMUX2_REQ_GEN_SPI6_IT +#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_TX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_TX_IT +#define HAL_DMAMUX2_REQUEST_GEN_LPUART1_RX_IT HAL_DMAMUX2_REQ_GEN_LPUART1_RX_IT +#define HAL_DMAMUX2_REQUEST_GEN_ADC3_IT HAL_DMAMUX2_REQ_GEN_ADC3_IT +#define HAL_DMAMUX2_REQUEST_GEN_ADC3_AWD1_OUT HAL_DMAMUX2_REQ_GEN_ADC3_AWD1_OUT +#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH0_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH0_IT +#define HAL_DMAMUX2_REQUEST_GEN_BDMA_CH1_IT HAL_DMAMUX2_REQ_GEN_BDMA_CH1_IT + +#define HAL_DMAMUX_REQUEST_GEN_NO_EVENT HAL_DMAMUX_REQ_GEN_NO_EVENT +#define HAL_DMAMUX_REQUEST_GEN_RISING HAL_DMAMUX_REQ_GEN_RISING +#define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING +#define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING + +#define DFSDM_FILTER_EXT_TRIG_LPTIM1 DFSDM_FILTER_EXT_TRIG_LPTIM1_OUT +#define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT +#define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT + +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + +#endif /* STM32H7 */ + +#if defined(STM32U5) +#define GPDMA1_REQUEST_DCMI GPDMA1_REQUEST_DCMI_PSSI +#endif /* STM32U5 */ +/** + * @} + */ + +/** @defgroup HAL_FLASH_Aliased_Defines HAL FLASH Aliased Defines maintained for legacy purpose + * @{ + */ + +#define TYPEPROGRAM_BYTE FLASH_TYPEPROGRAM_BYTE +#define TYPEPROGRAM_HALFWORD FLASH_TYPEPROGRAM_HALFWORD +#define TYPEPROGRAM_WORD FLASH_TYPEPROGRAM_WORD +#define TYPEPROGRAM_DOUBLEWORD FLASH_TYPEPROGRAM_DOUBLEWORD +#define TYPEERASE_SECTORS FLASH_TYPEERASE_SECTORS +#define TYPEERASE_PAGES FLASH_TYPEERASE_PAGES +#define TYPEERASE_PAGEERASE FLASH_TYPEERASE_PAGES +#define TYPEERASE_MASSERASE FLASH_TYPEERASE_MASSERASE +#define WRPSTATE_DISABLE OB_WRPSTATE_DISABLE +#define WRPSTATE_ENABLE OB_WRPSTATE_ENABLE +#define HAL_FLASH_TIMEOUT_VALUE FLASH_TIMEOUT_VALUE +#define OBEX_PCROP OPTIONBYTE_PCROP +#define OBEX_BOOTCONFIG OPTIONBYTE_BOOTCONFIG +#define PCROPSTATE_DISABLE OB_PCROP_STATE_DISABLE +#define PCROPSTATE_ENABLE OB_PCROP_STATE_ENABLE +#define TYPEERASEDATA_BYTE FLASH_TYPEERASEDATA_BYTE +#define TYPEERASEDATA_HALFWORD FLASH_TYPEERASEDATA_HALFWORD +#define TYPEERASEDATA_WORD FLASH_TYPEERASEDATA_WORD +#define TYPEPROGRAMDATA_BYTE FLASH_TYPEPROGRAMDATA_BYTE +#define TYPEPROGRAMDATA_HALFWORD FLASH_TYPEPROGRAMDATA_HALFWORD +#define TYPEPROGRAMDATA_WORD FLASH_TYPEPROGRAMDATA_WORD +#define TYPEPROGRAMDATA_FASTBYTE FLASH_TYPEPROGRAMDATA_FASTBYTE +#define TYPEPROGRAMDATA_FASTHALFWORD FLASH_TYPEPROGRAMDATA_FASTHALFWORD +#define TYPEPROGRAMDATA_FASTWORD FLASH_TYPEPROGRAMDATA_FASTWORD +#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) || defined(STM32C0) +#define OB_BOOT_LOCK_DISABLE OB_BOOT_ENTRY_FORCED_NONE +#define OB_BOOT_LOCK_ENABLE OB_BOOT_ENTRY_FORCED_FLASH +#else +#define OB_BOOT_ENTRY_FORCED_NONE OB_BOOT_LOCK_DISABLE +#define OB_BOOT_ENTRY_FORCED_FLASH OB_BOOT_LOCK_ENABLE +#endif +#if defined(STM32H7) +#define FLASH_FLAG_SNECCE_BANK1RR FLASH_FLAG_SNECCERR_BANK1 +#define FLASH_FLAG_DBECCE_BANK1RR FLASH_FLAG_DBECCERR_BANK1 +#define FLASH_FLAG_STRBER_BANK1R FLASH_FLAG_STRBERR_BANK1 +#define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 +#define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 +#define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ +#if defined(STM32U5) +#define OB_USER_nRST_STOP OB_USER_NRST_STOP +#define OB_USER_nRST_STDBY OB_USER_NRST_STDBY +#define OB_USER_nRST_SHDW OB_USER_NRST_SHDW +#define OB_USER_nSWBOOT0 OB_USER_NSWBOOT0 +#define OB_USER_nBOOT0 OB_USER_NBOOT0 +#define OB_nBOOT0_RESET OB_NBOOT0_RESET +#define OB_nBOOT0_SET OB_NBOOT0_SET +#endif /* STM32U5 */ + +/** + * @} + */ + +/** @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) || defined(STM32WB) || defined(STM32U5) +#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW +#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM +#define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH +#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7 || STM32WB || STM32U5*/ + +#if defined(STM32L1) +#define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW +#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_MEDIUM +#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_HIGH +#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH +#endif /* STM32L1 */ + +#if defined(STM32F0) || defined(STM32F3) || defined(STM32F1) +#define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW +#define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM +#define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_HIGH +#endif /* STM32F0 || STM32F3 || STM32F1 */ + +#define GPIO_AF6_DFSDM GPIO_AF6_DFSDM1 + +#if defined(STM32U5) +#define GPIO_AF0_RTC_50Hz GPIO_AF0_RTC_50HZ +#endif /* STM32U5 */ +#if defined(STM32U5) +#define GPIO_AF0_S2DSTOP GPIO_AF0_SRDSTOP +#define GPIO_AF11_LPGPIO GPIO_AF11_LPGPIO1 +#endif /* STM32U5 */ +/** + * @} + */ + +/** @defgroup HAL_GTZC_Aliased_Defines HAL GTZC Aliased Defines maintained for legacy purpose + * @{ + */ +#if defined(STM32U5) +#define GTZC_PERIPH_DCMI GTZC_PERIPH_DCMI_PSSI +#endif /* STM32U5 */ +/** + * @} + */ + +/** @defgroup HAL_HRTIM_Aliased_Macros HAL HRTIM Aliased Macros maintained for legacy purpose + * @{ + */ +#define HRTIM_TIMDELAYEDPROTECTION_DISABLED HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_EEV6 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_EEV6 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV6 +#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV68 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV6 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT1_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT1_DEEV7 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDOUT2_DEEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDOUT2_DEEV7 +#define HRTIM_TIMDELAYEDPROTECTION_DELAYEDBOTH_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DELAYEDBOTH_EEV7 +#define HRTIM_TIMDELAYEDPROTECTION_BALANCED_EEV79 HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_BALANCED_EEV7 + +#define __HAL_HRTIM_SetCounter __HAL_HRTIM_SETCOUNTER +#define __HAL_HRTIM_GetCounter __HAL_HRTIM_GETCOUNTER +#define __HAL_HRTIM_SetPeriod __HAL_HRTIM_SETPERIOD +#define __HAL_HRTIM_GetPeriod __HAL_HRTIM_GETPERIOD +#define __HAL_HRTIM_SetClockPrescaler __HAL_HRTIM_SETCLOCKPRESCALER +#define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER +#define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE +#define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#define HRTIM_TIMEEVENT_A HRTIM_EVENTCOUNTER_A +#define HRTIM_TIMEEVENT_B HRTIM_EVENTCOUNTER_B +#define HRTIM_TIMEEVENTRESETMODE_UNCONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_UNCONDITIONAL +#define HRTIM_TIMEEVENTRESETMODE_CONDITIONAL HRTIM_EVENTCOUNTER_RSTMODE_CONDITIONAL +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) + +#endif /* STM32F3 */ +/** + * @} + */ + +/** @defgroup HAL_I2C_Aliased_Defines HAL I2C Aliased Defines maintained for legacy purpose + * @{ + */ +#define I2C_DUALADDRESS_DISABLED I2C_DUALADDRESS_DISABLE +#define I2C_DUALADDRESS_ENABLED I2C_DUALADDRESS_ENABLE +#define I2C_GENERALCALL_DISABLED I2C_GENERALCALL_DISABLE +#define I2C_GENERALCALL_ENABLED I2C_GENERALCALL_ENABLE +#define I2C_NOSTRETCH_DISABLED I2C_NOSTRETCH_DISABLE +#define I2C_NOSTRETCH_ENABLED I2C_NOSTRETCH_ENABLE +#define I2C_ANALOGFILTER_ENABLED I2C_ANALOGFILTER_ENABLE +#define I2C_ANALOGFILTER_DISABLED I2C_ANALOGFILTER_DISABLE +#if defined(STM32F0) || defined(STM32F1) || defined(STM32F3) || defined(STM32G0) || defined(STM32L4) || defined(STM32L1) || defined(STM32F7) +#define HAL_I2C_STATE_MEM_BUSY_TX HAL_I2C_STATE_BUSY_TX +#define HAL_I2C_STATE_MEM_BUSY_RX HAL_I2C_STATE_BUSY_RX +#define HAL_I2C_STATE_MASTER_BUSY_TX HAL_I2C_STATE_BUSY_TX +#define HAL_I2C_STATE_MASTER_BUSY_RX HAL_I2C_STATE_BUSY_RX +#define HAL_I2C_STATE_SLAVE_BUSY_TX HAL_I2C_STATE_BUSY_TX +#define HAL_I2C_STATE_SLAVE_BUSY_RX HAL_I2C_STATE_BUSY_RX +#endif +/** + * @} + */ + +/** @defgroup HAL_IRDA_Aliased_Defines HAL IRDA Aliased Defines maintained for legacy purpose + * @{ + */ +#define IRDA_ONE_BIT_SAMPLE_DISABLED IRDA_ONE_BIT_SAMPLE_DISABLE +#define IRDA_ONE_BIT_SAMPLE_ENABLED IRDA_ONE_BIT_SAMPLE_ENABLE + +/** + * @} + */ + +/** @defgroup HAL_IWDG_Aliased_Defines HAL IWDG Aliased Defines maintained for legacy purpose + * @{ + */ +#define KR_KEY_RELOAD IWDG_KEY_RELOAD +#define KR_KEY_ENABLE IWDG_KEY_ENABLE +#define KR_KEY_EWA IWDG_KEY_WRITE_ACCESS_ENABLE +#define KR_KEY_DWA IWDG_KEY_WRITE_ACCESS_DISABLE +/** + * @} + */ + +/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose + * @{ + */ + +#define LPTIM_CLOCKSAMPLETIME_DIRECTTRANSISTION LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION +#define LPTIM_CLOCKSAMPLETIME_2TRANSISTIONS LPTIM_CLOCKSAMPLETIME_2TRANSITIONS +#define LPTIM_CLOCKSAMPLETIME_4TRANSISTIONS LPTIM_CLOCKSAMPLETIME_4TRANSITIONS +#define LPTIM_CLOCKSAMPLETIME_8TRANSISTIONS LPTIM_CLOCKSAMPLETIME_8TRANSITIONS + +#define LPTIM_CLOCKPOLARITY_RISINGEDGE LPTIM_CLOCKPOLARITY_RISING +#define LPTIM_CLOCKPOLARITY_FALLINGEDGE LPTIM_CLOCKPOLARITY_FALLING +#define LPTIM_CLOCKPOLARITY_BOTHEDGES LPTIM_CLOCKPOLARITY_RISING_FALLING + +#define LPTIM_TRIGSAMPLETIME_DIRECTTRANSISTION LPTIM_TRIGSAMPLETIME_DIRECTTRANSITION +#define LPTIM_TRIGSAMPLETIME_2TRANSISTIONS LPTIM_TRIGSAMPLETIME_2TRANSITIONS +#define LPTIM_TRIGSAMPLETIME_4TRANSISTIONS LPTIM_TRIGSAMPLETIME_4TRANSITIONS +#define LPTIM_TRIGSAMPLETIME_8TRANSISTIONS LPTIM_TRIGSAMPLETIME_8TRANSITIONS + +/* The following 3 definition have also been present in a temporary version of lptim.h */ +/* They need to be renamed also to the right name, just in case */ +#define LPTIM_TRIGSAMPLETIME_2TRANSITION LPTIM_TRIGSAMPLETIME_2TRANSITIONS +#define LPTIM_TRIGSAMPLETIME_4TRANSITION LPTIM_TRIGSAMPLETIME_4TRANSITIONS +#define LPTIM_TRIGSAMPLETIME_8TRANSITION LPTIM_TRIGSAMPLETIME_8TRANSITIONS + + +/** @defgroup HAL_LPTIM_Aliased_Defines HAL LPTIM Aliased Defines maintained for legacy purpose + * @{ + */ +#define HAL_LPTIM_ReadCompare HAL_LPTIM_ReadCapturedValue +/** + * @} + */ + +#if defined(STM32U5) +#define LPTIM_ISR_CC1 LPTIM_ISR_CC1IF +#define LPTIM_ISR_CC2 LPTIM_ISR_CC2IF +#define LPTIM_CHANNEL_ALL 0x00000000U +#endif /* STM32U5 */ +/** + * @} + */ + +/** @defgroup HAL_NAND_Aliased_Defines HAL NAND Aliased Defines maintained for legacy purpose + * @{ + */ +#define HAL_NAND_Read_Page HAL_NAND_Read_Page_8b +#define HAL_NAND_Write_Page HAL_NAND_Write_Page_8b +#define HAL_NAND_Read_SpareArea HAL_NAND_Read_SpareArea_8b +#define HAL_NAND_Write_SpareArea HAL_NAND_Write_SpareArea_8b + +#define NAND_AddressTypedef NAND_AddressTypeDef + +#define __ARRAY_ADDRESS ARRAY_ADDRESS +#define __ADDR_1st_CYCLE ADDR_1ST_CYCLE +#define __ADDR_2nd_CYCLE ADDR_2ND_CYCLE +#define __ADDR_3rd_CYCLE ADDR_3RD_CYCLE +#define __ADDR_4th_CYCLE ADDR_4TH_CYCLE +/** + * @} + */ + +/** @defgroup HAL_NOR_Aliased_Defines HAL NOR Aliased Defines maintained for legacy purpose + * @{ + */ +#define NOR_StatusTypedef HAL_NOR_StatusTypeDef +#define NOR_SUCCESS HAL_NOR_STATUS_SUCCESS +#define NOR_ONGOING HAL_NOR_STATUS_ONGOING +#define NOR_ERROR HAL_NOR_STATUS_ERROR +#define NOR_TIMEOUT HAL_NOR_STATUS_TIMEOUT + +#define __NOR_WRITE NOR_WRITE +#define __NOR_ADDR_SHIFT NOR_ADDR_SHIFT +/** + * @} + */ + +/** @defgroup HAL_OPAMP_Aliased_Defines HAL OPAMP Aliased Defines maintained for legacy purpose + * @{ + */ + +#define OPAMP_NONINVERTINGINPUT_VP0 OPAMP_NONINVERTINGINPUT_IO0 +#define OPAMP_NONINVERTINGINPUT_VP1 OPAMP_NONINVERTINGINPUT_IO1 +#define OPAMP_NONINVERTINGINPUT_VP2 OPAMP_NONINVERTINGINPUT_IO2 +#define OPAMP_NONINVERTINGINPUT_VP3 OPAMP_NONINVERTINGINPUT_IO3 + +#define OPAMP_SEC_NONINVERTINGINPUT_VP0 OPAMP_SEC_NONINVERTINGINPUT_IO0 +#define OPAMP_SEC_NONINVERTINGINPUT_VP1 OPAMP_SEC_NONINVERTINGINPUT_IO1 +#define OPAMP_SEC_NONINVERTINGINPUT_VP2 OPAMP_SEC_NONINVERTINGINPUT_IO2 +#define OPAMP_SEC_NONINVERTINGINPUT_VP3 OPAMP_SEC_NONINVERTINGINPUT_IO3 + +#define OPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 +#define OPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 + +#define IOPAMP_INVERTINGINPUT_VM0 OPAMP_INVERTINGINPUT_IO0 +#define IOPAMP_INVERTINGINPUT_VM1 OPAMP_INVERTINGINPUT_IO1 + +#define OPAMP_SEC_INVERTINGINPUT_VM0 OPAMP_SEC_INVERTINGINPUT_IO0 +#define OPAMP_SEC_INVERTINGINPUT_VM1 OPAMP_SEC_INVERTINGINPUT_IO1 + +#define OPAMP_INVERTINGINPUT_VINM OPAMP_SEC_INVERTINGINPUT_IO1 + +#define OPAMP_PGACONNECT_NO OPAMP_PGA_CONNECT_INVERTINGINPUT_NO +#define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 +#define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) || defined(STM32G4) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + +#if defined(STM32L4) || defined(STM32L5) +#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALPOWER +#elif defined(STM32G4) +#define OPAMP_POWERMODE_NORMAL OPAMP_POWERMODE_NORMALSPEED +#endif + +/** + * @} + */ + +/** @defgroup HAL_I2S_Aliased_Defines HAL I2S Aliased Defines maintained for legacy purpose + * @{ + */ +#define I2S_STANDARD_PHILLIPS I2S_STANDARD_PHILIPS + +#if defined(STM32H7) +#define I2S_IT_TXE I2S_IT_TXP +#define I2S_IT_RXNE I2S_IT_RXP + +#define I2S_FLAG_TXE I2S_FLAG_TXP +#define I2S_FLAG_RXNE I2S_FLAG_RXP +#endif + +#if defined(STM32F7) +#define I2S_CLOCK_SYSCLK I2S_CLOCK_PLL +#endif +/** + * @} + */ + +/** @defgroup HAL_PCCARD_Aliased_Defines HAL PCCARD Aliased Defines maintained for legacy purpose + * @{ + */ + +/* Compact Flash-ATA registers description */ +#define CF_DATA ATA_DATA +#define CF_SECTOR_COUNT ATA_SECTOR_COUNT +#define CF_SECTOR_NUMBER ATA_SECTOR_NUMBER +#define CF_CYLINDER_LOW ATA_CYLINDER_LOW +#define CF_CYLINDER_HIGH ATA_CYLINDER_HIGH +#define CF_CARD_HEAD ATA_CARD_HEAD +#define CF_STATUS_CMD ATA_STATUS_CMD +#define CF_STATUS_CMD_ALTERNATE ATA_STATUS_CMD_ALTERNATE +#define CF_COMMON_DATA_AREA ATA_COMMON_DATA_AREA + +/* Compact Flash-ATA commands */ +#define CF_READ_SECTOR_CMD ATA_READ_SECTOR_CMD +#define CF_WRITE_SECTOR_CMD ATA_WRITE_SECTOR_CMD +#define CF_ERASE_SECTOR_CMD ATA_ERASE_SECTOR_CMD +#define CF_IDENTIFY_CMD ATA_IDENTIFY_CMD + +#define PCCARD_StatusTypedef HAL_PCCARD_StatusTypeDef +#define PCCARD_SUCCESS HAL_PCCARD_STATUS_SUCCESS +#define PCCARD_ONGOING HAL_PCCARD_STATUS_ONGOING +#define PCCARD_ERROR HAL_PCCARD_STATUS_ERROR +#define PCCARD_TIMEOUT HAL_PCCARD_STATUS_TIMEOUT +/** + * @} + */ + +/** @defgroup HAL_RTC_Aliased_Defines HAL RTC Aliased Defines maintained for legacy purpose + * @{ + */ + +#define FORMAT_BIN RTC_FORMAT_BIN +#define FORMAT_BCD RTC_FORMAT_BCD + +#define RTC_ALARMSUBSECONDMASK_None RTC_ALARMSUBSECONDMASK_NONE +#define RTC_TAMPERERASEBACKUP_DISABLED RTC_TAMPER_ERASE_BACKUP_DISABLE +#define RTC_TAMPERMASK_FLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE +#define RTC_TAMPERMASK_FLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE + +#define RTC_MASKTAMPERFLAG_DISABLED RTC_TAMPERMASK_FLAG_DISABLE +#define RTC_MASKTAMPERFLAG_ENABLED RTC_TAMPERMASK_FLAG_ENABLE +#define RTC_TAMPERERASEBACKUP_ENABLED RTC_TAMPER_ERASE_BACKUP_ENABLE +#define RTC_TAMPER1_2_INTERRUPT RTC_ALL_TAMPER_INTERRUPT +#define RTC_TAMPER1_2_3_INTERRUPT RTC_ALL_TAMPER_INTERRUPT + +#define RTC_TIMESTAMPPIN_PC13 RTC_TIMESTAMPPIN_DEFAULT +#define RTC_TIMESTAMPPIN_PA0 RTC_TIMESTAMPPIN_POS1 +#define RTC_TIMESTAMPPIN_PI8 RTC_TIMESTAMPPIN_POS1 +#define RTC_TIMESTAMPPIN_PC1 RTC_TIMESTAMPPIN_POS2 + +#define RTC_OUTPUT_REMAP_PC13 RTC_OUTPUT_REMAP_NONE +#define RTC_OUTPUT_REMAP_PB14 RTC_OUTPUT_REMAP_POS1 +#define RTC_OUTPUT_REMAP_PB2 RTC_OUTPUT_REMAP_POS1 + +#define RTC_TAMPERPIN_PC13 RTC_TAMPERPIN_DEFAULT +#define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 +#define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 + +#if defined(STM32F7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_ENABLE_BITS_MASK +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_IT_ENABLE_BITS_MASK +#endif /* STM32F7 */ + +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT +#endif /* STM32H7 */ + +#if defined(STM32F7) || defined(STM32H7) +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMP +#endif /* STM32F7 || STM32H7 */ + +/** + * @} + */ + + +/** @defgroup HAL_SMARTCARD_Aliased_Defines HAL SMARTCARD Aliased Defines maintained for legacy purpose + * @{ + */ +#define SMARTCARD_NACK_ENABLED SMARTCARD_NACK_ENABLE +#define SMARTCARD_NACK_DISABLED SMARTCARD_NACK_DISABLE + +#define SMARTCARD_ONEBIT_SAMPLING_DISABLED SMARTCARD_ONE_BIT_SAMPLE_DISABLE +#define SMARTCARD_ONEBIT_SAMPLING_ENABLED SMARTCARD_ONE_BIT_SAMPLE_ENABLE +#define SMARTCARD_ONEBIT_SAMPLING_DISABLE SMARTCARD_ONE_BIT_SAMPLE_DISABLE +#define SMARTCARD_ONEBIT_SAMPLING_ENABLE SMARTCARD_ONE_BIT_SAMPLE_ENABLE + +#define SMARTCARD_TIMEOUT_DISABLED SMARTCARD_TIMEOUT_DISABLE +#define SMARTCARD_TIMEOUT_ENABLED SMARTCARD_TIMEOUT_ENABLE + +#define SMARTCARD_LASTBIT_DISABLED SMARTCARD_LASTBIT_DISABLE +#define SMARTCARD_LASTBIT_ENABLED SMARTCARD_LASTBIT_ENABLE +/** + * @} + */ + + +/** @defgroup HAL_SMBUS_Aliased_Defines HAL SMBUS Aliased Defines maintained for legacy purpose + * @{ + */ +#define SMBUS_DUALADDRESS_DISABLED SMBUS_DUALADDRESS_DISABLE +#define SMBUS_DUALADDRESS_ENABLED SMBUS_DUALADDRESS_ENABLE +#define SMBUS_GENERALCALL_DISABLED SMBUS_GENERALCALL_DISABLE +#define SMBUS_GENERALCALL_ENABLED SMBUS_GENERALCALL_ENABLE +#define SMBUS_NOSTRETCH_DISABLED SMBUS_NOSTRETCH_DISABLE +#define SMBUS_NOSTRETCH_ENABLED SMBUS_NOSTRETCH_ENABLE +#define SMBUS_ANALOGFILTER_ENABLED SMBUS_ANALOGFILTER_ENABLE +#define SMBUS_ANALOGFILTER_DISABLED SMBUS_ANALOGFILTER_DISABLE +#define SMBUS_PEC_DISABLED SMBUS_PEC_DISABLE +#define SMBUS_PEC_ENABLED SMBUS_PEC_ENABLE +#define HAL_SMBUS_STATE_SLAVE_LISTEN HAL_SMBUS_STATE_LISTEN +/** + * @} + */ + +/** @defgroup HAL_SPI_Aliased_Defines HAL SPI Aliased Defines maintained for legacy purpose + * @{ + */ +#define SPI_TIMODE_DISABLED SPI_TIMODE_DISABLE +#define SPI_TIMODE_ENABLED SPI_TIMODE_ENABLE + +#define SPI_CRCCALCULATION_DISABLED SPI_CRCCALCULATION_DISABLE +#define SPI_CRCCALCULATION_ENABLED SPI_CRCCALCULATION_ENABLE + +#define SPI_NSS_PULSE_DISABLED SPI_NSS_PULSE_DISABLE +#define SPI_NSS_PULSE_ENABLED SPI_NSS_PULSE_ENABLE + +#if defined(STM32H7) + +#define SPI_FLAG_TXE SPI_FLAG_TXP +#define SPI_FLAG_RXNE SPI_FLAG_RXP + +#define SPI_IT_TXE SPI_IT_TXP +#define SPI_IT_RXNE SPI_IT_RXP + +#define SPI_FRLVL_EMPTY SPI_RX_FIFO_0PACKET +#define SPI_FRLVL_QUARTER_FULL SPI_RX_FIFO_1PACKET +#define SPI_FRLVL_HALF_FULL SPI_RX_FIFO_2PACKET +#define SPI_FRLVL_FULL SPI_RX_FIFO_3PACKET + +#endif /* STM32H7 */ + +/** + * @} + */ + +/** @defgroup HAL_TIM_Aliased_Defines HAL TIM Aliased Defines maintained for legacy purpose + * @{ + */ +#define CCER_CCxE_MASK TIM_CCER_CCxE_MASK +#define CCER_CCxNE_MASK TIM_CCER_CCxNE_MASK + +#define TIM_DMABase_CR1 TIM_DMABASE_CR1 +#define TIM_DMABase_CR2 TIM_DMABASE_CR2 +#define TIM_DMABase_SMCR TIM_DMABASE_SMCR +#define TIM_DMABase_DIER TIM_DMABASE_DIER +#define TIM_DMABase_SR TIM_DMABASE_SR +#define TIM_DMABase_EGR TIM_DMABASE_EGR +#define TIM_DMABase_CCMR1 TIM_DMABASE_CCMR1 +#define TIM_DMABase_CCMR2 TIM_DMABASE_CCMR2 +#define TIM_DMABase_CCER TIM_DMABASE_CCER +#define TIM_DMABase_CNT TIM_DMABASE_CNT +#define TIM_DMABase_PSC TIM_DMABASE_PSC +#define TIM_DMABase_ARR TIM_DMABASE_ARR +#define TIM_DMABase_RCR TIM_DMABASE_RCR +#define TIM_DMABase_CCR1 TIM_DMABASE_CCR1 +#define TIM_DMABase_CCR2 TIM_DMABASE_CCR2 +#define TIM_DMABase_CCR3 TIM_DMABASE_CCR3 +#define TIM_DMABase_CCR4 TIM_DMABASE_CCR4 +#define TIM_DMABase_BDTR TIM_DMABASE_BDTR +#define TIM_DMABase_DCR TIM_DMABASE_DCR +#define TIM_DMABase_DMAR TIM_DMABASE_DMAR +#define TIM_DMABase_OR1 TIM_DMABASE_OR1 +#define TIM_DMABase_CCMR3 TIM_DMABASE_CCMR3 +#define TIM_DMABase_CCR5 TIM_DMABASE_CCR5 +#define TIM_DMABase_CCR6 TIM_DMABASE_CCR6 +#define TIM_DMABase_OR2 TIM_DMABASE_OR2 +#define TIM_DMABase_OR3 TIM_DMABASE_OR3 +#define TIM_DMABase_OR TIM_DMABASE_OR + +#define TIM_EventSource_Update TIM_EVENTSOURCE_UPDATE +#define TIM_EventSource_CC1 TIM_EVENTSOURCE_CC1 +#define TIM_EventSource_CC2 TIM_EVENTSOURCE_CC2 +#define TIM_EventSource_CC3 TIM_EVENTSOURCE_CC3 +#define TIM_EventSource_CC4 TIM_EVENTSOURCE_CC4 +#define TIM_EventSource_COM TIM_EVENTSOURCE_COM +#define TIM_EventSource_Trigger TIM_EVENTSOURCE_TRIGGER +#define TIM_EventSource_Break TIM_EVENTSOURCE_BREAK +#define TIM_EventSource_Break2 TIM_EVENTSOURCE_BREAK2 + +#define TIM_DMABurstLength_1Transfer TIM_DMABURSTLENGTH_1TRANSFER +#define TIM_DMABurstLength_2Transfers TIM_DMABURSTLENGTH_2TRANSFERS +#define TIM_DMABurstLength_3Transfers TIM_DMABURSTLENGTH_3TRANSFERS +#define TIM_DMABurstLength_4Transfers TIM_DMABURSTLENGTH_4TRANSFERS +#define TIM_DMABurstLength_5Transfers TIM_DMABURSTLENGTH_5TRANSFERS +#define TIM_DMABurstLength_6Transfers TIM_DMABURSTLENGTH_6TRANSFERS +#define TIM_DMABurstLength_7Transfers TIM_DMABURSTLENGTH_7TRANSFERS +#define TIM_DMABurstLength_8Transfers TIM_DMABURSTLENGTH_8TRANSFERS +#define TIM_DMABurstLength_9Transfers TIM_DMABURSTLENGTH_9TRANSFERS +#define TIM_DMABurstLength_10Transfers TIM_DMABURSTLENGTH_10TRANSFERS +#define TIM_DMABurstLength_11Transfers TIM_DMABURSTLENGTH_11TRANSFERS +#define TIM_DMABurstLength_12Transfers TIM_DMABURSTLENGTH_12TRANSFERS +#define TIM_DMABurstLength_13Transfers TIM_DMABURSTLENGTH_13TRANSFERS +#define TIM_DMABurstLength_14Transfers TIM_DMABURSTLENGTH_14TRANSFERS +#define TIM_DMABurstLength_15Transfers TIM_DMABURSTLENGTH_15TRANSFERS +#define TIM_DMABurstLength_16Transfers TIM_DMABURSTLENGTH_16TRANSFERS +#define TIM_DMABurstLength_17Transfers TIM_DMABURSTLENGTH_17TRANSFERS +#define TIM_DMABurstLength_18Transfers TIM_DMABURSTLENGTH_18TRANSFERS + +#if defined(STM32L0) +#define TIM22_TI1_GPIO1 TIM22_TI1_GPIO +#define TIM22_TI1_GPIO2 TIM22_TI1_GPIO +#endif + +#if defined(STM32F3) +#define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE +#endif + +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + +#if defined(STM32U5) || defined(STM32MP2) +#define OCREF_CLEAR_SELECT_Pos OCREF_CLEAR_SELECT_POS +#define OCREF_CLEAR_SELECT_Msk OCREF_CLEAR_SELECT_MSK +#endif +/** + * @} + */ + +/** @defgroup HAL_TSC_Aliased_Defines HAL TSC Aliased Defines maintained for legacy purpose + * @{ + */ +#define TSC_SYNC_POL_FALL TSC_SYNC_POLARITY_FALLING +#define TSC_SYNC_POL_RISE_HIGH TSC_SYNC_POLARITY_RISING +/** + * @} + */ + +/** @defgroup HAL_UART_Aliased_Defines HAL UART Aliased Defines maintained for legacy purpose + * @{ + */ +#define UART_ONEBIT_SAMPLING_DISABLED UART_ONE_BIT_SAMPLE_DISABLE +#define UART_ONEBIT_SAMPLING_ENABLED UART_ONE_BIT_SAMPLE_ENABLE +#define UART_ONE_BIT_SAMPLE_DISABLED UART_ONE_BIT_SAMPLE_DISABLE +#define UART_ONE_BIT_SAMPLE_ENABLED UART_ONE_BIT_SAMPLE_ENABLE + +#define __HAL_UART_ONEBIT_ENABLE __HAL_UART_ONE_BIT_SAMPLE_ENABLE +#define __HAL_UART_ONEBIT_DISABLE __HAL_UART_ONE_BIT_SAMPLE_DISABLE + +#define __DIV_SAMPLING16 UART_DIV_SAMPLING16 +#define __DIVMANT_SAMPLING16 UART_DIVMANT_SAMPLING16 +#define __DIVFRAQ_SAMPLING16 UART_DIVFRAQ_SAMPLING16 +#define __UART_BRR_SAMPLING16 UART_BRR_SAMPLING16 + +#define __DIV_SAMPLING8 UART_DIV_SAMPLING8 +#define __DIVMANT_SAMPLING8 UART_DIVMANT_SAMPLING8 +#define __DIVFRAQ_SAMPLING8 UART_DIVFRAQ_SAMPLING8 +#define __UART_BRR_SAMPLING8 UART_BRR_SAMPLING8 + +#define __DIV_LPUART UART_DIV_LPUART + +#define UART_WAKEUPMETHODE_IDLELINE UART_WAKEUPMETHOD_IDLELINE +#define UART_WAKEUPMETHODE_ADDRESSMARK UART_WAKEUPMETHOD_ADDRESSMARK + +/** + * @} + */ + + +/** @defgroup HAL_USART_Aliased_Defines HAL USART Aliased Defines maintained for legacy purpose + * @{ + */ + +#define USART_CLOCK_DISABLED USART_CLOCK_DISABLE +#define USART_CLOCK_ENABLED USART_CLOCK_ENABLE + +#define USARTNACK_ENABLED USART_NACK_ENABLE +#define USARTNACK_DISABLED USART_NACK_DISABLE +/** + * @} + */ + +/** @defgroup HAL_WWDG_Aliased_Defines HAL WWDG Aliased Defines maintained for legacy purpose + * @{ + */ +#define CFR_BASE WWDG_CFR_BASE + +/** + * @} + */ + +/** @defgroup HAL_CAN_Aliased_Defines HAL CAN Aliased Defines maintained for legacy purpose + * @{ + */ +#define CAN_FilterFIFO0 CAN_FILTER_FIFO0 +#define CAN_FilterFIFO1 CAN_FILTER_FIFO1 +#define CAN_IT_RQCP0 CAN_IT_TME +#define CAN_IT_RQCP1 CAN_IT_TME +#define CAN_IT_RQCP2 CAN_IT_TME +#define INAK_TIMEOUT CAN_TIMEOUT_VALUE +#define SLAK_TIMEOUT CAN_TIMEOUT_VALUE +#define CAN_TXSTATUS_FAILED ((uint8_t)0x00U) +#define CAN_TXSTATUS_OK ((uint8_t)0x01U) +#define CAN_TXSTATUS_PENDING ((uint8_t)0x02U) + +/** + * @} + */ + +/** @defgroup HAL_ETH_Aliased_Defines HAL ETH Aliased Defines maintained for legacy purpose + * @{ + */ + +#define VLAN_TAG ETH_VLAN_TAG +#define MIN_ETH_PAYLOAD ETH_MIN_ETH_PAYLOAD +#define MAX_ETH_PAYLOAD ETH_MAX_ETH_PAYLOAD +#define JUMBO_FRAME_PAYLOAD ETH_JUMBO_FRAME_PAYLOAD +#define MACMIIAR_CR_MASK ETH_MACMIIAR_CR_MASK +#define MACCR_CLEAR_MASK ETH_MACCR_CLEAR_MASK +#define MACFCR_CLEAR_MASK ETH_MACFCR_CLEAR_MASK +#define DMAOMR_CLEAR_MASK ETH_DMAOMR_CLEAR_MASK + +#define ETH_MMCCR 0x00000100U +#define ETH_MMCRIR 0x00000104U +#define ETH_MMCTIR 0x00000108U +#define ETH_MMCRIMR 0x0000010CU +#define ETH_MMCTIMR 0x00000110U +#define ETH_MMCTGFSCCR 0x0000014CU +#define ETH_MMCTGFMSCCR 0x00000150U +#define ETH_MMCTGFCR 0x00000168U +#define ETH_MMCRFCECR 0x00000194U +#define ETH_MMCRFAECR 0x00000198U +#define ETH_MMCRGUFCR 0x000001C4U + +#define ETH_MAC_TXFIFO_FULL 0x02000000U /* Tx FIFO full */ +#define ETH_MAC_TXFIFONOT_EMPTY 0x01000000U /* Tx FIFO not empty */ +#define ETH_MAC_TXFIFO_WRITE_ACTIVE 0x00400000U /* Tx FIFO write active */ +#define ETH_MAC_TXFIFO_IDLE 0x00000000U /* Tx FIFO read status: Idle */ +#define ETH_MAC_TXFIFO_READ 0x00100000U /* Tx FIFO read status: Read (transferring data to the MAC transmitter) */ +#define ETH_MAC_TXFIFO_WAITING 0x00200000U /* Tx FIFO read status: Waiting for TxStatus from MAC transmitter */ +#define ETH_MAC_TXFIFO_WRITING 0x00300000U /* Tx FIFO read status: Writing the received TxStatus or flushing the TxFIFO */ +#define ETH_MAC_TRANSMISSION_PAUSE 0x00080000U /* MAC transmitter in pause */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_IDLE 0x00000000U /* MAC transmit frame controller: Idle */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_WAITING 0x00020000U /* MAC transmit frame controller: Waiting for Status of previous frame or IFG/backoff period to be over */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_GENRATING_PCF 0x00040000U /* MAC transmit frame controller: Generating and transmitting a Pause control frame (in full duplex mode) */ +#define ETH_MAC_TRANSMITFRAMECONTROLLER_TRANSFERRING 0x00060000U /* MAC transmit frame controller: Transferring input frame for transmission */ +#define ETH_MAC_MII_TRANSMIT_ACTIVE 0x00010000U /* MAC MII transmit engine active */ +#define ETH_MAC_RXFIFO_EMPTY 0x00000000U /* Rx FIFO fill level: empty */ +#define ETH_MAC_RXFIFO_BELOW_THRESHOLD 0x00000100U /* Rx FIFO fill level: fill-level below flow-control de-activate threshold */ +#define ETH_MAC_RXFIFO_ABOVE_THRESHOLD 0x00000200U /* Rx FIFO fill level: fill-level above flow-control activate threshold */ +#define ETH_MAC_RXFIFO_FULL 0x00000300U /* Rx FIFO fill level: full */ +#if defined(STM32F1) +#else +#define ETH_MAC_READCONTROLLER_IDLE 0x00000000U /* Rx FIFO read controller IDLE state */ +#define ETH_MAC_READCONTROLLER_READING_DATA 0x00000020U /* Rx FIFO read controller Reading frame data */ +#define ETH_MAC_READCONTROLLER_READING_STATUS 0x00000040U /* Rx FIFO read controller Reading frame status (or time-stamp) */ +#endif +#define ETH_MAC_READCONTROLLER_FLUSHING 0x00000060U /* Rx FIFO read controller Flushing the frame data and status */ +#define ETH_MAC_RXFIFO_WRITE_ACTIVE 0x00000010U /* Rx FIFO write controller active */ +#define ETH_MAC_SMALL_FIFO_NOTACTIVE 0x00000000U /* MAC small FIFO read / write controllers not active */ +#define ETH_MAC_SMALL_FIFO_READ_ACTIVE 0x00000002U /* MAC small FIFO read controller active */ +#define ETH_MAC_SMALL_FIFO_WRITE_ACTIVE 0x00000004U /* MAC small FIFO write controller active */ +#define ETH_MAC_SMALL_FIFO_RW_ACTIVE 0x00000006U /* MAC small FIFO read / write controllers active */ +#define ETH_MAC_MII_RECEIVE_PROTOCOL_ACTIVE 0x00000001U /* MAC MII receive protocol engine active */ + +/** + * @} + */ + +/** @defgroup HAL_DCMI_Aliased_Defines HAL DCMI Aliased Defines maintained for legacy purpose + * @{ + */ +#define HAL_DCMI_ERROR_OVF HAL_DCMI_ERROR_OVR +#define DCMI_IT_OVF DCMI_IT_OVR +#define DCMI_FLAG_OVFRI DCMI_FLAG_OVRRI +#define DCMI_FLAG_OVFMI DCMI_FLAG_OVRMI + +#define HAL_DCMI_ConfigCROP HAL_DCMI_ConfigCrop +#define HAL_DCMI_EnableCROP HAL_DCMI_EnableCrop +#define HAL_DCMI_DisableCROP HAL_DCMI_DisableCrop + +/** + * @} + */ + +#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ + || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ + || defined(STM32H7) +/** @defgroup HAL_DMA2D_Aliased_Defines HAL DMA2D Aliased Defines maintained for legacy purpose + * @{ + */ +#define DMA2D_ARGB8888 DMA2D_OUTPUT_ARGB8888 +#define DMA2D_RGB888 DMA2D_OUTPUT_RGB888 +#define DMA2D_RGB565 DMA2D_OUTPUT_RGB565 +#define DMA2D_ARGB1555 DMA2D_OUTPUT_ARGB1555 +#define DMA2D_ARGB4444 DMA2D_OUTPUT_ARGB4444 + +#define CM_ARGB8888 DMA2D_INPUT_ARGB8888 +#define CM_RGB888 DMA2D_INPUT_RGB888 +#define CM_RGB565 DMA2D_INPUT_RGB565 +#define CM_ARGB1555 DMA2D_INPUT_ARGB1555 +#define CM_ARGB4444 DMA2D_INPUT_ARGB4444 +#define CM_L8 DMA2D_INPUT_L8 +#define CM_AL44 DMA2D_INPUT_AL44 +#define CM_AL88 DMA2D_INPUT_AL88 +#define CM_L4 DMA2D_INPUT_L4 +#define CM_A8 DMA2D_INPUT_A8 +#define CM_A4 DMA2D_INPUT_A4 +/** + * @} + */ +#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 */ + +#if defined(STM32L4) || defined(STM32F7) || defined(STM32F427xx) || defined(STM32F437xx) \ + || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) \ + || defined(STM32H7) || defined(STM32U5) +/** @defgroup DMA2D_Aliases DMA2D API Aliases + * @{ + */ +#define HAL_DMA2D_DisableCLUT HAL_DMA2D_CLUTLoading_Abort /*!< Aliased to HAL_DMA2D_CLUTLoading_Abort + for compatibility with legacy code */ +/** + * @} + */ + +#endif /* STM32L4 || STM32F7 || STM32F4 || STM32H7 || STM32U5 */ + +/** @defgroup HAL_PPP_Aliased_Defines HAL PPP Aliased Defines maintained for legacy purpose + * @{ + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup HAL_CRYP_Aliased_Functions HAL CRYP Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_CRYP_ComputationCpltCallback HAL_CRYPEx_ComputationCpltCallback +/** + * @} + */ + +/** @defgroup HAL_DCACHE_Aliased_Functions HAL DCACHE Aliased Functions maintained for legacy purpose + * @{ + */ + +#if defined(STM32U5) +#define HAL_DCACHE_CleanInvalidateByAddr HAL_DCACHE_CleanInvalidByAddr +#define HAL_DCACHE_CleanInvalidateByAddr_IT HAL_DCACHE_CleanInvalidByAddr_IT +#endif /* STM32U5 */ + +/** + * @} + */ + +#if !defined(STM32F2) +/** @defgroup HASH_alias HASH API alias + * @{ + */ +#define HAL_HASHEx_IRQHandler HAL_HASH_IRQHandler /*!< Redirection for compatibility with legacy code */ +/** + * + * @} + */ +#endif /* STM32F2 */ +/** @defgroup HAL_HASH_Aliased_Functions HAL HASH Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_HASH_STATETypeDef HAL_HASH_StateTypeDef +#define HAL_HASHPhaseTypeDef HAL_HASH_PhaseTypeDef +#define HAL_HMAC_MD5_Finish HAL_HASH_MD5_Finish +#define HAL_HMAC_SHA1_Finish HAL_HASH_SHA1_Finish +#define HAL_HMAC_SHA224_Finish HAL_HASH_SHA224_Finish +#define HAL_HMAC_SHA256_Finish HAL_HASH_SHA256_Finish + +/*HASH Algorithm Selection*/ + +#define HASH_AlgoSelection_SHA1 HASH_ALGOSELECTION_SHA1 +#define HASH_AlgoSelection_SHA224 HASH_ALGOSELECTION_SHA224 +#define HASH_AlgoSelection_SHA256 HASH_ALGOSELECTION_SHA256 +#define HASH_AlgoSelection_MD5 HASH_ALGOSELECTION_MD5 + +#define HASH_AlgoMode_HASH HASH_ALGOMODE_HASH +#define HASH_AlgoMode_HMAC HASH_ALGOMODE_HMAC + +#define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY +#define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32L5) || defined(STM32F2) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32L5 || STM32F2 || STM32F4 || STM32F7 || STM32H7 */ +/** + * @} + */ + +/** @defgroup HAL_Aliased_Functions HAL Generic Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_EnableDBGSleepMode HAL_DBGMCU_EnableDBGSleepMode +#define HAL_DisableDBGSleepMode HAL_DBGMCU_DisableDBGSleepMode +#define HAL_EnableDBGStopMode HAL_DBGMCU_EnableDBGStopMode +#define HAL_DisableDBGStopMode HAL_DBGMCU_DisableDBGStopMode +#define HAL_EnableDBGStandbyMode HAL_DBGMCU_EnableDBGStandbyMode +#define HAL_DisableDBGStandbyMode HAL_DBGMCU_DisableDBGStandbyMode +#define HAL_DBG_LowPowerConfig(Periph, cmd) (((cmd\ + )==ENABLE)? HAL_DBGMCU_DBG_EnableLowPowerConfig(Periph) : HAL_DBGMCU_DBG_DisableLowPowerConfig(Periph)) +#define HAL_VREFINT_OutputSelect HAL_SYSCFG_VREFINT_OutputSelect +#define HAL_Lock_Cmd(cmd) (((cmd)==ENABLE) ? HAL_SYSCFG_Enable_Lock_VREFINT() : HAL_SYSCFG_Disable_Lock_VREFINT()) +#if defined(STM32L0) +#else +#define HAL_VREFINT_Cmd(cmd) (((cmd)==ENABLE)? HAL_SYSCFG_EnableVREFINT() : HAL_SYSCFG_DisableVREFINT()) +#endif +#define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) +#define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd\ + )==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + +/** + * @} + */ + +/** @defgroup HAL_FLASH_Aliased_Functions HAL FLASH Aliased Functions maintained for legacy purpose + * @{ + */ +#define FLASH_HalfPageProgram HAL_FLASHEx_HalfPageProgram +#define FLASH_EnableRunPowerDown HAL_FLASHEx_EnableRunPowerDown +#define FLASH_DisableRunPowerDown HAL_FLASHEx_DisableRunPowerDown +#define HAL_DATA_EEPROMEx_Unlock HAL_FLASHEx_DATAEEPROM_Unlock +#define HAL_DATA_EEPROMEx_Lock HAL_FLASHEx_DATAEEPROM_Lock +#define HAL_DATA_EEPROMEx_Erase HAL_FLASHEx_DATAEEPROM_Erase +#define HAL_DATA_EEPROMEx_Program HAL_FLASHEx_DATAEEPROM_Program + +/** + * @} + */ + +/** @defgroup HAL_I2C_Aliased_Functions HAL I2C Aliased Functions maintained for legacy purpose + * @{ + */ +#define HAL_I2CEx_AnalogFilter_Config HAL_I2CEx_ConfigAnalogFilter +#define HAL_I2CEx_DigitalFilter_Config HAL_I2CEx_ConfigDigitalFilter +#define HAL_FMPI2CEx_AnalogFilter_Config HAL_FMPI2CEx_ConfigAnalogFilter +#define HAL_FMPI2CEx_DigitalFilter_Config HAL_FMPI2CEx_ConfigDigitalFilter + +#define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd\ + )==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) + +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) || defined(STM32L1) +#define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT +#define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT +#define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT +#define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 || STM32L1 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4)|| defined(STM32L1) +#define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA +#define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA +#define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA +#define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 || STM32L1 */ + +#if defined(STM32F4) +#define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT +#define HAL_FMPI2C_Master_Sequential_Receive_IT HAL_FMPI2C_Master_Seq_Receive_IT +#define HAL_FMPI2C_Slave_Sequential_Transmit_IT HAL_FMPI2C_Slave_Seq_Transmit_IT +#define HAL_FMPI2C_Slave_Sequential_Receive_IT HAL_FMPI2C_Slave_Seq_Receive_IT +#define HAL_FMPI2C_Master_Sequential_Transmit_DMA HAL_FMPI2C_Master_Seq_Transmit_DMA +#define HAL_FMPI2C_Master_Sequential_Receive_DMA HAL_FMPI2C_Master_Seq_Receive_DMA +#define HAL_FMPI2C_Slave_Sequential_Transmit_DMA HAL_FMPI2C_Slave_Seq_Transmit_DMA +#define HAL_FMPI2C_Slave_Sequential_Receive_DMA HAL_FMPI2C_Slave_Seq_Receive_DMA +#endif /* STM32F4 */ +/** + * @} + */ + +/** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose + * @{ + */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif +#define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD +#define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg +#define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown +#define HAL_PWR_DisableVddio2Monitor HAL_PWREx_DisableVddio2Monitor +#define HAL_PWR_EnableBkUpReg HAL_PWREx_EnableBkUpReg +#define HAL_PWR_EnableFlashPowerDown HAL_PWREx_EnableFlashPowerDown +#define HAL_PWR_EnableVddio2Monitor HAL_PWREx_EnableVddio2Monitor +#define HAL_PWR_PVD_PVM_IRQHandler HAL_PWREx_PVD_PVM_IRQHandler +#define HAL_PWR_PVDLevelConfig HAL_PWR_ConfigPVD +#define HAL_PWR_Vddio2Monitor_IRQHandler HAL_PWREx_Vddio2Monitor_IRQHandler +#define HAL_PWR_Vddio2MonitorCallback HAL_PWREx_Vddio2MonitorCallback +#define HAL_PWREx_ActivateOverDrive HAL_PWREx_EnableOverDrive +#define HAL_PWREx_DeactivateOverDrive HAL_PWREx_DisableOverDrive +#define HAL_PWREx_DisableSDADCAnalog HAL_PWREx_DisableSDADC +#define HAL_PWREx_EnableSDADCAnalog HAL_PWREx_EnableSDADC +#define HAL_PWREx_PVMConfig HAL_PWREx_ConfigPVM + +#define PWR_MODE_NORMAL PWR_PVD_MODE_NORMAL +#define PWR_MODE_IT_RISING PWR_PVD_MODE_IT_RISING +#define PWR_MODE_IT_FALLING PWR_PVD_MODE_IT_FALLING +#define PWR_MODE_IT_RISING_FALLING PWR_PVD_MODE_IT_RISING_FALLING +#define PWR_MODE_EVENT_RISING PWR_PVD_MODE_EVENT_RISING +#define PWR_MODE_EVENT_FALLING PWR_PVD_MODE_EVENT_FALLING +#define PWR_MODE_EVENT_RISING_FALLING PWR_PVD_MODE_EVENT_RISING_FALLING + +#define CR_OFFSET_BB PWR_CR_OFFSET_BB +#define CSR_OFFSET_BB PWR_CSR_OFFSET_BB +#define PMODE_BIT_NUMBER VOS_BIT_NUMBER +#define CR_PMODE_BB CR_VOS_BB + +#define DBP_BitNumber DBP_BIT_NUMBER +#define PVDE_BitNumber PVDE_BIT_NUMBER +#define PMODE_BitNumber PMODE_BIT_NUMBER +#define EWUP_BitNumber EWUP_BIT_NUMBER +#define FPDS_BitNumber FPDS_BIT_NUMBER +#define ODEN_BitNumber ODEN_BIT_NUMBER +#define ODSWEN_BitNumber ODSWEN_BIT_NUMBER +#define MRLVDS_BitNumber MRLVDS_BIT_NUMBER +#define LPLVDS_BitNumber LPLVDS_BIT_NUMBER +#define BRE_BitNumber BRE_BIT_NUMBER + +#define PWR_MODE_EVT PWR_PVD_MODE_NORMAL + +#if defined (STM32U5) +#define PWR_SRAM1_PAGE1_STOP_RETENTION PWR_SRAM1_PAGE1_STOP +#define PWR_SRAM1_PAGE2_STOP_RETENTION PWR_SRAM1_PAGE2_STOP +#define PWR_SRAM1_PAGE3_STOP_RETENTION PWR_SRAM1_PAGE3_STOP +#define PWR_SRAM1_PAGE4_STOP_RETENTION PWR_SRAM1_PAGE4_STOP +#define PWR_SRAM1_PAGE5_STOP_RETENTION PWR_SRAM1_PAGE5_STOP +#define PWR_SRAM1_PAGE6_STOP_RETENTION PWR_SRAM1_PAGE6_STOP +#define PWR_SRAM1_PAGE7_STOP_RETENTION PWR_SRAM1_PAGE7_STOP +#define PWR_SRAM1_PAGE8_STOP_RETENTION PWR_SRAM1_PAGE8_STOP +#define PWR_SRAM1_PAGE9_STOP_RETENTION PWR_SRAM1_PAGE9_STOP +#define PWR_SRAM1_PAGE10_STOP_RETENTION PWR_SRAM1_PAGE10_STOP +#define PWR_SRAM1_PAGE11_STOP_RETENTION PWR_SRAM1_PAGE11_STOP +#define PWR_SRAM1_PAGE12_STOP_RETENTION PWR_SRAM1_PAGE12_STOP +#define PWR_SRAM1_FULL_STOP_RETENTION PWR_SRAM1_FULL_STOP + +#define PWR_SRAM2_PAGE1_STOP_RETENTION PWR_SRAM2_PAGE1_STOP +#define PWR_SRAM2_PAGE2_STOP_RETENTION PWR_SRAM2_PAGE2_STOP +#define PWR_SRAM2_FULL_STOP_RETENTION PWR_SRAM2_FULL_STOP + +#define PWR_SRAM3_PAGE1_STOP_RETENTION PWR_SRAM3_PAGE1_STOP +#define PWR_SRAM3_PAGE2_STOP_RETENTION PWR_SRAM3_PAGE2_STOP +#define PWR_SRAM3_PAGE3_STOP_RETENTION PWR_SRAM3_PAGE3_STOP +#define PWR_SRAM3_PAGE4_STOP_RETENTION PWR_SRAM3_PAGE4_STOP +#define PWR_SRAM3_PAGE5_STOP_RETENTION PWR_SRAM3_PAGE5_STOP +#define PWR_SRAM3_PAGE6_STOP_RETENTION PWR_SRAM3_PAGE6_STOP +#define PWR_SRAM3_PAGE7_STOP_RETENTION PWR_SRAM3_PAGE7_STOP +#define PWR_SRAM3_PAGE8_STOP_RETENTION PWR_SRAM3_PAGE8_STOP +#define PWR_SRAM3_PAGE9_STOP_RETENTION PWR_SRAM3_PAGE9_STOP +#define PWR_SRAM3_PAGE10_STOP_RETENTION PWR_SRAM3_PAGE10_STOP +#define PWR_SRAM3_PAGE11_STOP_RETENTION PWR_SRAM3_PAGE11_STOP +#define PWR_SRAM3_PAGE12_STOP_RETENTION PWR_SRAM3_PAGE12_STOP +#define PWR_SRAM3_PAGE13_STOP_RETENTION PWR_SRAM3_PAGE13_STOP +#define PWR_SRAM3_FULL_STOP_RETENTION PWR_SRAM3_FULL_STOP + +#define PWR_SRAM4_FULL_STOP_RETENTION PWR_SRAM4_FULL_STOP + +#define PWR_SRAM5_PAGE1_STOP_RETENTION PWR_SRAM5_PAGE1_STOP +#define PWR_SRAM5_PAGE2_STOP_RETENTION PWR_SRAM5_PAGE2_STOP +#define PWR_SRAM5_PAGE3_STOP_RETENTION PWR_SRAM5_PAGE3_STOP +#define PWR_SRAM5_PAGE4_STOP_RETENTION PWR_SRAM5_PAGE4_STOP +#define PWR_SRAM5_PAGE5_STOP_RETENTION PWR_SRAM5_PAGE5_STOP +#define PWR_SRAM5_PAGE6_STOP_RETENTION PWR_SRAM5_PAGE6_STOP +#define PWR_SRAM5_PAGE7_STOP_RETENTION PWR_SRAM5_PAGE7_STOP +#define PWR_SRAM5_PAGE8_STOP_RETENTION PWR_SRAM5_PAGE8_STOP +#define PWR_SRAM5_PAGE9_STOP_RETENTION PWR_SRAM5_PAGE9_STOP +#define PWR_SRAM5_PAGE10_STOP_RETENTION PWR_SRAM5_PAGE10_STOP +#define PWR_SRAM5_PAGE11_STOP_RETENTION PWR_SRAM5_PAGE11_STOP +#define PWR_SRAM5_PAGE12_STOP_RETENTION PWR_SRAM5_PAGE12_STOP +#define PWR_SRAM5_PAGE13_STOP_RETENTION PWR_SRAM5_PAGE13_STOP +#define PWR_SRAM5_FULL_STOP_RETENTION PWR_SRAM5_FULL_STOP + +#define PWR_ICACHE_FULL_STOP_RETENTION PWR_ICACHE_FULL_STOP +#define PWR_DCACHE1_FULL_STOP_RETENTION PWR_DCACHE1_FULL_STOP +#define PWR_DCACHE2_FULL_STOP_RETENTION PWR_DCACHE2_FULL_STOP +#define PWR_DMA2DRAM_FULL_STOP_RETENTION PWR_DMA2DRAM_FULL_STOP +#define PWR_PERIPHRAM_FULL_STOP_RETENTION PWR_PERIPHRAM_FULL_STOP +#define PWR_PKA32RAM_FULL_STOP_RETENTION PWR_PKA32RAM_FULL_STOP +#define PWR_GRAPHICPRAM_FULL_STOP_RETENTION PWR_GRAPHICPRAM_FULL_STOP +#define PWR_DSIRAM_FULL_STOP_RETENTION PWR_DSIRAM_FULL_STOP + +#define PWR_SRAM2_PAGE1_STANDBY_RETENTION PWR_SRAM2_PAGE1_STANDBY +#define PWR_SRAM2_PAGE2_STANDBY_RETENTION PWR_SRAM2_PAGE2_STANDBY +#define PWR_SRAM2_FULL_STANDBY_RETENTION PWR_SRAM2_FULL_STANDBY + +#define PWR_SRAM1_FULL_RUN_RETENTION PWR_SRAM1_FULL_RUN +#define PWR_SRAM2_FULL_RUN_RETENTION PWR_SRAM2_FULL_RUN +#define PWR_SRAM3_FULL_RUN_RETENTION PWR_SRAM3_FULL_RUN +#define PWR_SRAM4_FULL_RUN_RETENTION PWR_SRAM4_FULL_RUN +#define PWR_SRAM5_FULL_RUN_RETENTION PWR_SRAM5_FULL_RUN + +#define PWR_ALL_RAM_RUN_RETENTION_MASK PWR_ALL_RAM_RUN_MASK +#endif + +/** + * @} + */ + +/** @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) || defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) || defined(STM32WL) || defined(STM32C0) +#define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE +#else +#define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK +#endif + +#define RCC_USBCLK_PLLSAI1 RCC_USBCLKSOURCE_PLLSAI1 +#define RCC_USBCLK_PLL RCC_USBCLKSOURCE_PLL +#define RCC_USBCLK_MSI RCC_USBCLKSOURCE_MSI +#define RCC_USBCLKSOURCE_PLLCLK RCC_USBCLKSOURCE_PLL +#define RCC_USBPLLCLK_DIV1 RCC_USBCLKSOURCE_PLL +#define RCC_USBPLLCLK_DIV1_5 RCC_USBCLKSOURCE_PLL_DIV1_5 +#define RCC_USBPLLCLK_DIV2 RCC_USBCLKSOURCE_PLL_DIV2 +#define RCC_USBPLLCLK_DIV3 RCC_USBCLKSOURCE_PLL_DIV3 + +#define HSION_BitNumber RCC_HSION_BIT_NUMBER +#define HSION_BITNUMBER RCC_HSION_BIT_NUMBER +#define HSEON_BitNumber RCC_HSEON_BIT_NUMBER +#define HSEON_BITNUMBER RCC_HSEON_BIT_NUMBER +#define MSION_BITNUMBER RCC_MSION_BIT_NUMBER +#define CSSON_BitNumber RCC_CSSON_BIT_NUMBER +#define CSSON_BITNUMBER RCC_CSSON_BIT_NUMBER +#define PLLON_BitNumber RCC_PLLON_BIT_NUMBER +#define PLLON_BITNUMBER RCC_PLLON_BIT_NUMBER +#define PLLI2SON_BitNumber RCC_PLLI2SON_BIT_NUMBER +#define I2SSRC_BitNumber RCC_I2SSRC_BIT_NUMBER +#define RTCEN_BitNumber RCC_RTCEN_BIT_NUMBER +#define RTCEN_BITNUMBER RCC_RTCEN_BIT_NUMBER +#define BDRST_BitNumber RCC_BDRST_BIT_NUMBER +#define BDRST_BITNUMBER RCC_BDRST_BIT_NUMBER +#define RTCRST_BITNUMBER RCC_RTCRST_BIT_NUMBER +#define LSION_BitNumber RCC_LSION_BIT_NUMBER +#define LSION_BITNUMBER RCC_LSION_BIT_NUMBER +#define LSEON_BitNumber RCC_LSEON_BIT_NUMBER +#define LSEON_BITNUMBER RCC_LSEON_BIT_NUMBER +#define LSEBYP_BITNUMBER RCC_LSEBYP_BIT_NUMBER +#define PLLSAION_BitNumber RCC_PLLSAION_BIT_NUMBER +#define TIMPRE_BitNumber RCC_TIMPRE_BIT_NUMBER +#define RMVF_BitNumber RCC_RMVF_BIT_NUMBER +#define RMVF_BITNUMBER RCC_RMVF_BIT_NUMBER +#define RCC_CR2_HSI14TRIM_BitNumber RCC_HSI14TRIM_BIT_NUMBER +#define CR_BYTE2_ADDRESS RCC_CR_BYTE2_ADDRESS +#define CIR_BYTE1_ADDRESS RCC_CIR_BYTE1_ADDRESS +#define CIR_BYTE2_ADDRESS RCC_CIR_BYTE2_ADDRESS +#define BDCR_BYTE0_ADDRESS RCC_BDCR_BYTE0_ADDRESS +#define DBP_TIMEOUT_VALUE RCC_DBP_TIMEOUT_VALUE +#define LSE_TIMEOUT_VALUE RCC_LSE_TIMEOUT_VALUE + +#define CR_HSION_BB RCC_CR_HSION_BB +#define CR_CSSON_BB RCC_CR_CSSON_BB +#define CR_PLLON_BB RCC_CR_PLLON_BB +#define CR_PLLI2SON_BB RCC_CR_PLLI2SON_BB +#define CR_MSION_BB RCC_CR_MSION_BB +#define CSR_LSION_BB RCC_CSR_LSION_BB +#define CSR_LSEON_BB RCC_CSR_LSEON_BB +#define CSR_LSEBYP_BB RCC_CSR_LSEBYP_BB +#define CSR_RTCEN_BB RCC_CSR_RTCEN_BB +#define CSR_RTCRST_BB RCC_CSR_RTCRST_BB +#define CFGR_I2SSRC_BB RCC_CFGR_I2SSRC_BB +#define BDCR_RTCEN_BB RCC_BDCR_RTCEN_BB +#define BDCR_BDRST_BB RCC_BDCR_BDRST_BB +#define CR_HSEON_BB RCC_CR_HSEON_BB +#define CSR_RMVF_BB RCC_CSR_RMVF_BB +#define CR_PLLSAION_BB RCC_CR_PLLSAION_BB +#define DCKCFGR_TIMPRE_BB RCC_DCKCFGR_TIMPRE_BB + +#define __HAL_RCC_CRS_ENABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_ENABLE +#define __HAL_RCC_CRS_DISABLE_FREQ_ERROR_COUNTER __HAL_RCC_CRS_FREQ_ERROR_COUNTER_DISABLE +#define __HAL_RCC_CRS_ENABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_ENABLE +#define __HAL_RCC_CRS_DISABLE_AUTOMATIC_CALIB __HAL_RCC_CRS_AUTOMATIC_CALIB_DISABLE +#define __HAL_RCC_CRS_CALCULATE_RELOADVALUE __HAL_RCC_CRS_RELOADVALUE_CALCULATE + +#define __HAL_RCC_GET_IT_SOURCE __HAL_RCC_GET_IT + +#define RCC_CRS_SYNCWARM RCC_CRS_SYNCWARN +#define RCC_CRS_TRIMOV RCC_CRS_TRIMOVF + +#define RCC_PERIPHCLK_CK48 RCC_PERIPHCLK_CLK48 +#define RCC_CK48CLKSOURCE_PLLQ RCC_CLK48CLKSOURCE_PLLQ +#define RCC_CK48CLKSOURCE_PLLSAIP RCC_CLK48CLKSOURCE_PLLSAIP +#define RCC_CK48CLKSOURCE_PLLI2SQ RCC_CLK48CLKSOURCE_PLLI2SQ +#define IS_RCC_CK48CLKSOURCE IS_RCC_CLK48CLKSOURCE +#define RCC_SDIOCLKSOURCE_CK48 RCC_SDIOCLKSOURCE_CLK48 + +#define __HAL_RCC_DFSDM_CLK_ENABLE __HAL_RCC_DFSDM1_CLK_ENABLE +#define __HAL_RCC_DFSDM_CLK_DISABLE __HAL_RCC_DFSDM1_CLK_DISABLE +#define __HAL_RCC_DFSDM_IS_CLK_ENABLED __HAL_RCC_DFSDM1_IS_CLK_ENABLED +#define __HAL_RCC_DFSDM_IS_CLK_DISABLED __HAL_RCC_DFSDM1_IS_CLK_DISABLED +#define __HAL_RCC_DFSDM_FORCE_RESET __HAL_RCC_DFSDM1_FORCE_RESET +#define __HAL_RCC_DFSDM_RELEASE_RESET __HAL_RCC_DFSDM1_RELEASE_RESET +#define __HAL_RCC_DFSDM_CLK_SLEEP_ENABLE __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE +#define __HAL_RCC_DFSDM_CLK_SLEEP_DISABLE __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE +#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_ENABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_ENABLED +#define __HAL_RCC_DFSDM_IS_CLK_SLEEP_DISABLED __HAL_RCC_DFSDM1_IS_CLK_SLEEP_DISABLED +#define DfsdmClockSelection Dfsdm1ClockSelection +#define RCC_PERIPHCLK_DFSDM RCC_PERIPHCLK_DFSDM1 +#define RCC_DFSDMCLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 +#define RCC_DFSDMCLKSOURCE_SYSCLK RCC_DFSDM1CLKSOURCE_SYSCLK +#define __HAL_RCC_DFSDM_CONFIG __HAL_RCC_DFSDM1_CONFIG +#define __HAL_RCC_GET_DFSDM_SOURCE __HAL_RCC_GET_DFSDM1_SOURCE +#define RCC_DFSDM1CLKSOURCE_PCLK RCC_DFSDM1CLKSOURCE_PCLK2 +#define RCC_SWPMI1CLKSOURCE_PCLK RCC_SWPMI1CLKSOURCE_PCLK1 +#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 +#if defined(STM32U5) +#define MSIKPLLModeSEL RCC_MSIKPLL_MODE_SEL +#define MSISPLLModeSEL RCC_MSISPLL_MODE_SEL +#define __HAL_RCC_AHB21_CLK_DISABLE __HAL_RCC_AHB2_1_CLK_DISABLE +#define __HAL_RCC_AHB22_CLK_DISABLE __HAL_RCC_AHB2_2_CLK_DISABLE +#define __HAL_RCC_AHB1_CLK_Disable_Clear __HAL_RCC_AHB1_CLK_ENABLE +#define __HAL_RCC_AHB21_CLK_Disable_Clear __HAL_RCC_AHB2_1_CLK_ENABLE +#define __HAL_RCC_AHB22_CLK_Disable_Clear __HAL_RCC_AHB2_2_CLK_ENABLE +#define __HAL_RCC_AHB3_CLK_Disable_Clear __HAL_RCC_AHB3_CLK_ENABLE +#define __HAL_RCC_APB1_CLK_Disable_Clear __HAL_RCC_APB1_CLK_ENABLE +#define __HAL_RCC_APB2_CLK_Disable_Clear __HAL_RCC_APB2_CLK_ENABLE +#define __HAL_RCC_APB3_CLK_Disable_Clear __HAL_RCC_APB3_CLK_ENABLE +#define IS_RCC_MSIPLLModeSelection IS_RCC_MSIPLLMODE_SELECT +#define RCC_PERIPHCLK_CLK48 RCC_PERIPHCLK_ICLK +#define RCC_CLK48CLKSOURCE_HSI48 RCC_ICLK_CLKSOURCE_HSI48 +#define RCC_CLK48CLKSOURCE_PLL2 RCC_ICLK_CLKSOURCE_PLL2 +#define RCC_CLK48CLKSOURCE_PLL1 RCC_ICLK_CLKSOURCE_PLL1 +#define RCC_CLK48CLKSOURCE_MSIK RCC_ICLK_CLKSOURCE_MSIK +#define __HAL_RCC_ADC1_CLK_ENABLE __HAL_RCC_ADC12_CLK_ENABLE +#define __HAL_RCC_ADC1_CLK_DISABLE __HAL_RCC_ADC12_CLK_DISABLE +#define __HAL_RCC_ADC1_IS_CLK_ENABLED __HAL_RCC_ADC12_IS_CLK_ENABLED +#define __HAL_RCC_ADC1_IS_CLK_DISABLED __HAL_RCC_ADC12_IS_CLK_DISABLED +#define __HAL_RCC_ADC1_FORCE_RESET __HAL_RCC_ADC12_FORCE_RESET +#define __HAL_RCC_ADC1_RELEASE_RESET __HAL_RCC_ADC12_RELEASE_RESET +#define __HAL_RCC_ADC1_CLK_SLEEP_ENABLE __HAL_RCC_ADC12_CLK_SLEEP_ENABLE +#define __HAL_RCC_ADC1_CLK_SLEEP_DISABLE __HAL_RCC_ADC12_CLK_SLEEP_DISABLE +#define __HAL_RCC_GET_CLK48_SOURCE __HAL_RCC_GET_ICLK_SOURCE +#define __HAL_RCC_PLLFRACN_ENABLE __HAL_RCC_PLL_FRACN_ENABLE +#define __HAL_RCC_PLLFRACN_DISABLE __HAL_RCC_PLL_FRACN_DISABLE +#define __HAL_RCC_PLLFRACN_CONFIG __HAL_RCC_PLL_FRACN_CONFIG +#define IS_RCC_PLLFRACN_VALUE IS_RCC_PLL_FRACN_VALUE +#endif /* STM32U5 */ + +/** + * @} + */ + +/** @defgroup HAL_RNG_Aliased_Macros HAL RNG Aliased Macros maintained for legacy purpose + * @{ + */ +#define HAL_RNG_ReadyCallback(__HANDLE__) HAL_RNG_ReadyDataCallback((__HANDLE__), uint32_t random32bit) + +/** + * @} + */ + +/** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx)|| \ + defined (STM32L4Q5xx) || defined (STM32G4) || defined (STM32WL) || defined (STM32U5) || \ + defined (STM32C0) +#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/MMC Aliased Macros maintained for legacy purpose + * @{ + */ + +#define SD_OCR_CID_CSD_OVERWRIETE SD_OCR_CID_CSD_OVERWRITE +#define SD_CMD_SD_APP_STAUS SD_CMD_SD_APP_STATUS + +#if !defined(STM32F1) && !defined(STM32F2) && !defined(STM32F4) && !defined(STM32L1) +#define eMMC_HIGH_VOLTAGE_RANGE EMMC_HIGH_VOLTAGE_RANGE +#define eMMC_DUAL_VOLTAGE_RANGE EMMC_DUAL_VOLTAGE_RANGE +#define eMMC_LOW_VOLTAGE_RANGE EMMC_LOW_VOLTAGE_RANGE + +#define SDMMC_NSpeed_CLK_DIV SDMMC_NSPEED_CLK_DIV +#define SDMMC_HSpeed_CLK_DIV SDMMC_HSPEED_CLK_DIV +#endif + +#if defined(STM32F4) || defined(STM32F2) +#define SD_SDMMC_DISABLED SD_SDIO_DISABLED +#define SD_SDMMC_FUNCTION_BUSY SD_SDIO_FUNCTION_BUSY +#define SD_SDMMC_FUNCTION_FAILED SD_SDIO_FUNCTION_FAILED +#define SD_SDMMC_UNKNOWN_FUNCTION SD_SDIO_UNKNOWN_FUNCTION +#define SD_CMD_SDMMC_SEN_OP_COND SD_CMD_SDIO_SEN_OP_COND +#define SD_CMD_SDMMC_RW_DIRECT SD_CMD_SDIO_RW_DIRECT +#define SD_CMD_SDMMC_RW_EXTENDED SD_CMD_SDIO_RW_EXTENDED +#define __HAL_SD_SDMMC_ENABLE __HAL_SD_SDIO_ENABLE +#define __HAL_SD_SDMMC_DISABLE __HAL_SD_SDIO_DISABLE +#define __HAL_SD_SDMMC_DMA_ENABLE __HAL_SD_SDIO_DMA_ENABLE +#define __HAL_SD_SDMMC_DMA_DISABLE __HAL_SD_SDIO_DMA_DISABL +#define __HAL_SD_SDMMC_ENABLE_IT __HAL_SD_SDIO_ENABLE_IT +#define __HAL_SD_SDMMC_DISABLE_IT __HAL_SD_SDIO_DISABLE_IT +#define __HAL_SD_SDMMC_GET_FLAG __HAL_SD_SDIO_GET_FLAG +#define __HAL_SD_SDMMC_CLEAR_FLAG __HAL_SD_SDIO_CLEAR_FLAG +#define __HAL_SD_SDMMC_GET_IT __HAL_SD_SDIO_GET_IT +#define __HAL_SD_SDMMC_CLEAR_IT __HAL_SD_SDIO_CLEAR_IT +#define SDMMC_STATIC_FLAGS SDIO_STATIC_FLAGS +#define SDMMC_CMD0TIMEOUT SDIO_CMD0TIMEOUT +#define SD_SDMMC_SEND_IF_COND SD_SDIO_SEND_IF_COND +/* alias CMSIS */ +#define SDMMC1_IRQn SDIO_IRQn +#define SDMMC1_IRQHandler SDIO_IRQHandler +#endif + +#if defined(STM32F7) || defined(STM32L4) +#define SD_SDIO_DISABLED SD_SDMMC_DISABLED +#define SD_SDIO_FUNCTION_BUSY SD_SDMMC_FUNCTION_BUSY +#define SD_SDIO_FUNCTION_FAILED SD_SDMMC_FUNCTION_FAILED +#define SD_SDIO_UNKNOWN_FUNCTION SD_SDMMC_UNKNOWN_FUNCTION +#define SD_CMD_SDIO_SEN_OP_COND SD_CMD_SDMMC_SEN_OP_COND +#define SD_CMD_SDIO_RW_DIRECT SD_CMD_SDMMC_RW_DIRECT +#define SD_CMD_SDIO_RW_EXTENDED SD_CMD_SDMMC_RW_EXTENDED +#define __HAL_SD_SDIO_ENABLE __HAL_SD_SDMMC_ENABLE +#define __HAL_SD_SDIO_DISABLE __HAL_SD_SDMMC_DISABLE +#define __HAL_SD_SDIO_DMA_ENABLE __HAL_SD_SDMMC_DMA_ENABLE +#define __HAL_SD_SDIO_DMA_DISABL __HAL_SD_SDMMC_DMA_DISABLE +#define __HAL_SD_SDIO_ENABLE_IT __HAL_SD_SDMMC_ENABLE_IT +#define __HAL_SD_SDIO_DISABLE_IT __HAL_SD_SDMMC_DISABLE_IT +#define __HAL_SD_SDIO_GET_FLAG __HAL_SD_SDMMC_GET_FLAG +#define __HAL_SD_SDIO_CLEAR_FLAG __HAL_SD_SDMMC_CLEAR_FLAG +#define __HAL_SD_SDIO_GET_IT __HAL_SD_SDMMC_GET_IT +#define __HAL_SD_SDIO_CLEAR_IT __HAL_SD_SDMMC_CLEAR_IT +#define SDIO_STATIC_FLAGS SDMMC_STATIC_FLAGS +#define SDIO_CMD0TIMEOUT SDMMC_CMD0TIMEOUT +#define SD_SDIO_SEND_IF_COND SD_SDMMC_SEND_IF_COND +/* alias CMSIS for compatibilities */ +#define SDIO_IRQn SDMMC1_IRQn +#define SDIO_IRQHandler SDMMC1_IRQHandler +#endif + +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) +#define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef +#define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef +#define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef +#define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef +#endif + +#if defined(STM32H7) || defined(STM32L5) +#define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback +#define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback +#define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback +#define HAL_MMCEx_Write_DMADoubleBuffer1CpltCallback HAL_MMCEx_Write_DMADoubleBuf1CpltCallback +#define HAL_SDEx_Read_DMADoubleBuffer0CpltCallback HAL_SDEx_Read_DMADoubleBuf0CpltCallback +#define HAL_SDEx_Read_DMADoubleBuffer1CpltCallback HAL_SDEx_Read_DMADoubleBuf1CpltCallback +#define HAL_SDEx_Write_DMADoubleBuffer0CpltCallback HAL_SDEx_Write_DMADoubleBuf0CpltCallback +#define HAL_SDEx_Write_DMADoubleBuffer1CpltCallback HAL_SDEx_Write_DMADoubleBuf1CpltCallback +#define HAL_SD_DriveTransciver_1_8V_Callback HAL_SD_DriveTransceiver_1_8V_Callback +#endif +/** + * @} + */ + +/** @defgroup HAL_SMARTCARD_Aliased_Macros HAL SMARTCARD Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __SMARTCARD_ENABLE_IT __HAL_SMARTCARD_ENABLE_IT +#define __SMARTCARD_DISABLE_IT __HAL_SMARTCARD_DISABLE_IT +#define __SMARTCARD_ENABLE __HAL_SMARTCARD_ENABLE +#define __SMARTCARD_DISABLE __HAL_SMARTCARD_DISABLE +#define __SMARTCARD_DMA_REQUEST_ENABLE __HAL_SMARTCARD_DMA_REQUEST_ENABLE +#define __SMARTCARD_DMA_REQUEST_DISABLE __HAL_SMARTCARD_DMA_REQUEST_DISABLE + +#define __HAL_SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE +#define __SMARTCARD_GETCLOCKSOURCE SMARTCARD_GETCLOCKSOURCE + +#define IS_SMARTCARD_ONEBIT_SAMPLING IS_SMARTCARD_ONE_BIT_SAMPLE + +/** + * @} + */ + +/** @defgroup HAL_SMBUS_Aliased_Macros HAL SMBUS Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_SMBUS_RESET_CR1 SMBUS_RESET_CR1 +#define __HAL_SMBUS_RESET_CR2 SMBUS_RESET_CR2 +#define __HAL_SMBUS_GENERATE_START SMBUS_GENERATE_START +#define __HAL_SMBUS_GET_ADDR_MATCH SMBUS_GET_ADDR_MATCH +#define __HAL_SMBUS_GET_DIR SMBUS_GET_DIR +#define __HAL_SMBUS_GET_STOP_MODE SMBUS_GET_STOP_MODE +#define __HAL_SMBUS_GET_PEC_MODE SMBUS_GET_PEC_MODE +#define __HAL_SMBUS_GET_ALERT_ENABLED SMBUS_GET_ALERT_ENABLED +/** + * @} + */ + +/** @defgroup HAL_SPI_Aliased_Macros HAL SPI Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __HAL_SPI_1LINE_TX SPI_1LINE_TX +#define __HAL_SPI_1LINE_RX SPI_1LINE_RX +#define __HAL_SPI_RESET_CRC SPI_RESET_CRC + +/** + * @} + */ + +/** @defgroup HAL_UART_Aliased_Macros HAL UART Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __HAL_UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE +#define __HAL_UART_MASK_COMPUTATION UART_MASK_COMPUTATION +#define __UART_GETCLOCKSOURCE UART_GETCLOCKSOURCE +#define __UART_MASK_COMPUTATION UART_MASK_COMPUTATION + +#define IS_UART_WAKEUPMETHODE IS_UART_WAKEUPMETHOD + +#define IS_UART_ONEBIT_SAMPLE IS_UART_ONE_BIT_SAMPLE +#define IS_UART_ONEBIT_SAMPLING IS_UART_ONE_BIT_SAMPLE + +/** + * @} + */ + + +/** @defgroup HAL_USART_Aliased_Macros HAL USART Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __USART_ENABLE_IT __HAL_USART_ENABLE_IT +#define __USART_DISABLE_IT __HAL_USART_DISABLE_IT +#define __USART_ENABLE __HAL_USART_ENABLE +#define __USART_DISABLE __HAL_USART_DISABLE + +#define __HAL_USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE +#define __USART_GETCLOCKSOURCE USART_GETCLOCKSOURCE + +#if defined(STM32F0) || defined(STM32F3) || defined(STM32F7) +#define USART_OVERSAMPLING_16 0x00000000U +#define USART_OVERSAMPLING_8 USART_CR1_OVER8 + +#define IS_USART_OVERSAMPLING(__SAMPLING__) (((__SAMPLING__) == USART_OVERSAMPLING_16) || \ + ((__SAMPLING__) == USART_OVERSAMPLING_8)) +#endif /* STM32F0 || STM32F3 || STM32F7 */ +/** + * @} + */ + +/** @defgroup HAL_USB_Aliased_Macros HAL USB Aliased Macros maintained for legacy purpose + * @{ + */ +#define USB_EXTI_LINE_WAKEUP USB_WAKEUP_EXTI_LINE + +#define USB_FS_EXTI_TRIGGER_RISING_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE +#define USB_FS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE +#define USB_FS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE +#define USB_FS_EXTI_LINE_WAKEUP USB_OTG_FS_WAKEUP_EXTI_LINE + +#define USB_HS_EXTI_TRIGGER_RISING_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE +#define USB_HS_EXTI_TRIGGER_FALLING_EDGE USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE +#define USB_HS_EXTI_TRIGGER_BOTH_EDGE USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE +#define USB_HS_EXTI_LINE_WAKEUP USB_OTG_HS_WAKEUP_EXTI_LINE + +#define __HAL_USB_EXTI_ENABLE_IT __HAL_USB_WAKEUP_EXTI_ENABLE_IT +#define __HAL_USB_EXTI_DISABLE_IT __HAL_USB_WAKEUP_EXTI_DISABLE_IT +#define __HAL_USB_EXTI_GET_FLAG __HAL_USB_WAKEUP_EXTI_GET_FLAG +#define __HAL_USB_EXTI_CLEAR_FLAG __HAL_USB_WAKEUP_EXTI_CLEAR_FLAG +#define __HAL_USB_EXTI_SET_RISING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE +#define __HAL_USB_EXTI_SET_FALLING_EDGE_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_FALLING_EDGE +#define __HAL_USB_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE + +#define __HAL_USB_FS_EXTI_ENABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT +#define __HAL_USB_FS_EXTI_DISABLE_IT __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT +#define __HAL_USB_FS_EXTI_GET_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG +#define __HAL_USB_FS_EXTI_CLEAR_FLAG __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG +#define __HAL_USB_FS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE +#define __HAL_USB_FS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_FALLING_EDGE +#define __HAL_USB_FS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE +#define __HAL_USB_FS_EXTI_GENERATE_SWIT __HAL_USB_OTG_FS_WAKEUP_EXTI_GENERATE_SWIT + +#define __HAL_USB_HS_EXTI_ENABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT +#define __HAL_USB_HS_EXTI_DISABLE_IT __HAL_USB_OTG_HS_WAKEUP_EXTI_DISABLE_IT +#define __HAL_USB_HS_EXTI_GET_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG +#define __HAL_USB_HS_EXTI_CLEAR_FLAG __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG +#define __HAL_USB_HS_EXTI_SET_RISING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE +#define __HAL_USB_HS_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_FALLING_EDGE +#define __HAL_USB_HS_EXTI_SET_FALLINGRISING_TRIGGER __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_FALLING_EDGE +#define __HAL_USB_HS_EXTI_GENERATE_SWIT __HAL_USB_OTG_HS_WAKEUP_EXTI_GENERATE_SWIT + +#define HAL_PCD_ActiveRemoteWakeup HAL_PCD_ActivateRemoteWakeup +#define HAL_PCD_DeActiveRemoteWakeup HAL_PCD_DeActivateRemoteWakeup + +#define HAL_PCD_SetTxFiFo HAL_PCDEx_SetTxFiFo +#define HAL_PCD_SetRxFiFo HAL_PCDEx_SetRxFiFo +/** + * @} + */ + +/** @defgroup HAL_TIM_Aliased_Macros HAL TIM Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_TIM_SetICPrescalerValue TIM_SET_ICPRESCALERVALUE +#define __HAL_TIM_ResetICPrescalerValue TIM_RESET_ICPRESCALERVALUE + +#define TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE +#define TIM_GET_CLEAR_IT __HAL_TIM_CLEAR_IT + +#define __HAL_TIM_GET_ITSTATUS __HAL_TIM_GET_IT_SOURCE + +#define __HAL_TIM_DIRECTION_STATUS __HAL_TIM_IS_TIM_COUNTING_DOWN +#define __HAL_TIM_PRESCALER __HAL_TIM_SET_PRESCALER +#define __HAL_TIM_SetCounter __HAL_TIM_SET_COUNTER +#define __HAL_TIM_GetCounter __HAL_TIM_GET_COUNTER +#define __HAL_TIM_SetAutoreload __HAL_TIM_SET_AUTORELOAD +#define __HAL_TIM_GetAutoreload __HAL_TIM_GET_AUTORELOAD +#define __HAL_TIM_SetClockDivision __HAL_TIM_SET_CLOCKDIVISION +#define __HAL_TIM_GetClockDivision __HAL_TIM_GET_CLOCKDIVISION +#define __HAL_TIM_SetICPrescaler __HAL_TIM_SET_ICPRESCALER +#define __HAL_TIM_GetICPrescaler __HAL_TIM_GET_ICPRESCALER +#define __HAL_TIM_SetCompare __HAL_TIM_SET_COMPARE +#define __HAL_TIM_GetCompare __HAL_TIM_GET_COMPARE + +#define TIM_BREAKINPUTSOURCE_DFSDM TIM_BREAKINPUTSOURCE_DFSDM1 +/** + * @} + */ + +/** @defgroup HAL_ETH_Aliased_Macros HAL ETH Aliased Macros maintained for legacy purpose + * @{ + */ + +#define __HAL_ETH_EXTI_ENABLE_IT __HAL_ETH_WAKEUP_EXTI_ENABLE_IT +#define __HAL_ETH_EXTI_DISABLE_IT __HAL_ETH_WAKEUP_EXTI_DISABLE_IT +#define __HAL_ETH_EXTI_GET_FLAG __HAL_ETH_WAKEUP_EXTI_GET_FLAG +#define __HAL_ETH_EXTI_CLEAR_FLAG __HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG +#define __HAL_ETH_EXTI_SET_RISING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_RISING_EDGE_TRIGGER +#define __HAL_ETH_EXTI_SET_FALLING_EGDE_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLING_EDGE_TRIGGER +#define __HAL_ETH_EXTI_SET_FALLINGRISING_TRIGGER __HAL_ETH_WAKEUP_EXTI_ENABLE_FALLINGRISING_TRIGGER + +#define ETH_PROMISCIOUSMODE_ENABLE ETH_PROMISCUOUS_MODE_ENABLE +#define ETH_PROMISCIOUSMODE_DISABLE ETH_PROMISCUOUS_MODE_DISABLE +#define IS_ETH_PROMISCIOUS_MODE IS_ETH_PROMISCUOUS_MODE +/** + * @} + */ + +/** @defgroup HAL_LTDC_Aliased_Macros HAL LTDC Aliased Macros maintained for legacy purpose + * @{ + */ +#define __HAL_LTDC_LAYER LTDC_LAYER +#define __HAL_LTDC_RELOAD_CONFIG __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG +/** + * @} + */ + +/** @defgroup HAL_SAI_Aliased_Macros HAL SAI Aliased Macros maintained for legacy purpose + * @{ + */ +#define SAI_OUTPUTDRIVE_DISABLED SAI_OUTPUTDRIVE_DISABLE +#define SAI_OUTPUTDRIVE_ENABLED SAI_OUTPUTDRIVE_ENABLE +#define SAI_MASTERDIVIDER_ENABLED SAI_MASTERDIVIDER_ENABLE +#define SAI_MASTERDIVIDER_DISABLED SAI_MASTERDIVIDER_DISABLE +#define SAI_STREOMODE SAI_STEREOMODE +#define SAI_FIFOStatus_Empty SAI_FIFOSTATUS_EMPTY +#define SAI_FIFOStatus_Less1QuarterFull SAI_FIFOSTATUS_LESS1QUARTERFULL +#define SAI_FIFOStatus_1QuarterFull SAI_FIFOSTATUS_1QUARTERFULL +#define SAI_FIFOStatus_HalfFull SAI_FIFOSTATUS_HALFFULL +#define SAI_FIFOStatus_3QuartersFull SAI_FIFOSTATUS_3QUARTERFULL +#define SAI_FIFOStatus_Full SAI_FIFOSTATUS_FULL +#define IS_SAI_BLOCK_MONO_STREO_MODE IS_SAI_BLOCK_MONO_STEREO_MODE +#define SAI_SYNCHRONOUS_EXT SAI_SYNCHRONOUS_EXT_SAI1 +#define SAI_SYNCEXT_IN_ENABLE SAI_SYNCEXT_OUTBLOCKA_ENABLE +/** + * @} + */ + +/** @defgroup HAL_SPDIFRX_Aliased_Macros HAL SPDIFRX Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined(STM32H7) +#define HAL_SPDIFRX_ReceiveControlFlow HAL_SPDIFRX_ReceiveCtrlFlow +#define HAL_SPDIFRX_ReceiveControlFlow_IT HAL_SPDIFRX_ReceiveCtrlFlow_IT +#define HAL_SPDIFRX_ReceiveControlFlow_DMA HAL_SPDIFRX_ReceiveCtrlFlow_DMA +#endif +/** + * @} + */ + +/** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose + * @{ + */ +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#endif +/** + * @} + */ + +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) || defined(STM32H7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + +/** @defgroup HAL_Generic_Aliased_Macros HAL Generic Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32F7) +#define ART_ACCLERATOR_ENABLE ART_ACCELERATOR_ENABLE +#endif /* STM32F7 */ +/** + * @} + */ + +/** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose + * @{ + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32_HAL_LEGACY */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h new file mode 100644 index 0000000..f7eb847 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h @@ -0,0 +1,297 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal.h + * @author MCD Application Team + * @brief This file contains all the functions prototypes for the HAL + * module driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_H +#define __STM32F4xx_HAL_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_conf.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup HAL + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup HAL_Exported_Constants HAL Exported Constants + * @{ + */ + +/** @defgroup HAL_TICK_FREQ Tick Frequency + * @{ + */ +typedef enum +{ + HAL_TICK_FREQ_10HZ = 100U, + HAL_TICK_FREQ_100HZ = 10U, + HAL_TICK_FREQ_1KHZ = 1U, + HAL_TICK_FREQ_DEFAULT = HAL_TICK_FREQ_1KHZ +} HAL_TickFreqTypeDef; +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup HAL_Exported_Macros HAL Exported Macros + * @{ + */ + +/** @brief Freeze/Unfreeze Peripherals in Debug mode + */ +#define __HAL_DBGMCU_FREEZE_TIM2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM2_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM3() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM3_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM4() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM4_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM5() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM5_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM6() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM6_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM7() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM7_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM12() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM12_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM13() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM13_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM14() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_TIM14_STOP)) +#define __HAL_DBGMCU_FREEZE_RTC() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_RTC_STOP)) +#define __HAL_DBGMCU_FREEZE_WWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_WWDG_STOP)) +#define __HAL_DBGMCU_FREEZE_IWDG() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_IWDG_STOP)) +#define __HAL_DBGMCU_FREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_FREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_FREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_FREEZE_CAN1() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN1_STOP)) +#define __HAL_DBGMCU_FREEZE_CAN2() (DBGMCU->APB1FZ |= (DBGMCU_APB1_FZ_DBG_CAN2_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM1() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM1_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM8() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM8_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM9() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM9_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM10() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM10_STOP)) +#define __HAL_DBGMCU_FREEZE_TIM11() (DBGMCU->APB2FZ |= (DBGMCU_APB2_FZ_DBG_TIM11_STOP)) + +#define __HAL_DBGMCU_UNFREEZE_TIM2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM2_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM3() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM3_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM4() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM4_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM5() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM5_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM6() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM6_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM7() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM7_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM12() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM12_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM13() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM13_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM14() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_TIM14_STOP)) +#define __HAL_DBGMCU_UNFREEZE_RTC() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_RTC_STOP)) +#define __HAL_DBGMCU_UNFREEZE_WWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_WWDG_STOP)) +#define __HAL_DBGMCU_UNFREEZE_IWDG() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_IWDG_STOP)) +#define __HAL_DBGMCU_UNFREEZE_I2C1_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_UNFREEZE_I2C2_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_UNFREEZE_I2C3_TIMEOUT() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT)) +#define __HAL_DBGMCU_UNFREEZE_CAN1() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN1_STOP)) +#define __HAL_DBGMCU_UNFREEZE_CAN2() (DBGMCU->APB1FZ &= ~(DBGMCU_APB1_FZ_DBG_CAN2_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM1() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM1_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM8() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM8_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM9() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM9_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM10() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM10_STOP)) +#define __HAL_DBGMCU_UNFREEZE_TIM11() (DBGMCU->APB2FZ &= ~(DBGMCU_APB2_FZ_DBG_TIM11_STOP)) + +/** @brief Main Flash memory mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FLASH() (SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE)) + +/** @brief System Flash memory mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= SYSCFG_MEMRMP_MEM_MODE_0;\ + }while(0); + +/** @brief Embedded SRAM mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_SRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_0 | SYSCFG_MEMRMP_MEM_MODE_1);\ + }while(0); + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +/** @brief FSMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FSMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ + }while(0); +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** @brief FMC Bank1 (NOR/PSRAM 1 and 2) mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FMC() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_1);\ + }while(0); + +/** @brief FMC/SDRAM Bank 1 and 2 mapped at 0x00000000 + */ +#define __HAL_SYSCFG_REMAPMEMORY_FMC_SDRAM() do {SYSCFG->MEMRMP &= ~(SYSCFG_MEMRMP_MEM_MODE);\ + SYSCFG->MEMRMP |= (SYSCFG_MEMRMP_MEM_MODE_2);\ + }while(0); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup Cortex_Lockup_Enable Cortex Lockup Enable + * @{ + */ +/** @brief SYSCFG Break Lockup lock + * Enables and locks the connection of Cortex-M4 LOCKUP (Hardfault) output to TIM1/8 input + * @note The selected configuration is locked and can be unlocked by system reset + */ +#define __HAL_SYSCFG_BREAK_PVD_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_PVD_LOCK); \ + SYSCFG->CFGR2 |= SYSCFG_CFGR2_PVD_LOCK; \ + }while(0) +/** + * @} + */ + +/** @defgroup PVD_Lock_Enable PVD Lock + * @{ + */ +/** @brief SYSCFG Break PVD lock + * Enables and locks the PVD connection with Timer1/8 Break Input, , as well as the PVDE and PLS[2:0] in the PWR_CR register + * @note The selected configuration is locked and can be unlocked by system reset + */ +#define __HAL_SYSCFG_BREAK_LOCKUP_LOCK() do {SYSCFG->CFGR2 &= ~(SYSCFG_CFGR2_LOCKUP_LOCK); \ + SYSCFG->CFGR2 |= SYSCFG_CFGR2_LOCKUP_LOCK; \ + }while(0) +/** + * @} + */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup HAL_Private_Macros HAL Private Macros + * @{ + */ +#define IS_TICKFREQ(FREQ) (((FREQ) == HAL_TICK_FREQ_10HZ) || \ + ((FREQ) == HAL_TICK_FREQ_100HZ) || \ + ((FREQ) == HAL_TICK_FREQ_1KHZ)) +/** + * @} + */ + +/* Exported variables --------------------------------------------------------*/ + +/** @addtogroup HAL_Exported_Variables + * @{ + */ +extern __IO uint32_t uwTick; +extern uint32_t uwTickPrio; +extern HAL_TickFreqTypeDef uwTickFreq; +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup HAL_Exported_Functions + * @{ + */ +/** @addtogroup HAL_Exported_Functions_Group1 + * @{ + */ +/* Initialization and Configuration functions ******************************/ +HAL_StatusTypeDef HAL_Init(void); +HAL_StatusTypeDef HAL_DeInit(void); +void HAL_MspInit(void); +void HAL_MspDeInit(void); +HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority); +/** + * @} + */ + +/** @addtogroup HAL_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions ************************************************/ +void HAL_IncTick(void); +void HAL_Delay(uint32_t Delay); +uint32_t HAL_GetTick(void); +uint32_t HAL_GetTickPrio(void); +HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq); +HAL_TickFreqTypeDef HAL_GetTickFreq(void); +void HAL_SuspendTick(void); +void HAL_ResumeTick(void); +uint32_t HAL_GetHalVersion(void); +uint32_t HAL_GetREVID(void); +uint32_t HAL_GetDEVID(void); +void HAL_DBGMCU_EnableDBGSleepMode(void); +void HAL_DBGMCU_DisableDBGSleepMode(void); +void HAL_DBGMCU_EnableDBGStopMode(void); +void HAL_DBGMCU_DisableDBGStopMode(void); +void HAL_DBGMCU_EnableDBGStandbyMode(void); +void HAL_DBGMCU_DisableDBGStandbyMode(void); +void HAL_EnableCompensationCell(void); +void HAL_DisableCompensationCell(void); +uint32_t HAL_GetUIDw0(void); +uint32_t HAL_GetUIDw1(void); +uint32_t HAL_GetUIDw2(void); +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +void HAL_EnableMemorySwappingBank(void); +void HAL_DisableMemorySwappingBank(void); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup HAL_Private_Variables HAL Private Variables + * @{ + */ +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup HAL_Private_Constants HAL Private Constants + * @{ + */ +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h new file mode 100644 index 0000000..fdc96b5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h @@ -0,0 +1,407 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_cortex.h + * @author MCD Application Team + * @brief Header file of CORTEX HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CORTEX_H +#define __STM32F4xx_HAL_CORTEX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup CORTEX + * @{ + */ +/* Exported types ------------------------------------------------------------*/ +/** @defgroup CORTEX_Exported_Types Cortex Exported Types + * @{ + */ + +#if (__MPU_PRESENT == 1U) +/** @defgroup CORTEX_MPU_Region_Initialization_Structure_definition MPU Region Initialization Structure Definition + * @brief MPU Region initialization structure + * @{ + */ +typedef struct +{ + uint8_t Enable; /*!< Specifies the status of the region. + This parameter can be a value of @ref CORTEX_MPU_Region_Enable */ + uint8_t Number; /*!< Specifies the number of the region to protect. + This parameter can be a value of @ref CORTEX_MPU_Region_Number */ + uint32_t BaseAddress; /*!< Specifies the base address of the region to protect. */ + uint8_t Size; /*!< Specifies the size of the region to protect. + This parameter can be a value of @ref CORTEX_MPU_Region_Size */ + uint8_t SubRegionDisable; /*!< Specifies the number of the subregion protection to disable. + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */ + uint8_t TypeExtField; /*!< Specifies the TEX field level. + This parameter can be a value of @ref CORTEX_MPU_TEX_Levels */ + uint8_t AccessPermission; /*!< Specifies the region access permission type. + This parameter can be a value of @ref CORTEX_MPU_Region_Permission_Attributes */ + uint8_t DisableExec; /*!< Specifies the instruction access status. + This parameter can be a value of @ref CORTEX_MPU_Instruction_Access */ + uint8_t IsShareable; /*!< Specifies the shareability status of the protected region. + This parameter can be a value of @ref CORTEX_MPU_Access_Shareable */ + uint8_t IsCacheable; /*!< Specifies the cacheable status of the region protected. + This parameter can be a value of @ref CORTEX_MPU_Access_Cacheable */ + uint8_t IsBufferable; /*!< Specifies the bufferable status of the protected region. + This parameter can be a value of @ref CORTEX_MPU_Access_Bufferable */ +}MPU_Region_InitTypeDef; +/** + * @} + */ +#endif /* __MPU_PRESENT */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup CORTEX_Exported_Constants CORTEX Exported Constants + * @{ + */ + +/** @defgroup CORTEX_Preemption_Priority_Group CORTEX Preemption Priority Group + * @{ + */ +#define NVIC_PRIORITYGROUP_0 0x00000007U /*!< 0 bits for pre-emption priority + 4 bits for subpriority */ +#define NVIC_PRIORITYGROUP_1 0x00000006U /*!< 1 bits for pre-emption priority + 3 bits for subpriority */ +#define NVIC_PRIORITYGROUP_2 0x00000005U /*!< 2 bits for pre-emption priority + 2 bits for subpriority */ +#define NVIC_PRIORITYGROUP_3 0x00000004U /*!< 3 bits for pre-emption priority + 1 bits for subpriority */ +#define NVIC_PRIORITYGROUP_4 0x00000003U /*!< 4 bits for pre-emption priority + 0 bits for subpriority */ +/** + * @} + */ + +/** @defgroup CORTEX_SysTick_clock_source CORTEX _SysTick clock source + * @{ + */ +#define SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U +#define SYSTICK_CLKSOURCE_HCLK 0x00000004U + +/** + * @} + */ + +#if (__MPU_PRESENT == 1) +/** @defgroup CORTEX_MPU_HFNMI_PRIVDEF_Control MPU HFNMI and PRIVILEGED Access control + * @{ + */ +#define MPU_HFNMI_PRIVDEF_NONE 0x00000000U +#define MPU_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk +#define MPU_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk +#define MPU_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) + +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Enable CORTEX MPU Region Enable + * @{ + */ +#define MPU_REGION_ENABLE ((uint8_t)0x01) +#define MPU_REGION_DISABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Instruction_Access CORTEX MPU Instruction Access + * @{ + */ +#define MPU_INSTRUCTION_ACCESS_ENABLE ((uint8_t)0x00) +#define MPU_INSTRUCTION_ACCESS_DISABLE ((uint8_t)0x01) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Shareable CORTEX MPU Instruction Access Shareable + * @{ + */ +#define MPU_ACCESS_SHAREABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_SHAREABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Cacheable CORTEX MPU Instruction Access Cacheable + * @{ + */ +#define MPU_ACCESS_CACHEABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_CACHEABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Access_Bufferable CORTEX MPU Instruction Access Bufferable + * @{ + */ +#define MPU_ACCESS_BUFFERABLE ((uint8_t)0x01) +#define MPU_ACCESS_NOT_BUFFERABLE ((uint8_t)0x00) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_TEX_Levels MPU TEX Levels + * @{ + */ +#define MPU_TEX_LEVEL0 ((uint8_t)0x00) +#define MPU_TEX_LEVEL1 ((uint8_t)0x01) +#define MPU_TEX_LEVEL2 ((uint8_t)0x02) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Size CORTEX MPU Region Size + * @{ + */ +#define MPU_REGION_SIZE_32B ((uint8_t)0x04) +#define MPU_REGION_SIZE_64B ((uint8_t)0x05) +#define MPU_REGION_SIZE_128B ((uint8_t)0x06) +#define MPU_REGION_SIZE_256B ((uint8_t)0x07) +#define MPU_REGION_SIZE_512B ((uint8_t)0x08) +#define MPU_REGION_SIZE_1KB ((uint8_t)0x09) +#define MPU_REGION_SIZE_2KB ((uint8_t)0x0A) +#define MPU_REGION_SIZE_4KB ((uint8_t)0x0B) +#define MPU_REGION_SIZE_8KB ((uint8_t)0x0C) +#define MPU_REGION_SIZE_16KB ((uint8_t)0x0D) +#define MPU_REGION_SIZE_32KB ((uint8_t)0x0E) +#define MPU_REGION_SIZE_64KB ((uint8_t)0x0F) +#define MPU_REGION_SIZE_128KB ((uint8_t)0x10) +#define MPU_REGION_SIZE_256KB ((uint8_t)0x11) +#define MPU_REGION_SIZE_512KB ((uint8_t)0x12) +#define MPU_REGION_SIZE_1MB ((uint8_t)0x13) +#define MPU_REGION_SIZE_2MB ((uint8_t)0x14) +#define MPU_REGION_SIZE_4MB ((uint8_t)0x15) +#define MPU_REGION_SIZE_8MB ((uint8_t)0x16) +#define MPU_REGION_SIZE_16MB ((uint8_t)0x17) +#define MPU_REGION_SIZE_32MB ((uint8_t)0x18) +#define MPU_REGION_SIZE_64MB ((uint8_t)0x19) +#define MPU_REGION_SIZE_128MB ((uint8_t)0x1A) +#define MPU_REGION_SIZE_256MB ((uint8_t)0x1B) +#define MPU_REGION_SIZE_512MB ((uint8_t)0x1C) +#define MPU_REGION_SIZE_1GB ((uint8_t)0x1D) +#define MPU_REGION_SIZE_2GB ((uint8_t)0x1E) +#define MPU_REGION_SIZE_4GB ((uint8_t)0x1F) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Permission_Attributes CORTEX MPU Region Permission Attributes + * @{ + */ +#define MPU_REGION_NO_ACCESS ((uint8_t)0x00) +#define MPU_REGION_PRIV_RW ((uint8_t)0x01) +#define MPU_REGION_PRIV_RW_URO ((uint8_t)0x02) +#define MPU_REGION_FULL_ACCESS ((uint8_t)0x03) +#define MPU_REGION_PRIV_RO ((uint8_t)0x05) +#define MPU_REGION_PRIV_RO_URO ((uint8_t)0x06) +/** + * @} + */ + +/** @defgroup CORTEX_MPU_Region_Number CORTEX MPU Region Number + * @{ + */ +#define MPU_REGION_NUMBER0 ((uint8_t)0x00) +#define MPU_REGION_NUMBER1 ((uint8_t)0x01) +#define MPU_REGION_NUMBER2 ((uint8_t)0x02) +#define MPU_REGION_NUMBER3 ((uint8_t)0x03) +#define MPU_REGION_NUMBER4 ((uint8_t)0x04) +#define MPU_REGION_NUMBER5 ((uint8_t)0x05) +#define MPU_REGION_NUMBER6 ((uint8_t)0x06) +#define MPU_REGION_NUMBER7 ((uint8_t)0x07) +/** + * @} + */ +#endif /* __MPU_PRESENT */ + +/** + * @} + */ + + +/* Exported Macros -----------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup CORTEX_Exported_Functions + * @{ + */ + +/** @addtogroup CORTEX_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup); +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn); +void HAL_NVIC_SystemReset(void); +uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb); +/** + * @} + */ + +/** @addtogroup CORTEX_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions ***********************************************/ +uint32_t HAL_NVIC_GetPriorityGrouping(void); +void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority); +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn); +void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn); +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn); +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource); +void HAL_SYSTICK_IRQHandler(void); +void HAL_SYSTICK_Callback(void); + +#if (__MPU_PRESENT == 1U) +void HAL_MPU_Enable(uint32_t MPU_Control); +void HAL_MPU_Disable(void); +void HAL_MPU_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 */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h new file mode 100644 index 0000000..f9bbec2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h @@ -0,0 +1,210 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_def.h + * @author MCD Application Team + * @brief This file contains HAL common defines, enumeration, macros and + * structures definitions. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DEF +#define __STM32F4xx_HAL_DEF + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" +#include "Legacy/stm32_hal_legacy.h" +#include + +/* Exported types ------------------------------------------------------------*/ + +/** + * @brief HAL Status structures definition + */ +typedef enum +{ + HAL_OK = 0x00U, + HAL_ERROR = 0x01U, + HAL_BUSY = 0x02U, + HAL_TIMEOUT = 0x03U +} HAL_StatusTypeDef; + +/** + * @brief HAL Lock structures definition + */ +typedef enum +{ + HAL_UNLOCKED = 0x00U, + HAL_LOCKED = 0x01U +} HAL_LockTypeDef; + +/* Exported macro ------------------------------------------------------------*/ + +#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 (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ + #ifndef __weak + #define __weak __attribute__((weak)) + #endif + #ifndef __packed + #define __packed __attribute__((packed)) + #endif +#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ + #ifndef __weak + #define __weak __attribute__((weak)) + #endif /* __weak */ + #ifndef __packed + #define __packed __attribute__((__packed__)) + #endif /* __packed */ +#endif /* __GNUC__ */ + + +/* Macro to get variable aligned on 4-bytes, for __ICCARM__ the directive "#pragma data_alignment=4" must be used instead */ +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler V6 */ + #ifndef __ALIGN_BEGIN + #define __ALIGN_BEGIN + #endif + #ifndef __ALIGN_END + #define __ALIGN_END __attribute__ ((aligned (4))) + #endif +#elif defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ + #ifndef __ALIGN_END +#define __ALIGN_END __attribute__ ((aligned (4))) + #endif /* __ALIGN_END */ + #ifndef __ALIGN_BEGIN + #define __ALIGN_BEGIN + #endif /* __ALIGN_BEGIN */ +#else + #ifndef __ALIGN_END + #define __ALIGN_END + #endif /* __ALIGN_END */ + #ifndef __ALIGN_BEGIN + #if defined (__CC_ARM) /* ARM Compiler V5*/ +#define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #endif /* __CC_ARM */ + #endif /* __ALIGN_BEGIN */ +#endif /* __GNUC__ */ + + +/** + * @brief __RAM_FUNC definition + */ +#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) +/* ARM Compiler V4/V5 and V6 + -------------------------- + RAM functions are defined using the toolchain options. + Functions that are executed in RAM should reside in a separate source module. + Using the 'Options for File' dialog you can simply change the 'Code / Const' + area of a module to a memory space in physical RAM. + Available memory areas are declared in the 'Target' tab of the 'Options for Target' + dialog. +*/ +#define __RAM_FUNC + +#elif defined ( __ICCARM__ ) +/* ICCARM Compiler + --------------- + RAM functions are defined using a specific toolchain keyword "__ramfunc". +*/ +#define __RAM_FUNC __ramfunc + +#elif defined ( __GNUC__ ) +/* GNU Compiler + ------------ + RAM functions are defined using a specific toolchain attribute + "__attribute__((section(".RamFunc")))". +*/ +#define __RAM_FUNC __attribute__((section(".RamFunc"))) + +#endif + +/** + * @brief __NOINLINE definition + */ +#if defined ( __CC_ARM ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined ( __GNUC__ ) +/* ARM V4/V5 and V6 & GNU Compiler + ------------------------------- +*/ +#define __NOINLINE __attribute__ ( (noinline) ) + +#elif defined ( __ICCARM__ ) +/* ICCARM Compiler + --------------- +*/ +#define __NOINLINE _Pragma("optimize = no_inline") + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ___STM32F4xx_HAL_DEF */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h new file mode 100644 index 0000000..7ff3836 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h @@ -0,0 +1,802 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma.h + * @author MCD Application Team + * @brief Header file of DMA HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DMA_H +#define __STM32F4xx_HAL_DMA_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup DMA + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Types DMA Exported Types + * @brief DMA Exported Types + * @{ + */ + +/** + * @brief DMA Configuration Structure definition + */ +typedef struct +{ + uint32_t Channel; /*!< Specifies the channel used for the specified stream. + This parameter can be a value of @ref DMA_Channel_selection */ + + uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, + from memory to memory or from peripheral to memory. + This parameter can be a value of @ref DMA_Data_transfer_direction */ + + uint32_t PeriphInc; /*!< Specifies whether the Peripheral address register should be incremented or not. + This parameter can be a value of @ref DMA_Peripheral_incremented_mode */ + + uint32_t MemInc; /*!< Specifies whether the memory address register should be incremented or not. + This parameter can be a value of @ref DMA_Memory_incremented_mode */ + + uint32_t PeriphDataAlignment; /*!< Specifies the Peripheral data width. + This parameter can be a value of @ref DMA_Peripheral_data_size */ + + uint32_t MemDataAlignment; /*!< Specifies the Memory data width. + This parameter can be a value of @ref DMA_Memory_data_size */ + + uint32_t Mode; /*!< Specifies the operation mode of the DMAy Streamx. + This parameter can be a value of @ref DMA_mode + @note The circular buffer mode cannot be used if the memory-to-memory + data transfer is configured on the selected Stream */ + + uint32_t Priority; /*!< Specifies the software priority for the DMAy Streamx. + This parameter can be a value of @ref DMA_Priority_level */ + + uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. + This parameter can be a value of @ref DMA_FIFO_direct_mode + @note The Direct mode (FIFO mode disabled) cannot be used if the + memory-to-memory data transfer is configured on the selected stream */ + + uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. + This parameter can be a value of @ref DMA_FIFO_threshold_level */ + + uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_Memory_burst + @note The burst mode is possible only if the address Increment mode is enabled. */ + + uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_Peripheral_burst + @note The burst mode is possible only if the address Increment mode is enabled. */ +}DMA_InitTypeDef; + + +/** + * @brief HAL DMA State structures definition + */ +typedef enum +{ + HAL_DMA_STATE_RESET = 0x00U, /*!< DMA not yet initialized or disabled */ + HAL_DMA_STATE_READY = 0x01U, /*!< DMA initialized and ready for use */ + HAL_DMA_STATE_BUSY = 0x02U, /*!< DMA process is ongoing */ + HAL_DMA_STATE_TIMEOUT = 0x03U, /*!< DMA timeout state */ + HAL_DMA_STATE_ERROR = 0x04U, /*!< DMA error state */ + HAL_DMA_STATE_ABORT = 0x05U, /*!< DMA Abort state */ +}HAL_DMA_StateTypeDef; + +/** + * @brief HAL DMA Error Code structure definition + */ +typedef enum +{ + HAL_DMA_FULL_TRANSFER = 0x00U, /*!< Full transfer */ + HAL_DMA_HALF_TRANSFER = 0x01U /*!< Half Transfer */ +}HAL_DMA_LevelCompleteTypeDef; + +/** + * @brief HAL DMA Error Code structure definition + */ +typedef enum +{ + HAL_DMA_XFER_CPLT_CB_ID = 0x00U, /*!< Full transfer */ + HAL_DMA_XFER_HALFCPLT_CB_ID = 0x01U, /*!< Half Transfer */ + HAL_DMA_XFER_M1CPLT_CB_ID = 0x02U, /*!< M1 Full Transfer */ + HAL_DMA_XFER_M1HALFCPLT_CB_ID = 0x03U, /*!< M1 Half Transfer */ + HAL_DMA_XFER_ERROR_CB_ID = 0x04U, /*!< Error */ + HAL_DMA_XFER_ABORT_CB_ID = 0x05U, /*!< Abort */ + HAL_DMA_XFER_ALL_CB_ID = 0x06U /*!< All */ +}HAL_DMA_CallbackIDTypeDef; + +/** + * @brief DMA handle Structure definition + */ +typedef struct __DMA_HandleTypeDef +{ + DMA_Stream_TypeDef *Instance; /*!< Register base address */ + + DMA_InitTypeDef Init; /*!< DMA communication parameters */ + + HAL_LockTypeDef Lock; /*!< DMA locking object */ + + __IO HAL_DMA_StateTypeDef State; /*!< DMA transfer state */ + + void *Parent; /*!< Parent object state */ + + void (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete callback */ + + void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback */ + + void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer complete Memory1 callback */ + + void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Half complete Memory1 callback */ + + void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer error callback */ + + void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA transfer Abort callback */ + + __IO uint32_t ErrorCode; /*!< DMA Error code */ + + uint32_t StreamBaseAddress; /*!< DMA Stream Base Address */ + + uint32_t StreamIndex; /*!< DMA Stream Index */ + +}DMA_HandleTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Constants DMA Exported Constants + * @brief DMA Exported constants + * @{ + */ + +/** @defgroup DMA_Error_Code DMA Error Code + * @brief DMA Error Code + * @{ + */ +#define HAL_DMA_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_DMA_ERROR_TE 0x00000001U /*!< Transfer error */ +#define HAL_DMA_ERROR_FE 0x00000002U /*!< FIFO error */ +#define HAL_DMA_ERROR_DME 0x00000004U /*!< Direct Mode error */ +#define HAL_DMA_ERROR_TIMEOUT 0x00000020U /*!< Timeout error */ +#define HAL_DMA_ERROR_PARAM 0x00000040U /*!< Parameter error */ +#define HAL_DMA_ERROR_NO_XFER 0x00000080U /*!< Abort requested with no Xfer ongoing */ +#define HAL_DMA_ERROR_NOT_SUPPORTED 0x00000100U /*!< Not supported mode */ +/** + * @} + */ + +/** @defgroup DMA_Channel_selection DMA Channel selection + * @brief DMA channel selection + * @{ + */ +#define DMA_CHANNEL_0 0x00000000U /*!< DMA Channel 0 */ +#define DMA_CHANNEL_1 0x02000000U /*!< DMA Channel 1 */ +#define DMA_CHANNEL_2 0x04000000U /*!< DMA Channel 2 */ +#define DMA_CHANNEL_3 0x06000000U /*!< DMA Channel 3 */ +#define DMA_CHANNEL_4 0x08000000U /*!< DMA Channel 4 */ +#define DMA_CHANNEL_5 0x0A000000U /*!< DMA Channel 5 */ +#define DMA_CHANNEL_6 0x0C000000U /*!< DMA Channel 6 */ +#define DMA_CHANNEL_7 0x0E000000U /*!< DMA Channel 7 */ +#if defined (DMA_SxCR_CHSEL_3) +#define DMA_CHANNEL_8 0x10000000U /*!< DMA Channel 8 */ +#define DMA_CHANNEL_9 0x12000000U /*!< DMA Channel 9 */ +#define DMA_CHANNEL_10 0x14000000U /*!< DMA Channel 10 */ +#define DMA_CHANNEL_11 0x16000000U /*!< DMA Channel 11 */ +#define DMA_CHANNEL_12 0x18000000U /*!< DMA Channel 12 */ +#define DMA_CHANNEL_13 0x1A000000U /*!< DMA Channel 13 */ +#define DMA_CHANNEL_14 0x1C000000U /*!< DMA Channel 14 */ +#define DMA_CHANNEL_15 0x1E000000U /*!< DMA Channel 15 */ +#endif /* DMA_SxCR_CHSEL_3 */ +/** + * @} + */ + +/** @defgroup DMA_Data_transfer_direction DMA Data transfer direction + * @brief DMA data transfer direction + * @{ + */ +#define DMA_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ +#define DMA_MEMORY_TO_PERIPH ((uint32_t)DMA_SxCR_DIR_0) /*!< Memory to peripheral direction */ +#define DMA_MEMORY_TO_MEMORY ((uint32_t)DMA_SxCR_DIR_1) /*!< Memory to memory direction */ +/** + * @} + */ + +/** @defgroup DMA_Peripheral_incremented_mode DMA Peripheral incremented mode + * @brief DMA peripheral incremented mode + * @{ + */ +#define DMA_PINC_ENABLE ((uint32_t)DMA_SxCR_PINC) /*!< Peripheral increment mode enable */ +#define DMA_PINC_DISABLE 0x00000000U /*!< Peripheral increment mode disable */ +/** + * @} + */ + +/** @defgroup DMA_Memory_incremented_mode DMA Memory incremented mode + * @brief DMA memory incremented mode + * @{ + */ +#define DMA_MINC_ENABLE ((uint32_t)DMA_SxCR_MINC) /*!< Memory increment mode enable */ +#define DMA_MINC_DISABLE 0x00000000U /*!< Memory increment mode disable */ +/** + * @} + */ + +/** @defgroup DMA_Peripheral_data_size DMA Peripheral data size + * @brief DMA peripheral data size + * @{ + */ +#define DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment: Byte */ +#define DMA_PDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_PSIZE_0) /*!< Peripheral data alignment: HalfWord */ +#define DMA_PDATAALIGN_WORD ((uint32_t)DMA_SxCR_PSIZE_1) /*!< Peripheral data alignment: Word */ +/** + * @} + */ + +/** @defgroup DMA_Memory_data_size DMA Memory data size + * @brief DMA memory data size + * @{ + */ +#define DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment: Byte */ +#define DMA_MDATAALIGN_HALFWORD ((uint32_t)DMA_SxCR_MSIZE_0) /*!< Memory data alignment: HalfWord */ +#define DMA_MDATAALIGN_WORD ((uint32_t)DMA_SxCR_MSIZE_1) /*!< Memory data alignment: Word */ +/** + * @} + */ + +/** @defgroup DMA_mode DMA mode + * @brief DMA mode + * @{ + */ +#define DMA_NORMAL 0x00000000U /*!< Normal mode */ +#define DMA_CIRCULAR ((uint32_t)DMA_SxCR_CIRC) /*!< Circular mode */ +#define DMA_PFCTRL ((uint32_t)DMA_SxCR_PFCTRL) /*!< Peripheral flow control mode */ +/** + * @} + */ + +/** @defgroup DMA_Priority_level DMA Priority level + * @brief DMA priority levels + * @{ + */ +#define DMA_PRIORITY_LOW 0x00000000U /*!< Priority level: Low */ +#define DMA_PRIORITY_MEDIUM ((uint32_t)DMA_SxCR_PL_0) /*!< Priority level: Medium */ +#define DMA_PRIORITY_HIGH ((uint32_t)DMA_SxCR_PL_1) /*!< Priority level: High */ +#define DMA_PRIORITY_VERY_HIGH ((uint32_t)DMA_SxCR_PL) /*!< Priority level: Very High */ +/** + * @} + */ + +/** @defgroup DMA_FIFO_direct_mode DMA FIFO direct mode + * @brief DMA FIFO direct mode + * @{ + */ +#define DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable */ +#define DMA_FIFOMODE_ENABLE ((uint32_t)DMA_SxFCR_DMDIS) /*!< FIFO mode enable */ +/** + * @} + */ + +/** @defgroup DMA_FIFO_threshold_level DMA FIFO threshold level + * @brief DMA FIFO level + * @{ + */ +#define DMA_FIFO_THRESHOLD_1QUARTERFULL 0x00000000U /*!< FIFO threshold 1 quart full configuration */ +#define DMA_FIFO_THRESHOLD_HALFFULL ((uint32_t)DMA_SxFCR_FTH_0) /*!< FIFO threshold half full configuration */ +#define DMA_FIFO_THRESHOLD_3QUARTERSFULL ((uint32_t)DMA_SxFCR_FTH_1) /*!< FIFO threshold 3 quarts full configuration */ +#define DMA_FIFO_THRESHOLD_FULL ((uint32_t)DMA_SxFCR_FTH) /*!< FIFO threshold full configuration */ +/** + * @} + */ + +/** @defgroup DMA_Memory_burst DMA Memory burst + * @brief DMA memory burst + * @{ + */ +#define DMA_MBURST_SINGLE 0x00000000U +#define DMA_MBURST_INC4 ((uint32_t)DMA_SxCR_MBURST_0) +#define DMA_MBURST_INC8 ((uint32_t)DMA_SxCR_MBURST_1) +#define DMA_MBURST_INC16 ((uint32_t)DMA_SxCR_MBURST) +/** + * @} + */ + +/** @defgroup DMA_Peripheral_burst DMA Peripheral burst + * @brief DMA peripheral burst + * @{ + */ +#define DMA_PBURST_SINGLE 0x00000000U +#define DMA_PBURST_INC4 ((uint32_t)DMA_SxCR_PBURST_0) +#define DMA_PBURST_INC8 ((uint32_t)DMA_SxCR_PBURST_1) +#define DMA_PBURST_INC16 ((uint32_t)DMA_SxCR_PBURST) +/** + * @} + */ + +/** @defgroup DMA_interrupt_enable_definitions DMA interrupt enable definitions + * @brief DMA interrupts definition + * @{ + */ +#define DMA_IT_TC ((uint32_t)DMA_SxCR_TCIE) +#define DMA_IT_HT ((uint32_t)DMA_SxCR_HTIE) +#define DMA_IT_TE ((uint32_t)DMA_SxCR_TEIE) +#define DMA_IT_DME ((uint32_t)DMA_SxCR_DMEIE) +#define DMA_IT_FE 0x00000080U +/** + * @} + */ + +/** @defgroup DMA_flag_definitions DMA flag definitions + * @brief DMA flag definitions + * @{ + */ +#define DMA_FLAG_FEIF0_4 0x00000001U +#define DMA_FLAG_DMEIF0_4 0x00000004U +#define DMA_FLAG_TEIF0_4 0x00000008U +#define DMA_FLAG_HTIF0_4 0x00000010U +#define DMA_FLAG_TCIF0_4 0x00000020U +#define DMA_FLAG_FEIF1_5 0x00000040U +#define DMA_FLAG_DMEIF1_5 0x00000100U +#define DMA_FLAG_TEIF1_5 0x00000200U +#define DMA_FLAG_HTIF1_5 0x00000400U +#define DMA_FLAG_TCIF1_5 0x00000800U +#define DMA_FLAG_FEIF2_6 0x00010000U +#define DMA_FLAG_DMEIF2_6 0x00040000U +#define DMA_FLAG_TEIF2_6 0x00080000U +#define DMA_FLAG_HTIF2_6 0x00100000U +#define DMA_FLAG_TCIF2_6 0x00200000U +#define DMA_FLAG_FEIF3_7 0x00400000U +#define DMA_FLAG_DMEIF3_7 0x01000000U +#define DMA_FLAG_TEIF3_7 0x02000000U +#define DMA_FLAG_HTIF3_7 0x04000000U +#define DMA_FLAG_TCIF3_7 0x08000000U +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/** @brief Reset DMA handle state + * @param __HANDLE__ specifies the DMA handle. + * @retval None + */ +#define __HAL_DMA_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DMA_STATE_RESET) + +/** + * @brief Return the current DMA Stream FIFO filled level. + * @param __HANDLE__ DMA handle + * @retval The FIFO filling state. + * - DMA_FIFOStatus_Less1QuarterFull: when FIFO is less than 1 quarter-full + * and not empty. + * - DMA_FIFOStatus_1QuarterFull: if more than 1 quarter-full. + * - DMA_FIFOStatus_HalfFull: if more than 1 half-full. + * - DMA_FIFOStatus_3QuartersFull: if more than 3 quarters-full. + * - DMA_FIFOStatus_Empty: when FIFO is empty + * - DMA_FIFOStatus_Full: when FIFO is full + */ +#define __HAL_DMA_GET_FS(__HANDLE__) (((__HANDLE__)->Instance->FCR & (DMA_SxFCR_FS))) + +/** + * @brief Enable the specified DMA Stream. + * @param __HANDLE__ DMA handle + * @retval None + */ +#define __HAL_DMA_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |= DMA_SxCR_EN) + +/** + * @brief Disable the specified DMA Stream. + * @param __HANDLE__ DMA handle + * @retval None + */ +#define __HAL_DMA_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~DMA_SxCR_EN) + +/* Interrupt & Flag management */ + +/** + * @brief Return the current DMA Stream transfer complete flag. + * @param __HANDLE__ DMA handle + * @retval The specified transfer complete flag index. + */ +#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\ + DMA_FLAG_TCIF3_7) + +/** + * @brief Return the current DMA Stream half transfer complete flag. + * @param __HANDLE__ DMA handle + * @retval The specified half transfer complete flag index. + */ +#define __HAL_DMA_GET_HT_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_HTIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_HTIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_HTIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_HTIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_HTIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_HTIF2_6 :\ + DMA_FLAG_HTIF3_7) + +/** + * @brief Return the current DMA Stream transfer error flag. + * @param __HANDLE__ DMA handle + * @retval The specified transfer error flag index. + */ +#define __HAL_DMA_GET_TE_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TEIF2_6 :\ + DMA_FLAG_TEIF3_7) + +/** + * @brief Return the current DMA Stream FIFO error flag. + * @param __HANDLE__ DMA handle + * @retval The specified FIFO error flag index. + */ +#define __HAL_DMA_GET_FE_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_FEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_FEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_FEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_FEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_FEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_FEIF2_6 :\ + DMA_FLAG_FEIF3_7) + +/** + * @brief Return the current DMA Stream direct mode error flag. + * @param __HANDLE__ DMA handle + * @retval The specified direct mode error flag index. + */ +#define __HAL_DMA_GET_DME_FLAG_INDEX(__HANDLE__)\ +(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_DMEIF0_4 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_DMEIF1_5 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_DMEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_DMEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_DMEIF2_6 :\ + ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_DMEIF2_6 :\ + DMA_FLAG_DMEIF3_7) + +/** + * @brief Get the DMA Stream pending flags. + * @param __HANDLE__ DMA handle + * @param __FLAG__ Get the specified flag. + * This parameter can be any combination of the following values: + * @arg DMA_FLAG_TCIFx: Transfer complete flag. + * @arg DMA_FLAG_HTIFx: Half transfer complete flag. + * @arg DMA_FLAG_TEIFx: Transfer error flag. + * @arg DMA_FLAG_DMEIFx: Direct mode error flag. + * @arg DMA_FLAG_FEIFx: FIFO error flag. + * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. + * @retval The state of FLAG (SET or RESET). + */ +#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)\ +(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HISR & (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LISR & (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HISR & (__FLAG__)) : (DMA1->LISR & (__FLAG__))) + +/** + * @brief Clear the DMA Stream pending flags. + * @param __HANDLE__ DMA handle + * @param __FLAG__ specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg DMA_FLAG_TCIFx: Transfer complete flag. + * @arg DMA_FLAG_HTIFx: Half transfer complete flag. + * @arg DMA_FLAG_TEIFx: Transfer error flag. + * @arg DMA_FLAG_DMEIFx: Direct mode error flag. + * @arg DMA_FLAG_FEIFx: FIFO error flag. + * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag. + * @retval None + */ +#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__) \ +(((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA2_Stream3)? (DMA2->HIFCR = (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream7)? (DMA2->LIFCR = (__FLAG__)) :\ + ((uint32_t)((__HANDLE__)->Instance) > (uint32_t)DMA1_Stream3)? (DMA1->HIFCR = (__FLAG__)) : (DMA1->LIFCR = (__FLAG__))) + +/** + * @brief Enable the specified DMA Stream interrupts. + * @param __HANDLE__ DMA handle + * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask. + * @arg DMA_IT_HT: Half transfer complete interrupt mask. + * @arg DMA_IT_TE: Transfer error interrupt mask. + * @arg DMA_IT_FE: FIFO error interrupt mask. + * @arg DMA_IT_DME: Direct mode error interrupt. + * @retval None + */ +#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ +((__HANDLE__)->Instance->CR |= (__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR |= (__INTERRUPT__))) + +/** + * @brief Disable the specified DMA Stream interrupts. + * @param __HANDLE__ DMA handle + * @param __INTERRUPT__ specifies the DMA interrupt sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask. + * @arg DMA_IT_HT: Half transfer complete interrupt mask. + * @arg DMA_IT_TE: Transfer error interrupt mask. + * @arg DMA_IT_FE: FIFO error interrupt mask. + * @arg DMA_IT_DME: Direct mode error interrupt. + * @retval None + */ +#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ +((__HANDLE__)->Instance->CR &= ~(__INTERRUPT__)) : ((__HANDLE__)->Instance->FCR &= ~(__INTERRUPT__))) + +/** + * @brief Check whether the specified DMA Stream interrupt is enabled or disabled. + * @param __HANDLE__ DMA handle + * @param __INTERRUPT__ specifies the DMA interrupt source to check. + * This parameter can be one of the following values: + * @arg DMA_IT_TC: Transfer complete interrupt mask. + * @arg DMA_IT_HT: Half transfer complete interrupt mask. + * @arg DMA_IT_TE: Transfer error interrupt mask. + * @arg DMA_IT_FE: FIFO error interrupt mask. + * @arg DMA_IT_DME: Direct mode error interrupt. + * @retval The state of DMA_IT. + */ +#define __HAL_DMA_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__INTERRUPT__) != DMA_IT_FE)? \ + ((__HANDLE__)->Instance->CR & (__INTERRUPT__)) : \ + ((__HANDLE__)->Instance->FCR & (__INTERRUPT__))) + +/** + * @brief Writes the number of data units to be transferred on the DMA Stream. + * @param __HANDLE__ DMA handle + * @param __COUNTER__ Number of data units to be transferred (from 0 to 65535) + * Number of data items depends only on the Peripheral data format. + * + * @note If Peripheral data format is Bytes: number of data units is equal + * to total number of bytes to be transferred. + * + * @note If Peripheral data format is Half-Word: number of data units is + * equal to total number of bytes to be transferred / 2. + * + * @note If Peripheral data format is Word: number of data units is equal + * to total number of bytes to be transferred / 4. + * + * @retval The number of remaining data units in the current DMAy Streamx transfer. + */ +#define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) + +/** + * @brief Returns the number of remaining data units in the current DMAy Streamx transfer. + * @param __HANDLE__ DMA handle + * + * @retval The number of remaining data units in the current DMA Stream transfer. + */ +#define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR) + + +/* Include DMA HAL Extension module */ +#include "stm32f4xx_hal_dma_ex.h" + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Functions DMA Exported Functions + * @brief DMA Exported functions + * @{ + */ + +/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * @{ + */ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma); +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group2 I/O operation functions + * @brief I/O operation functions + * @{ + */ +HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout); +void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_CleanCallbacks(DMA_HandleTypeDef *hdma); +HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)); +HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID); + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions + * @brief Peripheral State functions + * @{ + */ +HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma); +uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma); +/** + * @} + */ +/** + * @} + */ +/* Private Constants -------------------------------------------------------------*/ +/** @defgroup DMA_Private_Constants DMA Private Constants + * @brief DMA private defines and constants + * @{ + */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup DMA_Private_Macros DMA Private Macros + * @brief DMA private macros + * @{ + */ +#if defined (DMA_SxCR_CHSEL_3) +#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ + ((CHANNEL) == DMA_CHANNEL_1) || \ + ((CHANNEL) == DMA_CHANNEL_2) || \ + ((CHANNEL) == DMA_CHANNEL_3) || \ + ((CHANNEL) == DMA_CHANNEL_4) || \ + ((CHANNEL) == DMA_CHANNEL_5) || \ + ((CHANNEL) == DMA_CHANNEL_6) || \ + ((CHANNEL) == DMA_CHANNEL_7) || \ + ((CHANNEL) == DMA_CHANNEL_8) || \ + ((CHANNEL) == DMA_CHANNEL_9) || \ + ((CHANNEL) == DMA_CHANNEL_10)|| \ + ((CHANNEL) == DMA_CHANNEL_11)|| \ + ((CHANNEL) == DMA_CHANNEL_12)|| \ + ((CHANNEL) == DMA_CHANNEL_13)|| \ + ((CHANNEL) == DMA_CHANNEL_14)|| \ + ((CHANNEL) == DMA_CHANNEL_15)) +#else +#define IS_DMA_CHANNEL(CHANNEL) (((CHANNEL) == DMA_CHANNEL_0) || \ + ((CHANNEL) == DMA_CHANNEL_1) || \ + ((CHANNEL) == DMA_CHANNEL_2) || \ + ((CHANNEL) == DMA_CHANNEL_3) || \ + ((CHANNEL) == DMA_CHANNEL_4) || \ + ((CHANNEL) == DMA_CHANNEL_5) || \ + ((CHANNEL) == DMA_CHANNEL_6) || \ + ((CHANNEL) == DMA_CHANNEL_7)) +#endif /* DMA_SxCR_CHSEL_3 */ + +#define IS_DMA_DIRECTION(DIRECTION) (((DIRECTION) == DMA_PERIPH_TO_MEMORY ) || \ + ((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \ + ((DIRECTION) == DMA_MEMORY_TO_MEMORY)) + +#define IS_DMA_BUFFER_SIZE(SIZE) (((SIZE) >= 0x01U) && ((SIZE) < 0x10000U)) + +#define IS_DMA_PERIPHERAL_INC_STATE(STATE) (((STATE) == DMA_PINC_ENABLE) || \ + ((STATE) == DMA_PINC_DISABLE)) + +#define IS_DMA_MEMORY_INC_STATE(STATE) (((STATE) == DMA_MINC_ENABLE) || \ + ((STATE) == DMA_MINC_DISABLE)) + +#define IS_DMA_PERIPHERAL_DATA_SIZE(SIZE) (((SIZE) == DMA_PDATAALIGN_BYTE) || \ + ((SIZE) == DMA_PDATAALIGN_HALFWORD) || \ + ((SIZE) == DMA_PDATAALIGN_WORD)) + +#define IS_DMA_MEMORY_DATA_SIZE(SIZE) (((SIZE) == DMA_MDATAALIGN_BYTE) || \ + ((SIZE) == DMA_MDATAALIGN_HALFWORD) || \ + ((SIZE) == DMA_MDATAALIGN_WORD )) + +#define IS_DMA_MODE(MODE) (((MODE) == DMA_NORMAL ) || \ + ((MODE) == DMA_CIRCULAR) || \ + ((MODE) == DMA_PFCTRL)) + +#define IS_DMA_PRIORITY(PRIORITY) (((PRIORITY) == DMA_PRIORITY_LOW ) || \ + ((PRIORITY) == DMA_PRIORITY_MEDIUM) || \ + ((PRIORITY) == DMA_PRIORITY_HIGH) || \ + ((PRIORITY) == DMA_PRIORITY_VERY_HIGH)) + +#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \ + ((STATE) == DMA_FIFOMODE_ENABLE)) + +#define IS_DMA_FIFO_THRESHOLD(THRESHOLD) (((THRESHOLD) == DMA_FIFO_THRESHOLD_1QUARTERFULL ) || \ + ((THRESHOLD) == DMA_FIFO_THRESHOLD_HALFFULL) || \ + ((THRESHOLD) == DMA_FIFO_THRESHOLD_3QUARTERSFULL) || \ + ((THRESHOLD) == DMA_FIFO_THRESHOLD_FULL)) + +#define IS_DMA_MEMORY_BURST(BURST) (((BURST) == DMA_MBURST_SINGLE) || \ + ((BURST) == DMA_MBURST_INC4) || \ + ((BURST) == DMA_MBURST_INC8) || \ + ((BURST) == DMA_MBURST_INC16)) + +#define IS_DMA_PERIPHERAL_BURST(BURST) (((BURST) == DMA_PBURST_SINGLE) || \ + ((BURST) == DMA_PBURST_INC4) || \ + ((BURST) == DMA_PBURST_INC8) || \ + ((BURST) == DMA_PBURST_INC16)) +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup DMA_Private_Functions DMA Private Functions + * @brief DMA private functions + * @{ + */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_DMA_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h new file mode 100644 index 0000000..9858c74 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h @@ -0,0 +1,102 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma_ex.h + * @author MCD Application Team + * @brief Header file of DMA HAL extension module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_DMA_EX_H +#define __STM32F4xx_HAL_DMA_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup DMAEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup DMAEx_Exported_Types DMAEx Exported Types + * @brief DMAEx Exported types + * @{ + */ + +/** + * @brief HAL DMA Memory definition + */ +typedef enum +{ + MEMORY0 = 0x00U, /*!< Memory 0 */ + MEMORY1 = 0x01U /*!< Memory 1 */ +}HAL_DMA_MemoryTypeDef; + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup DMAEx_Exported_Functions DMAEx Exported Functions + * @brief DMAEx Exported functions + * @{ + */ + +/** @defgroup DMAEx_Exported_Functions_Group1 Extended features functions + * @brief Extended features functions + * @{ + */ + +/* IO operation functions *******************************************************/ +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength); +HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory); + +/** + * @} + */ +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup DMAEx_Private_Functions DMAEx Private Functions + * @brief DMAEx Private functions + * @{ + */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /*__STM32F4xx_HAL_DMA_EX_H*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h new file mode 100644 index 0000000..b18a228 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h @@ -0,0 +1,366 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_exti.h + * @author MCD Application Team + * @brief Header file of EXTI HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS.Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32f4xx_HAL_EXTI_H +#define STM32f4xx_HAL_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup EXTI EXTI + * @brief EXTI HAL module driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup EXTI_Exported_Types EXTI Exported Types + * @{ + */ +typedef enum +{ + HAL_EXTI_COMMON_CB_ID = 0x00U +} EXTI_CallbackIDTypeDef; + +/** + * @brief EXTI Handle structure definition + */ +typedef struct +{ + uint32_t Line; /*!< Exti line number */ + void (* PendingCallback)(void); /*!< Exti pending callback */ +} EXTI_HandleTypeDef; + +/** + * @brief EXTI Configuration structure definition + */ +typedef struct +{ + uint32_t Line; /*!< The Exti line to be configured. This parameter + can be a value of @ref EXTI_Line */ + uint32_t Mode; /*!< The Exit Mode to be configured for a core. + This parameter can be a combination of @ref EXTI_Mode */ + uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter + can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ +} EXTI_ConfigTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup EXTI_Exported_Constants EXTI Exported Constants + * @{ + */ + +/** @defgroup EXTI_Line EXTI Line + * @{ + */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#if defined(EXTI_IMR_IM18) +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#else +#define EXTI_LINE_18 (EXTI_RESERVED | 0x12u) /*!< No interrupt supported in this line */ +#endif /* EXTI_IMR_IM18 */ +#if defined(EXTI_IMR_IM19) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* EXTI_IMR_IM19 */ +#if defined(EXTI_IMR_IM20) +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#else +#define EXTI_LINE_20 (EXTI_RESERVED | 0x14u) /*!< No interrupt supported in this line */ +#endif /* EXTI_IMR_IM20 */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#if defined(EXTI_IMR_IM23) +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM1 asynchronous event */ +#endif /* EXTI_IMR_IM23 */ + +/** + * @} + */ + +/** @defgroup EXTI_Mode EXTI Mode + * @{ + */ +#define EXTI_MODE_NONE 0x00000000u +#define EXTI_MODE_INTERRUPT 0x00000001u +#define EXTI_MODE_EVENT 0x00000002u +/** + * @} + */ + +/** @defgroup EXTI_Trigger EXTI Trigger + * @{ + */ + +#define EXTI_TRIGGER_NONE 0x00000000u +#define EXTI_TRIGGER_RISING 0x00000001u +#define EXTI_TRIGGER_FALLING 0x00000002u +#define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) +/** + * @} + */ + +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#if defined (GPIOD) +#define EXTI_GPIOD 0x00000003u +#endif /* GPIOD */ +#if defined (GPIOE) +#define EXTI_GPIOE 0x00000004u +#endif /* GPIOE */ +#if defined (GPIOF) +#define EXTI_GPIOF 0x00000005u +#endif /* GPIOF */ +#if defined (GPIOG) +#define EXTI_GPIOG 0x00000006u +#endif /* GPIOG */ +#if defined (GPIOH) +#define EXTI_GPIOH 0x00000007u +#endif /* GPIOH */ +#if defined (GPIOI) +#define EXTI_GPIOI 0x00000008u +#endif /* GPIOI */ +#if defined (GPIOJ) +#define EXTI_GPIOJ 0x00000009u +#endif /* GPIOJ */ +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup EXTI_Exported_Macros EXTI Exported Macros + * @{ + */ + +/** + * @} + */ + +/* Private constants --------------------------------------------------------*/ +/** @defgroup EXTI_Private_Constants EXTI Private Constants + * @{ + */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + +/** + * @brief EXTI Mask for interrupt & event mode + */ +#define EXTI_MODE_MASK (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) + +/** + * @brief EXTI Mask for trigger possibilities + */ +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) + +/** + * @brief EXTI Line number + */ +#if defined(EXTI_IMR_IM23) +#define EXTI_LINE_NB 24UL +#else +#define EXTI_LINE_NB 23UL +#endif /* EXTI_IMR_IM23 */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup EXTI_Private_Macros EXTI Private Macros + * @{ + */ +#define IS_EXTI_LINE(__EXTI_LINE__) ((((__EXTI_LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__EXTI_LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__EXTI_LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__EXTI_LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) + +#define IS_EXTI_MODE(__EXTI_LINE__) ((((__EXTI_LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__EXTI_LINE__) & ~EXTI_MODE_MASK) == 0x00u)) + +#define IS_EXTI_TRIGGER(__EXTI_LINE__) (((__EXTI_LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) + +#define IS_EXTI_PENDING_EDGE(__EXTI_LINE__) ((__EXTI_LINE__) == EXTI_TRIGGER_RISING_FALLING) + +#define IS_EXTI_CONFIG_LINE(__EXTI_LINE__) (((__EXTI_LINE__) & EXTI_CONFIG) != 0x00u) + +#if !defined (GPIOD) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOE) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOF) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOI) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH)) +#elif !defined (GPIOJ) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#endif /* GPIOD */ + +#define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup EXTI_Exported_Functions EXTI Exported Functions + * @brief EXTI Exported Functions + * @{ + */ + +/** @defgroup EXTI_Exported_Functions_Group1 Configuration functions + * @brief Configuration functions + * @{ + */ +/* Configuration functions ****************************************************/ +HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); +HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig); +HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti); +HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void)); +HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine); +/** + * @} + */ + +/** @defgroup EXTI_Exported_Functions_Group2 IO operation functions + * @brief IO operation functions + * @{ + */ +/* IO operation functions *****************************************************/ +void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti); +uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); +void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge); +void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32f4xx_HAL_EXTI_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h new file mode 100644 index 0000000..26d789e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h @@ -0,0 +1,425 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash.h + * @author MCD Application Team + * @brief Header file of FLASH HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_FLASH_H +#define __STM32F4xx_HAL_FLASH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASH + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Types FLASH Exported Types + * @{ + */ + +/** + * @brief FLASH Procedure structure definition + */ +typedef enum +{ + FLASH_PROC_NONE = 0U, + FLASH_PROC_SECTERASE, + FLASH_PROC_MASSERASE, + FLASH_PROC_PROGRAM +} FLASH_ProcedureTypeDef; + +/** + * @brief FLASH handle Structure definition + */ +typedef struct +{ + __IO FLASH_ProcedureTypeDef ProcedureOnGoing; /*Internal variable to indicate which procedure is ongoing or not in IT context*/ + + __IO uint32_t NbSectorsToErase; /*Internal variable to save the remaining sectors to erase in IT context*/ + + __IO uint8_t VoltageForErase; /*Internal variable to provide voltage range selected by user in IT context*/ + + __IO uint32_t Sector; /*Internal variable to define the current sector which is erasing*/ + + __IO uint32_t Bank; /*Internal variable to save current bank selected during mass erase*/ + + __IO uint32_t Address; /*Internal variable to save address selected for program*/ + + HAL_LockTypeDef Lock; /* FLASH locking object */ + + __IO uint32_t ErrorCode; /* FLASH error code */ + +}FLASH_ProcessTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Constants FLASH Exported Constants + * @{ + */ +/** @defgroup FLASH_Error_Code FLASH Error Code + * @brief FLASH Error Code + * @{ + */ +#define HAL_FLASH_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_FLASH_ERROR_RD 0x00000001U /*!< Read Protection error */ +#define HAL_FLASH_ERROR_PGS 0x00000002U /*!< Programming Sequence error */ +#define HAL_FLASH_ERROR_PGP 0x00000004U /*!< Programming Parallelism error */ +#define HAL_FLASH_ERROR_PGA 0x00000008U /*!< Programming Alignment error */ +#define HAL_FLASH_ERROR_WRP 0x00000010U /*!< Write protection error */ +#define HAL_FLASH_ERROR_OPERATION 0x00000020U /*!< Operation Error */ +/** + * @} + */ + +/** @defgroup FLASH_Type_Program FLASH Type Program + * @{ + */ +#define FLASH_TYPEPROGRAM_BYTE 0x00000000U /*!< Program byte (8-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_HALFWORD 0x00000001U /*!< Program a half-word (16-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_WORD 0x00000002U /*!< Program a word (32-bit) at a specified address */ +#define FLASH_TYPEPROGRAM_DOUBLEWORD 0x00000003U /*!< Program a double word (64-bit) at a specified address */ +/** + * @} + */ + +/** @defgroup FLASH_Flag_definition FLASH Flag definition + * @brief Flag definition + * @{ + */ +#define FLASH_FLAG_EOP FLASH_SR_EOP /*!< FLASH End of Operation flag */ +#define FLASH_FLAG_OPERR FLASH_SR_SOP /*!< FLASH operation Error flag */ +#define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /*!< FLASH Write protected error flag */ +#define FLASH_FLAG_PGAERR FLASH_SR_PGAERR /*!< FLASH Programming Alignment error flag */ +#define FLASH_FLAG_PGPERR FLASH_SR_PGPERR /*!< FLASH Programming Parallelism error flag */ +#define FLASH_FLAG_PGSERR FLASH_SR_PGSERR /*!< FLASH Programming Sequence error flag */ +#if defined(FLASH_SR_RDERR) +#define FLASH_FLAG_RDERR FLASH_SR_RDERR /*!< Read Protection error flag (PCROP) */ +#endif /* FLASH_SR_RDERR */ +#define FLASH_FLAG_BSY FLASH_SR_BSY /*!< FLASH Busy flag */ +/** + * @} + */ + +/** @defgroup FLASH_Interrupt_definition FLASH Interrupt definition + * @brief FLASH Interrupt definition + * @{ + */ +#define FLASH_IT_EOP FLASH_CR_EOPIE /*!< End of FLASH Operation Interrupt source */ +#define FLASH_IT_ERR 0x02000000U /*!< Error Interrupt source */ +/** + * @} + */ + +/** @defgroup FLASH_Program_Parallelism FLASH Program Parallelism + * @{ + */ +#define FLASH_PSIZE_BYTE 0x00000000U +#define FLASH_PSIZE_HALF_WORD 0x00000100U +#define FLASH_PSIZE_WORD 0x00000200U +#define FLASH_PSIZE_DOUBLE_WORD 0x00000300U +#define CR_PSIZE_MASK 0xFFFFFCFFU +/** + * @} + */ + +/** @defgroup FLASH_Keys FLASH Keys + * @{ + */ +#define RDP_KEY ((uint16_t)0x00A5) +#define FLASH_KEY1 0x45670123U +#define FLASH_KEY2 0xCDEF89ABU +#define FLASH_OPT_KEY1 0x08192A3BU +#define FLASH_OPT_KEY2 0x4C5D6E7FU +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Macros FLASH Exported Macros + * @{ + */ +/** + * @brief Set the FLASH Latency. + * @param __LATENCY__ FLASH Latency + * The value of this parameter depend on device used within the same series + * @retval none + */ +#define __HAL_FLASH_SET_LATENCY(__LATENCY__) (*(__IO uint8_t *)ACR_BYTE0_ADDRESS = (uint8_t)(__LATENCY__)) + +/** + * @brief Get the FLASH Latency. + * @retval FLASH Latency + * The value of this parameter depend on device used within the same series + */ +#define __HAL_FLASH_GET_LATENCY() (READ_BIT((FLASH->ACR), FLASH_ACR_LATENCY)) + +/** + * @brief Enable the FLASH prefetch buffer. + * @retval none + */ +#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTEN) + +/** + * @brief Disable the FLASH prefetch buffer. + * @retval none + */ +#define __HAL_FLASH_PREFETCH_BUFFER_DISABLE() (FLASH->ACR &= (~FLASH_ACR_PRFTEN)) + +/** + * @brief Enable the FLASH instruction cache. + * @retval none + */ +#define __HAL_FLASH_INSTRUCTION_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_ICEN) + +/** + * @brief Disable the FLASH instruction cache. + * @retval none + */ +#define __HAL_FLASH_INSTRUCTION_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_ICEN)) + +/** + * @brief Enable the FLASH data cache. + * @retval none + */ +#define __HAL_FLASH_DATA_CACHE_ENABLE() (FLASH->ACR |= FLASH_ACR_DCEN) + +/** + * @brief Disable the FLASH data cache. + * @retval none + */ +#define __HAL_FLASH_DATA_CACHE_DISABLE() (FLASH->ACR &= (~FLASH_ACR_DCEN)) + +/** + * @brief Resets the FLASH instruction Cache. + * @note This function must be used only when the Instruction Cache is disabled. + * @retval None + */ +#define __HAL_FLASH_INSTRUCTION_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_ICRST; \ + FLASH->ACR &= ~FLASH_ACR_ICRST; \ + }while(0U) + +/** + * @brief Resets the FLASH data Cache. + * @note This function must be used only when the data Cache is disabled. + * @retval None + */ +#define __HAL_FLASH_DATA_CACHE_RESET() do {FLASH->ACR |= FLASH_ACR_DCRST; \ + FLASH->ACR &= ~FLASH_ACR_DCRST; \ + }while(0U) +/** + * @brief Enable the specified FLASH interrupt. + * @param __INTERRUPT__ FLASH interrupt + * This parameter can be any combination of the following values: + * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt + * @arg FLASH_IT_ERR: Error Interrupt + * @retval none + */ +#define __HAL_FLASH_ENABLE_IT(__INTERRUPT__) (FLASH->CR |= (__INTERRUPT__)) + +/** + * @brief Disable the specified FLASH interrupt. + * @param __INTERRUPT__ FLASH interrupt + * This parameter can be any combination of the following values: + * @arg FLASH_IT_EOP: End of FLASH Operation Interrupt + * @arg FLASH_IT_ERR: Error Interrupt + * @retval none + */ +#define __HAL_FLASH_DISABLE_IT(__INTERRUPT__) (FLASH->CR &= ~(uint32_t)(__INTERRUPT__)) + +/** + * @brief Get the specified FLASH flag status. + * @param __FLAG__ specifies the FLASH flags to check. + * This parameter can be any combination of the following values: + * @arg FLASH_FLAG_EOP : FLASH End of Operation flag + * @arg FLASH_FLAG_OPERR : FLASH operation Error flag + * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag + * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag + * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag + * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag + * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) + * @arg FLASH_FLAG_BSY : FLASH Busy flag + * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices + * @retval The new state of __FLAG__ (SET or RESET). + */ +#define __HAL_FLASH_GET_FLAG(__FLAG__) ((FLASH->SR & (__FLAG__))) + +/** + * @brief Clear the specified FLASH flags. + * @param __FLAG__ specifies the FLASH flags to clear. + * This parameter can be any combination of the following values: + * @arg FLASH_FLAG_EOP : FLASH End of Operation flag + * @arg FLASH_FLAG_OPERR : FLASH operation Error flag + * @arg FLASH_FLAG_WRPERR: FLASH Write protected error flag + * @arg FLASH_FLAG_PGAERR: FLASH Programming Alignment error flag + * @arg FLASH_FLAG_PGPERR: FLASH Programming Parallelism error flag + * @arg FLASH_FLAG_PGSERR: FLASH Programming Sequence error flag + * @arg FLASH_FLAG_RDERR : FLASH Read Protection error flag (PCROP) (*) + * (*) FLASH_FLAG_RDERR is not available for STM32F405xx/407xx/415xx/417xx devices + * @retval none + */ +#define __HAL_FLASH_CLEAR_FLAG(__FLAG__) (FLASH->SR = (__FLAG__)) +/** + * @} + */ + +/* Include FLASH HAL Extension module */ +#include "stm32f4xx_hal_flash_ex.h" +#include "stm32f4xx_hal_flash_ramfunc.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_Exported_Functions + * @{ + */ +/** @addtogroup FLASH_Exported_Functions_Group1 + * @{ + */ +/* Program operation functions ***********************************************/ +HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data); +HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data); +/* FLASH IRQ handler method */ +void HAL_FLASH_IRQHandler(void); +/* Callbacks in non blocking modes */ +void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue); +void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue); +/** + * @} + */ + +/** @addtogroup FLASH_Exported_Functions_Group2 + * @{ + */ +/* Peripheral Control functions **********************************************/ +HAL_StatusTypeDef HAL_FLASH_Unlock(void); +HAL_StatusTypeDef HAL_FLASH_Lock(void); +HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void); +HAL_StatusTypeDef HAL_FLASH_OB_Lock(void); +/* Option bytes control */ +HAL_StatusTypeDef HAL_FLASH_OB_Launch(void); +/** + * @} + */ + +/** @addtogroup FLASH_Exported_Functions_Group3 + * @{ + */ +/* Peripheral State functions ************************************************/ +uint32_t HAL_FLASH_GetError(void); +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Variables FLASH Private Variables + * @{ + */ + +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Constants FLASH Private Constants + * @{ + */ + +/** + * @brief ACR register byte 0 (Bits[7:0]) base address + */ +#define ACR_BYTE0_ADDRESS 0x40023C00U +/** + * @brief OPTCR register byte 0 (Bits[7:0]) base address + */ +#define OPTCR_BYTE0_ADDRESS 0x40023C14U +/** + * @brief OPTCR register byte 1 (Bits[15:8]) base address + */ +#define OPTCR_BYTE1_ADDRESS 0x40023C15U +/** + * @brief OPTCR register byte 2 (Bits[23:16]) base address + */ +#define OPTCR_BYTE2_ADDRESS 0x40023C16U +/** + * @brief OPTCR register byte 3 (Bits[31:24]) base address + */ +#define OPTCR_BYTE3_ADDRESS 0x40023C17U + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup FLASH_Private_Macros FLASH Private Macros + * @{ + */ + +/** @defgroup FLASH_IS_FLASH_Definitions FLASH Private macros to check input parameters + * @{ + */ +#define IS_FLASH_TYPEPROGRAM(VALUE)(((VALUE) == FLASH_TYPEPROGRAM_BYTE) || \ + ((VALUE) == FLASH_TYPEPROGRAM_HALFWORD) || \ + ((VALUE) == FLASH_TYPEPROGRAM_WORD) || \ + ((VALUE) == FLASH_TYPEPROGRAM_DOUBLEWORD)) +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Functions FLASH Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_FLASH_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h new file mode 100644 index 0000000..1cf8c45 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h @@ -0,0 +1,1063 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ex.h + * @author MCD Application Team + * @brief Header file of FLASH HAL Extension module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_FLASH_EX_H +#define __STM32F4xx_HAL_FLASH_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASHEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Types FLASH Exported Types + * @{ + */ + +/** + * @brief FLASH Erase structure definition + */ +typedef struct +{ + uint32_t TypeErase; /*!< Mass erase or sector Erase. + This parameter can be a value of @ref FLASHEx_Type_Erase */ + + uint32_t Banks; /*!< Select banks to erase when Mass erase is enabled. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint32_t Sector; /*!< Initial FLASH sector to erase when Mass erase is disabled + This parameter must be a value of @ref FLASHEx_Sectors */ + + uint32_t NbSectors; /*!< Number of sectors to be erased. + This parameter must be a value between 1 and (max number of sectors - value of Initial sector)*/ + + uint32_t VoltageRange;/*!< The device voltage range which defines the erase parallelism + This parameter must be a value of @ref FLASHEx_Voltage_Range */ + +} FLASH_EraseInitTypeDef; + +/** + * @brief FLASH Option Bytes Program structure definition + */ +typedef struct +{ + uint32_t OptionType; /*!< Option byte to be configured. + This parameter can be a value of @ref FLASHEx_Option_Type */ + + uint32_t WRPState; /*!< Write protection activation or deactivation. + This parameter can be a value of @ref FLASHEx_WRP_State */ + + uint32_t WRPSector; /*!< Specifies the sector(s) to be write protected. + The value of this parameter depend on device used within the same series */ + + uint32_t Banks; /*!< Select banks for WRP activation/deactivation of all sectors. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint32_t RDPLevel; /*!< Set the read protection level. + This parameter can be a value of @ref FLASHEx_Option_Bytes_Read_Protection */ + + uint32_t BORLevel; /*!< Set the BOR Level. + This parameter can be a value of @ref FLASHEx_BOR_Reset_Level */ + + uint8_t USERConfig; /*!< Program the FLASH User Option Byte: IWDG_SW / RST_STOP / RST_STDBY. */ + +} FLASH_OBProgramInitTypeDef; + +/** + * @brief FLASH Advanced Option Bytes Program structure definition + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +typedef struct +{ + uint32_t OptionType; /*!< Option byte to be configured for extension. + This parameter can be a value of @ref FLASHEx_Advanced_Option_Type */ + + uint32_t PCROPState; /*!< PCROP activation or deactivation. + This parameter can be a value of @ref FLASHEx_PCROP_State */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + uint16_t Sectors; /*!< specifies the sector(s) set for PCROP. + This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx ||\ + STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + uint32_t Banks; /*!< Select banks for PCROP activation/deactivation of all sectors. + This parameter must be a value of @ref FLASHEx_Banks */ + + uint16_t SectorsBank1; /*!< Specifies the sector(s) set for PCROP for Bank1. + This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ + + uint16_t SectorsBank2; /*!< Specifies the sector(s) set for PCROP for Bank2. + This parameter can be a value of @ref FLASHEx_Option_Bytes_PC_ReadWrite_Protection */ + + uint8_t BootConfig; /*!< Specifies Option bytes for boot config. + This parameter can be a value of @ref FLASHEx_Dual_Boot */ + +#endif /*STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +}FLASH_AdvOBProgramInitTypeDef; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || + STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup FLASHEx_Exported_Constants FLASH Exported Constants + * @{ + */ + +/** @defgroup FLASHEx_Type_Erase FLASH Type Erase + * @{ + */ +#define FLASH_TYPEERASE_SECTORS 0x00000000U /*!< Sectors erase only */ +#define FLASH_TYPEERASE_MASSERASE 0x00000001U /*!< Flash Mass erase activation */ +/** + * @} + */ + +/** @defgroup FLASHEx_Voltage_Range FLASH Voltage Range + * @{ + */ +#define FLASH_VOLTAGE_RANGE_1 0x00000000U /*!< Device operating range: 1.8V to 2.1V */ +#define FLASH_VOLTAGE_RANGE_2 0x00000001U /*!< Device operating range: 2.1V to 2.7V */ +#define FLASH_VOLTAGE_RANGE_3 0x00000002U /*!< Device operating range: 2.7V to 3.6V */ +#define FLASH_VOLTAGE_RANGE_4 0x00000003U /*!< Device operating range: 2.7V to 3.6V + External Vpp */ +/** + * @} + */ + +/** @defgroup FLASHEx_WRP_State FLASH WRP State + * @{ + */ +#define OB_WRPSTATE_DISABLE 0x00000000U /*!< Disable the write protection of the desired bank 1 sectors */ +#define OB_WRPSTATE_ENABLE 0x00000001U /*!< Enable the write protection of the desired bank 1 sectors */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Type FLASH Option Type + * @{ + */ +#define OPTIONBYTE_WRP 0x00000001U /*!< WRP option byte configuration */ +#define OPTIONBYTE_RDP 0x00000002U /*!< RDP option byte configuration */ +#define OPTIONBYTE_USER 0x00000004U /*!< USER option byte configuration */ +#define OPTIONBYTE_BOR 0x00000008U /*!< BOR option byte configuration */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection + * @{ + */ +#define OB_RDP_LEVEL_0 ((uint8_t)0xAA) +#define OB_RDP_LEVEL_1 ((uint8_t)0x55) +#define OB_RDP_LEVEL_2 ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 + it s no more possible to go back to level 1 or 0 */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Bytes_IWatchdog FLASH Option Bytes IWatchdog + * @{ + */ +#define OB_IWDG_SW ((uint8_t)0x20) /*!< Software IWDG selected */ +#define OB_IWDG_HW ((uint8_t)0x00) /*!< Hardware IWDG selected */ +/** + * @} + */ + +/** @defgroup FLASHEx_Option_Bytes_nRST_STOP FLASH Option Bytes nRST_STOP + * @{ + */ +#define OB_STOP_NO_RST ((uint8_t)0x40) /*!< No reset generated when entering in STOP */ +#define OB_STOP_RST ((uint8_t)0x00) /*!< Reset generated when entering in STOP */ +/** + * @} + */ + + +/** @defgroup FLASHEx_Option_Bytes_nRST_STDBY FLASH Option Bytes nRST_STDBY + * @{ + */ +#define OB_STDBY_NO_RST ((uint8_t)0x80) /*!< No reset generated when entering in STANDBY */ +#define OB_STDBY_RST ((uint8_t)0x00) /*!< Reset generated when entering in STANDBY */ +/** + * @} + */ + +/** @defgroup FLASHEx_BOR_Reset_Level FLASH BOR Reset Level + * @{ + */ +#define OB_BOR_LEVEL3 ((uint8_t)0x00) /*!< Supply voltage ranges from 2.70 to 3.60 V */ +#define OB_BOR_LEVEL2 ((uint8_t)0x04) /*!< Supply voltage ranges from 2.40 to 2.70 V */ +#define OB_BOR_LEVEL1 ((uint8_t)0x08) /*!< Supply voltage ranges from 2.10 to 2.40 V */ +#define OB_BOR_OFF ((uint8_t)0x0C) /*!< Supply voltage ranges from 1.62 to 2.10 V */ +/** + * @} + */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup FLASHEx_PCROP_State FLASH PCROP State + * @{ + */ +#define OB_PCROP_STATE_DISABLE 0x00000000U /*!< Disable PCROP */ +#define OB_PCROP_STATE_ENABLE 0x00000001U /*!< Enable PCROP */ +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ + STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/** @defgroup FLASHEx_Advanced_Option_Type FLASH Advanced Option Type + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define OPTIONBYTE_PCROP 0x00000001U /*!< PCROP option byte configuration */ +#define OPTIONBYTE_BOOTCONFIG 0x00000002U /*!< BOOTConfig option byte configuration */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +#define OPTIONBYTE_PCROP 0x00000001U /*!= FLASH_BASE) && ((ADDRESS) <= FLASH_END)) || \ + (((ADDRESS) >= FLASH_OTP_BASE) && ((ADDRESS) <= FLASH_OTP_END))) + +#define IS_FLASH_NBSECTORS(NBSECTORS) (((NBSECTORS) != 0) && ((NBSECTORS) <= FLASH_SECTOR_TOTAL)) + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFF000000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xC */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_OB_WRP_SECTOR(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFF8000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F401xC) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xC */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_OB_PCROP(SECTOR)((((SECTOR) & 0xFFFFF000U) == 0x00000000U) && ((SECTOR) != 0x00000000U)) +#endif /* STM32F401xE || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define IS_OB_BOOT(BOOT) (((BOOT) == OB_DUAL_BOOT_ENABLE) || ((BOOT) == OB_DUAL_BOOT_DISABLE)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define IS_OB_PCROP_SELECT(PCROP) (((PCROP) == OB_PCROP_SELECTED) || ((PCROP) == OB_PCROP_DESELECTED)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F401xC || STM32F401xE ||\ + STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup FLASHEx_Private_Functions FLASH Private Functions + * @{ + */ +void FLASH_Erase_Sector(uint32_t Sector, uint8_t VoltageRange); +void FLASH_FlushCaches(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_FLASH_EX_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h new file mode 100644 index 0000000..05917ec --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h @@ -0,0 +1,76 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ramfunc.h + * @author MCD Application Team + * @brief Header file of FLASH RAMFUNC driver. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_FLASH_RAMFUNC_H +#define __STM32F4xx_FLASH_RAMFUNC_H + +#ifdef __cplusplus + extern "C" { +#endif +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup FLASH_RAMFUNC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup FLASH_RAMFUNC_Exported_Functions + * @{ + */ + +/** @addtogroup FLASH_RAMFUNC_Exported_Functions_Group1 + * @{ + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void); +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void); +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void); +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_FLASH_RAMFUNC_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h new file mode 100644 index 0000000..5f3d749 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h @@ -0,0 +1,325 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_gpio.h + * @author MCD Application Team + * @brief Header file of GPIO HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_GPIO_H +#define __STM32F4xx_HAL_GPIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup GPIO + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Types GPIO Exported Types + * @{ + */ + +/** + * @brief GPIO Init structure definition + */ +typedef struct +{ + uint32_t Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_pins_define */ + + uint32_t Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIO_mode_define */ + + uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins. + This parameter can be a value of @ref GPIO_pull_define */ + + uint32_t Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIO_speed_define */ + + uint32_t Alternate; /*!< Peripheral to be connected to the selected pins. + This parameter can be a value of @ref GPIO_Alternate_function_selection */ +}GPIO_InitTypeDef; + +/** + * @brief GPIO Bit SET and Bit RESET enumeration + */ +typedef enum +{ + GPIO_PIN_RESET = 0, + GPIO_PIN_SET +}GPIO_PinState; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @defgroup GPIO_Exported_Constants GPIO Exported Constants + * @{ + */ + +/** @defgroup GPIO_pins_define GPIO pins define + * @{ + */ +#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */ +#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */ +#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */ +#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */ +#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */ +#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */ +#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */ +#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */ +#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */ +#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */ +#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */ +#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */ +#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */ +#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */ +#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */ +#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */ +#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */ + +#define GPIO_PIN_MASK 0x0000FFFFU /* PIN mask for assert test */ +/** + * @} + */ + +/** @defgroup GPIO_mode_define GPIO mode define + * @brief GPIO Configuration Mode + * Elements values convention: 0x00WX00YZ + * - W : EXTI trigger detection on 3 bits + * - X : EXTI mode (IT or Event) on 2 bits + * - Y : Output type (Push Pull or Open Drain) on 1 bit + * - Z : GPIO mode (Input, Output, Alternate or Analog) on 2 bits + * @{ + */ +#define GPIO_MODE_INPUT MODE_INPUT /*!< Input Floating Mode */ +#define GPIO_MODE_OUTPUT_PP (MODE_OUTPUT | OUTPUT_PP) /*!< Output Push Pull Mode */ +#define GPIO_MODE_OUTPUT_OD (MODE_OUTPUT | OUTPUT_OD) /*!< Output Open Drain Mode */ +#define GPIO_MODE_AF_PP (MODE_AF | OUTPUT_PP) /*!< Alternate Function Push Pull Mode */ +#define GPIO_MODE_AF_OD (MODE_AF | OUTPUT_OD) /*!< Alternate Function Open Drain Mode */ + +#define GPIO_MODE_ANALOG MODE_ANALOG /*!< Analog Mode */ + +#define GPIO_MODE_IT_RISING (MODE_INPUT | EXTI_IT | TRIGGER_RISING) /*!< External Interrupt Mode with Rising edge trigger detection */ +#define GPIO_MODE_IT_FALLING (MODE_INPUT | EXTI_IT | TRIGGER_FALLING) /*!< External Interrupt Mode with Falling edge trigger detection */ +#define GPIO_MODE_IT_RISING_FALLING (MODE_INPUT | EXTI_IT | TRIGGER_RISING | TRIGGER_FALLING) /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ + +#define GPIO_MODE_EVT_RISING (MODE_INPUT | EXTI_EVT | TRIGGER_RISING) /*!< External Event Mode with Rising edge trigger detection */ +#define GPIO_MODE_EVT_FALLING (MODE_INPUT | EXTI_EVT | TRIGGER_FALLING) /*!< External Event Mode with Falling edge trigger detection */ +#define GPIO_MODE_EVT_RISING_FALLING (MODE_INPUT | EXTI_EVT | TRIGGER_RISING | TRIGGER_FALLING) /*!< External Event Mode with Rising/Falling edge trigger detection */ + +/** + * @} + */ + +/** @defgroup GPIO_speed_define GPIO speed define + * @brief GPIO Output Maximum frequency + * @{ + */ +#define GPIO_SPEED_FREQ_LOW 0x00000000U /*!< IO works at 2 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_MEDIUM 0x00000001U /*!< range 12,5 MHz to 50 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_HIGH 0x00000002U /*!< range 25 MHz to 100 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_VERY_HIGH 0x00000003U /*!< range 50 MHz to 200 MHz, please refer to the product datasheet */ +/** + * @} + */ + + /** @defgroup GPIO_pull_define GPIO pull define + * @brief GPIO Pull-Up or Pull-Down Activation + * @{ + */ +#define GPIO_NOPULL 0x00000000U /*!< No Pull-up or Pull-down activation */ +#define GPIO_PULLUP 0x00000001U /*!< Pull-up activation */ +#define GPIO_PULLDOWN 0x00000002U /*!< Pull-down activation */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Macros GPIO Exported Macros + * @{ + */ + +/** + * @brief Checks whether the specified EXTI line flag is set or not. + * @param __EXTI_LINE__ specifies the EXTI line flag to check. + * This parameter can be GPIO_PIN_x where x can be(0..15) + * @retval The new state of __EXTI_LINE__ (SET or RESET). + */ +#define __HAL_GPIO_EXTI_GET_FLAG(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) + +/** + * @brief Clears the EXTI's line pending flags. + * @param __EXTI_LINE__ specifies the EXTI lines flags to clear. + * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) + * @retval None + */ +#define __HAL_GPIO_EXTI_CLEAR_FLAG(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) + +/** + * @brief Checks whether the specified EXTI line is asserted or not. + * @param __EXTI_LINE__ specifies the EXTI line to check. + * This parameter can be GPIO_PIN_x where x can be(0..15) + * @retval The new state of __EXTI_LINE__ (SET or RESET). + */ +#define __HAL_GPIO_EXTI_GET_IT(__EXTI_LINE__) (EXTI->PR & (__EXTI_LINE__)) + +/** + * @brief Clears the EXTI's line pending bits. + * @param __EXTI_LINE__ specifies the EXTI lines to clear. + * This parameter can be any combination of GPIO_PIN_x where x can be (0..15) + * @retval None + */ +#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__)) + +/** + * @brief Generates a Software interrupt on selected EXTI line. + * @param __EXTI_LINE__ specifies the EXTI line to check. + * This parameter can be GPIO_PIN_x where x can be(0..15) + * @retval None + */ +#define __HAL_GPIO_EXTI_GENERATE_SWIT(__EXTI_LINE__) (EXTI->SWIER |= (__EXTI_LINE__)) +/** + * @} + */ + +/* Include GPIO HAL Extension module */ +#include "stm32f4xx_hal_gpio_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup GPIO_Exported_Functions + * @{ + */ + +/** @addtogroup GPIO_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions *****************************/ +void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init); +void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin); +/** + * @} + */ + +/** @addtogroup GPIO_Exported_Functions_Group2 + * @{ + */ +/* IO operation functions *****************************************************/ +GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); +void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); +void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin); +void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); + +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup GPIO_Private_Constants GPIO Private Constants + * @{ + */ +#define GPIO_MODE_Pos 0U +#define GPIO_MODE (0x3UL << GPIO_MODE_Pos) +#define MODE_INPUT (0x0UL << GPIO_MODE_Pos) +#define MODE_OUTPUT (0x1UL << GPIO_MODE_Pos) +#define MODE_AF (0x2UL << GPIO_MODE_Pos) +#define MODE_ANALOG (0x3UL << GPIO_MODE_Pos) +#define OUTPUT_TYPE_Pos 4U +#define OUTPUT_TYPE (0x1UL << OUTPUT_TYPE_Pos) +#define OUTPUT_PP (0x0UL << OUTPUT_TYPE_Pos) +#define OUTPUT_OD (0x1UL << OUTPUT_TYPE_Pos) +#define EXTI_MODE_Pos 16U +#define EXTI_MODE (0x3UL << EXTI_MODE_Pos) +#define EXTI_IT (0x1UL << EXTI_MODE_Pos) +#define EXTI_EVT (0x2UL << EXTI_MODE_Pos) +#define TRIGGER_MODE_Pos 20U +#define TRIGGER_MODE (0x7UL << TRIGGER_MODE_Pos) +#define TRIGGER_RISING (0x1UL << TRIGGER_MODE_Pos) +#define TRIGGER_FALLING (0x2UL << TRIGGER_MODE_Pos) + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup GPIO_Private_Macros GPIO Private Macros + * @{ + */ +#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) +#define IS_GPIO_PIN(PIN) (((((uint32_t)PIN) & GPIO_PIN_MASK ) != 0x00U) && ((((uint32_t)PIN) & ~GPIO_PIN_MASK) == 0x00U)) +#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ + ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ + ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ + ((MODE) == GPIO_MODE_AF_PP) ||\ + ((MODE) == GPIO_MODE_AF_OD) ||\ + ((MODE) == GPIO_MODE_IT_RISING) ||\ + ((MODE) == GPIO_MODE_IT_FALLING) ||\ + ((MODE) == GPIO_MODE_IT_RISING_FALLING) ||\ + ((MODE) == GPIO_MODE_EVT_RISING) ||\ + ((MODE) == GPIO_MODE_EVT_FALLING) ||\ + ((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||\ + ((MODE) == GPIO_MODE_ANALOG)) +#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_SPEED_FREQ_LOW) || ((SPEED) == GPIO_SPEED_FREQ_MEDIUM) || \ + ((SPEED) == GPIO_SPEED_FREQ_HIGH) || ((SPEED) == GPIO_SPEED_FREQ_VERY_HIGH)) +#define IS_GPIO_PULL(PULL) (((PULL) == GPIO_NOPULL) || ((PULL) == GPIO_PULLUP) || \ + ((PULL) == GPIO_PULLDOWN)) +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup GPIO_Private_Functions GPIO Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_GPIO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h new file mode 100644 index 0000000..5e0b7cc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h @@ -0,0 +1,1590 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_gpio_ex.h + * @author MCD Application Team + * @brief Header file of GPIO HAL Extension module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_GPIO_EX_H +#define __STM32F4xx_HAL_GPIO_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIOEx GPIOEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Constants GPIO Exported Constants + * @{ + */ + +/** @defgroup GPIO_Alternate_function_selection GPIO Alternate Function Selection + * @{ + */ + +/*------------------------------------------ STM32F429xx/STM32F439xx ---------*/ +#if defined(STM32F429xx) || defined(STM32F439xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +/** @brief GPIO_Legacy + */ +#define GPIO_AF5_I2S3ext GPIO_AF5_SPI3 /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F427xx || STM32F437xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ +#if defined(STM32F407xx) || defined(STM32F417xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F407xx || STM32F417xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FSMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F405xx || STM32F415xx */ + +/*----------------------------------------------------------------------------*/ + +/*---------------------------------------- STM32F401xx------------------------*/ +#if defined(STM32F401xC) || defined(STM32F401xE) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ + + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F401xC || STM32F401xE */ +/*----------------------------------------------------------------------------*/ + +/*--------------- STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-------------*/ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ +#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_FMC ((uint8_t)0x0A) /* FMC Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +/*----------------------------------------------------------------------------*/ + +/*--------------- STM32F413xx/STM32F423xx-------------------------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ +#define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ +#define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_DFSDM1 ((uint8_t)0x0A) /* DFSDM1 Alternate Function mapping */ +#define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ +#define GPIO_AF10_FSMC ((uint8_t)0x0A) /* FSMC Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */ +#define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */ +#define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */ +#define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */ +#define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ +#define GPIO_AF12_FSMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F413xx || STM32F423xx */ + +/*---------------------------------------- STM32F411xx------------------------*/ +#if defined(STM32F411xE) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4/I2S4 Alternate Function mapping */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F411xE */ + +/*---------------------------------------- STM32F410xx------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_LPTIM1 ((uint8_t)0x01) /* LPTIM1 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#if defined(STM32F410Cx) || defined(STM32F410Rx) +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#endif /* STM32F410Cx || STM32F410Rx */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping */ +#if defined(STM32F410Cx) || defined(STM32F410Rx) +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* I2S2 Alternate Function mapping */ +#endif /* STM32F410Cx || STM32F410Rx */ +#define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5/I2S5 Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping */ +#define GPIO_AF9_FMPI2C1 ((uint8_t)0x09) /* FMPI2C1 Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/*---------------------------------------- STM32F446xx -----------------------*/ +#if defined(STM32F446xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ +#define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ +#define GPIO_AF4_FMPI2C1 ((uint8_t)0x04) /* FMPI2C1 Alternate Function mapping */ +#define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_UART5 ((uint8_t)0x07) /* UART5 Alternate Function mapping */ +#define GPIO_AF7_SPI2 ((uint8_t)0x07) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF7_SPDIFRX ((uint8_t)0x07) /* SPDIFRX Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_SPDIFRX ((uint8_t)0x08) /* SPDIFRX Alternate Function mapping */ +#define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ + +#endif /* STM32F446xx */ +/*----------------------------------------------------------------------------*/ + +/*-------------------------------- STM32F469xx/STM32F479xx--------------------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */ +#define GPIO_AF3_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */ +#define GPIO_AF3_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05) /* SPI4 Alternate Function mapping */ +#define GPIO_AF5_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */ +#define GPIO_AF5_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */ +#define GPIO_AF5_I2S3ext ((uint8_t)0x05) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping */ +#define GPIO_AF6_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_I2S3ext ((uint8_t)0x07) /* I2S3ext_SD Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */ +#define GPIO_AF8_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */ +#define GPIO_AF8_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */ +#define GPIO_AF8_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */ +#define GPIO_AF8_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */ +#define GPIO_AF9_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_LTDC ((uint8_t)0x09) /* LCD-TFT Alternate Function mapping */ +#define GPIO_AF9_QSPI ((uint8_t)0x09) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_OTG_FS ((uint8_t)0x0A) /* OTG_FS Alternate Function mapping */ +#define GPIO_AF10_OTG_HS ((uint8_t)0x0A) /* OTG_HS Alternate Function mapping */ +#define GPIO_AF10_QSPI ((uint8_t)0x0A) /* QSPI Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_FMC ((uint8_t)0x0C) /* FMC Alternate Function mapping */ +#define GPIO_AF12_OTG_HS_FS ((uint8_t)0x0C) /* OTG HS configured in FS, Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0x0C) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */ +#define GPIO_AF13_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */ + +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Macros GPIO Exported Macros + * @{ + */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Functions GPIO Exported Functions + * @{ + */ +/** + * @} + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup GPIOEx_Private_Constants GPIO Private Constants + * @{ + */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup GPIOEx_Private_Macros GPIO Private Macros + * @{ + */ +/** @defgroup GPIOEx_Get_Port_Index GPIO Get Port Index + * @{ + */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U :\ + ((__GPIOx__) == (GPIOH))? 7U : 8U) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U :\ + ((__GPIOx__) == (GPIOH))? 7U :\ + ((__GPIOx__) == (GPIOI))? 8U :\ + ((__GPIOx__) == (GPIOJ))? 9U : 10U) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U : 7U) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U : 7U) +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F413xx) || defined(STM32F423xx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U : 7U) +#endif /* STM32F446xx || STM32F412Zx || STM32F413xx || STM32F423xx */ +#if defined(STM32F412Vx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U : 7U) +#endif /* STM32F412Vx */ +#if defined(STM32F412Rx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U : 7U) +#endif /* STM32F412Rx */ +#if defined(STM32F412Cx) +#define GPIO_GET_INDEX(__GPIOx__) (uint8_t)(((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U : 7U) +#endif /* STM32F412Cx */ + +/** + * @} + */ + +/** @defgroup GPIOEx_IS_Alternat_function_selection GPIO Check Alternate Function + * @{ + */ +/*------------------------- STM32F429xx/STM32F439xx---------------------------*/ +#if defined(STM32F429xx) || defined(STM32F439xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ + ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ + ((AF) == GPIO_AF14_LTDC)) + +#endif /* STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F427xx/STM32F437xx------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ + ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1)) + +#endif /* STM32F427xx || STM32F437xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F407xx/STM32F417xx------------------*/ +#if defined(STM32F407xx) || defined(STM32F417xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F407xx || STM32F417xx */ +/*----------------------------------------------------------------------------*/ + +/*---------------------------------- STM32F405xx/STM32F415xx------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF12_OTG_HS_FS) || ((AF) == GPIO_AF12_SDIO) || \ + ((AF) == GPIO_AF12_FSMC) || ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F405xx || STM32F415xx */ + +/*----------------------------------------------------------------------------*/ + +/*---------------------------------------- STM32F401xx------------------------*/ +#if defined(STM32F401xC) || defined(STM32F401xE) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF12_SDIO) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM9) || \ + ((AF) == GPIO_AF3_TIM10) || ((AF) == GPIO_AF3_TIM11) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF7_USART1) || \ + ((AF) == GPIO_AF7_USART2) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF15_EVENTOUT)) +#endif /* STM32F401xC || STM32F401xE */ +/*----------------------------------------------------------------------------*/ +/*---------------------------------------- STM32F410xx------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_GPIO_AF(AF) (((AF) < 10U) || ((AF) == 15U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/*---------------------------------------- STM32F411xx------------------------*/ +#if defined(STM32F411xE) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF4_I2C1) || \ + ((AF) == GPIO_AF4_I2C2) || ((AF) == GPIO_AF4_I2C3) || \ + ((AF) == GPIO_AF5_SPI1) || ((AF) == GPIO_AF5_SPI2) || \ + ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI4) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF6_SPI5) || ((AF) == GPIO_AF7_SPI3) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF8_USART6) || ((AF) == GPIO_AF10_OTG_FS) || \ + ((AF) == GPIO_AF9_I2C2) || ((AF) == GPIO_AF9_I2C3) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF15_EVENTOUT)) + +#endif /* STM32F411xE */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------- STM32F446xx ----------------*/ +#if defined(STM32F446xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ + ((AF) == GPIO_AF3_CEC) || ((AF) == GPIO_AF4_CEC) || \ + ((AF) == GPIO_AF5_SPI3) || ((AF) == GPIO_AF6_SPI2) || \ + ((AF) == GPIO_AF6_SPI4) || ((AF) == GPIO_AF7_UART5) || \ + ((AF) == GPIO_AF7_SPI2) || ((AF) == GPIO_AF7_SPI3) || \ + ((AF) == GPIO_AF7_SPDIFRX) || ((AF) == GPIO_AF8_SPDIFRX) || \ + ((AF) == GPIO_AF8_SAI2) || ((AF) == GPIO_AF9_QSPI) || \ + ((AF) == GPIO_AF10_SAI2) || ((AF) == GPIO_AF10_QSPI)) + +#endif /* STM32F446xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------------------- STM32F469xx/STM32F479xx --------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_GPIO_AF(AF) (((AF) == GPIO_AF0_RTC_50Hz) || ((AF) == GPIO_AF9_TIM14) || \ + ((AF) == GPIO_AF0_MCO) || ((AF) == GPIO_AF0_TAMPER) || \ + ((AF) == GPIO_AF0_SWJ) || ((AF) == GPIO_AF0_TRACE) || \ + ((AF) == GPIO_AF1_TIM1) || ((AF) == GPIO_AF1_TIM2) || \ + ((AF) == GPIO_AF2_TIM3) || ((AF) == GPIO_AF2_TIM4) || \ + ((AF) == GPIO_AF2_TIM5) || ((AF) == GPIO_AF3_TIM8) || \ + ((AF) == GPIO_AF4_I2C1) || ((AF) == GPIO_AF4_I2C2) || \ + ((AF) == GPIO_AF4_I2C3) || ((AF) == GPIO_AF5_SPI1) || \ + ((AF) == GPIO_AF5_SPI2) || ((AF) == GPIO_AF9_TIM13) || \ + ((AF) == GPIO_AF6_SPI3) || ((AF) == GPIO_AF9_TIM12) || \ + ((AF) == GPIO_AF7_USART1) || ((AF) == GPIO_AF7_USART2) || \ + ((AF) == GPIO_AF7_USART3) || ((AF) == GPIO_AF8_UART4) || \ + ((AF) == GPIO_AF8_UART5) || ((AF) == GPIO_AF8_USART6) || \ + ((AF) == GPIO_AF9_CAN1) || ((AF) == GPIO_AF9_CAN2) || \ + ((AF) == GPIO_AF10_OTG_FS) || ((AF) == GPIO_AF10_OTG_HS) || \ + ((AF) == GPIO_AF11_ETH) || ((AF) == GPIO_AF12_OTG_HS_FS) || \ + ((AF) == GPIO_AF12_SDIO) || ((AF) == GPIO_AF13_DCMI) || \ + ((AF) == GPIO_AF15_EVENTOUT) || ((AF) == GPIO_AF5_SPI4) || \ + ((AF) == GPIO_AF5_SPI5) || ((AF) == GPIO_AF5_SPI6) || \ + ((AF) == GPIO_AF8_UART7) || ((AF) == GPIO_AF8_UART8) || \ + ((AF) == GPIO_AF12_FMC) || ((AF) == GPIO_AF6_SAI1) || \ + ((AF) == GPIO_AF14_LTDC) || ((AF) == GPIO_AF13_DSI) || \ + ((AF) == GPIO_AF9_QSPI) || ((AF) == GPIO_AF10_QSPI)) + +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx-----------*/ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 11U) && ((AF) != 14U) && ((AF) != 13U)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/*----------------------------------------------------------------------------*/ + +/*------------------STM32F413xx/STM32F423xx-----------------------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_GPIO_AF(AF) (((AF) < 16U) && ((AF) != 13U)) +#endif /* STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup GPIOEx_Private_Functions GPIO Private Functions + * @{ + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_GPIO_EX_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h new file mode 100644 index 0000000..d97f255 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h @@ -0,0 +1,427 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr.h + * @author MCD Application Team + * @brief Header file of PWR HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_PWR_H +#define __STM32F4xx_HAL_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWR + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Types PWR Exported Types + * @{ + */ + +/** + * @brief PWR PVD configuration structure definition + */ +typedef struct +{ + uint32_t PVDLevel; /*!< PVDLevel: Specifies the PVD detection level. + This parameter can be a value of @ref PWR_PVD_detection_level */ + + uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. + This parameter can be a value of @ref PWR_PVD_Mode */ +}PWR_PVDTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWR_Exported_Constants PWR Exported Constants + * @{ + */ + +/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins + * @{ + */ +#define PWR_WAKEUP_PIN1 0x00000100U +/** + * @} + */ + +/** @defgroup PWR_PVD_detection_level PWR PVD detection level + * @{ + */ +#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 +#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 +#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 +#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 +#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 +#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 +#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 +#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7/* External input analog voltage + (Compare internally to VREFINT) */ +/** + * @} + */ + +/** @defgroup PWR_PVD_Mode PWR PVD Mode + * @{ + */ +#define PWR_PVD_MODE_NORMAL 0x00000000U /*!< basic mode is used */ +#define PWR_PVD_MODE_IT_RISING 0x00010001U /*!< External Interrupt Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_IT_FALLING 0x00010002U /*!< External Interrupt Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_IT_RISING_FALLING 0x00010003U /*!< External Interrupt Mode with Rising/Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING 0x00020001U /*!< Event Mode with Rising edge trigger detection */ +#define PWR_PVD_MODE_EVENT_FALLING 0x00020002U /*!< Event Mode with Falling edge trigger detection */ +#define PWR_PVD_MODE_EVENT_RISING_FALLING 0x00020003U /*!< Event Mode with Rising/Falling edge trigger detection */ +/** + * @} + */ + + +/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in SLEEP/STOP mode + * @{ + */ +#define PWR_MAINREGULATOR_ON 0x00000000U +#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS +/** + * @} + */ + +/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry + * @{ + */ +#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01) +#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02) +/** + * @} + */ + +/** @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 */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h new file mode 100644 index 0000000..57fd4d9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h @@ -0,0 +1,340 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr_ex.h + * @author MCD Application Team + * @brief Header file of PWR HAL Extension module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_PWR_EX_H +#define __STM32F4xx_HAL_PWR_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWREx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Constants PWREx Exported Constants + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** @defgroup PWREx_Regulator_state_in_UnderDrive_mode PWREx Regulator state in UnderDrive mode + * @{ + */ +#define PWR_MAINREGULATOR_UNDERDRIVE_ON PWR_CR_MRUDS +#define PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON ((uint32_t)(PWR_CR_LPDS | PWR_CR_LPUDS)) +/** + * @} + */ + +/** @defgroup PWREx_Over_Under_Drive_Flag PWREx Over Under Drive Flag + * @{ + */ +#define PWR_FLAG_ODRDY PWR_CSR_ODRDY +#define PWR_FLAG_ODSWRDY PWR_CSR_ODSWRDY +#define PWR_FLAG_UDRDY PWR_CSR_UDSWRDY +/** + * @} + */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +/** @defgroup PWREx_Regulator_Voltage_Scale PWREx Regulator Voltage Scale + * @{ + */ +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) +#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK = 168 MHz. */ +#define PWR_REGULATOR_VOLTAGE_SCALE2 0x00000000U /* Scale 2 mode: the maximum value of fHCLK = 144 MHz. */ +#else +#define PWR_REGULATOR_VOLTAGE_SCALE1 PWR_CR_VOS /* Scale 1 mode(default value at reset): the maximum value of fHCLK is 168 MHz. It can be extended to + 180 MHz by activating the over-drive mode. */ +#define PWR_REGULATOR_VOLTAGE_SCALE2 PWR_CR_VOS_1 /* Scale 2 mode: the maximum value of fHCLK is 144 MHz. It can be extended to + 168 MHz by activating the over-drive mode. */ +#define PWR_REGULATOR_VOLTAGE_SCALE3 PWR_CR_VOS_0 /* Scale 3 mode: the maximum value of fHCLK is 120 MHz. */ +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ +/** + * @} + */ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @defgroup PWREx_WakeUp_Pins PWREx WakeUp Pins + * @{ + */ +#define PWR_WAKEUP_PIN2 0x00000080U +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define PWR_WAKEUP_PIN3 0x00000040U +#endif /* STM32F410xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Zx || STM32F412Vx || \ + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/** + * @} + */ +#endif /* STM32F410xx || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Constants PWREx Exported Constants + * @{ + */ + +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) +/** @brief macros configure the main internal regulator output voltage. + * @param __REGULATOR__ specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption when the device does + * not operate at the maximum frequency (refer to the datasheets for more details). + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode + * @retval None + */ +#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ + __IO uint32_t tmpreg = 0x00U; \ + MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ + UNUSED(tmpreg); \ + } while(0U) +#else +/** @brief macros configure the main internal regulator output voltage. + * @param __REGULATOR__ specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption when the device does + * not operate at the maximum frequency (refer to the datasheets for more details). + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode + * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode + * @retval None + */ +#define __HAL_PWR_VOLTAGESCALING_CONFIG(__REGULATOR__) do { \ + __IO uint32_t tmpreg = 0x00U; \ + MODIFY_REG(PWR->CR, PWR_CR_VOS, (__REGULATOR__)); \ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(PWR->CR, PWR_CR_VOS); \ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macros to enable or disable the Over drive mode. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + */ +#define __HAL_PWR_OVERDRIVE_ENABLE() (*(__IO uint32_t *) CR_ODEN_BB = ENABLE) +#define __HAL_PWR_OVERDRIVE_DISABLE() (*(__IO uint32_t *) CR_ODEN_BB = DISABLE) + +/** @brief Macros to enable or disable the Over drive switching. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + */ +#define __HAL_PWR_OVERDRIVESWITCHING_ENABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = ENABLE) +#define __HAL_PWR_OVERDRIVESWITCHING_DISABLE() (*(__IO uint32_t *) CR_ODSWEN_BB = DISABLE) + +/** @brief Macros to enable or disable the Under drive mode. + * @note This mode is enabled only with STOP low power mode. + * In this mode, the 1.2V domain is preserved in reduced leakage mode. This + * mode is only available when the main regulator or the low power regulator + * is in low voltage mode. + * @note If the Under-drive mode was enabled, it is automatically disabled after + * exiting Stop mode. + * When the voltage regulator operates in Under-drive mode, an additional + * startup delay is induced when waking up from Stop mode. + */ +#define __HAL_PWR_UNDERDRIVE_ENABLE() (PWR->CR |= (uint32_t)PWR_CR_UDEN) +#define __HAL_PWR_UNDERDRIVE_DISABLE() (PWR->CR &= (uint32_t)(~PWR_CR_UDEN)) + +/** @brief Check PWR flag is set or not. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg PWR_FLAG_ODRDY: This flag indicates that the Over-drive mode + * is ready + * @arg PWR_FLAG_ODSWRDY: This flag indicates that the Over-drive mode + * switching is ready + * @arg PWR_FLAG_UDRDY: This flag indicates that the Under-drive mode + * is enabled in Stop mode + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_PWR_GET_ODRUDR_FLAG(__FLAG__) ((PWR->CSR & (__FLAG__)) == (__FLAG__)) + +/** @brief Clear the Under-Drive Ready flag. + * @note These macros can be used only for STM32F42xx/STM3243xx devices. + */ +#define __HAL_PWR_CLEAR_ODRUDR_FLAG() (PWR->CSR |= PWR_FLAG_UDRDY) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup PWREx_Exported_Functions PWREx Exported Functions + * @{ + */ + +/** @addtogroup PWREx_Exported_Functions_Group1 + * @{ + */ +void HAL_PWREx_EnableFlashPowerDown(void); +void HAL_PWREx_DisableFlashPowerDown(void); +HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void); +HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void); +uint32_t HAL_PWREx_GetVoltageRange(void); +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ + defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) ||\ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +void HAL_PWREx_EnableMainRegulatorLowVoltage(void); +void HAL_PWREx_DisableMainRegulatorLowVoltage(void); +void HAL_PWREx_EnableLowRegulatorLowVoltage(void); +void HAL_PWREx_DisableLowRegulatorLowVoltage(void); +#endif /* STM32F410xx || STM32F401xC || STM32F401xE || STM32F411xE || STM32F412Zx || STM32F412Vx ||\ + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void); +HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void); +HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup PWREx_Private_Constants PWREx Private Constants + * @{ + */ + +/** @defgroup PWREx_register_alias_address PWREx Register alias address + * @{ + */ +/* ------------- PWR registers bit address in the alias region ---------------*/ +/* --- CR Register ---*/ +/* Alias word address of FPDS bit */ +#define FPDS_BIT_NUMBER PWR_CR_FPDS_Pos +#define CR_FPDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (FPDS_BIT_NUMBER * 4U)) + +/* Alias word address of ODEN bit */ +#define ODEN_BIT_NUMBER PWR_CR_ODEN_Pos +#define CR_ODEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODEN_BIT_NUMBER * 4U)) + +/* Alias word address of ODSWEN bit */ +#define ODSWEN_BIT_NUMBER PWR_CR_ODSWEN_Pos +#define CR_ODSWEN_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (ODSWEN_BIT_NUMBER * 4U)) + +/* Alias word address of MRLVDS bit */ +#define MRLVDS_BIT_NUMBER PWR_CR_MRLVDS_Pos +#define CR_MRLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (MRLVDS_BIT_NUMBER * 4U)) + +/* Alias word address of LPLVDS bit */ +#define LPLVDS_BIT_NUMBER PWR_CR_LPLVDS_Pos +#define CR_LPLVDS_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CR_OFFSET_BB * 32U) + (LPLVDS_BIT_NUMBER * 4U)) + + /** + * @} + */ + +/** @defgroup PWREx_CSR_register_alias PWRx CSR Register alias address + * @{ + */ +/* --- CSR Register ---*/ +/* Alias word address of BRE bit */ +#define BRE_BIT_NUMBER PWR_CSR_BRE_Pos +#define CSR_BRE_BB (uint32_t)(PERIPH_BB_BASE + (PWR_CSR_OFFSET_BB * 32U) + (BRE_BIT_NUMBER * 4U)) + +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup PWREx_Private_Macros PWREx Private Macros + * @{ + */ + +/** @defgroup PWREx_IS_PWR_Definitions PWREx Private macros to check input parameters + * @{ + */ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_PWR_REGULATOR_UNDERDRIVE(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_UNDERDRIVE_ON) || \ + ((REGULATOR) == PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F407xx) || defined(STM32F415xx) || defined(STM32F417xx) +#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ + ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2)) +#else +#define IS_PWR_VOLTAGE_SCALING_RANGE(VOLTAGE) (((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE1) || \ + ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE2) || \ + ((VOLTAGE) == PWR_REGULATOR_VOLTAGE_SCALE3)) +#endif /* STM32F405xx || STM32F407xx || STM32F415xx || STM32F417xx */ + +#if defined(STM32F446xx) +#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2)) +#elif defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || ((PIN) == PWR_WAKEUP_PIN2) || \ + ((PIN) == PWR_WAKEUP_PIN3)) +#else +#define IS_PWR_WAKEUP_PIN(PIN) ((PIN) == PWR_WAKEUP_PIN1) +#endif /* STM32F446xx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F4xx_HAL_PWR_EX_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h new file mode 100644 index 0000000..dcf5814 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h @@ -0,0 +1,1459 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc.h + * @author MCD Application Team + * @brief Header file of RCC HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_RCC_H +#define __STM32F4xx_HAL_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/* Include RCC HAL Extended module */ +/* (include on top of file since RCC structures are defined in extended file) */ +#include "stm32f4xx_hal_rcc_ex.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup RCC_Exported_Types RCC Exported Types + * @{ + */ + +/** + * @brief RCC Internal/External Oscillator (HSE, HSI, LSE and LSI) configuration structure definition + */ +typedef struct +{ + uint32_t OscillatorType; /*!< The oscillators to be configured. + This parameter can be a value of @ref RCC_Oscillator_Type */ + + uint32_t HSEState; /*!< The new state of the HSE. + This parameter can be a value of @ref RCC_HSE_Config */ + + uint32_t LSEState; /*!< The new state of the LSE. + This parameter can be a value of @ref RCC_LSE_Config */ + + uint32_t HSIState; /*!< The new state of the HSI. + This parameter can be a value of @ref RCC_HSI_Config */ + + uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). + This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ + + uint32_t LSIState; /*!< The new state of the LSI. + This parameter can be a value of @ref RCC_LSI_Config */ + + RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ +}RCC_OscInitTypeDef; + +/** + * @brief RCC System, AHB and APB busses clock configuration structure definition + */ +typedef struct +{ + uint32_t ClockType; /*!< The clock to be configured. + This parameter can be a value of @ref RCC_System_Clock_Type */ + + uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. + This parameter can be a value of @ref RCC_System_Clock_Source */ + + uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). + This parameter can be a value of @ref RCC_AHB_Clock_Source */ + + uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ + + uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ + +}RCC_ClkInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCC_Exported_Constants RCC Exported Constants + * @{ + */ + +/** @defgroup RCC_Oscillator_Type Oscillator Type + * @{ + */ +#define RCC_OSCILLATORTYPE_NONE 0x00000000U +#define RCC_OSCILLATORTYPE_HSE 0x00000001U +#define RCC_OSCILLATORTYPE_HSI 0x00000002U +#define RCC_OSCILLATORTYPE_LSE 0x00000004U +#define RCC_OSCILLATORTYPE_LSI 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_HSE_Config HSE Config + * @{ + */ +#define RCC_HSE_OFF 0x00000000U +#define RCC_HSE_ON RCC_CR_HSEON +#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) +/** + * @} + */ + +/** @defgroup RCC_LSE_Config LSE Config + * @{ + */ +#define RCC_LSE_OFF 0x00000000U +#define RCC_LSE_ON RCC_BDCR_LSEON +#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) +/** + * @} + */ + +/** @defgroup RCC_HSI_Config HSI Config + * @{ + */ +#define RCC_HSI_OFF ((uint8_t)0x00) +#define RCC_HSI_ON ((uint8_t)0x01) + +#define RCC_HSICALIBRATION_DEFAULT 0x10U /* Default HSI calibration trimming value */ +/** + * @} + */ + +/** @defgroup RCC_LSI_Config LSI Config + * @{ + */ +#define RCC_LSI_OFF ((uint8_t)0x00) +#define RCC_LSI_ON ((uint8_t)0x01) +/** + * @} + */ + +/** @defgroup RCC_PLL_Config PLL Config + * @{ + */ +#define RCC_PLL_NONE ((uint8_t)0x00) +#define RCC_PLL_OFF ((uint8_t)0x01) +#define RCC_PLL_ON ((uint8_t)0x02) +/** + * @} + */ + +/** @defgroup RCC_PLLP_Clock_Divider PLLP Clock Divider + * @{ + */ +#define RCC_PLLP_DIV2 0x00000002U +#define RCC_PLLP_DIV4 0x00000004U +#define RCC_PLLP_DIV6 0x00000006U +#define RCC_PLLP_DIV8 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_PLL_Clock_Source PLL Clock Source + * @{ + */ +#define RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI +#define RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Type System Clock Type + * @{ + */ +#define RCC_CLOCKTYPE_SYSCLK 0x00000001U +#define RCC_CLOCKTYPE_HCLK 0x00000002U +#define RCC_CLOCKTYPE_PCLK1 0x00000004U +#define RCC_CLOCKTYPE_PCLK2 0x00000008U +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source System Clock Source + * @note The RCC_SYSCLKSOURCE_PLLRCLK parameter is available only for + * STM32F446xx devices. + * @{ + */ +#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI +#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE +#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL +#define RCC_SYSCLKSOURCE_PLLRCLK ((uint32_t)(RCC_CFGR_SW_0 | RCC_CFGR_SW_1)) +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status + * @note The RCC_SYSCLKSOURCE_STATUS_PLLRCLK parameter is available only for + * STM32F446xx devices. + * @{ + */ +#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_PLLRCLK ((uint32_t)(RCC_CFGR_SWS_0 | RCC_CFGR_SWS_1)) /*!< PLLR used as system clock */ +/** + * @} + */ + +/** @defgroup RCC_AHB_Clock_Source AHB Clock Source + * @{ + */ +#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 +#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 +#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 +#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 +#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 +#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 +#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 +#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 +#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 +/** + * @} + */ + +/** @defgroup RCC_APB1_APB2_Clock_Source APB1/APB2 Clock Source + * @{ + */ +#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 +#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 +#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 +#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 +#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 +/** + * @} + */ + +/** @defgroup RCC_RTC_Clock_Source RTC Clock Source + * @{ + */ +#define RCC_RTCCLKSOURCE_NO_CLK 0x00000000U +#define RCC_RTCCLKSOURCE_LSE 0x00000100U +#define RCC_RTCCLKSOURCE_LSI 0x00000200U +#define RCC_RTCCLKSOURCE_HSE_DIVX 0x00000300U +#define RCC_RTCCLKSOURCE_HSE_DIV2 0x00020300U +#define RCC_RTCCLKSOURCE_HSE_DIV3 0x00030300U +#define RCC_RTCCLKSOURCE_HSE_DIV4 0x00040300U +#define RCC_RTCCLKSOURCE_HSE_DIV5 0x00050300U +#define RCC_RTCCLKSOURCE_HSE_DIV6 0x00060300U +#define RCC_RTCCLKSOURCE_HSE_DIV7 0x00070300U +#define RCC_RTCCLKSOURCE_HSE_DIV8 0x00080300U +#define RCC_RTCCLKSOURCE_HSE_DIV9 0x00090300U +#define RCC_RTCCLKSOURCE_HSE_DIV10 0x000A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV11 0x000B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV12 0x000C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV13 0x000D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV14 0x000E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV15 0x000F0300U +#define RCC_RTCCLKSOURCE_HSE_DIV16 0x00100300U +#define RCC_RTCCLKSOURCE_HSE_DIV17 0x00110300U +#define RCC_RTCCLKSOURCE_HSE_DIV18 0x00120300U +#define RCC_RTCCLKSOURCE_HSE_DIV19 0x00130300U +#define RCC_RTCCLKSOURCE_HSE_DIV20 0x00140300U +#define RCC_RTCCLKSOURCE_HSE_DIV21 0x00150300U +#define RCC_RTCCLKSOURCE_HSE_DIV22 0x00160300U +#define RCC_RTCCLKSOURCE_HSE_DIV23 0x00170300U +#define RCC_RTCCLKSOURCE_HSE_DIV24 0x00180300U +#define RCC_RTCCLKSOURCE_HSE_DIV25 0x00190300U +#define RCC_RTCCLKSOURCE_HSE_DIV26 0x001A0300U +#define RCC_RTCCLKSOURCE_HSE_DIV27 0x001B0300U +#define RCC_RTCCLKSOURCE_HSE_DIV28 0x001C0300U +#define RCC_RTCCLKSOURCE_HSE_DIV29 0x001D0300U +#define RCC_RTCCLKSOURCE_HSE_DIV30 0x001E0300U +#define RCC_RTCCLKSOURCE_HSE_DIV31 0x001F0300U +/** + * @} + */ + +/** @defgroup RCC_MCO_Index MCO Index + * @{ + */ +#define RCC_MCO1 0x00000000U +#define RCC_MCO2 0x00000001U +/** + * @} + */ + +/** @defgroup RCC_MCO1_Clock_Source MCO1 Clock Source + * @{ + */ +#define RCC_MCO1SOURCE_HSI 0x00000000U +#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO1_0 +#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO1_1 +#define RCC_MCO1SOURCE_PLLCLK RCC_CFGR_MCO1 +/** + * @} + */ + +/** @defgroup RCC_MCOx_Clock_Prescaler MCOx Clock Prescaler + * @{ + */ +#define RCC_MCODIV_1 0x00000000U +#define RCC_MCODIV_2 RCC_CFGR_MCO1PRE_2 +#define RCC_MCODIV_3 ((uint32_t)RCC_CFGR_MCO1PRE_0 | RCC_CFGR_MCO1PRE_2) +#define RCC_MCODIV_4 ((uint32_t)RCC_CFGR_MCO1PRE_1 | RCC_CFGR_MCO1PRE_2) +#define RCC_MCODIV_5 RCC_CFGR_MCO1PRE +/** + * @} + */ + +/** @defgroup RCC_Interrupt Interrupts + * @{ + */ +#define RCC_IT_LSIRDY ((uint8_t)0x01) +#define RCC_IT_LSERDY ((uint8_t)0x02) +#define RCC_IT_HSIRDY ((uint8_t)0x04) +#define RCC_IT_HSERDY ((uint8_t)0x08) +#define RCC_IT_PLLRDY ((uint8_t)0x10) +#define RCC_IT_PLLI2SRDY ((uint8_t)0x20) +#define RCC_IT_CSS ((uint8_t)0x80) +/** + * @} + */ + +/** @defgroup RCC_Flag Flags + * Elements values convention: 0XXYYYYYb + * - YYYYY : Flag position in the register + * - 0XX : Register index + * - 01: CR register + * - 10: BDCR register + * - 11: CSR register + * @{ + */ +/* Flags in the CR register */ +#define RCC_FLAG_HSIRDY ((uint8_t)0x21) +#define RCC_FLAG_HSERDY ((uint8_t)0x31) +#define RCC_FLAG_PLLRDY ((uint8_t)0x39) +#define RCC_FLAG_PLLI2SRDY ((uint8_t)0x3B) + +/* Flags in the BDCR register */ +#define RCC_FLAG_LSERDY ((uint8_t)0x41) + +/* Flags in the CSR register */ +#define RCC_FLAG_LSIRDY ((uint8_t)0x61) +#define RCC_FLAG_BORRST ((uint8_t)0x79) +#define RCC_FLAG_PINRST ((uint8_t)0x7A) +#define RCC_FLAG_PORRST ((uint8_t)0x7B) +#define RCC_FLAG_SFTRST ((uint8_t)0x7C) +#define RCC_FLAG_IWDGRST ((uint8_t)0x7D) +#define RCC_FLAG_WWDGRST ((uint8_t)0x7E) +#define RCC_FLAG_LPWRRST ((uint8_t)0x7F) +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCC_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_AHB1_Clock_Enable_Disable AHB1 Peripheral Clock Enable Disable + * @brief Enable or disable the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOAEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_DMA2EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOAEN)) +#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOBEN)) +#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOCEN)) +#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_GPIOHEN)) +#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA1EN)) +#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHB1ENR &= ~(RCC_AHB1ENR_DMA2EN)) +/** + * @} + */ + +/** @defgroup RCC_AHB1_Peripheral_Clock_Enable_Disable_Status AHB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) != RESET) +#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) != RESET) +#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) != RESET) +#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) != RESET) +#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) != RESET) +#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) != RESET) + +#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOAEN)) == RESET) +#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOBEN)) == RESET) +#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOCEN)) == RESET) +#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_GPIOHEN)) == RESET) +#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA1EN)) == RESET) +#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHB1ENR &(RCC_AHB1ENR_DMA2EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB1_Clock_Enable_Disable APB1 Peripheral Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_PWR_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) +#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) +#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) +#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) +#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) +#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) +#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != RESET) +#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) +#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) +#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) +#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) +#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) +#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) + +#define __HAL_RCC_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == RESET) +#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) +#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) +#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) +#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) +#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) +#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM9_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM9EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM11_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM11EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) +#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) +#define __HAL_RCC_USART6_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART6EN)) +#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_ADC1EN)) +#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) +#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) +#define __HAL_RCC_TIM9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM9EN)) +#define __HAL_RCC_TIM11_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM11EN)) +/** + * @} + */ + +/** @defgroup RCC_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) +#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) +#define __HAL_RCC_USART6_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) != RESET) +#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) != RESET) +#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) +#define __HAL_RCC_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) +#define __HAL_RCC_TIM9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) != RESET) +#define __HAL_RCC_TIM11_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) != RESET) + +#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) +#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) +#define __HAL_RCC_USART6_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART6EN)) == RESET) +#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_ADC1EN)) == RESET) +#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) +#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) +#define __HAL_RCC_TIM9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM9EN)) == RESET) +#define __HAL_RCC_TIM11_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM11EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_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 divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() + * @note If the LSE or LSI is used as RTC clock source, the RTC continues to + * work in STOP and STANDBY modes, and can be used as wake-up source. + * However, when the HSE clock is used as RTC clock source, the RTC + * cannot be used in STOP and STANDBY modes. + * @note The maximum input clock frequency for RTC is 1MHz (when using HSE as + * RTC clock source). + */ +#define __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__) (((__RTCCLKSource__) & RCC_BDCR_RTCSEL) == RCC_BDCR_RTCSEL) ? \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, ((__RTCCLKSource__) & 0xFFFFCFFU)) : CLEAR_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) + +#define __HAL_RCC_RTC_CONFIG(__RTCCLKSource__) do { __HAL_RCC_RTC_CLKPRESCALER(__RTCCLKSource__); \ + RCC->BDCR |= ((__RTCCLKSource__) & 0x00000FFFU); \ + } while(0U) + +/** @brief Macro to get the RTC clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() + */ +#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) + +/** + * @brief Get the RTC and HSE clock divider (RTCPRE). + * @retval Returned value can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIVX HSE divided by X selected as RTC clock (X can be retrieved thanks to @ref __HAL_RCC_GET_RTC_HSE_PRESCALER() + */ +#define __HAL_RCC_GET_RTC_HSE_PRESCALER() (READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE) | RCC_BDCR_RTCSEL) + +/** @brief Macros to force or release the Backup domain reset. + * @note This function resets the RTC peripheral (including the backup registers) + * and the RTC clock source selection in RCC_CSR register. + * @note The BKPSRAM is not affected by this reset. + */ +#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) +#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) +/** + * @} + */ + +/** @defgroup RCC_PLL_Configuration PLL Configuration + * @{ + */ + +/** @brief Macros to enable or disable the main PLL. + * @note After enabling the main PLL, the application software should wait on + * PLLRDY flag to be set indicating that PLL clock is stable and can + * be used as system clock source. + * @note The main PLL can not be disabled if it is used as system clock source + * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) +#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) + +/** @brief Macro to configure the PLL clock source. + * @note This function must be used only when the main PLL is disabled. + * @param __PLLSOURCE__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * + */ +#define __HAL_RCC_PLL_PLLSOURCE_CONFIG(__PLLSOURCE__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, (__PLLSOURCE__)) + +/** @brief Macro to configure the PLL multiplication factor. + * @note This function must be used only when the main PLL is disabled. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * + */ +#define __HAL_RCC_PLL_PLLM_CONFIG(__PLLM__) MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, (__PLLM__)) +/** + * @} + */ + +/** @defgroup RCC_Get_Clock_source Get Clock source + * @{ + */ +/** + * @brief Macro to configure the system clock source. + * @param __RCC_SYSCLKSOURCE__ specifies the system clock source. + * This parameter can be one of the following values: + * - RCC_SYSCLKSOURCE_HSI: HSI oscillator is used as system clock source. + * - RCC_SYSCLKSOURCE_HSE: HSE oscillator is used as system clock source. + * - RCC_SYSCLKSOURCE_PLLCLK: PLL output is used as system clock source. + * - RCC_SYSCLKSOURCE_PLLRCLK: PLLR output is used as system clock source. This + * parameter is available only for STM32F446xx devices. + */ +#define __HAL_RCC_SYSCLK_CONFIG(__RCC_SYSCLKSOURCE__) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__RCC_SYSCLKSOURCE__)) + +/** @brief Macro to get the clock source used as system clock. + * @retval The clock source used as system clock. The returned value can be one + * of the following: + * - RCC_SYSCLKSOURCE_STATUS_HSI: HSI used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_HSE: HSE used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_PLLCLK: PLL used as system clock. + * - RCC_SYSCLKSOURCE_STATUS_PLLRCLK: PLLR used as system clock. This parameter + * is available only for STM32F446xx devices. + */ +#define __HAL_RCC_GET_SYSCLK_SOURCE() (RCC->CFGR & RCC_CFGR_SWS) + +/** @brief Macro to get the oscillator used as PLL clock source. + * @retval The oscillator used as PLL clock source. The returned value can be one + * of the following: + * - RCC_PLLSOURCE_HSI: HSI oscillator is used as PLL clock source. + * - RCC_PLLSOURCE_HSE: HSE oscillator is used as PLL clock source. + */ +#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC)) +/** + * @} + */ + +/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config + * @{ + */ + +/** @brief Macro to configure the MCO1 clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO1SOURCE_HSI: HSI clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_LSE: LSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_HSE: HSE clock selected as MCO1 source + * @arg RCC_MCO1SOURCE_PLLCLK: main PLL clock selected as MCO1 source + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + */ +#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO1 | RCC_CFGR_MCO1PRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) + +/** @brief Macro to configure the MCO2 clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg RCC_MCO2SOURCE_SYSCLK: System clock (SYSCLK) selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLI2SCLK: PLLI2S clock selected as MCO2 source, available for all STM32F4 devices except STM32F410xx + * @arg RCC_MCO2SOURCE_I2SCLK: I2SCLK clock selected as MCO2 source, available only for STM32F410Rx devices + * @arg RCC_MCO2SOURCE_HSE: HSE clock selected as MCO2 source + * @arg RCC_MCO2SOURCE_PLLCLK: main PLL clock selected as MCO2 source + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg RCC_MCODIV_1: no division applied to MCOx clock + * @arg RCC_MCODIV_2: division by 2 applied to MCOx clock + * @arg RCC_MCODIV_3: division by 3 applied to MCOx clock + * @arg RCC_MCODIV_4: division by 4 applied to MCOx clock + * @arg RCC_MCODIV_5: division by 5 applied to MCOx clock + * @note For STM32F410Rx devices, to output I2SCLK clock on MCO2, you should have + * at least one of the SPI clocks enabled (SPI1, SPI2 or SPI5). + */ +#define __HAL_RCC_MCO2_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO2 | RCC_CFGR_MCO2PRE), ((__MCOCLKSOURCE__) | ((__MCODIV__) << 3U))); +/** + * @} + */ + +/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management + * @brief macros to manage the specified RCC Flags and interrupts. + * @{ + */ + +/** @brief Enable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to enable + * the selected interrupts). + * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + */ +#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) + +/** @brief Disable RCC interrupt (Perform Byte access to RCC_CIR[14:8] bits to disable + * the selected interrupts). + * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + */ +#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) + +/** @brief Clear the RCC's interrupt pending bits (Perform Byte access to RCC_CIR[23:16] + * bits to clear the selected interrupt pending bits. + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + * @arg RCC_IT_CSS: Clock Security System interrupt + */ +#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) + +/** @brief Check the RCC's interrupt has occurred or not. + * @param __INTERRUPT__ specifies the RCC interrupt source to check. + * This parameter can be one of the following values: + * @arg RCC_IT_LSIRDY: LSI ready interrupt. + * @arg RCC_IT_LSERDY: LSE ready interrupt. + * @arg RCC_IT_HSIRDY: HSI ready interrupt. + * @arg RCC_IT_HSERDY: HSE ready interrupt. + * @arg RCC_IT_PLLRDY: Main PLL ready interrupt. + * @arg RCC_IT_PLLI2SRDY: PLLI2S ready interrupt. + * @arg RCC_IT_CSS: Clock Security System interrupt + * @retval The new state of __INTERRUPT__ (TRUE or FALSE). + */ +#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) + +/** @brief Set RMVF bit to clear the reset flags: RCC_FLAG_PINRST, RCC_FLAG_PORRST, + * RCC_FLAG_SFTRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST and RCC_FLAG_LPWRRST. + */ +#define __HAL_RCC_CLEAR_RESET_FLAGS() (RCC->CSR |= RCC_CSR_RMVF) + +/** @brief Check RCC flag is set or not. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg RCC_FLAG_HSIRDY: HSI oscillator clock ready. + * @arg RCC_FLAG_HSERDY: HSE oscillator clock ready. + * @arg RCC_FLAG_PLLRDY: Main PLL clock ready. + * @arg RCC_FLAG_PLLI2SRDY: PLLI2S clock ready. + * @arg RCC_FLAG_LSERDY: LSE oscillator clock ready. + * @arg RCC_FLAG_LSIRDY: LSI oscillator clock ready. + * @arg RCC_FLAG_BORRST: POR/PDR or BOR reset. + * @arg RCC_FLAG_PINRST: Pin reset. + * @arg RCC_FLAG_PORRST: POR/PDR reset. + * @arg RCC_FLAG_SFTRST: Software reset. + * @arg RCC_FLAG_IWDGRST: Independent Watchdog reset. + * @arg RCC_FLAG_WWDGRST: Window Watchdog reset. + * @arg RCC_FLAG_LPWRRST: Low Power reset. + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define RCC_FLAG_MASK ((uint8_t)0x1FU) +#define __HAL_RCC_GET_FLAG(__FLAG__) (((((((__FLAG__) >> 5U) == 1U)? RCC->CR :((((__FLAG__) >> 5U) == 2U) ? RCC->BDCR :((((__FLAG__) >> 5U) == 3U)? RCC->CSR :RCC->CIR))) & (1U << ((__FLAG__) & RCC_FLAG_MASK)))!= 0U)? 1U : 0U) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + /** @addtogroup RCC_Exported_Functions + * @{ + */ + +/** @addtogroup RCC_Exported_Functions_Group1 + * @{ + */ +/* Initialization and de-initialization functions ******************************/ +HAL_StatusTypeDef HAL_RCC_DeInit(void); +HAL_StatusTypeDef HAL_RCC_OscConfig(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 */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h new file mode 100644 index 0000000..909a717 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h @@ -0,0 +1,7111 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc_ex.h + * @author MCD Application Team + * @brief Header file of RCC HAL Extension module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_RCC_EX_H +#define __STM32F4xx_HAL_RCC_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCCEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Types RCCEx Exported Types + * @{ + */ + +/** + * @brief RCC PLL configuration structure definition + */ +typedef struct +{ + uint32_t PLLState; /*!< The new state of the PLL. + This parameter can be a value of @ref RCC_PLL_Config */ + + uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. + This parameter must be a value of @ref RCC_PLL_Clock_Source */ + + uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 0 and Max_Data = 63 */ + + uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 + except for STM32F411xE devices where the Min_Data = 192 */ + + uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). + This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ + + uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDIO and RNG clocks. + This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) + uint32_t PLLR; /*!< PLLR: PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. + This parameter is only available in STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx + and STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. + This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ +#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +}RCC_PLLInitTypeDef; + +#if defined(STM32F446xx) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLI2SP; /*!< Specifies division factor for SPDIFRX Clock. + This parameter must be a value of @ref RCCEx_PLLI2SP_Clock_Divider */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ +}RCC_PLLI2SInitTypeDef; + +/** + * @brief PLLSAI Clock structure definition + */ +typedef struct +{ + uint32_t PLLSAIM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS, SDIO and RNG clocks. + This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ + + uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ +}RCC_PLLSAIInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ + + uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ + + uint32_t Sai1ClockSelection; /*!< Specifies SAI1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_SAI1_Clock_Source */ + + uint32_t Sai2ClockSelection; /*!< Specifies SAI2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_SAI2_Clock_Source */ + + uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ + + uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ + + uint32_t CecClockSelection; /*!< Specifies CEC Clock Source Selection. + This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint32_t SpdifClockSelection; /*!< Specifies SPDIFRX Clock Source Selection. + This parameter can be a value of @ref RCCEx_SPDIFRX_Clock_Source */ + + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F446xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t I2SClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2S_APB_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SM; /*!< Specifies division factor for PLL VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ +}RCC_PLLI2SInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S */ + +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t PLLDivR; /*!< Specifies the PLL division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLL is selected as Clock Source SAI */ + + uint32_t PLLI2SDivR; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ +#endif /* STM32F413xx || STM32F423xx */ + + uint32_t I2sApb1ClockSelection; /*!< Specifies I2S APB1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB1_Clock_Source */ + + uint32_t I2sApb2ClockSelection; /*!< Specifies I2S APB2 Clock Source Selection. + This parameter can be a value of @ref RCCEx_I2SAPB2_Clock_Source */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Source Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ + + uint32_t Fmpi2c1ClockSelection; /*!< Specifies FMPI2C1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_FMPI2C1_Clock_Source */ + + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint32_t Dfsdm1ClockSelection; /*!< Specifies DFSDM1 Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM1_Kernel_Clock_Source */ + + uint32_t Dfsdm1AudioClockSelection;/*!< Specifies DFSDM1 Audio Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM1_Audio_Clock_Source */ + +#if defined(STM32F413xx) || defined(STM32F423xx) + uint32_t Dfsdm2ClockSelection; /*!< Specifies DFSDM2 Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM2_Kernel_Clock_Source */ + + uint32_t Dfsdm2AudioClockSelection;/*!< Specifies DFSDM2 Audio Clock Selection. + This parameter can be a value of @ref RCCEx_DFSDM2_Audio_Clock_Source */ + + uint32_t Lptim1ClockSelection; /*!< Specifies LPTIM1 Clock Source Selection. + This parameter can be a value of @ref RCCEx_LPTIM1_Clock_Source */ + + uint32_t SaiAClockSelection; /*!< Specifies SAI1_A Clock Prescalers Selection + This parameter can be a value of @ref RCCEx_SAI1_BlockA_Clock_Source */ + + uint32_t SaiBClockSelection; /*!< Specifies SAI1_B Clock Prescalers Selection + This parameter can be a value of @ref RCCEx_SAI1_BlockB_Clock_Source */ +#endif /* STM32F413xx || STM32F423xx */ + + uint32_t PLLI2SSelection; /*!< Specifies PLL I2S Clock Source Selection. + This parameter can be a value of @ref RCCEx_PLL_I2S_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) + +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SQ; /*!< Specifies the division factor for SAI1 clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ +}RCC_PLLI2SInitTypeDef; + +/** + * @brief PLLSAI Clock structure definition + */ +typedef struct +{ + uint32_t PLLSAIN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432. + This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ +#if defined(STM32F469xx) || defined(STM32F479xx) + uint32_t PLLSAIP; /*!< Specifies division factor for OTG FS and SDIO clocks. + This parameter is only available in STM32F469xx/STM32F479xx devices. + This parameter must be a value of @ref RCCEx_PLLSAIP_Clock_Divider */ +#endif /* STM32F469xx || STM32F479xx */ + + uint32_t PLLSAIQ; /*!< Specifies the division factor for SAI1 clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 15. + This parameter will be used only when PLLSAI is selected as Clock Source SAI or LTDC */ + + uint32_t PLLSAIR; /*!< specifies the division factor for LTDC clock + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLSAI is selected as Clock Source LTDC */ + +}RCC_PLLSAIInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + RCC_PLLSAIInitTypeDef PLLSAI; /*!< PLL SAI structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source SAI or LTDC */ + + uint32_t PLLI2SDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLI2S is selected as Clock Source SAI */ + + uint32_t PLLSAIDivQ; /*!< Specifies the PLLI2S division factor for SAI1 clock. + This parameter must be a number between Min_Data = 1 and Max_Data = 32 + This parameter will be used only when PLLSAI is selected as Clock Source SAI */ + + uint32_t PLLSAIDivR; /*!< Specifies the PLLSAI division factor for LTDC clock. + This parameter must be one value of @ref RCCEx_PLLSAI_DIVR */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Prescalers Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +#if defined(STM32F469xx) || defined(STM32F479xx) + uint32_t Clk48ClockSelection; /*!< Specifies CLK48 Clock Selection this clock used OTG FS, SDIO and RNG clocks. + This parameter can be a value of @ref RCCEx_CLK48_Clock_Source */ + + uint32_t SdioClockSelection; /*!< Specifies SDIO Clock Source Selection. + This parameter can be a value of @ref RCCEx_SDIO_Clock_Source */ +#endif /* STM32F469xx || STM32F479xx */ +}RCC_PeriphCLKInitTypeDef; + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +/** + * @brief PLLI2S Clock structure definition + */ +typedef struct +{ +#if defined(STM32F411xE) + uint32_t PLLI2SM; /*!< PLLM: Division factor for PLLI2S VCO input clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 62 */ +#endif /* STM32F411xE */ + + uint32_t PLLI2SN; /*!< Specifies the multiplication factor for PLLI2S VCO output clock. + This parameter must be a number between Min_Data = 50 and Max_Data = 432 + Except for STM32F411xE devices where the Min_Data = 192. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t PLLI2SR; /*!< Specifies the division factor for I2S clock. + This parameter must be a number between Min_Data = 2 and Max_Data = 7. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + +}RCC_PLLI2SInitTypeDef; + +/** + * @brief RCC extended clocks structure definition + */ +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + RCC_PLLI2SInitTypeDef PLLI2S; /*!< PLL I2S structure parameters. + This parameter will be used only when PLLI2S is selected as Clock Source I2S or SAI */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection. + This parameter can be a value of @ref RCC_RTC_Clock_Source */ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) + uint8_t TIMPresSelection; /*!< Specifies TIM Clock Source Selection. + This parameter can be a value of @ref RCCEx_TIM_PRescaler_Selection */ +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Constants RCCEx Exported Constants + * @{ + */ + +/** @defgroup RCCEx_Periph_Clock_Selection RCC Periph Clock Selection + * @{ + */ +/* Peripheral Clock source for STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_TIM 0x00000004U +#define RCC_PERIPHCLK_RTC 0x00000008U +#define RCC_PERIPHCLK_FMPI2C1 0x00000010U +#define RCC_PERIPHCLK_CLK48 0x00000020U +#define RCC_PERIPHCLK_SDIO 0x00000040U +#define RCC_PERIPHCLK_PLLI2S 0x00000080U +#define RCC_PERIPHCLK_DFSDM1 0x00000100U +#define RCC_PERIPHCLK_DFSDM1_AUDIO 0x00000200U +#endif /* STM32F412Zx || STM32F412Vx) || STM32F412Rx || STM32F412Cx */ +#if defined(STM32F413xx) || defined(STM32F423xx) +#define RCC_PERIPHCLK_DFSDM2 0x00000400U +#define RCC_PERIPHCLK_DFSDM2_AUDIO 0x00000800U +#define RCC_PERIPHCLK_LPTIM1 0x00001000U +#define RCC_PERIPHCLK_SAIA 0x00002000U +#define RCC_PERIPHCLK_SAIB 0x00004000U +#endif /* STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- Peripheral Clock source for STM32F410xx ----------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_TIM 0x00000002U +#define RCC_PERIPHCLK_RTC 0x00000004U +#define RCC_PERIPHCLK_FMPI2C1 0x00000008U +#define RCC_PERIPHCLK_LPTIM1 0x00000010U +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- Peripheral Clock source for STM32F446xx ----------------*/ +#if defined(STM32F446xx) +#define RCC_PERIPHCLK_I2S_APB1 0x00000001U +#define RCC_PERIPHCLK_I2S_APB2 0x00000002U +#define RCC_PERIPHCLK_SAI1 0x00000004U +#define RCC_PERIPHCLK_SAI2 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_CEC 0x00000040U +#define RCC_PERIPHCLK_FMPI2C1 0x00000080U +#define RCC_PERIPHCLK_CLK48 0x00000100U +#define RCC_PERIPHCLK_SDIO 0x00000200U +#define RCC_PERIPHCLK_SPDIFRX 0x00000400U +#define RCC_PERIPHCLK_PLLI2S 0x00000800U +#endif /* STM32F446xx */ +/*-----------------------------------------------------------------------------*/ + +/*----------- Peripheral Clock source for STM32F469xx/STM32F479xx -------------*/ +#if defined(STM32F469xx) || defined(STM32F479xx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U +#define RCC_PERIPHCLK_CLK48 0x00000080U +#define RCC_PERIPHCLK_SDIO 0x00000100U +#endif /* STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*-------- Peripheral Clock source for STM32F42xxx/STM32F43xxx ---------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_SAI_PLLI2S 0x00000002U +#define RCC_PERIPHCLK_SAI_PLLSAI 0x00000004U +#define RCC_PERIPHCLK_LTDC 0x00000008U +#define RCC_PERIPHCLK_TIM 0x00000010U +#define RCC_PERIPHCLK_RTC 0x00000020U +#define RCC_PERIPHCLK_PLLI2S 0x00000040U +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +/*----------------------------------------------------------------------------*/ + +/*-------- Peripheral Clock source for STM32F40xxx/STM32F41xxx ---------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define RCC_PERIPHCLK_I2S 0x00000001U +#define RCC_PERIPHCLK_RTC 0x00000002U +#define RCC_PERIPHCLK_PLLI2S 0x00000004U +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F401xC || STM32F401xE || STM32F411xE */ +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define RCC_PERIPHCLK_TIM 0x00000008U +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ +/*----------------------------------------------------------------------------*/ +/** + * @} + */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) || \ + defined(STM32F479xx) +/** @defgroup RCCEx_I2S_Clock_Source I2S Clock Source + * @{ + */ +#define RCC_I2SCLKSOURCE_PLLI2S 0x00000000U +#define RCC_I2SCLKSOURCE_EXT 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) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_FMPI2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_FMPI2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CAN2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CAN3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DAC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DACEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART7EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_LPTIM1EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_RTCAPBEN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#define __HAL_RCC_FMPI2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_FMPI2C1EN)) +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN1EN)) +#define __HAL_RCC_CAN2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN2EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CAN3EN)) +#define __HAL_RCC_DAC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DACEN)) +#define __HAL_RCC_UART7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART7EN)) +#define __HAL_RCC_UART8_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART8EN)) +#endif /* STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Peripheral_Clock_Enable_Disable_Status APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) != RESET) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_TIM4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) != RESET) +#define __HAL_RCC_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) +#define __HAL_RCC_TIM12_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) != RESET) +#define __HAL_RCC_TIM13_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) != RESET) +#define __HAL_RCC_TIM14_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) != RESET) +#define __HAL_RCC_UART5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) != RESET) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN))!= RESET) +#define __HAL_RCC_CAN2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) != RESET) +#define __HAL_RCC_DAC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) != RESET) +#define __HAL_RCC_UART7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) != RESET) +#define __HAL_RCC_UART8_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_TIM4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM4EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#define __HAL_RCC_TIM12_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM12EN)) == RESET) +#define __HAL_RCC_TIM13_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM13EN)) == RESET) +#define __HAL_RCC_TIM14_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM14EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_LPTIM1EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_RTCAPBEN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART4EN)) == RESET) +#define __HAL_RCC_UART5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART5EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#define __HAL_RCC_FMPI2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_FMPI2C1EN)) == RESET) +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN1EN)) == RESET) +#define __HAL_RCC_CAN2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN2EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CAN3EN)) == RESET) +#define __HAL_RCC_DAC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DACEN)) == RESET) +#define __HAL_RCC_UART7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART7EN)) == RESET) +#define __HAL_RCC_UART8_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_UART8EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ +/** @defgroup RCCEx_APB2_Clock_Enable_Disable APB2 Peripheral Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART9EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_UART10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDIOEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_EXTIT_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_EXTITEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM10_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM10EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SAI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg = 0x00U; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_DFSDM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART9EN)) +#define __HAL_RCC_UART10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_UART10EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDIOEN)) +#define __HAL_RCC_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#define __HAL_RCC_EXTIT_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_EXTITEN)) +#define __HAL_RCC_TIM10_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM10EN)) +#define __HAL_RCC_SPI5_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI5EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SAI1EN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM1EN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_DFSDM2EN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Peripheral_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) != RESET) +#define __HAL_RCC_UART10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) != RESET) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) +#define __HAL_RCC_EXTIT_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) != RESET) +#define __HAL_RCC_TIM10_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) != RESET) +#define __HAL_RCC_SPI5_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) != RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) != RESET) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART9EN)) == RESET) +#define __HAL_RCC_UART10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_UART10EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDIOEN)) == RESET) +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#define __HAL_RCC_EXTIT_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_EXTITEN)) == RESET) +#define __HAL_RCC_TIM10_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM10EN)) == RESET) +#define __HAL_RCC_SPI5_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI5EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SAI1EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM1EN)) == RESET) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_DFSDM2EN)) == RESET) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_Force_Release_Reset AHB1 Force Release Reset + * @brief Force or release AHB1 peripheral reset. + * @{ + */ +#if defined(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)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_FMPI2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN2RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CAN3RST)) +#define __HAL_RCC_DAC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART8RST)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_TIM4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM4RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_LPTIM1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#define __HAL_RCC_FMPI2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_FMPI2C1RST)) +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN1RST)) +#define __HAL_RCC_CAN2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN2RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CAN3RST)) +#define __HAL_RCC_DAC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DACRST)) +#define __HAL_RCC_UART7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART7RST)) +#define __HAL_RCC_UART8_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART8RST)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART9RST)) +#define __HAL_RCC_UART10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_UART10RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI5RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SAI1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM1RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_DFSDM2RST)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART9RST)) +#define __HAL_RCC_UART10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_UART10RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDIORST)) +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#define __HAL_RCC_TIM10_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM10RST)) +#define __HAL_RCC_SPI5_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI5RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SAI1RST)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM1RST)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_DFSDM2RST)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB1_LowPower_Enable_Disable AHB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_GPIOD_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SRAM2_CLK_SLEEP_ENABLE() (RCC->AHB1LPENR |= (RCC_AHB1LPENR_SRAM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_GPIOD_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIODLPEN)) +#define __HAL_RCC_GPIOE_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOELPEN)) +#define __HAL_RCC_GPIOF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOFLPEN)) +#define __HAL_RCC_GPIOG_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_GPIOGLPEN)) +#define __HAL_RCC_CRC_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_CRCLPEN)) +#define __HAL_RCC_FLITF_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_FLITFLPEN)) +#define __HAL_RCC_SRAM1_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SRAM2_CLK_SLEEP_DISABLE() (RCC->AHB1LPENR &= ~(RCC_AHB1LPENR_SRAM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB2_LowPower_Enable_Disable AHB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wake-up from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#if defined(STM32F423xx) +#define __HAL_RCC_AES_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_AESLPEN)) +#define __HAL_RCC_AES_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_AESLPEN)) +#endif /* STM32F423xx */ + +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_OTGFSLPEN)) +#define __HAL_RCC_USB_OTG_FS_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_OTGFSLPEN)) + +#define __HAL_RCC_RNG_CLK_SLEEP_ENABLE() (RCC->AHB2LPENR |= (RCC_AHB2LPENR_RNGLPEN)) +#define __HAL_RCC_RNG_CLK_SLEEP_DISABLE() (RCC->AHB2LPENR &= ~(RCC_AHB2LPENR_RNGLPEN)) +/** + * @} + */ + +/** @defgroup RCCEx_AHB3_LowPower_Enable_Disable AHB3 Peripheral Low Power Enable Disable + * @brief Enable or disable the AHB3 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_FSMC_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_ENABLE() (RCC->AHB3LPENR |= (RCC_AHB3LPENR_QSPILPEN)) + +#define __HAL_RCC_FSMC_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_FSMCLPEN)) +#define __HAL_RCC_QSPI_CLK_SLEEP_DISABLE() (RCC->AHB3LPENR &= ~(RCC_AHB3LPENR_QSPILPEN)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F413xx || STM32F423xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_APB1_LowPower_Enable_Disable APB1 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB1 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_TIM14LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_LPTIM1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_USART3LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART5LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN2LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_CAN3LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_ENABLE() (RCC->APB1LPENR |= (RCC_APB1LPENR_UART8LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM2LPEN)) +#define __HAL_RCC_TIM3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM3LPEN)) +#define __HAL_RCC_TIM4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM4LPEN)) +#define __HAL_RCC_TIM6_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM6LPEN)) +#define __HAL_RCC_TIM7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM7LPEN)) +#define __HAL_RCC_TIM12_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM12LPEN)) +#define __HAL_RCC_TIM13_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM13LPEN)) +#define __HAL_RCC_TIM14_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_TIM14LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_LPTIM1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_LPTIM1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_RTCAPB_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_RTCAPBLPEN)) +#define __HAL_RCC_SPI3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_SPI3LPEN)) +#define __HAL_RCC_USART3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_USART3LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART4_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART4LPEN)) +#define __HAL_RCC_UART5_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART5LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_I2C3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_I2C3LPEN)) +#define __HAL_RCC_FMPI2C1_CLK_SLEEP_DISABLE()(RCC->APB1LPENR &= ~(RCC_APB1LPENR_FMPI2C1LPEN)) +#define __HAL_RCC_CAN1_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN1LPEN)) +#define __HAL_RCC_CAN2_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN2LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_CAN3_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_CAN3LPEN)) +#define __HAL_RCC_DAC_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_DACLPEN)) +#define __HAL_RCC_UART7_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART7LPEN)) +#define __HAL_RCC_UART8_CLK_SLEEP_DISABLE() (RCC->APB1LPENR &= ~(RCC_APB1LPENR_UART8LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_LowPower_Enable_Disable APB2 Peripheral Low Power Enable Disable + * @brief Enable or disable the APB2 peripheral clock during Low Power (Sleep) mode. + * @note Peripheral clock gating in SLEEP mode can be used to further reduce + * power consumption. + * @note After wakeup from SLEEP mode, the peripheral clock is enabled again. + * @note By default, all peripheral clocks are enabled during SLEEP mode. + * @{ + */ +#define __HAL_RCC_TIM8_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM8LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART9LPEN)) +#define __HAL_RCC_UART10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_UART10LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SPI5LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_SAI1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_SLEEP_ENABLE() (RCC->APB2LPENR |= (RCC_APB2LPENR_DFSDM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ + +#define __HAL_RCC_TIM8_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM8LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_UART9_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART9LPEN)) +#define __HAL_RCC_UART10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_UART10LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_SDIO_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SDIOLPEN)) +#define __HAL_RCC_SPI4_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI4LPEN)) +#define __HAL_RCC_EXTIT_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_EXTITLPEN)) +#define __HAL_RCC_TIM10_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_TIM10LPEN)) +#define __HAL_RCC_SPI5_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SPI5LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_SAI1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_SAI1LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +#define __HAL_RCC_DFSDM1_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM1LPEN)) +#if defined(STM32F413xx) || defined(STM32F423xx) +#define __HAL_RCC_DFSDM2_CLK_SLEEP_DISABLE() (RCC->APB2LPENR &= ~(RCC_APB2LPENR_DFSDM2LPEN)) +#endif /* STM32F413xx || STM32F423xx */ +/** + * @} + */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------- PLL Configuration --------------------------*/ +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the main PLL clock source, multiplication and division factors. + * @note This function must be used only when the main PLL is disabled. + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLN parameter correctly to ensure that the VCO + * output frequency is between 100 and 432 MHz. + * + * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note If the USB OTG FS is used in your application, you have to set the + * PLLQ parameter correctly to have 48 MHz clock for the USB. However, + * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work + * correctly. + * + * @param __PLLR__ PLL division factor for I2S, SAI, SYSTEM, SPDIFRX clocks. + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note This parameter is only available in STM32F446xx/STM32F469xx/STM32F479xx/ + STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/STM32F413xx/STM32F423xx devices. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__,__PLLR__) \ + (RCC->PLLCFGR = ((__RCC_PLLSource__) | (__PLLM__) | \ + ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ + ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ + ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos) | \ + ((__PLLR__) << RCC_PLLCFGR_PLLR_Pos))) +#else +/** @brief Macro to configure the main PLL clock source, multiplication and division factors. + * @note This function must be used only when the main PLL is disabled. + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLSOURCE_HSI: HSI oscillator clock selected as PLL clock entry + * @arg RCC_PLLSOURCE_HSE: HSE oscillator clock selected as PLL clock entry + * @note This clock source (RCC_PLLSource) is common for the main PLL and PLLI2S. + * @param __PLLM__ specifies the division factor for PLL VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLL jitter. + * @param __PLLN__ specifies the multiplication factor for PLL VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432 + * Except for STM32F411xE devices where Min_Data = 192. + * @note You have to set the PLLN parameter correctly to ensure that the VCO + * output frequency is between 100 and 432 MHz, Except for STM32F411xE devices + * where frequency is between 192 and 432 MHz. + * @param __PLLP__ specifies the division factor for main system clock (SYSCLK) + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLQ__ specifies the division factor for OTG FS, SDIO and RNG clocks + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note If the USB OTG FS is used in your application, you have to set the + * PLLQ parameter correctly to have 48 MHz clock for the USB. However, + * the SDIO and RNG need a frequency lower than or equal to 48 MHz to work + * correctly. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__, __PLLM__, __PLLN__, __PLLP__, __PLLQ__) \ + (RCC->PLLCFGR = (0x20000000U | (__RCC_PLLSource__) | (__PLLM__)| \ + ((__PLLN__) << RCC_PLLCFGR_PLLN_Pos) | \ + ((((__PLLP__) >> 1U) -1U) << RCC_PLLCFGR_PLLP_Pos) | \ + ((__PLLQ__) << RCC_PLLCFGR_PLLQ_Pos))) + #endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +/*----------------------------------------------------------------------------*/ + +/*----------------------------PLLI2S Configuration ---------------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) + +/** @brief Macros to enable or disable the PLLI2S. + * @note The PLLI2S is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLI2S_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = ENABLE) +#define __HAL_RCC_PLLI2S_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLI2SON_BB = DISABLE) + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx */ +#if defined(STM32F446xx) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SP__ specifies division factor for SPDIFRX Clock. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * @note the PLLI2SP parameter is only available with STM32F446xx Devices + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + * @param __PLLI2SQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SP__, __PLLI2SQ__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((((__PLLI2SP__) >> 1U) -1U) << RCC_PLLI2SCFGR_PLLI2SP_Pos) |\ + ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#elif defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + * @param __PLLI2SQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SQ__) << RCC_PLLI2SCFGR_PLLI2SQ_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#else +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + * + */ +#define __HAL_RCC_PLLI2S_CONFIG(__PLLI2SN__, __PLLI2SR__) \ + (RCC->PLLI2SCFGR = (((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#endif /* STM32F446xx */ + +#if defined(STM32F411xE) +/** @brief Macro to configure the PLLI2S clock multiplication and division factors . + * @note This macro must be used only when the PLLI2S is disabled. + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API). + * @param __PLLI2SM__ specifies the division factor for PLLI2S VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note The PLLI2SM parameter is only used with STM32F411xE/STM32F410xx Devices + * @note You have to set the PLLI2SM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 2 MHz to limit PLLI2S jitter. + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock + * This parameter must be a number between Min_Data = 192 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 192 and Max_Data = 432 MHz. + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + */ +#define __HAL_RCC_PLLI2S_I2SCLK_CONFIG(__PLLI2SM__, __PLLI2SN__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SM__) |\ + ((__PLLI2SN__) << RCC_PLLI2SCFGR_PLLI2SN_Pos) |\ + ((__PLLI2SR__) << RCC_PLLI2SCFGR_PLLI2SR_Pos))) +#endif /* STM32F411xE */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro used by the SAI HAL driver to configure the PLLI2S clock multiplication and division factors. + * @note This macro must be used only when the PLLI2S is disabled. + * @note PLLI2S clock source is common with the main PLL (configured in + * HAL_RCC_ClockConfig() API) + * @param __PLLI2SN__ specifies the multiplication factor for PLLI2S VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLI2SN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * @param __PLLI2SQ__ specifies the division factor for SAI1 clock. + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * @note the PLLI2SQ parameter is only available with STM32F427xx/437xx/429xx/439xx/469xx/479xx + * Devices and can be configured using the __HAL_RCC_PLLI2S_PLLSAICLK_CONFIG() macro + * @param __PLLI2SR__ specifies the division factor for I2S clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note You have to set the PLLI2SR parameter correctly to not exceed 192 MHz + * on the I2S clock frequency. + */ +#define __HAL_RCC_PLLI2S_SAICLK_CONFIG(__PLLI2SN__, __PLLI2SQ__, __PLLI2SR__) (RCC->PLLI2SCFGR = ((__PLLI2SN__) << 6U) |\ + ((__PLLI2SQ__) << 24U) |\ + ((__PLLI2SR__) << 28U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------------ PLLSAI Configuration ------------------------*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macros to Enable or Disable the PLLISAI. + * @note The PLLSAI is only available with STM32F429x/439x Devices. + * @note The PLLSAI is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLLSAI_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = ENABLE) +#define __HAL_RCC_PLLSAI_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLSAION_BB = DISABLE) + +#if defined(STM32F446xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIM__ specifies the division factor for PLLSAI VCO input clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 63. + * @note You have to set the PLLSAIM parameter correctly to ensure that the VCO input + * frequency ranges from 1 to 2 MHz. It is recommended to select a frequency + * of 1 MHz to limit PLLI2S jitter. + * @note The PLLSAIM parameter is only used with STM32F446xx Devices + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIP__ specifies division factor for OTG FS, SDIO and RNG clocks. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * @note the PLLSAIP parameter is only available with STM32F446xx Devices + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIM__, __PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = ((__PLLSAIM__) | \ + ((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ + ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) | \ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos))) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIP__ specifies division factor for SDIO and CLK48 clocks. + * This parameter must be a number in the range {2, 4, 6, or 8}. + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIP__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) |\ + ((((__PLLSAIP__) >> 1U) -1U) << RCC_PLLSAICFGR_PLLSAIP_Pos) |\ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) |\ + ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) +/** @brief Macro to configure the PLLSAI clock multiplication and division factors. + * + * @param __PLLSAIN__ specifies the multiplication factor for PLLSAI VCO output clock. + * This parameter must be a number between Min_Data = 50 and Max_Data = 432. + * @note You have to set the PLLSAIN parameter correctly to ensure that the VCO + * output frequency is between Min_Data = 100 and Max_Data = 432 MHz. + * + * @param __PLLSAIQ__ specifies the division factor for SAI clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 15. + * + * @param __PLLSAIR__ specifies the division factor for LTDC clock + * This parameter must be a number between Min_Data = 2 and Max_Data = 7. + * @note the PLLI2SR parameter is only available with STM32F427/437/429/439xx Devices + */ +#define __HAL_RCC_PLLSAI_CONFIG(__PLLSAIN__, __PLLSAIQ__, __PLLSAIR__) \ + (RCC->PLLSAICFGR = (((__PLLSAIN__) << RCC_PLLSAICFGR_PLLSAIN_Pos) | \ + ((__PLLSAIQ__) << RCC_PLLSAICFGR_PLLSAIQ_Pos) | \ + ((__PLLSAIR__) << RCC_PLLSAICFGR_PLLSAIR_Pos))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------- PLLSAI/PLLI2S Dividers Configuration -------------------*/ +#if defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. + * @note This function must be called before enabling the PLLI2S. + * @param __PLLI2SDivR__ specifies the PLLI2S division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLI2SR) / __PLLI2SDivR__ + */ +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVR_CONFIG(__PLLI2SDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, (__PLLI2SDivR__)-1U)) + +/** @brief Macro to configure the SAI clock Divider coming from PLL. + * @param __PLLDivR__ specifies the PLL division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLR) / __PLLDivR__ + */ +#define __HAL_RCC_PLL_PLLSAICLKDIVR_CONFIG(__PLLDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, ((__PLLDivR__)-1U)<<8U)) +#endif /* STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the SAI clock Divider coming from PLLI2S. + * @note This function must be called before enabling the PLLI2S. + * @param __PLLI2SDivQ__ specifies the PLLI2S division factor for SAI1 clock. + * This parameter must be a number between 1 and 32. + * SAI1 clock frequency = f(PLLI2SQ) / __PLLI2SDivQ__ + */ +#define __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(__PLLI2SDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, (__PLLI2SDivQ__)-1U)) + +/** @brief Macro to configure the SAI clock Divider coming from PLLSAI. + * @note This function must be called before enabling the PLLSAI. + * @param __PLLSAIDivQ__ specifies the PLLSAI division factor for SAI1 clock . + * This parameter must be a number between Min_Data = 1 and Max_Data = 32. + * SAI1 clock frequency = f(PLLSAIQ) / __PLLSAIDivQ__ + */ +#define __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(__PLLSAIDivQ__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, ((__PLLSAIDivQ__)-1U)<<8U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Macro to configure the LTDC clock Divider coming from PLLSAI. + * + * @note The LTDC peripheral is only available with STM32F427/437/429/439/469/479xx Devices. + * @note This function must be called before enabling the PLLSAI. + * @param __PLLSAIDivR__ specifies the PLLSAI division factor for LTDC clock . + * This parameter must be a number between Min_Data = 2 and Max_Data = 16. + * LTDC clock frequency = f(PLLSAIR) / __PLLSAIDivR__ + */ +#define __HAL_RCC_PLLSAI_PLLSAICLKDIVR_CONFIG(__PLLSAIDivR__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, (__PLLSAIDivR__))) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +/*----------------------------------------------------------------------------*/ + +/*------------------------- Peripheral Clock selection -----------------------*/ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) ||\ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F469xx) ||\ + defined(STM32F479xx) +/** @brief Macro to configure the I2S clock source (I2SCLK). + * @note This function must be called before enabling the I2S APB clock. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SCLKSOURCE_PLLI2S: PLLI2S clock used as I2S clock source. + * @arg RCC_I2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin + * used as I2S clock source. + */ +#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (*(__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 kernel clock. + * @retval None + */ +#define __HAL_RCC_DFSDM1_CONFIG(__DFSDM1_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM1_CLKSOURCE__)) + +/** @brief Macro to get the DFSDM1 clock source. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM1CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM1CLKSOURCE_SYSCLK: System clock used as kernel clock. + */ +#define __HAL_RCC_GET_DFSDM1_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) + +/** @brief Macro to configure DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ + STM32F413xx/STM32F423xx Devices. + * @param __SOURCE__ specifies the DFSDM1 Audio clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_DFSDM1AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL, (__SOURCE__))) + +/** @brief Macro to Get DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx/ + STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM1AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_GET_DFSDM1AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1ASEL)) + +#if defined(STM32F413xx) || defined(STM32F423xx) + /** @brief Macro to configure the DFSDM2 clock. + * @param __DFSDM2_CLKSOURCE__ specifies the DFSDM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. + * @retval None + */ +#define __HAL_RCC_DFSDM2_CONFIG(__DFSDM2_CLKSOURCE__) MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, (__DFSDM2_CLKSOURCE__)) + +/** @brief Macro to get the DFSDM2 clock source. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM2CLKSOURCE_PCLK2: PCLK2 clock used as kernel clock. + * @arg RCC_DFSDM2CLKSOURCE_SYSCLK: System clock used as kernel clock. + */ +#define __HAL_RCC_GET_DFSDM2_SOURCE() ((uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL))) + +/** @brief Macro to configure DFSDM1 Audio clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @param __SOURCE__ specifies the DFSDM2 Audio clock source. + * This parameter can be one of the following values: + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_DFSDM2AUDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL, (__SOURCE__))) + +/** @brief Macro to Get DFSDM2 Audio clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S1: CK_I2S_PCLK1 selected as audio clock + * @arg RCC_DFSDM2AUDIOCLKSOURCE_I2S2: CK_I2S_PCLK2 selected as audio clock + */ +#define __HAL_RCC_GET_DFSDM2AUDIO_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM2ASEL)) + +/** @brief Macro to configure SAI1BlockA clock source selection. + * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block A clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_SAI_BLOCKACLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 BlockA clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAIACLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_EXT: External clock mapped on the I2S_CKIN pinused as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIACLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_SAI_BLOCKA_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1ASRC)) + +/** @brief Macro to configure SAI1 BlockB clock source selection. + * @note The SAI peripheral is only available with STM32F413xx/STM32F423xx Devices. + * @note This function must be called before enabling PLLSAI, PLLI2S and + * the SAI clock. + * @param __SOURCE__ specifies the SAI Block B clock source. + * This parameter can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_SAI_BLOCKBCLKSOURCE_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC, (__SOURCE__))) + +/** @brief Macro to Get SAI1 BlockB clock source selection. + * @note This configuration is only available with STM32F413xx/STM32F423xx Devices. + * @retval The clock source can be one of the following values: + * @arg RCC_SAIBCLKSOURCE_PLLI2SR: PLLI2S_R clock divided (R2) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLR: PLL_R clock divided (R1) used as SAI1 Block A clock. + * @arg RCC_SAIBCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_SAI_BLOCKB_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_SAI1BSRC)) + +/** @brief Macro to configure the LPTIM1 clock. + * @param __SOURCE__ specifies the LPTIM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the LPTIM1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) +#endif /* STM32F413xx || STM32F423xx */ + +/** @brief Macro to configure I2S APB1 clock source selection. + * @param __SOURCE__ specifies the I2S APB1 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB1 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB1CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB1CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB1CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB1CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB1_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S1SRC)) + +/** @brief Macro to configure I2S APB2 clock source selection. + * @param __SOURCE__ specifies the I2S APB2 clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_I2S_APB2_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC, (__SOURCE__))) + +/** @brief Macro to Get I2S APB2 clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPB2CLKSOURCE_PLLI2S: PLLI2S VCO output clock divided by PLLI2SR. + * @arg RCC_I2SAPB2CLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPB2CLKSOURCE_PLLR: PLL VCO Output divided by PLLR. + * @arg RCC_I2SAPB2CLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + */ +#define __HAL_RCC_GET_I2S_APB2_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2S2SRC)) + +/** @brief Macro to configure the PLL I2S clock source (PLLI2SCLK). + * @note This macro must be called before enabling the I2S APB clock. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_PLLI2SCLKSOURCE_PLLSRC: HSI or HSE depending from PLL source Clock. + * @arg RCC_PLLI2SCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin + * used as I2S clock source. + */ +#define __HAL_RCC_PLL_I2S_CONFIG(__SOURCE__) (*(__IO uint32_t *) RCC_PLLI2SCFGR_PLLI2SSRC_BB = (__SOURCE__)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the CLK48 clock. + * @param __SOURCE__ specifies the CLK48 clock source. + * This parameter can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock. + */ +#define __HAL_RCC_CLK48_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the CLK48 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_CLK48CLKSOURCE_PLLQ: PLL VCO Output divided by PLLQ used as CLK48 clock. + * @arg RCC_CLK48CLKSOURCE_PLLI2SQ: PLLI2S VCO Output divided by PLLI2SQ used as CLK48 clock + */ +#define __HAL_RCC_GET_CLK48_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL)) + +/** @brief Macro to configure the SDIO clock. + * @param __SOURCE__ specifies the SDIO clock source. + * This parameter can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_SDIO_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the SDIO clock. + * @retval The clock source can be one of the following values: + * @arg RCC_SDIOCLKSOURCE_CLK48: CLK48 output used as SDIO clock. + * @arg RCC_SDIOCLKSOURCE_SYSCLK: System clock output used as SDIO clock. + */ +#define __HAL_RCC_GET_SDIO_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL)) + +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @brief Macro to configure I2S clock source selection. + * @param __SOURCE__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. + * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. + */ +#define __HAL_RCC_I2S_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC, (__SOURCE__))) + +/** @brief Macro to Get I2S clock source selection. + * @retval The clock source can be one of the following values: + * @arg RCC_I2SAPBCLKSOURCE_PLLR: PLL VCO output clock divided by PLLR. + * @arg RCC_I2SAPBCLKSOURCE_EXT: External clock mapped on the I2S_CKIN pin. + * @arg RCC_I2SAPBCLKSOURCE_PLLSRC: HSI/HSE depends on PLLSRC. + */ +#define __HAL_RCC_GET_I2S_SOURCE() (READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_I2SSRC)) + +/** @brief Macro to configure the FMPI2C1 clock. + * @param __SOURCE__ specifies the FMPI2C1 clock source. + * This parameter can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_FMPI2C1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the FMPI2C1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_FMPI2C1CLKSOURCE_PCLK1: PCLK1 selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_SYSCLK: SYS clock selected as FMPI2C1 clock + * @arg RCC_FMPI2C1CLKSOURCE_HSI: HSI selected as FMPI2C1 clock + */ +#define __HAL_RCC_GET_FMPI2C1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL)) + +/** @brief Macro to configure the LPTIM1 clock. + * @param __SOURCE__ specifies the LPTIM1 clock source. + * This parameter can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_LPTIM1_CONFIG(__SOURCE__) (MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, (uint32_t)(__SOURCE__))) + +/** @brief Macro to Get the LPTIM1 clock. + * @retval The clock source can be one of the following values: + * @arg RCC_LPTIM1CLKSOURCE_PCLK1: PCLK1 selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_HSI: HSI clock selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSI: LSI selected as LPTIM1 clock + * @arg RCC_LPTIM1CLKSOURCE_LSE: LSE selected as LPTIM1 clock + */ +#define __HAL_RCC_GET_LPTIM1_SOURCE() (READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) ||\ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** @brief Macro to configure the Timers clocks prescalers + * @note This feature is only available with STM32F429x/439x Devices. + * @param __PRESC__ specifies the Timers clocks prescalers selection + * This parameter can be one of the following values: + * @arg RCC_TIMPRES_DESACTIVATED: The Timers kernels clocks prescaler is + * equal to HPRE if PPREx is corresponding to division by 1 or 2, + * else it is equal to [(HPRE * PPREx) / 2] if PPREx is corresponding to + * division by 4 or more. + * @arg RCC_TIMPRES_ACTIVATED: The Timers kernels clocks prescaler is + * equal to HPRE if PPREx is corresponding to division by 1, 2 or 4, + * else it is equal to [(HPRE * PPREx) / 4] if PPREx is corresponding + * to division by 8 or more. + */ +#define __HAL_RCC_TIMCLKPRESCALER(__PRESC__) (*(__IO uint32_t *) RCC_DCKCFGR_TIMPRE_BB = (__PRESC__)) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx) || STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE ||\ + STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx ||\ + STM32F423xx */ + +/*----------------------------------------------------------------------------*/ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** @brief Enable PLLSAI_RDY interrupt. + */ +#define __HAL_RCC_PLLSAI_ENABLE_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYIE)) + +/** @brief Disable PLLSAI_RDY interrupt. + */ +#define __HAL_RCC_PLLSAI_DISABLE_IT() (RCC->CIR &= ~(RCC_CIR_PLLSAIRDYIE)) + +/** @brief Clear the PLLSAI RDY interrupt pending bits. + */ +#define __HAL_RCC_PLLSAI_CLEAR_IT() (RCC->CIR |= (RCC_CIR_PLLSAIRDYF)) + +/** @brief Check the PLLSAI RDY interrupt has occurred or not. + * @retval The new state (TRUE or FALSE). + */ +#define __HAL_RCC_PLLSAI_GET_IT() ((RCC->CIR & (RCC_CIR_PLLSAIRDYIE)) == (RCC_CIR_PLLSAIRDYIE)) + +/** @brief Check PLLSAI RDY flag is set or not. + * @retval The new state (TRUE or FALSE). + */ +#define __HAL_RCC_PLLSAI_GET_FLAG() ((RCC->CR & (RCC_CR_PLLSAIRDY)) == (RCC_CR_PLLSAIRDY)) + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/** @brief Macros to enable or disable the RCC MCO1 feature. + */ +#define __HAL_RCC_MCO1_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = ENABLE) +#define __HAL_RCC_MCO1_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO1EN_BB = DISABLE) + +/** @brief Macros to enable or disable the RCC MCO2 feature. + */ +#define __HAL_RCC_MCO2_ENABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = ENABLE) +#define __HAL_RCC_MCO2_DISABLE() (*(__IO uint32_t *) RCC_CFGR_MCO2EN_BB = DISABLE) + +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RCCEx_Exported_Functions + * @{ + */ + +/** @addtogroup RCCEx_Exported_Functions_Group1 + * @{ + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit); + +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk); + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) ||\ + defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +void HAL_RCCEx_SelectLSEMode(uint8_t Mode); +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ +#if defined(RCC_PLLI2S_SUPPORT) +HAL_StatusTypeDef HAL_RCCEx_EnablePLLI2S(RCC_PLLI2SInitTypeDef *PLLI2SInit); +HAL_StatusTypeDef HAL_RCCEx_DisablePLLI2S(void); +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +HAL_StatusTypeDef HAL_RCCEx_EnablePLLSAI(RCC_PLLSAIInitTypeDef *PLLSAIInit); +HAL_StatusTypeDef HAL_RCCEx_DisablePLLSAI(void); +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Constants RCCEx Private Constants + * @{ + */ + +/** @defgroup RCCEx_BitAddress_AliasRegion RCC BitAddress AliasRegion + * @brief RCC registers bit address in the alias region + * @{ + */ +/* --- CR Register ---*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* Alias word address of PLLSAION bit */ +#define RCC_PLLSAION_BIT_NUMBER 0x1CU +#define RCC_CR_PLLSAION_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLSAION_BIT_NUMBER * 4U)) + +#define PLLSAI_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/* Alias word address of PLLI2SON bit */ +#define RCC_PLLI2SON_BIT_NUMBER 0x1AU +#define RCC_CR_PLLI2SON_BB (PERIPH_BB_BASE + (RCC_CR_OFFSET * 32U) + (RCC_PLLI2SON_BIT_NUMBER * 4U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || + STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/* --- DCKCFGR Register ---*/ +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F401xC) ||\ + defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) ||\ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) ||\ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/* Alias word address of TIMPRE bit */ +#define RCC_DCKCFGR_OFFSET (RCC_OFFSET + 0x8CU) +#define RCC_TIMPRE_BIT_NUMBER 0x18U +#define RCC_DCKCFGR_TIMPRE_BB (PERIPH_BB_BASE + (RCC_DCKCFGR_OFFSET * 32U) + (RCC_TIMPRE_BIT_NUMBER * 4U)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F410xx || STM32F401xC ||\ + STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx ||\ + STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +/* --- CFGR Register ---*/ +#define RCC_CFGR_OFFSET (RCC_OFFSET + 0x08U) +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) +/* Alias word address of I2SSRC bit */ +#define RCC_I2SSRC_BIT_NUMBER 0x17U +#define RCC_CFGR_I2SSRC_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_I2SSRC_BIT_NUMBER * 4U)) + +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/* --- PLLI2SCFGR Register ---*/ +#define RCC_PLLI2SCFGR_OFFSET (RCC_OFFSET + 0x84U) +/* Alias word address of PLLI2SSRC bit */ +#define RCC_PLLI2SSRC_BIT_NUMBER 0x16U +#define RCC_PLLI2SCFGR_PLLI2SSRC_BB (PERIPH_BB_BASE + (RCC_PLLI2SCFGR_OFFSET * 32U) + (RCC_PLLI2SSRC_BIT_NUMBER * 4U)) + +#define PLLI2S_TIMEOUT_VALUE 2U /* Timeout value fixed to 2 ms */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx | STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +/* Alias word address of MCO1EN bit */ +#define RCC_MCO1EN_BIT_NUMBER 0x8U +#define RCC_CFGR_MCO1EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO1EN_BIT_NUMBER * 4U)) + +/* Alias word address of MCO2EN bit */ +#define RCC_MCO2EN_BIT_NUMBER 0x9U +#define RCC_CFGR_MCO2EN_BB (PERIPH_BB_BASE + (RCC_CFGR_OFFSET * 32U) + (RCC_MCO2EN_BIT_NUMBER * 4U)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#define PLL_TIMEOUT_VALUE 2U /* 2 ms */ +/** + * @} + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Macros RCCEx Private Macros + * @{ + */ +/** @defgroup RCCEx_IS_RCC_Definitions RCC Private macros to check input parameters + * @{ + */ +#define IS_RCC_PLLN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) +#define IS_RCC_PLLI2SN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000007FU)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000007U)) +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000000FU)) +#endif /* STM32F401xC || STM32F401xE || STM32F411xE */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x0000001FU)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F446xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00000FFFU)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000001FFU)) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x000003FFU)) +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((1U <= (SELECTION)) && ((SELECTION) <= 0x00007FFFU)) +#endif /* STM32F413xx || STM32F423xx */ + +#define IS_RCC_PLLI2SR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLSAIN_VALUE(VALUE) ((50U <= (VALUE)) && ((VALUE) <= 432U)) + +#define IS_RCC_PLLSAIQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLSAIR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLSAI_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLI2S_DIVQ_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLSAI_DIVR_VALUE(VALUE) (((VALUE) == RCC_PLLSAIDIVR_2) ||\ + ((VALUE) == RCC_PLLSAIDIVR_4) ||\ + ((VALUE) == RCC_PLLSAIDIVR_8) ||\ + ((VALUE) == RCC_PLLSAIDIVR_16)) +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PLLI2SM_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 63U)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) +#endif /* STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) + +#define IS_RCC_I2SAPBCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPBCLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPBCLKSOURCE_PLLSRC)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ + +#if defined(STM32F446xx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLI2SP_VALUE(VALUE) (((VALUE) == RCC_PLLI2SP_DIV2) ||\ + ((VALUE) == RCC_PLLI2SP_DIV4) ||\ + ((VALUE) == RCC_PLLI2SP_DIV6) ||\ + ((VALUE) == RCC_PLLI2SP_DIV8)) + +#define IS_RCC_PLLSAIM_VALUE(VALUE) ((VALUE) <= 63U) + +#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ + ((VALUE) == RCC_PLLSAIP_DIV4) ||\ + ((VALUE) == RCC_PLLSAIP_DIV6) ||\ + ((VALUE) == RCC_PLLSAIP_DIV8)) + +#define IS_RCC_SAI1CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI1CLKSOURCE_PLLSAI) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAI1CLKSOURCE_EXT)) + +#define IS_RCC_SAI2CLKSOURCE(SOURCE) (((SOURCE) == RCC_SAI2CLKSOURCE_PLLSAI) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAI2CLKSOURCE_PLLSRC)) + +#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) + + #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_CECCLKSOURCE_LSE)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_SPDIFRXCLKSOURCE(SOURCE) (((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) +#endif /* STM32F446xx */ + +#if defined(STM32F469xx) || defined(STM32F479xx) +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLSAIP_VALUE(VALUE) (((VALUE) == RCC_PLLSAIP_DIV2) ||\ + ((VALUE) == RCC_PLLSAIP_DIV4) ||\ + ((VALUE) == RCC_PLLSAIP_DIV6) ||\ + ((VALUE) == RCC_PLLSAIP_DIV8)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLSAIP)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_DSIBYTELANECLKSOURCE(SOURCE) (((SOURCE) == RCC_DSICLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_DSICLKSOURCE_DSIPHY)) + +#define IS_RCC_LSE_MODE(MODE) (((MODE) == RCC_LSE_LOWPOWER_MODE) ||\ + ((MODE) == RCC_LSE_HIGHDRIVE_MODE)) +#endif /* STM32F469xx || STM32F479xx */ + +#if defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_PLLI2SQ_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 15U)) + +#define IS_RCC_PLLR_VALUE(VALUE) ((2U <= (VALUE)) && ((VALUE) <= 7U)) + +#define IS_RCC_PLLI2SCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLI2SCLKSOURCE_PLLSRC) || \ + ((__SOURCE__) == RCC_PLLI2SCLKSOURCE_EXT)) + +#define IS_RCC_I2SAPB1CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB1CLKSOURCE_PLLSRC)) + + #define IS_RCC_I2SAPB2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLI2S) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_I2SAPB2CLKSOURCE_PLLSRC)) + +#define IS_RCC_FMPI2C1CLKSOURCE(SOURCE) (((SOURCE) == RCC_FMPI2C1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_SYSCLK) ||\ + ((SOURCE) == RCC_FMPI2C1CLKSOURCE_HSI)) + +#define IS_RCC_CLK48CLKSOURCE(SOURCE) (((SOURCE) == RCC_CLK48CLKSOURCE_PLLQ) ||\ + ((SOURCE) == RCC_CLK48CLKSOURCE_PLLI2SQ)) + +#define IS_RCC_SDIOCLKSOURCE(SOURCE) (((SOURCE) == RCC_SDIOCLKSOURCE_CLK48) ||\ + ((SOURCE) == RCC_SDIOCLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1CLKSOURCE_PCLK2) || \ + ((__SOURCE__) == RCC_DFSDM1CLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM1AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM1AUDIOCLKSOURCE_I2S2)) + +#if defined(STM32F413xx) || defined(STM32F423xx) +#define IS_RCC_DFSDM2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2CLKSOURCE_PCLK2) || \ + ((__SOURCE__) == RCC_DFSDM2CLKSOURCE_SYSCLK)) + +#define IS_RCC_DFSDM2AUDIOCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S1) || \ + ((__SOURCE__) == RCC_DFSDM2AUDIOCLKSOURCE_I2S2)) + +#define IS_RCC_LPTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_LPTIM1CLKSOURCE_PCLK1) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_HSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSI) ||\ + ((SOURCE) == RCC_LPTIM1CLKSOURCE_LSE)) + +#define IS_RCC_SAIACLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIACLKSOURCE_PLLI2SR) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAIACLKSOURCE_PLLSRC)) + +#define IS_RCC_SAIBCLKSOURCE(SOURCE) (((SOURCE) == RCC_SAIBCLKSOURCE_PLLI2SR) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_EXT) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_PLLR) ||\ + ((SOURCE) == RCC_SAIBCLKSOURCE_PLLSRC)) + +#define IS_RCC_PLL_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#define IS_RCC_PLLI2S_DIVR_VALUE(VALUE) ((1U <= (VALUE)) && ((VALUE) <= 32U)) + +#endif /* STM32F413xx || STM32F423xx */ +#endif /* STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) || \ + defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F411xE) || defined(STM32F446xx) || \ + defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F413xx) || defined(STM32F423xx) + +#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_PLLI2SCLK)|| \ + ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) + +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || + STM32F401xC || STM32F401xE || STM32F411xE || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || \ + STM32F412Rx */ + +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) +#define IS_RCC_MCO2SOURCE(SOURCE) (((SOURCE) == RCC_MCO2SOURCE_SYSCLK) || ((SOURCE) == RCC_MCO2SOURCE_I2SCLK)|| \ + ((SOURCE) == RCC_MCO2SOURCE_HSE) || ((SOURCE) == RCC_MCO2SOURCE_PLLCLK)) +#endif /* STM32F410Tx || STM32F410Cx || STM32F410Rx */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_RCC_EX_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h new file mode 100644 index 0000000..8c81414 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h @@ -0,0 +1,2146 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim.h + * @author MCD Application Team + * @brief Header file of TIM HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_TIM_H +#define STM32F4xx_HAL_TIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup TIM + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup TIM_Exported_Types TIM Exported Types + * @{ + */ + +/** + * @brief TIM Time base Configuration Structure definition + */ +typedef struct +{ + uint32_t Prescaler; /*!< Specifies the prescaler value used to divide the TIM clock. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t CounterMode; /*!< Specifies the counter mode. + This parameter can be a value of @ref TIM_Counter_Mode */ + + uint32_t Period; /*!< Specifies the period value to be loaded into the active + Auto-Reload Register at the next update event. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF. */ + + uint32_t ClockDivision; /*!< Specifies the clock division. + This parameter can be a value of @ref TIM_ClockDivision */ + + uint32_t RepetitionCounter; /*!< Specifies the repetition counter value. Each time the RCR downcounter + reaches zero, an update event is generated and counting restarts + from the RCR value (N). + This means in PWM mode that (N+1) corresponds to: + - the number of PWM periods in edge-aligned mode + - the number of half PWM period in center-aligned mode + GP timers: this parameter must be a number between Min_Data = 0x00 and + Max_Data = 0xFF. + Advanced timers: this parameter must be a number between Min_Data = 0x0000 and + Max_Data = 0xFFFF. */ + + uint32_t AutoReloadPreload; /*!< Specifies the auto-reload preload. + This parameter can be a value of @ref TIM_AutoReloadPreload */ +} TIM_Base_InitTypeDef; + +/** + * @brief TIM Output Compare Configuration Structure definition + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCFastMode; /*!< Specifies the Fast mode state. + This parameter can be a value of @ref TIM_Output_Fast_State + @note This parameter is valid only in PWM1 and PWM2 mode. */ + + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ +} TIM_OC_InitTypeDef; + +/** + * @brief TIM One Pulse Mode Configuration Structure definition + */ +typedef struct +{ + uint32_t OCMode; /*!< Specifies the TIM mode. + This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */ + + uint32_t Pulse; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ + + uint32_t OCPolarity; /*!< Specifies the output polarity. + This parameter can be a value of @ref TIM_Output_Compare_Polarity */ + + uint32_t OCNPolarity; /*!< Specifies the complementary output polarity. + This parameter can be a value of @ref TIM_Output_Compare_N_Polarity + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t OCNIdleState; /*!< Specifies the TIM Output Compare pin state during Idle state. + This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State + @note This parameter is valid only for timer instances supporting break feature. */ + + uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_OnePulse_InitTypeDef; + +/** + * @brief TIM Input Capture Configuration Structure definition + */ +typedef struct +{ + uint32_t ICPolarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t ICSelection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t ICPrescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t ICFilter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_IC_InitTypeDef; + +/** + * @brief TIM Encoder Configuration Structure definition + */ +typedef struct +{ + uint32_t EncoderMode; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Mode */ + + uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ + + uint32_t IC1Selection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC1Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ + + uint32_t IC2Selection; /*!< Specifies the input. + This parameter can be a value of @ref TIM_Input_Capture_Selection */ + + uint32_t IC2Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC2Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_Encoder_InitTypeDef; + +/** + * @brief Clock Configuration Handle Structure definition + */ +typedef struct +{ + uint32_t ClockSource; /*!< TIM clock sources + This parameter can be a value of @ref TIM_Clock_Source */ + uint32_t ClockPolarity; /*!< TIM clock polarity + This parameter can be a value of @ref TIM_Clock_Polarity */ + uint32_t ClockPrescaler; /*!< TIM clock prescaler + This parameter can be a value of @ref TIM_Clock_Prescaler */ + uint32_t ClockFilter; /*!< TIM clock filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_ClockConfigTypeDef; + +/** + * @brief TIM Clear Input Configuration Handle Structure definition + */ +typedef struct +{ + uint32_t ClearInputState; /*!< TIM clear Input state + This parameter can be ENABLE or DISABLE */ + uint32_t ClearInputSource; /*!< TIM clear Input sources + This parameter can be a value of @ref TIM_ClearInput_Source */ + uint32_t ClearInputPolarity; /*!< TIM Clear Input polarity + This parameter can be a value of @ref TIM_ClearInput_Polarity */ + uint32_t ClearInputPrescaler; /*!< TIM Clear Input prescaler + This parameter must be 0: When OCRef clear feature is used with ETR source, + ETR prescaler must be off */ + uint32_t ClearInputFilter; /*!< TIM Clear Input filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ +} TIM_ClearInputConfigTypeDef; + +/** + * @brief TIM Master configuration Structure definition + */ +typedef struct +{ + uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection + This parameter can be a value of @ref TIM_Master_Mode_Selection */ + uint32_t MasterSlaveMode; /*!< Master/slave mode selection + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ +} TIM_MasterConfigTypeDef; + +/** + * @brief TIM Slave configuration Structure definition + */ +typedef struct +{ + uint32_t SlaveMode; /*!< Slave mode selection + This parameter can be a value of @ref TIM_Slave_Mode */ + uint32_t InputTrigger; /*!< Input Trigger source + This parameter can be a value of @ref TIM_Trigger_Selection */ + uint32_t TriggerPolarity; /*!< Input Trigger polarity + This parameter can be a value of @ref TIM_Trigger_Polarity */ + uint32_t TriggerPrescaler; /*!< Input trigger prescaler + This parameter can be a value of @ref TIM_Trigger_Prescaler */ + uint32_t TriggerFilter; /*!< Input trigger filter + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + +} TIM_SlaveConfigTypeDef; + +/** + * @brief TIM Break input(s) and Dead time configuration Structure definition + * @note 2 break inputs can be configured (BKIN and BKIN2) with configurable + * filter and polarity. + */ +typedef struct +{ + uint32_t OffStateRunMode; /*!< TIM off state in run mode, This parameter can be a value of @ref TIM_OSSR_Off_State_Selection_for_Run_mode_state */ + + uint32_t OffStateIDLEMode; /*!< TIM off state in IDLE mode, This parameter can be a value of @ref TIM_OSSI_Off_State_Selection_for_Idle_mode_state */ + + uint32_t LockLevel; /*!< TIM Lock level, This parameter can be a value of @ref TIM_Lock_level */ + + uint32_t DeadTime; /*!< TIM dead Time, This parameter can be a number between Min_Data = 0x00 and Max_Data = 0xFF */ + + uint32_t BreakState; /*!< TIM Break State, This parameter can be a value of @ref TIM_Break_Input_enable_disable */ + + uint32_t BreakPolarity; /*!< TIM Break input polarity, This parameter can be a value of @ref TIM_Break_Polarity */ + + uint32_t BreakFilter; /*!< Specifies the break input filter.This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t AutomaticOutput; /*!< TIM Automatic Output Enable state, This parameter can be a value of @ref TIM_AOE_Bit_Set_Reset */ + +} TIM_BreakDeadTimeConfigTypeDef; + +/** + * @brief HAL State structures definition + */ +typedef enum +{ + HAL_TIM_STATE_RESET = 0x00U, /*!< Peripheral not yet initialized or disabled */ + HAL_TIM_STATE_READY = 0x01U, /*!< Peripheral Initialized and ready for use */ + HAL_TIM_STATE_BUSY = 0x02U, /*!< An internal process is ongoing */ + HAL_TIM_STATE_TIMEOUT = 0x03U, /*!< Timeout state */ + HAL_TIM_STATE_ERROR = 0x04U /*!< Reception process is ongoing */ +} HAL_TIM_StateTypeDef; + +/** + * @brief TIM Channel States definition + */ +typedef enum +{ + HAL_TIM_CHANNEL_STATE_RESET = 0x00U, /*!< TIM Channel initial state */ + HAL_TIM_CHANNEL_STATE_READY = 0x01U, /*!< TIM Channel ready for use */ + HAL_TIM_CHANNEL_STATE_BUSY = 0x02U, /*!< An internal process is ongoing on the TIM channel */ +} HAL_TIM_ChannelStateTypeDef; + +/** + * @brief DMA Burst States definition + */ +typedef enum +{ + HAL_DMA_BURST_STATE_RESET = 0x00U, /*!< DMA Burst initial state */ + HAL_DMA_BURST_STATE_READY = 0x01U, /*!< DMA Burst ready for use */ + HAL_DMA_BURST_STATE_BUSY = 0x02U, /*!< Ongoing DMA Burst */ +} HAL_TIM_DMABurstStateTypeDef; + +/** + * @brief HAL Active channel structures definition + */ +typedef enum +{ + HAL_TIM_ACTIVE_CHANNEL_1 = 0x01U, /*!< The active channel is 1 */ + HAL_TIM_ACTIVE_CHANNEL_2 = 0x02U, /*!< The active channel is 2 */ + HAL_TIM_ACTIVE_CHANNEL_3 = 0x04U, /*!< The active channel is 3 */ + HAL_TIM_ACTIVE_CHANNEL_4 = 0x08U, /*!< The active channel is 4 */ + HAL_TIM_ACTIVE_CHANNEL_CLEARED = 0x00U /*!< All active channels cleared */ +} HAL_TIM_ActiveChannel; + +/** + * @brief TIM Time Base Handle Structure definition + */ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +typedef struct __TIM_HandleTypeDef +#else +typedef struct +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +{ + TIM_TypeDef *Instance; /*!< Register base address */ + TIM_Base_InitTypeDef Init; /*!< TIM Time Base required parameters */ + HAL_TIM_ActiveChannel Channel; /*!< Active channel */ + DMA_HandleTypeDef *hdma[7]; /*!< DMA Handlers array + This array is accessed by a @ref DMA_Handle_index */ + HAL_LockTypeDef Lock; /*!< Locking object */ + __IO HAL_TIM_StateTypeDef State; /*!< TIM operation state */ + __IO HAL_TIM_ChannelStateTypeDef ChannelState[4]; /*!< TIM channel operation state */ + __IO HAL_TIM_ChannelStateTypeDef ChannelNState[4]; /*!< TIM complementary channel operation state */ + __IO HAL_TIM_DMABurstStateTypeDef DMABurstState; /*!< DMA burst operation state */ + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + void (* Base_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp Init Callback */ + void (* Base_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Base Msp DeInit Callback */ + void (* IC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp Init Callback */ + void (* IC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM IC Msp DeInit Callback */ + void (* OC_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp Init Callback */ + void (* OC_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM OC Msp DeInit Callback */ + void (* PWM_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp Init Callback */ + void (* PWM_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Msp DeInit Callback */ + void (* OnePulse_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp Init Callback */ + void (* OnePulse_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM One Pulse Msp DeInit Callback */ + void (* Encoder_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp Init Callback */ + void (* Encoder_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Encoder Msp DeInit Callback */ + void (* HallSensor_MspInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp Init Callback */ + void (* HallSensor_MspDeInitCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Hall Sensor Msp DeInit Callback */ + void (* PeriodElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed Callback */ + void (* PeriodElapsedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Period Elapsed half complete Callback */ + void (* TriggerCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger Callback */ + void (* TriggerHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Trigger half complete Callback */ + void (* IC_CaptureCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture Callback */ + void (* IC_CaptureHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Input Capture half complete Callback */ + void (* OC_DelayElapsedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Output Compare Delay Elapsed Callback */ + void (* PWM_PulseFinishedCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished Callback */ + void (* PWM_PulseFinishedHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM PWM Pulse Finished half complete Callback */ + void (* ErrorCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Error Callback */ + void (* CommutationCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation Callback */ + void (* CommutationHalfCpltCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Commutation half complete Callback */ + void (* BreakCallback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break Callback */ +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} TIM_HandleTypeDef; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +/** + * @brief HAL TIM Callback ID enumeration definition + */ +typedef enum +{ + HAL_TIM_BASE_MSPINIT_CB_ID = 0x00U /*!< TIM Base MspInit Callback ID */ + , HAL_TIM_BASE_MSPDEINIT_CB_ID = 0x01U /*!< TIM Base MspDeInit Callback ID */ + , HAL_TIM_IC_MSPINIT_CB_ID = 0x02U /*!< TIM IC MspInit Callback ID */ + , HAL_TIM_IC_MSPDEINIT_CB_ID = 0x03U /*!< TIM IC MspDeInit Callback ID */ + , HAL_TIM_OC_MSPINIT_CB_ID = 0x04U /*!< TIM OC MspInit Callback ID */ + , HAL_TIM_OC_MSPDEINIT_CB_ID = 0x05U /*!< TIM OC MspDeInit Callback ID */ + , HAL_TIM_PWM_MSPINIT_CB_ID = 0x06U /*!< TIM PWM MspInit Callback ID */ + , HAL_TIM_PWM_MSPDEINIT_CB_ID = 0x07U /*!< TIM PWM MspDeInit Callback ID */ + , HAL_TIM_ONE_PULSE_MSPINIT_CB_ID = 0x08U /*!< TIM One Pulse MspInit Callback ID */ + , HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID = 0x09U /*!< TIM One Pulse MspDeInit Callback ID */ + , HAL_TIM_ENCODER_MSPINIT_CB_ID = 0x0AU /*!< TIM Encoder MspInit Callback ID */ + , HAL_TIM_ENCODER_MSPDEINIT_CB_ID = 0x0BU /*!< TIM Encoder MspDeInit Callback ID */ + , HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID = 0x0CU /*!< TIM Hall Sensor MspDeInit Callback ID */ + , HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID = 0x0DU /*!< TIM Hall Sensor MspDeInit Callback ID */ + , HAL_TIM_PERIOD_ELAPSED_CB_ID = 0x0EU /*!< TIM Period Elapsed Callback ID */ + , HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID = 0x0FU /*!< TIM Period Elapsed half complete Callback ID */ + , HAL_TIM_TRIGGER_CB_ID = 0x10U /*!< TIM Trigger Callback ID */ + , HAL_TIM_TRIGGER_HALF_CB_ID = 0x11U /*!< TIM Trigger half complete Callback ID */ + + , HAL_TIM_IC_CAPTURE_CB_ID = 0x12U /*!< TIM Input Capture Callback ID */ + , HAL_TIM_IC_CAPTURE_HALF_CB_ID = 0x13U /*!< TIM Input Capture half complete Callback ID */ + , HAL_TIM_OC_DELAY_ELAPSED_CB_ID = 0x14U /*!< TIM Output Compare Delay Elapsed Callback ID */ + , HAL_TIM_PWM_PULSE_FINISHED_CB_ID = 0x15U /*!< TIM PWM Pulse Finished Callback ID */ + , HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID = 0x16U /*!< TIM PWM Pulse Finished half complete Callback ID */ + , HAL_TIM_ERROR_CB_ID = 0x17U /*!< TIM Error Callback ID */ + , HAL_TIM_COMMUTATION_CB_ID = 0x18U /*!< TIM Commutation Callback ID */ + , HAL_TIM_COMMUTATION_HALF_CB_ID = 0x19U /*!< TIM Commutation half complete Callback ID */ + , HAL_TIM_BREAK_CB_ID = 0x1AU /*!< TIM Break Callback ID */ +} HAL_TIM_CallbackIDTypeDef; + +/** + * @brief HAL TIM Callback pointer definition + */ +typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to the TIM callback function */ + +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ +/* End of exported types -----------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIM_Exported_Constants TIM Exported Constants + * @{ + */ + +/** @defgroup TIM_ClearInput_Source TIM Clear Input Source + * @{ + */ +#define TIM_CLEARINPUTSOURCE_NONE 0x00000000U /*!< OCREF_CLR is disabled */ +#define TIM_CLEARINPUTSOURCE_ETR 0x00000001U /*!< OCREF_CLR is connected to ETRF input */ +/** + * @} + */ + +/** @defgroup TIM_DMA_Base_address TIM DMA Base Address + * @{ + */ +#define TIM_DMABASE_CR1 0x00000000U +#define TIM_DMABASE_CR2 0x00000001U +#define TIM_DMABASE_SMCR 0x00000002U +#define TIM_DMABASE_DIER 0x00000003U +#define TIM_DMABASE_SR 0x00000004U +#define TIM_DMABASE_EGR 0x00000005U +#define TIM_DMABASE_CCMR1 0x00000006U +#define TIM_DMABASE_CCMR2 0x00000007U +#define TIM_DMABASE_CCER 0x00000008U +#define TIM_DMABASE_CNT 0x00000009U +#define TIM_DMABASE_PSC 0x0000000AU +#define TIM_DMABASE_ARR 0x0000000BU +#define TIM_DMABASE_RCR 0x0000000CU +#define TIM_DMABASE_CCR1 0x0000000DU +#define TIM_DMABASE_CCR2 0x0000000EU +#define TIM_DMABASE_CCR3 0x0000000FU +#define TIM_DMABASE_CCR4 0x00000010U +#define TIM_DMABASE_BDTR 0x00000011U +#define TIM_DMABASE_DCR 0x00000012U +#define TIM_DMABASE_DMAR 0x00000013U +/** + * @} + */ + +/** @defgroup TIM_Event_Source TIM Event Source + * @{ + */ +#define TIM_EVENTSOURCE_UPDATE TIM_EGR_UG /*!< Reinitialize the counter and generates an update of the registers */ +#define TIM_EVENTSOURCE_CC1 TIM_EGR_CC1G /*!< A capture/compare event is generated on channel 1 */ +#define TIM_EVENTSOURCE_CC2 TIM_EGR_CC2G /*!< A capture/compare event is generated on channel 2 */ +#define TIM_EVENTSOURCE_CC3 TIM_EGR_CC3G /*!< A capture/compare event is generated on channel 3 */ +#define TIM_EVENTSOURCE_CC4 TIM_EGR_CC4G /*!< A capture/compare event is generated on channel 4 */ +#define TIM_EVENTSOURCE_COM TIM_EGR_COMG /*!< A commutation event is generated */ +#define TIM_EVENTSOURCE_TRIGGER TIM_EGR_TG /*!< A trigger event is generated */ +#define TIM_EVENTSOURCE_BREAK TIM_EGR_BG /*!< A break event is generated */ +/** + * @} + */ + +/** @defgroup TIM_Input_Channel_Polarity TIM Input Channel polarity + * @{ + */ +#define TIM_INPUTCHANNELPOLARITY_RISING 0x00000000U /*!< Polarity for TIx source */ +#define TIM_INPUTCHANNELPOLARITY_FALLING TIM_CCER_CC1P /*!< Polarity for TIx source */ +#define TIM_INPUTCHANNELPOLARITY_BOTHEDGE (TIM_CCER_CC1P | TIM_CCER_CC1NP) /*!< Polarity for TIx source */ +/** + * @} + */ + +/** @defgroup TIM_ETR_Polarity TIM ETR Polarity + * @{ + */ +#define TIM_ETRPOLARITY_INVERTED TIM_SMCR_ETP /*!< Polarity for ETR source */ +#define TIM_ETRPOLARITY_NONINVERTED 0x00000000U /*!< Polarity for ETR source */ +/** + * @} + */ + +/** @defgroup TIM_ETR_Prescaler TIM ETR Prescaler + * @{ + */ +#define TIM_ETRPRESCALER_DIV1 0x00000000U /*!< No prescaler is used */ +#define TIM_ETRPRESCALER_DIV2 TIM_SMCR_ETPS_0 /*!< ETR input source is divided by 2 */ +#define TIM_ETRPRESCALER_DIV4 TIM_SMCR_ETPS_1 /*!< ETR input source is divided by 4 */ +#define TIM_ETRPRESCALER_DIV8 TIM_SMCR_ETPS /*!< ETR input source is divided by 8 */ +/** + * @} + */ + +/** @defgroup TIM_Counter_Mode TIM Counter Mode + * @{ + */ +#define TIM_COUNTERMODE_UP 0x00000000U /*!< Counter used as up-counter */ +#define TIM_COUNTERMODE_DOWN TIM_CR1_DIR /*!< Counter used as down-counter */ +#define TIM_COUNTERMODE_CENTERALIGNED1 TIM_CR1_CMS_0 /*!< Center-aligned mode 1 */ +#define TIM_COUNTERMODE_CENTERALIGNED2 TIM_CR1_CMS_1 /*!< Center-aligned mode 2 */ +#define TIM_COUNTERMODE_CENTERALIGNED3 TIM_CR1_CMS /*!< Center-aligned mode 3 */ +/** + * @} + */ + +/** @defgroup TIM_ClockDivision TIM Clock Division + * @{ + */ +#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ +#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ +#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_State TIM Output Compare State + * @{ + */ +#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ +#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ +/** + * @} + */ + +/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload + * @{ + */ +#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ +#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ + +/** + * @} + */ + +/** @defgroup TIM_Output_Fast_State TIM Output Fast State + * @{ + */ +#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ +#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State + * @{ + */ +#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ +#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity + * @{ + */ +#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ +#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity + * @{ + */ +#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ +#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State + * @{ + */ +#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ +#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State + * @{ + */ +#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ +#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity + * @{ + */ +#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ +#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ +#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection + * @{ + */ +#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively */ +#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler + * @{ + */ +#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ +#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ +#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ +#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ +/** + * @} + */ + +/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode + * @{ + */ +#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ +#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Mode TIM Encoder Mode + * @{ + */ +#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ +#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ +#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ +/** + * @} + */ + +/** @defgroup TIM_Interrupt_definition TIM interrupt Definition + * @{ + */ +#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ +#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ +#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ +#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ +#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ +#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ +#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ +#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ +/** + * @} + */ + +/** @defgroup TIM_Commutation_Source TIM Commutation Source + * @{ + */ +#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ +#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ +/** + * @} + */ + +/** @defgroup TIM_DMA_sources TIM DMA Sources + * @{ + */ +#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ +#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ +#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ +#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ +#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ +#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ +#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ +/** + * @} + */ + +/** @defgroup TIM_CC_DMA_Request CCx DMA request selection + * @{ + */ +#define TIM_CCDMAREQUEST_CC 0x00000000U /*!< CCx DMA request sent when capture or compare match event occurs */ +#define TIM_CCDMAREQUEST_UPDATE TIM_CR2_CCDS /*!< CCx DMA requests sent when update event occurs */ +/** + * @} + */ + +/** @defgroup TIM_Flag_definition TIM Flag Definition + * @{ + */ +#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ +#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ +#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ +#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ +#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ +#define TIM_FLAG_COM TIM_SR_COMIF /*!< Commutation interrupt flag */ +#define TIM_FLAG_TRIGGER TIM_SR_TIF /*!< Trigger interrupt flag */ +#define TIM_FLAG_BREAK TIM_SR_BIF /*!< Break interrupt flag */ +#define TIM_FLAG_CC1OF TIM_SR_CC1OF /*!< Capture 1 overcapture flag */ +#define TIM_FLAG_CC2OF TIM_SR_CC2OF /*!< Capture 2 overcapture flag */ +#define TIM_FLAG_CC3OF TIM_SR_CC3OF /*!< Capture 3 overcapture flag */ +#define TIM_FLAG_CC4OF TIM_SR_CC4OF /*!< Capture 4 overcapture flag */ +/** + * @} + */ + +/** @defgroup TIM_Channel TIM Channel + * @{ + */ +#define TIM_CHANNEL_1 0x00000000U /*!< Capture/compare channel 1 identifier */ +#define TIM_CHANNEL_2 0x00000004U /*!< Capture/compare channel 2 identifier */ +#define TIM_CHANNEL_3 0x00000008U /*!< Capture/compare channel 3 identifier */ +#define TIM_CHANNEL_4 0x0000000CU /*!< Capture/compare channel 4 identifier */ +#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Source TIM Clock Source + * @{ + */ +#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ +#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ +#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ +#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ +#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ +#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ +#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ +#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ +#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ +#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Polarity TIM Clock Polarity + * @{ + */ +#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler + * @{ + */ +#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ +#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ +#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity + * @{ + */ +#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ +#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler + * @{ + */ +#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state + * @{ + */ +#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ + +/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state + * @{ + */ +#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ +/** @defgroup TIM_Lock_level TIM Lock level + * @{ + */ +#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ +#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ +#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ +#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ +/** + * @} + */ + +/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable + * @{ + */ +#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ +#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ +/** + * @} + */ + +/** @defgroup TIM_Break_Polarity TIM Break Input Polarity + * @{ + */ +#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ +#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ +/** + * @} + */ + +/** @defgroup TIM_AOE_Bit_Set_Reset TIM Automatic Output Enable + * @{ + */ +#define TIM_AUTOMATICOUTPUT_DISABLE 0x00000000U /*!< MOE can be set only by software */ +#define TIM_AUTOMATICOUTPUT_ENABLE TIM_BDTR_AOE /*!< MOE can be set by software or automatically at the next update event (if none of the break inputs BRK and BRK2 is active) */ +/** + * @} + */ + +/** @defgroup TIM_Master_Mode_Selection TIM Master Mode Selection + * @{ + */ +#define TIM_TRGO_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */ +#define TIM_TRGO_ENABLE TIM_CR2_MMS_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */ +#define TIM_TRGO_UPDATE TIM_CR2_MMS_1 /*!< Update event is used as trigger output (TRGO) */ +#define TIM_TRGO_OC1 (TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO) */ +#define TIM_TRGO_OC1REF TIM_CR2_MMS_2 /*!< OC1REF signal is used as trigger output (TRGO) */ +#define TIM_TRGO_OC2REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_0) /*!< OC2REF signal is used as trigger output(TRGO) */ +#define TIM_TRGO_OC3REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1) /*!< OC3REF signal is used as trigger output(TRGO) */ +#define TIM_TRGO_OC4REF (TIM_CR2_MMS_2 | TIM_CR2_MMS_1 | TIM_CR2_MMS_0) /*!< OC4REF signal is used as trigger output(TRGO) */ +/** + * @} + */ + +/** @defgroup TIM_Master_Slave_Mode TIM Master/Slave Mode + * @{ + */ +#define TIM_MASTERSLAVEMODE_ENABLE TIM_SMCR_MSM /*!< No action */ +#define TIM_MASTERSLAVEMODE_DISABLE 0x00000000U /*!< Master/slave mode is selected */ +/** + * @} + */ + +/** @defgroup TIM_Slave_Mode TIM Slave mode + * @{ + */ +#define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ +#define TIM_SLAVEMODE_RESET TIM_SMCR_SMS_2 /*!< Reset Mode */ +#define TIM_SLAVEMODE_GATED (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0) /*!< Gated Mode */ +#define TIM_SLAVEMODE_TRIGGER (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1) /*!< Trigger Mode */ +#define TIM_SLAVEMODE_EXTERNAL1 (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< External Clock Mode 1 */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_and_PWM_modes TIM Output Compare and PWM Modes + * @{ + */ +#define TIM_OCMODE_TIMING 0x00000000U /*!< Frozen */ +#define TIM_OCMODE_ACTIVE TIM_CCMR1_OC1M_0 /*!< Set channel to active level on match */ +#define TIM_OCMODE_INACTIVE TIM_CCMR1_OC1M_1 /*!< Set channel to inactive level on match */ +#define TIM_OCMODE_TOGGLE (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< Toggle */ +#define TIM_OCMODE_PWM1 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1) /*!< PWM mode 1 */ +#define TIM_OCMODE_PWM2 (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0) /*!< PWM mode 2 */ +#define TIM_OCMODE_FORCED_ACTIVE (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0) /*!< Force active level */ +#define TIM_OCMODE_FORCED_INACTIVE TIM_CCMR1_OC1M_2 /*!< Force inactive level */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Selection TIM Trigger Selection + * @{ + */ +#define TIM_TS_ITR0 0x00000000U /*!< Internal Trigger 0 (ITR0) */ +#define TIM_TS_ITR1 TIM_SMCR_TS_0 /*!< Internal Trigger 1 (ITR1) */ +#define TIM_TS_ITR2 TIM_SMCR_TS_1 /*!< Internal Trigger 2 (ITR2) */ +#define TIM_TS_ITR3 (TIM_SMCR_TS_0 | TIM_SMCR_TS_1) /*!< Internal Trigger 3 (ITR3) */ +#define TIM_TS_TI1F_ED TIM_SMCR_TS_2 /*!< TI1 Edge Detector (TI1F_ED) */ +#define TIM_TS_TI1FP1 (TIM_SMCR_TS_0 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 1 (TI1FP1) */ +#define TIM_TS_TI2FP2 (TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered Timer Input 2 (TI2FP2) */ +#define TIM_TS_ETRF (TIM_SMCR_TS_0 | TIM_SMCR_TS_1 | TIM_SMCR_TS_2) /*!< Filtered External Trigger input (ETRF) */ +#define TIM_TS_NONE 0x0000FFFFU /*!< No trigger selected */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Polarity TIM Trigger Polarity + * @{ + */ +#define TIM_TRIGGERPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx trigger sources */ +#define TIM_TRIGGERPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx trigger sources */ +#define TIM_TRIGGERPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +#define TIM_TRIGGERPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +#define TIM_TRIGGERPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIxFPx or TI1_ED trigger sources */ +/** + * @} + */ + +/** @defgroup TIM_Trigger_Prescaler TIM Trigger Prescaler + * @{ + */ +#define TIM_TRIGGERPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_TRIGGERPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Trigger: Capture performed once every 2 events. */ +#define TIM_TRIGGERPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Trigger: Capture performed once every 4 events. */ +#define TIM_TRIGGERPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Trigger: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_TI1_Selection TIM TI1 Input Selection + * @{ + */ +#define TIM_TI1SELECTION_CH1 0x00000000U /*!< The TIMx_CH1 pin is connected to TI1 input */ +#define TIM_TI1SELECTION_XORCOMBINATION TIM_CR2_TI1S /*!< The TIMx_CH1, CH2 and CH3 pins are connected to the TI1 input (XOR combination) */ +/** + * @} + */ + +/** @defgroup TIM_DMA_Burst_Length TIM DMA Burst Length + * @{ + */ +#define TIM_DMABURSTLENGTH_1TRANSFER 0x00000000U /*!< The transfer is done to 1 register starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_2TRANSFERS 0x00000100U /*!< The transfer is done to 2 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_3TRANSFERS 0x00000200U /*!< The transfer is done to 3 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_4TRANSFERS 0x00000300U /*!< The transfer is done to 4 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_5TRANSFERS 0x00000400U /*!< The transfer is done to 5 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_6TRANSFERS 0x00000500U /*!< The transfer is done to 6 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_7TRANSFERS 0x00000600U /*!< The transfer is done to 7 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_8TRANSFERS 0x00000700U /*!< The transfer is done to 8 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_9TRANSFERS 0x00000800U /*!< The transfer is done to 9 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_10TRANSFERS 0x00000900U /*!< The transfer is done to 10 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_11TRANSFERS 0x00000A00U /*!< The transfer is done to 11 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_12TRANSFERS 0x00000B00U /*!< The transfer is done to 12 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_13TRANSFERS 0x00000C00U /*!< The transfer is done to 13 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_14TRANSFERS 0x00000D00U /*!< The transfer is done to 14 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_15TRANSFERS 0x00000E00U /*!< The transfer is done to 15 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_16TRANSFERS 0x00000F00U /*!< The transfer is done to 16 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_17TRANSFERS 0x00001000U /*!< The transfer is done to 17 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +#define TIM_DMABURSTLENGTH_18TRANSFERS 0x00001100U /*!< The transfer is done to 18 registers starting from TIMx_CR1 + TIMx_DCR.DBA */ +/** + * @} + */ + +/** @defgroup DMA_Handle_index TIM DMA Handle Index + * @{ + */ +#define TIM_DMA_ID_UPDATE ((uint16_t) 0x0000) /*!< Index of the DMA handle used for Update DMA requests */ +#define TIM_DMA_ID_CC1 ((uint16_t) 0x0001) /*!< Index of the DMA handle used for Capture/Compare 1 DMA requests */ +#define TIM_DMA_ID_CC2 ((uint16_t) 0x0002) /*!< Index of the DMA handle used for Capture/Compare 2 DMA requests */ +#define TIM_DMA_ID_CC3 ((uint16_t) 0x0003) /*!< Index of the DMA handle used for Capture/Compare 3 DMA requests */ +#define TIM_DMA_ID_CC4 ((uint16_t) 0x0004) /*!< Index of the DMA handle used for Capture/Compare 4 DMA requests */ +#define TIM_DMA_ID_COMMUTATION ((uint16_t) 0x0005) /*!< Index of the DMA handle used for Commutation DMA requests */ +#define TIM_DMA_ID_TRIGGER ((uint16_t) 0x0006) /*!< Index of the DMA handle used for Trigger DMA requests */ +/** + * @} + */ + +/** @defgroup Channel_CC_State TIM Capture/Compare Channel State + * @{ + */ +#define TIM_CCx_ENABLE 0x00000001U /*!< Input or output channel is enabled */ +#define TIM_CCx_DISABLE 0x00000000U /*!< Input or output channel is disabled */ +#define TIM_CCxN_ENABLE 0x00000004U /*!< Complementary output channel is enabled */ +#define TIM_CCxN_DISABLE 0x00000000U /*!< Complementary output channel is enabled */ +/** + * @} + */ + +/** + * @} + */ +/* End of exported constants -------------------------------------------------*/ + +/* Exported macros -----------------------------------------------------------*/ +/** @defgroup TIM_Exported_Macros TIM Exported Macros + * @{ + */ + +/** @brief Reset TIM handle state. + * @param __HANDLE__ TIM handle. + * @retval None + */ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ + (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ + (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ + (__HANDLE__)->Base_MspInitCallback = NULL; \ + (__HANDLE__)->Base_MspDeInitCallback = NULL; \ + (__HANDLE__)->IC_MspInitCallback = NULL; \ + (__HANDLE__)->IC_MspDeInitCallback = NULL; \ + (__HANDLE__)->OC_MspInitCallback = NULL; \ + (__HANDLE__)->OC_MspDeInitCallback = NULL; \ + (__HANDLE__)->PWM_MspInitCallback = NULL; \ + (__HANDLE__)->PWM_MspDeInitCallback = NULL; \ + (__HANDLE__)->OnePulse_MspInitCallback = NULL; \ + (__HANDLE__)->OnePulse_MspDeInitCallback = NULL; \ + (__HANDLE__)->Encoder_MspInitCallback = NULL; \ + (__HANDLE__)->Encoder_MspDeInitCallback = NULL; \ + (__HANDLE__)->HallSensor_MspInitCallback = NULL; \ + (__HANDLE__)->HallSensor_MspDeInitCallback = NULL; \ + } while(0) +#else +#define __HAL_TIM_RESET_HANDLE_STATE(__HANDLE__) do { \ + (__HANDLE__)->State = HAL_TIM_STATE_RESET; \ + (__HANDLE__)->ChannelState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[0] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[1] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[2] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelNState[3] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->DMABurstState = HAL_DMA_BURST_STATE_RESET; \ + } while(0) +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @brief Enable the TIM peripheral. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|=(TIM_CR1_CEN)) + +/** + * @brief Enable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_MOE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->BDTR|=(TIM_BDTR_MOE)) + +/** + * @brief Disable the TIM peripheral. + * @param __HANDLE__ TIM handle + * @retval None + */ +#define __HAL_TIM_DISABLE(__HANDLE__) \ + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) + +/** + * @brief Disable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been + * disabled + */ +#define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) + +/** + * @brief Disable the TIM main Output. + * @param __HANDLE__ TIM handle + * @retval None + * @note The Main Output Enable of a timer instance is disabled unconditionally + */ +#define __HAL_TIM_MOE_DISABLE_UNCONDITIONALLY(__HANDLE__) (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE) + +/** @brief Enable the specified TIM interrupt. + * @param __HANDLE__ specifies the TIM Handle. + * @param __INTERRUPT__ specifies the TIM interrupt source to enable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER |= (__INTERRUPT__)) + +/** @brief Disable the specified TIM interrupt. + * @param __HANDLE__ specifies the TIM Handle. + * @param __INTERRUPT__ specifies the TIM interrupt source to disable. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->DIER &= ~(__INTERRUPT__)) + +/** @brief Enable the specified DMA request. + * @param __HANDLE__ specifies the TIM Handle. + * @param __DMA__ specifies the TIM DMA request to enable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ +#define __HAL_TIM_ENABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER |= (__DMA__)) + +/** @brief Disable the specified DMA request. + * @param __HANDLE__ specifies the TIM Handle. + * @param __DMA__ specifies the TIM DMA request to disable. + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: Update DMA request + * @arg TIM_DMA_CC1: Capture/Compare 1 DMA request + * @arg TIM_DMA_CC2: Capture/Compare 2 DMA request + * @arg TIM_DMA_CC3: Capture/Compare 3 DMA request + * @arg TIM_DMA_CC4: Capture/Compare 4 DMA request + * @arg TIM_DMA_COM: Commutation DMA request + * @arg TIM_DMA_TRIGGER: Trigger DMA request + * @retval None + */ +#define __HAL_TIM_DISABLE_DMA(__HANDLE__, __DMA__) ((__HANDLE__)->Instance->DIER &= ~(__DMA__)) + +/** @brief Check whether the specified TIM interrupt flag is set or not. + * @param __HANDLE__ specifies the TIM Handle. + * @param __FLAG__ specifies the TIM interrupt flag to check. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) + +/** @brief Clear the specified TIM interrupt flag. + * @param __HANDLE__ specifies the TIM Handle. + * @param __FLAG__ specifies the TIM interrupt flag to clear. + * This parameter can be one of the following values: + * @arg TIM_FLAG_UPDATE: Update interrupt flag + * @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag + * @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag + * @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag + * @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag + * @arg TIM_FLAG_COM: Commutation interrupt flag + * @arg TIM_FLAG_TRIGGER: Trigger interrupt flag + * @arg TIM_FLAG_BREAK: Break interrupt flag + * @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag + * @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag + * @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag + * @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) + +/** + * @brief Check whether the specified TIM interrupt source is enabled or not. + * @param __HANDLE__ TIM handle + * @param __INTERRUPT__ specifies the TIM interrupt source to check. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval The state of TIM_IT (SET or RESET). + */ +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) + +/** @brief Clear the TIM interrupt pending bits. + * @param __HANDLE__ TIM handle + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * @arg TIM_IT_UPDATE: Update interrupt + * @arg TIM_IT_CC1: Capture/Compare 1 interrupt + * @arg TIM_IT_CC2: Capture/Compare 2 interrupt + * @arg TIM_IT_CC3: Capture/Compare 3 interrupt + * @arg TIM_IT_CC4: Capture/Compare 4 interrupt + * @arg TIM_IT_COM: Commutation interrupt + * @arg TIM_IT_TRIGGER: Trigger interrupt + * @arg TIM_IT_BREAK: Break interrupt + * @retval None + */ +#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) + +/** + * @brief Indicates whether or not the TIM Counter is used as downcounter. + * @param __HANDLE__ TIM handle. + * @retval False (Counter used as upcounter) or True (Counter used as downcounter) + * @note This macro is particularly useful to get the counting mode when the timer operates in Center-aligned mode + * or Encoder mode. + */ +#define __HAL_TIM_IS_TIM_COUNTING_DOWN(__HANDLE__) (((__HANDLE__)->Instance->CR1 &(TIM_CR1_DIR)) == (TIM_CR1_DIR)) + +/** + * @brief Set the TIM Prescaler on runtime. + * @param __HANDLE__ TIM handle. + * @param __PRESC__ specifies the Prescaler new value. + * @retval None + */ +#define __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__) ((__HANDLE__)->Instance->PSC = (__PRESC__)) + +/** + * @brief Set the TIM Counter Register value on runtime. + * @param __HANDLE__ TIM handle. + * @param __COUNTER__ specifies the Counter register new value. + * @retval None + */ +#define __HAL_TIM_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->CNT = (__COUNTER__)) + +/** + * @brief Get the TIM Counter Register value on runtime. + * @param __HANDLE__ TIM handle. + * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) + */ +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) + +/** + * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. + * @param __HANDLE__ TIM handle. + * @param __AUTORELOAD__ specifies the Counter register new value. + * @retval None + */ +#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) + +/** + * @brief Get the TIM Autoreload Register value on runtime. + * @param __HANDLE__ TIM handle. + * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) + */ +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) + +/** + * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. + * @param __HANDLE__ TIM handle. + * @param __CKD__ specifies the clock division value. + * This parameter can be one of the following value: + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT + * @retval None + */ +#define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) + +/** + * @brief Get the TIM Clock Division value on runtime. + * @param __HANDLE__ TIM handle. + * @retval The clock division can be one of the following values: + * @arg TIM_CLOCKDIVISION_DIV1: tDTS=tCK_INT + * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT + * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT + */ +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) + +/** + * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() + * function. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __ICPSC__ specifies the Input Capture4 prescaler new value. + * This parameter can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +#define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) + +/** + * @brief Get the TIM Input Capture prescaler on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: get input capture 1 prescaler value + * @arg TIM_CHANNEL_2: get input capture 2 prescaler value + * @arg TIM_CHANNEL_3: get input capture 3 prescaler value + * @arg TIM_CHANNEL_4: get input capture 4 prescaler value + * @retval The input capture prescaler can be one of the following values: + * @arg TIM_ICPSC_DIV1: no prescaler + * @arg TIM_ICPSC_DIV2: capture is done once every 2 events + * @arg TIM_ICPSC_DIV4: capture is done once every 4 events + * @arg TIM_ICPSC_DIV8: capture is done once every 8 events + */ +#define __HAL_TIM_GET_ICPRESCALER(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? (((__HANDLE__)->Instance->CCMR1 & TIM_CCMR1_IC2PSC) >> 8U) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC3PSC) :\ + (((__HANDLE__)->Instance->CCMR2 & TIM_CCMR2_IC4PSC)) >> 8U) + +/** + * @brief Set the TIM Capture Compare Register value on runtime without calling another time ConfigChannel function. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __COMPARE__ specifies the Capture Compare register new value. + * @retval None + */ +#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR4 = (__COMPARE__))) + +/** + * @brief Get the TIM Capture Compare Register value on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channel associated with the capture compare register + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: get capture/compare 1 register value + * @arg TIM_CHANNEL_2: get capture/compare 2 register value + * @arg TIM_CHANNEL_3: get capture/compare 3 register value + * @arg TIM_CHANNEL_4: get capture/compare 4 register value + * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) + */ +#define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__HANDLE__)->Instance->CCR4)) + +/** + * @brief Set the TIM Output compare preload. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE)) + +/** + * @brief Reset the TIM Output compare preload. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE)) + +/** + * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is set, only counter + * overflow/underflow generates an update interrupt or DMA request (if + * enabled) + * @retval None + */ +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) + +/** + * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is reset, any of the + * following events generate an update interrupt or DMA request (if + * enabled): + * _ Counter overflow underflow + * _ Setting the UG bit + * _ Update generation through the slave mode controller + * @retval None + */ +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) + +/** + * @brief Set the TIM Capture x input polarity on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __POLARITY__ Polarity for TIx source + * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge + * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge + * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge + * @retval None + */ +#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) + +/** @brief Select the Capture/compare DMA request source. + * @param __HANDLE__ specifies the TIM Handle. + * @param __CCDMA__ specifies Capture/compare DMA request source + * This parameter can be one of the following values: + * @arg TIM_CCDMAREQUEST_CC: CCx DMA request generated on Capture/Compare event + * @arg TIM_CCDMAREQUEST_UPDATE: CCx DMA request generated on Update event + * @retval None + */ +#define __HAL_TIM_SELECT_CCDMAREQUEST(__HANDLE__, __CCDMA__) \ + MODIFY_REG((__HANDLE__)->Instance->CR2, TIM_CR2_CCDS, (__CCDMA__)) + +/** + * @} + */ +/* End of exported macros ----------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup TIM_Private_Constants TIM Private Constants + * @{ + */ +/* The counter of a timer instance is disabled only if all the CCx and CCxN + channels have been disabled */ +#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) +#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) +/** + * @} + */ +/* End of private constants --------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup TIM_Private_Macros TIM Private Macros + * @{ + */ +#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ + ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) + +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR)) + +#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) + +#define IS_TIM_COUNTER_MODE(__MODE__) (((__MODE__) == TIM_COUNTERMODE_UP) || \ + ((__MODE__) == TIM_COUNTERMODE_DOWN) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED1) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ + ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) + +#define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ + ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ + ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) + +#define IS_TIM_AUTORELOAD_PRELOAD(PRELOAD) (((PRELOAD) == TIM_AUTORELOAD_PRELOAD_DISABLE) || \ + ((PRELOAD) == TIM_AUTORELOAD_PRELOAD_ENABLE)) + +#define IS_TIM_FAST_STATE(__STATE__) (((__STATE__) == TIM_OCFAST_DISABLE) || \ + ((__STATE__) == TIM_OCFAST_ENABLE)) + +#define IS_TIM_OC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCPOLARITY_HIGH) || \ + ((__POLARITY__) == TIM_OCPOLARITY_LOW)) + +#define IS_TIM_OCN_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_OCNPOLARITY_HIGH) || \ + ((__POLARITY__) == TIM_OCNPOLARITY_LOW)) + +#define IS_TIM_OCIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCIDLESTATE_SET) || \ + ((__STATE__) == TIM_OCIDLESTATE_RESET)) + +#define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ + ((__STATE__) == TIM_OCNIDLESTATE_RESET)) + +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + +#define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ + ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) + +#define IS_TIM_IC_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_ICSELECTION_DIRECTTI) || \ + ((__SELECTION__) == TIM_ICSELECTION_INDIRECTTI) || \ + ((__SELECTION__) == TIM_ICSELECTION_TRC)) + +#define IS_TIM_IC_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_ICPSC_DIV1) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV2) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV4) || \ + ((__PRESCALER__) == TIM_ICPSC_DIV8)) + +#define IS_TIM_OPM_MODE(__MODE__) (((__MODE__) == TIM_OPMODE_SINGLE) || \ + ((__MODE__) == TIM_OPMODE_REPETITIVE)) + +#define IS_TIM_ENCODER_MODE(__MODE__) (((__MODE__) == TIM_ENCODERMODE_TI1) || \ + ((__MODE__) == TIM_ENCODERMODE_TI2) || \ + ((__MODE__) == TIM_ENCODERMODE_TI12)) + +#define IS_TIM_DMA_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFF80FFU) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) + +#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3) || \ + ((__CHANNEL__) == TIM_CHANNEL_4) || \ + ((__CHANNEL__) == TIM_CHANNEL_ALL)) + +#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2)) + +#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3)) + +#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3)) + +#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) + +#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) + +#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) + +#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) + +#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ + ((__STATE__) == TIM_OSSR_DISABLE)) + +#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ + ((__STATE__) == TIM_OSSI_DISABLE)) + +#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_3)) + +#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) + + +#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ + ((__STATE__) == TIM_BREAK_DISABLE)) + +#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ + ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) + +#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ + ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) + +#define IS_TIM_TRGO_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO_RESET) || \ + ((__SOURCE__) == TIM_TRGO_ENABLE) || \ + ((__SOURCE__) == TIM_TRGO_UPDATE) || \ + ((__SOURCE__) == TIM_TRGO_OC1) || \ + ((__SOURCE__) == TIM_TRGO_OC1REF) || \ + ((__SOURCE__) == TIM_TRGO_OC2REF) || \ + ((__SOURCE__) == TIM_TRGO_OC3REF) || \ + ((__SOURCE__) == TIM_TRGO_OC4REF)) + +#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ + ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) + +#define IS_TIM_SLAVE_MODE(__MODE__) (((__MODE__) == TIM_SLAVEMODE_DISABLE) || \ + ((__MODE__) == TIM_SLAVEMODE_RESET) || \ + ((__MODE__) == TIM_SLAVEMODE_GATED) || \ + ((__MODE__) == TIM_SLAVEMODE_TRIGGER) || \ + ((__MODE__) == TIM_SLAVEMODE_EXTERNAL1)) + +#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ + ((__MODE__) == TIM_OCMODE_PWM2)) + +#define IS_TIM_OC_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_TIMING) || \ + ((__MODE__) == TIM_OCMODE_ACTIVE) || \ + ((__MODE__) == TIM_OCMODE_INACTIVE) || \ + ((__MODE__) == TIM_OCMODE_TOGGLE) || \ + ((__MODE__) == TIM_OCMODE_FORCED_ACTIVE) || \ + ((__MODE__) == TIM_OCMODE_FORCED_INACTIVE)) + +#define IS_TIM_TRIGGER_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ + ((__SELECTION__) == TIM_TS_ITR1) || \ + ((__SELECTION__) == TIM_TS_ITR2) || \ + ((__SELECTION__) == TIM_TS_ITR3) || \ + ((__SELECTION__) == TIM_TS_TI1F_ED) || \ + ((__SELECTION__) == TIM_TS_TI1FP1) || \ + ((__SELECTION__) == TIM_TS_TI2FP2) || \ + ((__SELECTION__) == TIM_TS_ETRF)) + +#define IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(__SELECTION__) (((__SELECTION__) == TIM_TS_ITR0) || \ + ((__SELECTION__) == TIM_TS_ITR1) || \ + ((__SELECTION__) == TIM_TS_ITR2) || \ + ((__SELECTION__) == TIM_TS_ITR3) || \ + ((__SELECTION__) == TIM_TS_NONE)) + +#define IS_TIM_TRIGGERPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_TRIGGERPOLARITY_INVERTED ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_NONINVERTED) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_RISING ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_FALLING ) || \ + ((__POLARITY__) == TIM_TRIGGERPOLARITY_BOTHEDGE )) + +#define IS_TIM_TRIGGERPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_TRIGGERPRESCALER_DIV8)) + +#define IS_TIM_TRIGGERFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_TI1SELECTION(__TI1SELECTION__) (((__TI1SELECTION__) == TIM_TI1SELECTION_CH1) || \ + ((__TI1SELECTION__) == TIM_TI1SELECTION_XORCOMBINATION)) + +#define IS_TIM_DMA_LENGTH(__LENGTH__) (((__LENGTH__) == TIM_DMABURSTLENGTH_1TRANSFER) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_2TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_3TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_4TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_5TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_6TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_7TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_8TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_9TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_10TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_11TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_12TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_13TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_14TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_15TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_16TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_17TRANSFERS) || \ + ((__LENGTH__) == TIM_DMABURSTLENGTH_18TRANSFERS)) + +#define IS_TIM_DMA_DATA_LENGTH(LENGTH) (((LENGTH) >= 0x1U) && ((LENGTH) < 0x10000U)) + +#define IS_TIM_IC_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_DEADTIME(__DEADTIME__) ((__DEADTIME__) <= 0xFFU) + +#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) + +#define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + +#define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) + +#define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + +#define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + +#define TIM_CHANNEL_STATE_GET(__HANDLE__, __CHANNEL__)\ + (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelState[0] :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelState[1] :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelState[2] :\ + (__HANDLE__)->ChannelState[3]) + +#define TIM_CHANNEL_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__)) :\ + ((__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__))) + +#define TIM_CHANNEL_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__) do { \ + (__HANDLE__)->ChannelState[0] = (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelState[1] = (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelState[2] = (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__); \ + } while(0) + +#define TIM_CHANNEL_N_STATE_GET(__HANDLE__, __CHANNEL__)\ + (((__CHANNEL__) == TIM_CHANNEL_1) ? (__HANDLE__)->ChannelNState[0] :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? (__HANDLE__)->ChannelNState[1] :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? (__HANDLE__)->ChannelNState[2] :\ + (__HANDLE__)->ChannelNState[3]) + +#define TIM_CHANNEL_N_STATE_SET(__HANDLE__, __CHANNEL__, __CHANNEL_STATE__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->ChannelNState[0] = (__CHANNEL_STATE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->ChannelNState[1] = (__CHANNEL_STATE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->ChannelNState[2] = (__CHANNEL_STATE__)) :\ + ((__HANDLE__)->ChannelNState[3] = (__CHANNEL_STATE__))) + +#define TIM_CHANNEL_N_STATE_SET_ALL(__HANDLE__, __CHANNEL_STATE__) do { \ + (__HANDLE__)->ChannelNState[0] = \ + (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelNState[1] = \ + (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelNState[2] = \ + (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelNState[3] = \ + (__CHANNEL_STATE__); \ + } while(0) + +/** + * @} + */ +/* End of private macros -----------------------------------------------------*/ + +/* Include TIM HAL Extended module */ +#include "stm32f4xx_hal_tim_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIM_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions + * @brief Time Base functions + * @{ + */ +/* Time Base functions ********************************************************/ +HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, 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_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); +uint32_t HAL_TIM_ReadCapturedValue(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); + +/* Peripheral Channel state functions ************************************************/ +HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(TIM_HandleTypeDef *htim); +HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(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_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_DMAError(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +void TIM_ResetCallback(TIM_HandleTypeDef *htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F4xx_HAL_TIM_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h new file mode 100644 index 0000000..39fb500 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h @@ -0,0 +1,354 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim_ex.h + * @author MCD Application Team + * @brief Header file of TIM HAL Extended module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F4xx_HAL_TIM_EX_H +#define STM32F4xx_HAL_TIM_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup TIMEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Types TIM Extended Exported Types + * @{ + */ + +/** + * @brief TIM Hall sensor Configuration Structure definition + */ + +typedef struct +{ + uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. + This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + + uint32_t IC1Prescaler; /*!< Specifies the Input Capture Prescaler. + This parameter can be a value of @ref TIM_Input_Capture_Prescaler */ + + uint32_t IC1Filter; /*!< Specifies the input capture filter. + This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + + uint32_t Commutation_Delay; /*!< Specifies the pulse value to be loaded into the Capture Compare Register. + This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */ +} TIM_HallSensor_InitTypeDef; +/** + * @} + */ +/* End of exported types -----------------------------------------------------*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Constants TIM Extended Exported Constants + * @{ + */ + +/** @defgroup TIMEx_Remap TIM Extended Remapping + * @{ + */ +#if defined (TIM2) +#if defined(TIM8) +#define TIM_TIM2_TIM8_TRGO 0x00000000U /*!< TIM2 ITR1 is connected to TIM8 TRGO */ +#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); +HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(TIM_HandleTypeDef *htim, uint32_t ChannelN); +/** + * @} + */ + +/** + * @} + */ +/* End of exported functions -------------------------------------------------*/ + +/* Private functions----------------------------------------------------------*/ +/** @addtogroup TIMEx_Private_Functions TIM Extended Private Functions + * @{ + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* STM32F4xx_HAL_TIM_EX_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h new file mode 100644 index 0000000..c5f5d3e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h @@ -0,0 +1,884 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_uart.h + * @author MCD Application Team + * @brief Header file of UART HAL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_UART_H +#define __STM32F4xx_HAL_UART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal_def.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup UART + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup UART_Exported_Types UART Exported Types + * @{ + */ + +/** + * @brief UART Init Structure definition + */ +typedef struct +{ + uint32_t BaudRate; /*!< This member configures the UART communication baud rate. + The baud rate is computed using the following formula: + - IntegerDivider = ((PCLKx) / (8 * (OVR8+1) * (huart->Init.BaudRate))) + - FractionalDivider = ((IntegerDivider - ((uint32_t) IntegerDivider)) * 8 * (OVR8+1)) + 0.5 + Where OVR8 is the "oversampling by 8 mode" configuration bit in the CR1 register. */ + + uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref UART_Word_Length */ + + uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref UART_Stop_Bits */ + + uint32_t Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref UART_Parity + @note When parity is enabled, the computed parity is inserted + at the MSB position of the transmitted data (9th bit when + the word length is set to 9 data bits; 8th bit when the + word length is set to 8 data bits). */ + + uint32_t Mode; /*!< Specifies whether the Receive or Transmit mode is enabled or disabled. + This parameter can be a value of @ref UART_Mode */ + + uint32_t HwFlowCtl; /*!< Specifies whether the hardware flow control mode is enabled or disabled. + This parameter can be a value of @ref UART_Hardware_Flow_Control */ + + uint32_t OverSampling; /*!< Specifies whether the Over sampling 8 is enabled or disabled, to achieve higher speed (up to fPCLK/8). + This parameter can be a value of @ref UART_Over_Sampling */ +} UART_InitTypeDef; + +/** + * @brief HAL UART State structures definition + * @note HAL UART State value is a combination of 2 different substates: gState and RxState. + * - gState contains UART state information related to global Handle management + * and also information related to Tx operations. + * gState value coding follow below described bitmap : + * b7-b6 Error information + * 00 : No Error + * 01 : (Not Used) + * 10 : Timeout + * 11 : Error + * b5 Peripheral initialization status + * 0 : Reset (Peripheral not initialized) + * 1 : Init done (Peripheral initialized. HAL UART Init function already called) + * b4-b3 (not used) + * xx : Should be set to 00 + * b2 Intrinsic process state + * 0 : Ready + * 1 : Busy (Peripheral busy with some configuration or internal operations) + * b1 (not used) + * x : Should be set to 0 + * b0 Tx state + * 0 : Ready (no Tx operation ongoing) + * 1 : Busy (Tx operation ongoing) + * - RxState contains information related to Rx operations. + * RxState value coding follow below described bitmap : + * b7-b6 (not used) + * xx : Should be set to 00 + * b5 Peripheral initialization status + * 0 : Reset (Peripheral not initialized) + * 1 : Init done (Peripheral initialized) + * b4-b2 (not used) + * xxx : Should be set to 000 + * b1 Rx state + * 0 : Ready (no Rx operation ongoing) + * 1 : Busy (Rx operation ongoing) + * b0 (not used) + * x : Should be set to 0. + */ +typedef enum +{ + HAL_UART_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized + Value is allowed for gState and RxState */ + HAL_UART_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use + Value is allowed for gState and RxState */ + HAL_UART_STATE_BUSY = 0x24U, /*!< an internal process is ongoing + Value is allowed for gState only */ + HAL_UART_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing + Value is allowed for gState only */ + HAL_UART_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing + Value is allowed for RxState only */ + HAL_UART_STATE_BUSY_TX_RX = 0x23U, /*!< Data Transmission and Reception process is ongoing + Not to be used for neither gState nor RxState. + Value is result of combination (Or) between gState and RxState values */ + HAL_UART_STATE_TIMEOUT = 0xA0U, /*!< Timeout state + Value is allowed for gState only */ + HAL_UART_STATE_ERROR = 0xE0U /*!< Error + Value is allowed for gState only */ +} HAL_UART_StateTypeDef; + +/** + * @brief HAL UART Reception type definition + * @note HAL UART Reception type value aims to identify which type of Reception is ongoing. + * It is expected to admit following values : + * HAL_UART_RECEPTION_STANDARD = 0x00U, + * HAL_UART_RECEPTION_TOIDLE = 0x01U, + */ +typedef uint32_t HAL_UART_RxTypeTypeDef; + +/** + * @brief UART handle Structure definition + */ +typedef struct __UART_HandleTypeDef +{ + USART_TypeDef *Instance; /*!< UART registers base address */ + + UART_InitTypeDef Init; /*!< UART communication parameters */ + + const uint8_t *pTxBuffPtr; /*!< Pointer to UART Tx transfer Buffer */ + + uint16_t TxXferSize; /*!< UART Tx Transfer size */ + + __IO uint16_t TxXferCount; /*!< UART Tx Transfer Counter */ + + uint8_t *pRxBuffPtr; /*!< Pointer to UART Rx transfer Buffer */ + + uint16_t RxXferSize; /*!< UART Rx Transfer size */ + + __IO uint16_t RxXferCount; /*!< UART Rx Transfer Counter */ + + __IO HAL_UART_RxTypeTypeDef ReceptionType; /*!< Type of ongoing reception */ + + DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ + + DMA_HandleTypeDef *hdmarx; /*!< UART Rx DMA Handle parameters */ + + HAL_LockTypeDef Lock; /*!< Locking object */ + + __IO HAL_UART_StateTypeDef gState; /*!< UART state information related to global Handle management + and also related to Tx operations. + This parameter can be a value of @ref HAL_UART_StateTypeDef */ + + __IO HAL_UART_StateTypeDef RxState; /*!< UART state information related to Rx operations. + This parameter can be a value of @ref HAL_UART_StateTypeDef */ + + __IO uint32_t ErrorCode; /*!< UART Error code */ + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + void (* TxHalfCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Tx Half Complete Callback */ + void (* TxCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Tx Complete Callback */ + void (* RxHalfCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Rx Half Complete Callback */ + void (* RxCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Rx Complete Callback */ + void (* ErrorCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Error Callback */ + void (* AbortCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Complete Callback */ + void (* AbortTransmitCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Transmit Complete Callback */ + void (* AbortReceiveCpltCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Abort Receive Complete Callback */ + void (* WakeupCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Wakeup Callback */ + void (* RxEventCallback)(struct __UART_HandleTypeDef *huart, uint16_t Pos); /*!< UART Reception Event Callback */ + + void (* MspInitCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Msp Init callback */ + void (* MspDeInitCallback)(struct __UART_HandleTypeDef *huart); /*!< UART Msp DeInit callback */ +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +} UART_HandleTypeDef; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +/** + * @brief HAL UART Callback ID enumeration definition + */ +typedef enum +{ + HAL_UART_TX_HALFCOMPLETE_CB_ID = 0x00U, /*!< UART Tx Half Complete Callback ID */ + HAL_UART_TX_COMPLETE_CB_ID = 0x01U, /*!< UART Tx Complete Callback ID */ + HAL_UART_RX_HALFCOMPLETE_CB_ID = 0x02U, /*!< UART Rx Half Complete Callback ID */ + HAL_UART_RX_COMPLETE_CB_ID = 0x03U, /*!< UART Rx Complete Callback ID */ + HAL_UART_ERROR_CB_ID = 0x04U, /*!< UART Error Callback ID */ + HAL_UART_ABORT_COMPLETE_CB_ID = 0x05U, /*!< UART Abort Complete Callback ID */ + HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID = 0x06U, /*!< UART Abort Transmit Complete Callback ID */ + HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID = 0x07U, /*!< UART Abort Receive Complete Callback ID */ + HAL_UART_WAKEUP_CB_ID = 0x08U, /*!< UART Wakeup Callback ID */ + + HAL_UART_MSPINIT_CB_ID = 0x0BU, /*!< UART MspInit callback ID */ + HAL_UART_MSPDEINIT_CB_ID = 0x0CU /*!< UART MspDeInit callback ID */ + +} HAL_UART_CallbackIDTypeDef; + +/** + * @brief HAL UART Callback pointer definition + */ +typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer to an UART callback function */ +typedef void (*pUART_RxEventCallbackTypeDef)(struct __UART_HandleTypeDef *huart, uint16_t Pos); /*!< pointer to a UART Rx Event specific callback function */ + +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup UART_Exported_Constants UART Exported Constants + * @{ + */ + +/** @defgroup UART_Error_Code UART Error Code + * @{ + */ +#define HAL_UART_ERROR_NONE 0x00000000U /*!< No error */ +#define HAL_UART_ERROR_PE 0x00000001U /*!< Parity error */ +#define HAL_UART_ERROR_NE 0x00000002U /*!< Noise error */ +#define HAL_UART_ERROR_FE 0x00000004U /*!< Frame error */ +#define HAL_UART_ERROR_ORE 0x00000008U /*!< Overrun error */ +#define HAL_UART_ERROR_DMA 0x00000010U /*!< DMA transfer error */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +#define HAL_UART_ERROR_INVALID_CALLBACK 0x00000020U /*!< Invalid Callback error */ +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +/** + * @} + */ + +/** @defgroup UART_Word_Length UART Word Length + * @{ + */ +#define UART_WORDLENGTH_8B 0x00000000U +#define UART_WORDLENGTH_9B ((uint32_t)USART_CR1_M) +/** + * @} + */ + +/** @defgroup UART_Stop_Bits UART Number of Stop Bits + * @{ + */ +#define UART_STOPBITS_1 0x00000000U +#define UART_STOPBITS_2 ((uint32_t)USART_CR2_STOP_1) +/** + * @} + */ + +/** @defgroup UART_Parity UART Parity + * @{ + */ +#define UART_PARITY_NONE 0x00000000U +#define UART_PARITY_EVEN ((uint32_t)USART_CR1_PCE) +#define UART_PARITY_ODD ((uint32_t)(USART_CR1_PCE | USART_CR1_PS)) +/** + * @} + */ + +/** @defgroup UART_Hardware_Flow_Control UART Hardware Flow Control + * @{ + */ +#define UART_HWCONTROL_NONE 0x00000000U +#define UART_HWCONTROL_RTS ((uint32_t)USART_CR3_RTSE) +#define UART_HWCONTROL_CTS ((uint32_t)USART_CR3_CTSE) +#define UART_HWCONTROL_RTS_CTS ((uint32_t)(USART_CR3_RTSE | USART_CR3_CTSE)) +/** + * @} + */ + +/** @defgroup UART_Mode UART Transfer Mode + * @{ + */ +#define UART_MODE_RX ((uint32_t)USART_CR1_RE) +#define UART_MODE_TX ((uint32_t)USART_CR1_TE) +#define UART_MODE_TX_RX ((uint32_t)(USART_CR1_TE | USART_CR1_RE)) +/** + * @} + */ + +/** @defgroup UART_State UART State + * @{ + */ +#define UART_STATE_DISABLE 0x00000000U +#define UART_STATE_ENABLE ((uint32_t)USART_CR1_UE) +/** + * @} + */ + +/** @defgroup UART_Over_Sampling UART Over Sampling + * @{ + */ +#define UART_OVERSAMPLING_16 0x00000000U +#define UART_OVERSAMPLING_8 ((uint32_t)USART_CR1_OVER8) +/** + * @} + */ + +/** @defgroup UART_LIN_Break_Detection_Length UART LIN Break Detection Length + * @{ + */ +#define UART_LINBREAKDETECTLENGTH_10B 0x00000000U +#define UART_LINBREAKDETECTLENGTH_11B ((uint32_t)USART_CR2_LBDL) +/** + * @} + */ + +/** @defgroup UART_WakeUp_functions UART Wakeup Functions + * @{ + */ +#define UART_WAKEUPMETHOD_IDLELINE 0x00000000U +#define UART_WAKEUPMETHOD_ADDRESSMARK ((uint32_t)USART_CR1_WAKE) +/** + * @} + */ + +/** @defgroup UART_Flags UART FLags + * Elements values convention: 0xXXXX + * - 0xXXXX : Flag mask in the SR register + * @{ + */ +#define UART_FLAG_CTS ((uint32_t)USART_SR_CTS) +#define UART_FLAG_LBD ((uint32_t)USART_SR_LBD) +#define UART_FLAG_TXE ((uint32_t)USART_SR_TXE) +#define UART_FLAG_TC ((uint32_t)USART_SR_TC) +#define UART_FLAG_RXNE ((uint32_t)USART_SR_RXNE) +#define UART_FLAG_IDLE ((uint32_t)USART_SR_IDLE) +#define UART_FLAG_ORE ((uint32_t)USART_SR_ORE) +#define UART_FLAG_NE ((uint32_t)USART_SR_NE) +#define UART_FLAG_FE ((uint32_t)USART_SR_FE) +#define UART_FLAG_PE ((uint32_t)USART_SR_PE) +/** + * @} + */ + +/** @defgroup UART_Interrupt_definition UART Interrupt Definitions + * Elements values convention: 0xY000XXXX + * - XXXX : Interrupt mask (16 bits) in the Y register + * - Y : Interrupt source register (2bits) + * - 0001: CR1 register + * - 0010: CR2 register + * - 0011: CR3 register + * @{ + */ + +#define UART_IT_PE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_PEIE)) +#define UART_IT_TXE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TXEIE)) +#define UART_IT_TC ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TCIE)) +#define UART_IT_RXNE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_RXNEIE)) +#define UART_IT_IDLE ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_IDLEIE)) + +#define UART_IT_LBD ((uint32_t)(UART_CR2_REG_INDEX << 28U | USART_CR2_LBDIE)) + +#define UART_IT_CTS ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_CTSIE)) +#define UART_IT_ERR ((uint32_t)(UART_CR3_REG_INDEX << 28U | USART_CR3_EIE)) +/** + * @} + */ + +/** @defgroup UART_RECEPTION_TYPE_Values UART Reception type values + * @{ + */ +#define HAL_UART_RECEPTION_STANDARD (0x00000000U) /*!< Standard reception */ +#define HAL_UART_RECEPTION_TOIDLE (0x00000001U) /*!< Reception till completion or IDLE event */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup UART_Exported_Macros UART Exported Macros + * @{ + */ + +/** @brief Reset UART handle gstate & RxState + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__) do{ \ + (__HANDLE__)->gState = HAL_UART_STATE_RESET; \ + (__HANDLE__)->RxState = HAL_UART_STATE_RESET; \ + (__HANDLE__)->MspInitCallback = NULL; \ + (__HANDLE__)->MspDeInitCallback = NULL; \ + } while(0U) +#else +#define __HAL_UART_RESET_HANDLE_STATE(__HANDLE__) do{ \ + (__HANDLE__)->gState = HAL_UART_STATE_RESET; \ + (__HANDLE__)->RxState = HAL_UART_STATE_RESET; \ + } while(0U) +#endif /*USE_HAL_UART_REGISTER_CALLBACKS */ + +/** @brief Flushes the UART DR register + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + */ +#define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__) ((__HANDLE__)->Instance->DR) + +/** @brief Checks whether the specified UART flag is set or not. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg UART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5) + * @arg UART_FLAG_LBD: LIN Break detection flag + * @arg UART_FLAG_TXE: Transmit data register empty flag + * @arg UART_FLAG_TC: Transmission Complete flag + * @arg UART_FLAG_RXNE: Receive data register not empty flag + * @arg UART_FLAG_IDLE: Idle Line detection flag + * @arg UART_FLAG_ORE: Overrun Error flag + * @arg UART_FLAG_NE: Noise Error flag + * @arg UART_FLAG_FE: Framing Error flag + * @arg UART_FLAG_PE: Parity Error flag + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__)) + +/** @brief Clears the specified UART pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __FLAG__ specifies the flag to check. + * This parameter can be any combination of the following values: + * @arg UART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5). + * @arg UART_FLAG_LBD: LIN Break detection flag. + * @arg UART_FLAG_TC: Transmission Complete flag. + * @arg UART_FLAG_RXNE: Receive data register not empty flag. + * + * @note PE (Parity error), FE (Framing error), NE (Noise error), ORE (Overrun + * error) and IDLE (Idle line detected) flags are cleared by software + * sequence: a read operation to USART_SR register followed by a read + * operation to USART_DR register. + * @note RXNE flag can be also cleared by a read to the USART_DR register. + * @note TC flag can be also cleared by software sequence: a read operation to + * USART_SR register followed by a write operation to USART_DR register. + * @note TXE flag is cleared only by a write to the USART_DR register. + * + * @retval None + */ +#define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR = ~(__FLAG__)) + +/** @brief Clears the UART PE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_PEFLAG(__HANDLE__) \ + do{ \ + __IO uint32_t tmpreg = 0x00U; \ + tmpreg = (__HANDLE__)->Instance->SR; \ + tmpreg = (__HANDLE__)->Instance->DR; \ + UNUSED(tmpreg); \ + } while(0U) + +/** @brief Clears the UART FE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_FEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) + +/** @brief Clears the UART NE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_NEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) + +/** @brief Clears the UART ORE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_OREFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) + +/** @brief Clears the UART IDLE pending flag. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @retval None + */ +#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__) __HAL_UART_CLEAR_PEFLAG(__HANDLE__) + +/** @brief Enable the specified UART interrupt. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __INTERRUPT__ specifies the UART interrupt source to enable. + * This parameter can be one of the following values: + * @arg UART_IT_CTS: CTS change interrupt + * @arg UART_IT_LBD: LIN Break detection interrupt + * @arg UART_IT_TXE: Transmit Data Register empty interrupt + * @arg UART_IT_TC: Transmission complete interrupt + * @arg UART_IT_RXNE: Receive Data register not empty interrupt + * @arg UART_IT_IDLE: Idle line detection interrupt + * @arg UART_IT_PE: Parity Error interrupt + * @arg UART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) + * @retval None + */ +#define __HAL_UART_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): \ + (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): \ + ((__HANDLE__)->Instance->CR3 |= ((__INTERRUPT__) & UART_IT_MASK))) + +/** @brief Disable the specified UART interrupt. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __INTERRUPT__ specifies the UART interrupt source to disable. + * This parameter can be one of the following values: + * @arg UART_IT_CTS: CTS change interrupt + * @arg UART_IT_LBD: LIN Break detection interrupt + * @arg UART_IT_TXE: Transmit Data Register empty interrupt + * @arg UART_IT_TC: Transmission complete interrupt + * @arg UART_IT_RXNE: Receive Data register not empty interrupt + * @arg UART_IT_IDLE: Idle line detection interrupt + * @arg UART_IT_PE: Parity Error interrupt + * @arg UART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) + * @retval None + */ +#define __HAL_UART_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__HANDLE__)->Instance->CR1 &= ~((__INTERRUPT__) & UART_IT_MASK)): \ + (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__HANDLE__)->Instance->CR2 &= ~((__INTERRUPT__) & UART_IT_MASK)): \ + ((__HANDLE__)->Instance->CR3 &= ~ ((__INTERRUPT__) & UART_IT_MASK))) + +/** @brief Checks whether the specified UART interrupt source is enabled or not. + * @param __HANDLE__ specifies the UART Handle. + * UART Handle selects the USARTx or UARTy peripheral + * (USART,UART availability and x,y values depending on device). + * @param __IT__ specifies the UART interrupt source to check. + * This parameter can be one of the following values: + * @arg UART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) + * @arg UART_IT_LBD: LIN Break detection interrupt + * @arg UART_IT_TXE: Transmit Data Register empty interrupt + * @arg UART_IT_TC: Transmission complete interrupt + * @arg UART_IT_RXNE: Receive Data register not empty interrupt + * @arg UART_IT_IDLE: Idle line detection interrupt + * @arg UART_IT_ERR: Error interrupt + * @retval The new state of __IT__ (TRUE or FALSE). + */ +#define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __IT__) (((((__IT__) >> 28U) == UART_CR1_REG_INDEX)? (__HANDLE__)->Instance->CR1:(((((uint32_t)(__IT__)) >> 28U) == UART_CR2_REG_INDEX)? \ + (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & (((uint32_t)(__IT__)) & UART_IT_MASK)) + +/** @brief Enable CTS flow control + * @note This macro allows to enable CTS hardware flow control for a given UART instance, + * without need to call HAL_UART_Init() function. + * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. + * @note As macro is expected to be used for modifying CTS Hw flow control feature activation, without need + * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : + * - UART instance should have already been initialised (through call of HAL_UART_Init() ) + * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) + * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). + * @param __HANDLE__ specifies the UART Handle. + * The Handle Instance can be any USARTx (supporting the HW Flow control feature). + * It is used to select the USART peripheral (USART availability and x value depending on device). + * @retval None + */ +#define __HAL_UART_HWCONTROL_CTS_ENABLE(__HANDLE__) \ + do{ \ + ATOMIC_SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ + (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_CTSE; \ + } while(0U) + +/** @brief Disable CTS flow control + * @note This macro allows to disable CTS hardware flow control for a given UART instance, + * without need to call HAL_UART_Init() function. + * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. + * @note As macro is expected to be used for modifying CTS Hw flow control feature activation, without need + * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : + * - UART instance should have already been initialised (through call of HAL_UART_Init() ) + * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) + * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). + * @param __HANDLE__ specifies the UART Handle. + * The Handle Instance can be any USARTx (supporting the HW Flow control feature). + * It is used to select the USART peripheral (USART availability and x value depending on device). + * @retval None + */ +#define __HAL_UART_HWCONTROL_CTS_DISABLE(__HANDLE__) \ + do{ \ + ATOMIC_CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_CTSE); \ + (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_CTSE); \ + } while(0U) + +/** @brief Enable RTS flow control + * This macro allows to enable RTS hardware flow control for a given UART instance, + * without need to call HAL_UART_Init() function. + * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. + * @note As macro is expected to be used for modifying RTS Hw flow control feature activation, without need + * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : + * - UART instance should have already been initialised (through call of HAL_UART_Init() ) + * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) + * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). + * @param __HANDLE__ specifies the UART Handle. + * The Handle Instance can be any USARTx (supporting the HW Flow control feature). + * It is used to select the USART peripheral (USART availability and x value depending on device). + * @retval None + */ +#define __HAL_UART_HWCONTROL_RTS_ENABLE(__HANDLE__) \ + do{ \ + ATOMIC_SET_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE); \ + (__HANDLE__)->Init.HwFlowCtl |= USART_CR3_RTSE; \ + } while(0U) + +/** @brief Disable RTS flow control + * This macro allows to disable RTS hardware flow control for a given UART instance, + * without need to call HAL_UART_Init() function. + * As involving direct access to UART registers, usage of this macro should be fully endorsed by user. + * @note As macro is expected to be used for modifying RTS Hw flow control feature activation, without need + * for USART instance Deinit/Init, following conditions for macro call should be fulfilled : + * - UART instance should have already been initialised (through call of HAL_UART_Init() ) + * - macro could only be called when corresponding UART instance is disabled (i.e __HAL_UART_DISABLE(__HANDLE__)) + * and should be followed by an Enable macro (i.e __HAL_UART_ENABLE(__HANDLE__)). + * @param __HANDLE__ specifies the UART Handle. + * The Handle Instance can be any USARTx (supporting the HW Flow control feature). + * It is used to select the USART peripheral (USART availability and x value depending on device). + * @retval None + */ +#define __HAL_UART_HWCONTROL_RTS_DISABLE(__HANDLE__) \ + do{ \ + ATOMIC_CLEAR_BIT((__HANDLE__)->Instance->CR3, USART_CR3_RTSE);\ + (__HANDLE__)->Init.HwFlowCtl &= ~(USART_CR3_RTSE); \ + } while(0U) + +/** @brief Macro to enable the UART's one bit sample method + * @param __HANDLE__ specifies the UART Handle. + * @retval None + */ +#define __HAL_UART_ONE_BIT_SAMPLE_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3|= USART_CR3_ONEBIT) + +/** @brief Macro to disable the UART's one bit sample method + * @param __HANDLE__ specifies the UART Handle. + * @retval None + */ +#define __HAL_UART_ONE_BIT_SAMPLE_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR3\ + &= (uint16_t)~((uint16_t)USART_CR3_ONEBIT)) + +/** @brief Enable UART + * @param __HANDLE__ specifies the UART Handle. + * @retval None + */ +#define __HAL_UART_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 |= USART_CR1_UE) + +/** @brief Disable UART + * @param __HANDLE__ specifies the UART Handle. + * @retval None + */ +#define __HAL_UART_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1 &= ~USART_CR1_UE) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup UART_Exported_Functions + * @{ + */ + +/** @addtogroup UART_Exported_Functions_Group1 Initialization and de-initialization functions + * @{ + */ + +/* Initialization/de-initialization functions **********************************/ +HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength); +HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod); +HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart); +void HAL_UART_MspInit(UART_HandleTypeDef *huart); +void HAL_UART_MspDeInit(UART_HandleTypeDef *huart); + +/* Callbacks Register/UnRegister functions ***********************************/ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID); + +HAL_StatusTypeDef HAL_UART_RegisterRxEventCallback(UART_HandleTypeDef *huart, pUART_RxEventCallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_UART_UnRegisterRxEventCallback(UART_HandleTypeDef *huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @addtogroup UART_Exported_Functions_Group2 IO operation functions + * @{ + */ + +/* IO operation functions *******************************************************/ +HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); +HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart); + +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, + uint32_t Timeout); +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); + +/* Transfer Abort functions */ +HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart); + +void HAL_UART_IRQHandler(UART_HandleTypeDef *huart); +void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart); +void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart); +void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart); + +void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size); + +/** + * @} + */ + +/** @addtogroup UART_Exported_Functions_Group3 + * @{ + */ +/* Peripheral Control functions ************************************************/ +HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart); +/** + * @} + */ + +/** @addtogroup UART_Exported_Functions_Group4 + * @{ + */ +/* Peripheral State functions **************************************************/ +HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart); +uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart); +/** + * @} + */ + +/** + * @} + */ +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup UART_Private_Constants UART Private Constants + * @{ + */ +/** @brief UART interruptions flag mask + * + */ +#define UART_IT_MASK 0x0000FFFFU + +#define UART_CR1_REG_INDEX 1U +#define UART_CR2_REG_INDEX 2U +#define UART_CR3_REG_INDEX 3U +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup UART_Private_Macros UART Private Macros + * @{ + */ +#define IS_UART_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B) || \ + ((LENGTH) == UART_WORDLENGTH_9B)) +#define IS_UART_LIN_WORD_LENGTH(LENGTH) (((LENGTH) == UART_WORDLENGTH_8B)) +#define IS_UART_STOPBITS(STOPBITS) (((STOPBITS) == UART_STOPBITS_1) || \ + ((STOPBITS) == UART_STOPBITS_2)) +#define IS_UART_PARITY(PARITY) (((PARITY) == UART_PARITY_NONE) || \ + ((PARITY) == UART_PARITY_EVEN) || \ + ((PARITY) == UART_PARITY_ODD)) +#define IS_UART_HARDWARE_FLOW_CONTROL(CONTROL)\ + (((CONTROL) == UART_HWCONTROL_NONE) || \ + ((CONTROL) == UART_HWCONTROL_RTS) || \ + ((CONTROL) == UART_HWCONTROL_CTS) || \ + ((CONTROL) == UART_HWCONTROL_RTS_CTS)) +#define IS_UART_MODE(MODE) ((((MODE) & 0x0000FFF3U) == 0x00U) && ((MODE) != 0x00U)) +#define IS_UART_STATE(STATE) (((STATE) == UART_STATE_DISABLE) || \ + ((STATE) == UART_STATE_ENABLE)) +#define IS_UART_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16) || \ + ((SAMPLING) == UART_OVERSAMPLING_8)) +#define IS_UART_LIN_OVERSAMPLING(SAMPLING) (((SAMPLING) == UART_OVERSAMPLING_16)) +#define IS_UART_LIN_BREAK_DETECT_LENGTH(LENGTH) (((LENGTH) == UART_LINBREAKDETECTLENGTH_10B) || \ + ((LENGTH) == UART_LINBREAKDETECTLENGTH_11B)) +#define IS_UART_WAKEUPMETHOD(WAKEUP) (((WAKEUP) == UART_WAKEUPMETHOD_IDLELINE) || \ + ((WAKEUP) == UART_WAKEUPMETHOD_ADDRESSMARK)) +#define IS_UART_BAUDRATE(BAUDRATE) ((BAUDRATE) <= 10500000U) +#define IS_UART_ADDRESS(ADDRESS) ((ADDRESS) <= 0x0FU) + +#define UART_DIV_SAMPLING16(_PCLK_, _BAUD_) ((uint32_t)((((uint64_t)(_PCLK_))*25U)/(4U*((uint64_t)(_BAUD_))))) +#define UART_DIVMANT_SAMPLING16(_PCLK_, _BAUD_) (UART_DIV_SAMPLING16((_PCLK_), (_BAUD_))/100U) +#define UART_DIVFRAQ_SAMPLING16(_PCLK_, _BAUD_) ((((UART_DIV_SAMPLING16((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) * 100U)) * 16U)\ + + 50U) / 100U) +/* UART BRR = mantissa + overflow + fraction + = (UART DIVMANT << 4) + (UART DIVFRAQ & 0xF0) + (UART DIVFRAQ & 0x0FU) */ +#define UART_BRR_SAMPLING16(_PCLK_, _BAUD_) ((UART_DIVMANT_SAMPLING16((_PCLK_), (_BAUD_)) << 4U) + \ + (UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0xF0U) + \ + (UART_DIVFRAQ_SAMPLING16((_PCLK_), (_BAUD_)) & 0x0FU)) + +#define UART_DIV_SAMPLING8(_PCLK_, _BAUD_) ((uint32_t)((((uint64_t)(_PCLK_))*25U)/(2U*((uint64_t)(_BAUD_))))) +#define UART_DIVMANT_SAMPLING8(_PCLK_, _BAUD_) (UART_DIV_SAMPLING8((_PCLK_), (_BAUD_))/100U) +#define UART_DIVFRAQ_SAMPLING8(_PCLK_, _BAUD_) ((((UART_DIV_SAMPLING8((_PCLK_), (_BAUD_)) - (UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) * 100U)) * 8U)\ + + 50U) / 100U) +/* UART BRR = mantissa + overflow + fraction + = (UART DIVMANT << 4) + ((UART DIVFRAQ & 0xF8) << 1) + (UART DIVFRAQ & 0x07U) */ +#define UART_BRR_SAMPLING8(_PCLK_, _BAUD_) ((UART_DIVMANT_SAMPLING8((_PCLK_), (_BAUD_)) << 4U) + \ + ((UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0xF8U) << 1U) + \ + (UART_DIVFRAQ_SAMPLING8((_PCLK_), (_BAUD_)) & 0x07U)) + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup UART_Private_Functions UART Private Functions + * @{ + */ + +HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); +HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_UART_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h new file mode 100644 index 0000000..5083c10 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h @@ -0,0 +1,2105 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_bus.h + * @author MCD Application Team + * @brief Header file of BUS LL module. + + @verbatim + ##### RCC Limitations ##### + ============================================================================== + [..] + A delay between an RCC peripheral clock enable and the effective peripheral + enabling should be taken into account in order to manage the peripheral read/write + from/to registers. + (+) This delay depends on the peripheral mapping. + (++) AHB & APB peripherals, 1 dummy read is necessary + + [..] + Workarounds: + (#) For AHB & APB peripherals, a dummy read to the peripheral register has been + inserted in each LL_{BUS}_GRP{x}_EnableClock() function. + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_BUS_H +#define __STM32F4xx_LL_BUS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @defgroup BUS_LL BUS + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup BUS_LL_Exported_Constants BUS Exported Constants + * @{ + */ + +/** @defgroup BUS_LL_EC_AHB1_GRP1_PERIPH AHB1 GRP1 PERIPH + * @{ + */ +#define LL_AHB1_GRP1_PERIPH_ALL 0xFFFFFFFFU +#define LL_AHB1_GRP1_PERIPH_GPIOA RCC_AHB1ENR_GPIOAEN +#define LL_AHB1_GRP1_PERIPH_GPIOB RCC_AHB1ENR_GPIOBEN +#define LL_AHB1_GRP1_PERIPH_GPIOC RCC_AHB1ENR_GPIOCEN +#if defined(GPIOD) +#define LL_AHB1_GRP1_PERIPH_GPIOD RCC_AHB1ENR_GPIODEN +#endif /* GPIOD */ +#if defined(GPIOE) +#define LL_AHB1_GRP1_PERIPH_GPIOE RCC_AHB1ENR_GPIOEEN +#endif /* GPIOE */ +#if defined(GPIOF) +#define LL_AHB1_GRP1_PERIPH_GPIOF RCC_AHB1ENR_GPIOFEN +#endif /* GPIOF */ +#if defined(GPIOG) +#define LL_AHB1_GRP1_PERIPH_GPIOG RCC_AHB1ENR_GPIOGEN +#endif /* GPIOG */ +#if defined(GPIOH) +#define LL_AHB1_GRP1_PERIPH_GPIOH RCC_AHB1ENR_GPIOHEN +#endif /* GPIOH */ +#if defined(GPIOI) +#define LL_AHB1_GRP1_PERIPH_GPIOI RCC_AHB1ENR_GPIOIEN +#endif /* GPIOI */ +#if defined(GPIOJ) +#define LL_AHB1_GRP1_PERIPH_GPIOJ RCC_AHB1ENR_GPIOJEN +#endif /* GPIOJ */ +#if defined(GPIOK) +#define LL_AHB1_GRP1_PERIPH_GPIOK RCC_AHB1ENR_GPIOKEN +#endif /* GPIOK */ +#define LL_AHB1_GRP1_PERIPH_CRC RCC_AHB1ENR_CRCEN +#if defined(RCC_AHB1ENR_BKPSRAMEN) +#define LL_AHB1_GRP1_PERIPH_BKPSRAM RCC_AHB1ENR_BKPSRAMEN +#endif /* RCC_AHB1ENR_BKPSRAMEN */ +#if defined(RCC_AHB1ENR_CCMDATARAMEN) +#define LL_AHB1_GRP1_PERIPH_CCMDATARAM RCC_AHB1ENR_CCMDATARAMEN +#endif /* RCC_AHB1ENR_CCMDATARAMEN */ +#define LL_AHB1_GRP1_PERIPH_DMA1 RCC_AHB1ENR_DMA1EN +#define LL_AHB1_GRP1_PERIPH_DMA2 RCC_AHB1ENR_DMA2EN +#if defined(RCC_AHB1ENR_RNGEN) +#define LL_AHB1_GRP1_PERIPH_RNG RCC_AHB1ENR_RNGEN +#endif /* RCC_AHB1ENR_RNGEN */ +#if defined(DMA2D) +#define LL_AHB1_GRP1_PERIPH_DMA2D RCC_AHB1ENR_DMA2DEN +#endif /* DMA2D */ +#if defined(ETH) +#define LL_AHB1_GRP1_PERIPH_ETHMAC RCC_AHB1ENR_ETHMACEN +#define LL_AHB1_GRP1_PERIPH_ETHMACTX RCC_AHB1ENR_ETHMACTXEN +#define LL_AHB1_GRP1_PERIPH_ETHMACRX RCC_AHB1ENR_ETHMACRXEN +#define LL_AHB1_GRP1_PERIPH_ETHMACPTP RCC_AHB1ENR_ETHMACPTPEN +#endif /* ETH */ +#if defined(USB_OTG_HS) +#define LL_AHB1_GRP1_PERIPH_OTGHS RCC_AHB1ENR_OTGHSEN +#define LL_AHB1_GRP1_PERIPH_OTGHSULPI RCC_AHB1ENR_OTGHSULPIEN +#endif /* USB_OTG_HS */ +#define LL_AHB1_GRP1_PERIPH_FLITF RCC_AHB1LPENR_FLITFLPEN +#define LL_AHB1_GRP1_PERIPH_SRAM1 RCC_AHB1LPENR_SRAM1LPEN +#if defined(RCC_AHB1LPENR_SRAM2LPEN) +#define LL_AHB1_GRP1_PERIPH_SRAM2 RCC_AHB1LPENR_SRAM2LPEN +#endif /* RCC_AHB1LPENR_SRAM2LPEN */ +#if defined(RCC_AHB1LPENR_SRAM3LPEN) +#define LL_AHB1_GRP1_PERIPH_SRAM3 RCC_AHB1LPENR_SRAM3LPEN +#endif /* RCC_AHB1LPENR_SRAM3LPEN */ +/** + * @} + */ + +#if defined(RCC_AHB2_SUPPORT) +/** @defgroup BUS_LL_EC_AHB2_GRP1_PERIPH AHB2 GRP1 PERIPH + * @{ + */ +#define LL_AHB2_GRP1_PERIPH_ALL 0xFFFFFFFFU +#if defined(DCMI) +#define LL_AHB2_GRP1_PERIPH_DCMI RCC_AHB2ENR_DCMIEN +#endif /* DCMI */ +#if defined(CRYP) +#define LL_AHB2_GRP1_PERIPH_CRYP RCC_AHB2ENR_CRYPEN +#endif /* CRYP */ +#if defined(AES) +#define LL_AHB2_GRP1_PERIPH_AES RCC_AHB2ENR_AESEN +#endif /* AES */ +#if defined(HASH) +#define LL_AHB2_GRP1_PERIPH_HASH RCC_AHB2ENR_HASHEN +#endif /* HASH */ +#if defined(RCC_AHB2ENR_RNGEN) +#define LL_AHB2_GRP1_PERIPH_RNG RCC_AHB2ENR_RNGEN +#endif /* RCC_AHB2ENR_RNGEN */ +#if defined(USB_OTG_FS) +#define LL_AHB2_GRP1_PERIPH_OTGFS RCC_AHB2ENR_OTGFSEN +#endif /* USB_OTG_FS */ +/** + * @} + */ +#endif /* RCC_AHB2_SUPPORT */ + +#if defined(RCC_AHB3_SUPPORT) +/** @defgroup BUS_LL_EC_AHB3_GRP1_PERIPH AHB3 GRP1 PERIPH + * @{ + */ +#define LL_AHB3_GRP1_PERIPH_ALL 0xFFFFFFFFU +#if defined(FSMC_Bank1) +#define LL_AHB3_GRP1_PERIPH_FSMC RCC_AHB3ENR_FSMCEN +#endif /* FSMC_Bank1 */ +#if defined(FMC_Bank1) +#define LL_AHB3_GRP1_PERIPH_FMC RCC_AHB3ENR_FMCEN +#endif /* FMC_Bank1 */ +#if defined(QUADSPI) +#define LL_AHB3_GRP1_PERIPH_QSPI RCC_AHB3ENR_QSPIEN +#endif /* QUADSPI */ +/** + * @} + */ +#endif /* RCC_AHB3_SUPPORT */ + +/** @defgroup BUS_LL_EC_APB1_GRP1_PERIPH APB1 GRP1 PERIPH + * @{ + */ +#define LL_APB1_GRP1_PERIPH_ALL 0xFFFFFFFFU +#if defined(TIM2) +#define LL_APB1_GRP1_PERIPH_TIM2 RCC_APB1ENR_TIM2EN +#endif /* TIM2 */ +#if defined(TIM3) +#define LL_APB1_GRP1_PERIPH_TIM3 RCC_APB1ENR_TIM3EN +#endif /* TIM3 */ +#if defined(TIM4) +#define LL_APB1_GRP1_PERIPH_TIM4 RCC_APB1ENR_TIM4EN +#endif /* TIM4 */ +#define LL_APB1_GRP1_PERIPH_TIM5 RCC_APB1ENR_TIM5EN +#if defined(TIM6) +#define LL_APB1_GRP1_PERIPH_TIM6 RCC_APB1ENR_TIM6EN +#endif /* TIM6 */ +#if defined(TIM7) +#define LL_APB1_GRP1_PERIPH_TIM7 RCC_APB1ENR_TIM7EN +#endif /* TIM7 */ +#if defined(TIM12) +#define LL_APB1_GRP1_PERIPH_TIM12 RCC_APB1ENR_TIM12EN +#endif /* TIM12 */ +#if defined(TIM13) +#define LL_APB1_GRP1_PERIPH_TIM13 RCC_APB1ENR_TIM13EN +#endif /* TIM13 */ +#if defined(TIM14) +#define LL_APB1_GRP1_PERIPH_TIM14 RCC_APB1ENR_TIM14EN +#endif /* TIM14 */ +#if defined(LPTIM1) +#define LL_APB1_GRP1_PERIPH_LPTIM1 RCC_APB1ENR_LPTIM1EN +#endif /* LPTIM1 */ +#if defined(RCC_APB1ENR_RTCAPBEN) +#define LL_APB1_GRP1_PERIPH_RTCAPB RCC_APB1ENR_RTCAPBEN +#endif /* RCC_APB1ENR_RTCAPBEN */ +#define LL_APB1_GRP1_PERIPH_WWDG RCC_APB1ENR_WWDGEN +#if defined(SPI2) +#define LL_APB1_GRP1_PERIPH_SPI2 RCC_APB1ENR_SPI2EN +#endif /* SPI2 */ +#if defined(SPI3) +#define LL_APB1_GRP1_PERIPH_SPI3 RCC_APB1ENR_SPI3EN +#endif /* SPI3 */ +#if defined(SPDIFRX) +#define LL_APB1_GRP1_PERIPH_SPDIFRX RCC_APB1ENR_SPDIFRXEN +#endif /* SPDIFRX */ +#define LL_APB1_GRP1_PERIPH_USART2 RCC_APB1ENR_USART2EN +#if defined(USART3) +#define LL_APB1_GRP1_PERIPH_USART3 RCC_APB1ENR_USART3EN +#endif /* USART3 */ +#if defined(UART4) +#define LL_APB1_GRP1_PERIPH_UART4 RCC_APB1ENR_UART4EN +#endif /* UART4 */ +#if defined(UART5) +#define LL_APB1_GRP1_PERIPH_UART5 RCC_APB1ENR_UART5EN +#endif /* UART5 */ +#define LL_APB1_GRP1_PERIPH_I2C1 RCC_APB1ENR_I2C1EN +#define LL_APB1_GRP1_PERIPH_I2C2 RCC_APB1ENR_I2C2EN +#if defined(I2C3) +#define LL_APB1_GRP1_PERIPH_I2C3 RCC_APB1ENR_I2C3EN +#endif /* I2C3 */ +#if defined(FMPI2C1) +#define LL_APB1_GRP1_PERIPH_FMPI2C1 RCC_APB1ENR_FMPI2C1EN +#endif /* FMPI2C1 */ +#if defined(CAN1) +#define LL_APB1_GRP1_PERIPH_CAN1 RCC_APB1ENR_CAN1EN +#endif /* CAN1 */ +#if defined(CAN2) +#define LL_APB1_GRP1_PERIPH_CAN2 RCC_APB1ENR_CAN2EN +#endif /* CAN2 */ +#if defined(CAN3) +#define LL_APB1_GRP1_PERIPH_CAN3 RCC_APB1ENR_CAN3EN +#endif /* CAN3 */ +#if defined(CEC) +#define LL_APB1_GRP1_PERIPH_CEC RCC_APB1ENR_CECEN +#endif /* CEC */ +#define LL_APB1_GRP1_PERIPH_PWR RCC_APB1ENR_PWREN +#if defined(DAC1) +#define LL_APB1_GRP1_PERIPH_DAC1 RCC_APB1ENR_DACEN +#endif /* DAC1 */ +#if defined(UART7) +#define LL_APB1_GRP1_PERIPH_UART7 RCC_APB1ENR_UART7EN +#endif /* UART7 */ +#if defined(UART8) +#define LL_APB1_GRP1_PERIPH_UART8 RCC_APB1ENR_UART8EN +#endif /* UART8 */ +/** + * @} + */ + +/** @defgroup BUS_LL_EC_APB2_GRP1_PERIPH APB2 GRP1 PERIPH + * @{ + */ +#define LL_APB2_GRP1_PERIPH_ALL 0xFFFFFFFFU +#define LL_APB2_GRP1_PERIPH_TIM1 RCC_APB2ENR_TIM1EN +#if defined(TIM8) +#define LL_APB2_GRP1_PERIPH_TIM8 RCC_APB2ENR_TIM8EN +#endif /* TIM8 */ +#define LL_APB2_GRP1_PERIPH_USART1 RCC_APB2ENR_USART1EN +#if defined(USART6) +#define LL_APB2_GRP1_PERIPH_USART6 RCC_APB2ENR_USART6EN +#endif /* USART6 */ +#if defined(UART9) +#define LL_APB2_GRP1_PERIPH_UART9 RCC_APB2ENR_UART9EN +#endif /* UART9 */ +#if defined(UART10) +#define LL_APB2_GRP1_PERIPH_UART10 RCC_APB2ENR_UART10EN +#endif /* UART10 */ +#define LL_APB2_GRP1_PERIPH_ADC1 RCC_APB2ENR_ADC1EN +#if defined(ADC2) +#define LL_APB2_GRP1_PERIPH_ADC2 RCC_APB2ENR_ADC2EN +#endif /* ADC2 */ +#if defined(ADC3) +#define LL_APB2_GRP1_PERIPH_ADC3 RCC_APB2ENR_ADC3EN +#endif /* ADC3 */ +#if defined(SDIO) +#define LL_APB2_GRP1_PERIPH_SDIO RCC_APB2ENR_SDIOEN +#endif /* SDIO */ +#define LL_APB2_GRP1_PERIPH_SPI1 RCC_APB2ENR_SPI1EN +#if defined(SPI4) +#define LL_APB2_GRP1_PERIPH_SPI4 RCC_APB2ENR_SPI4EN +#endif /* SPI4 */ +#define LL_APB2_GRP1_PERIPH_SYSCFG RCC_APB2ENR_SYSCFGEN +#if defined(RCC_APB2ENR_EXTITEN) +#define LL_APB2_GRP1_PERIPH_EXTI RCC_APB2ENR_EXTITEN +#endif /* RCC_APB2ENR_EXTITEN */ +#define LL_APB2_GRP1_PERIPH_TIM9 RCC_APB2ENR_TIM9EN +#if defined(TIM10) +#define LL_APB2_GRP1_PERIPH_TIM10 RCC_APB2ENR_TIM10EN +#endif /* TIM10 */ +#define LL_APB2_GRP1_PERIPH_TIM11 RCC_APB2ENR_TIM11EN +#if defined(SPI5) +#define LL_APB2_GRP1_PERIPH_SPI5 RCC_APB2ENR_SPI5EN +#endif /* SPI5 */ +#if defined(SPI6) +#define LL_APB2_GRP1_PERIPH_SPI6 RCC_APB2ENR_SPI6EN +#endif /* SPI6 */ +#if defined(SAI1) +#define LL_APB2_GRP1_PERIPH_SAI1 RCC_APB2ENR_SAI1EN +#endif /* SAI1 */ +#if defined(SAI2) +#define LL_APB2_GRP1_PERIPH_SAI2 RCC_APB2ENR_SAI2EN +#endif /* SAI2 */ +#if defined(LTDC) +#define LL_APB2_GRP1_PERIPH_LTDC RCC_APB2ENR_LTDCEN +#endif /* LTDC */ +#if defined(DSI) +#define LL_APB2_GRP1_PERIPH_DSI RCC_APB2ENR_DSIEN +#endif /* DSI */ +#if defined(DFSDM1_Channel0) +#define LL_APB2_GRP1_PERIPH_DFSDM1 RCC_APB2ENR_DFSDM1EN +#endif /* DFSDM1_Channel0 */ +#if defined(DFSDM2_Channel0) +#define LL_APB2_GRP1_PERIPH_DFSDM2 RCC_APB2ENR_DFSDM2EN +#endif /* DFSDM2_Channel0 */ +#define LL_APB2_GRP1_PERIPH_ADC RCC_APB2RSTR_ADCRST +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup BUS_LL_Exported_Functions BUS Exported Functions + * @{ + */ + +/** @defgroup BUS_LL_EF_AHB1 AHB1 + * @{ + */ + +/** + * @brief Enable AHB1 peripherals clock. + * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOBEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOCEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIODEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOEEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOFEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOGEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOHEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOIEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOJEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR GPIOKEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR CRCEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR DMA1EN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR DMA2EN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR RNGEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR DMA2DEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR ETHMACEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR OTGHSEN LL_AHB1_GRP1_EnableClock\n + * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB1ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB1ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if AHB1 peripheral clock is enabled or not + * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOBEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIODEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOEEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOFEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOGEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOHEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOIEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOJEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR GPIOKEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR CRCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR DMA1EN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR DMA2EN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR RNGEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR DMA2DEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR ETHMACEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR OTGHSEN LL_AHB1_GRP1_IsEnabledClock\n + * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_AHB1_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->AHB1ENR, Periphs) == Periphs); +} + +/** + * @brief Disable AHB1 peripherals clock. + * @rmtoll AHB1ENR GPIOAEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOBEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOCEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIODEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOEEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOFEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOGEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOHEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOIEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOJEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR GPIOKEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR CRCEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR BKPSRAMEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR CCMDATARAMEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR DMA1EN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR DMA2EN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR RNGEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR DMA2DEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR ETHMACEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR ETHMACTXEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR ETHMACRXEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR ETHMACPTPEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR OTGHSEN LL_AHB1_GRP1_DisableClock\n + * AHB1ENR OTGHSULPIEN LL_AHB1_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CCMDATARAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB1ENR, Periphs); +} + +/** + * @brief Force AHB1 peripherals reset. + * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIODRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOERST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR CRCRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR DMA1RST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR DMA2RST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR RNGRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ForceReset\n + * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_ALL + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->AHB1RSTR, Periphs); +} + +/** + * @brief Release AHB1 peripherals reset. + * @rmtoll AHB1RSTR GPIOARST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOBRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOCRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIODRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOERST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOFRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOGRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOHRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOIRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOJRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR GPIOKRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR CRCRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR DMA1RST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR DMA2RST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR RNGRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR DMA2DRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR ETHMACRST LL_AHB1_GRP1_ReleaseReset\n + * AHB1RSTR OTGHSRST LL_AHB1_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_ALL + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB1RSTR, Periphs); +} + +/** + * @brief Enable AHB1 peripheral clocks in low-power mode + * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR CRCLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR RNGLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_EnableClockLowPower\n + * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB1LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB1LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable AHB1 peripheral clocks in low-power mode + * @rmtoll AHB1LPENR GPIOALPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOBLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOCLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIODLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOELPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOFLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOGLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOHLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOILPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOJLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR GPIOKLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR CRCLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR FLITFLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR SRAM1LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR SRAM2LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR SRAM3LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR BKPSRAMLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR DMA1LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR DMA2LPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR DMA2DLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR RNGLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR ETHMACLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR ETHMACTXLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR ETHMACRXLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR ETHMACPTPLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR OTGHSLPEN LL_AHB1_GRP1_DisableClockLowPower\n + * AHB1LPENR OTGHSULPILPEN LL_AHB1_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOA + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOB + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOD (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOE (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOF (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOI (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOJ (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOK (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_BKPSRAM (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_FLITF + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM1 + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM2 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM3 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 + * @arg @ref LL_AHB1_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2D (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMAC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACTX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACRX (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ETHMACPTP (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHS (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_OTGHSULPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB1LPENR, Periphs); +} + +/** + * @} + */ + +#if defined(RCC_AHB2_SUPPORT) +/** @defgroup BUS_LL_EF_AHB2 AHB2 + * @{ + */ + +/** + * @brief Enable AHB2 peripherals clock. + * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR CRYPEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR AESEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR HASHEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR RNGEN LL_AHB2_GRP1_EnableClock\n + * AHB2ENR OTGFSEN LL_AHB2_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB2ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB2ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if AHB2 peripheral clock is enabled or not + * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR CRYPEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR AESEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR HASHEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR RNGEN LL_AHB2_GRP1_IsEnabledClock\n + * AHB2ENR OTGFSEN LL_AHB2_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_AHB2_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->AHB2ENR, Periphs) == Periphs); +} + +/** + * @brief Disable AHB2 peripherals clock. + * @rmtoll AHB2ENR DCMIEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR CRYPEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR AESEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR HASHEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR RNGEN LL_AHB2_GRP1_DisableClock\n + * AHB2ENR OTGFSEN LL_AHB2_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB2ENR, Periphs); +} + +/** + * @brief Force AHB2 peripherals reset. + * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR CRYPRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR AESRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR HASHRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR RNGRST LL_AHB2_GRP1_ForceReset\n + * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_ALL + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->AHB2RSTR, Periphs); +} + +/** + * @brief Release AHB2 peripherals reset. + * @rmtoll AHB2RSTR DCMIRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR CRYPRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR AESRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR HASHRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR RNGRST LL_AHB2_GRP1_ReleaseReset\n + * AHB2RSTR OTGFSRST LL_AHB2_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_ALL + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB2RSTR, Periphs); +} + +/** + * @brief Enable AHB2 peripheral clocks in low-power mode + * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR AESLPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR HASHLPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR RNGLPEN LL_AHB2_GRP1_EnableClockLowPower\n + * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB2LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB2LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable AHB2 peripheral clocks in low-power mode + * @rmtoll AHB2LPENR DCMILPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR CRYPLPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR AESLPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR HASHLPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR RNGLPEN LL_AHB2_GRP1_DisableClockLowPower\n + * AHB2LPENR OTGFSLPEN LL_AHB2_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_DCMI (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_CRYP (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_AES (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_HASH (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_RNG (*) + * @arg @ref LL_AHB2_GRP1_PERIPH_OTGFS (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB2_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB2LPENR, Periphs); +} + +/** + * @} + */ +#endif /* RCC_AHB2_SUPPORT */ + +#if defined(RCC_AHB3_SUPPORT) +/** @defgroup BUS_LL_EF_AHB3 AHB3 + * @{ + */ + +/** + * @brief Enable AHB3 peripherals clock. + * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_EnableClock\n + * AHB3ENR FSMCEN LL_AHB3_GRP1_EnableClock\n + * AHB3ENR QSPIEN LL_AHB3_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB3ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB3ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if AHB3 peripheral clock is enabled or not + * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_IsEnabledClock\n + * AHB3ENR FSMCEN LL_AHB3_GRP1_IsEnabledClock\n + * AHB3ENR QSPIEN LL_AHB3_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_AHB3_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->AHB3ENR, Periphs) == Periphs); +} + +/** + * @brief Disable AHB3 peripherals clock. + * @rmtoll AHB3ENR FMCEN LL_AHB3_GRP1_DisableClock\n + * AHB3ENR FSMCEN LL_AHB3_GRP1_DisableClock\n + * AHB3ENR QSPIEN LL_AHB3_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB3ENR, Periphs); +} + +/** + * @brief Force AHB3 peripherals reset. + * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ForceReset\n + * AHB3RSTR FSMCRST LL_AHB3_GRP1_ForceReset\n + * AHB3RSTR QSPIRST LL_AHB3_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_ALL + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->AHB3RSTR, Periphs); +} + +/** + * @brief Release AHB3 peripherals reset. + * @rmtoll AHB3RSTR FMCRST LL_AHB3_GRP1_ReleaseReset\n + * AHB3RSTR FSMCRST LL_AHB3_GRP1_ReleaseReset\n + * AHB3RSTR QSPIRST LL_AHB3_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB2_GRP1_PERIPH_ALL + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB3RSTR, Periphs); +} + +/** + * @brief Enable AHB3 peripheral clocks in low-power mode + * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n + * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_EnableClockLowPower\n + * AHB3LPENR QSPILPEN LL_AHB3_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHB3LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB3LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable AHB3 peripheral clocks in low-power mode + * @rmtoll AHB3LPENR FMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n + * AHB3LPENR FSMCLPEN LL_AHB3_GRP1_DisableClockLowPower\n + * AHB3LPENR QSPILPEN LL_AHB3_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB3_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_FSMC (*) + * @arg @ref LL_AHB3_GRP1_PERIPH_QSPI (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB3_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHB3LPENR, Periphs); +} + +/** + * @} + */ +#endif /* RCC_AHB3_SUPPORT */ + +/** @defgroup BUS_LL_EF_APB1 APB1 + * @{ + */ + +/** + * @brief Enable APB1 peripherals clock. + * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM4EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM5EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM6EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM7EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM12EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM13EN LL_APB1_GRP1_EnableClock\n + * APB1ENR TIM14EN LL_APB1_GRP1_EnableClock\n + * APB1ENR LPTIM1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR WWDGEN LL_APB1_GRP1_EnableClock\n + * APB1ENR SPI2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR SPI3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR SPDIFRXEN LL_APB1_GRP1_EnableClock\n + * APB1ENR USART2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR USART3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR UART4EN LL_APB1_GRP1_EnableClock\n + * APB1ENR UART5EN LL_APB1_GRP1_EnableClock\n + * APB1ENR I2C1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR I2C2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR I2C3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR FMPI2C1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CAN1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CAN2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CAN3EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CECEN LL_APB1_GRP1_EnableClock\n + * APB1ENR PWREN LL_APB1_GRP1_EnableClock\n + * APB1ENR DACEN LL_APB1_GRP1_EnableClock\n + * APB1ENR UART7EN LL_APB1_GRP1_EnableClock\n + * APB1ENR UART8EN LL_APB1_GRP1_EnableClock\n + * APB1ENR RTCAPBEN LL_APB1_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->APB1ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB1ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if APB1 peripheral clock is enabled or not + * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM4EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM5EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM6EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM7EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM12EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM13EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR TIM14EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR LPTIM1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR WWDGEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR SPI2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR SPI3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR SPDIFRXEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR USART2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR USART3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR UART4EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR UART5EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR I2C1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR I2C2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR I2C3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR FMPI2C1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CAN1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CAN2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CAN3EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CECEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR PWREN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR DACEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR UART7EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR UART8EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR RTCAPBEN LL_APB1_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_APB1_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->APB1ENR, Periphs) == Periphs); +} + +/** + * @brief Disable APB1 peripherals clock. + * @rmtoll APB1ENR TIM2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM4EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM5EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM6EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM7EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM12EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM13EN LL_APB1_GRP1_DisableClock\n + * APB1ENR TIM14EN LL_APB1_GRP1_DisableClock\n + * APB1ENR LPTIM1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR WWDGEN LL_APB1_GRP1_DisableClock\n + * APB1ENR SPI2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR SPI3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR SPDIFRXEN LL_APB1_GRP1_DisableClock\n + * APB1ENR USART2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR USART3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR UART4EN LL_APB1_GRP1_DisableClock\n + * APB1ENR UART5EN LL_APB1_GRP1_DisableClock\n + * APB1ENR I2C1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR I2C2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR I2C3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR FMPI2C1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CAN1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CAN2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CAN3EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CECEN LL_APB1_GRP1_DisableClock\n + * APB1ENR PWREN LL_APB1_GRP1_DisableClock\n + * APB1ENR DACEN LL_APB1_GRP1_DisableClock\n + * APB1ENR UART7EN LL_APB1_GRP1_DisableClock\n + * APB1ENR UART8EN LL_APB1_GRP1_DisableClock\n + * APB1ENR RTCAPBEN LL_APB1_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB1ENR, Periphs); +} + +/** + * @brief Force APB1 peripherals reset. + * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM4RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM5RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM6RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM7RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM12RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM13RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR TIM14RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR LPTIM1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR WWDGRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR SPI2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR SPI3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR USART2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR USART3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR UART4RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR UART5RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR I2C1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR I2C2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR I2C3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CAN1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CAN2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CAN3RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CECRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR PWRRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR DACRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR UART7RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR UART8RST LL_APB1_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->APB1RSTR, Periphs); +} + +/** + * @brief Release APB1 peripherals reset. + * @rmtoll APB1RSTR TIM2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM4RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM5RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM6RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM7RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM12RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM13RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR TIM14RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR LPTIM1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR WWDGRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR SPI2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR SPI3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR SPDIFRXRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR USART2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR USART3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR UART4RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR UART5RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR I2C1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR I2C2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR I2C3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR FMPI2C1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CAN1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CAN2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CAN3RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CECRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR PWRRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR DACRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR UART7RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR UART8RST LL_APB1_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB1RSTR, Periphs); +} + +/** + * @brief Enable APB1 peripheral clocks in low-power mode + * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM4LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM5LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM6LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM7LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM12LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM13LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR TIM14LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR WWDGLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR SPI2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR SPI3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR USART2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR USART3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR UART4LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR UART5LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR I2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR I2C2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR I2C3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR CAN1LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR CAN2LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR CAN3LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR CECLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR PWRLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR DACLPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR UART7LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR UART8LPEN LL_APB1_GRP1_EnableClockLowPower\n + * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->APB1LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB1LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable APB1 peripheral clocks in low-power mode + * @rmtoll APB1LPENR TIM2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM4LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM5LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM6LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM7LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM12LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM13LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR TIM14LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR LPTIM1LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR WWDGLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR SPI2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR SPI3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR SPDIFRXLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR USART2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR USART3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR UART4LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR UART5LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR I2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR I2C2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR I2C3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR FMPI2C1LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR CAN1LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR CAN2LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR CAN3LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR CECLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR PWRLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR DACLPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR UART7LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR UART8LPEN LL_APB1_GRP1_DisableClockLowPower\n + * APB1LPENR RTCAPBLPEN LL_APB1_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_TIM2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM5 + * @arg @ref LL_APB1_GRP1_PERIPH_TIM6 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM12 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM13 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_TIM14 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_LPTIM1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_WWDG + * @arg @ref LL_APB1_GRP1_PERIPH_SPI2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPI3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_SPDIFRX (*) + * @arg @ref LL_APB1_GRP1_PERIPH_USART2 + * @arg @ref LL_APB1_GRP1_PERIPH_USART3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART4 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART5 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C1 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C2 + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_FMPI2C1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN3 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART7 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_UART8 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_RTCAPB (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB1LPENR, Periphs); +} + +/** + * @} + */ + +/** @defgroup BUS_LL_EF_APB2 APB2 + * @{ + */ + +/** + * @brief Enable APB2 peripherals clock. + * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_EnableClock\n + * APB2ENR USART1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR USART6EN LL_APB2_GRP1_EnableClock\n + * APB2ENR UART9EN LL_APB2_GRP1_EnableClock\n + * APB2ENR UART10EN LL_APB2_GRP1_EnableClock\n + * APB2ENR ADC1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR ADC2EN LL_APB2_GRP1_EnableClock\n + * APB2ENR ADC3EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SDIOEN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI4EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SYSCFGEN LL_APB2_GRP1_EnableClock\n + * APB2ENR EXTITEN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM9EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM10EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM11EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI5EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI6EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SAI1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SAI2EN LL_APB2_GRP1_EnableClock\n + * APB2ENR LTDCEN LL_APB2_GRP1_EnableClock\n + * APB2ENR DSIEN LL_APB2_GRP1_EnableClock\n + * APB2ENR DFSDM1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR DFSDM2EN LL_APB2_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->APB2ENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB2ENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if APB2 peripheral clock is enabled or not + * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR USART1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR USART6EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR UART9EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR UART10EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR ADC1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR ADC2EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR ADC3EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SDIOEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI4EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SYSCFGEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR EXTITEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM9EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM10EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM11EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI5EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI6EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SAI1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SAI2EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR LTDCEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR DSIEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR DFSDM1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR DFSDM2EN LL_APB2_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_APB2_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->APB2ENR, Periphs) == Periphs); +} + +/** + * @brief Disable APB2 peripherals clock. + * @rmtoll APB2ENR TIM1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_DisableClock\n + * APB2ENR USART1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR USART6EN LL_APB2_GRP1_DisableClock\n + * APB2ENR UART9EN LL_APB2_GRP1_DisableClock\n + * APB2ENR UART10EN LL_APB2_GRP1_DisableClock\n + * APB2ENR ADC1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR ADC2EN LL_APB2_GRP1_DisableClock\n + * APB2ENR ADC3EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SDIOEN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI4EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SYSCFGEN LL_APB2_GRP1_DisableClock\n + * APB2ENR EXTITEN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM9EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM10EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM11EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI5EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI6EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SAI1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SAI2EN LL_APB2_GRP1_DisableClock\n + * APB2ENR LTDCEN LL_APB2_GRP1_DisableClock\n + * APB2ENR DSIEN LL_APB2_GRP1_DisableClock\n + * APB2ENR DFSDM1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR DFSDM2EN LL_APB2_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB2ENR, Periphs); +} + +/** + * @brief Force APB2 peripherals reset. + * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM8RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR USART1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR USART6RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR UART9RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR UART10RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR ADCRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SDIORST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI4RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SYSCFGRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM9RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM10RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM11RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI5RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI6RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SAI1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SAI2RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR LTDCRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR DSIRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR DFSDM1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR DFSDM2RST LL_APB2_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_ALL + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->APB2RSTR, Periphs); +} + +/** + * @brief Release APB2 peripherals reset. + * @rmtoll APB2RSTR TIM1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM8RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR USART1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR USART6RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR UART9RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR UART10RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR ADCRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SDIORST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI4RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SYSCFGRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM9RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM10RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM11RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI5RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI6RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SAI1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SAI2RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR LTDCRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR DSIRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR DFSDM1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR DFSDM2RST LL_APB2_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_ALL + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB2RSTR, Periphs); +} + +/** + * @brief Enable APB2 peripheral clocks in low-power mode + * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR TIM8LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR USART1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR USART6LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR UART9LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR UART10LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR ADC1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR ADC2LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR ADC3LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SDIOLPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SPI1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SPI4LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR EXTITLPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR TIM9LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR TIM10LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR TIM11LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SPI5LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SPI6LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SAI1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR SAI2LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR LTDCLPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR DSILPEN LL_APB2_GRP1_EnableClockLowPower\n + * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_EnableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_EnableClockLowPower(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->APB2LPENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB2LPENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Disable APB2 peripheral clocks in low-power mode + * @rmtoll APB2LPENR TIM1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR TIM8LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR USART1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR USART6LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR UART9LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR UART10LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR ADC1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR ADC2LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR ADC3LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SDIOLPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SPI1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SPI4LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SYSCFGLPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR EXTITLPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR TIM9LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR TIM10LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR TIM11LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SPI5LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SPI6LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SAI1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR SAI2LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR LTDCLPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR DFSDM1LPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR DSILPEN LL_APB2_GRP1_DisableClockLowPower\n + * APB2LPENR DFSDM2LPEN LL_APB2_GRP1_DisableClockLowPower + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_USART6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART9 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_UART10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 + * @arg @ref LL_APB2_GRP1_PERIPH_ADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_ADC3 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDIO (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_EXTI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM9 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM10 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM11 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI5 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI6 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SAI2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_LTDC (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DSI (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_DFSDM2 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_DisableClockLowPower(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB2LPENR, Periphs); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RCC) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_BUS_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h new file mode 100644 index 0000000..d478e13 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h @@ -0,0 +1,637 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_cortex.h + * @author MCD Application Team + * @brief Header file of CORTEX LL module. + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The LL CORTEX driver contains a set of generic APIs that can be + used by user: + (+) SYSTICK configuration used by LL_mDelay and LL_Init1msTick + functions + (+) Low power mode configuration (SCB register of Cortex-MCU) + (+) MPU API to configure and enable regions + (MPU services provided only on some devices) + (+) API to access to MCU info (CPUID register) + (+) API to enable fault handler (SHCSR accesses) + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_CORTEX_H +#define __STM32F4xx_LL_CORTEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +/** @defgroup CORTEX_LL CORTEX + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup CORTEX_LL_Exported_Constants CORTEX Exported Constants + * @{ + */ + +/** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source + * @{ + */ +#define LL_SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U /*!< AHB clock divided by 8 selected as SysTick clock source.*/ +#define LL_SYSTICK_CLKSOURCE_HCLK SysTick_CTRL_CLKSOURCE_Msk /*!< AHB clock selected as SysTick clock source. */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_FAULT Handler Fault type + * @{ + */ +#define LL_HANDLER_FAULT_USG SCB_SHCSR_USGFAULTENA_Msk /*!< Usage fault */ +#define LL_HANDLER_FAULT_BUS SCB_SHCSR_BUSFAULTENA_Msk /*!< Bus fault */ +#define LL_HANDLER_FAULT_MEM SCB_SHCSR_MEMFAULTENA_Msk /*!< Memory management fault */ +/** + * @} + */ + +#if __MPU_PRESENT + +/** @defgroup CORTEX_LL_EC_CTRL_HFNMI_PRIVDEF MPU Control + * @{ + */ +#define LL_MPU_CTRL_HFNMI_PRIVDEF_NONE 0x00000000U /*!< Disable NMI and privileged SW access */ +#define LL_MPU_CTRL_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk /*!< Enables the operation of MPU during hard fault, NMI, and FAULTMASK handlers */ +#define LL_MPU_CTRL_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk /*!< Enable privileged software access to default memory map */ +#define LL_MPU_CTRL_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) /*!< Enable NMI and privileged SW access */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION MPU Region Number + * @{ + */ +#define LL_MPU_REGION_NUMBER0 0x00U /*!< REGION Number 0 */ +#define LL_MPU_REGION_NUMBER1 0x01U /*!< REGION Number 1 */ +#define LL_MPU_REGION_NUMBER2 0x02U /*!< REGION Number 2 */ +#define LL_MPU_REGION_NUMBER3 0x03U /*!< REGION Number 3 */ +#define LL_MPU_REGION_NUMBER4 0x04U /*!< REGION Number 4 */ +#define LL_MPU_REGION_NUMBER5 0x05U /*!< REGION Number 5 */ +#define LL_MPU_REGION_NUMBER6 0x06U /*!< REGION Number 6 */ +#define LL_MPU_REGION_NUMBER7 0x07U /*!< REGION Number 7 */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION_SIZE MPU Region Size + * @{ + */ +#define LL_MPU_REGION_SIZE_32B (0x04U << MPU_RASR_SIZE_Pos) /*!< 32B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64B (0x05U << MPU_RASR_SIZE_Pos) /*!< 64B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128B (0x06U << MPU_RASR_SIZE_Pos) /*!< 128B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256B (0x07U << MPU_RASR_SIZE_Pos) /*!< 256B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512B (0x08U << MPU_RASR_SIZE_Pos) /*!< 512B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1KB (0x09U << MPU_RASR_SIZE_Pos) /*!< 1KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2KB (0x0AU << MPU_RASR_SIZE_Pos) /*!< 2KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4KB (0x0BU << MPU_RASR_SIZE_Pos) /*!< 4KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_8KB (0x0CU << MPU_RASR_SIZE_Pos) /*!< 8KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_16KB (0x0DU << MPU_RASR_SIZE_Pos) /*!< 16KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_32KB (0x0EU << MPU_RASR_SIZE_Pos) /*!< 32KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64KB (0x0FU << MPU_RASR_SIZE_Pos) /*!< 64KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128KB (0x10U << MPU_RASR_SIZE_Pos) /*!< 128KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256KB (0x11U << MPU_RASR_SIZE_Pos) /*!< 256KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512KB (0x12U << MPU_RASR_SIZE_Pos) /*!< 512KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1MB (0x13U << MPU_RASR_SIZE_Pos) /*!< 1MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2MB (0x14U << MPU_RASR_SIZE_Pos) /*!< 2MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4MB (0x15U << MPU_RASR_SIZE_Pos) /*!< 4MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_8MB (0x16U << MPU_RASR_SIZE_Pos) /*!< 8MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_16MB (0x17U << MPU_RASR_SIZE_Pos) /*!< 16MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_32MB (0x18U << MPU_RASR_SIZE_Pos) /*!< 32MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64MB (0x19U << MPU_RASR_SIZE_Pos) /*!< 64MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128MB (0x1AU << MPU_RASR_SIZE_Pos) /*!< 128MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256MB (0x1BU << MPU_RASR_SIZE_Pos) /*!< 256MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512MB (0x1CU << MPU_RASR_SIZE_Pos) /*!< 512MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1GB (0x1DU << MPU_RASR_SIZE_Pos) /*!< 1GB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2GB (0x1EU << MPU_RASR_SIZE_Pos) /*!< 2GB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4GB (0x1FU << MPU_RASR_SIZE_Pos) /*!< 4GB Size of the MPU protection region */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION_PRIVILEDGES MPU Region Privileges + * @{ + */ +#define LL_MPU_REGION_NO_ACCESS (0x00U << MPU_RASR_AP_Pos) /*!< No access*/ +#define LL_MPU_REGION_PRIV_RW (0x01U << MPU_RASR_AP_Pos) /*!< RW privileged (privileged access only)*/ +#define LL_MPU_REGION_PRIV_RW_URO (0x02U << MPU_RASR_AP_Pos) /*!< RW privileged - RO user (Write in a user program generates a fault) */ +#define LL_MPU_REGION_FULL_ACCESS (0x03U << MPU_RASR_AP_Pos) /*!< RW privileged & user (Full access) */ +#define LL_MPU_REGION_PRIV_RO (0x05U << MPU_RASR_AP_Pos) /*!< RO privileged (privileged read only)*/ +#define LL_MPU_REGION_PRIV_RO_URO (0x06U << MPU_RASR_AP_Pos) /*!< RO privileged & user (read only) */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_TEX MPU TEX Level + * @{ + */ +#define LL_MPU_TEX_LEVEL0 (0x00U << MPU_RASR_TEX_Pos) /*!< b000 for TEX bits */ +#define LL_MPU_TEX_LEVEL1 (0x01U << MPU_RASR_TEX_Pos) /*!< b001 for TEX bits */ +#define LL_MPU_TEX_LEVEL2 (0x02U << MPU_RASR_TEX_Pos) /*!< b010 for TEX bits */ +#define LL_MPU_TEX_LEVEL4 (0x04U << MPU_RASR_TEX_Pos) /*!< b100 for TEX bits */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_INSTRUCTION_ACCESS MPU Instruction Access + * @{ + */ +#define LL_MPU_INSTRUCTION_ACCESS_ENABLE 0x00U /*!< Instruction fetches enabled */ +#define LL_MPU_INSTRUCTION_ACCESS_DISABLE MPU_RASR_XN_Msk /*!< Instruction fetches disabled*/ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_SHAREABLE_ACCESS MPU Shareable Access + * @{ + */ +#define LL_MPU_ACCESS_SHAREABLE MPU_RASR_S_Msk /*!< Shareable memory attribute */ +#define LL_MPU_ACCESS_NOT_SHAREABLE 0x00U /*!< Not Shareable memory attribute */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_CACHEABLE_ACCESS MPU Cacheable Access + * @{ + */ +#define LL_MPU_ACCESS_CACHEABLE MPU_RASR_C_Msk /*!< Cacheable memory attribute */ +#define LL_MPU_ACCESS_NOT_CACHEABLE 0x00U /*!< Not Cacheable memory attribute */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_BUFFERABLE_ACCESS MPU Bufferable Access + * @{ + */ +#define LL_MPU_ACCESS_BUFFERABLE MPU_RASR_B_Msk /*!< Bufferable memory attribute */ +#define LL_MPU_ACCESS_NOT_BUFFERABLE 0x00U /*!< Not Bufferable memory attribute */ +/** + * @} + */ +#endif /* __MPU_PRESENT */ +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup CORTEX_LL_Exported_Functions CORTEX Exported Functions + * @{ + */ + +/** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK + * @{ + */ + +/** + * @brief This function checks if the Systick counter flag is active or not. + * @note It can be used in timeout function on application side. + * @rmtoll STK_CTRL COUNTFLAG LL_SYSTICK_IsActiveCounterFlag + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void) +{ + return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk)); +} + +/** + * @brief Configures the SysTick clock source + * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_SetClkSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source) +{ + if (Source == LL_SYSTICK_CLKSOURCE_HCLK) + { + SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); + } + else + { + CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); + } +} + +/** + * @brief Get the SysTick clock source + * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_GetClkSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK + */ +__STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void) +{ + return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); +} + +/** + * @brief Enable SysTick exception request + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_EnableIT + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_EnableIT(void) +{ + SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); +} + +/** + * @brief Disable SysTick exception request + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_DisableIT + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_DisableIT(void) +{ + CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); +} + +/** + * @brief Checks if the SYSTICK interrupt is enabled or disabled. + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_IsEnabledIT + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void) +{ + return (READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk)); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_LOW_POWER_MODE LOW POWER MODE + * @{ + */ + +/** + * @brief Processor uses sleep as its low power mode + * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableSleep + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableSleep(void) +{ + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Processor uses deep sleep as its low power mode + * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableDeepSleep + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableDeepSleep(void) +{ + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Configures sleep-on-exit when returning from Handler mode to Thread mode. + * @note Setting this bit to 1 enables an interrupt-driven application to avoid returning to an + * empty main application. + * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_EnableSleepOnExit + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableSleepOnExit(void) +{ + /* Set SLEEPONEXIT bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Do not sleep when returning to Thread mode. + * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_DisableSleepOnExit + * @retval None + */ +__STATIC_INLINE void LL_LPM_DisableSleepOnExit(void) +{ + /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Enabled events and all interrupts, including disabled interrupts, can wakeup the + * processor. + * @rmtoll SCB_SCR SEVEONPEND LL_LPM_EnableEventOnPend + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableEventOnPend(void) +{ + /* Set SEVEONPEND bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @brief Only enabled interrupts or events can wakeup the processor, disabled interrupts are + * excluded + * @rmtoll SCB_SCR SEVEONPEND LL_LPM_DisableEventOnPend + * @retval None + */ +__STATIC_INLINE void LL_LPM_DisableEventOnPend(void) +{ + /* Clear SEVEONPEND bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_HANDLER HANDLER + * @{ + */ + +/** + * @brief Enable a fault in System handler control register (SHCSR) + * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_EnableFault + * @param Fault This parameter can be a combination of the following values: + * @arg @ref LL_HANDLER_FAULT_USG + * @arg @ref LL_HANDLER_FAULT_BUS + * @arg @ref LL_HANDLER_FAULT_MEM + * @retval None + */ +__STATIC_INLINE void LL_HANDLER_EnableFault(uint32_t Fault) +{ + /* Enable the system handler fault */ + SET_BIT(SCB->SHCSR, Fault); +} + +/** + * @brief Disable a fault in System handler control register (SHCSR) + * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_DisableFault + * @param Fault This parameter can be a combination of the following values: + * @arg @ref LL_HANDLER_FAULT_USG + * @arg @ref LL_HANDLER_FAULT_BUS + * @arg @ref LL_HANDLER_FAULT_MEM + * @retval None + */ +__STATIC_INLINE void LL_HANDLER_DisableFault(uint32_t Fault) +{ + /* Disable the system handler fault */ + CLEAR_BIT(SCB->SHCSR, Fault); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_MCU_INFO MCU INFO + * @{ + */ + +/** + * @brief Get Implementer code + * @rmtoll SCB_CPUID IMPLEMENTER LL_CPUID_GetImplementer + * @retval Value should be equal to 0x41 for ARM + */ +__STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos); +} + +/** + * @brief Get Variant number (The r value in the rnpn product revision identifier) + * @rmtoll SCB_CPUID VARIANT LL_CPUID_GetVariant + * @retval Value between 0 and 255 (0x0: revision 0) + */ +__STATIC_INLINE uint32_t LL_CPUID_GetVariant(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos); +} + +/** + * @brief Get Constant number + * @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetConstant + * @retval Value should be equal to 0xF for Cortex-M4 devices + */ +__STATIC_INLINE uint32_t LL_CPUID_GetConstant(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos); +} + +/** + * @brief Get Part number + * @rmtoll SCB_CPUID PARTNO LL_CPUID_GetParNo + * @retval Value should be equal to 0xC24 for Cortex-M4 + */ +__STATIC_INLINE uint32_t LL_CPUID_GetParNo(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos); +} + +/** + * @brief Get Revision number (The p value in the rnpn product revision identifier, indicates patch release) + * @rmtoll SCB_CPUID REVISION LL_CPUID_GetRevision + * @retval Value between 0 and 255 (0x1: patch 1) + */ +__STATIC_INLINE uint32_t LL_CPUID_GetRevision(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos); +} + +/** + * @} + */ + +#if __MPU_PRESENT +/** @defgroup CORTEX_LL_EF_MPU MPU + * @{ + */ + +/** + * @brief Enable MPU with input options + * @rmtoll MPU_CTRL ENABLE LL_MPU_Enable + * @param Options This parameter can be one of the following values: + * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE + * @arg @ref LL_MPU_CTRL_HARDFAULT_NMI + * @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT + * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF + * @retval None + */ +__STATIC_INLINE void LL_MPU_Enable(uint32_t Options) +{ + /* Enable the MPU*/ + WRITE_REG(MPU->CTRL, (MPU_CTRL_ENABLE_Msk | Options)); + /* Ensure MPU settings take effects */ + __DSB(); + /* Sequence instruction fetches using update settings */ + __ISB(); +} + +/** + * @brief Disable MPU + * @rmtoll MPU_CTRL ENABLE LL_MPU_Disable + * @retval None + */ +__STATIC_INLINE void LL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + /* Disable MPU*/ + WRITE_REG(MPU->CTRL, 0U); +} + +/** + * @brief Check if MPU is enabled or not + * @rmtoll MPU_CTRL ENABLE LL_MPU_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_MPU_IsEnabled(void) +{ + return (READ_BIT(MPU->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk)); +} + +/** + * @brief Enable a MPU region + * @rmtoll MPU_RASR ENABLE LL_MPU_EnableRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @retval None + */ +__STATIC_INLINE void LL_MPU_EnableRegion(uint32_t Region) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Enable the MPU region */ + SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @brief Configure and enable a region + * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegion\n + * MPU_RBAR REGION LL_MPU_ConfigRegion\n + * MPU_RBAR ADDR LL_MPU_ConfigRegion\n + * MPU_RASR XN LL_MPU_ConfigRegion\n + * MPU_RASR AP LL_MPU_ConfigRegion\n + * MPU_RASR S LL_MPU_ConfigRegion\n + * MPU_RASR C LL_MPU_ConfigRegion\n + * MPU_RASR B LL_MPU_ConfigRegion\n + * MPU_RASR SIZE LL_MPU_ConfigRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @param Address Value of region base address + * @param SubRegionDisable Sub-region disable value between Min_Data = 0x00 and Max_Data = 0xFF + * @param Attributes This parameter can be a combination of the following values: + * @arg @ref LL_MPU_REGION_SIZE_32B or @ref LL_MPU_REGION_SIZE_64B or @ref LL_MPU_REGION_SIZE_128B or @ref LL_MPU_REGION_SIZE_256B or @ref LL_MPU_REGION_SIZE_512B + * or @ref LL_MPU_REGION_SIZE_1KB or @ref LL_MPU_REGION_SIZE_2KB or @ref LL_MPU_REGION_SIZE_4KB or @ref LL_MPU_REGION_SIZE_8KB or @ref LL_MPU_REGION_SIZE_16KB + * or @ref LL_MPU_REGION_SIZE_32KB or @ref LL_MPU_REGION_SIZE_64KB or @ref LL_MPU_REGION_SIZE_128KB or @ref LL_MPU_REGION_SIZE_256KB or @ref LL_MPU_REGION_SIZE_512KB + * or @ref LL_MPU_REGION_SIZE_1MB or @ref LL_MPU_REGION_SIZE_2MB or @ref LL_MPU_REGION_SIZE_4MB or @ref LL_MPU_REGION_SIZE_8MB or @ref LL_MPU_REGION_SIZE_16MB + * or @ref LL_MPU_REGION_SIZE_32MB or @ref LL_MPU_REGION_SIZE_64MB or @ref LL_MPU_REGION_SIZE_128MB or @ref LL_MPU_REGION_SIZE_256MB or @ref LL_MPU_REGION_SIZE_512MB + * or @ref LL_MPU_REGION_SIZE_1GB or @ref LL_MPU_REGION_SIZE_2GB or @ref LL_MPU_REGION_SIZE_4GB + * @arg @ref LL_MPU_REGION_NO_ACCESS or @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_PRIV_RW_URO or @ref LL_MPU_REGION_FULL_ACCESS + * or @ref LL_MPU_REGION_PRIV_RO or @ref LL_MPU_REGION_PRIV_RO_URO + * @arg @ref LL_MPU_TEX_LEVEL0 or @ref LL_MPU_TEX_LEVEL1 or @ref LL_MPU_TEX_LEVEL2 or @ref LL_MPU_TEX_LEVEL4 + * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE + * @arg @ref LL_MPU_ACCESS_SHAREABLE or @ref LL_MPU_ACCESS_NOT_SHAREABLE + * @arg @ref LL_MPU_ACCESS_CACHEABLE or @ref LL_MPU_ACCESS_NOT_CACHEABLE + * @arg @ref LL_MPU_ACCESS_BUFFERABLE or @ref LL_MPU_ACCESS_NOT_BUFFERABLE + * @retval None + */ +__STATIC_INLINE void LL_MPU_ConfigRegion(uint32_t Region, uint32_t SubRegionDisable, uint32_t Address, uint32_t Attributes) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Set base address */ + WRITE_REG(MPU->RBAR, (Address & 0xFFFFFFE0U)); + /* Configure MPU */ + WRITE_REG(MPU->RASR, (MPU_RASR_ENABLE_Msk | Attributes | SubRegionDisable << MPU_RASR_SRD_Pos)); +} + +/** + * @brief Disable a region + * @rmtoll MPU_RNR REGION LL_MPU_DisableRegion\n + * MPU_RASR ENABLE LL_MPU_DisableRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @retval None + */ +__STATIC_INLINE void LL_MPU_DisableRegion(uint32_t Region) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Disable the MPU region */ + CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @} + */ + +#endif /* __MPU_PRESENT */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_CORTEX_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h new file mode 100644 index 0000000..76444fc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h @@ -0,0 +1,2868 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_dma.h + * @author MCD Application Team + * @brief Header file of DMA LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_DMA_H +#define __STM32F4xx_LL_DMA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (DMA1) || defined (DMA2) + +/** @defgroup DMA_LL DMA + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup DMA_LL_Private_Variables DMA Private Variables + * @{ + */ +/* Array used to get the DMA stream register offset versus stream index LL_DMA_STREAM_x */ +static const uint8_t STREAM_OFFSET_TAB[] = +{ + (uint8_t)(DMA1_Stream0_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream1_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream2_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream3_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream4_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream5_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream6_BASE - DMA1_BASE), + (uint8_t)(DMA1_Stream7_BASE - DMA1_BASE) +}; + +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup DMA_LL_Private_Constants DMA Private Constants + * @{ + */ +/** + * @} + */ + + +/* Private macros ------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA_LL_ES_INIT DMA Exported Init structure + * @{ + */ +typedef struct +{ + uint32_t PeriphOrM2MSrcAddress; /*!< Specifies the peripheral base address for DMA transfer + or as Source base address in case of memory to memory transfer direction. + + This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ + + uint32_t MemoryOrM2MDstAddress; /*!< Specifies the memory base address for DMA transfer + or as Destination base address in case of memory to memory transfer direction. + + This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ + + uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, + from memory to memory or from peripheral to memory. + This parameter can be a value of @ref DMA_LL_EC_DIRECTION + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataTransferDirection(). */ + + uint32_t Mode; /*!< Specifies the normal or circular operation mode. + This parameter can be a value of @ref DMA_LL_EC_MODE + @note The circular buffer mode cannot be used if the memory to memory + data transfer direction is configured on the selected Stream + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMode(). */ + + uint32_t PeriphOrM2MSrcIncMode; /*!< Specifies whether the Peripheral address or Source address in case of memory to memory transfer direction + is incremented or not. + This parameter can be a value of @ref DMA_LL_EC_PERIPH + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphIncMode(). */ + + uint32_t MemoryOrM2MDstIncMode; /*!< Specifies whether the Memory address or Destination address in case of memory to memory transfer direction + is incremented or not. + This parameter can be a value of @ref DMA_LL_EC_MEMORY + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryIncMode(). */ + + uint32_t PeriphOrM2MSrcDataSize; /*!< Specifies the Peripheral data size alignment or Source data size alignment (byte, half word, word) + in case of memory to memory transfer direction. + This parameter can be a value of @ref DMA_LL_EC_PDATAALIGN + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphSize(). */ + + uint32_t MemoryOrM2MDstDataSize; /*!< Specifies the Memory data size alignment or Destination data size alignment (byte, half word, word) + in case of memory to memory transfer direction. + This parameter can be a value of @ref DMA_LL_EC_MDATAALIGN + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemorySize(). */ + + uint32_t NbData; /*!< Specifies the number of data to transfer, in data unit. + The data unit is equal to the source buffer configuration set in PeripheralSize + or MemorySize parameters depending in the transfer direction. + This parameter must be a value between Min_Data = 0 and Max_Data = 0x0000FFFF + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataLength(). */ + + uint32_t Channel; /*!< Specifies the peripheral channel. + This parameter can be a value of @ref DMA_LL_EC_CHANNEL + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetChannelSelection(). */ + + uint32_t Priority; /*!< Specifies the channel priority level. + This parameter can be a value of @ref DMA_LL_EC_PRIORITY + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetStreamPriorityLevel(). */ + + uint32_t FIFOMode; /*!< Specifies if the FIFO mode or Direct mode will be used for the specified stream. + This parameter can be a value of @ref DMA_LL_FIFOMODE + @note The Direct mode (FIFO mode disabled) cannot be used if the + memory-to-memory data transfer is configured on the selected stream + + This feature can be modified afterwards using unitary functions @ref LL_DMA_EnableFifoMode() or @ref LL_DMA_EnableFifoMode() . */ + + uint32_t FIFOThreshold; /*!< Specifies the FIFO threshold level. + This parameter can be a value of @ref DMA_LL_EC_FIFOTHRESHOLD + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetFIFOThreshold(). */ + + uint32_t MemBurst; /*!< Specifies the Burst transfer configuration for the memory transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_LL_EC_MBURST + @note The burst mode is possible only if the address Increment mode is enabled. + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryBurstxfer(). */ + + uint32_t PeriphBurst; /*!< Specifies the Burst transfer configuration for the peripheral transfers. + It specifies the amount of data to be transferred in a single non interruptible + transaction. + This parameter can be a value of @ref DMA_LL_EC_PBURST + @note The burst mode is possible only if the address Increment mode is enabled. + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphBurstxfer(). */ + +} LL_DMA_InitTypeDef; +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup DMA_LL_Exported_Constants DMA Exported Constants + * @{ + */ + +/** @defgroup DMA_LL_EC_STREAM STREAM + * @{ + */ +#define LL_DMA_STREAM_0 0x00000000U +#define LL_DMA_STREAM_1 0x00000001U +#define LL_DMA_STREAM_2 0x00000002U +#define LL_DMA_STREAM_3 0x00000003U +#define LL_DMA_STREAM_4 0x00000004U +#define LL_DMA_STREAM_5 0x00000005U +#define LL_DMA_STREAM_6 0x00000006U +#define LL_DMA_STREAM_7 0x00000007U +#define LL_DMA_STREAM_ALL 0xFFFF0000U +/** + * @} + */ + +/** @defgroup DMA_LL_EC_DIRECTION DIRECTION + * @{ + */ +#define LL_DMA_DIRECTION_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ +#define LL_DMA_DIRECTION_MEMORY_TO_PERIPH DMA_SxCR_DIR_0 /*!< Memory to peripheral direction */ +#define LL_DMA_DIRECTION_MEMORY_TO_MEMORY DMA_SxCR_DIR_1 /*!< Memory to memory direction */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MODE MODE + * @{ + */ +#define LL_DMA_MODE_NORMAL 0x00000000U /*!< Normal Mode */ +#define LL_DMA_MODE_CIRCULAR DMA_SxCR_CIRC /*!< Circular Mode */ +#define LL_DMA_MODE_PFCTRL DMA_SxCR_PFCTRL /*!< Peripheral flow control mode */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_DOUBLEBUFFER_MODE DOUBLEBUFFER MODE + * @{ + */ +#define LL_DMA_DOUBLEBUFFER_MODE_DISABLE 0x00000000U /*!< Disable double buffering mode */ +#define LL_DMA_DOUBLEBUFFER_MODE_ENABLE DMA_SxCR_DBM /*!< Enable double buffering mode */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PERIPH PERIPH + * @{ + */ +#define LL_DMA_PERIPH_NOINCREMENT 0x00000000U /*!< Peripheral increment mode Disable */ +#define LL_DMA_PERIPH_INCREMENT DMA_SxCR_PINC /*!< Peripheral increment mode Enable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MEMORY MEMORY + * @{ + */ +#define LL_DMA_MEMORY_NOINCREMENT 0x00000000U /*!< Memory increment mode Disable */ +#define LL_DMA_MEMORY_INCREMENT DMA_SxCR_MINC /*!< Memory increment mode Enable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PDATAALIGN PDATAALIGN + * @{ + */ +#define LL_DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment : Byte */ +#define LL_DMA_PDATAALIGN_HALFWORD DMA_SxCR_PSIZE_0 /*!< Peripheral data alignment : HalfWord */ +#define LL_DMA_PDATAALIGN_WORD DMA_SxCR_PSIZE_1 /*!< Peripheral data alignment : Word */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MDATAALIGN MDATAALIGN + * @{ + */ +#define LL_DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment : Byte */ +#define LL_DMA_MDATAALIGN_HALFWORD DMA_SxCR_MSIZE_0 /*!< Memory data alignment : HalfWord */ +#define LL_DMA_MDATAALIGN_WORD DMA_SxCR_MSIZE_1 /*!< Memory data alignment : Word */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_OFFSETSIZE OFFSETSIZE + * @{ + */ +#define LL_DMA_OFFSETSIZE_PSIZE 0x00000000U /*!< Peripheral increment offset size is linked to the PSIZE */ +#define LL_DMA_OFFSETSIZE_FIXEDTO4 DMA_SxCR_PINCOS /*!< Peripheral increment offset size is fixed to 4 (32-bit alignment) */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PRIORITY PRIORITY + * @{ + */ +#define LL_DMA_PRIORITY_LOW 0x00000000U /*!< Priority level : Low */ +#define LL_DMA_PRIORITY_MEDIUM DMA_SxCR_PL_0 /*!< Priority level : Medium */ +#define LL_DMA_PRIORITY_HIGH DMA_SxCR_PL_1 /*!< Priority level : High */ +#define LL_DMA_PRIORITY_VERYHIGH DMA_SxCR_PL /*!< Priority level : Very_High */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_CHANNEL CHANNEL + * @{ + */ +#define LL_DMA_CHANNEL_0 0x00000000U /* Select Channel0 of DMA Instance */ +#define LL_DMA_CHANNEL_1 DMA_SxCR_CHSEL_0 /* Select Channel1 of DMA Instance */ +#define LL_DMA_CHANNEL_2 DMA_SxCR_CHSEL_1 /* Select Channel2 of DMA Instance */ +#define LL_DMA_CHANNEL_3 (DMA_SxCR_CHSEL_0 | DMA_SxCR_CHSEL_1) /* Select Channel3 of DMA Instance */ +#define LL_DMA_CHANNEL_4 DMA_SxCR_CHSEL_2 /* Select Channel4 of DMA Instance */ +#define LL_DMA_CHANNEL_5 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0) /* Select Channel5 of DMA Instance */ +#define LL_DMA_CHANNEL_6 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1) /* Select Channel6 of DMA Instance */ +#define LL_DMA_CHANNEL_7 (DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel7 of DMA Instance */ +#if defined (DMA_SxCR_CHSEL_3) +#define LL_DMA_CHANNEL_8 DMA_SxCR_CHSEL_3 /* Select Channel8 of DMA Instance */ +#define LL_DMA_CHANNEL_9 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_0) /* Select Channel9 of DMA Instance */ +#define LL_DMA_CHANNEL_10 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_1) /* Select Channel10 of DMA Instance */ +#define LL_DMA_CHANNEL_11 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel11 of DMA Instance */ +#define LL_DMA_CHANNEL_12 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2) /* Select Channel12 of DMA Instance */ +#define LL_DMA_CHANNEL_13 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0) /* Select Channel13 of DMA Instance */ +#define LL_DMA_CHANNEL_14 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1) /* Select Channel14 of DMA Instance */ +#define LL_DMA_CHANNEL_15 (DMA_SxCR_CHSEL_3 | DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0) /* Select Channel15 of DMA Instance */ +#endif /* DMA_SxCR_CHSEL_3 */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MBURST MBURST + * @{ + */ +#define LL_DMA_MBURST_SINGLE 0x00000000U /*!< Memory burst single transfer configuration */ +#define LL_DMA_MBURST_INC4 DMA_SxCR_MBURST_0 /*!< Memory burst of 4 beats transfer configuration */ +#define LL_DMA_MBURST_INC8 DMA_SxCR_MBURST_1 /*!< Memory burst of 8 beats transfer configuration */ +#define LL_DMA_MBURST_INC16 (DMA_SxCR_MBURST_0 | DMA_SxCR_MBURST_1) /*!< Memory burst of 16 beats transfer configuration */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PBURST PBURST + * @{ + */ +#define LL_DMA_PBURST_SINGLE 0x00000000U /*!< Peripheral burst single transfer configuration */ +#define LL_DMA_PBURST_INC4 DMA_SxCR_PBURST_0 /*!< Peripheral burst of 4 beats transfer configuration */ +#define LL_DMA_PBURST_INC8 DMA_SxCR_PBURST_1 /*!< Peripheral burst of 8 beats transfer configuration */ +#define LL_DMA_PBURST_INC16 (DMA_SxCR_PBURST_0 | DMA_SxCR_PBURST_1) /*!< Peripheral burst of 16 beats transfer configuration */ +/** + * @} + */ + +/** @defgroup DMA_LL_FIFOMODE DMA_LL_FIFOMODE + * @{ + */ +#define LL_DMA_FIFOMODE_DISABLE 0x00000000U /*!< FIFO mode disable (direct mode is enabled) */ +#define LL_DMA_FIFOMODE_ENABLE DMA_SxFCR_DMDIS /*!< FIFO mode enable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_FIFOSTATUS_0 FIFOSTATUS 0 + * @{ + */ +#define LL_DMA_FIFOSTATUS_0_25 0x00000000U /*!< 0 < fifo_level < 1/4 */ +#define LL_DMA_FIFOSTATUS_25_50 DMA_SxFCR_FS_0 /*!< 1/4 < fifo_level < 1/2 */ +#define LL_DMA_FIFOSTATUS_50_75 DMA_SxFCR_FS_1 /*!< 1/2 < fifo_level < 3/4 */ +#define LL_DMA_FIFOSTATUS_75_100 (DMA_SxFCR_FS_1 | DMA_SxFCR_FS_0) /*!< 3/4 < fifo_level < full */ +#define LL_DMA_FIFOSTATUS_EMPTY DMA_SxFCR_FS_2 /*!< FIFO is empty */ +#define LL_DMA_FIFOSTATUS_FULL (DMA_SxFCR_FS_2 | DMA_SxFCR_FS_0) /*!< FIFO is full */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_FIFOTHRESHOLD FIFOTHRESHOLD + * @{ + */ +#define LL_DMA_FIFOTHRESHOLD_1_4 0x00000000U /*!< FIFO threshold 1 quart full configuration */ +#define LL_DMA_FIFOTHRESHOLD_1_2 DMA_SxFCR_FTH_0 /*!< FIFO threshold half full configuration */ +#define LL_DMA_FIFOTHRESHOLD_3_4 DMA_SxFCR_FTH_1 /*!< FIFO threshold 3 quarts full configuration */ +#define LL_DMA_FIFOTHRESHOLD_FULL DMA_SxFCR_FTH /*!< FIFO threshold full configuration */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_CURRENTTARGETMEM CURRENTTARGETMEM + * @{ + */ +#define LL_DMA_CURRENTTARGETMEM0 0x00000000U /*!< Set CurrentTarget Memory to Memory 0 */ +#define LL_DMA_CURRENTTARGETMEM1 DMA_SxCR_CT /*!< Set CurrentTarget Memory to Memory 1 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup DMA_LL_Exported_Macros DMA Exported Macros + * @{ + */ + +/** @defgroup DMA_LL_EM_WRITE_READ Common Write and read registers macros + * @{ + */ +/** + * @brief Write a value in DMA register + * @param __INSTANCE__ DMA Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_DMA_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in DMA register + * @param __INSTANCE__ DMA Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_DMA_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup DMA_LL_EM_CONVERT_DMAxCHANNELy Convert DMAxStreamy + * @{ + */ +/** + * @brief Convert DMAx_Streamy into DMAx + * @param __STREAM_INSTANCE__ DMAx_Streamy + * @retval DMAx + */ +#define __LL_DMA_GET_INSTANCE(__STREAM_INSTANCE__) \ +(((uint32_t)(__STREAM_INSTANCE__) > ((uint32_t)DMA1_Stream7)) ? DMA2 : DMA1) + +/** + * @brief Convert DMAx_Streamy into LL_DMA_STREAM_y + * @param __STREAM_INSTANCE__ DMAx_Streamy + * @retval LL_DMA_CHANNEL_y + */ +#define __LL_DMA_GET_STREAM(__STREAM_INSTANCE__) \ +(((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream0)) ? LL_DMA_STREAM_0 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream0)) ? LL_DMA_STREAM_0 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream1)) ? LL_DMA_STREAM_1 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream1)) ? LL_DMA_STREAM_1 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream2)) ? LL_DMA_STREAM_2 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream2)) ? LL_DMA_STREAM_2 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream3)) ? LL_DMA_STREAM_3 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream3)) ? LL_DMA_STREAM_3 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream4)) ? LL_DMA_STREAM_4 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream4)) ? LL_DMA_STREAM_4 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream5)) ? LL_DMA_STREAM_5 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream5)) ? LL_DMA_STREAM_5 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA1_Stream6)) ? LL_DMA_STREAM_6 : \ + ((uint32_t)(__STREAM_INSTANCE__) == ((uint32_t)DMA2_Stream6)) ? LL_DMA_STREAM_6 : \ + LL_DMA_STREAM_7) + +/** + * @brief Convert DMA Instance DMAx and LL_DMA_STREAM_y into DMAx_Streamy + * @param __DMA_INSTANCE__ DMAx + * @param __STREAM__ LL_DMA_STREAM_y + * @retval DMAx_Streamy + */ +#define __LL_DMA_GET_STREAM_INSTANCE(__DMA_INSTANCE__, __STREAM__) \ +((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA1_Stream0 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_0))) ? DMA2_Stream0 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA1_Stream1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_1))) ? DMA2_Stream1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA1_Stream2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_2))) ? DMA2_Stream2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA1_Stream3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_3))) ? DMA2_Stream3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA1_Stream4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_4))) ? DMA2_Stream4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA1_Stream5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_5))) ? DMA2_Stream5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA1_Stream6 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_6))) ? DMA2_Stream6 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__STREAM__) == ((uint32_t)LL_DMA_STREAM_7))) ? DMA1_Stream7 : \ + DMA2_Stream7) + +/** + * @} + */ + +/** + * @} + */ + + +/* Exported functions --------------------------------------------------------*/ + /** @defgroup DMA_LL_Exported_Functions DMA Exported Functions + * @{ + */ + +/** @defgroup DMA_LL_EF_Configuration Configuration + * @{ + */ +/** + * @brief Enable DMA stream. + * @rmtoll CR EN LL_DMA_EnableStream + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableStream(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); +} + +/** + * @brief Disable DMA stream. + * @rmtoll CR EN LL_DMA_DisableStream + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableStream(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN); +} + +/** + * @brief Check if DMA stream is enabled or disabled. + * @rmtoll CR EN LL_DMA_IsEnabledStream + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledStream(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_EN) == (DMA_SxCR_EN)); +} + +/** + * @brief Configure all parameters linked to DMA transfer. + * @rmtoll CR DIR LL_DMA_ConfigTransfer\n + * CR CIRC LL_DMA_ConfigTransfer\n + * CR PINC LL_DMA_ConfigTransfer\n + * CR MINC LL_DMA_ConfigTransfer\n + * CR PSIZE LL_DMA_ConfigTransfer\n + * CR MSIZE LL_DMA_ConfigTransfer\n + * CR PL LL_DMA_ConfigTransfer\n + * CR PFCTRL LL_DMA_ConfigTransfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Configuration This parameter must be a combination of all the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY or @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH or @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @arg @ref LL_DMA_MODE_NORMAL or @ref LL_DMA_MODE_CIRCULAR or @ref LL_DMA_MODE_PFCTRL + * @arg @ref LL_DMA_PERIPH_INCREMENT or @ref LL_DMA_PERIPH_NOINCREMENT + * @arg @ref LL_DMA_MEMORY_INCREMENT or @ref LL_DMA_MEMORY_NOINCREMENT + * @arg @ref LL_DMA_PDATAALIGN_BYTE or @ref LL_DMA_PDATAALIGN_HALFWORD or @ref LL_DMA_PDATAALIGN_WORD + * @arg @ref LL_DMA_MDATAALIGN_BYTE or @ref LL_DMA_MDATAALIGN_HALFWORD or @ref LL_DMA_MDATAALIGN_WORD + * @arg @ref LL_DMA_PRIORITY_LOW or @ref LL_DMA_PRIORITY_MEDIUM or @ref LL_DMA_PRIORITY_HIGH or @ref LL_DMA_PRIORITY_VERYHIGH + *@retval None + */ +__STATIC_INLINE void LL_DMA_ConfigTransfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Configuration) +{ + MODIFY_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, + DMA_SxCR_DIR | DMA_SxCR_CIRC | DMA_SxCR_PINC | DMA_SxCR_MINC | DMA_SxCR_PSIZE | DMA_SxCR_MSIZE | DMA_SxCR_PL | DMA_SxCR_PFCTRL, + Configuration); +} + +/** + * @brief Set Data transfer direction (read from peripheral or from memory). + * @rmtoll CR DIR LL_DMA_SetDataTransferDirection + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Direction This parameter can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Direction) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR, Direction); +} + +/** + * @brief Get Data transfer direction (read from peripheral or from memory). + * @rmtoll CR DIR LL_DMA_GetDataTransferDirection + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + */ +__STATIC_INLINE uint32_t LL_DMA_GetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DIR)); +} + +/** + * @brief Set DMA mode normal, circular or peripheral flow control. + * @rmtoll CR CIRC LL_DMA_SetMode\n + * CR PFCTRL LL_DMA_SetMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_DMA_MODE_NORMAL + * @arg @ref LL_DMA_MODE_CIRCULAR + * @arg @ref LL_DMA_MODE_PFCTRL + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mode) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL, Mode); +} + +/** + * @brief Get DMA mode normal, circular or peripheral flow control. + * @rmtoll CR CIRC LL_DMA_GetMode\n + * CR PFCTRL LL_DMA_GetMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MODE_NORMAL + * @arg @ref LL_DMA_MODE_CIRCULAR + * @arg @ref LL_DMA_MODE_PFCTRL + */ +__STATIC_INLINE uint32_t LL_DMA_GetMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CIRC | DMA_SxCR_PFCTRL)); +} + +/** + * @brief Set Peripheral increment mode. + * @rmtoll CR PINC LL_DMA_SetPeriphIncMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param IncrementMode This parameter can be one of the following values: + * @arg @ref LL_DMA_PERIPH_NOINCREMENT + * @arg @ref LL_DMA_PERIPH_INCREMENT + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC, IncrementMode); +} + +/** + * @brief Get Peripheral increment mode. + * @rmtoll CR PINC LL_DMA_GetPeriphIncMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PERIPH_NOINCREMENT + * @arg @ref LL_DMA_PERIPH_INCREMENT + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINC)); +} + +/** + * @brief Set Memory increment mode. + * @rmtoll CR MINC LL_DMA_SetMemoryIncMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param IncrementMode This parameter can be one of the following values: + * @arg @ref LL_DMA_MEMORY_NOINCREMENT + * @arg @ref LL_DMA_MEMORY_INCREMENT + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t IncrementMode) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC, IncrementMode); +} + +/** + * @brief Get Memory increment mode. + * @rmtoll CR MINC LL_DMA_GetMemoryIncMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MEMORY_NOINCREMENT + * @arg @ref LL_DMA_MEMORY_INCREMENT + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MINC)); +} + +/** + * @brief Set Peripheral size. + * @rmtoll CR PSIZE LL_DMA_SetPeriphSize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Size This parameter can be one of the following values: + * @arg @ref LL_DMA_PDATAALIGN_BYTE + * @arg @ref LL_DMA_PDATAALIGN_HALFWORD + * @arg @ref LL_DMA_PDATAALIGN_WORD + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE, Size); +} + +/** + * @brief Get Peripheral size. + * @rmtoll CR PSIZE LL_DMA_GetPeriphSize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PDATAALIGN_BYTE + * @arg @ref LL_DMA_PDATAALIGN_HALFWORD + * @arg @ref LL_DMA_PDATAALIGN_WORD + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphSize(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PSIZE)); +} + +/** + * @brief Set Memory size. + * @rmtoll CR MSIZE LL_DMA_SetMemorySize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Size This parameter can be one of the following values: + * @arg @ref LL_DMA_MDATAALIGN_BYTE + * @arg @ref LL_DMA_MDATAALIGN_HALFWORD + * @arg @ref LL_DMA_MDATAALIGN_WORD + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Size) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE, Size); +} + +/** + * @brief Get Memory size. + * @rmtoll CR MSIZE LL_DMA_GetMemorySize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MDATAALIGN_BYTE + * @arg @ref LL_DMA_MDATAALIGN_HALFWORD + * @arg @ref LL_DMA_MDATAALIGN_WORD + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemorySize(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MSIZE)); +} + +/** + * @brief Set Peripheral increment offset size. + * @rmtoll CR PINCOS LL_DMA_SetIncOffsetSize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param OffsetSize This parameter can be one of the following values: + * @arg @ref LL_DMA_OFFSETSIZE_PSIZE + * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t OffsetSize) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS, OffsetSize); +} + +/** + * @brief Get Peripheral increment offset size. + * @rmtoll CR PINCOS LL_DMA_GetIncOffsetSize + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_OFFSETSIZE_PSIZE + * @arg @ref LL_DMA_OFFSETSIZE_FIXEDTO4 + */ +__STATIC_INLINE uint32_t LL_DMA_GetIncOffsetSize(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PINCOS)); +} + +/** + * @brief Set Stream priority level. + * @rmtoll CR PL LL_DMA_SetStreamPriorityLevel + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Priority This parameter can be one of the following values: + * @arg @ref LL_DMA_PRIORITY_LOW + * @arg @ref LL_DMA_PRIORITY_MEDIUM + * @arg @ref LL_DMA_PRIORITY_HIGH + * @arg @ref LL_DMA_PRIORITY_VERYHIGH + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Priority) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL, Priority); +} + +/** + * @brief Get Stream priority level. + * @rmtoll CR PL LL_DMA_GetStreamPriorityLevel + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PRIORITY_LOW + * @arg @ref LL_DMA_PRIORITY_MEDIUM + * @arg @ref LL_DMA_PRIORITY_HIGH + * @arg @ref LL_DMA_PRIORITY_VERYHIGH + */ +__STATIC_INLINE uint32_t LL_DMA_GetStreamPriorityLevel(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PL)); +} + +/** + * @brief Set Number of data to transfer. + * @rmtoll NDTR NDT LL_DMA_SetDataLength + * @note This action has no effect if + * stream is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param NbData Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetDataLength(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t NbData) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT, NbData); +} + +/** + * @brief Get Number of data to transfer. + * @rmtoll NDTR NDT LL_DMA_GetDataLength + * @note Once the stream is enabled, the return value indicate the + * remaining bytes to be transmitted. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetDataLength(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->NDTR, DMA_SxNDT)); +} + +/** + * @brief Select Channel number associated to the Stream. + * @rmtoll CR CHSEL LL_DMA_SetChannelSelection + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_0 + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Channel) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL, Channel); +} + +/** + * @brief Get the Channel number associated to the Stream. + * @rmtoll CR CHSEL LL_DMA_GetChannelSelection + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_0 + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + */ +__STATIC_INLINE uint32_t LL_DMA_GetChannelSelection(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CHSEL)); +} + +/** + * @brief Set Memory burst transfer configuration. + * @rmtoll CR MBURST LL_DMA_SetMemoryBurstxfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Mburst This parameter can be one of the following values: + * @arg @ref LL_DMA_MBURST_SINGLE + * @arg @ref LL_DMA_MBURST_INC4 + * @arg @ref LL_DMA_MBURST_INC8 + * @arg @ref LL_DMA_MBURST_INC16 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Mburst) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST, Mburst); +} + +/** + * @brief Get Memory burst transfer configuration. + * @rmtoll CR MBURST LL_DMA_GetMemoryBurstxfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MBURST_SINGLE + * @arg @ref LL_DMA_MBURST_INC4 + * @arg @ref LL_DMA_MBURST_INC8 + * @arg @ref LL_DMA_MBURST_INC16 + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_MBURST)); +} + +/** + * @brief Set Peripheral burst transfer configuration. + * @rmtoll CR PBURST LL_DMA_SetPeriphBurstxfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Pburst This parameter can be one of the following values: + * @arg @ref LL_DMA_PBURST_SINGLE + * @arg @ref LL_DMA_PBURST_INC4 + * @arg @ref LL_DMA_PBURST_INC8 + * @arg @ref LL_DMA_PBURST_INC16 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Pburst) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST, Pburst); +} + +/** + * @brief Get Peripheral burst transfer configuration. + * @rmtoll CR PBURST LL_DMA_GetPeriphBurstxfer + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PBURST_SINGLE + * @arg @ref LL_DMA_PBURST_INC4 + * @arg @ref LL_DMA_PBURST_INC8 + * @arg @ref LL_DMA_PBURST_INC16 + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphBurstxfer(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_PBURST)); +} + +/** + * @brief Set Current target (only in double buffer mode) to Memory 1 or Memory 0. + * @rmtoll CR CT LL_DMA_SetCurrentTargetMem + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param CurrentMemory This parameter can be one of the following values: + * @arg @ref LL_DMA_CURRENTTARGETMEM0 + * @arg @ref LL_DMA_CURRENTTARGETMEM1 + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t CurrentMemory) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT, CurrentMemory); +} + +/** + * @brief Set Current target (only in double buffer mode) to Memory 1 or Memory 0. + * @rmtoll CR CT LL_DMA_GetCurrentTargetMem + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_CURRENTTARGETMEM0 + * @arg @ref LL_DMA_CURRENTTARGETMEM1 + */ +__STATIC_INLINE uint32_t LL_DMA_GetCurrentTargetMem(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_CT)); +} + +/** + * @brief Enable the double buffer mode. + * @rmtoll CR DBM LL_DMA_EnableDoubleBufferMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); +} + +/** + * @brief Disable the double buffer mode. + * @rmtoll CR DBM LL_DMA_DisableDoubleBufferMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableDoubleBufferMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DBM); +} + +/** + * @brief Get FIFO status. + * @rmtoll FCR FS LL_DMA_GetFIFOStatus + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_FIFOSTATUS_0_25 + * @arg @ref LL_DMA_FIFOSTATUS_25_50 + * @arg @ref LL_DMA_FIFOSTATUS_50_75 + * @arg @ref LL_DMA_FIFOSTATUS_75_100 + * @arg @ref LL_DMA_FIFOSTATUS_EMPTY + * @arg @ref LL_DMA_FIFOSTATUS_FULL + */ +__STATIC_INLINE uint32_t LL_DMA_GetFIFOStatus(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FS)); +} + +/** + * @brief Disable Fifo mode. + * @rmtoll FCR DMDIS LL_DMA_DisableFifoMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); +} + +/** + * @brief Enable Fifo mode. + * @rmtoll FCR DMDIS LL_DMA_EnableFifoMode + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableFifoMode(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_DMDIS); +} + +/** + * @brief Select FIFO threshold. + * @rmtoll FCR FTH LL_DMA_SetFIFOThreshold + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Threshold This parameter can be one of the following values: + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 + * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Threshold) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH, Threshold); +} + +/** + * @brief Get FIFO threshold. + * @rmtoll FCR FTH LL_DMA_GetFIFOThreshold + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 + * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL + */ +__STATIC_INLINE uint32_t LL_DMA_GetFIFOThreshold(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH)); +} + +/** + * @brief Configure the FIFO . + * @rmtoll FCR FTH LL_DMA_ConfigFifo\n + * FCR DMDIS LL_DMA_ConfigFifo + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param FifoMode This parameter can be one of the following values: + * @arg @ref LL_DMA_FIFOMODE_ENABLE + * @arg @ref LL_DMA_FIFOMODE_DISABLE + * @param FifoThreshold This parameter can be one of the following values: + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_1_2 + * @arg @ref LL_DMA_FIFOTHRESHOLD_3_4 + * @arg @ref LL_DMA_FIFOTHRESHOLD_FULL + * @retval None + */ +__STATIC_INLINE void LL_DMA_ConfigFifo(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t FifoMode, uint32_t FifoThreshold) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FTH|DMA_SxFCR_DMDIS, FifoMode|FifoThreshold); +} + +/** + * @brief Configure the Source and Destination addresses. + * @note This API must not be called when the DMA stream is enabled. + * @rmtoll M0AR M0A LL_DMA_ConfigAddresses\n + * PAR PA LL_DMA_ConfigAddresses + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param SrcAddress Between 0 to 0xFFFFFFFF + * @param DstAddress Between 0 to 0xFFFFFFFF + * @param Direction This parameter can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @retval None + */ +__STATIC_INLINE void LL_DMA_ConfigAddresses(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t SrcAddress, uint32_t DstAddress, uint32_t Direction) +{ + /* Direction Memory to Periph */ + if (Direction == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) + { + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, SrcAddress); + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, DstAddress); + } + /* Direction Periph to Memory and Memory to Memory */ + else + { + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, SrcAddress); + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, DstAddress); + } +} + +/** + * @brief Set the Memory address. + * @rmtoll M0AR M0A LL_DMA_SetMemoryAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param MemoryAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); +} + +/** + * @brief Set the Peripheral address. + * @rmtoll PAR PA LL_DMA_SetPeriphAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param PeriphAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t PeriphAddress) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, PeriphAddress); +} + +/** + * @brief Get the Memory address. + * @rmtoll M0AR M0A LL_DMA_GetMemoryAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryAddress(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); +} + +/** + * @brief Get the Peripheral address. + * @rmtoll PAR PA LL_DMA_GetPeriphAddress + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphAddress(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); +} + +/** + * @brief Set the Memory to Memory Source address. + * @rmtoll PAR PA LL_DMA_SetM2MSrcAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param MemoryAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR, MemoryAddress); +} + +/** + * @brief Set the Memory to Memory Destination address. + * @rmtoll M0AR M0A LL_DMA_SetM2MDstAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @note This API must not be called when the DMA channel is enabled. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param MemoryAddress Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream, uint32_t MemoryAddress) + { + WRITE_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR, MemoryAddress); + } + +/** + * @brief Get the Memory to Memory Source address. + * @rmtoll PAR PA LL_DMA_GetM2MSrcAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MSrcAddress(DMA_TypeDef* DMAx, uint32_t Stream) + { + return (READ_REG(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->PAR)); + } + +/** + * @brief Get the Memory to Memory Destination address. + * @rmtoll M0AR M0A LL_DMA_GetM2MDstAddress + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MDstAddress(DMA_TypeDef* DMAx, uint32_t Stream) +{ + return (READ_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M0AR)); +} + +/** + * @brief Set Memory 1 address (used in case of Double buffer mode). + * @rmtoll M1AR M1A LL_DMA_SetMemory1Address + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @param Address Between 0 to 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream, uint32_t Address) +{ + MODIFY_REG(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR, DMA_SxM1AR_M1A, Address); +} + +/** + * @brief Get Memory 1 address (used in case of Double buffer mode). + * @rmtoll M1AR M1A LL_DMA_GetMemory1Address + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval Between 0 to 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemory1Address(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->M1AR); +} + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Get Stream 0 half transfer flag. + * @rmtoll LISR HTIF0 LL_DMA_IsActiveFlag_HT0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF0)==(DMA_LISR_HTIF0)); +} + +/** + * @brief Get Stream 1 half transfer flag. + * @rmtoll LISR HTIF1 LL_DMA_IsActiveFlag_HT1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF1)==(DMA_LISR_HTIF1)); +} + +/** + * @brief Get Stream 2 half transfer flag. + * @rmtoll LISR HTIF2 LL_DMA_IsActiveFlag_HT2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF2)==(DMA_LISR_HTIF2)); +} + +/** + * @brief Get Stream 3 half transfer flag. + * @rmtoll LISR HTIF3 LL_DMA_IsActiveFlag_HT3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_HTIF3)==(DMA_LISR_HTIF3)); +} + +/** + * @brief Get Stream 4 half transfer flag. + * @rmtoll HISR HTIF4 LL_DMA_IsActiveFlag_HT4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF4)==(DMA_HISR_HTIF4)); +} + +/** + * @brief Get Stream 5 half transfer flag. + * @rmtoll HISR HTIF0 LL_DMA_IsActiveFlag_HT5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF5)==(DMA_HISR_HTIF5)); +} + +/** + * @brief Get Stream 6 half transfer flag. + * @rmtoll HISR HTIF6 LL_DMA_IsActiveFlag_HT6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF6)==(DMA_HISR_HTIF6)); +} + +/** + * @brief Get Stream 7 half transfer flag. + * @rmtoll HISR HTIF7 LL_DMA_IsActiveFlag_HT7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_HTIF7)==(DMA_HISR_HTIF7)); +} + +/** + * @brief Get Stream 0 transfer complete flag. + * @rmtoll LISR TCIF0 LL_DMA_IsActiveFlag_TC0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF0)==(DMA_LISR_TCIF0)); +} + +/** + * @brief Get Stream 1 transfer complete flag. + * @rmtoll LISR TCIF1 LL_DMA_IsActiveFlag_TC1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF1)==(DMA_LISR_TCIF1)); +} + +/** + * @brief Get Stream 2 transfer complete flag. + * @rmtoll LISR TCIF2 LL_DMA_IsActiveFlag_TC2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF2)==(DMA_LISR_TCIF2)); +} + +/** + * @brief Get Stream 3 transfer complete flag. + * @rmtoll LISR TCIF3 LL_DMA_IsActiveFlag_TC3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TCIF3)==(DMA_LISR_TCIF3)); +} + +/** + * @brief Get Stream 4 transfer complete flag. + * @rmtoll HISR TCIF4 LL_DMA_IsActiveFlag_TC4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF4)==(DMA_HISR_TCIF4)); +} + +/** + * @brief Get Stream 5 transfer complete flag. + * @rmtoll HISR TCIF0 LL_DMA_IsActiveFlag_TC5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF5)==(DMA_HISR_TCIF5)); +} + +/** + * @brief Get Stream 6 transfer complete flag. + * @rmtoll HISR TCIF6 LL_DMA_IsActiveFlag_TC6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF6)==(DMA_HISR_TCIF6)); +} + +/** + * @brief Get Stream 7 transfer complete flag. + * @rmtoll HISR TCIF7 LL_DMA_IsActiveFlag_TC7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TCIF7)==(DMA_HISR_TCIF7)); +} + +/** + * @brief Get Stream 0 transfer error flag. + * @rmtoll LISR TEIF0 LL_DMA_IsActiveFlag_TE0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF0)==(DMA_LISR_TEIF0)); +} + +/** + * @brief Get Stream 1 transfer error flag. + * @rmtoll LISR TEIF1 LL_DMA_IsActiveFlag_TE1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF1)==(DMA_LISR_TEIF1)); +} + +/** + * @brief Get Stream 2 transfer error flag. + * @rmtoll LISR TEIF2 LL_DMA_IsActiveFlag_TE2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF2)==(DMA_LISR_TEIF2)); +} + +/** + * @brief Get Stream 3 transfer error flag. + * @rmtoll LISR TEIF3 LL_DMA_IsActiveFlag_TE3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_TEIF3)==(DMA_LISR_TEIF3)); +} + +/** + * @brief Get Stream 4 transfer error flag. + * @rmtoll HISR TEIF4 LL_DMA_IsActiveFlag_TE4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF4)==(DMA_HISR_TEIF4)); +} + +/** + * @brief Get Stream 5 transfer error flag. + * @rmtoll HISR TEIF0 LL_DMA_IsActiveFlag_TE5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF5)==(DMA_HISR_TEIF5)); +} + +/** + * @brief Get Stream 6 transfer error flag. + * @rmtoll HISR TEIF6 LL_DMA_IsActiveFlag_TE6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF6)==(DMA_HISR_TEIF6)); +} + +/** + * @brief Get Stream 7 transfer error flag. + * @rmtoll HISR TEIF7 LL_DMA_IsActiveFlag_TE7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_TEIF7)==(DMA_HISR_TEIF7)); +} + +/** + * @brief Get Stream 0 direct mode error flag. + * @rmtoll LISR DMEIF0 LL_DMA_IsActiveFlag_DME0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF0)==(DMA_LISR_DMEIF0)); +} + +/** + * @brief Get Stream 1 direct mode error flag. + * @rmtoll LISR DMEIF1 LL_DMA_IsActiveFlag_DME1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF1)==(DMA_LISR_DMEIF1)); +} + +/** + * @brief Get Stream 2 direct mode error flag. + * @rmtoll LISR DMEIF2 LL_DMA_IsActiveFlag_DME2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF2)==(DMA_LISR_DMEIF2)); +} + +/** + * @brief Get Stream 3 direct mode error flag. + * @rmtoll LISR DMEIF3 LL_DMA_IsActiveFlag_DME3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_DMEIF3)==(DMA_LISR_DMEIF3)); +} + +/** + * @brief Get Stream 4 direct mode error flag. + * @rmtoll HISR DMEIF4 LL_DMA_IsActiveFlag_DME4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF4)==(DMA_HISR_DMEIF4)); +} + +/** + * @brief Get Stream 5 direct mode error flag. + * @rmtoll HISR DMEIF0 LL_DMA_IsActiveFlag_DME5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF5)==(DMA_HISR_DMEIF5)); +} + +/** + * @brief Get Stream 6 direct mode error flag. + * @rmtoll HISR DMEIF6 LL_DMA_IsActiveFlag_DME6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF6)==(DMA_HISR_DMEIF6)); +} + +/** + * @brief Get Stream 7 direct mode error flag. + * @rmtoll HISR DMEIF7 LL_DMA_IsActiveFlag_DME7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_DME7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_DMEIF7)==(DMA_HISR_DMEIF7)); +} + +/** + * @brief Get Stream 0 FIFO error flag. + * @rmtoll LISR FEIF0 LL_DMA_IsActiveFlag_FE0 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE0(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF0)==(DMA_LISR_FEIF0)); +} + +/** + * @brief Get Stream 1 FIFO error flag. + * @rmtoll LISR FEIF1 LL_DMA_IsActiveFlag_FE1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF1)==(DMA_LISR_FEIF1)); +} + +/** + * @brief Get Stream 2 FIFO error flag. + * @rmtoll LISR FEIF2 LL_DMA_IsActiveFlag_FE2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF2)==(DMA_LISR_FEIF2)); +} + +/** + * @brief Get Stream 3 FIFO error flag. + * @rmtoll LISR FEIF3 LL_DMA_IsActiveFlag_FE3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->LISR ,DMA_LISR_FEIF3)==(DMA_LISR_FEIF3)); +} + +/** + * @brief Get Stream 4 FIFO error flag. + * @rmtoll HISR FEIF4 LL_DMA_IsActiveFlag_FE4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF4)==(DMA_HISR_FEIF4)); +} + +/** + * @brief Get Stream 5 FIFO error flag. + * @rmtoll HISR FEIF0 LL_DMA_IsActiveFlag_FE5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF5)==(DMA_HISR_FEIF5)); +} + +/** + * @brief Get Stream 6 FIFO error flag. + * @rmtoll HISR FEIF6 LL_DMA_IsActiveFlag_FE6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF6)==(DMA_HISR_FEIF6)); +} + +/** + * @brief Get Stream 7 FIFO error flag. + * @rmtoll HISR FEIF7 LL_DMA_IsActiveFlag_FE7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_FE7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->HISR ,DMA_HISR_FEIF7)==(DMA_HISR_FEIF7)); +} + +/** + * @brief Clear Stream 0 half transfer flag. + * @rmtoll LIFCR CHTIF0 LL_DMA_ClearFlag_HT0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF0); +} + +/** + * @brief Clear Stream 1 half transfer flag. + * @rmtoll LIFCR CHTIF1 LL_DMA_ClearFlag_HT1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF1); +} + +/** + * @brief Clear Stream 2 half transfer flag. + * @rmtoll LIFCR CHTIF2 LL_DMA_ClearFlag_HT2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF2); +} + +/** + * @brief Clear Stream 3 half transfer flag. + * @rmtoll LIFCR CHTIF3 LL_DMA_ClearFlag_HT3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CHTIF3); +} + +/** + * @brief Clear Stream 4 half transfer flag. + * @rmtoll HIFCR CHTIF4 LL_DMA_ClearFlag_HT4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF4); +} + +/** + * @brief Clear Stream 5 half transfer flag. + * @rmtoll HIFCR CHTIF5 LL_DMA_ClearFlag_HT5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF5); +} + +/** + * @brief Clear Stream 6 half transfer flag. + * @rmtoll HIFCR CHTIF6 LL_DMA_ClearFlag_HT6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF6); +} + +/** + * @brief Clear Stream 7 half transfer flag. + * @rmtoll HIFCR CHTIF7 LL_DMA_ClearFlag_HT7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CHTIF7); +} + +/** + * @brief Clear Stream 0 transfer complete flag. + * @rmtoll LIFCR CTCIF0 LL_DMA_ClearFlag_TC0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF0); +} + +/** + * @brief Clear Stream 1 transfer complete flag. + * @rmtoll LIFCR CTCIF1 LL_DMA_ClearFlag_TC1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF1); +} + +/** + * @brief Clear Stream 2 transfer complete flag. + * @rmtoll LIFCR CTCIF2 LL_DMA_ClearFlag_TC2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF2); +} + +/** + * @brief Clear Stream 3 transfer complete flag. + * @rmtoll LIFCR CTCIF3 LL_DMA_ClearFlag_TC3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTCIF3); +} + +/** + * @brief Clear Stream 4 transfer complete flag. + * @rmtoll HIFCR CTCIF4 LL_DMA_ClearFlag_TC4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF4); +} + +/** + * @brief Clear Stream 5 transfer complete flag. + * @rmtoll HIFCR CTCIF5 LL_DMA_ClearFlag_TC5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF5); +} + +/** + * @brief Clear Stream 6 transfer complete flag. + * @rmtoll HIFCR CTCIF6 LL_DMA_ClearFlag_TC6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF6); +} + +/** + * @brief Clear Stream 7 transfer complete flag. + * @rmtoll HIFCR CTCIF7 LL_DMA_ClearFlag_TC7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTCIF7); +} + +/** + * @brief Clear Stream 0 transfer error flag. + * @rmtoll LIFCR CTEIF0 LL_DMA_ClearFlag_TE0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF0); +} + +/** + * @brief Clear Stream 1 transfer error flag. + * @rmtoll LIFCR CTEIF1 LL_DMA_ClearFlag_TE1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF1); +} + +/** + * @brief Clear Stream 2 transfer error flag. + * @rmtoll LIFCR CTEIF2 LL_DMA_ClearFlag_TE2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF2); +} + +/** + * @brief Clear Stream 3 transfer error flag. + * @rmtoll LIFCR CTEIF3 LL_DMA_ClearFlag_TE3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CTEIF3); +} + +/** + * @brief Clear Stream 4 transfer error flag. + * @rmtoll HIFCR CTEIF4 LL_DMA_ClearFlag_TE4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF4); +} + +/** + * @brief Clear Stream 5 transfer error flag. + * @rmtoll HIFCR CTEIF5 LL_DMA_ClearFlag_TE5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF5); +} + +/** + * @brief Clear Stream 6 transfer error flag. + * @rmtoll HIFCR CTEIF6 LL_DMA_ClearFlag_TE6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF6); +} + +/** + * @brief Clear Stream 7 transfer error flag. + * @rmtoll HIFCR CTEIF7 LL_DMA_ClearFlag_TE7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CTEIF7); +} + +/** + * @brief Clear Stream 0 direct mode error flag. + * @rmtoll LIFCR CDMEIF0 LL_DMA_ClearFlag_DME0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF0); +} + +/** + * @brief Clear Stream 1 direct mode error flag. + * @rmtoll LIFCR CDMEIF1 LL_DMA_ClearFlag_DME1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF1); +} + +/** + * @brief Clear Stream 2 direct mode error flag. + * @rmtoll LIFCR CDMEIF2 LL_DMA_ClearFlag_DME2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF2); +} + +/** + * @brief Clear Stream 3 direct mode error flag. + * @rmtoll LIFCR CDMEIF3 LL_DMA_ClearFlag_DME3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CDMEIF3); +} + +/** + * @brief Clear Stream 4 direct mode error flag. + * @rmtoll HIFCR CDMEIF4 LL_DMA_ClearFlag_DME4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF4); +} + +/** + * @brief Clear Stream 5 direct mode error flag. + * @rmtoll HIFCR CDMEIF5 LL_DMA_ClearFlag_DME5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF5); +} + +/** + * @brief Clear Stream 6 direct mode error flag. + * @rmtoll HIFCR CDMEIF6 LL_DMA_ClearFlag_DME6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF6); +} + +/** + * @brief Clear Stream 7 direct mode error flag. + * @rmtoll HIFCR CDMEIF7 LL_DMA_ClearFlag_DME7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_DME7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CDMEIF7); +} + +/** + * @brief Clear Stream 0 FIFO error flag. + * @rmtoll LIFCR CFEIF0 LL_DMA_ClearFlag_FE0 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE0(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF0); +} + +/** + * @brief Clear Stream 1 FIFO error flag. + * @rmtoll LIFCR CFEIF1 LL_DMA_ClearFlag_FE1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF1); +} + +/** + * @brief Clear Stream 2 FIFO error flag. + * @rmtoll LIFCR CFEIF2 LL_DMA_ClearFlag_FE2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF2); +} + +/** + * @brief Clear Stream 3 FIFO error flag. + * @rmtoll LIFCR CFEIF3 LL_DMA_ClearFlag_FE3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->LIFCR , DMA_LIFCR_CFEIF3); +} + +/** + * @brief Clear Stream 4 FIFO error flag. + * @rmtoll HIFCR CFEIF4 LL_DMA_ClearFlag_FE4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF4); +} + +/** + * @brief Clear Stream 5 FIFO error flag. + * @rmtoll HIFCR CFEIF5 LL_DMA_ClearFlag_FE5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF5); +} + +/** + * @brief Clear Stream 6 FIFO error flag. + * @rmtoll HIFCR CFEIF6 LL_DMA_ClearFlag_FE6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF6); +} + +/** + * @brief Clear Stream 7 FIFO error flag. + * @rmtoll HIFCR CFEIF7 LL_DMA_ClearFlag_FE7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_FE7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->HIFCR , DMA_HIFCR_CFEIF7); +} + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable Half transfer interrupt. + * @rmtoll CR HTIE LL_DMA_EnableIT_HT + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); +} + +/** + * @brief Enable Transfer error interrupt. + * @rmtoll CR TEIE LL_DMA_EnableIT_TE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); +} + +/** + * @brief Enable Transfer complete interrupt. + * @rmtoll CR TCIE LL_DMA_EnableIT_TC + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); +} + +/** + * @brief Enable Direct mode error interrupt. + * @rmtoll CR DMEIE LL_DMA_EnableIT_DME + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); +} + +/** + * @brief Enable FIFO error interrupt. + * @rmtoll FCR FEIE LL_DMA_EnableIT_FE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + SET_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); +} + +/** + * @brief Disable Half transfer interrupt. + * @rmtoll CR HTIE LL_DMA_DisableIT_HT + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE); +} + +/** + * @brief Disable Transfer error interrupt. + * @rmtoll CR TEIE LL_DMA_DisableIT_TE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE); +} + +/** + * @brief Disable Transfer complete interrupt. + * @rmtoll CR TCIE LL_DMA_DisableIT_TC + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE); +} + +/** + * @brief Disable Direct mode error interrupt. + * @rmtoll CR DMEIE LL_DMA_DisableIT_DME + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE); +} + +/** + * @brief Disable FIFO error interrupt. + * @rmtoll FCR FEIE LL_DMA_DisableIT_FE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + CLEAR_BIT(((DMA_Stream_TypeDef *)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE); +} + +/** + * @brief Check if Half transfer interrupt is enabled. + * @rmtoll CR HTIE LL_DMA_IsEnabledIT_HT + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_HT(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_HTIE) == DMA_SxCR_HTIE); +} + +/** + * @brief Check if Transfer error nterrup is enabled. + * @rmtoll CR TEIE LL_DMA_IsEnabledIT_TE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TEIE) == DMA_SxCR_TEIE); +} + +/** + * @brief Check if Transfer complete interrupt is enabled. + * @rmtoll CR TCIE LL_DMA_IsEnabledIT_TC + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TC(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_TCIE) == DMA_SxCR_TCIE); +} + +/** + * @brief Check if Direct mode error interrupt is enabled. + * @rmtoll CR DMEIE LL_DMA_IsEnabledIT_DME + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_DME(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->CR, DMA_SxCR_DMEIE) == DMA_SxCR_DMEIE); +} + +/** + * @brief Check if FIFO error interrupt is enabled. + * @rmtoll FCR FEIE LL_DMA_IsEnabledIT_FE + * @param DMAx DMAx Instance + * @param Stream This parameter can be one of the following values: + * @arg @ref LL_DMA_STREAM_0 + * @arg @ref LL_DMA_STREAM_1 + * @arg @ref LL_DMA_STREAM_2 + * @arg @ref LL_DMA_STREAM_3 + * @arg @ref LL_DMA_STREAM_4 + * @arg @ref LL_DMA_STREAM_5 + * @arg @ref LL_DMA_STREAM_6 + * @arg @ref LL_DMA_STREAM_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_FE(DMA_TypeDef *DMAx, uint32_t Stream) +{ + return (READ_BIT(((DMA_Stream_TypeDef*)((uint32_t)((uint32_t)DMAx + STREAM_OFFSET_TAB[Stream])))->FCR, DMA_SxFCR_FEIE) == DMA_SxFCR_FEIE); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Stream, LL_DMA_InitTypeDef *DMA_InitStruct); +uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Stream); +void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DMA1 || DMA2 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_DMA_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h new file mode 100644 index 0000000..65ab691 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h @@ -0,0 +1,954 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_exti.h + * @author MCD Application Team + * @brief Header file of EXTI LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS.Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_EXTI_H +#define __STM32F4xx_LL_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (EXTI) + +/** @defgroup EXTI_LL EXTI + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private Macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup EXTI_LL_Private_Macros EXTI Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup EXTI_LL_ES_INIT EXTI Exported Init structure + * @{ + */ +typedef struct +{ + + uint32_t Line_0_31; /*!< Specifies the EXTI lines to be enabled or disabled for Lines in range 0 to 31 + This parameter can be any combination of @ref EXTI_LL_EC_LINE */ + + FunctionalState LineCommand; /*!< Specifies the new state of the selected EXTI lines. + This parameter can be set either to ENABLE or DISABLE */ + + uint8_t Mode; /*!< Specifies the mode for the EXTI lines. + This parameter can be a value of @ref EXTI_LL_EC_MODE. */ + + uint8_t Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines. + This parameter can be a value of @ref EXTI_LL_EC_TRIGGER. */ +} LL_EXTI_InitTypeDef; + +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup EXTI_LL_Exported_Constants EXTI Exported Constants + * @{ + */ + +/** @defgroup EXTI_LL_EC_LINE LINE + * @{ + */ +#define LL_EXTI_LINE_0 EXTI_IMR_IM0 /*!< Extended line 0 */ +#define LL_EXTI_LINE_1 EXTI_IMR_IM1 /*!< Extended line 1 */ +#define LL_EXTI_LINE_2 EXTI_IMR_IM2 /*!< Extended line 2 */ +#define LL_EXTI_LINE_3 EXTI_IMR_IM3 /*!< Extended line 3 */ +#define LL_EXTI_LINE_4 EXTI_IMR_IM4 /*!< Extended line 4 */ +#define LL_EXTI_LINE_5 EXTI_IMR_IM5 /*!< Extended line 5 */ +#define LL_EXTI_LINE_6 EXTI_IMR_IM6 /*!< Extended line 6 */ +#define LL_EXTI_LINE_7 EXTI_IMR_IM7 /*!< Extended line 7 */ +#define LL_EXTI_LINE_8 EXTI_IMR_IM8 /*!< Extended line 8 */ +#define LL_EXTI_LINE_9 EXTI_IMR_IM9 /*!< Extended line 9 */ +#define LL_EXTI_LINE_10 EXTI_IMR_IM10 /*!< Extended line 10 */ +#define LL_EXTI_LINE_11 EXTI_IMR_IM11 /*!< Extended line 11 */ +#define LL_EXTI_LINE_12 EXTI_IMR_IM12 /*!< Extended line 12 */ +#define LL_EXTI_LINE_13 EXTI_IMR_IM13 /*!< Extended line 13 */ +#define LL_EXTI_LINE_14 EXTI_IMR_IM14 /*!< Extended line 14 */ +#define LL_EXTI_LINE_15 EXTI_IMR_IM15 /*!< Extended line 15 */ +#if defined(EXTI_IMR_IM16) +#define LL_EXTI_LINE_16 EXTI_IMR_IM16 /*!< Extended line 16 */ +#endif +#define LL_EXTI_LINE_17 EXTI_IMR_IM17 /*!< Extended line 17 */ +#if defined(EXTI_IMR_IM18) +#define LL_EXTI_LINE_18 EXTI_IMR_IM18 /*!< Extended line 18 */ +#endif +#define LL_EXTI_LINE_19 EXTI_IMR_IM19 /*!< Extended line 19 */ +#if defined(EXTI_IMR_IM20) +#define LL_EXTI_LINE_20 EXTI_IMR_IM20 /*!< Extended line 20 */ +#endif +#if defined(EXTI_IMR_IM21) +#define LL_EXTI_LINE_21 EXTI_IMR_IM21 /*!< Extended line 21 */ +#endif +#if defined(EXTI_IMR_IM22) +#define LL_EXTI_LINE_22 EXTI_IMR_IM22 /*!< Extended line 22 */ +#endif +#if defined(EXTI_IMR_IM23) +#define LL_EXTI_LINE_23 EXTI_IMR_IM23 /*!< Extended line 23 */ +#endif +#if defined(EXTI_IMR_IM24) +#define LL_EXTI_LINE_24 EXTI_IMR_IM24 /*!< Extended line 24 */ +#endif +#if defined(EXTI_IMR_IM25) +#define LL_EXTI_LINE_25 EXTI_IMR_IM25 /*!< Extended line 25 */ +#endif +#if defined(EXTI_IMR_IM26) +#define LL_EXTI_LINE_26 EXTI_IMR_IM26 /*!< Extended line 26 */ +#endif +#if defined(EXTI_IMR_IM27) +#define LL_EXTI_LINE_27 EXTI_IMR_IM27 /*!< Extended line 27 */ +#endif +#if defined(EXTI_IMR_IM28) +#define LL_EXTI_LINE_28 EXTI_IMR_IM28 /*!< Extended line 28 */ +#endif +#if defined(EXTI_IMR_IM29) +#define LL_EXTI_LINE_29 EXTI_IMR_IM29 /*!< Extended line 29 */ +#endif +#if defined(EXTI_IMR_IM30) +#define LL_EXTI_LINE_30 EXTI_IMR_IM30 /*!< Extended line 30 */ +#endif +#if defined(EXTI_IMR_IM31) +#define LL_EXTI_LINE_31 EXTI_IMR_IM31 /*!< Extended line 31 */ +#endif +#define LL_EXTI_LINE_ALL_0_31 EXTI_IMR_IM /*!< All Extended line not reserved*/ + + +#define LL_EXTI_LINE_ALL ((uint32_t)0xFFFFFFFFU) /*!< All Extended line */ + +#if defined(USE_FULL_LL_DRIVER) +#define LL_EXTI_LINE_NONE ((uint32_t)0x00000000U) /*!< None Extended line */ +#endif /*USE_FULL_LL_DRIVER*/ + +/** + * @} + */ +#if defined(USE_FULL_LL_DRIVER) + +/** @defgroup EXTI_LL_EC_MODE Mode + * @{ + */ +#define LL_EXTI_MODE_IT ((uint8_t)0x00U) /*!< Interrupt Mode */ +#define LL_EXTI_MODE_EVENT ((uint8_t)0x01U) /*!< Event Mode */ +#define LL_EXTI_MODE_IT_EVENT ((uint8_t)0x02U) /*!< Interrupt & Event Mode */ +/** + * @} + */ + +/** @defgroup EXTI_LL_EC_TRIGGER Edge Trigger + * @{ + */ +#define LL_EXTI_TRIGGER_NONE ((uint8_t)0x00U) /*!< No Trigger Mode */ +#define LL_EXTI_TRIGGER_RISING ((uint8_t)0x01U) /*!< Trigger Rising Mode */ +#define LL_EXTI_TRIGGER_FALLING ((uint8_t)0x02U) /*!< Trigger Falling Mode */ +#define LL_EXTI_TRIGGER_RISING_FALLING ((uint8_t)0x03U) /*!< Trigger Rising & Falling Mode */ + +/** + * @} + */ + + +#endif /*USE_FULL_LL_DRIVER*/ + + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup EXTI_LL_Exported_Macros EXTI Exported Macros + * @{ + */ + +/** @defgroup EXTI_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in EXTI register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_EXTI_WriteReg(__REG__, __VALUE__) WRITE_REG(EXTI->__REG__, (__VALUE__)) + +/** + * @brief Read a value in EXTI register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_EXTI_ReadReg(__REG__) READ_REG(EXTI->__REG__) +/** + * @} + */ + + +/** + * @} + */ + + + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup EXTI_LL_Exported_Functions EXTI Exported Functions + * @{ + */ +/** @defgroup EXTI_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable ExtiLine Interrupt request for Lines in range 0 to 31 + * @note The reset value for the direct or internal lines (see RM) + * is set to 1 in order to enable the interrupt by default. + * Bits are set automatically at Power on. + * @rmtoll IMR IMx LL_EXTI_EnableIT_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableIT_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->IMR, ExtiLine); +} + +/** + * @brief Disable ExtiLine Interrupt request for Lines in range 0 to 31 + * @note The reset value for the direct or internal lines (see RM) + * is set to 1 in order to enable the interrupt by default. + * Bits are set automatically at Power on. + * @rmtoll IMR IMx LL_EXTI_DisableIT_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableIT_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->IMR, ExtiLine); +} + + +/** + * @brief Indicate if ExtiLine Interrupt request is enabled for Lines in range 0 to 31 + * @note The reset value for the direct or internal lines (see RM) + * is set to 1 in order to enable the interrupt by default. + * Bits are set automatically at Power on. + * @rmtoll IMR IMx LL_EXTI_IsEnabledIT_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledIT_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->IMR, ExtiLine) == (ExtiLine)); +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Event_Management Event_Management + * @{ + */ + +/** + * @brief Enable ExtiLine Event request for Lines in range 0 to 31 + * @rmtoll EMR EMx LL_EXTI_EnableEvent_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableEvent_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->EMR, ExtiLine); + +} + + +/** + * @brief Disable ExtiLine Event request for Lines in range 0 to 31 + * @rmtoll EMR EMx LL_EXTI_DisableEvent_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableEvent_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->EMR, ExtiLine); +} + + +/** + * @brief Indicate if ExtiLine Event request is enabled for Lines in range 0 to 31 + * @rmtoll EMR EMx LL_EXTI_IsEnabledEvent_0_31 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_17 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @arg @ref LL_EXTI_LINE_23(*) + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledEvent_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->EMR, ExtiLine) == (ExtiLine)); + +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Rising_Trigger_Management Rising_Trigger_Management + * @{ + */ + +/** + * @brief Enable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 + * @note The configurable wakeup lines are edge-triggered. No glitch must be + * generated on these lines. If a rising edge on a configurable interrupt + * line occurs during a write operation in the EXTI_RTSR register, the + * pending bit is not set. + * Rising and falling edge triggers can be set for + * the same interrupt line. In this case, both generate a trigger + * condition. + * @rmtoll RTSR RTx LL_EXTI_EnableRisingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableRisingTrig_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->RTSR, ExtiLine); + +} + + +/** + * @brief Disable ExtiLine Rising Edge Trigger for Lines in range 0 to 31 + * @note The configurable wakeup lines are edge-triggered. No glitch must be + * generated on these lines. If a rising edge on a configurable interrupt + * line occurs during a write operation in the EXTI_RTSR register, the + * pending bit is not set. + * Rising and falling edge triggers can be set for + * the same interrupt line. In this case, both generate a trigger + * condition. + * @rmtoll RTSR RTx LL_EXTI_DisableRisingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableRisingTrig_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->RTSR, ExtiLine); + +} + + +/** + * @brief Check if rising edge trigger is enabled for Lines in range 0 to 31 + * @rmtoll RTSR RTx LL_EXTI_IsEnabledRisingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledRisingTrig_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->RTSR, ExtiLine) == (ExtiLine)); +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Falling_Trigger_Management Falling_Trigger_Management + * @{ + */ + +/** + * @brief Enable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 + * @note The configurable wakeup lines are edge-triggered. No glitch must be + * generated on these lines. If a falling edge on a configurable interrupt + * line occurs during a write operation in the EXTI_FTSR register, the + * pending bit is not set. + * Rising and falling edge triggers can be set for + * the same interrupt line. In this case, both generate a trigger + * condition. + * @rmtoll FTSR FTx LL_EXTI_EnableFallingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableFallingTrig_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->FTSR, ExtiLine); +} + + +/** + * @brief Disable ExtiLine Falling Edge Trigger for Lines in range 0 to 31 + * @note The configurable wakeup lines are edge-triggered. No glitch must be + * generated on these lines. If a Falling edge on a configurable interrupt + * line occurs during a write operation in the EXTI_FTSR register, the + * pending bit is not set. + * Rising and falling edge triggers can be set for the same interrupt line. + * In this case, both generate a trigger condition. + * @rmtoll FTSR FTx LL_EXTI_DisableFallingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableFallingTrig_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->FTSR, ExtiLine); +} + + +/** + * @brief Check if falling edge trigger is enabled for Lines in range 0 to 31 + * @rmtoll FTSR FTx LL_EXTI_IsEnabledFallingTrig_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledFallingTrig_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->FTSR, ExtiLine) == (ExtiLine)); +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Software_Interrupt_Management Software_Interrupt_Management + * @{ + */ + +/** + * @brief Generate a software Interrupt Event for Lines in range 0 to 31 + * @note If the interrupt is enabled on this line in the EXTI_IMR, writing a 1 to + * this bit when it is at '0' sets the corresponding pending bit in EXTI_PR + * resulting in an interrupt request generation. + * This bit is cleared by clearing the corresponding bit in the EXTI_PR + * register (by writing a 1 into the bit) + * @rmtoll SWIER SWIx LL_EXTI_GenerateSWI_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_GenerateSWI_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->SWIER, ExtiLine); +} + + +/** + * @} + */ + +/** @defgroup EXTI_LL_EF_Flag_Management Flag_Management + * @{ + */ + +/** + * @brief Check if the ExtLine Flag is set or not for Lines in range 0 to 31 + * @note This bit is set when the selected edge event arrives on the interrupt + * line. This bit is cleared by writing a 1 to the bit. + * @rmtoll PR PIFx LL_EXTI_IsActiveFlag_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->PR, ExtiLine) == (ExtiLine)); +} + + +/** + * @brief Read ExtLine Combination Flag for Lines in range 0 to 31 + * @note This bit is set when the selected edge event arrives on the interrupt + * line. This bit is cleared by writing a 1 to the bit. + * @rmtoll PR PIFx LL_EXTI_ReadFlag_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval @note This bit is set when the selected edge event arrives on the interrupt + */ +__STATIC_INLINE uint32_t LL_EXTI_ReadFlag_0_31(uint32_t ExtiLine) +{ + return (uint32_t)(READ_BIT(EXTI->PR, ExtiLine)); +} + + +/** + * @brief Clear ExtLine Flags for Lines in range 0 to 31 + * @note This bit is set when the selected edge event arrives on the interrupt + * line. This bit is cleared by writing a 1 to the bit. + * @rmtoll PR PIFx LL_EXTI_ClearFlag_0_31 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_0 + * @arg @ref LL_EXTI_LINE_1 + * @arg @ref LL_EXTI_LINE_2 + * @arg @ref LL_EXTI_LINE_3 + * @arg @ref LL_EXTI_LINE_4 + * @arg @ref LL_EXTI_LINE_5 + * @arg @ref LL_EXTI_LINE_6 + * @arg @ref LL_EXTI_LINE_7 + * @arg @ref LL_EXTI_LINE_8 + * @arg @ref LL_EXTI_LINE_9 + * @arg @ref LL_EXTI_LINE_10 + * @arg @ref LL_EXTI_LINE_11 + * @arg @ref LL_EXTI_LINE_12 + * @arg @ref LL_EXTI_LINE_13 + * @arg @ref LL_EXTI_LINE_14 + * @arg @ref LL_EXTI_LINE_15 + * @arg @ref LL_EXTI_LINE_16 + * @arg @ref LL_EXTI_LINE_18 + * @arg @ref LL_EXTI_LINE_19(*) + * @arg @ref LL_EXTI_LINE_20(*) + * @arg @ref LL_EXTI_LINE_21 + * @arg @ref LL_EXTI_LINE_22 + * @note (*): Available in some devices + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_ClearFlag_0_31(uint32_t ExtiLine) +{ + WRITE_REG(EXTI->PR, ExtiLine); +} + + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup EXTI_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +uint32_t LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct); +uint32_t LL_EXTI_DeInit(void); +void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct); + + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* EXTI */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_EXTI_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h new file mode 100644 index 0000000..6bee7fd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h @@ -0,0 +1,981 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_gpio.h + * @author MCD Application Team + * @brief Header file of GPIO LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_GPIO_H +#define __STM32F4xx_LL_GPIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) + +/** @defgroup GPIO_LL GPIO + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup GPIO_LL_Private_Macros GPIO Private Macros + * @{ + */ + +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup GPIO_LL_ES_INIT GPIO Exported Init structures + * @{ + */ + +/** + * @brief LL GPIO Init Structure definition + */ +typedef struct +{ + uint32_t Pin; /*!< Specifies the GPIO pins to be configured. + This parameter can be any value of @ref GPIO_LL_EC_PIN */ + + uint32_t Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_MODE. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinMode().*/ + + uint32_t Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_SPEED. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinSpeed().*/ + + uint32_t OutputType; /*!< Specifies the operating output type for the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_OUTPUT. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinOutputType().*/ + + uint32_t Pull; /*!< Specifies the operating Pull-up/Pull down for the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_PULL. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetPinPull().*/ + + uint32_t Alternate; /*!< Specifies the Peripheral to be connected to the selected pins. + This parameter can be a value of @ref GPIO_LL_EC_AF. + + GPIO HW configuration can be modified afterwards using unitary function @ref LL_GPIO_SetAFPin_0_7() and LL_GPIO_SetAFPin_8_15().*/ +} LL_GPIO_InitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup GPIO_LL_Exported_Constants GPIO Exported Constants + * @{ + */ + +/** @defgroup GPIO_LL_EC_PIN PIN + * @{ + */ +#define LL_GPIO_PIN_0 GPIO_BSRR_BS_0 /*!< Select pin 0 */ +#define LL_GPIO_PIN_1 GPIO_BSRR_BS_1 /*!< Select pin 1 */ +#define LL_GPIO_PIN_2 GPIO_BSRR_BS_2 /*!< Select pin 2 */ +#define LL_GPIO_PIN_3 GPIO_BSRR_BS_3 /*!< Select pin 3 */ +#define LL_GPIO_PIN_4 GPIO_BSRR_BS_4 /*!< Select pin 4 */ +#define LL_GPIO_PIN_5 GPIO_BSRR_BS_5 /*!< Select pin 5 */ +#define LL_GPIO_PIN_6 GPIO_BSRR_BS_6 /*!< Select pin 6 */ +#define LL_GPIO_PIN_7 GPIO_BSRR_BS_7 /*!< Select pin 7 */ +#define LL_GPIO_PIN_8 GPIO_BSRR_BS_8 /*!< Select pin 8 */ +#define LL_GPIO_PIN_9 GPIO_BSRR_BS_9 /*!< Select pin 9 */ +#define LL_GPIO_PIN_10 GPIO_BSRR_BS_10 /*!< Select pin 10 */ +#define LL_GPIO_PIN_11 GPIO_BSRR_BS_11 /*!< Select pin 11 */ +#define LL_GPIO_PIN_12 GPIO_BSRR_BS_12 /*!< Select pin 12 */ +#define LL_GPIO_PIN_13 GPIO_BSRR_BS_13 /*!< Select pin 13 */ +#define LL_GPIO_PIN_14 GPIO_BSRR_BS_14 /*!< Select pin 14 */ +#define LL_GPIO_PIN_15 GPIO_BSRR_BS_15 /*!< Select pin 15 */ +#define LL_GPIO_PIN_ALL (GPIO_BSRR_BS_0 | GPIO_BSRR_BS_1 | GPIO_BSRR_BS_2 | \ + GPIO_BSRR_BS_3 | GPIO_BSRR_BS_4 | GPIO_BSRR_BS_5 | \ + GPIO_BSRR_BS_6 | GPIO_BSRR_BS_7 | GPIO_BSRR_BS_8 | \ + GPIO_BSRR_BS_9 | GPIO_BSRR_BS_10 | GPIO_BSRR_BS_11 | \ + GPIO_BSRR_BS_12 | GPIO_BSRR_BS_13 | GPIO_BSRR_BS_14 | \ + GPIO_BSRR_BS_15) /*!< Select all pins */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_MODE Mode + * @{ + */ +#define LL_GPIO_MODE_INPUT (0x00000000U) /*!< Select input mode */ +#define LL_GPIO_MODE_OUTPUT GPIO_MODER_MODER0_0 /*!< Select output mode */ +#define LL_GPIO_MODE_ALTERNATE GPIO_MODER_MODER0_1 /*!< Select alternate function mode */ +#define LL_GPIO_MODE_ANALOG GPIO_MODER_MODER0 /*!< Select analog mode */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_OUTPUT Output Type + * @{ + */ +#define LL_GPIO_OUTPUT_PUSHPULL (0x00000000U) /*!< Select push-pull as output type */ +#define LL_GPIO_OUTPUT_OPENDRAIN GPIO_OTYPER_OT_0 /*!< Select open-drain as output type */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_SPEED Output Speed + * @{ + */ +#define LL_GPIO_SPEED_FREQ_LOW (0x00000000U) /*!< Select I/O low output speed */ +#define LL_GPIO_SPEED_FREQ_MEDIUM GPIO_OSPEEDER_OSPEEDR0_0 /*!< Select I/O medium output speed */ +#define LL_GPIO_SPEED_FREQ_HIGH GPIO_OSPEEDER_OSPEEDR0_1 /*!< Select I/O fast output speed */ +#define LL_GPIO_SPEED_FREQ_VERY_HIGH GPIO_OSPEEDER_OSPEEDR0 /*!< Select I/O high output speed */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_PULL Pull Up Pull Down + * @{ + */ +#define LL_GPIO_PULL_NO (0x00000000U) /*!< Select I/O no pull */ +#define LL_GPIO_PULL_UP GPIO_PUPDR_PUPDR0_0 /*!< Select I/O pull up */ +#define LL_GPIO_PULL_DOWN GPIO_PUPDR_PUPDR0_1 /*!< Select I/O pull down */ +/** + * @} + */ + +/** @defgroup GPIO_LL_EC_AF Alternate Function + * @{ + */ +#define LL_GPIO_AF_0 (0x0000000U) /*!< Select alternate function 0 */ +#define LL_GPIO_AF_1 (0x0000001U) /*!< Select alternate function 1 */ +#define LL_GPIO_AF_2 (0x0000002U) /*!< Select alternate function 2 */ +#define LL_GPIO_AF_3 (0x0000003U) /*!< Select alternate function 3 */ +#define LL_GPIO_AF_4 (0x0000004U) /*!< Select alternate function 4 */ +#define LL_GPIO_AF_5 (0x0000005U) /*!< Select alternate function 5 */ +#define LL_GPIO_AF_6 (0x0000006U) /*!< Select alternate function 6 */ +#define LL_GPIO_AF_7 (0x0000007U) /*!< Select alternate function 7 */ +#define LL_GPIO_AF_8 (0x0000008U) /*!< Select alternate function 8 */ +#define LL_GPIO_AF_9 (0x0000009U) /*!< Select alternate function 9 */ +#define LL_GPIO_AF_10 (0x000000AU) /*!< Select alternate function 10 */ +#define LL_GPIO_AF_11 (0x000000BU) /*!< Select alternate function 11 */ +#define LL_GPIO_AF_12 (0x000000CU) /*!< Select alternate function 12 */ +#define LL_GPIO_AF_13 (0x000000DU) /*!< Select alternate function 13 */ +#define LL_GPIO_AF_14 (0x000000EU) /*!< Select alternate function 14 */ +#define LL_GPIO_AF_15 (0x000000FU) /*!< Select alternate function 15 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup GPIO_LL_Exported_Macros GPIO Exported Macros + * @{ + */ + +/** @defgroup GPIO_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in GPIO register + * @param __INSTANCE__ GPIO Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_GPIO_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in GPIO register + * @param __INSTANCE__ GPIO Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup GPIO_LL_Exported_Functions GPIO Exported Functions + * @{ + */ + +/** @defgroup GPIO_LL_EF_Port_Configuration Port Configuration + * @{ + */ + +/** + * @brief Configure gpio mode for a dedicated pin on dedicated port. + * @note I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll MODER MODEy LL_GPIO_SetPinMode + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_GPIO_MODE_INPUT + * @arg @ref LL_GPIO_MODE_OUTPUT + * @arg @ref LL_GPIO_MODE_ALTERNATE + * @arg @ref LL_GPIO_MODE_ANALOG + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Mode) +{ + MODIFY_REG(GPIOx->MODER, (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U)), (Mode << (POSITION_VAL(Pin) * 2U))); +} + +/** + * @brief Return gpio mode for a dedicated pin on dedicated port. + * @note I/O mode can be Input mode, General purpose output, Alternate function mode or Analog. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll MODER MODEy LL_GPIO_GetPinMode + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_MODE_INPUT + * @arg @ref LL_GPIO_MODE_OUTPUT + * @arg @ref LL_GPIO_MODE_ALTERNATE + * @arg @ref LL_GPIO_MODE_ANALOG + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinMode(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->MODER, + (GPIO_MODER_MODER0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); +} + +/** + * @brief Configure gpio output type for several pins on dedicated port. + * @note Output type as to be set when gpio pin is in output or + * alternate modes. Possible type are Push-pull or Open-drain. + * @rmtoll OTYPER OTy LL_GPIO_SetPinOutputType + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @param OutputType This parameter can be one of the following values: + * @arg @ref LL_GPIO_OUTPUT_PUSHPULL + * @arg @ref LL_GPIO_OUTPUT_OPENDRAIN + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t PinMask, uint32_t OutputType) +{ + MODIFY_REG(GPIOx->OTYPER, PinMask, (PinMask * OutputType)); +} + +/** + * @brief Return gpio output type for several pins on dedicated port. + * @note Output type as to be set when gpio pin is in output or + * alternate modes. Possible type are Push-pull or Open-drain. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll OTYPER OTy LL_GPIO_GetPinOutputType + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_OUTPUT_PUSHPULL + * @arg @ref LL_GPIO_OUTPUT_OPENDRAIN + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinOutputType(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->OTYPER, Pin) >> POSITION_VAL(Pin)); +} + +/** + * @brief Configure gpio speed for a dedicated pin on dedicated port. + * @note I/O speed can be Low, Medium, Fast or High speed. + * @note Warning: only one pin can be passed as parameter. + * @note Refer to datasheet for frequency specifications and the power + * supply and load conditions for each speed. + * @rmtoll OSPEEDR OSPEEDy LL_GPIO_SetPinSpeed + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @param Speed This parameter can be one of the following values: + * @arg @ref LL_GPIO_SPEED_FREQ_LOW + * @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM + * @arg @ref LL_GPIO_SPEED_FREQ_HIGH + * @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Speed) +{ + MODIFY_REG(GPIOx->OSPEEDR, (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U)), + (Speed << (POSITION_VAL(Pin) * 2U))); +} + +/** + * @brief Return gpio speed for a dedicated pin on dedicated port. + * @note I/O speed can be Low, Medium, Fast or High speed. + * @note Warning: only one pin can be passed as parameter. + * @note Refer to datasheet for frequency specifications and the power + * supply and load conditions for each speed. + * @rmtoll OSPEEDR OSPEEDy LL_GPIO_GetPinSpeed + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_SPEED_FREQ_LOW + * @arg @ref LL_GPIO_SPEED_FREQ_MEDIUM + * @arg @ref LL_GPIO_SPEED_FREQ_HIGH + * @arg @ref LL_GPIO_SPEED_FREQ_VERY_HIGH + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinSpeed(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->OSPEEDR, + (GPIO_OSPEEDER_OSPEEDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); +} + +/** + * @brief Configure gpio pull-up or pull-down for a dedicated pin on a dedicated port. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll PUPDR PUPDy LL_GPIO_SetPinPull + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @param Pull This parameter can be one of the following values: + * @arg @ref LL_GPIO_PULL_NO + * @arg @ref LL_GPIO_PULL_UP + * @arg @ref LL_GPIO_PULL_DOWN + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Pull) +{ + MODIFY_REG(GPIOx->PUPDR, (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U)), (Pull << (POSITION_VAL(Pin) * 2U))); +} + +/** + * @brief Return gpio pull-up or pull-down for a dedicated pin on a dedicated port + * @note Warning: only one pin can be passed as parameter. + * @rmtoll PUPDR PUPDy LL_GPIO_GetPinPull + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_PULL_NO + * @arg @ref LL_GPIO_PULL_UP + * @arg @ref LL_GPIO_PULL_DOWN + */ +__STATIC_INLINE uint32_t LL_GPIO_GetPinPull(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->PUPDR, + (GPIO_PUPDR_PUPDR0 << (POSITION_VAL(Pin) * 2U))) >> (POSITION_VAL(Pin) * 2U)); +} + +/** + * @brief Configure gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. + * @note Possible values are from AF0 to AF15 depending on target. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll AFRL AFSELy LL_GPIO_SetAFPin_0_7 + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @param Alternate This parameter can be one of the following values: + * @arg @ref LL_GPIO_AF_0 + * @arg @ref LL_GPIO_AF_1 + * @arg @ref LL_GPIO_AF_2 + * @arg @ref LL_GPIO_AF_3 + * @arg @ref LL_GPIO_AF_4 + * @arg @ref LL_GPIO_AF_5 + * @arg @ref LL_GPIO_AF_6 + * @arg @ref LL_GPIO_AF_7 + * @arg @ref LL_GPIO_AF_8 + * @arg @ref LL_GPIO_AF_9 + * @arg @ref LL_GPIO_AF_10 + * @arg @ref LL_GPIO_AF_11 + * @arg @ref LL_GPIO_AF_12 + * @arg @ref LL_GPIO_AF_13 + * @arg @ref LL_GPIO_AF_14 + * @arg @ref LL_GPIO_AF_15 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) +{ + MODIFY_REG(GPIOx->AFR[0], (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U)), + (Alternate << (POSITION_VAL(Pin) * 4U))); +} + +/** + * @brief Return gpio alternate function of a dedicated pin from 0 to 7 for a dedicated port. + * @rmtoll AFRL AFSELy LL_GPIO_GetAFPin_0_7 + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_AF_0 + * @arg @ref LL_GPIO_AF_1 + * @arg @ref LL_GPIO_AF_2 + * @arg @ref LL_GPIO_AF_3 + * @arg @ref LL_GPIO_AF_4 + * @arg @ref LL_GPIO_AF_5 + * @arg @ref LL_GPIO_AF_6 + * @arg @ref LL_GPIO_AF_7 + * @arg @ref LL_GPIO_AF_8 + * @arg @ref LL_GPIO_AF_9 + * @arg @ref LL_GPIO_AF_10 + * @arg @ref LL_GPIO_AF_11 + * @arg @ref LL_GPIO_AF_12 + * @arg @ref LL_GPIO_AF_13 + * @arg @ref LL_GPIO_AF_14 + * @arg @ref LL_GPIO_AF_15 + */ +__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_0_7(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->AFR[0], + (GPIO_AFRL_AFSEL0 << (POSITION_VAL(Pin) * 4U))) >> (POSITION_VAL(Pin) * 4U)); +} + +/** + * @brief Configure gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. + * @note Possible values are from AF0 to AF15 depending on target. + * @note Warning: only one pin can be passed as parameter. + * @rmtoll AFRH AFSELy LL_GPIO_SetAFPin_8_15 + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @param Alternate This parameter can be one of the following values: + * @arg @ref LL_GPIO_AF_0 + * @arg @ref LL_GPIO_AF_1 + * @arg @ref LL_GPIO_AF_2 + * @arg @ref LL_GPIO_AF_3 + * @arg @ref LL_GPIO_AF_4 + * @arg @ref LL_GPIO_AF_5 + * @arg @ref LL_GPIO_AF_6 + * @arg @ref LL_GPIO_AF_7 + * @arg @ref LL_GPIO_AF_8 + * @arg @ref LL_GPIO_AF_9 + * @arg @ref LL_GPIO_AF_10 + * @arg @ref LL_GPIO_AF_11 + * @arg @ref LL_GPIO_AF_12 + * @arg @ref LL_GPIO_AF_13 + * @arg @ref LL_GPIO_AF_14 + * @arg @ref LL_GPIO_AF_15 + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin, uint32_t Alternate) +{ + MODIFY_REG(GPIOx->AFR[1], (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U)), + (Alternate << (POSITION_VAL(Pin >> 8U) * 4U))); +} + +/** + * @brief Return gpio alternate function of a dedicated pin from 8 to 15 for a dedicated port. + * @note Possible values are from AF0 to AF15 depending on target. + * @rmtoll AFRH AFSELy LL_GPIO_GetAFPin_8_15 + * @param GPIOx GPIO Port + * @param Pin This parameter can be one of the following values: + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_GPIO_AF_0 + * @arg @ref LL_GPIO_AF_1 + * @arg @ref LL_GPIO_AF_2 + * @arg @ref LL_GPIO_AF_3 + * @arg @ref LL_GPIO_AF_4 + * @arg @ref LL_GPIO_AF_5 + * @arg @ref LL_GPIO_AF_6 + * @arg @ref LL_GPIO_AF_7 + * @arg @ref LL_GPIO_AF_8 + * @arg @ref LL_GPIO_AF_9 + * @arg @ref LL_GPIO_AF_10 + * @arg @ref LL_GPIO_AF_11 + * @arg @ref LL_GPIO_AF_12 + * @arg @ref LL_GPIO_AF_13 + * @arg @ref LL_GPIO_AF_14 + * @arg @ref LL_GPIO_AF_15 + */ +__STATIC_INLINE uint32_t LL_GPIO_GetAFPin_8_15(GPIO_TypeDef *GPIOx, uint32_t Pin) +{ + return (uint32_t)(READ_BIT(GPIOx->AFR[1], + (GPIO_AFRH_AFSEL8 << (POSITION_VAL(Pin >> 8U) * 4U))) >> (POSITION_VAL(Pin >> 8U) * 4U)); +} + + +/** + * @brief Lock configuration of several pins for a dedicated port. + * @note When the lock sequence has been applied on a port bit, the + * value of this port bit can no longer be modified until the + * next reset. + * @note Each lock bit freezes a specific configuration register + * (control and alternate function registers). + * @rmtoll LCKR LCKK LL_GPIO_LockPin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + __IO uint32_t temp; + WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); + WRITE_REG(GPIOx->LCKR, PinMask); + WRITE_REG(GPIOx->LCKR, GPIO_LCKR_LCKK | PinMask); + temp = READ_REG(GPIOx->LCKR); + (void) temp; +} + +/** + * @brief Return 1 if all pins passed as parameter, of a dedicated port, are locked. else Return 0. + * @rmtoll LCKR LCKy LL_GPIO_IsPinLocked + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_IsPinLocked(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + return (READ_BIT(GPIOx->LCKR, PinMask) == (PinMask)); +} + +/** + * @brief Return 1 if one of the pin of a dedicated port is locked. else return 0. + * @rmtoll LCKR LCKK LL_GPIO_IsAnyPinLocked + * @param GPIOx GPIO Port + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_IsAnyPinLocked(GPIO_TypeDef *GPIOx) +{ + return (READ_BIT(GPIOx->LCKR, GPIO_LCKR_LCKK) == (GPIO_LCKR_LCKK)); +} + +/** + * @} + */ + +/** @defgroup GPIO_LL_EF_Data_Access Data Access + * @{ + */ + +/** + * @brief Return full input data register value for a dedicated port. + * @rmtoll IDR IDy LL_GPIO_ReadInputPort + * @param GPIOx GPIO Port + * @retval Input data register value of port + */ +__STATIC_INLINE uint32_t LL_GPIO_ReadInputPort(GPIO_TypeDef *GPIOx) +{ + return (uint32_t)(READ_REG(GPIOx->IDR)); +} + +/** + * @brief Return if input data level for several pins of dedicated port is high or low. + * @rmtoll IDR IDy LL_GPIO_IsInputPinSet + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_IsInputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + return (READ_BIT(GPIOx->IDR, PinMask) == (PinMask)); +} + +/** + * @brief Write output data register for the port. + * @rmtoll ODR ODy LL_GPIO_WriteOutputPort + * @param GPIOx GPIO Port + * @param PortValue Level value for each pin of the port + * @retval None + */ +__STATIC_INLINE void LL_GPIO_WriteOutputPort(GPIO_TypeDef *GPIOx, uint32_t PortValue) +{ + WRITE_REG(GPIOx->ODR, PortValue); +} + +/** + * @brief Return full output data register value for a dedicated port. + * @rmtoll ODR ODy LL_GPIO_ReadOutputPort + * @param GPIOx GPIO Port + * @retval Output data register value of port + */ +__STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx) +{ + return (uint32_t)(READ_REG(GPIOx->ODR)); +} + +/** + * @brief Return if input data level for several pins of dedicated port is high or low. + * @rmtoll ODR ODy LL_GPIO_IsOutputPinSet + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_GPIO_IsOutputPinSet(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + return (READ_BIT(GPIOx->ODR, PinMask) == (PinMask)); +} + +/** + * @brief Set several pins to high level on dedicated gpio port. + * @rmtoll BSRR BSy LL_GPIO_SetOutputPin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + WRITE_REG(GPIOx->BSRR, PinMask); +} + +/** + * @brief Set several pins to low level on dedicated gpio port. + * @rmtoll BSRR BRy LL_GPIO_ResetOutputPin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + WRITE_REG(GPIOx->BSRR, (PinMask << 16)); +} + +/** + * @brief Toggle data value for several pin of dedicated port. + * @rmtoll ODR ODy LL_GPIO_TogglePin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + uint32_t odr = READ_REG(GPIOx->ODR); + WRITE_REG(GPIOx->BSRR, ((odr & PinMask) << 16u) | (~odr & PinMask)); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup GPIO_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_GPIO_DeInit(GPIO_TypeDef *GPIOx); +ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct); +void LL_GPIO_StructInit(LL_GPIO_InitTypeDef *GPIO_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) || defined (GPIOI) || defined (GPIOJ) || defined (GPIOK) */ +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_GPIO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h new file mode 100644 index 0000000..ea23dc5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h @@ -0,0 +1,985 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_pwr.h + * @author MCD Application Team + * @brief Header file of PWR LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_PWR_H +#define __STM32F4xx_LL_PWR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(PWR) + +/** @defgroup PWR_LL PWR + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Constants PWR Exported Constants + * @{ + */ + +/** @defgroup PWR_LL_EC_CLEAR_FLAG Clear Flags Defines + * @brief Flags defines which can be used with LL_PWR_WriteReg function + * @{ + */ +#define LL_PWR_CR_CSBF PWR_CR_CSBF /*!< Clear standby flag */ +#define LL_PWR_CR_CWUF PWR_CR_CWUF /*!< Clear wakeup flag */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_PWR_ReadReg function + * @{ + */ +#define LL_PWR_CSR_WUF PWR_CSR_WUF /*!< Wakeup flag */ +#define LL_PWR_CSR_SBF PWR_CSR_SBF /*!< Standby flag */ +#define LL_PWR_CSR_PVDO PWR_CSR_PVDO /*!< Power voltage detector output flag */ +#define LL_PWR_CSR_VOS PWR_CSR_VOSRDY /*!< Voltage scaling select flag */ +#if defined(PWR_CSR_EWUP) +#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP /*!< Enable WKUP pin */ +#elif defined(PWR_CSR_EWUP1) +#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP1 /*!< Enable WKUP pin 1 */ +#endif /* PWR_CSR_EWUP */ +#if defined(PWR_CSR_EWUP2) +#define LL_PWR_CSR_EWUP2 PWR_CSR_EWUP2 /*!< Enable WKUP pin 2 */ +#endif /* PWR_CSR_EWUP2 */ +#if defined(PWR_CSR_EWUP3) +#define LL_PWR_CSR_EWUP3 PWR_CSR_EWUP3 /*!< Enable WKUP pin 3 */ +#endif /* PWR_CSR_EWUP3 */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_REGU_VOLTAGE Regulator Voltage + * @{ + */ +#if defined(PWR_CR_VOS_0) +#define LL_PWR_REGU_VOLTAGE_SCALE3 (PWR_CR_VOS_0) +#define LL_PWR_REGU_VOLTAGE_SCALE2 (PWR_CR_VOS_1) +#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS_0 | PWR_CR_VOS_1) /* The SCALE1 is not available for STM32F401xx devices */ +#else +#define LL_PWR_REGU_VOLTAGE_SCALE1 (PWR_CR_VOS) +#define LL_PWR_REGU_VOLTAGE_SCALE2 0x00000000U +#endif /* PWR_CR_VOS_0 */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_MODE_PWR Mode Power + * @{ + */ +#define LL_PWR_MODE_STOP_MAINREGU 0x00000000U /*!< Enter Stop mode when the CPU enters deepsleep */ +#define LL_PWR_MODE_STOP_LPREGU (PWR_CR_LPDS) /*!< Enter Stop mode (with low power Regulator ON) when the CPU enters deepsleep */ +#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) +#define LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (PWR_CR_MRUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in under-drive mode) when the CPU enters deepsleep */ +#define LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in under-drive mode) when the CPU enters deepsleep */ +#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ +#if defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) +#define LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (PWR_CR_MRLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with main Regulator in Deep Sleep mode) when the CPU enters deepsleep */ +#define LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (PWR_CR_LPDS | PWR_CR_LPLVDS | PWR_CR_FPDS) /*!< Enter Stop mode (with low power Regulator in Deep Sleep mode) when the CPU enters deepsleep */ +#endif /* PWR_CR_MRLVDS && PWR_CR_LPLVDS && PWR_CR_FPDS */ +#define LL_PWR_MODE_STANDBY (PWR_CR_PDDS) /*!< Enter Standby mode when the CPU enters deepsleep */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_REGU_MODE_DS_MODE Regulator Mode In Deep Sleep Mode + * @{ + */ +#define LL_PWR_REGU_DSMODE_MAIN 0x00000000U /*!< Voltage Regulator in main mode during deepsleep mode */ +#define LL_PWR_REGU_DSMODE_LOW_POWER (PWR_CR_LPDS) /*!< Voltage Regulator in low-power mode during deepsleep mode */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_PVDLEVEL Power Voltage Detector Level + * @{ + */ +#define LL_PWR_PVDLEVEL_0 (PWR_CR_PLS_LEV0) /*!< Voltage threshold detected by PVD 2.2 V */ +#define LL_PWR_PVDLEVEL_1 (PWR_CR_PLS_LEV1) /*!< Voltage threshold detected by PVD 2.3 V */ +#define LL_PWR_PVDLEVEL_2 (PWR_CR_PLS_LEV2) /*!< Voltage threshold detected by PVD 2.4 V */ +#define LL_PWR_PVDLEVEL_3 (PWR_CR_PLS_LEV3) /*!< Voltage threshold detected by PVD 2.5 V */ +#define LL_PWR_PVDLEVEL_4 (PWR_CR_PLS_LEV4) /*!< Voltage threshold detected by PVD 2.6 V */ +#define LL_PWR_PVDLEVEL_5 (PWR_CR_PLS_LEV5) /*!< Voltage threshold detected by PVD 2.7 V */ +#define LL_PWR_PVDLEVEL_6 (PWR_CR_PLS_LEV6) /*!< Voltage threshold detected by PVD 2.8 V */ +#define LL_PWR_PVDLEVEL_7 (PWR_CR_PLS_LEV7) /*!< Voltage threshold detected by PVD 2.9 V */ +/** + * @} + */ +/** @defgroup PWR_LL_EC_WAKEUP_PIN Wakeup Pins + * @{ + */ +#if defined(PWR_CSR_EWUP) +#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP) /*!< WKUP pin : PA0 */ +#endif /* PWR_CSR_EWUP */ +#if defined(PWR_CSR_EWUP1) +#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP1) /*!< WKUP pin 1 : PA0 */ +#endif /* PWR_CSR_EWUP1 */ +#if defined(PWR_CSR_EWUP2) +#define LL_PWR_WAKEUP_PIN2 (PWR_CSR_EWUP2) /*!< WKUP pin 2 : PC0 or PC13 according to device */ +#endif /* PWR_CSR_EWUP2 */ +#if defined(PWR_CSR_EWUP3) +#define LL_PWR_WAKEUP_PIN3 (PWR_CSR_EWUP3) /*!< WKUP pin 3 : PC1 */ +#endif /* PWR_CSR_EWUP3 */ +/** + * @} + */ + +/** + * @} + */ + + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Macros PWR Exported Macros + * @{ + */ + +/** @defgroup PWR_LL_EM_WRITE_READ Common write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in PWR register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(PWR->__REG__, (__VALUE__)) + +/** + * @brief Read a value in PWR register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_PWR_ReadReg(__REG__) READ_REG(PWR->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @defgroup PWR_LL_EF_Configuration Configuration + * @{ + */ +#if defined(PWR_CR_FISSR) +/** + * @brief Enable FLASH interface STOP while system Run is ON + * @rmtoll CR FISSR LL_PWR_EnableFLASHInterfaceSTOP + * @note This mode is enabled only with STOP low power mode. + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableFLASHInterfaceSTOP(void) +{ + SET_BIT(PWR->CR, PWR_CR_FISSR); +} + +/** + * @brief Disable FLASH Interface STOP while system Run is ON + * @rmtoll CR FISSR LL_PWR_DisableFLASHInterfaceSTOP + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableFLASHInterfaceSTOP(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_FISSR); +} + +/** + * @brief Check if FLASH Interface STOP while system Run feature is enabled + * @rmtoll CR FISSR LL_PWR_IsEnabledFLASHInterfaceSTOP + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHInterfaceSTOP(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_FISSR) == (PWR_CR_FISSR)); +} +#endif /* PWR_CR_FISSR */ + +#if defined(PWR_CR_FMSSR) +/** + * @brief Enable FLASH Memory STOP while system Run is ON + * @rmtoll CR FMSSR LL_PWR_EnableFLASHMemorySTOP + * @note This mode is enabled only with STOP low power mode. + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableFLASHMemorySTOP(void) +{ + SET_BIT(PWR->CR, PWR_CR_FMSSR); +} + +/** + * @brief Disable FLASH Memory STOP while system Run is ON + * @rmtoll CR FMSSR LL_PWR_DisableFLASHMemorySTOP + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableFLASHMemorySTOP(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); +} + +/** + * @brief Check if FLASH Memory STOP while system Run feature is enabled + * @rmtoll CR FMSSR LL_PWR_IsEnabledFLASHMemorySTOP + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledFLASHMemorySTOP(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_FMSSR) == (PWR_CR_FMSSR)); +} +#endif /* PWR_CR_FMSSR */ +#if defined(PWR_CR_UDEN) +/** + * @brief Enable Under Drive Mode + * @rmtoll CR UDEN LL_PWR_EnableUnderDriveMode + * @note This mode is enabled only with STOP low power mode. + * In this mode, the 1.2V domain is preserved in reduced leakage mode. This + * mode is only available when the main Regulator or the low power Regulator + * is in low voltage mode. + * @note If the Under-drive mode was enabled, it is automatically disabled after + * exiting Stop mode. + * When the voltage Regulator operates in Under-drive mode, an additional + * startup delay is induced when waking up from Stop mode. + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableUnderDriveMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_UDEN); +} + +/** + * @brief Disable Under Drive Mode + * @rmtoll CR UDEN LL_PWR_DisableUnderDriveMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableUnderDriveMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_UDEN); +} + +/** + * @brief Check if Under Drive Mode is enabled + * @rmtoll CR UDEN LL_PWR_IsEnabledUnderDriveMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledUnderDriveMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_UDEN) == (PWR_CR_UDEN)); +} +#endif /* PWR_CR_UDEN */ + +#if defined(PWR_CR_ODSWEN) +/** + * @brief Enable Over drive switching + * @rmtoll CR ODSWEN LL_PWR_EnableOverDriveSwitching + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableOverDriveSwitching(void) +{ + SET_BIT(PWR->CR, PWR_CR_ODSWEN); +} + +/** + * @brief Disable Over drive switching + * @rmtoll CR ODSWEN LL_PWR_DisableOverDriveSwitching + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableOverDriveSwitching(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_ODSWEN); +} + +/** + * @brief Check if Over drive switching is enabled + * @rmtoll CR ODSWEN LL_PWR_IsEnabledOverDriveSwitching + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveSwitching(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_ODSWEN) == (PWR_CR_ODSWEN)); +} +#endif /* PWR_CR_ODSWEN */ +#if defined(PWR_CR_ODEN) +/** + * @brief Enable Over drive Mode + * @rmtoll CR ODEN LL_PWR_EnableOverDriveMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableOverDriveMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_ODEN); +} + +/** + * @brief Disable Over drive Mode + * @rmtoll CR ODEN LL_PWR_DisableOverDriveMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableOverDriveMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_ODEN); +} + +/** + * @brief Check if Over drive switching is enabled + * @rmtoll CR ODEN LL_PWR_IsEnabledOverDriveMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledOverDriveMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_ODEN) == (PWR_CR_ODEN)); +} +#endif /* PWR_CR_ODEN */ +#if defined(PWR_CR_MRUDS) +/** + * @brief Enable Main Regulator in deepsleep under-drive Mode + * @rmtoll CR MRUDS LL_PWR_EnableMainRegulatorDeepSleepUDMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableMainRegulatorDeepSleepUDMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_MRUDS); +} + +/** + * @brief Disable Main Regulator in deepsleep under-drive Mode + * @rmtoll CR MRUDS LL_PWR_DisableMainRegulatorDeepSleepUDMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableMainRegulatorDeepSleepUDMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_MRUDS); +} + +/** + * @brief Check if Main Regulator in deepsleep under-drive Mode is enabled + * @rmtoll CR MRUDS LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorDeepSleepUDMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_MRUDS) == (PWR_CR_MRUDS)); +} +#endif /* PWR_CR_MRUDS */ + +#if defined(PWR_CR_LPUDS) +/** + * @brief Enable Low Power Regulator in deepsleep under-drive Mode + * @rmtoll CR LPUDS LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorDeepSleepUDMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_LPUDS); +} + +/** + * @brief Disable Low Power Regulator in deepsleep under-drive Mode + * @rmtoll CR LPUDS LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorDeepSleepUDMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_LPUDS); +} + +/** + * @brief Check if Low Power Regulator in deepsleep under-drive Mode is enabled + * @rmtoll CR LPUDS LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorDeepSleepUDMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_LPUDS) == (PWR_CR_LPUDS)); +} +#endif /* PWR_CR_LPUDS */ + +#if defined(PWR_CR_MRLVDS) +/** + * @brief Enable Main Regulator low voltage Mode + * @rmtoll CR MRLVDS LL_PWR_EnableMainRegulatorLowVoltageMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableMainRegulatorLowVoltageMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_MRLVDS); +} + +/** + * @brief Disable Main Regulator low voltage Mode + * @rmtoll CR MRLVDS LL_PWR_DisableMainRegulatorLowVoltageMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableMainRegulatorLowVoltageMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_MRLVDS); +} + +/** + * @brief Check if Main Regulator low voltage Mode is enabled + * @rmtoll CR MRLVDS LL_PWR_IsEnabledMainRegulatorLowVoltageMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledMainRegulatorLowVoltageMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_MRLVDS) == (PWR_CR_MRLVDS)); +} +#endif /* PWR_CR_MRLVDS */ + +#if defined(PWR_CR_LPLVDS) +/** + * @brief Enable Low Power Regulator low voltage Mode + * @rmtoll CR LPLVDS LL_PWR_EnableLowPowerRegulatorLowVoltageMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableLowPowerRegulatorLowVoltageMode(void) +{ + SET_BIT(PWR->CR, PWR_CR_LPLVDS); +} + +/** + * @brief Disable Low Power Regulator low voltage Mode + * @rmtoll CR LPLVDS LL_PWR_DisableLowPowerRegulatorLowVoltageMode + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableLowPowerRegulatorLowVoltageMode(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_LPLVDS); +} + +/** + * @brief Check if Low Power Regulator low voltage Mode is enabled + * @rmtoll CR LPLVDS LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledLowPowerRegulatorLowVoltageMode(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_LPLVDS) == (PWR_CR_LPLVDS)); +} +#endif /* PWR_CR_LPLVDS */ +/** + * @brief Set the main internal Regulator output voltage + * @rmtoll CR VOS LL_PWR_SetRegulVoltageScaling + * @param VoltageScaling This parameter can be one of the following values: + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 (*) + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 + * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetRegulVoltageScaling(uint32_t VoltageScaling) +{ + MODIFY_REG(PWR->CR, PWR_CR_VOS, VoltageScaling); +} + +/** + * @brief Get the main internal Regulator output voltage + * @rmtoll CR VOS LL_PWR_GetRegulVoltageScaling + * @retval Returned value can be one of the following values: + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE1 (*) + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE2 + * @arg @ref LL_PWR_REGU_VOLTAGE_SCALE3 + * (*) LL_PWR_REGU_VOLTAGE_SCALE1 is not available for STM32F401xx devices + */ +__STATIC_INLINE uint32_t LL_PWR_GetRegulVoltageScaling(void) +{ + return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_VOS)); +} +/** + * @brief Enable the Flash Power Down in Stop Mode + * @rmtoll CR FPDS LL_PWR_EnableFlashPowerDown + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableFlashPowerDown(void) +{ + SET_BIT(PWR->CR, PWR_CR_FPDS); +} + +/** + * @brief Disable the Flash Power Down in Stop Mode + * @rmtoll CR FPDS LL_PWR_DisableFlashPowerDown + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableFlashPowerDown(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_FPDS); +} + +/** + * @brief Check if the Flash Power Down in Stop Mode is enabled + * @rmtoll CR FPDS LL_PWR_IsEnabledFlashPowerDown + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledFlashPowerDown(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_FPDS) == (PWR_CR_FPDS)); +} + +/** + * @brief Enable access to the backup domain + * @rmtoll CR DBP LL_PWR_EnableBkUpAccess + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableBkUpAccess(void) +{ + SET_BIT(PWR->CR, PWR_CR_DBP); +} + +/** + * @brief Disable access to the backup domain + * @rmtoll CR DBP LL_PWR_DisableBkUpAccess + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableBkUpAccess(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_DBP); +} + +/** + * @brief Check if the backup domain is enabled + * @rmtoll CR DBP LL_PWR_IsEnabledBkUpAccess + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpAccess(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_DBP) == (PWR_CR_DBP)); +} +/** + * @brief Enable the backup Regulator + * @rmtoll CSR BRE LL_PWR_EnableBkUpRegulator + * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. + * The LL_PWR_EnableBkUpAccess() must be called before using this API. + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableBkUpRegulator(void) +{ + SET_BIT(PWR->CSR, PWR_CSR_BRE); +} + +/** + * @brief Disable the backup Regulator + * @rmtoll CSR BRE LL_PWR_DisableBkUpRegulator + * @note The BRE bit of the PWR_CSR register is protected against parasitic write access. + * The LL_PWR_EnableBkUpAccess() must be called before using this API. + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableBkUpRegulator(void) +{ + CLEAR_BIT(PWR->CSR, PWR_CSR_BRE); +} + +/** + * @brief Check if the backup Regulator is enabled + * @rmtoll CSR BRE LL_PWR_IsEnabledBkUpRegulator + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledBkUpRegulator(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_BRE) == (PWR_CSR_BRE)); +} + +/** + * @brief Set voltage Regulator mode during deep sleep mode + * @rmtoll CR LPDS LL_PWR_SetRegulModeDS + * @param RegulMode This parameter can be one of the following values: + * @arg @ref LL_PWR_REGU_DSMODE_MAIN + * @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetRegulModeDS(uint32_t RegulMode) +{ + MODIFY_REG(PWR->CR, PWR_CR_LPDS, RegulMode); +} + +/** + * @brief Get voltage Regulator mode during deep sleep mode + * @rmtoll CR LPDS LL_PWR_GetRegulModeDS + * @retval Returned value can be one of the following values: + * @arg @ref LL_PWR_REGU_DSMODE_MAIN + * @arg @ref LL_PWR_REGU_DSMODE_LOW_POWER + */ +__STATIC_INLINE uint32_t LL_PWR_GetRegulModeDS(void) +{ + return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_LPDS)); +} + +/** + * @brief Set Power Down mode when CPU enters deepsleep + * @rmtoll CR PDDS LL_PWR_SetPowerMode\n + * @rmtoll CR MRUDS LL_PWR_SetPowerMode\n + * @rmtoll CR LPUDS LL_PWR_SetPowerMode\n + * @rmtoll CR FPDS LL_PWR_SetPowerMode\n + * @rmtoll CR MRLVDS LL_PWR_SetPowerMode\n + * @rmtoll CR LPlVDS LL_PWR_SetPowerMode\n + * @rmtoll CR FPDS LL_PWR_SetPowerMode\n + * @rmtoll CR LPDS LL_PWR_SetPowerMode + * @param PDMode This parameter can be one of the following values: + * @arg @ref LL_PWR_MODE_STOP_MAINREGU + * @arg @ref LL_PWR_MODE_STOP_LPREGU + * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) + * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) + * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) + * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) + * + * (*) not available on all devices + * @arg @ref LL_PWR_MODE_STANDBY + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetPowerMode(uint32_t PDMode) +{ +#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) + MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS), PDMode); +#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) + MODIFY_REG(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS), PDMode); +#else + MODIFY_REG(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS), PDMode); +#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ +} + +/** + * @brief Get Power Down mode when CPU enters deepsleep + * @rmtoll CR PDDS LL_PWR_GetPowerMode\n + * @rmtoll CR MRUDS LL_PWR_GetPowerMode\n + * @rmtoll CR LPUDS LL_PWR_GetPowerMode\n + * @rmtoll CR FPDS LL_PWR_GetPowerMode\n + * @rmtoll CR MRLVDS LL_PWR_GetPowerMode\n + * @rmtoll CR LPLVDS LL_PWR_GetPowerMode\n + * @rmtoll CR FPDS LL_PWR_GetPowerMode\n + * @rmtoll CR LPDS LL_PWR_GetPowerMode + * @retval Returned value can be one of the following values: + * @arg @ref LL_PWR_MODE_STOP_MAINREGU + * @arg @ref LL_PWR_MODE_STOP_LPREGU + * @arg @ref LL_PWR_MODE_STOP_MAINREGU_UNDERDRIVE (*) + * @arg @ref LL_PWR_MODE_STOP_LPREGU_UNDERDRIVE (*) + * @arg @ref LL_PWR_MODE_STOP_MAINREGU_DEEPSLEEP (*) + * @arg @ref LL_PWR_MODE_STOP_LPREGU_DEEPSLEEP (*) + * + * (*) not available on all devices + * @arg @ref LL_PWR_MODE_STANDBY + */ +__STATIC_INLINE uint32_t LL_PWR_GetPowerMode(void) +{ +#if defined(PWR_CR_MRUDS) && defined(PWR_CR_LPUDS) && defined(PWR_CR_FPDS) + return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPUDS | PWR_CR_MRUDS))); +#elif defined(PWR_CR_MRLVDS) && defined(PWR_CR_LPLVDS) && defined(PWR_CR_FPDS) + return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_FPDS | PWR_CR_LPLVDS | PWR_CR_MRLVDS))); +#else + return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS))); +#endif /* PWR_CR_MRUDS && PWR_CR_LPUDS && PWR_CR_FPDS */ +} + +/** + * @brief Configure the voltage threshold detected by the Power Voltage Detector + * @rmtoll CR PLS LL_PWR_SetPVDLevel + * @param PVDLevel This parameter can be one of the following values: + * @arg @ref LL_PWR_PVDLEVEL_0 + * @arg @ref LL_PWR_PVDLEVEL_1 + * @arg @ref LL_PWR_PVDLEVEL_2 + * @arg @ref LL_PWR_PVDLEVEL_3 + * @arg @ref LL_PWR_PVDLEVEL_4 + * @arg @ref LL_PWR_PVDLEVEL_5 + * @arg @ref LL_PWR_PVDLEVEL_6 + * @arg @ref LL_PWR_PVDLEVEL_7 + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetPVDLevel(uint32_t PVDLevel) +{ + MODIFY_REG(PWR->CR, PWR_CR_PLS, PVDLevel); +} + +/** + * @brief Get the voltage threshold detection + * @rmtoll CR PLS LL_PWR_GetPVDLevel + * @retval Returned value can be one of the following values: + * @arg @ref LL_PWR_PVDLEVEL_0 + * @arg @ref LL_PWR_PVDLEVEL_1 + * @arg @ref LL_PWR_PVDLEVEL_2 + * @arg @ref LL_PWR_PVDLEVEL_3 + * @arg @ref LL_PWR_PVDLEVEL_4 + * @arg @ref LL_PWR_PVDLEVEL_5 + * @arg @ref LL_PWR_PVDLEVEL_6 + * @arg @ref LL_PWR_PVDLEVEL_7 + */ +__STATIC_INLINE uint32_t LL_PWR_GetPVDLevel(void) +{ + return (uint32_t)(READ_BIT(PWR->CR, PWR_CR_PLS)); +} + +/** + * @brief Enable Power Voltage Detector + * @rmtoll CR PVDE LL_PWR_EnablePVD + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnablePVD(void) +{ + SET_BIT(PWR->CR, PWR_CR_PVDE); +} + +/** + * @brief Disable Power Voltage Detector + * @rmtoll CR PVDE LL_PWR_DisablePVD + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisablePVD(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_PVDE); +} + +/** + * @brief Check if Power Voltage Detector is enabled + * @rmtoll CR PVDE LL_PWR_IsEnabledPVD + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledPVD(void) +{ + return (READ_BIT(PWR->CR, PWR_CR_PVDE) == (PWR_CR_PVDE)); +} + +/** + * @brief Enable the WakeUp PINx functionality + * @rmtoll CSR EWUP LL_PWR_EnableWakeUpPin\n + * @rmtoll CSR EWUP1 LL_PWR_EnableWakeUpPin\n + * @rmtoll CSR EWUP2 LL_PWR_EnableWakeUpPin\n + * @rmtoll CSR EWUP3 LL_PWR_EnableWakeUpPin + * @param WakeUpPin This parameter can be one of the following values: + * @arg @ref LL_PWR_WAKEUP_PIN1 + * @arg @ref LL_PWR_WAKEUP_PIN2 (*) + * @arg @ref LL_PWR_WAKEUP_PIN3 (*) + * + * (*) not available on all devices + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableWakeUpPin(uint32_t WakeUpPin) +{ + SET_BIT(PWR->CSR, WakeUpPin); +} + +/** + * @brief Disable the WakeUp PINx functionality + * @rmtoll CSR EWUP LL_PWR_DisableWakeUpPin\n + * @rmtoll CSR EWUP1 LL_PWR_DisableWakeUpPin\n + * @rmtoll CSR EWUP2 LL_PWR_DisableWakeUpPin\n + * @rmtoll CSR EWUP3 LL_PWR_DisableWakeUpPin + * @param WakeUpPin This parameter can be one of the following values: + * @arg @ref LL_PWR_WAKEUP_PIN1 + * @arg @ref LL_PWR_WAKEUP_PIN2 (*) + * @arg @ref LL_PWR_WAKEUP_PIN3 (*) + * + * (*) not available on all devices + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableWakeUpPin(uint32_t WakeUpPin) +{ + CLEAR_BIT(PWR->CSR, WakeUpPin); +} + +/** + * @brief Check if the WakeUp PINx functionality is enabled + * @rmtoll CSR EWUP LL_PWR_IsEnabledWakeUpPin\n + * @rmtoll CSR EWUP1 LL_PWR_IsEnabledWakeUpPin\n + * @rmtoll CSR EWUP2 LL_PWR_IsEnabledWakeUpPin\n + * @rmtoll CSR EWUP3 LL_PWR_IsEnabledWakeUpPin + * @param WakeUpPin This parameter can be one of the following values: + * @arg @ref LL_PWR_WAKEUP_PIN1 + * @arg @ref LL_PWR_WAKEUP_PIN2 (*) + * @arg @ref LL_PWR_WAKEUP_PIN3 (*) + * + * (*) not available on all devices + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledWakeUpPin(uint32_t WakeUpPin) +{ + return (READ_BIT(PWR->CSR, WakeUpPin) == (WakeUpPin)); +} + + +/** + * @} + */ + +/** @defgroup PWR_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Get Wake-up Flag + * @rmtoll CSR WUF LL_PWR_IsActiveFlag_WU + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_WU(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_WUF) == (PWR_CSR_WUF)); +} + +/** + * @brief Get Standby Flag + * @rmtoll CSR SBF LL_PWR_IsActiveFlag_SB + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_SB(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_SBF) == (PWR_CSR_SBF)); +} + +/** + * @brief Get Backup Regulator ready Flag + * @rmtoll CSR BRR LL_PWR_IsActiveFlag_BRR + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_BRR(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_BRR) == (PWR_CSR_BRR)); +} +/** + * @brief Indicate whether VDD voltage is below the selected PVD threshold + * @rmtoll CSR PVDO LL_PWR_IsActiveFlag_PVDO + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_PVDO(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_PVDO) == (PWR_CSR_PVDO)); +} + +/** + * @brief Indicate whether the Regulator is ready in the selected voltage range or if its output voltage is still changing to the required voltage level + * @rmtoll CSR VOS LL_PWR_IsActiveFlag_VOS + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_VOS(void) +{ + return (READ_BIT(PWR->CSR, LL_PWR_CSR_VOS) == (LL_PWR_CSR_VOS)); +} +#if defined(PWR_CR_ODEN) +/** + * @brief Indicate whether the Over-Drive mode is ready or not + * @rmtoll CSR ODRDY LL_PWR_IsActiveFlag_OD + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_OD(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_ODRDY) == (PWR_CSR_ODRDY)); +} +#endif /* PWR_CR_ODEN */ + +#if defined(PWR_CR_ODSWEN) +/** + * @brief Indicate whether the Over-Drive mode switching is ready or not + * @rmtoll CSR ODSWRDY LL_PWR_IsActiveFlag_ODSW + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_ODSW(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_ODSWRDY) == (PWR_CSR_ODSWRDY)); +} +#endif /* PWR_CR_ODSWEN */ + +#if defined(PWR_CR_UDEN) +/** + * @brief Indicate whether the Under-Drive mode is ready or not + * @rmtoll CSR UDRDY LL_PWR_IsActiveFlag_UD + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_UD(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_UDRDY) == (PWR_CSR_UDRDY)); +} +#endif /* PWR_CR_UDEN */ +/** + * @brief Clear Standby Flag + * @rmtoll CR CSBF LL_PWR_ClearFlag_SB + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_SB(void) +{ + SET_BIT(PWR->CR, PWR_CR_CSBF); +} + +/** + * @brief Clear Wake-up Flags + * @rmtoll CR CWUF LL_PWR_ClearFlag_WU + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_WU(void) +{ + SET_BIT(PWR->CR, PWR_CR_CWUF); +} +#if defined(PWR_CSR_UDRDY) +/** + * @brief Clear Under-Drive ready Flag + * @rmtoll CSR UDRDY LL_PWR_ClearFlag_UD + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_UD(void) +{ + WRITE_REG(PWR->CSR, PWR_CSR_UDRDY); +} +#endif /* PWR_CSR_UDRDY */ + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup PWR_LL_EF_Init De-initialization function + * @{ + */ +ErrorStatus LL_PWR_DeInit(void); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(PWR) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_PWR_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h new file mode 100644 index 0000000..1df1b58 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h @@ -0,0 +1,7096 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_rcc.h + * @author MCD Application Team + * @brief Header file of RCC LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_RCC_H +#define __STM32F4xx_LL_RCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @defgroup RCC_LL RCC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_LL_Private_Variables RCC Private Variables + * @{ + */ + +#if defined(RCC_DCKCFGR_PLLSAIDIVR) +static const uint8_t aRCC_PLLSAIDIVRPrescTable[4] = {2, 4, 8, 16}; +#endif /* RCC_DCKCFGR_PLLSAIDIVR */ + +/** + * @} + */ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_Private_Macros RCC Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_Exported_Types RCC Exported Types + * @{ + */ + +/** @defgroup LL_ES_CLOCK_FREQ Clocks Frequency Structure + * @{ + */ + +/** + * @brief RCC Clocks Frequency Structure + */ +typedef struct +{ + uint32_t SYSCLK_Frequency; /*!< SYSCLK clock frequency */ + uint32_t HCLK_Frequency; /*!< HCLK clock frequency */ + uint32_t PCLK1_Frequency; /*!< PCLK1 clock frequency */ + uint32_t PCLK2_Frequency; /*!< PCLK2 clock frequency */ +} LL_RCC_ClocksTypeDef; + +/** + * @} + */ + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Constants RCC Exported Constants + * @{ + */ + +/** @defgroup RCC_LL_EC_OSC_VALUES Oscillator Values adaptation + * @brief Defines used to adapt values of different oscillators + * @note These values could be modified in the user environment according to + * HW set-up. + * @{ + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE 25000000U /*!< Value of the HSE oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) +#define HSI_VALUE 16000000U /*!< Value of the HSI oscillator in Hz */ +#endif /* HSI_VALUE */ + +#if !defined (LSE_VALUE) +#define LSE_VALUE 32768U /*!< Value of the LSE oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSI_VALUE) +#define LSI_VALUE 32000U /*!< Value of the LSI oscillator in Hz */ +#endif /* LSI_VALUE */ + +#if !defined (EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the I2S_CKIN external oscillator in Hz */ +#endif /* EXTERNAL_CLOCK_VALUE */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_CLEAR_FLAG Clear Flags Defines + * @brief Flags defines which can be used with LL_RCC_WriteReg function + * @{ + */ +#define LL_RCC_CIR_LSIRDYC RCC_CIR_LSIRDYC /*!< LSI Ready Interrupt Clear */ +#define LL_RCC_CIR_LSERDYC RCC_CIR_LSERDYC /*!< LSE Ready Interrupt Clear */ +#define LL_RCC_CIR_HSIRDYC RCC_CIR_HSIRDYC /*!< HSI Ready Interrupt Clear */ +#define LL_RCC_CIR_HSERDYC RCC_CIR_HSERDYC /*!< HSE Ready Interrupt Clear */ +#define LL_RCC_CIR_PLLRDYC RCC_CIR_PLLRDYC /*!< PLL Ready Interrupt Clear */ +#if defined(RCC_PLLI2S_SUPPORT) +#define LL_RCC_CIR_PLLI2SRDYC RCC_CIR_PLLI2SRDYC /*!< PLLI2S Ready Interrupt Clear */ +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CIR_PLLSAIRDYC RCC_CIR_PLLSAIRDYC /*!< PLLSAI Ready Interrupt Clear */ +#endif /* RCC_PLLSAI_SUPPORT */ +#define LL_RCC_CIR_CSSC RCC_CIR_CSSC /*!< Clock Security System Interrupt Clear */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_RCC_ReadReg function + * @{ + */ +#define LL_RCC_CIR_LSIRDYF RCC_CIR_LSIRDYF /*!< LSI Ready Interrupt flag */ +#define LL_RCC_CIR_LSERDYF RCC_CIR_LSERDYF /*!< LSE Ready Interrupt flag */ +#define LL_RCC_CIR_HSIRDYF RCC_CIR_HSIRDYF /*!< HSI Ready Interrupt flag */ +#define LL_RCC_CIR_HSERDYF RCC_CIR_HSERDYF /*!< HSE Ready Interrupt flag */ +#define LL_RCC_CIR_PLLRDYF RCC_CIR_PLLRDYF /*!< PLL Ready Interrupt flag */ +#if defined(RCC_PLLI2S_SUPPORT) +#define LL_RCC_CIR_PLLI2SRDYF RCC_CIR_PLLI2SRDYF /*!< PLLI2S Ready Interrupt flag */ +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CIR_PLLSAIRDYF RCC_CIR_PLLSAIRDYF /*!< PLLSAI Ready Interrupt flag */ +#endif /* RCC_PLLSAI_SUPPORT */ +#define LL_RCC_CIR_CSSF RCC_CIR_CSSF /*!< Clock Security System Interrupt flag */ +#define LL_RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF /*!< Low-Power reset flag */ +#define LL_RCC_CSR_PINRSTF RCC_CSR_PINRSTF /*!< PIN reset flag */ +#define LL_RCC_CSR_PORRSTF RCC_CSR_PORRSTF /*!< POR/PDR reset flag */ +#define LL_RCC_CSR_SFTRSTF RCC_CSR_SFTRSTF /*!< Software Reset flag */ +#define LL_RCC_CSR_IWDGRSTF RCC_CSR_IWDGRSTF /*!< Independent Watchdog reset flag */ +#define LL_RCC_CSR_WWDGRSTF RCC_CSR_WWDGRSTF /*!< Window watchdog reset flag */ +#if defined(RCC_CSR_BORRSTF) +#define LL_RCC_CSR_BORRSTF RCC_CSR_BORRSTF /*!< BOR reset flag */ +#endif /* RCC_CSR_BORRSTF */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_RCC_ReadReg and LL_RCC_WriteReg functions + * @{ + */ +#define LL_RCC_CIR_LSIRDYIE RCC_CIR_LSIRDYIE /*!< LSI Ready Interrupt Enable */ +#define LL_RCC_CIR_LSERDYIE RCC_CIR_LSERDYIE /*!< LSE Ready Interrupt Enable */ +#define LL_RCC_CIR_HSIRDYIE RCC_CIR_HSIRDYIE /*!< HSI Ready Interrupt Enable */ +#define LL_RCC_CIR_HSERDYIE RCC_CIR_HSERDYIE /*!< HSE Ready Interrupt Enable */ +#define LL_RCC_CIR_PLLRDYIE RCC_CIR_PLLRDYIE /*!< PLL Ready Interrupt Enable */ +#if defined(RCC_PLLI2S_SUPPORT) +#define LL_RCC_CIR_PLLI2SRDYIE RCC_CIR_PLLI2SRDYIE /*!< PLLI2S Ready Interrupt Enable */ +#endif /* RCC_PLLI2S_SUPPORT */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CIR_PLLSAIRDYIE RCC_CIR_PLLSAIRDYIE /*!< PLLSAI Ready Interrupt Enable */ +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYS_CLKSOURCE System clock switch + * @{ + */ +#define LL_RCC_SYS_CLKSOURCE_HSI RCC_CFGR_SW_HSI /*!< HSI selection as system clock */ +#define LL_RCC_SYS_CLKSOURCE_HSE RCC_CFGR_SW_HSE /*!< HSE selection as system clock */ +#define LL_RCC_SYS_CLKSOURCE_PLL RCC_CFGR_SW_PLL /*!< PLL selection as system clock */ +#if defined(RCC_CFGR_SW_PLLR) +#define LL_RCC_SYS_CLKSOURCE_PLLR RCC_CFGR_SW_PLLR /*!< PLLR selection as system clock */ +#endif /* RCC_CFGR_SW_PLLR */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYS_CLKSOURCE_STATUS System clock switch status + * @{ + */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_PLL RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ +#if defined(RCC_PLLR_SYSCLK_SUPPORT) +#define LL_RCC_SYS_CLKSOURCE_STATUS_PLLR RCC_CFGR_SWS_PLLR /*!< PLLR used as system clock */ +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYSCLK_DIV AHB prescaler + * @{ + */ +#define LL_RCC_SYSCLK_DIV_1 RCC_CFGR_HPRE_DIV1 /*!< SYSCLK not divided */ +#define LL_RCC_SYSCLK_DIV_2 RCC_CFGR_HPRE_DIV2 /*!< SYSCLK divided by 2 */ +#define LL_RCC_SYSCLK_DIV_4 RCC_CFGR_HPRE_DIV4 /*!< SYSCLK divided by 4 */ +#define LL_RCC_SYSCLK_DIV_8 RCC_CFGR_HPRE_DIV8 /*!< SYSCLK divided by 8 */ +#define LL_RCC_SYSCLK_DIV_16 RCC_CFGR_HPRE_DIV16 /*!< SYSCLK divided by 16 */ +#define LL_RCC_SYSCLK_DIV_64 RCC_CFGR_HPRE_DIV64 /*!< SYSCLK divided by 64 */ +#define LL_RCC_SYSCLK_DIV_128 RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */ +#define LL_RCC_SYSCLK_DIV_256 RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */ +#define LL_RCC_SYSCLK_DIV_512 RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_APB1_DIV APB low-speed prescaler (APB1) + * @{ + */ +#define LL_RCC_APB1_DIV_1 RCC_CFGR_PPRE1_DIV1 /*!< HCLK not divided */ +#define LL_RCC_APB1_DIV_2 RCC_CFGR_PPRE1_DIV2 /*!< HCLK divided by 2 */ +#define LL_RCC_APB1_DIV_4 RCC_CFGR_PPRE1_DIV4 /*!< HCLK divided by 4 */ +#define LL_RCC_APB1_DIV_8 RCC_CFGR_PPRE1_DIV8 /*!< HCLK divided by 8 */ +#define LL_RCC_APB1_DIV_16 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_APB2_DIV APB high-speed prescaler (APB2) + * @{ + */ +#define LL_RCC_APB2_DIV_1 RCC_CFGR_PPRE2_DIV1 /*!< HCLK not divided */ +#define LL_RCC_APB2_DIV_2 RCC_CFGR_PPRE2_DIV2 /*!< HCLK divided by 2 */ +#define LL_RCC_APB2_DIV_4 RCC_CFGR_PPRE2_DIV4 /*!< HCLK divided by 4 */ +#define LL_RCC_APB2_DIV_8 RCC_CFGR_PPRE2_DIV8 /*!< HCLK divided by 8 */ +#define LL_RCC_APB2_DIV_16 RCC_CFGR_PPRE2_DIV16 /*!< HCLK divided by 16 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_MCOxSOURCE MCO source selection + * @{ + */ +#define LL_RCC_MCO1SOURCE_HSI (uint32_t)(RCC_CFGR_MCO1|0x00000000U) /*!< HSI selection as MCO1 source */ +#define LL_RCC_MCO1SOURCE_LSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_0 >> 16U)) /*!< LSE selection as MCO1 source */ +#define LL_RCC_MCO1SOURCE_HSE (uint32_t)(RCC_CFGR_MCO1|(RCC_CFGR_MCO1_1 >> 16U)) /*!< HSE selection as MCO1 source */ +#define LL_RCC_MCO1SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO1|((RCC_CFGR_MCO1_1|RCC_CFGR_MCO1_0) >> 16U)) /*!< PLLCLK selection as MCO1 source */ +#if defined(RCC_CFGR_MCO2) +#define LL_RCC_MCO2SOURCE_SYSCLK (uint32_t)(RCC_CFGR_MCO2|0x00000000U) /*!< SYSCLK selection as MCO2 source */ +#define LL_RCC_MCO2SOURCE_PLLI2S (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_0 >> 16U)) /*!< PLLI2S selection as MCO2 source */ +#define LL_RCC_MCO2SOURCE_HSE (uint32_t)(RCC_CFGR_MCO2|(RCC_CFGR_MCO2_1 >> 16U)) /*!< HSE selection as MCO2 source */ +#define LL_RCC_MCO2SOURCE_PLLCLK (uint32_t)(RCC_CFGR_MCO2|((RCC_CFGR_MCO2_1|RCC_CFGR_MCO2_0) >> 16U)) /*!< PLLCLK selection as MCO2 source */ +#endif /* RCC_CFGR_MCO2 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_MCOx_DIV MCO prescaler + * @{ + */ +#define LL_RCC_MCO1_DIV_1 (uint32_t)(RCC_CFGR_MCO1PRE|0x00000000U) /*!< MCO1 not divided */ +#define LL_RCC_MCO1_DIV_2 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE_2 >> 16U)) /*!< MCO1 divided by 2 */ +#define LL_RCC_MCO1_DIV_3 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_0) >> 16U)) /*!< MCO1 divided by 3 */ +#define LL_RCC_MCO1_DIV_4 (uint32_t)(RCC_CFGR_MCO1PRE|((RCC_CFGR_MCO1PRE_2|RCC_CFGR_MCO1PRE_1) >> 16U)) /*!< MCO1 divided by 4 */ +#define LL_RCC_MCO1_DIV_5 (uint32_t)(RCC_CFGR_MCO1PRE|(RCC_CFGR_MCO1PRE >> 16U)) /*!< MCO1 divided by 5 */ +#if defined(RCC_CFGR_MCO2PRE) +#define LL_RCC_MCO2_DIV_1 (uint32_t)(RCC_CFGR_MCO2PRE|0x00000000U) /*!< MCO2 not divided */ +#define LL_RCC_MCO2_DIV_2 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE_2 >> 16U)) /*!< MCO2 divided by 2 */ +#define LL_RCC_MCO2_DIV_3 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_0) >> 16U)) /*!< MCO2 divided by 3 */ +#define LL_RCC_MCO2_DIV_4 (uint32_t)(RCC_CFGR_MCO2PRE|((RCC_CFGR_MCO2PRE_2|RCC_CFGR_MCO2PRE_1) >> 16U)) /*!< MCO2 divided by 4 */ +#define LL_RCC_MCO2_DIV_5 (uint32_t)(RCC_CFGR_MCO2PRE|(RCC_CFGR_MCO2PRE >> 16U)) /*!< MCO2 divided by 5 */ +#endif /* RCC_CFGR_MCO2PRE */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_RTC_HSEDIV HSE prescaler for RTC clock + * @{ + */ +#define LL_RCC_RTC_NOCLOCK 0x00000000U /*!< HSE not divided */ +#define LL_RCC_RTC_HSE_DIV_2 RCC_CFGR_RTCPRE_1 /*!< HSE clock divided by 2 */ +#define LL_RCC_RTC_HSE_DIV_3 (RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 3 */ +#define LL_RCC_RTC_HSE_DIV_4 RCC_CFGR_RTCPRE_2 /*!< HSE clock divided by 4 */ +#define LL_RCC_RTC_HSE_DIV_5 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 5 */ +#define LL_RCC_RTC_HSE_DIV_6 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 6 */ +#define LL_RCC_RTC_HSE_DIV_7 (RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 7 */ +#define LL_RCC_RTC_HSE_DIV_8 RCC_CFGR_RTCPRE_3 /*!< HSE clock divided by 8 */ +#define LL_RCC_RTC_HSE_DIV_9 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 9 */ +#define LL_RCC_RTC_HSE_DIV_10 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 10 */ +#define LL_RCC_RTC_HSE_DIV_11 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 11 */ +#define LL_RCC_RTC_HSE_DIV_12 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 12 */ +#define LL_RCC_RTC_HSE_DIV_13 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 13 */ +#define LL_RCC_RTC_HSE_DIV_14 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 14 */ +#define LL_RCC_RTC_HSE_DIV_15 (RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 15 */ +#define LL_RCC_RTC_HSE_DIV_16 RCC_CFGR_RTCPRE_4 /*!< HSE clock divided by 16 */ +#define LL_RCC_RTC_HSE_DIV_17 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 17 */ +#define LL_RCC_RTC_HSE_DIV_18 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 18 */ +#define LL_RCC_RTC_HSE_DIV_19 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 19 */ +#define LL_RCC_RTC_HSE_DIV_20 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 20 */ +#define LL_RCC_RTC_HSE_DIV_21 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 21 */ +#define LL_RCC_RTC_HSE_DIV_22 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 22 */ +#define LL_RCC_RTC_HSE_DIV_23 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 23 */ +#define LL_RCC_RTC_HSE_DIV_24 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3) /*!< HSE clock divided by 24 */ +#define LL_RCC_RTC_HSE_DIV_25 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 25 */ +#define LL_RCC_RTC_HSE_DIV_26 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 26 */ +#define LL_RCC_RTC_HSE_DIV_27 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 27 */ +#define LL_RCC_RTC_HSE_DIV_28 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2) /*!< HSE clock divided by 28 */ +#define LL_RCC_RTC_HSE_DIV_29 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 29 */ +#define LL_RCC_RTC_HSE_DIV_30 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1) /*!< HSE clock divided by 30 */ +#define LL_RCC_RTC_HSE_DIV_31 (RCC_CFGR_RTCPRE_4|RCC_CFGR_RTCPRE_3|RCC_CFGR_RTCPRE_2|RCC_CFGR_RTCPRE_1|RCC_CFGR_RTCPRE_0) /*!< HSE clock divided by 31 */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_EC_PERIPH_FREQUENCY Peripheral clock frequency + * @{ + */ +#define LL_RCC_PERIPH_FREQUENCY_NO 0x00000000U /*!< No clock enabled for the peripheral */ +#define LL_RCC_PERIPH_FREQUENCY_NA 0xFFFFFFFFU /*!< Frequency cannot be provided as external clock */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +#if defined(FMPI2C1) +/** @defgroup RCC_LL_EC_FMPI2C1_CLKSOURCE Peripheral FMPI2C clock source selection + * @{ + */ +#define LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as FMPI2C1 clock source */ +#define LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK RCC_DCKCFGR2_FMPI2C1SEL_0 /*!< SYSCLK clock used as FMPI2C1 clock source */ +#define LL_RCC_FMPI2C1_CLKSOURCE_HSI RCC_DCKCFGR2_FMPI2C1SEL_1 /*!< HSI clock used as FMPI2C1 clock source */ +/** + * @} + */ +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +/** @defgroup RCC_LL_EC_LPTIM1_CLKSOURCE Peripheral LPTIM clock source selection + * @{ + */ +#define LL_RCC_LPTIM1_CLKSOURCE_PCLK1 0x00000000U /*!< PCLK1 clock used as LPTIM1 clock */ +#define LL_RCC_LPTIM1_CLKSOURCE_HSI RCC_DCKCFGR2_LPTIM1SEL_0 /*!< LSI oscillator clock used as LPTIM1 clock */ +#define LL_RCC_LPTIM1_CLKSOURCE_LSI RCC_DCKCFGR2_LPTIM1SEL_1 /*!< HSI oscillator clock used as LPTIM1 clock */ +#define LL_RCC_LPTIM1_CLKSOURCE_LSE (uint32_t)(RCC_DCKCFGR2_LPTIM1SEL_1 | RCC_DCKCFGR2_LPTIM1SEL_0) /*!< LSE oscillator clock used as LPTIM1 clock */ +/** + * @} + */ +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** @defgroup RCC_LL_EC_SAIx_CLKSOURCE Peripheral SAI clock source selection + * @{ + */ +#if defined(RCC_DCKCFGR_SAI1SRC) +#define LL_RCC_SAI1_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1SRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 clock source */ +#define LL_RCC_SAI1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 clock source */ +#define LL_RCC_SAI1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC_1 >> 16)) /*!< PLL clock used as SAI1 clock source */ +#define LL_RCC_SAI1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1SRC | (RCC_DCKCFGR_SAI1SRC >> 16)) /*!< External pin clock used as SAI1 clock source */ +#endif /* RCC_DCKCFGR_SAI1SRC */ +#if defined(RCC_DCKCFGR_SAI2SRC) +#define LL_RCC_SAI2_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI2SRC | 0x00000000U) /*!< PLLSAI clock used as SAI2 clock source */ +#define LL_RCC_SAI2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_0 >> 16)) /*!< PLLI2S clock used as SAI2 clock source */ +#define LL_RCC_SAI2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC_1 >> 16)) /*!< PLL clock used as SAI2 clock source */ +#define LL_RCC_SAI2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI2SRC | (RCC_DCKCFGR_SAI2SRC >> 16)) /*!< PLL Main clock used as SAI2 clock source */ +#endif /* RCC_DCKCFGR_SAI2SRC */ +#if defined(RCC_DCKCFGR_SAI1ASRC) +#if defined(RCC_SAI1A_PLLSOURCE_SUPPORT) +#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< External pin used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< PLL clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC >> 16)) /*!< PLL Main clock used as SAI1 block A clock source */ +#else +#define LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1ASRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block A clock source */ +#define LL_RCC_SAI1_A_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1ASRC | (RCC_DCKCFGR_SAI1ASRC_1 >> 16)) /*!< External pin clock used as SAI1 block A clock source */ +#endif /* RCC_SAI1A_PLLSOURCE_SUPPORT */ +#endif /* RCC_DCKCFGR_SAI1ASRC */ +#if defined(RCC_DCKCFGR_SAI1BSRC) +#if defined(RCC_SAI1B_PLLSOURCE_SUPPORT) +#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLI2S clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< External pin used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< PLL clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC >> 16)) /*!< PLL Main clock used as SAI1 block B clock source */ +#else +#define LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (uint32_t)(RCC_DCKCFGR_SAI1BSRC | 0x00000000U) /*!< PLLSAI clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_0 >> 16)) /*!< PLLI2S clock used as SAI1 block B clock source */ +#define LL_RCC_SAI1_B_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_SAI1BSRC | (RCC_DCKCFGR_SAI1BSRC_1 >> 16)) /*!< External pin clock used as SAI1 block B clock source */ +#endif /* RCC_SAI1B_PLLSOURCE_SUPPORT */ +#endif /* RCC_DCKCFGR_SAI1BSRC */ +/** + * @} + */ +#endif /* SAI1 */ + +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) +/** @defgroup RCC_LL_EC_SDIOx_CLKSOURCE Peripheral SDIO clock source selection + * @{ + */ +#define LL_RCC_SDIO_CLKSOURCE_PLL48CLK 0x00000000U /*!< PLL 48M domain clock used as SDIO clock */ +#if defined(RCC_DCKCFGR_SDIOSEL) +#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR_SDIOSEL /*!< System clock clock used as SDIO clock */ +#else +#define LL_RCC_SDIO_CLKSOURCE_SYSCLK RCC_DCKCFGR2_SDIOSEL /*!< System clock clock used as SDIO clock */ +#endif /* RCC_DCKCFGR_SDIOSEL */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + +#if defined(DSI) +/** @defgroup RCC_LL_EC_DSI_CLKSOURCE Peripheral DSI clock source selection + * @{ + */ +#define LL_RCC_DSI_CLKSOURCE_PHY 0x00000000U /*!< DSI-PHY clock used as DSI byte lane clock source */ +#define LL_RCC_DSI_CLKSOURCE_PLL RCC_DCKCFGR_DSISEL /*!< PLL clock used as DSI byte lane clock source */ +/** + * @} + */ +#endif /* DSI */ + +#if defined(CEC) +/** @defgroup RCC_LL_EC_CEC_CLKSOURCE Peripheral CEC clock source selection + * @{ + */ +#define LL_RCC_CEC_CLKSOURCE_HSI_DIV488 0x00000000U /*!< HSI oscillator clock divided by 488 used as CEC clock */ +#define LL_RCC_CEC_CLKSOURCE_LSE RCC_DCKCFGR2_CECSEL /*!< LSE oscillator clock used as CEC clock */ +/** + * @} + */ +#endif /* CEC */ + +/** @defgroup RCC_LL_EC_I2S1_CLKSOURCE Peripheral I2S clock source selection + * @{ + */ +#if defined(RCC_CFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE_PLLI2S 0x00000000U /*!< I2S oscillator clock used as I2S1 clock */ +#define LL_RCC_I2S1_CLKSOURCE_PIN RCC_CFGR_I2SSRC /*!< External pin clock used as I2S1 clock */ +#endif /* RCC_CFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2SSRC | 0x00000000U) /*!< PLL clock used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2SSRC | (RCC_DCKCFGR_I2SSRC_1 >> 16)) /*!< PLL Main clock used as I2S1 clock source */ +#endif /* RCC_DCKCFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2S1SRC) +#define LL_RCC_I2S1_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S1SRC | 0x00000000U) /*!< PLLI2S clock used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_0 >> 16)) /*!< External pin used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC_1 >> 16)) /*!< PLL clock used as I2S1 clock source */ +#define LL_RCC_I2S1_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S1SRC | (RCC_DCKCFGR_I2S1SRC >> 16)) /*!< PLL Main clock used as I2S1 clock source */ +#endif /* RCC_DCKCFGR_I2S1SRC */ +#if defined(RCC_DCKCFGR_I2S2SRC) +#define LL_RCC_I2S2_CLKSOURCE_PLLI2S (uint32_t)(RCC_DCKCFGR_I2S2SRC | 0x00000000U) /*!< PLLI2S clock used as I2S2 clock source */ +#define LL_RCC_I2S2_CLKSOURCE_PIN (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_0 >> 16)) /*!< External pin used as I2S2 clock source */ +#define LL_RCC_I2S2_CLKSOURCE_PLL (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC_1 >> 16)) /*!< PLL clock used as I2S2 clock source */ +#define LL_RCC_I2S2_CLKSOURCE_PLLSRC (uint32_t)(RCC_DCKCFGR_I2S2SRC | (RCC_DCKCFGR_I2S2SRC >> 16)) /*!< PLL Main clock used as I2S2 clock source */ +#endif /* RCC_DCKCFGR_I2S2SRC */ +/** + * @} + */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** @defgroup RCC_LL_EC_CK48M_CLKSOURCE Peripheral 48Mhz domain clock source selection + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ +#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ +#endif /* RCC_DCKCFGR_CK48MSEL */ +#if defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE_PLL 0x00000000U /*!< PLL oscillator clock used as 48Mhz domain clock */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_CK48M_CLKSOURCE_PLLSAI RCC_DCKCFGR2_CK48MSEL /*!< PLLSAI oscillator clock used as 48Mhz domain clock */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define LL_RCC_CK48M_CLKSOURCE_PLLI2S RCC_DCKCFGR2_CK48MSEL /*!< PLLI2S oscillator clock used as 48Mhz domain clock */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_DCKCFGR2_CK48MSEL */ +/** + * @} + */ + +#if defined(RNG) +/** @defgroup RCC_LL_EC_RNG_CLKSOURCE Peripheral RNG clock source selection + * @{ + */ +#define LL_RCC_RNG_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as RNG clock source */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_RNG_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as RNG clock source */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define LL_RCC_RNG_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as RNG clock source */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +/** + * @} + */ +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** @defgroup RCC_LL_EC_USB_CLKSOURCE Peripheral USB clock source selection + * @{ + */ +#define LL_RCC_USB_CLKSOURCE_PLL LL_RCC_CK48M_CLKSOURCE_PLL /*!< PLL clock used as USB clock source */ +#if defined(RCC_PLLSAI_SUPPORT) +#define LL_RCC_USB_CLKSOURCE_PLLSAI LL_RCC_CK48M_CLKSOURCE_PLLSAI /*!< PLLSAI clock used as USB clock source */ +#endif /* RCC_PLLSAI_SUPPORT */ +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define LL_RCC_USB_CLKSOURCE_PLLI2S LL_RCC_CK48M_CLKSOURCE_PLLI2S /*!< PLLI2S clock used as USB clock source */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +/** + * @} + */ +#endif /* USB_OTG_FS || USB_OTG_HS */ + +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) +/** @defgroup RCC_LL_EC_DFSDM1_AUDIO_CLKSOURCE Peripheral DFSDM Audio clock source selection + * @{ + */ +#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM1 Audio clock source */ +#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM1ASEL | (RCC_DCKCFGR_CKDFSDM1ASEL << 16)) /*!< I2S2 clock used as DFSDM1 Audio clock source */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | 0x00000000U) /*!< I2S1 clock used as DFSDM2 Audio clock source */ +#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (uint32_t)(RCC_DCKCFGR_CKDFSDM2ASEL | (RCC_DCKCFGR_CKDFSDM2ASEL << 16)) /*!< I2S2 clock used as DFSDM2 Audio clock source */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_DFSDM1_CLKSOURCE Peripheral DFSDM clock source selection + * @{ + */ +#define LL_RCC_DFSDM1_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM1 clock */ +#define LL_RCC_DFSDM1_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM1 clock */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_CLKSOURCE_PCLK2 0x00000000U /*!< PCLK2 clock used as DFSDM2 clock */ +#define LL_RCC_DFSDM2_CLKSOURCE_SYSCLK RCC_DCKCFGR_CKDFSDM1SEL /*!< System clock used as DFSDM2 clock */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ +#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ + +#if defined(FMPI2C1) +/** @defgroup RCC_LL_EC_FMPI2C1 Peripheral FMPI2C get clock source + * @{ + */ +#define LL_RCC_FMPI2C1_CLKSOURCE RCC_DCKCFGR2_FMPI2C1SEL /*!< FMPI2C1 Clock source selection */ +/** + * @} + */ +#endif /* FMPI2C1 */ + +#if defined(SPDIFRX) +/** @defgroup RCC_LL_EC_SPDIFRX_CLKSOURCE Peripheral SPDIFRX clock source selection + * @{ + */ +#define LL_RCC_SPDIFRX1_CLKSOURCE_PLL 0x00000000U /*!< PLL clock used as SPDIFRX clock source */ +#define LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S RCC_DCKCFGR2_SPDIFRXSEL /*!< PLLI2S clock used as SPDIFRX clock source */ +/** + * @} + */ +#endif /* SPDIFRX */ + +#if defined(LPTIM1) +/** @defgroup RCC_LL_EC_LPTIM1 Peripheral LPTIM get clock source + * @{ + */ +#define LL_RCC_LPTIM1_CLKSOURCE RCC_DCKCFGR2_LPTIM1SEL /*!< LPTIM1 Clock source selection */ +/** + * @} + */ +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** @defgroup RCC_LL_EC_SAIx Peripheral SAI get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_SAI1ASRC) +#define LL_RCC_SAI1_A_CLKSOURCE RCC_DCKCFGR_SAI1ASRC /*!< SAI1 block A Clock source selection */ +#endif /* RCC_DCKCFGR_SAI1ASRC */ +#if defined(RCC_DCKCFGR_SAI1BSRC) +#define LL_RCC_SAI1_B_CLKSOURCE RCC_DCKCFGR_SAI1BSRC /*!< SAI1 block B Clock source selection */ +#endif /* RCC_DCKCFGR_SAI1BSRC */ +#if defined(RCC_DCKCFGR_SAI1SRC) +#define LL_RCC_SAI1_CLKSOURCE RCC_DCKCFGR_SAI1SRC /*!< SAI1 Clock source selection */ +#endif /* RCC_DCKCFGR_SAI1SRC */ +#if defined(RCC_DCKCFGR_SAI2SRC) +#define LL_RCC_SAI2_CLKSOURCE RCC_DCKCFGR_SAI2SRC /*!< SAI2 Clock source selection */ +#endif /* RCC_DCKCFGR_SAI2SRC */ +/** + * @} + */ +#endif /* SAI1 */ + +#if defined(SDIO) +/** @defgroup RCC_LL_EC_SDIOx Peripheral SDIO get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_SDIOSEL) +#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR_SDIOSEL /*!< SDIO Clock source selection */ +#elif defined(RCC_DCKCFGR2_SDIOSEL) +#define LL_RCC_SDIO_CLKSOURCE RCC_DCKCFGR2_SDIOSEL /*!< SDIO Clock source selection */ +#else +#define LL_RCC_SDIO_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< SDIO Clock source selection */ +#endif +/** + * @} + */ +#endif /* SDIO */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** @defgroup RCC_LL_EC_CK48M Peripheral CK48M get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR_CK48MSEL /*!< CK48M Domain clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL */ +#if defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_CK48M_CLKSOURCE RCC_DCKCFGR2_CK48MSEL /*!< CK48M Domain clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(RNG) +/** @defgroup RCC_LL_EC_RNG Peripheral RNG get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_RNG_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< RNG Clock source selection */ +#else +#define LL_RCC_RNG_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< RNG Clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ +/** + * @} + */ +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** @defgroup RCC_LL_EC_USB Peripheral USB get clock source + * @{ + */ +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +#define LL_RCC_USB_CLKSOURCE LL_RCC_CK48M_CLKSOURCE /*!< USB Clock source selection */ +#else +#define LL_RCC_USB_CLKSOURCE RCC_PLLCFGR_PLLQ /*!< USB Clock source selection */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ +/** + * @} + */ +#endif /* USB_OTG_FS || USB_OTG_HS */ + +#if defined(CEC) +/** @defgroup RCC_LL_EC_CEC Peripheral CEC get clock source + * @{ + */ +#define LL_RCC_CEC_CLKSOURCE RCC_DCKCFGR2_CECSEL /*!< CEC Clock source selection */ +/** + * @} + */ +#endif /* CEC */ + +/** @defgroup RCC_LL_EC_I2S1 Peripheral I2S get clock source + * @{ + */ +#if defined(RCC_CFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE RCC_CFGR_I2SSRC /*!< I2S1 Clock source selection */ +#endif /* RCC_CFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2SSRC) +#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2SSRC /*!< I2S1 Clock source selection */ +#endif /* RCC_DCKCFGR_I2SSRC */ +#if defined(RCC_DCKCFGR_I2S1SRC) +#define LL_RCC_I2S1_CLKSOURCE RCC_DCKCFGR_I2S1SRC /*!< I2S1 Clock source selection */ +#endif /* RCC_DCKCFGR_I2S1SRC */ +#if defined(RCC_DCKCFGR_I2S2SRC) +#define LL_RCC_I2S2_CLKSOURCE RCC_DCKCFGR_I2S2SRC /*!< I2S2 Clock source selection */ +#endif /* RCC_DCKCFGR_I2S2SRC */ +/** + * @} + */ + +#if defined(DFSDM1_Channel0) || defined(DFSDM2_Channel0) +/** @defgroup RCC_LL_EC_DFSDM_AUDIO Peripheral DFSDM Audio get clock source + * @{ + */ +#define LL_RCC_DFSDM1_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM1ASEL /*!< DFSDM1 Audio Clock source selection */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_AUDIO_CLKSOURCE RCC_DCKCFGR_CKDFSDM2ASEL /*!< DFSDM2 Audio Clock source selection */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_DFSDM Peripheral DFSDM get clock source + * @{ + */ +#define LL_RCC_DFSDM1_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM1 Clock source selection */ +#if defined(DFSDM2_Channel0) +#define LL_RCC_DFSDM2_CLKSOURCE RCC_DCKCFGR_CKDFSDM1SEL /*!< DFSDM2 Clock source selection */ +#endif /* DFSDM2_Channel0 */ +/** + * @} + */ +#endif /* DFSDM1_Channel0 || DFSDM2_Channel0 */ + +#if defined(SPDIFRX) +/** @defgroup RCC_LL_EC_SPDIFRX Peripheral SPDIFRX get clock source + * @{ + */ +#define LL_RCC_SPDIFRX1_CLKSOURCE RCC_DCKCFGR2_SPDIFRXSEL /*!< SPDIFRX Clock source selection */ +/** + * @} + */ +#endif /* SPDIFRX */ + +#if defined(DSI) +/** @defgroup RCC_LL_EC_DSI Peripheral DSI get clock source + * @{ + */ +#define LL_RCC_DSI_CLKSOURCE RCC_DCKCFGR_DSISEL /*!< DSI Clock source selection */ +/** + * @} + */ +#endif /* DSI */ + +#if defined(LTDC) +/** @defgroup RCC_LL_EC_LTDC Peripheral LTDC get clock source + * @{ + */ +#define LL_RCC_LTDC_CLKSOURCE RCC_DCKCFGR_PLLSAIDIVR /*!< LTDC Clock source selection */ +/** + * @} + */ +#endif /* LTDC */ + + +/** @defgroup RCC_LL_EC_RTC_CLKSOURCE RTC clock source selection + * @{ + */ +#define LL_RCC_RTC_CLKSOURCE_NONE 0x00000000U /*!< No clock used as RTC clock */ +#define LL_RCC_RTC_CLKSOURCE_LSE RCC_BDCR_RTCSEL_0 /*!< LSE oscillator clock used as RTC clock */ +#define LL_RCC_RTC_CLKSOURCE_LSI RCC_BDCR_RTCSEL_1 /*!< LSI oscillator clock used as RTC clock */ +#define LL_RCC_RTC_CLKSOURCE_HSE RCC_BDCR_RTCSEL /*!< HSE oscillator clock divided by HSE prescaler used as RTC clock */ +/** + * @} + */ + +#if defined(RCC_DCKCFGR_TIMPRE) +/** @defgroup RCC_LL_EC_TIM_CLKPRESCALER Timers clocks prescalers selection + * @{ + */ +#define LL_RCC_TIM_PRESCALER_TWICE 0x00000000U /*!< Timers clock to twice PCLK */ +#define LL_RCC_TIM_PRESCALER_FOUR_TIMES RCC_DCKCFGR_TIMPRE /*!< Timers clock to four time PCLK */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_TIMPRE */ + +/** @defgroup RCC_LL_EC_PLLSOURCE PLL, PLLI2S and PLLSAI entry clock source + * @{ + */ +#define LL_RCC_PLLSOURCE_HSI RCC_PLLCFGR_PLLSRC_HSI /*!< HSI16 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE RCC_PLLCFGR_PLLSRC_HSE /*!< HSE clock selected as PLL entry clock source */ +#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) +#define LL_RCC_PLLI2SSOURCE_PIN (RCC_PLLI2SCFGR_PLLI2SSRC | 0x80U) /*!< I2S External pin input clock selected as PLLI2S entry clock source */ +#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLM_DIV PLL, PLLI2S and PLLSAI division factor + * @{ + */ +#define LL_RCC_PLLM_DIV_2 (RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 2 */ +#define LL_RCC_PLLM_DIV_3 (RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 3 */ +#define LL_RCC_PLLM_DIV_4 (RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 4 */ +#define LL_RCC_PLLM_DIV_5 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 5 */ +#define LL_RCC_PLLM_DIV_6 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 6 */ +#define LL_RCC_PLLM_DIV_7 (RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 7 */ +#define LL_RCC_PLLM_DIV_8 (RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 8 */ +#define LL_RCC_PLLM_DIV_9 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 9 */ +#define LL_RCC_PLLM_DIV_10 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 10 */ +#define LL_RCC_PLLM_DIV_11 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 11 */ +#define LL_RCC_PLLM_DIV_12 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 12 */ +#define LL_RCC_PLLM_DIV_13 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 13 */ +#define LL_RCC_PLLM_DIV_14 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 14 */ +#define LL_RCC_PLLM_DIV_15 (RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 15 */ +#define LL_RCC_PLLM_DIV_16 (RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 16 */ +#define LL_RCC_PLLM_DIV_17 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 17 */ +#define LL_RCC_PLLM_DIV_18 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 18 */ +#define LL_RCC_PLLM_DIV_19 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 19 */ +#define LL_RCC_PLLM_DIV_20 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 20 */ +#define LL_RCC_PLLM_DIV_21 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 21 */ +#define LL_RCC_PLLM_DIV_22 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 22 */ +#define LL_RCC_PLLM_DIV_23 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 23 */ +#define LL_RCC_PLLM_DIV_24 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 24 */ +#define LL_RCC_PLLM_DIV_25 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 25 */ +#define LL_RCC_PLLM_DIV_26 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 26 */ +#define LL_RCC_PLLM_DIV_27 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 27 */ +#define LL_RCC_PLLM_DIV_28 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 28 */ +#define LL_RCC_PLLM_DIV_29 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 29 */ +#define LL_RCC_PLLM_DIV_30 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 30 */ +#define LL_RCC_PLLM_DIV_31 (RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 31 */ +#define LL_RCC_PLLM_DIV_32 (RCC_PLLCFGR_PLLM_5) /*!< PLL, PLLI2S and PLLSAI division factor by 32 */ +#define LL_RCC_PLLM_DIV_33 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 33 */ +#define LL_RCC_PLLM_DIV_34 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 34 */ +#define LL_RCC_PLLM_DIV_35 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 35 */ +#define LL_RCC_PLLM_DIV_36 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 36 */ +#define LL_RCC_PLLM_DIV_37 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 37 */ +#define LL_RCC_PLLM_DIV_38 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 38 */ +#define LL_RCC_PLLM_DIV_39 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 39 */ +#define LL_RCC_PLLM_DIV_40 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 40 */ +#define LL_RCC_PLLM_DIV_41 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 41 */ +#define LL_RCC_PLLM_DIV_42 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 42 */ +#define LL_RCC_PLLM_DIV_43 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 43 */ +#define LL_RCC_PLLM_DIV_44 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 44 */ +#define LL_RCC_PLLM_DIV_45 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 45 */ +#define LL_RCC_PLLM_DIV_46 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 46 */ +#define LL_RCC_PLLM_DIV_47 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 47 */ +#define LL_RCC_PLLM_DIV_48 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4) /*!< PLL, PLLI2S and PLLSAI division factor by 48 */ +#define LL_RCC_PLLM_DIV_49 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 49 */ +#define LL_RCC_PLLM_DIV_50 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 50 */ +#define LL_RCC_PLLM_DIV_51 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 51 */ +#define LL_RCC_PLLM_DIV_52 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 52 */ +#define LL_RCC_PLLM_DIV_53 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 53 */ +#define LL_RCC_PLLM_DIV_54 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 54 */ +#define LL_RCC_PLLM_DIV_55 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 55 */ +#define LL_RCC_PLLM_DIV_56 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3) /*!< PLL, PLLI2S and PLLSAI division factor by 56 */ +#define LL_RCC_PLLM_DIV_57 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 57 */ +#define LL_RCC_PLLM_DIV_58 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 58 */ +#define LL_RCC_PLLM_DIV_59 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 59 */ +#define LL_RCC_PLLM_DIV_60 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2) /*!< PLL, PLLI2S and PLLSAI division factor by 60 */ +#define LL_RCC_PLLM_DIV_61 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 61 */ +#define LL_RCC_PLLM_DIV_62 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1) /*!< PLL, PLLI2S and PLLSAI division factor by 62 */ +#define LL_RCC_PLLM_DIV_63 (RCC_PLLCFGR_PLLM_5 | RCC_PLLCFGR_PLLM_4 | RCC_PLLCFGR_PLLM_3 | RCC_PLLCFGR_PLLM_2 | RCC_PLLCFGR_PLLM_1 | RCC_PLLCFGR_PLLM_0) /*!< PLL, PLLI2S and PLLSAI division factor by 63 */ +/** + * @} + */ + +#if defined(RCC_PLLCFGR_PLLR) +/** @defgroup RCC_LL_EC_PLLR_DIV PLL division factor (PLLR) + * @{ + */ +#define LL_RCC_PLLR_DIV_2 (RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 2 */ +#define LL_RCC_PLLR_DIV_3 (RCC_PLLCFGR_PLLR_1|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 3 */ +#define LL_RCC_PLLR_DIV_4 (RCC_PLLCFGR_PLLR_2) /*!< Main PLL division factor for PLLCLK (system clock) by 4 */ +#define LL_RCC_PLLR_DIV_5 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_0) /*!< Main PLL division factor for PLLCLK (system clock) by 5 */ +#define LL_RCC_PLLR_DIV_6 (RCC_PLLCFGR_PLLR_2|RCC_PLLCFGR_PLLR_1) /*!< Main PLL division factor for PLLCLK (system clock) by 6 */ +#define LL_RCC_PLLR_DIV_7 (RCC_PLLCFGR_PLLR) /*!< Main PLL division factor for PLLCLK (system clock) by 7 */ +/** + * @} + */ +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_DCKCFGR_PLLDIVR) +/** @defgroup RCC_LL_EC_PLLDIVR PLLDIVR division factor (PLLDIVR) + * @{ + */ +#define LL_RCC_PLLDIVR_DIV_1 (RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 1 */ +#define LL_RCC_PLLDIVR_DIV_2 (RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 2 */ +#define LL_RCC_PLLDIVR_DIV_3 (RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 3 */ +#define LL_RCC_PLLDIVR_DIV_4 (RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 4 */ +#define LL_RCC_PLLDIVR_DIV_5 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 5 */ +#define LL_RCC_PLLDIVR_DIV_6 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 6 */ +#define LL_RCC_PLLDIVR_DIV_7 (RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 7 */ +#define LL_RCC_PLLDIVR_DIV_8 (RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 8 */ +#define LL_RCC_PLLDIVR_DIV_9 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 9 */ +#define LL_RCC_PLLDIVR_DIV_10 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 10 */ +#define LL_RCC_PLLDIVR_DIV_11 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 11 */ +#define LL_RCC_PLLDIVR_DIV_12 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 12 */ +#define LL_RCC_PLLDIVR_DIV_13 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 13 */ +#define LL_RCC_PLLDIVR_DIV_14 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 14 */ +#define LL_RCC_PLLDIVR_DIV_15 (RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 15 */ +#define LL_RCC_PLLDIVR_DIV_16 (RCC_DCKCFGR_PLLDIVR_4) /*!< PLL division factor for PLLDIVR output by 16 */ +#define LL_RCC_PLLDIVR_DIV_17 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 17 */ +#define LL_RCC_PLLDIVR_DIV_18 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 18 */ +#define LL_RCC_PLLDIVR_DIV_19 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 19 */ +#define LL_RCC_PLLDIVR_DIV_20 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 20 */ +#define LL_RCC_PLLDIVR_DIV_21 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 21 */ +#define LL_RCC_PLLDIVR_DIV_22 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 22 */ +#define LL_RCC_PLLDIVR_DIV_23 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 23 */ +#define LL_RCC_PLLDIVR_DIV_24 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3) /*!< PLL division factor for PLLDIVR output by 24 */ +#define LL_RCC_PLLDIVR_DIV_25 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 25 */ +#define LL_RCC_PLLDIVR_DIV_26 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 26 */ +#define LL_RCC_PLLDIVR_DIV_27 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 27 */ +#define LL_RCC_PLLDIVR_DIV_28 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2) /*!< PLL division factor for PLLDIVR output by 28 */ +#define LL_RCC_PLLDIVR_DIV_29 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 29 */ +#define LL_RCC_PLLDIVR_DIV_30 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1) /*!< PLL division factor for PLLDIVR output by 30 */ +#define LL_RCC_PLLDIVR_DIV_31 (RCC_DCKCFGR_PLLDIVR_4 | RCC_DCKCFGR_PLLDIVR_3 | RCC_DCKCFGR_PLLDIVR_2 | RCC_DCKCFGR_PLLDIVR_1 | RCC_DCKCFGR_PLLDIVR_0) /*!< PLL division factor for PLLDIVR output by 31 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLDIVR */ + +/** @defgroup RCC_LL_EC_PLLP_DIV PLL division factor (PLLP) + * @{ + */ +#define LL_RCC_PLLP_DIV_2 0x00000000U /*!< Main PLL division factor for PLLP output by 2 */ +#define LL_RCC_PLLP_DIV_4 RCC_PLLCFGR_PLLP_0 /*!< Main PLL division factor for PLLP output by 4 */ +#define LL_RCC_PLLP_DIV_6 RCC_PLLCFGR_PLLP_1 /*!< Main PLL division factor for PLLP output by 6 */ +#define LL_RCC_PLLP_DIV_8 (RCC_PLLCFGR_PLLP_1 | RCC_PLLCFGR_PLLP_0) /*!< Main PLL division factor for PLLP output by 8 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLQ_DIV PLL division factor (PLLQ) + * @{ + */ +#define LL_RCC_PLLQ_DIV_2 RCC_PLLCFGR_PLLQ_1 /*!< Main PLL division factor for PLLQ output by 2 */ +#define LL_RCC_PLLQ_DIV_3 (RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 3 */ +#define LL_RCC_PLLQ_DIV_4 RCC_PLLCFGR_PLLQ_2 /*!< Main PLL division factor for PLLQ output by 4 */ +#define LL_RCC_PLLQ_DIV_5 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 5 */ +#define LL_RCC_PLLQ_DIV_6 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 6 */ +#define LL_RCC_PLLQ_DIV_7 (RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 7 */ +#define LL_RCC_PLLQ_DIV_8 RCC_PLLCFGR_PLLQ_3 /*!< Main PLL division factor for PLLQ output by 8 */ +#define LL_RCC_PLLQ_DIV_9 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 9 */ +#define LL_RCC_PLLQ_DIV_10 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 10 */ +#define LL_RCC_PLLQ_DIV_11 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 11 */ +#define LL_RCC_PLLQ_DIV_12 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2) /*!< Main PLL division factor for PLLQ output by 12 */ +#define LL_RCC_PLLQ_DIV_13 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 13 */ +#define LL_RCC_PLLQ_DIV_14 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1) /*!< Main PLL division factor for PLLQ output by 14 */ +#define LL_RCC_PLLQ_DIV_15 (RCC_PLLCFGR_PLLQ_3|RCC_PLLCFGR_PLLQ_2|RCC_PLLCFGR_PLLQ_1|RCC_PLLCFGR_PLLQ_0) /*!< Main PLL division factor for PLLQ output by 15 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLL_SPRE_SEL PLL Spread Spectrum Selection + * @{ + */ +#define LL_RCC_SPREAD_SELECT_CENTER 0x00000000U /*!< PLL center spread spectrum selection */ +#define LL_RCC_SPREAD_SELECT_DOWN RCC_SSCGR_SPREADSEL /*!< PLL down spread spectrum selection */ +/** + * @} + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** @defgroup RCC_LL_EC_PLLI2SM PLLI2SM division factor (PLLI2SM) + * @{ + */ +#if defined(RCC_PLLI2SCFGR_PLLI2SM) +#define LL_RCC_PLLI2SM_DIV_2 (RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 2 */ +#define LL_RCC_PLLI2SM_DIV_3 (RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 3 */ +#define LL_RCC_PLLI2SM_DIV_4 (RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 4 */ +#define LL_RCC_PLLI2SM_DIV_5 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 5 */ +#define LL_RCC_PLLI2SM_DIV_6 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 6 */ +#define LL_RCC_PLLI2SM_DIV_7 (RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 7 */ +#define LL_RCC_PLLI2SM_DIV_8 (RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 8 */ +#define LL_RCC_PLLI2SM_DIV_9 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 9 */ +#define LL_RCC_PLLI2SM_DIV_10 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 10 */ +#define LL_RCC_PLLI2SM_DIV_11 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 11 */ +#define LL_RCC_PLLI2SM_DIV_12 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 12 */ +#define LL_RCC_PLLI2SM_DIV_13 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 13 */ +#define LL_RCC_PLLI2SM_DIV_14 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 14 */ +#define LL_RCC_PLLI2SM_DIV_15 (RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 15 */ +#define LL_RCC_PLLI2SM_DIV_16 (RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 16 */ +#define LL_RCC_PLLI2SM_DIV_17 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 17 */ +#define LL_RCC_PLLI2SM_DIV_18 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 18 */ +#define LL_RCC_PLLI2SM_DIV_19 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 19 */ +#define LL_RCC_PLLI2SM_DIV_20 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 20 */ +#define LL_RCC_PLLI2SM_DIV_21 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 21 */ +#define LL_RCC_PLLI2SM_DIV_22 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 22 */ +#define LL_RCC_PLLI2SM_DIV_23 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 23 */ +#define LL_RCC_PLLI2SM_DIV_24 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 24 */ +#define LL_RCC_PLLI2SM_DIV_25 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 25 */ +#define LL_RCC_PLLI2SM_DIV_26 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 26 */ +#define LL_RCC_PLLI2SM_DIV_27 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 27 */ +#define LL_RCC_PLLI2SM_DIV_28 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 28 */ +#define LL_RCC_PLLI2SM_DIV_29 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 29 */ +#define LL_RCC_PLLI2SM_DIV_30 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 30 */ +#define LL_RCC_PLLI2SM_DIV_31 (RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 31 */ +#define LL_RCC_PLLI2SM_DIV_32 (RCC_PLLI2SCFGR_PLLI2SM_5) /*!< PLLI2S division factor for PLLI2SM output by 32 */ +#define LL_RCC_PLLI2SM_DIV_33 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 33 */ +#define LL_RCC_PLLI2SM_DIV_34 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 34 */ +#define LL_RCC_PLLI2SM_DIV_35 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 35 */ +#define LL_RCC_PLLI2SM_DIV_36 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 36 */ +#define LL_RCC_PLLI2SM_DIV_37 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 37 */ +#define LL_RCC_PLLI2SM_DIV_38 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 38 */ +#define LL_RCC_PLLI2SM_DIV_39 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 39 */ +#define LL_RCC_PLLI2SM_DIV_40 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 40 */ +#define LL_RCC_PLLI2SM_DIV_41 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 41 */ +#define LL_RCC_PLLI2SM_DIV_42 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 42 */ +#define LL_RCC_PLLI2SM_DIV_43 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 43 */ +#define LL_RCC_PLLI2SM_DIV_44 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 44 */ +#define LL_RCC_PLLI2SM_DIV_45 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 45 */ +#define LL_RCC_PLLI2SM_DIV_46 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 46 */ +#define LL_RCC_PLLI2SM_DIV_47 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 47 */ +#define LL_RCC_PLLI2SM_DIV_48 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4) /*!< PLLI2S division factor for PLLI2SM output by 48 */ +#define LL_RCC_PLLI2SM_DIV_49 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 49 */ +#define LL_RCC_PLLI2SM_DIV_50 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 50 */ +#define LL_RCC_PLLI2SM_DIV_51 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 51 */ +#define LL_RCC_PLLI2SM_DIV_52 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 52 */ +#define LL_RCC_PLLI2SM_DIV_53 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 53 */ +#define LL_RCC_PLLI2SM_DIV_54 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 54 */ +#define LL_RCC_PLLI2SM_DIV_55 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 55 */ +#define LL_RCC_PLLI2SM_DIV_56 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3) /*!< PLLI2S division factor for PLLI2SM output by 56 */ +#define LL_RCC_PLLI2SM_DIV_57 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 57 */ +#define LL_RCC_PLLI2SM_DIV_58 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 58 */ +#define LL_RCC_PLLI2SM_DIV_59 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 59 */ +#define LL_RCC_PLLI2SM_DIV_60 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2) /*!< PLLI2S division factor for PLLI2SM output by 60 */ +#define LL_RCC_PLLI2SM_DIV_61 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 61 */ +#define LL_RCC_PLLI2SM_DIV_62 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1) /*!< PLLI2S division factor for PLLI2SM output by 62 */ +#define LL_RCC_PLLI2SM_DIV_63 (RCC_PLLI2SCFGR_PLLI2SM_5 | RCC_PLLI2SCFGR_PLLI2SM_4 | RCC_PLLI2SCFGR_PLLI2SM_3 | RCC_PLLI2SCFGR_PLLI2SM_2 | RCC_PLLI2SCFGR_PLLI2SM_1 | RCC_PLLI2SCFGR_PLLI2SM_0) /*!< PLLI2S division factor for PLLI2SM output by 63 */ +#else +#define LL_RCC_PLLI2SM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLI2S division factor for PLLI2SM output by 2 */ +#define LL_RCC_PLLI2SM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLI2S division factor for PLLI2SM output by 3 */ +#define LL_RCC_PLLI2SM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLI2S division factor for PLLI2SM output by 4 */ +#define LL_RCC_PLLI2SM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLI2S division factor for PLLI2SM output by 5 */ +#define LL_RCC_PLLI2SM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLI2S division factor for PLLI2SM output by 6 */ +#define LL_RCC_PLLI2SM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLI2S division factor for PLLI2SM output by 7 */ +#define LL_RCC_PLLI2SM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLI2S division factor for PLLI2SM output by 8 */ +#define LL_RCC_PLLI2SM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLI2S division factor for PLLI2SM output by 9 */ +#define LL_RCC_PLLI2SM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLI2S division factor for PLLI2SM output by 10 */ +#define LL_RCC_PLLI2SM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLI2S division factor for PLLI2SM output by 11 */ +#define LL_RCC_PLLI2SM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLI2S division factor for PLLI2SM output by 12 */ +#define LL_RCC_PLLI2SM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLI2S division factor for PLLI2SM output by 13 */ +#define LL_RCC_PLLI2SM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLI2S division factor for PLLI2SM output by 14 */ +#define LL_RCC_PLLI2SM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLI2S division factor for PLLI2SM output by 15 */ +#define LL_RCC_PLLI2SM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLI2S division factor for PLLI2SM output by 16 */ +#define LL_RCC_PLLI2SM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLI2S division factor for PLLI2SM output by 17 */ +#define LL_RCC_PLLI2SM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLI2S division factor for PLLI2SM output by 18 */ +#define LL_RCC_PLLI2SM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLI2S division factor for PLLI2SM output by 19 */ +#define LL_RCC_PLLI2SM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLI2S division factor for PLLI2SM output by 20 */ +#define LL_RCC_PLLI2SM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLI2S division factor for PLLI2SM output by 21 */ +#define LL_RCC_PLLI2SM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLI2S division factor for PLLI2SM output by 22 */ +#define LL_RCC_PLLI2SM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLI2S division factor for PLLI2SM output by 23 */ +#define LL_RCC_PLLI2SM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLI2S division factor for PLLI2SM output by 24 */ +#define LL_RCC_PLLI2SM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLI2S division factor for PLLI2SM output by 25 */ +#define LL_RCC_PLLI2SM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLI2S division factor for PLLI2SM output by 26 */ +#define LL_RCC_PLLI2SM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLI2S division factor for PLLI2SM output by 27 */ +#define LL_RCC_PLLI2SM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLI2S division factor for PLLI2SM output by 28 */ +#define LL_RCC_PLLI2SM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLI2S division factor for PLLI2SM output by 29 */ +#define LL_RCC_PLLI2SM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLI2S division factor for PLLI2SM output by 30 */ +#define LL_RCC_PLLI2SM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLI2S division factor for PLLI2SM output by 31 */ +#define LL_RCC_PLLI2SM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLI2S division factor for PLLI2SM output by 32 */ +#define LL_RCC_PLLI2SM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLI2S division factor for PLLI2SM output by 33 */ +#define LL_RCC_PLLI2SM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLI2S division factor for PLLI2SM output by 34 */ +#define LL_RCC_PLLI2SM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLI2S division factor for PLLI2SM output by 35 */ +#define LL_RCC_PLLI2SM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLI2S division factor for PLLI2SM output by 36 */ +#define LL_RCC_PLLI2SM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLI2S division factor for PLLI2SM output by 37 */ +#define LL_RCC_PLLI2SM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLI2S division factor for PLLI2SM output by 38 */ +#define LL_RCC_PLLI2SM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLI2S division factor for PLLI2SM output by 39 */ +#define LL_RCC_PLLI2SM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLI2S division factor for PLLI2SM output by 40 */ +#define LL_RCC_PLLI2SM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLI2S division factor for PLLI2SM output by 41 */ +#define LL_RCC_PLLI2SM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLI2S division factor for PLLI2SM output by 42 */ +#define LL_RCC_PLLI2SM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLI2S division factor for PLLI2SM output by 43 */ +#define LL_RCC_PLLI2SM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLI2S division factor for PLLI2SM output by 44 */ +#define LL_RCC_PLLI2SM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLI2S division factor for PLLI2SM output by 45 */ +#define LL_RCC_PLLI2SM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLI2S division factor for PLLI2SM output by 46 */ +#define LL_RCC_PLLI2SM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLI2S division factor for PLLI2SM output by 47 */ +#define LL_RCC_PLLI2SM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLI2S division factor for PLLI2SM output by 48 */ +#define LL_RCC_PLLI2SM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLI2S division factor for PLLI2SM output by 49 */ +#define LL_RCC_PLLI2SM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLI2S division factor for PLLI2SM output by 50 */ +#define LL_RCC_PLLI2SM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLI2S division factor for PLLI2SM output by 51 */ +#define LL_RCC_PLLI2SM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLI2S division factor for PLLI2SM output by 52 */ +#define LL_RCC_PLLI2SM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLI2S division factor for PLLI2SM output by 53 */ +#define LL_RCC_PLLI2SM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLI2S division factor for PLLI2SM output by 54 */ +#define LL_RCC_PLLI2SM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLI2S division factor for PLLI2SM output by 55 */ +#define LL_RCC_PLLI2SM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLI2S division factor for PLLI2SM output by 56 */ +#define LL_RCC_PLLI2SM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLI2S division factor for PLLI2SM output by 57 */ +#define LL_RCC_PLLI2SM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLI2S division factor for PLLI2SM output by 58 */ +#define LL_RCC_PLLI2SM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLI2S division factor for PLLI2SM output by 59 */ +#define LL_RCC_PLLI2SM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLI2S division factor for PLLI2SM output by 60 */ +#define LL_RCC_PLLI2SM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLI2S division factor for PLLI2SM output by 61 */ +#define LL_RCC_PLLI2SM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLI2S division factor for PLLI2SM output by 62 */ +#define LL_RCC_PLLI2SM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLI2S division factor for PLLI2SM output by 63 */ +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ +/** + * @} + */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) +/** @defgroup RCC_LL_EC_PLLI2SQ PLLI2SQ division factor (PLLI2SQ) + * @{ + */ +#define LL_RCC_PLLI2SQ_DIV_2 RCC_PLLI2SCFGR_PLLI2SQ_1 /*!< PLLI2S division factor for PLLI2SQ output by 2 */ +#define LL_RCC_PLLI2SQ_DIV_3 (RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 3 */ +#define LL_RCC_PLLI2SQ_DIV_4 RCC_PLLI2SCFGR_PLLI2SQ_2 /*!< PLLI2S division factor for PLLI2SQ output by 4 */ +#define LL_RCC_PLLI2SQ_DIV_5 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 5 */ +#define LL_RCC_PLLI2SQ_DIV_6 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 6 */ +#define LL_RCC_PLLI2SQ_DIV_7 (RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 7 */ +#define LL_RCC_PLLI2SQ_DIV_8 RCC_PLLI2SCFGR_PLLI2SQ_3 /*!< PLLI2S division factor for PLLI2SQ output by 8 */ +#define LL_RCC_PLLI2SQ_DIV_9 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 9 */ +#define LL_RCC_PLLI2SQ_DIV_10 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 10 */ +#define LL_RCC_PLLI2SQ_DIV_11 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 11 */ +#define LL_RCC_PLLI2SQ_DIV_12 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2) /*!< PLLI2S division factor for PLLI2SQ output by 12 */ +#define LL_RCC_PLLI2SQ_DIV_13 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 13 */ +#define LL_RCC_PLLI2SQ_DIV_14 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1) /*!< PLLI2S division factor for PLLI2SQ output by 14 */ +#define LL_RCC_PLLI2SQ_DIV_15 (RCC_PLLI2SCFGR_PLLI2SQ_3 | RCC_PLLI2SCFGR_PLLI2SQ_2 | RCC_PLLI2SCFGR_PLLI2SQ_1 | RCC_PLLI2SCFGR_PLLI2SQ_0) /*!< PLLI2S division factor for PLLI2SQ output by 15 */ +/** + * @} + */ +#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** @defgroup RCC_LL_EC_PLLI2SDIVQ PLLI2SDIVQ division factor (PLLI2SDIVQ) + * @{ + */ +#define LL_RCC_PLLI2SDIVQ_DIV_1 0x00000000U /*!< PLLI2S division factor for PLLI2SDIVQ output by 1 */ +#define LL_RCC_PLLI2SDIVQ_DIV_2 RCC_DCKCFGR_PLLI2SDIVQ_0 /*!< PLLI2S division factor for PLLI2SDIVQ output by 2 */ +#define LL_RCC_PLLI2SDIVQ_DIV_3 RCC_DCKCFGR_PLLI2SDIVQ_1 /*!< PLLI2S division factor for PLLI2SDIVQ output by 3 */ +#define LL_RCC_PLLI2SDIVQ_DIV_4 (RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 4 */ +#define LL_RCC_PLLI2SDIVQ_DIV_5 RCC_DCKCFGR_PLLI2SDIVQ_2 /*!< PLLI2S division factor for PLLI2SDIVQ output by 5 */ +#define LL_RCC_PLLI2SDIVQ_DIV_6 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 6 */ +#define LL_RCC_PLLI2SDIVQ_DIV_7 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 7 */ +#define LL_RCC_PLLI2SDIVQ_DIV_8 (RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 8 */ +#define LL_RCC_PLLI2SDIVQ_DIV_9 RCC_DCKCFGR_PLLI2SDIVQ_3 /*!< PLLI2S division factor for PLLI2SDIVQ output by 9 */ +#define LL_RCC_PLLI2SDIVQ_DIV_10 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 10 */ +#define LL_RCC_PLLI2SDIVQ_DIV_11 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 11 */ +#define LL_RCC_PLLI2SDIVQ_DIV_12 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 12 */ +#define LL_RCC_PLLI2SDIVQ_DIV_13 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 13 */ +#define LL_RCC_PLLI2SDIVQ_DIV_14 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 14 */ +#define LL_RCC_PLLI2SDIVQ_DIV_15 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 15 */ +#define LL_RCC_PLLI2SDIVQ_DIV_16 (RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 16 */ +#define LL_RCC_PLLI2SDIVQ_DIV_17 RCC_DCKCFGR_PLLI2SDIVQ_4 /*!< PLLI2S division factor for PLLI2SDIVQ output by 17 */ +#define LL_RCC_PLLI2SDIVQ_DIV_18 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 18 */ +#define LL_RCC_PLLI2SDIVQ_DIV_19 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 19 */ +#define LL_RCC_PLLI2SDIVQ_DIV_20 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 20 */ +#define LL_RCC_PLLI2SDIVQ_DIV_21 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 21 */ +#define LL_RCC_PLLI2SDIVQ_DIV_22 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 22 */ +#define LL_RCC_PLLI2SDIVQ_DIV_23 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 23 */ +#define LL_RCC_PLLI2SDIVQ_DIV_24 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 24 */ +#define LL_RCC_PLLI2SDIVQ_DIV_25 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3) /*!< PLLI2S division factor for PLLI2SDIVQ output by 25 */ +#define LL_RCC_PLLI2SDIVQ_DIV_26 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 26 */ +#define LL_RCC_PLLI2SDIVQ_DIV_27 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 27 */ +#define LL_RCC_PLLI2SDIVQ_DIV_28 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 28 */ +#define LL_RCC_PLLI2SDIVQ_DIV_29 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2) /*!< PLLI2S division factor for PLLI2SDIVQ output by 29 */ +#define LL_RCC_PLLI2SDIVQ_DIV_30 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 30 */ +#define LL_RCC_PLLI2SDIVQ_DIV_31 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1) /*!< PLLI2S division factor for PLLI2SDIVQ output by 31 */ +#define LL_RCC_PLLI2SDIVQ_DIV_32 (RCC_DCKCFGR_PLLI2SDIVQ_4 | RCC_DCKCFGR_PLLI2SDIVQ_3 | RCC_DCKCFGR_PLLI2SDIVQ_2 | RCC_DCKCFGR_PLLI2SDIVQ_1 | RCC_DCKCFGR_PLLI2SDIVQ_0) /*!< PLLI2S division factor for PLLI2SDIVQ output by 32 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVR) +/** @defgroup RCC_LL_EC_PLLI2SDIVR PLLI2SDIVR division factor (PLLI2SDIVR) + * @{ + */ +#define LL_RCC_PLLI2SDIVR_DIV_1 (RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 1 */ +#define LL_RCC_PLLI2SDIVR_DIV_2 (RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 2 */ +#define LL_RCC_PLLI2SDIVR_DIV_3 (RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 3 */ +#define LL_RCC_PLLI2SDIVR_DIV_4 (RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 4 */ +#define LL_RCC_PLLI2SDIVR_DIV_5 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 5 */ +#define LL_RCC_PLLI2SDIVR_DIV_6 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 6 */ +#define LL_RCC_PLLI2SDIVR_DIV_7 (RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 7 */ +#define LL_RCC_PLLI2SDIVR_DIV_8 (RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 8 */ +#define LL_RCC_PLLI2SDIVR_DIV_9 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 9 */ +#define LL_RCC_PLLI2SDIVR_DIV_10 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 10 */ +#define LL_RCC_PLLI2SDIVR_DIV_11 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 11 */ +#define LL_RCC_PLLI2SDIVR_DIV_12 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 12 */ +#define LL_RCC_PLLI2SDIVR_DIV_13 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 13 */ +#define LL_RCC_PLLI2SDIVR_DIV_14 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 14 */ +#define LL_RCC_PLLI2SDIVR_DIV_15 (RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 15 */ +#define LL_RCC_PLLI2SDIVR_DIV_16 (RCC_DCKCFGR_PLLI2SDIVR_4) /*!< PLLI2S division factor for PLLI2SDIVR output by 16 */ +#define LL_RCC_PLLI2SDIVR_DIV_17 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 17 */ +#define LL_RCC_PLLI2SDIVR_DIV_18 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 18 */ +#define LL_RCC_PLLI2SDIVR_DIV_19 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 19 */ +#define LL_RCC_PLLI2SDIVR_DIV_20 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 20 */ +#define LL_RCC_PLLI2SDIVR_DIV_21 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 21 */ +#define LL_RCC_PLLI2SDIVR_DIV_22 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 22 */ +#define LL_RCC_PLLI2SDIVR_DIV_23 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 23 */ +#define LL_RCC_PLLI2SDIVR_DIV_24 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3) /*!< PLLI2S division factor for PLLI2SDIVR output by 24 */ +#define LL_RCC_PLLI2SDIVR_DIV_25 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 25 */ +#define LL_RCC_PLLI2SDIVR_DIV_26 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 26 */ +#define LL_RCC_PLLI2SDIVR_DIV_27 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 27 */ +#define LL_RCC_PLLI2SDIVR_DIV_28 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2) /*!< PLLI2S division factor for PLLI2SDIVR output by 28 */ +#define LL_RCC_PLLI2SDIVR_DIV_29 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 29 */ +#define LL_RCC_PLLI2SDIVR_DIV_30 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1) /*!< PLLI2S division factor for PLLI2SDIVR output by 30 */ +#define LL_RCC_PLLI2SDIVR_DIV_31 (RCC_DCKCFGR_PLLI2SDIVR_4 | RCC_DCKCFGR_PLLI2SDIVR_3 | RCC_DCKCFGR_PLLI2SDIVR_2 | RCC_DCKCFGR_PLLI2SDIVR_1 | RCC_DCKCFGR_PLLI2SDIVR_0) /*!< PLLI2S division factor for PLLI2SDIVR output by 31 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLI2SDIVR */ + +/** @defgroup RCC_LL_EC_PLLI2SR PLLI2SR division factor (PLLI2SR) + * @{ + */ +#define LL_RCC_PLLI2SR_DIV_2 RCC_PLLI2SCFGR_PLLI2SR_1 /*!< PLLI2S division factor for PLLI2SR output by 2 */ +#define LL_RCC_PLLI2SR_DIV_3 (RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 3 */ +#define LL_RCC_PLLI2SR_DIV_4 RCC_PLLI2SCFGR_PLLI2SR_2 /*!< PLLI2S division factor for PLLI2SR output by 4 */ +#define LL_RCC_PLLI2SR_DIV_5 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 5 */ +#define LL_RCC_PLLI2SR_DIV_6 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1) /*!< PLLI2S division factor for PLLI2SR output by 6 */ +#define LL_RCC_PLLI2SR_DIV_7 (RCC_PLLI2SCFGR_PLLI2SR_2 | RCC_PLLI2SCFGR_PLLI2SR_1 | RCC_PLLI2SCFGR_PLLI2SR_0) /*!< PLLI2S division factor for PLLI2SR output by 7 */ +/** + * @} + */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SP) +/** @defgroup RCC_LL_EC_PLLI2SP PLLI2SP division factor (PLLI2SP) + * @{ + */ +#define LL_RCC_PLLI2SP_DIV_2 0x00000000U /*!< PLLI2S division factor for PLLI2SP output by 2 */ +#define LL_RCC_PLLI2SP_DIV_4 RCC_PLLI2SCFGR_PLLI2SP_0 /*!< PLLI2S division factor for PLLI2SP output by 4 */ +#define LL_RCC_PLLI2SP_DIV_6 RCC_PLLI2SCFGR_PLLI2SP_1 /*!< PLLI2S division factor for PLLI2SP output by 6 */ +#define LL_RCC_PLLI2SP_DIV_8 (RCC_PLLI2SCFGR_PLLI2SP_1 | RCC_PLLI2SCFGR_PLLI2SP_0) /*!< PLLI2S division factor for PLLI2SP output by 8 */ +/** + * @} + */ +#endif /* RCC_PLLI2SCFGR_PLLI2SP */ +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** @defgroup RCC_LL_EC_PLLSAIM PLLSAIM division factor (PLLSAIM or PLLM) + * @{ + */ +#if defined(RCC_PLLSAICFGR_PLLSAIM) +#define LL_RCC_PLLSAIM_DIV_2 (RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 2 */ +#define LL_RCC_PLLSAIM_DIV_3 (RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 3 */ +#define LL_RCC_PLLSAIM_DIV_4 (RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 4 */ +#define LL_RCC_PLLSAIM_DIV_5 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 5 */ +#define LL_RCC_PLLSAIM_DIV_6 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 6 */ +#define LL_RCC_PLLSAIM_DIV_7 (RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 7 */ +#define LL_RCC_PLLSAIM_DIV_8 (RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 8 */ +#define LL_RCC_PLLSAIM_DIV_9 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 9 */ +#define LL_RCC_PLLSAIM_DIV_10 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 10 */ +#define LL_RCC_PLLSAIM_DIV_11 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 11 */ +#define LL_RCC_PLLSAIM_DIV_12 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 12 */ +#define LL_RCC_PLLSAIM_DIV_13 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 13 */ +#define LL_RCC_PLLSAIM_DIV_14 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 14 */ +#define LL_RCC_PLLSAIM_DIV_15 (RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 15 */ +#define LL_RCC_PLLSAIM_DIV_16 (RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 16 */ +#define LL_RCC_PLLSAIM_DIV_17 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 17 */ +#define LL_RCC_PLLSAIM_DIV_18 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 18 */ +#define LL_RCC_PLLSAIM_DIV_19 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 19 */ +#define LL_RCC_PLLSAIM_DIV_20 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 20 */ +#define LL_RCC_PLLSAIM_DIV_21 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 21 */ +#define LL_RCC_PLLSAIM_DIV_22 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 22 */ +#define LL_RCC_PLLSAIM_DIV_23 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 23 */ +#define LL_RCC_PLLSAIM_DIV_24 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 24 */ +#define LL_RCC_PLLSAIM_DIV_25 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 25 */ +#define LL_RCC_PLLSAIM_DIV_26 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 26 */ +#define LL_RCC_PLLSAIM_DIV_27 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 27 */ +#define LL_RCC_PLLSAIM_DIV_28 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 28 */ +#define LL_RCC_PLLSAIM_DIV_29 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 29 */ +#define LL_RCC_PLLSAIM_DIV_30 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 30 */ +#define LL_RCC_PLLSAIM_DIV_31 (RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 31 */ +#define LL_RCC_PLLSAIM_DIV_32 (RCC_PLLSAICFGR_PLLSAIM_5) /*!< PLLSAI division factor for PLLSAIM output by 32 */ +#define LL_RCC_PLLSAIM_DIV_33 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 33 */ +#define LL_RCC_PLLSAIM_DIV_34 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 34 */ +#define LL_RCC_PLLSAIM_DIV_35 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 35 */ +#define LL_RCC_PLLSAIM_DIV_36 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 36 */ +#define LL_RCC_PLLSAIM_DIV_37 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 37 */ +#define LL_RCC_PLLSAIM_DIV_38 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 38 */ +#define LL_RCC_PLLSAIM_DIV_39 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 39 */ +#define LL_RCC_PLLSAIM_DIV_40 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 40 */ +#define LL_RCC_PLLSAIM_DIV_41 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 41 */ +#define LL_RCC_PLLSAIM_DIV_42 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 42 */ +#define LL_RCC_PLLSAIM_DIV_43 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 43 */ +#define LL_RCC_PLLSAIM_DIV_44 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 44 */ +#define LL_RCC_PLLSAIM_DIV_45 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 45 */ +#define LL_RCC_PLLSAIM_DIV_46 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 46 */ +#define LL_RCC_PLLSAIM_DIV_47 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 47 */ +#define LL_RCC_PLLSAIM_DIV_48 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4) /*!< PLLSAI division factor for PLLSAIM output by 48 */ +#define LL_RCC_PLLSAIM_DIV_49 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 49 */ +#define LL_RCC_PLLSAIM_DIV_50 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 50 */ +#define LL_RCC_PLLSAIM_DIV_51 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 51 */ +#define LL_RCC_PLLSAIM_DIV_52 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 52 */ +#define LL_RCC_PLLSAIM_DIV_53 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 53 */ +#define LL_RCC_PLLSAIM_DIV_54 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 54 */ +#define LL_RCC_PLLSAIM_DIV_55 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 55 */ +#define LL_RCC_PLLSAIM_DIV_56 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3) /*!< PLLSAI division factor for PLLSAIM output by 56 */ +#define LL_RCC_PLLSAIM_DIV_57 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 57 */ +#define LL_RCC_PLLSAIM_DIV_58 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 58 */ +#define LL_RCC_PLLSAIM_DIV_59 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 59 */ +#define LL_RCC_PLLSAIM_DIV_60 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2) /*!< PLLSAI division factor for PLLSAIM output by 60 */ +#define LL_RCC_PLLSAIM_DIV_61 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 61 */ +#define LL_RCC_PLLSAIM_DIV_62 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1) /*!< PLLSAI division factor for PLLSAIM output by 62 */ +#define LL_RCC_PLLSAIM_DIV_63 (RCC_PLLSAICFGR_PLLSAIM_5 | RCC_PLLSAICFGR_PLLSAIM_4 | RCC_PLLSAICFGR_PLLSAIM_3 | RCC_PLLSAICFGR_PLLSAIM_2 | RCC_PLLSAICFGR_PLLSAIM_1 | RCC_PLLSAICFGR_PLLSAIM_0) /*!< PLLSAI division factor for PLLSAIM output by 63 */ +#else +#define LL_RCC_PLLSAIM_DIV_2 LL_RCC_PLLM_DIV_2 /*!< PLLSAI division factor for PLLSAIM output by 2 */ +#define LL_RCC_PLLSAIM_DIV_3 LL_RCC_PLLM_DIV_3 /*!< PLLSAI division factor for PLLSAIM output by 3 */ +#define LL_RCC_PLLSAIM_DIV_4 LL_RCC_PLLM_DIV_4 /*!< PLLSAI division factor for PLLSAIM output by 4 */ +#define LL_RCC_PLLSAIM_DIV_5 LL_RCC_PLLM_DIV_5 /*!< PLLSAI division factor for PLLSAIM output by 5 */ +#define LL_RCC_PLLSAIM_DIV_6 LL_RCC_PLLM_DIV_6 /*!< PLLSAI division factor for PLLSAIM output by 6 */ +#define LL_RCC_PLLSAIM_DIV_7 LL_RCC_PLLM_DIV_7 /*!< PLLSAI division factor for PLLSAIM output by 7 */ +#define LL_RCC_PLLSAIM_DIV_8 LL_RCC_PLLM_DIV_8 /*!< PLLSAI division factor for PLLSAIM output by 8 */ +#define LL_RCC_PLLSAIM_DIV_9 LL_RCC_PLLM_DIV_9 /*!< PLLSAI division factor for PLLSAIM output by 9 */ +#define LL_RCC_PLLSAIM_DIV_10 LL_RCC_PLLM_DIV_10 /*!< PLLSAI division factor for PLLSAIM output by 10 */ +#define LL_RCC_PLLSAIM_DIV_11 LL_RCC_PLLM_DIV_11 /*!< PLLSAI division factor for PLLSAIM output by 11 */ +#define LL_RCC_PLLSAIM_DIV_12 LL_RCC_PLLM_DIV_12 /*!< PLLSAI division factor for PLLSAIM output by 12 */ +#define LL_RCC_PLLSAIM_DIV_13 LL_RCC_PLLM_DIV_13 /*!< PLLSAI division factor for PLLSAIM output by 13 */ +#define LL_RCC_PLLSAIM_DIV_14 LL_RCC_PLLM_DIV_14 /*!< PLLSAI division factor for PLLSAIM output by 14 */ +#define LL_RCC_PLLSAIM_DIV_15 LL_RCC_PLLM_DIV_15 /*!< PLLSAI division factor for PLLSAIM output by 15 */ +#define LL_RCC_PLLSAIM_DIV_16 LL_RCC_PLLM_DIV_16 /*!< PLLSAI division factor for PLLSAIM output by 16 */ +#define LL_RCC_PLLSAIM_DIV_17 LL_RCC_PLLM_DIV_17 /*!< PLLSAI division factor for PLLSAIM output by 17 */ +#define LL_RCC_PLLSAIM_DIV_18 LL_RCC_PLLM_DIV_18 /*!< PLLSAI division factor for PLLSAIM output by 18 */ +#define LL_RCC_PLLSAIM_DIV_19 LL_RCC_PLLM_DIV_19 /*!< PLLSAI division factor for PLLSAIM output by 19 */ +#define LL_RCC_PLLSAIM_DIV_20 LL_RCC_PLLM_DIV_20 /*!< PLLSAI division factor for PLLSAIM output by 20 */ +#define LL_RCC_PLLSAIM_DIV_21 LL_RCC_PLLM_DIV_21 /*!< PLLSAI division factor for PLLSAIM output by 21 */ +#define LL_RCC_PLLSAIM_DIV_22 LL_RCC_PLLM_DIV_22 /*!< PLLSAI division factor for PLLSAIM output by 22 */ +#define LL_RCC_PLLSAIM_DIV_23 LL_RCC_PLLM_DIV_23 /*!< PLLSAI division factor for PLLSAIM output by 23 */ +#define LL_RCC_PLLSAIM_DIV_24 LL_RCC_PLLM_DIV_24 /*!< PLLSAI division factor for PLLSAIM output by 24 */ +#define LL_RCC_PLLSAIM_DIV_25 LL_RCC_PLLM_DIV_25 /*!< PLLSAI division factor for PLLSAIM output by 25 */ +#define LL_RCC_PLLSAIM_DIV_26 LL_RCC_PLLM_DIV_26 /*!< PLLSAI division factor for PLLSAIM output by 26 */ +#define LL_RCC_PLLSAIM_DIV_27 LL_RCC_PLLM_DIV_27 /*!< PLLSAI division factor for PLLSAIM output by 27 */ +#define LL_RCC_PLLSAIM_DIV_28 LL_RCC_PLLM_DIV_28 /*!< PLLSAI division factor for PLLSAIM output by 28 */ +#define LL_RCC_PLLSAIM_DIV_29 LL_RCC_PLLM_DIV_29 /*!< PLLSAI division factor for PLLSAIM output by 29 */ +#define LL_RCC_PLLSAIM_DIV_30 LL_RCC_PLLM_DIV_30 /*!< PLLSAI division factor for PLLSAIM output by 30 */ +#define LL_RCC_PLLSAIM_DIV_31 LL_RCC_PLLM_DIV_31 /*!< PLLSAI division factor for PLLSAIM output by 31 */ +#define LL_RCC_PLLSAIM_DIV_32 LL_RCC_PLLM_DIV_32 /*!< PLLSAI division factor for PLLSAIM output by 32 */ +#define LL_RCC_PLLSAIM_DIV_33 LL_RCC_PLLM_DIV_33 /*!< PLLSAI division factor for PLLSAIM output by 33 */ +#define LL_RCC_PLLSAIM_DIV_34 LL_RCC_PLLM_DIV_34 /*!< PLLSAI division factor for PLLSAIM output by 34 */ +#define LL_RCC_PLLSAIM_DIV_35 LL_RCC_PLLM_DIV_35 /*!< PLLSAI division factor for PLLSAIM output by 35 */ +#define LL_RCC_PLLSAIM_DIV_36 LL_RCC_PLLM_DIV_36 /*!< PLLSAI division factor for PLLSAIM output by 36 */ +#define LL_RCC_PLLSAIM_DIV_37 LL_RCC_PLLM_DIV_37 /*!< PLLSAI division factor for PLLSAIM output by 37 */ +#define LL_RCC_PLLSAIM_DIV_38 LL_RCC_PLLM_DIV_38 /*!< PLLSAI division factor for PLLSAIM output by 38 */ +#define LL_RCC_PLLSAIM_DIV_39 LL_RCC_PLLM_DIV_39 /*!< PLLSAI division factor for PLLSAIM output by 39 */ +#define LL_RCC_PLLSAIM_DIV_40 LL_RCC_PLLM_DIV_40 /*!< PLLSAI division factor for PLLSAIM output by 40 */ +#define LL_RCC_PLLSAIM_DIV_41 LL_RCC_PLLM_DIV_41 /*!< PLLSAI division factor for PLLSAIM output by 41 */ +#define LL_RCC_PLLSAIM_DIV_42 LL_RCC_PLLM_DIV_42 /*!< PLLSAI division factor for PLLSAIM output by 42 */ +#define LL_RCC_PLLSAIM_DIV_43 LL_RCC_PLLM_DIV_43 /*!< PLLSAI division factor for PLLSAIM output by 43 */ +#define LL_RCC_PLLSAIM_DIV_44 LL_RCC_PLLM_DIV_44 /*!< PLLSAI division factor for PLLSAIM output by 44 */ +#define LL_RCC_PLLSAIM_DIV_45 LL_RCC_PLLM_DIV_45 /*!< PLLSAI division factor for PLLSAIM output by 45 */ +#define LL_RCC_PLLSAIM_DIV_46 LL_RCC_PLLM_DIV_46 /*!< PLLSAI division factor for PLLSAIM output by 46 */ +#define LL_RCC_PLLSAIM_DIV_47 LL_RCC_PLLM_DIV_47 /*!< PLLSAI division factor for PLLSAIM output by 47 */ +#define LL_RCC_PLLSAIM_DIV_48 LL_RCC_PLLM_DIV_48 /*!< PLLSAI division factor for PLLSAIM output by 48 */ +#define LL_RCC_PLLSAIM_DIV_49 LL_RCC_PLLM_DIV_49 /*!< PLLSAI division factor for PLLSAIM output by 49 */ +#define LL_RCC_PLLSAIM_DIV_50 LL_RCC_PLLM_DIV_50 /*!< PLLSAI division factor for PLLSAIM output by 50 */ +#define LL_RCC_PLLSAIM_DIV_51 LL_RCC_PLLM_DIV_51 /*!< PLLSAI division factor for PLLSAIM output by 51 */ +#define LL_RCC_PLLSAIM_DIV_52 LL_RCC_PLLM_DIV_52 /*!< PLLSAI division factor for PLLSAIM output by 52 */ +#define LL_RCC_PLLSAIM_DIV_53 LL_RCC_PLLM_DIV_53 /*!< PLLSAI division factor for PLLSAIM output by 53 */ +#define LL_RCC_PLLSAIM_DIV_54 LL_RCC_PLLM_DIV_54 /*!< PLLSAI division factor for PLLSAIM output by 54 */ +#define LL_RCC_PLLSAIM_DIV_55 LL_RCC_PLLM_DIV_55 /*!< PLLSAI division factor for PLLSAIM output by 55 */ +#define LL_RCC_PLLSAIM_DIV_56 LL_RCC_PLLM_DIV_56 /*!< PLLSAI division factor for PLLSAIM output by 56 */ +#define LL_RCC_PLLSAIM_DIV_57 LL_RCC_PLLM_DIV_57 /*!< PLLSAI division factor for PLLSAIM output by 57 */ +#define LL_RCC_PLLSAIM_DIV_58 LL_RCC_PLLM_DIV_58 /*!< PLLSAI division factor for PLLSAIM output by 58 */ +#define LL_RCC_PLLSAIM_DIV_59 LL_RCC_PLLM_DIV_59 /*!< PLLSAI division factor for PLLSAIM output by 59 */ +#define LL_RCC_PLLSAIM_DIV_60 LL_RCC_PLLM_DIV_60 /*!< PLLSAI division factor for PLLSAIM output by 60 */ +#define LL_RCC_PLLSAIM_DIV_61 LL_RCC_PLLM_DIV_61 /*!< PLLSAI division factor for PLLSAIM output by 61 */ +#define LL_RCC_PLLSAIM_DIV_62 LL_RCC_PLLM_DIV_62 /*!< PLLSAI division factor for PLLSAIM output by 62 */ +#define LL_RCC_PLLSAIM_DIV_63 LL_RCC_PLLM_DIV_63 /*!< PLLSAI division factor for PLLSAIM output by 63 */ +#endif /* RCC_PLLSAICFGR_PLLSAIM */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLSAIQ PLLSAIQ division factor (PLLSAIQ) + * @{ + */ +#define LL_RCC_PLLSAIQ_DIV_2 RCC_PLLSAICFGR_PLLSAIQ_1 /*!< PLLSAI division factor for PLLSAIQ output by 2 */ +#define LL_RCC_PLLSAIQ_DIV_3 (RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 3 */ +#define LL_RCC_PLLSAIQ_DIV_4 RCC_PLLSAICFGR_PLLSAIQ_2 /*!< PLLSAI division factor for PLLSAIQ output by 4 */ +#define LL_RCC_PLLSAIQ_DIV_5 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 5 */ +#define LL_RCC_PLLSAIQ_DIV_6 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 6 */ +#define LL_RCC_PLLSAIQ_DIV_7 (RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 7 */ +#define LL_RCC_PLLSAIQ_DIV_8 RCC_PLLSAICFGR_PLLSAIQ_3 /*!< PLLSAI division factor for PLLSAIQ output by 8 */ +#define LL_RCC_PLLSAIQ_DIV_9 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 9 */ +#define LL_RCC_PLLSAIQ_DIV_10 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 10 */ +#define LL_RCC_PLLSAIQ_DIV_11 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 11 */ +#define LL_RCC_PLLSAIQ_DIV_12 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2) /*!< PLLSAI division factor for PLLSAIQ output by 12 */ +#define LL_RCC_PLLSAIQ_DIV_13 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 13 */ +#define LL_RCC_PLLSAIQ_DIV_14 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1) /*!< PLLSAI division factor for PLLSAIQ output by 14 */ +#define LL_RCC_PLLSAIQ_DIV_15 (RCC_PLLSAICFGR_PLLSAIQ_3 | RCC_PLLSAICFGR_PLLSAIQ_2 | RCC_PLLSAICFGR_PLLSAIQ_1 | RCC_PLLSAICFGR_PLLSAIQ_0) /*!< PLLSAI division factor for PLLSAIQ output by 15 */ +/** + * @} + */ + +#if defined(RCC_DCKCFGR_PLLSAIDIVQ) +/** @defgroup RCC_LL_EC_PLLSAIDIVQ PLLSAIDIVQ division factor (PLLSAIDIVQ) + * @{ + */ +#define LL_RCC_PLLSAIDIVQ_DIV_1 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVQ output by 1 */ +#define LL_RCC_PLLSAIDIVQ_DIV_2 RCC_DCKCFGR_PLLSAIDIVQ_0 /*!< PLLSAI division factor for PLLSAIDIVQ output by 2 */ +#define LL_RCC_PLLSAIDIVQ_DIV_3 RCC_DCKCFGR_PLLSAIDIVQ_1 /*!< PLLSAI division factor for PLLSAIDIVQ output by 3 */ +#define LL_RCC_PLLSAIDIVQ_DIV_4 (RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 4 */ +#define LL_RCC_PLLSAIDIVQ_DIV_5 RCC_DCKCFGR_PLLSAIDIVQ_2 /*!< PLLSAI division factor for PLLSAIDIVQ output by 5 */ +#define LL_RCC_PLLSAIDIVQ_DIV_6 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 6 */ +#define LL_RCC_PLLSAIDIVQ_DIV_7 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 7 */ +#define LL_RCC_PLLSAIDIVQ_DIV_8 (RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 8 */ +#define LL_RCC_PLLSAIDIVQ_DIV_9 RCC_DCKCFGR_PLLSAIDIVQ_3 /*!< PLLSAI division factor for PLLSAIDIVQ output by 9 */ +#define LL_RCC_PLLSAIDIVQ_DIV_10 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 10 */ +#define LL_RCC_PLLSAIDIVQ_DIV_11 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 11 */ +#define LL_RCC_PLLSAIDIVQ_DIV_12 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 12 */ +#define LL_RCC_PLLSAIDIVQ_DIV_13 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 13 */ +#define LL_RCC_PLLSAIDIVQ_DIV_14 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 14 */ +#define LL_RCC_PLLSAIDIVQ_DIV_15 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 15 */ +#define LL_RCC_PLLSAIDIVQ_DIV_16 (RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 16 */ +#define LL_RCC_PLLSAIDIVQ_DIV_17 RCC_DCKCFGR_PLLSAIDIVQ_4 /*!< PLLSAI division factor for PLLSAIDIVQ output by 17 */ +#define LL_RCC_PLLSAIDIVQ_DIV_18 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 18 */ +#define LL_RCC_PLLSAIDIVQ_DIV_19 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 19 */ +#define LL_RCC_PLLSAIDIVQ_DIV_20 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 20 */ +#define LL_RCC_PLLSAIDIVQ_DIV_21 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 21 */ +#define LL_RCC_PLLSAIDIVQ_DIV_22 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 22 */ +#define LL_RCC_PLLSAIDIVQ_DIV_23 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 23 */ +#define LL_RCC_PLLSAIDIVQ_DIV_24 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 24 */ +#define LL_RCC_PLLSAIDIVQ_DIV_25 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3) /*!< PLLSAI division factor for PLLSAIDIVQ output by 25 */ +#define LL_RCC_PLLSAIDIVQ_DIV_26 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 26 */ +#define LL_RCC_PLLSAIDIVQ_DIV_27 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 27 */ +#define LL_RCC_PLLSAIDIVQ_DIV_28 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 28 */ +#define LL_RCC_PLLSAIDIVQ_DIV_29 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2) /*!< PLLSAI division factor for PLLSAIDIVQ output by 29 */ +#define LL_RCC_PLLSAIDIVQ_DIV_30 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 30 */ +#define LL_RCC_PLLSAIDIVQ_DIV_31 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1) /*!< PLLSAI division factor for PLLSAIDIVQ output by 31 */ +#define LL_RCC_PLLSAIDIVQ_DIV_32 (RCC_DCKCFGR_PLLSAIDIVQ_4 | RCC_DCKCFGR_PLLSAIDIVQ_3 | RCC_DCKCFGR_PLLSAIDIVQ_2 | RCC_DCKCFGR_PLLSAIDIVQ_1 | RCC_DCKCFGR_PLLSAIDIVQ_0) /*!< PLLSAI division factor for PLLSAIDIVQ output by 32 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLSAIDIVQ */ + +#if defined(RCC_PLLSAICFGR_PLLSAIR) +/** @defgroup RCC_LL_EC_PLLSAIR PLLSAIR division factor (PLLSAIR) + * @{ + */ +#define LL_RCC_PLLSAIR_DIV_2 RCC_PLLSAICFGR_PLLSAIR_1 /*!< PLLSAI division factor for PLLSAIR output by 2 */ +#define LL_RCC_PLLSAIR_DIV_3 (RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 3 */ +#define LL_RCC_PLLSAIR_DIV_4 RCC_PLLSAICFGR_PLLSAIR_2 /*!< PLLSAI division factor for PLLSAIR output by 4 */ +#define LL_RCC_PLLSAIR_DIV_5 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 5 */ +#define LL_RCC_PLLSAIR_DIV_6 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1) /*!< PLLSAI division factor for PLLSAIR output by 6 */ +#define LL_RCC_PLLSAIR_DIV_7 (RCC_PLLSAICFGR_PLLSAIR_2 | RCC_PLLSAICFGR_PLLSAIR_1 | RCC_PLLSAICFGR_PLLSAIR_0) /*!< PLLSAI division factor for PLLSAIR output by 7 */ +/** + * @} + */ +#endif /* RCC_PLLSAICFGR_PLLSAIR */ + +#if defined(RCC_DCKCFGR_PLLSAIDIVR) +/** @defgroup RCC_LL_EC_PLLSAIDIVR PLLSAIDIVR division factor (PLLSAIDIVR) + * @{ + */ +#define LL_RCC_PLLSAIDIVR_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIDIVR output by 2 */ +#define LL_RCC_PLLSAIDIVR_DIV_4 RCC_DCKCFGR_PLLSAIDIVR_0 /*!< PLLSAI division factor for PLLSAIDIVR output by 4 */ +#define LL_RCC_PLLSAIDIVR_DIV_8 RCC_DCKCFGR_PLLSAIDIVR_1 /*!< PLLSAI division factor for PLLSAIDIVR output by 8 */ +#define LL_RCC_PLLSAIDIVR_DIV_16 (RCC_DCKCFGR_PLLSAIDIVR_1 | RCC_DCKCFGR_PLLSAIDIVR_0) /*!< PLLSAI division factor for PLLSAIDIVR output by 16 */ +/** + * @} + */ +#endif /* RCC_DCKCFGR_PLLSAIDIVR */ + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** @defgroup RCC_LL_EC_PLLSAIP PLLSAIP division factor (PLLSAIP) + * @{ + */ +#define LL_RCC_PLLSAIP_DIV_2 0x00000000U /*!< PLLSAI division factor for PLLSAIP output by 2 */ +#define LL_RCC_PLLSAIP_DIV_4 RCC_PLLSAICFGR_PLLSAIP_0 /*!< PLLSAI division factor for PLLSAIP output by 4 */ +#define LL_RCC_PLLSAIP_DIV_6 RCC_PLLSAICFGR_PLLSAIP_1 /*!< PLLSAI division factor for PLLSAIP output by 6 */ +#define LL_RCC_PLLSAIP_DIV_8 (RCC_PLLSAICFGR_PLLSAIP_1 | RCC_PLLSAICFGR_PLLSAIP_0) /*!< PLLSAI division factor for PLLSAIP output by 8 */ +/** + * @} + */ +#endif /* RCC_PLLSAICFGR_PLLSAIP */ +#endif /* RCC_PLLSAI_SUPPORT */ +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in RCC register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_RCC_WriteReg(__REG__, __VALUE__) WRITE_REG(RCC->__REG__, (__VALUE__)) + +/** + * @brief Read a value in RCC register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_RCC_ReadReg(__REG__) READ_REG(RCC->__REG__) +/** + * @} + */ + +/** @defgroup RCC_LL_EM_CALC_FREQ Calculate frequencies + * @{ + */ + +/** + * @brief Helper macro to calculate the PLLCLK frequency on system domain + * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetP ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLP__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLP_DIV_2 + * @arg @ref LL_RCC_PLLP_DIV_4 + * @arg @ref LL_RCC_PLLP_DIV_6 + * @arg @ref LL_RCC_PLLP_DIV_8 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLP__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((((__PLLP__) >> RCC_PLLCFGR_PLLP_Pos ) + 1U) * 2U)) + +#if defined(RCC_PLLR_SYSCLK_SUPPORT) +/** + * @brief Helper macro to calculate the PLLRCLK frequency on system domain + * @note ex: @ref __LL_RCC_CALC_PLLRCLK_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLRCLK_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) + +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ + +/** + * @brief Helper macro to calculate the PLLCLK frequency used on 48M domain + * @note ex: @ref __LL_RCC_CALC_PLLCLK_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLQ_DIV_2 + * @arg @ref LL_RCC_PLLQ_DIV_3 + * @arg @ref LL_RCC_PLLQ_DIV_4 + * @arg @ref LL_RCC_PLLQ_DIV_5 + * @arg @ref LL_RCC_PLLQ_DIV_6 + * @arg @ref LL_RCC_PLLQ_DIV_7 + * @arg @ref LL_RCC_PLLQ_DIV_8 + * @arg @ref LL_RCC_PLLQ_DIV_9 + * @arg @ref LL_RCC_PLLQ_DIV_10 + * @arg @ref LL_RCC_PLLQ_DIV_11 + * @arg @ref LL_RCC_PLLQ_DIV_12 + * @arg @ref LL_RCC_PLLQ_DIV_13 + * @arg @ref LL_RCC_PLLQ_DIV_14 + * @arg @ref LL_RCC_PLLQ_DIV_15 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLQ__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLQ__) >> RCC_PLLCFGR_PLLQ_Pos )) + +#if defined(DSI) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on DSI + * @note ex: @ref __LL_RCC_CALC_PLLCLK_DSI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_DSI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* DSI */ + +#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on I2S + * @note ex: @ref __LL_RCC_CALC_PLLCLK_I2S_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ + +#if defined(SPDIFRX) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on SPDIFRX + * @note ex: @ref __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* SPDIFRX */ + +#if defined(RCC_PLLCFGR_PLLR) +#if defined(SAI1) +/** + * @brief Helper macro to calculate the PLLCLK frequency used on SAI + * @note ex: @ref __LL_RCC_CALC_PLLCLK_SAI_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetDivider (), + * @ref LL_RCC_PLL_GetN (), @ref LL_RCC_PLL_GetR (), @ref LL_RCC_PLL_GetDIVR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param __PLLN__ Between 50 and 432 + * @param __PLLR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @param __PLLDIVR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval PLL clock frequency (in Hz) + */ +#if defined(RCC_DCKCFGR_PLLDIVR) +#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__, __PLLDIVR__) (((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) / ((__PLLDIVR__) >> RCC_DCKCFGR_PLLDIVR_Pos )) +#else +#define __LL_RCC_CALC_PLLCLK_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLN__, __PLLR__) ((__INPUTFREQ__) / (__PLLM__) * (__PLLN__) / \ + ((__PLLR__) >> RCC_PLLCFGR_PLLR_Pos )) +#endif /* RCC_DCKCFGR_PLLDIVR */ +#endif /* SAI1 */ +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Helper macro to calculate the PLLSAI frequency used for SAI domain + * @note ex: @ref __LL_RCC_CALC_PLLSAI_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), + * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetQ (), @ref LL_RCC_PLLSAI_GetDIVQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param __PLLSAIN__ Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLSAIQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIQ_DIV_15 + * @param __PLLSAIDIVQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 + * @retval PLLSAI clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLSAI_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIQ__, __PLLSAIDIVQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ + (((__PLLSAIQ__) >> RCC_PLLSAICFGR_PLLSAIQ_Pos) * (((__PLLSAIDIVQ__) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos) + 1U))) + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Helper macro to calculate the PLLSAI frequency used on 48Mhz domain + * @note ex: @ref __LL_RCC_CALC_PLLSAI_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), + * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetP ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param __PLLSAIN__ Between 50 and 432 + * @param __PLLSAIP__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIP_DIV_2 + * @arg @ref LL_RCC_PLLSAIP_DIV_4 + * @arg @ref LL_RCC_PLLSAIP_DIV_6 + * @arg @ref LL_RCC_PLLSAIP_DIV_8 + * @retval PLLSAI clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLSAI_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ + ((((__PLLSAIP__) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) * 2U)) +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +#if defined(LTDC) +/** + * @brief Helper macro to calculate the PLLSAI frequency used for LTDC domain + * @note ex: @ref __LL_RCC_CALC_PLLSAI_LTDC_FREQ (HSE_VALUE,@ref LL_RCC_PLLSAI_GetDivider (), + * @ref LL_RCC_PLLSAI_GetN (), @ref LL_RCC_PLLSAI_GetR (), @ref LL_RCC_PLLSAI_GetDIVR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param __PLLSAIN__ Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLSAIR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIR_DIV_2 + * @arg @ref LL_RCC_PLLSAIR_DIV_3 + * @arg @ref LL_RCC_PLLSAIR_DIV_4 + * @arg @ref LL_RCC_PLLSAIR_DIV_5 + * @arg @ref LL_RCC_PLLSAIR_DIV_6 + * @arg @ref LL_RCC_PLLSAIR_DIV_7 + * @param __PLLSAIDIVR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 + * @retval PLLSAI clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLSAI_LTDC_FREQ(__INPUTFREQ__, __PLLM__, __PLLSAIN__, __PLLSAIR__, __PLLSAIDIVR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLSAIN__) / \ + (((__PLLSAIR__) >> RCC_PLLSAICFGR_PLLSAIR_Pos) * (aRCC_PLLSAIDIVRPrescTable[(__PLLSAIDIVR__) >> RCC_DCKCFGR_PLLSAIDIVR_Pos]))) +#endif /* LTDC */ +#endif /* RCC_PLLSAI_SUPPORT */ + +#if defined(RCC_PLLI2S_SUPPORT) +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR) +/** + * @brief Helper macro to calculate the PLLI2S frequency used for SAI domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_SAI_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ (), @ref LL_RCC_PLLI2S_GetDIVQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLI2SQ_R__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) + * + * (*) value not defined in all devices. + * @param __PLLI2SDIVQ_R__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval PLLI2S clock frequency (in Hz) + */ +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) +#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos) * (((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos) + 1U))) +#else +#define __LL_RCC_CALC_PLLI2S_SAI_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ_R__, __PLLI2SDIVQ_R__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + (((__PLLI2SQ_R__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos) * ((__PLLI2SDIVQ_R__) >> RCC_DCKCFGR_PLLI2SDIVR_Pos))) + +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_DCKCFGR_PLLI2SDIVQ || RCC_DCKCFGR_PLLI2SDIVR */ + +#if defined(SPDIFRX) +/** + * @brief Helper macro to calculate the PLLI2S frequency used on SPDIFRX domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetP ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50 and 432 + * @param __PLLI2SP__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SP_DIV_2 + * @arg @ref LL_RCC_PLLI2SP_DIV_4 + * @arg @ref LL_RCC_PLLI2SP_DIV_6 + * @arg @ref LL_RCC_PLLI2SP_DIV_8 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2S_SPDIFRX_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SP__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + ((((__PLLI2SP__) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) * 2U)) + +#endif /* SPDIFRX */ + +/** + * @brief Helper macro to calculate the PLLI2S frequency used for I2S domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_I2S_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetR ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param __PLLI2SR__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SR_DIV_2 + * @arg @ref LL_RCC_PLLI2SR_DIV_3 + * @arg @ref LL_RCC_PLLI2SR_DIV_4 + * @arg @ref LL_RCC_PLLI2SR_DIV_5 + * @arg @ref LL_RCC_PLLI2SR_DIV_6 + * @arg @ref LL_RCC_PLLI2SR_DIV_7 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2S_I2S_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SR__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + ((__PLLI2SR__) >> RCC_PLLI2SCFGR_PLLI2SR_Pos)) + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Helper macro to calculate the PLLI2S frequency used for 48Mhz domain + * @note ex: @ref __LL_RCC_CALC_PLLI2S_48M_FREQ (HSE_VALUE,@ref LL_RCC_PLLI2S_GetDivider (), + * @ref LL_RCC_PLLI2S_GetN (), @ref LL_RCC_PLLI2S_GetQ ()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLM__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param __PLLI2SN__ Between 50 and 432 + * @param __PLLI2SQ__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 + * @retval PLLI2S clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLI2S_48M_FREQ(__INPUTFREQ__, __PLLM__, __PLLI2SN__, __PLLI2SQ__) (((__INPUTFREQ__) / (__PLLM__)) * (__PLLI2SN__) / \ + ((__PLLI2SQ__) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos)) + +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ +#endif /* RCC_PLLI2S_SUPPORT */ + +/** + * @brief Helper macro to calculate the HCLK frequency + * @param __SYSCLKFREQ__ SYSCLK frequency (based on HSE/HSI/PLLCLK) + * @param __AHBPRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + * @retval HCLK clock frequency (in Hz) + */ +#define __LL_RCC_CALC_HCLK_FREQ(__SYSCLKFREQ__, __AHBPRESCALER__) ((__SYSCLKFREQ__) >> AHBPrescTable[((__AHBPRESCALER__) & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]) + +/** + * @brief Helper macro to calculate the PCLK1 frequency (ABP1) + * @param __HCLKFREQ__ HCLK frequency + * @param __APB1PRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + * @retval PCLK1 clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PCLK1_FREQ(__HCLKFREQ__, __APB1PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB1PRESCALER__) >> RCC_CFGR_PPRE1_Pos]) + +/** + * @brief Helper macro to calculate the PCLK2 frequency (ABP2) + * @param __HCLKFREQ__ HCLK frequency + * @param __APB2PRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + * @retval PCLK2 clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PCLK2_FREQ(__HCLKFREQ__, __APB2PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB2PRESCALER__) >> RCC_CFGR_PPRE2_Pos]) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_LL_EF_HSE HSE + * @{ + */ + +/** + * @brief Enable the Clock Security System. + * @rmtoll CR CSSON LL_RCC_HSE_EnableCSS + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_EnableCSS(void) +{ + SET_BIT(RCC->CR, RCC_CR_CSSON); +} + +/** + * @brief Enable HSE external oscillator (HSE Bypass) + * @rmtoll CR HSEBYP LL_RCC_HSE_EnableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_EnableBypass(void) +{ + SET_BIT(RCC->CR, RCC_CR_HSEBYP); +} + +/** + * @brief Disable HSE external oscillator (HSE Bypass) + * @rmtoll CR HSEBYP LL_RCC_HSE_DisableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_DisableBypass(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); +} + +/** + * @brief Enable HSE crystal oscillator (HSE ON) + * @rmtoll CR HSEON LL_RCC_HSE_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_HSEON); +} + +/** + * @brief Disable HSE crystal oscillator (HSE ON) + * @rmtoll CR HSEON LL_RCC_HSE_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON); +} + +/** + * @brief Check if HSE oscillator Ready + * @rmtoll CR HSERDY LL_RCC_HSE_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_HSE_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_HSERDY) == (RCC_CR_HSERDY)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_HSI HSI + * @{ + */ + +/** + * @brief Enable HSI oscillator + * @rmtoll CR HSION LL_RCC_HSI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_HSION); +} + +/** + * @brief Disable HSI oscillator + * @rmtoll CR HSION LL_RCC_HSI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_HSION); +} + +/** + * @brief Check if HSI clock is ready + * @rmtoll CR HSIRDY LL_RCC_HSI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_HSIRDY) == (RCC_CR_HSIRDY)); +} + +/** + * @brief Get HSI Calibration value + * @note When HSITRIM is written, HSICAL is updated with the sum of + * HSITRIM and the factory trim value + * @rmtoll CR HSICAL LL_RCC_HSI_GetCalibration + * @retval Between Min_Data = 0x00 and Max_Data = 0xFF + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibration(void) +{ + return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSICAL) >> RCC_CR_HSICAL_Pos); +} + +/** + * @brief Set HSI Calibration trimming + * @note user-programmable trimming value that is added to the HSICAL + * @note Default value is 16, which, when added to the HSICAL value, + * should trim the HSI to 16 MHz +/- 1 % + * @rmtoll CR HSITRIM LL_RCC_HSI_SetCalibTrimming + * @param Value Between Min_Data = 0 and Max_Data = 31 + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_SetCalibTrimming(uint32_t Value) +{ + MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, Value << RCC_CR_HSITRIM_Pos); +} + +/** + * @brief Get HSI Calibration trimming + * @rmtoll CR HSITRIM LL_RCC_HSI_GetCalibTrimming + * @retval Between Min_Data = 0 and Max_Data = 31 + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibTrimming(void) +{ + return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_LSE LSE + * @{ + */ + +/** + * @brief Enable Low Speed External (LSE) crystal. + * @rmtoll BDCR LSEON LL_RCC_LSE_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_Enable(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); +} + +/** + * @brief Disable Low Speed External (LSE) crystal. + * @rmtoll BDCR LSEON LL_RCC_LSE_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_Disable(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); +} + +/** + * @brief Enable external clock source (LSE bypass). + * @rmtoll BDCR LSEBYP LL_RCC_LSE_EnableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_EnableBypass(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); +} + +/** + * @brief Disable external clock source (LSE bypass). + * @rmtoll BDCR LSEBYP LL_RCC_LSE_DisableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_DisableBypass(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); +} + +/** + * @brief Check if LSE oscillator Ready + * @rmtoll BDCR LSERDY LL_RCC_LSE_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_LSE_IsReady(void) +{ + return (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == (RCC_BDCR_LSERDY)); +} + +#if defined(RCC_BDCR_LSEMOD) +/** + * @brief Enable LSE high drive mode. + * @note LSE high drive mode can be enabled only when the LSE clock is disabled + * @rmtoll BDCR LSEMOD LL_RCC_LSE_EnableHighDriveMode + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_EnableHighDriveMode(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); +} + +/** + * @brief Disable LSE high drive mode. + * @note LSE high drive mode can be disabled only when the LSE clock is disabled + * @rmtoll BDCR LSEMOD LL_RCC_LSE_DisableHighDriveMode + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_DisableHighDriveMode(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEMOD); +} +#endif /* RCC_BDCR_LSEMOD */ + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_LSI LSI + * @{ + */ + +/** + * @brief Enable LSI Oscillator + * @rmtoll CSR LSION LL_RCC_LSI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSI_Enable(void) +{ + SET_BIT(RCC->CSR, RCC_CSR_LSION); +} + +/** + * @brief Disable LSI Oscillator + * @rmtoll CSR LSION LL_RCC_LSI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSI_Disable(void) +{ + CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); +} + +/** + * @brief Check if LSI is Ready + * @rmtoll CSR LSIRDY LL_RCC_LSI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_LSI_IsReady(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == (RCC_CSR_LSIRDY)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_System System + * @{ + */ + +/** + * @brief Configure the system clock source + * @rmtoll CFGR SW LL_RCC_SetSysClkSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_SYS_CLKSOURCE_HSI + * @arg @ref LL_RCC_SYS_CLKSOURCE_HSE + * @arg @ref LL_RCC_SYS_CLKSOURCE_PLL + * @arg @ref LL_RCC_SYS_CLKSOURCE_PLLR (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, Source); +} + +/** + * @brief Get the system clock source + * @rmtoll CFGR SWS LL_RCC_GetSysClkSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSI + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSE + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLL + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLLR (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_SWS)); +} + +/** + * @brief Set AHB prescaler + * @rmtoll CFGR HPRE LL_RCC_SetAHBPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, Prescaler); +} + +/** + * @brief Set APB1 prescaler + * @rmtoll CFGR PPRE1 LL_RCC_SetAPB1Prescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, Prescaler); +} + +/** + * @brief Set APB2 prescaler + * @rmtoll CFGR PPRE2 LL_RCC_SetAPB2Prescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, Prescaler); +} + +/** + * @brief Get AHB prescaler + * @rmtoll CFGR HPRE LL_RCC_GetAHBPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAHBPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)); +} + +/** + * @brief Get APB1 prescaler + * @rmtoll CFGR PPRE1 LL_RCC_GetAPB1Prescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAPB1Prescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1)); +} + +/** + * @brief Get APB2 prescaler + * @rmtoll CFGR PPRE2 LL_RCC_GetAPB2Prescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAPB2Prescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_MCO MCO + * @{ + */ + +#if defined(RCC_CFGR_MCO1EN) +/** + * @brief Enable MCO1 output + * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO1_Enable(void) +{ + SET_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); +} + +/** + * @brief Disable MCO1 output + * @rmtoll CFGR RCC_CFGR_MCO1EN LL_RCC_MCO1_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO1_Disable(void) +{ + CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO1EN); +} +#endif /* RCC_CFGR_MCO1EN */ + +#if defined(RCC_CFGR_MCO2EN) +/** + * @brief Enable MCO2 output + * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO2_Enable(void) +{ + SET_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); +} + +/** + * @brief Disable MCO2 output + * @rmtoll CFGR RCC_CFGR_MCO2EN LL_RCC_MCO2_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_MCO2_Disable(void) +{ + CLEAR_BIT(RCC->CFGR, RCC_CFGR_MCO2EN); +} +#endif /* RCC_CFGR_MCO2EN */ + +/** + * @brief Configure MCOx + * @rmtoll CFGR MCO1 LL_RCC_ConfigMCO\n + * CFGR MCO1PRE LL_RCC_ConfigMCO\n + * CFGR MCO2 LL_RCC_ConfigMCO\n + * CFGR MCO2PRE LL_RCC_ConfigMCO + * @param MCOxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_MCO1SOURCE_HSI + * @arg @ref LL_RCC_MCO1SOURCE_LSE + * @arg @ref LL_RCC_MCO1SOURCE_HSE + * @arg @ref LL_RCC_MCO1SOURCE_PLLCLK + * @arg @ref LL_RCC_MCO2SOURCE_SYSCLK + * @arg @ref LL_RCC_MCO2SOURCE_PLLI2S + * @arg @ref LL_RCC_MCO2SOURCE_HSE + * @arg @ref LL_RCC_MCO2SOURCE_PLLCLK + * @param MCOxPrescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_MCO1_DIV_1 + * @arg @ref LL_RCC_MCO1_DIV_2 + * @arg @ref LL_RCC_MCO1_DIV_3 + * @arg @ref LL_RCC_MCO1_DIV_4 + * @arg @ref LL_RCC_MCO1_DIV_5 + * @arg @ref LL_RCC_MCO2_DIV_1 + * @arg @ref LL_RCC_MCO2_DIV_2 + * @arg @ref LL_RCC_MCO2_DIV_3 + * @arg @ref LL_RCC_MCO2_DIV_4 + * @arg @ref LL_RCC_MCO2_DIV_5 + * @retval None + */ +__STATIC_INLINE void LL_RCC_ConfigMCO(uint32_t MCOxSource, uint32_t MCOxPrescaler) +{ + MODIFY_REG(RCC->CFGR, (MCOxSource & 0xFFFF0000U) | (MCOxPrescaler & 0xFFFF0000U), (MCOxSource << 16U) | (MCOxPrescaler << 16U)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_Peripheral_Clock_Source Peripheral Clock Source + * @{ + */ +#if defined(FMPI2C1) +/** + * @brief Configure FMPI2C clock source + * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_SetFMPI2CClockSource + * @param FMPI2CxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetFMPI2CClockSource(uint32_t FMPI2CxSource) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_FMPI2C1SEL, FMPI2CxSource); +} +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +/** + * @brief Configure LPTIMx clock source + * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_SetLPTIMClockSource + * @param LPTIMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetLPTIMClockSource(uint32_t LPTIMxSource) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL, LPTIMxSource); +} +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** + * @brief Configure SAIx clock source + * @rmtoll DCKCFGR SAI1SRC LL_RCC_SetSAIClockSource\n + * DCKCFGR SAI2SRC LL_RCC_SetSAIClockSource\n + * DCKCFGR SAI1ASRC LL_RCC_SetSAIClockSource\n + * DCKCFGR SAI1BSRC LL_RCC_SetSAIClockSource + * @param SAIxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSAIClockSource(uint32_t SAIxSource) +{ + MODIFY_REG(RCC->DCKCFGR, (SAIxSource & 0xFFFF0000U), (SAIxSource << 16U)); +} +#endif /* SAI1 */ + +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) +/** + * @brief Configure SDIO clock source + * @rmtoll DCKCFGR SDIOSEL LL_RCC_SetSDIOClockSource\n + * DCKCFGR2 SDIOSEL LL_RCC_SetSDIOClockSource + * @param SDIOxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK + * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSDIOClockSource(uint32_t SDIOxSource) +{ +#if defined(RCC_DCKCFGR_SDIOSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_SDIOSEL, SDIOxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SDIOSEL, SDIOxSource); +#endif /* RCC_DCKCFGR_SDIOSEL */ +} +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** + * @brief Configure 48Mhz domain clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetCK48MClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_SetCK48MClockSource + * @param CK48MxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetCK48MClockSource(uint32_t CK48MxSource) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, CK48MxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, CK48MxSource); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} + +#if defined(RNG) +/** + * @brief Configure RNG clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetRNGClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_SetRNGClockSource + * @param RNGxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetRNGClockSource(uint32_t RNGxSource) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, RNGxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, RNGxSource); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** + * @brief Configure USB clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_SetUSBClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_SetUSBClockSource + * @param USBxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetUSBClockSource(uint32_t USBxSource) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CK48MSEL, USBxSource); +#else + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CK48MSEL, USBxSource); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* USB_OTG_FS || USB_OTG_HS */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(CEC) +/** + * @brief Configure CEC clock source + * @rmtoll DCKCFGR2 CECSEL LL_RCC_SetCECClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 + * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetCECClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_CECSEL, Source); +} +#endif /* CEC */ + +/** + * @brief Configure I2S clock source + * @rmtoll CFGR I2SSRC LL_RCC_SetI2SClockSource\n + * DCKCFGR I2SSRC LL_RCC_SetI2SClockSource\n + * DCKCFGR I2S1SRC LL_RCC_SetI2SClockSource\n + * DCKCFGR I2S2SRC LL_RCC_SetI2SClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetI2SClockSource(uint32_t Source) +{ +#if defined(RCC_CFGR_I2SSRC) + MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, Source); +#else + MODIFY_REG(RCC->DCKCFGR, (Source & 0xFFFF0000U), (Source << 16U)); +#endif /* RCC_CFGR_I2SSRC */ +} + +#if defined(DSI) +/** + * @brief Configure DSI clock source + * @rmtoll DCKCFGR DSISEL LL_RCC_SetDSIClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY + * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetDSIClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_DSISEL, Source); +} +#endif /* DSI */ + +#if defined(DFSDM1_Channel0) +/** + * @brief Configure DFSDM Audio clock source + * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_SetDFSDMAudioClockSource\n + * DCKCFGR CKDFSDM2ASEL LL_RCC_SetDFSDMAudioClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetDFSDMAudioClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR, (Source & 0x0000FFFFU), (Source >> 16U)); +} + +/** + * @brief Configure DFSDM Kernel clock source + * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_SetDFSDMClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetDFSDMClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_CKDFSDM1SEL, Source); +} +#endif /* DFSDM1_Channel0 */ + +#if defined(SPDIFRX) +/** + * @brief Configure SPDIFRX clock source + * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_SetSPDIFRXClockSource + * @param SPDIFRXxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSPDIFRXClockSource(uint32_t SPDIFRXxSource) +{ + MODIFY_REG(RCC->DCKCFGR2, RCC_DCKCFGR2_SPDIFRXSEL, SPDIFRXxSource); +} +#endif /* SPDIFRX */ + +#if defined(FMPI2C1) +/** + * @brief Get FMPI2C clock source + * @rmtoll DCKCFGR2 FMPI2C1SEL LL_RCC_GetFMPI2CClockSource + * @param FMPI2Cx This parameter can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_FMPI2C1_CLKSOURCE_HSI + */ +__STATIC_INLINE uint32_t LL_RCC_GetFMPI2CClockSource(uint32_t FMPI2Cx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, FMPI2Cx)); +} +#endif /* FMPI2C1 */ + +#if defined(LPTIM1) +/** + * @brief Get LPTIMx clock source + * @rmtoll DCKCFGR2 LPTIM1SEL LL_RCC_GetLPTIMClockSource + * @param LPTIMx This parameter can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_HSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSI + * @arg @ref LL_RCC_LPTIM1_CLKSOURCE_LSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetLPTIMClockSource(uint32_t LPTIMx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RCC_DCKCFGR2_LPTIM1SEL)); +} +#endif /* LPTIM1 */ + +#if defined(SAI1) +/** + * @brief Get SAIx clock source + * @rmtoll DCKCFGR SAI1SEL LL_RCC_GetSAIClockSource\n + * DCKCFGR SAI2SEL LL_RCC_GetSAIClockSource\n + * DCKCFGR SAI1ASRC LL_RCC_GetSAIClockSource\n + * DCKCFGR SAI1BSRC LL_RCC_GetSAIClockSource + * @param SAIx This parameter can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI2_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_A_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_SAI1_B_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetSAIClockSource(uint32_t SAIx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, SAIx) >> 16U | SAIx); +} +#endif /* SAI1 */ + +#if defined(RCC_DCKCFGR_SDIOSEL) || defined(RCC_DCKCFGR2_SDIOSEL) +/** + * @brief Get SDIOx clock source + * @rmtoll DCKCFGR SDIOSEL LL_RCC_GetSDIOClockSource\n + * DCKCFGR2 SDIOSEL LL_RCC_GetSDIOClockSource + * @param SDIOx This parameter can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SDIO_CLKSOURCE_PLL48CLK + * @arg @ref LL_RCC_SDIO_CLKSOURCE_SYSCLK + */ +__STATIC_INLINE uint32_t LL_RCC_GetSDIOClockSource(uint32_t SDIOx) +{ +#if defined(RCC_DCKCFGR_SDIOSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, SDIOx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SDIOx)); +#endif /* RCC_DCKCFGR_SDIOSEL */ +} +#endif /* RCC_DCKCFGR_SDIOSEL || RCC_DCKCFGR2_SDIOSEL */ + +#if defined(RCC_DCKCFGR_CK48MSEL) || defined(RCC_DCKCFGR2_CK48MSEL) +/** + * @brief Get 48Mhz domain clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetCK48MClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_GetCK48MClockSource + * @param CK48Mx This parameter can be one of the following values: + * @arg @ref LL_RCC_CK48M_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLL + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_CK48M_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetCK48MClockSource(uint32_t CK48Mx) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, CK48Mx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CK48Mx)); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} + +#if defined(RNG) +/** + * @brief Get RNGx clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetRNGClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_GetRNGClockSource + * @param RNGx This parameter can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLL + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_RNG_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetRNGClockSource(uint32_t RNGx) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RNGx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, RNGx)); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* RNG */ + +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +/** + * @brief Get USBx clock source + * @rmtoll DCKCFGR CK48MSEL LL_RCC_GetUSBClockSource\n + * DCKCFGR2 CK48MSEL LL_RCC_GetUSBClockSource + * @param USBx This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLSAI (*) + * @arg @ref LL_RCC_USB_CLKSOURCE_PLLI2S (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetUSBClockSource(uint32_t USBx) +{ +#if defined(RCC_DCKCFGR_CK48MSEL) + return (uint32_t)(READ_BIT(RCC->DCKCFGR, USBx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, USBx)); +#endif /* RCC_DCKCFGR_CK48MSEL */ +} +#endif /* USB_OTG_FS || USB_OTG_HS */ +#endif /* RCC_DCKCFGR_CK48MSEL || RCC_DCKCFGR2_CK48MSEL */ + +#if defined(CEC) +/** + * @brief Get CEC Clock Source + * @rmtoll DCKCFGR2 CECSEL LL_RCC_GetCECClockSource + * @param CECx This parameter can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV488 + * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetCECClockSource(uint32_t CECx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, CECx)); +} +#endif /* CEC */ + +/** + * @brief Get I2S Clock Source + * @rmtoll CFGR I2SSRC LL_RCC_GetI2SClockSource\n + * DCKCFGR I2SSRC LL_RCC_GetI2SClockSource\n + * DCKCFGR I2S1SRC LL_RCC_GetI2SClockSource\n + * DCKCFGR I2S2SRC LL_RCC_GetI2SClockSource + * @param I2Sx This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE + * @arg @ref LL_RCC_I2S2_CLKSOURCE (*) + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PIN + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S1_CLKSOURCE_PLLSRC (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLI2S (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PIN (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_I2S2_CLKSOURCE_PLLSRC (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetI2SClockSource(uint32_t I2Sx) +{ +#if defined(RCC_CFGR_I2SSRC) + return (uint32_t)(READ_BIT(RCC->CFGR, I2Sx)); +#else + return (uint32_t)(READ_BIT(RCC->DCKCFGR, I2Sx) >> 16U | I2Sx); +#endif /* RCC_CFGR_I2SSRC */ +} + +#if defined(DFSDM1_Channel0) +/** + * @brief Get DFSDM Audio Clock Source + * @rmtoll DCKCFGR CKDFSDM1ASEL LL_RCC_GetDFSDMAudioClockSource\n + * DCKCFGR CKDFSDM2ASEL LL_RCC_GetDFSDMAudioClockSource + * @param DFSDMx This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE (*) + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S1 + * @arg @ref LL_RCC_DFSDM1_AUDIO_CLKSOURCE_I2S2 + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S1 (*) + * @arg @ref LL_RCC_DFSDM2_AUDIO_CLKSOURCE_I2S2 (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetDFSDMAudioClockSource(uint32_t DFSDMx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx) << 16U | DFSDMx); +} + +/** + * @brief Get DFSDM Audio Clock Source + * @rmtoll DCKCFGR CKDFSDM1SEL LL_RCC_GetDFSDMClockSource + * @param DFSDMx This parameter can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE (*) + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_DFSDM1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_DFSDM2_CLKSOURCE_SYSCLK (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetDFSDMClockSource(uint32_t DFSDMx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, DFSDMx)); +} +#endif /* DFSDM1_Channel0 */ + +#if defined(SPDIFRX) +/** + * @brief Get SPDIFRX clock source + * @rmtoll DCKCFGR2 SPDIFRXSEL LL_RCC_GetSPDIFRXClockSource + * @param SPDIFRXx This parameter can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLL + * @arg @ref LL_RCC_SPDIFRX1_CLKSOURCE_PLLI2S + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetSPDIFRXClockSource(uint32_t SPDIFRXx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR2, SPDIFRXx)); +} +#endif /* SPDIFRX */ + +#if defined(DSI) +/** + * @brief Get DSI Clock Source + * @rmtoll DCKCFGR DSISEL LL_RCC_GetDSIClockSource + * @param DSIx This parameter can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_DSI_CLKSOURCE_PHY + * @arg @ref LL_RCC_DSI_CLKSOURCE_PLL + */ +__STATIC_INLINE uint32_t LL_RCC_GetDSIClockSource(uint32_t DSIx) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, DSIx)); +} +#endif /* DSI */ + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_RTC RTC + * @{ + */ + +/** + * @brief Set RTC Clock Source + * @note Once the RTC clock source has been selected, it cannot be changed anymore unless + * the Backup domain is reset, or unless a failure is detected on LSE (LSECSSD is + * set). The BDRST bit can be used to reset them. + * @rmtoll BDCR RTCSEL LL_RCC_SetRTCClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI + * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetRTCClockSource(uint32_t Source) +{ + MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, Source); +} + +/** + * @brief Get RTC Clock Source + * @rmtoll BDCR RTCSEL LL_RCC_GetRTCClockSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI + * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetRTCClockSource(void) +{ + return (uint32_t)(READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)); +} + +/** + * @brief Enable RTC + * @rmtoll BDCR RTCEN LL_RCC_EnableRTC + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableRTC(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_RTCEN); +} + +/** + * @brief Disable RTC + * @rmtoll BDCR RTCEN LL_RCC_DisableRTC + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableRTC(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_RTCEN); +} + +/** + * @brief Check if RTC has been enabled or not + * @rmtoll BDCR RTCEN LL_RCC_IsEnabledRTC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledRTC(void) +{ + return (READ_BIT(RCC->BDCR, RCC_BDCR_RTCEN) == (RCC_BDCR_RTCEN)); +} + +/** + * @brief Force the Backup domain reset + * @rmtoll BDCR BDRST LL_RCC_ForceBackupDomainReset + * @retval None + */ +__STATIC_INLINE void LL_RCC_ForceBackupDomainReset(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_BDRST); +} + +/** + * @brief Release the Backup domain reset + * @rmtoll BDCR BDRST LL_RCC_ReleaseBackupDomainReset + * @retval None + */ +__STATIC_INLINE void LL_RCC_ReleaseBackupDomainReset(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_BDRST); +} + +/** + * @brief Set HSE Prescalers for RTC Clock + * @rmtoll CFGR RTCPRE LL_RCC_SetRTC_HSEPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_RTC_NOCLOCK + * @arg @ref LL_RCC_RTC_HSE_DIV_2 + * @arg @ref LL_RCC_RTC_HSE_DIV_3 + * @arg @ref LL_RCC_RTC_HSE_DIV_4 + * @arg @ref LL_RCC_RTC_HSE_DIV_5 + * @arg @ref LL_RCC_RTC_HSE_DIV_6 + * @arg @ref LL_RCC_RTC_HSE_DIV_7 + * @arg @ref LL_RCC_RTC_HSE_DIV_8 + * @arg @ref LL_RCC_RTC_HSE_DIV_9 + * @arg @ref LL_RCC_RTC_HSE_DIV_10 + * @arg @ref LL_RCC_RTC_HSE_DIV_11 + * @arg @ref LL_RCC_RTC_HSE_DIV_12 + * @arg @ref LL_RCC_RTC_HSE_DIV_13 + * @arg @ref LL_RCC_RTC_HSE_DIV_14 + * @arg @ref LL_RCC_RTC_HSE_DIV_15 + * @arg @ref LL_RCC_RTC_HSE_DIV_16 + * @arg @ref LL_RCC_RTC_HSE_DIV_17 + * @arg @ref LL_RCC_RTC_HSE_DIV_18 + * @arg @ref LL_RCC_RTC_HSE_DIV_19 + * @arg @ref LL_RCC_RTC_HSE_DIV_20 + * @arg @ref LL_RCC_RTC_HSE_DIV_21 + * @arg @ref LL_RCC_RTC_HSE_DIV_22 + * @arg @ref LL_RCC_RTC_HSE_DIV_23 + * @arg @ref LL_RCC_RTC_HSE_DIV_24 + * @arg @ref LL_RCC_RTC_HSE_DIV_25 + * @arg @ref LL_RCC_RTC_HSE_DIV_26 + * @arg @ref LL_RCC_RTC_HSE_DIV_27 + * @arg @ref LL_RCC_RTC_HSE_DIV_28 + * @arg @ref LL_RCC_RTC_HSE_DIV_29 + * @arg @ref LL_RCC_RTC_HSE_DIV_30 + * @arg @ref LL_RCC_RTC_HSE_DIV_31 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetRTC_HSEPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_RTCPRE, Prescaler); +} + +/** + * @brief Get HSE Prescalers for RTC Clock + * @rmtoll CFGR RTCPRE LL_RCC_GetRTC_HSEPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_RTC_NOCLOCK + * @arg @ref LL_RCC_RTC_HSE_DIV_2 + * @arg @ref LL_RCC_RTC_HSE_DIV_3 + * @arg @ref LL_RCC_RTC_HSE_DIV_4 + * @arg @ref LL_RCC_RTC_HSE_DIV_5 + * @arg @ref LL_RCC_RTC_HSE_DIV_6 + * @arg @ref LL_RCC_RTC_HSE_DIV_7 + * @arg @ref LL_RCC_RTC_HSE_DIV_8 + * @arg @ref LL_RCC_RTC_HSE_DIV_9 + * @arg @ref LL_RCC_RTC_HSE_DIV_10 + * @arg @ref LL_RCC_RTC_HSE_DIV_11 + * @arg @ref LL_RCC_RTC_HSE_DIV_12 + * @arg @ref LL_RCC_RTC_HSE_DIV_13 + * @arg @ref LL_RCC_RTC_HSE_DIV_14 + * @arg @ref LL_RCC_RTC_HSE_DIV_15 + * @arg @ref LL_RCC_RTC_HSE_DIV_16 + * @arg @ref LL_RCC_RTC_HSE_DIV_17 + * @arg @ref LL_RCC_RTC_HSE_DIV_18 + * @arg @ref LL_RCC_RTC_HSE_DIV_19 + * @arg @ref LL_RCC_RTC_HSE_DIV_20 + * @arg @ref LL_RCC_RTC_HSE_DIV_21 + * @arg @ref LL_RCC_RTC_HSE_DIV_22 + * @arg @ref LL_RCC_RTC_HSE_DIV_23 + * @arg @ref LL_RCC_RTC_HSE_DIV_24 + * @arg @ref LL_RCC_RTC_HSE_DIV_25 + * @arg @ref LL_RCC_RTC_HSE_DIV_26 + * @arg @ref LL_RCC_RTC_HSE_DIV_27 + * @arg @ref LL_RCC_RTC_HSE_DIV_28 + * @arg @ref LL_RCC_RTC_HSE_DIV_29 + * @arg @ref LL_RCC_RTC_HSE_DIV_30 + * @arg @ref LL_RCC_RTC_HSE_DIV_31 + */ +__STATIC_INLINE uint32_t LL_RCC_GetRTC_HSEPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_RTCPRE)); +} + +/** + * @} + */ + +#if defined(RCC_DCKCFGR_TIMPRE) +/** @defgroup RCC_LL_EF_TIM_CLOCK_PRESCALER TIM + * @{ + */ + +/** + * @brief Set Timers Clock Prescalers + * @rmtoll DCKCFGR TIMPRE LL_RCC_SetTIMPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_TIM_PRESCALER_TWICE + * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetTIMPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE, Prescaler); +} + +/** + * @brief Get Timers Clock Prescalers + * @rmtoll DCKCFGR TIMPRE LL_RCC_GetTIMPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_TIM_PRESCALER_TWICE + * @arg @ref LL_RCC_TIM_PRESCALER_FOUR_TIMES + */ +__STATIC_INLINE uint32_t LL_RCC_GetTIMPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_TIMPRE)); +} + +/** + * @} + */ +#endif /* RCC_DCKCFGR_TIMPRE */ + +/** @defgroup RCC_LL_EF_PLL PLL + * @{ + */ + +/** + * @brief Enable PLL + * @rmtoll CR PLLON LL_RCC_PLL_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLON); +} + +/** + * @brief Disable PLL + * @note Cannot be disabled if the PLL clock is used as the system clock + * @rmtoll CR PLLON LL_RCC_PLL_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLON); +} + +/** + * @brief Check if PLL Ready + * @rmtoll CR PLLRDY LL_RCC_PLL_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == (RCC_CR_PLLRDY)); +} + +/** + * @brief Configure PLL used for SYSCLK Domain + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLP can be written only when PLL is disabled + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SYS\n + * PLLCFGR PLLP LL_RCC_PLL_ConfigDomain_SYS + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLP_R This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLP_DIV_2 + * @arg @ref LL_RCC_PLLP_DIV_4 + * @arg @ref LL_RCC_PLLP_DIV_6 + * @arg @ref LL_RCC_PLLP_DIV_8 + * @arg @ref LL_RCC_PLLR_DIV_2 (*) + * @arg @ref LL_RCC_PLLR_DIV_3 (*) + * @arg @ref LL_RCC_PLLR_DIV_4 (*) + * @arg @ref LL_RCC_PLLR_DIV_5 (*) + * @arg @ref LL_RCC_PLLR_DIV_6 (*) + * @arg @ref LL_RCC_PLLR_DIV_7 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP_R) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos); + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLP, PLLP_R); +#if defined(RCC_PLLR_SYSCLK_SUPPORT) + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLR, PLLP_R); +#endif /* RCC_PLLR_SYSCLK_SUPPORT */ +} + +/** + * @brief Configure PLL used for 48Mhz domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ can be written only when PLL is disabled + * @note This can be selected for USB, RNG, SDIO + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_48M\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_48M\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_48M\n + * PLLCFGR PLLQ LL_RCC_PLL_ConfigDomain_48M + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLQ_DIV_2 + * @arg @ref LL_RCC_PLLQ_DIV_3 + * @arg @ref LL_RCC_PLLQ_DIV_4 + * @arg @ref LL_RCC_PLLQ_DIV_5 + * @arg @ref LL_RCC_PLLQ_DIV_6 + * @arg @ref LL_RCC_PLLQ_DIV_7 + * @arg @ref LL_RCC_PLLQ_DIV_8 + * @arg @ref LL_RCC_PLLQ_DIV_9 + * @arg @ref LL_RCC_PLLQ_DIV_10 + * @arg @ref LL_RCC_PLLQ_DIV_11 + * @arg @ref LL_RCC_PLLQ_DIV_12 + * @arg @ref LL_RCC_PLLQ_DIV_13 + * @arg @ref LL_RCC_PLLQ_DIV_14 + * @arg @ref LL_RCC_PLLQ_DIV_15 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLQ, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLQ); +} + +#if defined(DSI) +/** + * @brief Configure PLL used for DSI clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for DSI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_DSI\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_DSI\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_DSI\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_DSI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_DSI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +} +#endif /* DSI */ + +#if defined(RCC_PLLR_I2S_CLKSOURCE_SUPPORT) +/** + * @brief Configure PLL used for I2S clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for I2S + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_I2S\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_I2S\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_I2S\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_I2S + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +} +#endif /* RCC_PLLR_I2S_CLKSOURCE_SUPPORT */ + +#if defined(SPDIFRX) +/** + * @brief Configure PLL used for SPDIFRX clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for SPDIFRX + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SPDIFRX + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +} +#endif /* SPDIFRX */ + +#if defined(RCC_PLLCFGR_PLLR) +#if defined(SAI1) +/** + * @brief Configure PLL used for SAI clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI are disabled + * @note PLLN/PLLR can be written only when PLL is disabled + * @note This can be selected for SAI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_ConfigDomain_SAI\n + * PLLCFGR PLLM LL_RCC_PLL_ConfigDomain_SAI\n + * PLLCFGR PLLN LL_RCC_PLL_ConfigDomain_SAI\n + * PLLCFGR PLLR LL_RCC_PLL_ConfigDomain_SAI\n + * DCKCFGR PLLDIVR LL_RCC_PLL_ConfigDomain_SAI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + * @param PLLDIVR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +#if defined(RCC_DCKCFGR_PLLDIVR) +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, uint32_t PLLDIVR) +#else +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +#endif /* RCC_DCKCFGR_PLLDIVR */ +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM | RCC_PLLCFGR_PLLN | RCC_PLLCFGR_PLLR, + Source | PLLM | PLLN << RCC_PLLCFGR_PLLN_Pos | PLLR); +#if defined(RCC_DCKCFGR_PLLDIVR) + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR, PLLDIVR); +#endif /* RCC_DCKCFGR_PLLDIVR */ +} +#endif /* SAI1 */ +#endif /* RCC_PLLCFGR_PLLR */ + +/** + * @brief Configure PLL clock source + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_SetMainSource + * @param PLLSource This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SetMainSource(uint32_t PLLSource) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, PLLSource); +} + +/** + * @brief Get the oscillator used as PLL clock source. + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLL_GetMainSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetMainSource(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); +} + +/** + * @brief Get Main PLL multiplication factor for VCO + * @rmtoll PLLCFGR PLLN LL_RCC_PLL_GetN + * @retval Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetN(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); +} + +/** + * @brief Get Main PLL division factor for PLLP + * @rmtoll PLLCFGR PLLP LL_RCC_PLL_GetP + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLP_DIV_2 + * @arg @ref LL_RCC_PLLP_DIV_4 + * @arg @ref LL_RCC_PLLP_DIV_6 + * @arg @ref LL_RCC_PLLP_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetP(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLP)); +} + +/** + * @brief Get Main PLL division factor for PLLQ + * @note used for PLL48MCLK selected for USB, RNG, SDIO (48 MHz clock) + * @rmtoll PLLCFGR PLLQ LL_RCC_PLL_GetQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLQ_DIV_2 + * @arg @ref LL_RCC_PLLQ_DIV_3 + * @arg @ref LL_RCC_PLLQ_DIV_4 + * @arg @ref LL_RCC_PLLQ_DIV_5 + * @arg @ref LL_RCC_PLLQ_DIV_6 + * @arg @ref LL_RCC_PLLQ_DIV_7 + * @arg @ref LL_RCC_PLLQ_DIV_8 + * @arg @ref LL_RCC_PLLQ_DIV_9 + * @arg @ref LL_RCC_PLLQ_DIV_10 + * @arg @ref LL_RCC_PLLQ_DIV_11 + * @arg @ref LL_RCC_PLLQ_DIV_12 + * @arg @ref LL_RCC_PLLQ_DIV_13 + * @arg @ref LL_RCC_PLLQ_DIV_14 + * @arg @ref LL_RCC_PLLQ_DIV_15 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetQ(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLQ)); +} + +#if defined(RCC_PLLCFGR_PLLR) +/** + * @brief Get Main PLL division factor for PLLR + * @note used for PLLCLK (system clock) + * @rmtoll PLLCFGR PLLR LL_RCC_PLL_GetR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLR_DIV_2 + * @arg @ref LL_RCC_PLLR_DIV_3 + * @arg @ref LL_RCC_PLLR_DIV_4 + * @arg @ref LL_RCC_PLLR_DIV_5 + * @arg @ref LL_RCC_PLLR_DIV_6 + * @arg @ref LL_RCC_PLLR_DIV_7 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetR(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLR)); +} +#endif /* RCC_PLLCFGR_PLLR */ + +#if defined(RCC_DCKCFGR_PLLDIVR) +/** + * @brief Get Main PLL division factor for PLLDIVR + * @note used for PLLSAICLK (SAI1 and SAI2 clock) + * @rmtoll DCKCFGR PLLDIVR LL_RCC_PLL_GetDIVR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLDIVR_DIV_1 + * @arg @ref LL_RCC_PLLDIVR_DIV_2 + * @arg @ref LL_RCC_PLLDIVR_DIV_3 + * @arg @ref LL_RCC_PLLDIVR_DIV_4 + * @arg @ref LL_RCC_PLLDIVR_DIV_5 + * @arg @ref LL_RCC_PLLDIVR_DIV_6 + * @arg @ref LL_RCC_PLLDIVR_DIV_7 + * @arg @ref LL_RCC_PLLDIVR_DIV_8 + * @arg @ref LL_RCC_PLLDIVR_DIV_9 + * @arg @ref LL_RCC_PLLDIVR_DIV_10 + * @arg @ref LL_RCC_PLLDIVR_DIV_11 + * @arg @ref LL_RCC_PLLDIVR_DIV_12 + * @arg @ref LL_RCC_PLLDIVR_DIV_13 + * @arg @ref LL_RCC_PLLDIVR_DIV_14 + * @arg @ref LL_RCC_PLLDIVR_DIV_15 + * @arg @ref LL_RCC_PLLDIVR_DIV_16 + * @arg @ref LL_RCC_PLLDIVR_DIV_17 + * @arg @ref LL_RCC_PLLDIVR_DIV_18 + * @arg @ref LL_RCC_PLLDIVR_DIV_19 + * @arg @ref LL_RCC_PLLDIVR_DIV_20 + * @arg @ref LL_RCC_PLLDIVR_DIV_21 + * @arg @ref LL_RCC_PLLDIVR_DIV_22 + * @arg @ref LL_RCC_PLLDIVR_DIV_23 + * @arg @ref LL_RCC_PLLDIVR_DIV_24 + * @arg @ref LL_RCC_PLLDIVR_DIV_25 + * @arg @ref LL_RCC_PLLDIVR_DIV_26 + * @arg @ref LL_RCC_PLLDIVR_DIV_27 + * @arg @ref LL_RCC_PLLDIVR_DIV_28 + * @arg @ref LL_RCC_PLLDIVR_DIV_29 + * @arg @ref LL_RCC_PLLDIVR_DIV_30 + * @arg @ref LL_RCC_PLLDIVR_DIV_31 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetDIVR(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLDIVR)); +} +#endif /* RCC_DCKCFGR_PLLDIVR */ + +/** + * @brief Get Division factor for the main PLL and other PLL + * @rmtoll PLLCFGR PLLM LL_RCC_PLL_GetDivider + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLM_DIV_2 + * @arg @ref LL_RCC_PLLM_DIV_3 + * @arg @ref LL_RCC_PLLM_DIV_4 + * @arg @ref LL_RCC_PLLM_DIV_5 + * @arg @ref LL_RCC_PLLM_DIV_6 + * @arg @ref LL_RCC_PLLM_DIV_7 + * @arg @ref LL_RCC_PLLM_DIV_8 + * @arg @ref LL_RCC_PLLM_DIV_9 + * @arg @ref LL_RCC_PLLM_DIV_10 + * @arg @ref LL_RCC_PLLM_DIV_11 + * @arg @ref LL_RCC_PLLM_DIV_12 + * @arg @ref LL_RCC_PLLM_DIV_13 + * @arg @ref LL_RCC_PLLM_DIV_14 + * @arg @ref LL_RCC_PLLM_DIV_15 + * @arg @ref LL_RCC_PLLM_DIV_16 + * @arg @ref LL_RCC_PLLM_DIV_17 + * @arg @ref LL_RCC_PLLM_DIV_18 + * @arg @ref LL_RCC_PLLM_DIV_19 + * @arg @ref LL_RCC_PLLM_DIV_20 + * @arg @ref LL_RCC_PLLM_DIV_21 + * @arg @ref LL_RCC_PLLM_DIV_22 + * @arg @ref LL_RCC_PLLM_DIV_23 + * @arg @ref LL_RCC_PLLM_DIV_24 + * @arg @ref LL_RCC_PLLM_DIV_25 + * @arg @ref LL_RCC_PLLM_DIV_26 + * @arg @ref LL_RCC_PLLM_DIV_27 + * @arg @ref LL_RCC_PLLM_DIV_28 + * @arg @ref LL_RCC_PLLM_DIV_29 + * @arg @ref LL_RCC_PLLM_DIV_30 + * @arg @ref LL_RCC_PLLM_DIV_31 + * @arg @ref LL_RCC_PLLM_DIV_32 + * @arg @ref LL_RCC_PLLM_DIV_33 + * @arg @ref LL_RCC_PLLM_DIV_34 + * @arg @ref LL_RCC_PLLM_DIV_35 + * @arg @ref LL_RCC_PLLM_DIV_36 + * @arg @ref LL_RCC_PLLM_DIV_37 + * @arg @ref LL_RCC_PLLM_DIV_38 + * @arg @ref LL_RCC_PLLM_DIV_39 + * @arg @ref LL_RCC_PLLM_DIV_40 + * @arg @ref LL_RCC_PLLM_DIV_41 + * @arg @ref LL_RCC_PLLM_DIV_42 + * @arg @ref LL_RCC_PLLM_DIV_43 + * @arg @ref LL_RCC_PLLM_DIV_44 + * @arg @ref LL_RCC_PLLM_DIV_45 + * @arg @ref LL_RCC_PLLM_DIV_46 + * @arg @ref LL_RCC_PLLM_DIV_47 + * @arg @ref LL_RCC_PLLM_DIV_48 + * @arg @ref LL_RCC_PLLM_DIV_49 + * @arg @ref LL_RCC_PLLM_DIV_50 + * @arg @ref LL_RCC_PLLM_DIV_51 + * @arg @ref LL_RCC_PLLM_DIV_52 + * @arg @ref LL_RCC_PLLM_DIV_53 + * @arg @ref LL_RCC_PLLM_DIV_54 + * @arg @ref LL_RCC_PLLM_DIV_55 + * @arg @ref LL_RCC_PLLM_DIV_56 + * @arg @ref LL_RCC_PLLM_DIV_57 + * @arg @ref LL_RCC_PLLM_DIV_58 + * @arg @ref LL_RCC_PLLM_DIV_59 + * @arg @ref LL_RCC_PLLM_DIV_60 + * @arg @ref LL_RCC_PLLM_DIV_61 + * @arg @ref LL_RCC_PLLM_DIV_62 + * @arg @ref LL_RCC_PLLM_DIV_63 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetDivider(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); +} + +/** + * @brief Configure Spread Spectrum used for PLL + * @note These bits must be written before enabling PLL + * @rmtoll SSCGR MODPER LL_RCC_PLL_ConfigSpreadSpectrum\n + * SSCGR INCSTEP LL_RCC_PLL_ConfigSpreadSpectrum\n + * SSCGR SPREADSEL LL_RCC_PLL_ConfigSpreadSpectrum + * @param Mod Between Min_Data=0 and Max_Data=8191 + * @param Inc Between Min_Data=0 and Max_Data=32767 + * @param Sel This parameter can be one of the following values: + * @arg @ref LL_RCC_SPREAD_SELECT_CENTER + * @arg @ref LL_RCC_SPREAD_SELECT_DOWN + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigSpreadSpectrum(uint32_t Mod, uint32_t Inc, uint32_t Sel) +{ + MODIFY_REG(RCC->SSCGR, RCC_SSCGR_MODPER | RCC_SSCGR_INCSTEP | RCC_SSCGR_SPREADSEL, Mod | (Inc << RCC_SSCGR_INCSTEP_Pos) | Sel); +} + +/** + * @brief Get Spread Spectrum Modulation Period for PLL + * @rmtoll SSCGR MODPER LL_RCC_PLL_GetPeriodModulation + * @retval Between Min_Data=0 and Max_Data=8191 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetPeriodModulation(void) +{ + return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_MODPER)); +} + +/** + * @brief Get Spread Spectrum Incrementation Step for PLL + * @note Must be written before enabling PLL + * @rmtoll SSCGR INCSTEP LL_RCC_PLL_GetStepIncrementation + * @retval Between Min_Data=0 and Max_Data=32767 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetStepIncrementation(void) +{ + return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_INCSTEP) >> RCC_SSCGR_INCSTEP_Pos); +} + +/** + * @brief Get Spread Spectrum Selection for PLL + * @note Must be written before enabling PLL + * @rmtoll SSCGR SPREADSEL LL_RCC_PLL_GetSpreadSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SPREAD_SELECT_CENTER + * @arg @ref LL_RCC_SPREAD_SELECT_DOWN + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetSpreadSelection(void) +{ + return (uint32_t)(READ_BIT(RCC->SSCGR, RCC_SSCGR_SPREADSEL)); +} + +/** + * @brief Enable Spread Spectrum for PLL. + * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Enable(void) +{ + SET_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); +} + +/** + * @brief Disable Spread Spectrum for PLL. + * @rmtoll SSCGR SSCGEN LL_RCC_PLL_SpreadSpectrum_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SpreadSpectrum_Disable(void) +{ + CLEAR_BIT(RCC->SSCGR, RCC_SSCGR_SSCGEN); +} + +/** + * @} + */ + +#if defined(RCC_PLLI2S_SUPPORT) +/** @defgroup RCC_LL_EF_PLLI2S PLLI2S + * @{ + */ + +/** + * @brief Enable PLLI2S + * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLI2SON); +} + +/** + * @brief Disable PLLI2S + * @rmtoll CR PLLI2SON LL_RCC_PLLI2S_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLI2SON); +} + +/** + * @brief Check if PLLI2S Ready + * @rmtoll CR PLLI2SRDY LL_RCC_PLLI2S_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLI2SRDY) == (RCC_CR_PLLI2SRDY)); +} + +#if (defined(RCC_DCKCFGR_PLLI2SDIVQ) || defined(RCC_DCKCFGR_PLLI2SDIVR)) +/** + * @brief Configure PLLI2S used for SAI domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ/PLLR can be written only when PLLI2S is disabled + * @note This can be selected for SAI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_SAI\n + * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_SAI\n + * DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_ConfigDomain_SAI\n + * DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_ConfigDomain_SAI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLQ_R This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SR_DIV_7 (*) + * + * (*) value not defined in all devices. + * @param PLLDIVQ_R This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 (*) + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 (*) + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ_R, uint32_t PLLDIVQ_R) +{ + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); + MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos); +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ, PLLQ_R); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ, PLLDIVQ_R); +#else + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR, PLLQ_R); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR, PLLDIVQ_R); +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ +} +#endif /* RCC_DCKCFGR_PLLI2SDIVQ && RCC_DCKCFGR_PLLI2SDIVR */ + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) && !defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Configure PLLI2S used for 48Mhz domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ can be written only when PLLI2S is disabled + * @note This can be selected for RNG, USB, SDIO + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_48M\n + * PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_ConfigDomain_48M + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ) +{ + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); + MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SQ, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLQ); +} +#endif /* RCC_PLLI2SCFGR_PLLI2SQ && !RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(SPDIFRX) +/** + * @brief Configure PLLI2S used for SPDIFRX domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLP can be written only when PLLI2S is disabled + * @note This can be selected for SPDIFRX + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_SPDIFRX\n + * PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_ConfigDomain_SPDIFRX + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLP This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SP_DIV_2 + * @arg @ref LL_RCC_PLLI2SP_DIV_4 + * @arg @ref LL_RCC_PLLI2SP_DIV_6 + * @arg @ref LL_RCC_PLLI2SP_DIV_8 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_SPDIFRX(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SP, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLP); +} +#endif /* SPDIFRX */ + +/** + * @brief Configure PLLI2S used for I2S1 domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLR can be written only when PLLI2S is disabled + * @note This can be selected for I2S + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLCFGR PLLM LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_ConfigDomain_I2S\n + * PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_ConfigDomain_I2S + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + * @param PLLN Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLI2SR_DIV_2 + * @arg @ref LL_RCC_PLLI2SR_DIV_3 + * @arg @ref LL_RCC_PLLI2SR_DIV_4 + * @arg @ref LL_RCC_PLLI2SR_DIV_5 + * @arg @ref LL_RCC_PLLI2SR_DIV_6 + * @arg @ref LL_RCC_PLLI2SR_DIV_7 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLI2S_ConfigDomain_I2S(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR) +{ + __IO uint32_t *pReg = (__IO uint32_t *)((uint32_t)((uint32_t)(&RCC->PLLCFGR) + (Source & 0x80U))); + MODIFY_REG(*pReg, RCC_PLLCFGR_PLLSRC, (Source & (~0x80U))); +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ + MODIFY_REG(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN | RCC_PLLI2SCFGR_PLLI2SR, PLLN << RCC_PLLI2SCFGR_PLLI2SN_Pos | PLLR); +} + +/** + * @brief Get I2SPLL multiplication factor for VCO + * @rmtoll PLLI2SCFGR PLLI2SN LL_RCC_PLLI2S_GetN + * @retval Between 50/192(*) and 432 + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetN(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); +} + +#if defined(RCC_PLLI2SCFGR_PLLI2SQ) +/** + * @brief Get I2SPLL division factor for PLLI2SQ + * @rmtoll PLLI2SCFGR PLLI2SQ LL_RCC_PLLI2S_GetQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SQ_DIV_15 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetQ(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SQ)); +} +#endif /* RCC_PLLI2SCFGR_PLLI2SQ */ + +/** + * @brief Get I2SPLL division factor for PLLI2SR + * @note used for PLLI2SCLK (I2S clock) + * @rmtoll PLLI2SCFGR PLLI2SR LL_RCC_PLLI2S_GetR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SR_DIV_2 + * @arg @ref LL_RCC_PLLI2SR_DIV_3 + * @arg @ref LL_RCC_PLLI2SR_DIV_4 + * @arg @ref LL_RCC_PLLI2SR_DIV_5 + * @arg @ref LL_RCC_PLLI2SR_DIV_6 + * @arg @ref LL_RCC_PLLI2SR_DIV_7 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetR(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SR)); +} + +#if defined(RCC_PLLI2SCFGR_PLLI2SP) +/** + * @brief Get I2SPLL division factor for PLLI2SP + * @note used for PLLSPDIFRXCLK (SPDIFRX clock) + * @rmtoll PLLI2SCFGR PLLI2SP LL_RCC_PLLI2S_GetP + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SP_DIV_2 + * @arg @ref LL_RCC_PLLI2SP_DIV_4 + * @arg @ref LL_RCC_PLLI2SP_DIV_6 + * @arg @ref LL_RCC_PLLI2SP_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetP(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SP)); +} +#endif /* RCC_PLLI2SCFGR_PLLI2SP */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVQ) +/** + * @brief Get I2SPLL division factor for PLLI2SDIVQ + * @note used PLLSAICLK selected (SAI clock) + * @rmtoll DCKCFGR PLLI2SDIVQ LL_RCC_PLLI2S_GetDIVQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLI2SDIVQ_DIV_32 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVQ(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVQ)); +} +#endif /* RCC_DCKCFGR_PLLI2SDIVQ */ + +#if defined(RCC_DCKCFGR_PLLI2SDIVR) +/** + * @brief Get I2SPLL division factor for PLLI2SDIVR + * @note used PLLSAICLK selected (SAI clock) + * @rmtoll DCKCFGR PLLI2SDIVR LL_RCC_PLLI2S_GetDIVR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_1 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_2 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_3 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_4 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_5 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_6 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_7 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_8 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_9 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_10 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_11 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_12 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_13 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_14 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_15 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_16 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_17 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_18 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_19 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_20 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_21 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_22 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_23 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_24 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_25 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_26 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_27 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_28 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_29 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_30 + * @arg @ref LL_RCC_PLLI2SDIVR_DIV_31 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDIVR(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLI2SDIVR)); +} +#endif /* RCC_DCKCFGR_PLLI2SDIVR */ + +/** + * @brief Get division factor for PLLI2S input clock + * @rmtoll PLLCFGR PLLM LL_RCC_PLLI2S_GetDivider\n + * PLLI2SCFGR PLLI2SM LL_RCC_PLLI2S_GetDivider + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLI2SM_DIV_2 + * @arg @ref LL_RCC_PLLI2SM_DIV_3 + * @arg @ref LL_RCC_PLLI2SM_DIV_4 + * @arg @ref LL_RCC_PLLI2SM_DIV_5 + * @arg @ref LL_RCC_PLLI2SM_DIV_6 + * @arg @ref LL_RCC_PLLI2SM_DIV_7 + * @arg @ref LL_RCC_PLLI2SM_DIV_8 + * @arg @ref LL_RCC_PLLI2SM_DIV_9 + * @arg @ref LL_RCC_PLLI2SM_DIV_10 + * @arg @ref LL_RCC_PLLI2SM_DIV_11 + * @arg @ref LL_RCC_PLLI2SM_DIV_12 + * @arg @ref LL_RCC_PLLI2SM_DIV_13 + * @arg @ref LL_RCC_PLLI2SM_DIV_14 + * @arg @ref LL_RCC_PLLI2SM_DIV_15 + * @arg @ref LL_RCC_PLLI2SM_DIV_16 + * @arg @ref LL_RCC_PLLI2SM_DIV_17 + * @arg @ref LL_RCC_PLLI2SM_DIV_18 + * @arg @ref LL_RCC_PLLI2SM_DIV_19 + * @arg @ref LL_RCC_PLLI2SM_DIV_20 + * @arg @ref LL_RCC_PLLI2SM_DIV_21 + * @arg @ref LL_RCC_PLLI2SM_DIV_22 + * @arg @ref LL_RCC_PLLI2SM_DIV_23 + * @arg @ref LL_RCC_PLLI2SM_DIV_24 + * @arg @ref LL_RCC_PLLI2SM_DIV_25 + * @arg @ref LL_RCC_PLLI2SM_DIV_26 + * @arg @ref LL_RCC_PLLI2SM_DIV_27 + * @arg @ref LL_RCC_PLLI2SM_DIV_28 + * @arg @ref LL_RCC_PLLI2SM_DIV_29 + * @arg @ref LL_RCC_PLLI2SM_DIV_30 + * @arg @ref LL_RCC_PLLI2SM_DIV_31 + * @arg @ref LL_RCC_PLLI2SM_DIV_32 + * @arg @ref LL_RCC_PLLI2SM_DIV_33 + * @arg @ref LL_RCC_PLLI2SM_DIV_34 + * @arg @ref LL_RCC_PLLI2SM_DIV_35 + * @arg @ref LL_RCC_PLLI2SM_DIV_36 + * @arg @ref LL_RCC_PLLI2SM_DIV_37 + * @arg @ref LL_RCC_PLLI2SM_DIV_38 + * @arg @ref LL_RCC_PLLI2SM_DIV_39 + * @arg @ref LL_RCC_PLLI2SM_DIV_40 + * @arg @ref LL_RCC_PLLI2SM_DIV_41 + * @arg @ref LL_RCC_PLLI2SM_DIV_42 + * @arg @ref LL_RCC_PLLI2SM_DIV_43 + * @arg @ref LL_RCC_PLLI2SM_DIV_44 + * @arg @ref LL_RCC_PLLI2SM_DIV_45 + * @arg @ref LL_RCC_PLLI2SM_DIV_46 + * @arg @ref LL_RCC_PLLI2SM_DIV_47 + * @arg @ref LL_RCC_PLLI2SM_DIV_48 + * @arg @ref LL_RCC_PLLI2SM_DIV_49 + * @arg @ref LL_RCC_PLLI2SM_DIV_50 + * @arg @ref LL_RCC_PLLI2SM_DIV_51 + * @arg @ref LL_RCC_PLLI2SM_DIV_52 + * @arg @ref LL_RCC_PLLI2SM_DIV_53 + * @arg @ref LL_RCC_PLLI2SM_DIV_54 + * @arg @ref LL_RCC_PLLI2SM_DIV_55 + * @arg @ref LL_RCC_PLLI2SM_DIV_56 + * @arg @ref LL_RCC_PLLI2SM_DIV_57 + * @arg @ref LL_RCC_PLLI2SM_DIV_58 + * @arg @ref LL_RCC_PLLI2SM_DIV_59 + * @arg @ref LL_RCC_PLLI2SM_DIV_60 + * @arg @ref LL_RCC_PLLI2SM_DIV_61 + * @arg @ref LL_RCC_PLLI2SM_DIV_62 + * @arg @ref LL_RCC_PLLI2SM_DIV_63 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetDivider(void) +{ +#if defined(RCC_PLLI2SCFGR_PLLI2SM) + return (uint32_t)(READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SM)); +#else + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); +#endif /* RCC_PLLI2SCFGR_PLLI2SM */ +} + +/** + * @brief Get the oscillator used as PLL clock source. + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLI2S_GetMainSource\n + * PLLI2SCFGR PLLI2SSRC LL_RCC_PLLI2S_GetMainSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLI2SSOURCE_PIN (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLLI2S_GetMainSource(void) +{ +#if defined(RCC_PLLI2SCFGR_PLLI2SSRC) + uint32_t pllsrc = READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC); + uint32_t plli2sssrc0 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC); + uint32_t plli2sssrc1 = READ_BIT(RCC->PLLI2SCFGR, RCC_PLLI2SCFGR_PLLI2SSRC) >> 15U; + return (uint32_t)(pllsrc | plli2sssrc0 | plli2sssrc1); +#else + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC)); +#endif /* RCC_PLLI2SCFGR_PLLI2SSRC */ +} + +/** + * @} + */ +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** @defgroup RCC_LL_EF_PLLSAI PLLSAI + * @{ + */ + +/** + * @brief Enable PLLSAI + * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLSAION); +} + +/** + * @brief Disable PLLSAI + * @rmtoll CR PLLSAION LL_RCC_PLLSAI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLSAION); +} + +/** + * @brief Check if PLLSAI Ready + * @rmtoll CR PLLSAIRDY LL_RCC_PLLSAI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLSAIRDY) == (RCC_CR_PLLSAIRDY)); +} + +/** + * @brief Configure PLLSAI used for SAI domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLQ can be written only when PLLSAI is disabled + * @note This can be selected for SAI + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_SAI\n + * PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_ConfigDomain_SAI\n + * DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_ConfigDomain_SAI + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param PLLN Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIQ_DIV_15 + * @param PLLDIVQ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_SAI(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLQ, uint32_t PLLDIVQ) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); +#if defined(RCC_PLLSAICFGR_PLLSAIM) + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIQ, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLQ); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ, PLLDIVQ); +} + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Configure PLLSAI used for 48Mhz domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLP can be written only when PLLSAI is disabled + * @note This can be selected for USB, RNG, SDIO + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_48M\n + * PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_ConfigDomain_48M + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param PLLN Between 50 and 432 + * @param PLLP This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIP_DIV_2 + * @arg @ref LL_RCC_PLLSAIP_DIV_4 + * @arg @ref LL_RCC_PLLSAIP_DIV_6 + * @arg @ref LL_RCC_PLLSAIP_DIV_8 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_48M(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC, Source); +#if defined(RCC_PLLSAICFGR_PLLSAIM) + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM, PLLM); +#else + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLM, PLLM); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIP, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLP); +} +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +#if defined(LTDC) +/** + * @brief Configure PLLSAI used for LTDC domain clock + * @note PLL Source and PLLM Divider can be written only when PLL, + * PLLI2S and PLLSAI(*) are disabled + * @note PLLN/PLLR can be written only when PLLSAI is disabled + * @note This can be selected for LTDC + * @rmtoll PLLCFGR PLLSRC LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * PLLCFGR PLLM LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_ConfigDomain_LTDC\n + * DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_ConfigDomain_LTDC + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @param PLLM This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + * @param PLLN Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + * @param PLLR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIR_DIV_2 + * @arg @ref LL_RCC_PLLSAIR_DIV_3 + * @arg @ref LL_RCC_PLLSAIR_DIV_4 + * @arg @ref LL_RCC_PLLSAIR_DIV_5 + * @arg @ref LL_RCC_PLLSAIR_DIV_6 + * @arg @ref LL_RCC_PLLSAIR_DIV_7 + * @param PLLDIVR This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLLSAI_ConfigDomain_LTDC(uint32_t Source, uint32_t PLLM, uint32_t PLLN, uint32_t PLLR, uint32_t PLLDIVR) +{ + MODIFY_REG(RCC->PLLCFGR, RCC_PLLCFGR_PLLSRC | RCC_PLLCFGR_PLLM, Source | PLLM); + MODIFY_REG(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN | RCC_PLLSAICFGR_PLLSAIR, PLLN << RCC_PLLSAICFGR_PLLSAIN_Pos | PLLR); + MODIFY_REG(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR, PLLDIVR); +} +#endif /* LTDC */ + +/** + * @brief Get division factor for PLLSAI input clock + * @rmtoll PLLCFGR PLLM LL_RCC_PLLSAI_GetDivider\n + * PLLSAICFGR PLLSAIM LL_RCC_PLLSAI_GetDivider + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIM_DIV_2 + * @arg @ref LL_RCC_PLLSAIM_DIV_3 + * @arg @ref LL_RCC_PLLSAIM_DIV_4 + * @arg @ref LL_RCC_PLLSAIM_DIV_5 + * @arg @ref LL_RCC_PLLSAIM_DIV_6 + * @arg @ref LL_RCC_PLLSAIM_DIV_7 + * @arg @ref LL_RCC_PLLSAIM_DIV_8 + * @arg @ref LL_RCC_PLLSAIM_DIV_9 + * @arg @ref LL_RCC_PLLSAIM_DIV_10 + * @arg @ref LL_RCC_PLLSAIM_DIV_11 + * @arg @ref LL_RCC_PLLSAIM_DIV_12 + * @arg @ref LL_RCC_PLLSAIM_DIV_13 + * @arg @ref LL_RCC_PLLSAIM_DIV_14 + * @arg @ref LL_RCC_PLLSAIM_DIV_15 + * @arg @ref LL_RCC_PLLSAIM_DIV_16 + * @arg @ref LL_RCC_PLLSAIM_DIV_17 + * @arg @ref LL_RCC_PLLSAIM_DIV_18 + * @arg @ref LL_RCC_PLLSAIM_DIV_19 + * @arg @ref LL_RCC_PLLSAIM_DIV_20 + * @arg @ref LL_RCC_PLLSAIM_DIV_21 + * @arg @ref LL_RCC_PLLSAIM_DIV_22 + * @arg @ref LL_RCC_PLLSAIM_DIV_23 + * @arg @ref LL_RCC_PLLSAIM_DIV_24 + * @arg @ref LL_RCC_PLLSAIM_DIV_25 + * @arg @ref LL_RCC_PLLSAIM_DIV_26 + * @arg @ref LL_RCC_PLLSAIM_DIV_27 + * @arg @ref LL_RCC_PLLSAIM_DIV_28 + * @arg @ref LL_RCC_PLLSAIM_DIV_29 + * @arg @ref LL_RCC_PLLSAIM_DIV_30 + * @arg @ref LL_RCC_PLLSAIM_DIV_31 + * @arg @ref LL_RCC_PLLSAIM_DIV_32 + * @arg @ref LL_RCC_PLLSAIM_DIV_33 + * @arg @ref LL_RCC_PLLSAIM_DIV_34 + * @arg @ref LL_RCC_PLLSAIM_DIV_35 + * @arg @ref LL_RCC_PLLSAIM_DIV_36 + * @arg @ref LL_RCC_PLLSAIM_DIV_37 + * @arg @ref LL_RCC_PLLSAIM_DIV_38 + * @arg @ref LL_RCC_PLLSAIM_DIV_39 + * @arg @ref LL_RCC_PLLSAIM_DIV_40 + * @arg @ref LL_RCC_PLLSAIM_DIV_41 + * @arg @ref LL_RCC_PLLSAIM_DIV_42 + * @arg @ref LL_RCC_PLLSAIM_DIV_43 + * @arg @ref LL_RCC_PLLSAIM_DIV_44 + * @arg @ref LL_RCC_PLLSAIM_DIV_45 + * @arg @ref LL_RCC_PLLSAIM_DIV_46 + * @arg @ref LL_RCC_PLLSAIM_DIV_47 + * @arg @ref LL_RCC_PLLSAIM_DIV_48 + * @arg @ref LL_RCC_PLLSAIM_DIV_49 + * @arg @ref LL_RCC_PLLSAIM_DIV_50 + * @arg @ref LL_RCC_PLLSAIM_DIV_51 + * @arg @ref LL_RCC_PLLSAIM_DIV_52 + * @arg @ref LL_RCC_PLLSAIM_DIV_53 + * @arg @ref LL_RCC_PLLSAIM_DIV_54 + * @arg @ref LL_RCC_PLLSAIM_DIV_55 + * @arg @ref LL_RCC_PLLSAIM_DIV_56 + * @arg @ref LL_RCC_PLLSAIM_DIV_57 + * @arg @ref LL_RCC_PLLSAIM_DIV_58 + * @arg @ref LL_RCC_PLLSAIM_DIV_59 + * @arg @ref LL_RCC_PLLSAIM_DIV_60 + * @arg @ref LL_RCC_PLLSAIM_DIV_61 + * @arg @ref LL_RCC_PLLSAIM_DIV_62 + * @arg @ref LL_RCC_PLLSAIM_DIV_63 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDivider(void) +{ +#if defined(RCC_PLLSAICFGR_PLLSAIM) + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIM)); +#else + return (uint32_t)(READ_BIT(RCC->PLLCFGR, RCC_PLLCFGR_PLLM)); +#endif /* RCC_PLLSAICFGR_PLLSAIM */ +} + +/** + * @brief Get SAIPLL multiplication factor for VCO + * @rmtoll PLLSAICFGR PLLSAIN LL_RCC_PLLSAI_GetN + * @retval Between 49/50(*) and 432 + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetN(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); +} + +/** + * @brief Get SAIPLL division factor for PLLSAIQ + * @rmtoll PLLSAICFGR PLLSAIQ LL_RCC_PLLSAI_GetQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIQ_DIV_15 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetQ(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIQ)); +} + +#if defined(RCC_PLLSAICFGR_PLLSAIR) +/** + * @brief Get SAIPLL division factor for PLLSAIR + * @note used for PLLSAICLK (SAI clock) + * @rmtoll PLLSAICFGR PLLSAIR LL_RCC_PLLSAI_GetR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIR_DIV_2 + * @arg @ref LL_RCC_PLLSAIR_DIV_3 + * @arg @ref LL_RCC_PLLSAIR_DIV_4 + * @arg @ref LL_RCC_PLLSAIR_DIV_5 + * @arg @ref LL_RCC_PLLSAIR_DIV_6 + * @arg @ref LL_RCC_PLLSAIR_DIV_7 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetR(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIR)); +} +#endif /* RCC_PLLSAICFGR_PLLSAIR */ + +#if defined(RCC_PLLSAICFGR_PLLSAIP) +/** + * @brief Get SAIPLL division factor for PLLSAIP + * @note used for PLL48MCLK (48M domain clock) + * @rmtoll PLLSAICFGR PLLSAIP LL_RCC_PLLSAI_GetP + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIP_DIV_2 + * @arg @ref LL_RCC_PLLSAIP_DIV_4 + * @arg @ref LL_RCC_PLLSAIP_DIV_6 + * @arg @ref LL_RCC_PLLSAIP_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetP(void) +{ + return (uint32_t)(READ_BIT(RCC->PLLSAICFGR, RCC_PLLSAICFGR_PLLSAIP)); +} +#endif /* RCC_PLLSAICFGR_PLLSAIP */ + +/** + * @brief Get SAIPLL division factor for PLLSAIDIVQ + * @note used PLLSAICLK selected (SAI clock) + * @rmtoll DCKCFGR PLLSAIDIVQ LL_RCC_PLLSAI_GetDIVQ + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_1 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_3 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_5 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_6 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_7 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_9 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_10 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_11 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_12 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_13 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_14 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_15 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_16 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_17 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_18 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_19 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_20 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_21 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_22 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_23 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_24 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_25 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_26 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_27 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_28 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_29 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_30 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_31 + * @arg @ref LL_RCC_PLLSAIDIVQ_DIV_32 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVQ(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVQ)); +} + +#if defined(RCC_DCKCFGR_PLLSAIDIVR) +/** + * @brief Get SAIPLL division factor for PLLSAIDIVR + * @note used for LTDC domain clock + * @rmtoll DCKCFGR PLLSAIDIVR LL_RCC_PLLSAI_GetDIVR + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_2 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_4 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_8 + * @arg @ref LL_RCC_PLLSAIDIVR_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_PLLSAI_GetDIVR(void) +{ + return (uint32_t)(READ_BIT(RCC->DCKCFGR, RCC_DCKCFGR_PLLSAIDIVR)); +} +#endif /* RCC_DCKCFGR_PLLSAIDIVR */ + +/** + * @} + */ +#endif /* RCC_PLLSAI_SUPPORT */ + +/** @defgroup RCC_LL_EF_FLAG_Management FLAG Management + * @{ + */ + +/** + * @brief Clear LSI ready interrupt flag + * @rmtoll CIR LSIRDYC LL_RCC_ClearFlag_LSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_LSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC); +} + +/** + * @brief Clear LSE ready interrupt flag + * @rmtoll CIR LSERDYC LL_RCC_ClearFlag_LSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_LSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSERDYC); +} + +/** + * @brief Clear HSI ready interrupt flag + * @rmtoll CIR HSIRDYC LL_RCC_ClearFlag_HSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_HSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSIRDYC); +} + +/** + * @brief Clear HSE ready interrupt flag + * @rmtoll CIR HSERDYC LL_RCC_ClearFlag_HSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_HSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSERDYC); +} + +/** + * @brief Clear PLL ready interrupt flag + * @rmtoll CIR PLLRDYC LL_RCC_ClearFlag_PLLRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLRDYC); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Clear PLLI2S ready interrupt flag + * @rmtoll CIR PLLI2SRDYC LL_RCC_ClearFlag_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLI2SRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYC); +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Clear PLLSAI ready interrupt flag + * @rmtoll CIR PLLSAIRDYC LL_RCC_ClearFlag_PLLSAIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_PLLSAIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYC); +} + +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Clear Clock security system interrupt flag + * @rmtoll CIR CSSC LL_RCC_ClearFlag_HSECSS + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearFlag_HSECSS(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_CSSC); +} + +/** + * @brief Check if LSI ready interrupt occurred or not + * @rmtoll CIR LSIRDYF LL_RCC_IsActiveFlag_LSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYF) == (RCC_CIR_LSIRDYF)); +} + +/** + * @brief Check if LSE ready interrupt occurred or not + * @rmtoll CIR LSERDYF LL_RCC_IsActiveFlag_LSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYF) == (RCC_CIR_LSERDYF)); +} + +/** + * @brief Check if HSI ready interrupt occurred or not + * @rmtoll CIR HSIRDYF LL_RCC_IsActiveFlag_HSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYF) == (RCC_CIR_HSIRDYF)); +} + +/** + * @brief Check if HSE ready interrupt occurred or not + * @rmtoll CIR HSERDYF LL_RCC_IsActiveFlag_HSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYF) == (RCC_CIR_HSERDYF)); +} + +/** + * @brief Check if PLL ready interrupt occurred or not + * @rmtoll CIR PLLRDYF LL_RCC_IsActiveFlag_PLLRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYF) == (RCC_CIR_PLLRDYF)); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Check if PLLI2S ready interrupt occurred or not + * @rmtoll CIR PLLI2SRDYF LL_RCC_IsActiveFlag_PLLI2SRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLI2SRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYF) == (RCC_CIR_PLLI2SRDYF)); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Check if PLLSAI ready interrupt occurred or not + * @rmtoll CIR PLLSAIRDYF LL_RCC_IsActiveFlag_PLLSAIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PLLSAIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYF) == (RCC_CIR_PLLSAIRDYF)); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Check if Clock security system interrupt occurred or not + * @rmtoll CIR CSSF LL_RCC_IsActiveFlag_HSECSS + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_HSECSS(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_CSSF) == (RCC_CIR_CSSF)); +} + +/** + * @brief Check if RCC flag Independent Watchdog reset is set or not. + * @rmtoll CSR IWDGRSTF LL_RCC_IsActiveFlag_IWDGRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_IWDGRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_IWDGRSTF) == (RCC_CSR_IWDGRSTF)); +} + +/** + * @brief Check if RCC flag Low Power reset is set or not. + * @rmtoll CSR LPWRRSTF LL_RCC_IsActiveFlag_LPWRRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_LPWRRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_LPWRRSTF) == (RCC_CSR_LPWRRSTF)); +} + +/** + * @brief Check if RCC flag Pin reset is set or not. + * @rmtoll CSR PINRSTF LL_RCC_IsActiveFlag_PINRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PINRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_PINRSTF) == (RCC_CSR_PINRSTF)); +} + +/** + * @brief Check if RCC flag POR/PDR reset is set or not. + * @rmtoll CSR PORRSTF LL_RCC_IsActiveFlag_PORRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_PORRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_PORRSTF) == (RCC_CSR_PORRSTF)); +} + +/** + * @brief Check if RCC flag Software reset is set or not. + * @rmtoll CSR SFTRSTF LL_RCC_IsActiveFlag_SFTRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_SFTRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_SFTRSTF) == (RCC_CSR_SFTRSTF)); +} + +/** + * @brief Check if RCC flag Window Watchdog reset is set or not. + * @rmtoll CSR WWDGRSTF LL_RCC_IsActiveFlag_WWDGRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_WWDGRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_WWDGRSTF) == (RCC_CSR_WWDGRSTF)); +} + +#if defined(RCC_CSR_BORRSTF) +/** + * @brief Check if RCC flag BOR reset is set or not. + * @rmtoll CSR BORRSTF LL_RCC_IsActiveFlag_BORRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_BORRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_BORRSTF) == (RCC_CSR_BORRSTF)); +} +#endif /* RCC_CSR_BORRSTF */ + +/** + * @brief Set RMVF bit to clear the reset flags. + * @rmtoll CSR RMVF LL_RCC_ClearResetFlags + * @retval None + */ +__STATIC_INLINE void LL_RCC_ClearResetFlags(void) +{ + SET_BIT(RCC->CSR, RCC_CSR_RMVF); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_IT_Management IT Management + * @{ + */ + +/** + * @brief Enable LSI ready interrupt + * @rmtoll CIR LSIRDYIE LL_RCC_EnableIT_LSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_LSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); +} + +/** + * @brief Enable LSE ready interrupt + * @rmtoll CIR LSERDYIE LL_RCC_EnableIT_LSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_LSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_LSERDYIE); +} + +/** + * @brief Enable HSI ready interrupt + * @rmtoll CIR HSIRDYIE LL_RCC_EnableIT_HSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_HSIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); +} + +/** + * @brief Enable HSE ready interrupt + * @rmtoll CIR HSERDYIE LL_RCC_EnableIT_HSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_HSERDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_HSERDYIE); +} + +/** + * @brief Enable PLL ready interrupt + * @rmtoll CIR PLLRDYIE LL_RCC_EnableIT_PLLRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Enable PLLI2S ready interrupt + * @rmtoll CIR PLLI2SRDYIE LL_RCC_EnableIT_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLI2SRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); +} +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Enable PLLSAI ready interrupt + * @rmtoll CIR PLLSAIRDYIE LL_RCC_EnableIT_PLLSAIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableIT_PLLSAIRDY(void) +{ + SET_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Disable LSI ready interrupt + * @rmtoll CIR LSIRDYIE LL_RCC_DisableIT_LSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_LSIRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_LSIRDYIE); +} + +/** + * @brief Disable LSE ready interrupt + * @rmtoll CIR LSERDYIE LL_RCC_DisableIT_LSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_LSERDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_LSERDYIE); +} + +/** + * @brief Disable HSI ready interrupt + * @rmtoll CIR HSIRDYIE LL_RCC_DisableIT_HSIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_HSIRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_HSIRDYIE); +} + +/** + * @brief Disable HSE ready interrupt + * @rmtoll CIR HSERDYIE LL_RCC_DisableIT_HSERDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_HSERDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_HSERDYIE); +} + +/** + * @brief Disable PLL ready interrupt + * @rmtoll CIR PLLRDYIE LL_RCC_DisableIT_PLLRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLRDYIE); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Disable PLLI2S ready interrupt + * @rmtoll CIR PLLI2SRDYIE LL_RCC_DisableIT_PLLI2SRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLI2SRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE); +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Disable PLLSAI ready interrupt + * @rmtoll CIR PLLSAIRDYIE LL_RCC_DisableIT_PLLSAIRDY + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableIT_PLLSAIRDY(void) +{ + CLEAR_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @brief Checks if LSI ready interrupt source is enabled or disabled. + * @rmtoll CIR LSIRDYIE LL_RCC_IsEnabledIT_LSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSIRDYIE) == (RCC_CIR_LSIRDYIE)); +} + +/** + * @brief Checks if LSE ready interrupt source is enabled or disabled. + * @rmtoll CIR LSERDYIE LL_RCC_IsEnabledIT_LSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_LSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_LSERDYIE) == (RCC_CIR_LSERDYIE)); +} + +/** + * @brief Checks if HSI ready interrupt source is enabled or disabled. + * @rmtoll CIR HSIRDYIE LL_RCC_IsEnabledIT_HSIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSIRDYIE) == (RCC_CIR_HSIRDYIE)); +} + +/** + * @brief Checks if HSE ready interrupt source is enabled or disabled. + * @rmtoll CIR HSERDYIE LL_RCC_IsEnabledIT_HSERDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_HSERDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_HSERDYIE) == (RCC_CIR_HSERDYIE)); +} + +/** + * @brief Checks if PLL ready interrupt source is enabled or disabled. + * @rmtoll CIR PLLRDYIE LL_RCC_IsEnabledIT_PLLRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLRDYIE) == (RCC_CIR_PLLRDYIE)); +} + +#if defined(RCC_PLLI2S_SUPPORT) +/** + * @brief Checks if PLLI2S ready interrupt source is enabled or disabled. + * @rmtoll CIR PLLI2SRDYIE LL_RCC_IsEnabledIT_PLLI2SRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLI2SRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLI2SRDYIE) == (RCC_CIR_PLLI2SRDYIE)); +} + +#endif /* RCC_PLLI2S_SUPPORT */ + +#if defined(RCC_PLLSAI_SUPPORT) +/** + * @brief Checks if PLLSAI ready interrupt source is enabled or disabled. + * @rmtoll CIR PLLSAIRDYIE LL_RCC_IsEnabledIT_PLLSAIRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledIT_PLLSAIRDY(void) +{ + return (READ_BIT(RCC->CIR, RCC_CIR_PLLSAIRDYIE) == (RCC_CIR_PLLSAIRDYIE)); +} +#endif /* RCC_PLLSAI_SUPPORT */ + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_EF_Init De-initialization function + * @{ + */ +ErrorStatus LL_RCC_DeInit(void); +/** + * @} + */ + +/** @defgroup RCC_LL_EF_Get_Freq Get system and peripherals clocks frequency functions + * @{ + */ +void LL_RCC_GetSystemClocksFreq(LL_RCC_ClocksTypeDef *RCC_Clocks); +#if defined(FMPI2C1) +uint32_t LL_RCC_GetFMPI2CClockFreq(uint32_t FMPI2CxSource); +#endif /* FMPI2C1 */ +#if defined(LPTIM1) +uint32_t LL_RCC_GetLPTIMClockFreq(uint32_t LPTIMxSource); +#endif /* LPTIM1 */ +#if defined(SAI1) +uint32_t LL_RCC_GetSAIClockFreq(uint32_t SAIxSource); +#endif /* SAI1 */ +#if defined(SDIO) +uint32_t LL_RCC_GetSDIOClockFreq(uint32_t SDIOxSource); +#endif /* SDIO */ +#if defined(RNG) +uint32_t LL_RCC_GetRNGClockFreq(uint32_t RNGxSource); +#endif /* RNG */ +#if defined(USB_OTG_FS) || defined(USB_OTG_HS) +uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource); +#endif /* USB_OTG_FS || USB_OTG_HS */ +#if defined(DFSDM1_Channel0) +uint32_t LL_RCC_GetDFSDMClockFreq(uint32_t DFSDMxSource); +uint32_t LL_RCC_GetDFSDMAudioClockFreq(uint32_t DFSDMxSource); +#endif /* DFSDM1_Channel0 */ +uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource); +#if defined(CEC) +uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource); +#endif /* CEC */ +#if defined(LTDC) +uint32_t LL_RCC_GetLTDCClockFreq(uint32_t LTDCxSource); +#endif /* LTDC */ +#if defined(SPDIFRX) +uint32_t LL_RCC_GetSPDIFRXClockFreq(uint32_t SPDIFRXxSource); +#endif /* SPDIFRX */ +#if defined(DSI) +uint32_t LL_RCC_GetDSIClockFreq(uint32_t DSIxSource); +#endif /* DSI */ +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RCC) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_RCC_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h new file mode 100644 index 0000000..84ea5c4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h @@ -0,0 +1,1711 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_system.h + * @author MCD Application Team + * @brief Header file of SYSTEM LL module. + * + ****************************************************************************** + * @attention + * + *Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The LL SYSTEM driver contains a set of generic APIs that can be + used by user: + (+) Some of the FLASH features need to be handled in the SYSTEM file. + (+) Access to DBGCMU registers + (+) Access to SYSCFG registers + + @endverbatim + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_SYSTEM_H +#define __STM32F4xx_LL_SYSTEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) + +/** @defgroup SYSTEM_LL SYSTEM + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup SYSTEM_LL_Private_Constants SYSTEM Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup SYSTEM_LL_Exported_Constants SYSTEM Exported Constants + * @{ + */ + +/** @defgroup SYSTEM_LL_EC_REMAP SYSCFG REMAP +* @{ +*/ +#define LL_SYSCFG_REMAP_FLASH (uint32_t)0x00000000 /*!< Main Flash memory mapped at 0x00000000 */ +#define LL_SYSCFG_REMAP_SYSTEMFLASH SYSCFG_MEMRMP_MEM_MODE_0 /*!< System Flash memory mapped at 0x00000000 */ +#if defined(FSMC_Bank1) +#define LL_SYSCFG_REMAP_FSMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FSMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ +#endif /* FSMC_Bank1 */ +#if defined(FMC_Bank1) +#define LL_SYSCFG_REMAP_FMC SYSCFG_MEMRMP_MEM_MODE_1 /*!< FMC(NOR/PSRAM 1 and 2) mapped at 0x00000000 */ +#define LL_SYSCFG_REMAP_SDRAM SYSCFG_MEMRMP_MEM_MODE_2 /*!< FMC/SDRAM mapped at 0x00000000 */ +#endif /* FMC_Bank1 */ +#define LL_SYSCFG_REMAP_SRAM (SYSCFG_MEMRMP_MEM_MODE_1 | SYSCFG_MEMRMP_MEM_MODE_0) /*!< SRAM1 mapped at 0x00000000 */ + +/** + * @} + */ + +#if defined(SYSCFG_PMC_MII_RMII_SEL) + /** @defgroup SYSTEM_LL_EC_PMC SYSCFG PMC +* @{ +*/ +#define LL_SYSCFG_PMC_ETHMII (uint32_t)0x00000000 /*!< ETH Media MII interface */ +#define LL_SYSCFG_PMC_ETHRMII (uint32_t)SYSCFG_PMC_MII_RMII_SEL /*!< ETH Media RMII interface */ + +/** + * @} + */ +#endif /* SYSCFG_PMC_MII_RMII_SEL */ + + + +#if defined(SYSCFG_MEMRMP_UFB_MODE) +/** @defgroup SYSTEM_LL_EC_BANKMODE SYSCFG BANK MODE + * @{ + */ +#define LL_SYSCFG_BANKMODE_BANK1 (uint32_t)0x00000000 /*!< Flash Bank 1 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000 (TCM) + and Flash Bank 2 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000 (TCM)*/ +#define LL_SYSCFG_BANKMODE_BANK2 SYSCFG_MEMRMP_UFB_MODE /*!< Flash Bank 2 base address mapped at 0x0800 0000 (AXI) and 0x0020 0000(TCM) + and Flash Bank 1 base address mapped at 0x0810 0000 (AXI) and 0x0030 0000(TCM) */ +/** + * @} + */ +#endif /* SYSCFG_MEMRMP_UFB_MODE */ +/** @defgroup SYSTEM_LL_EC_I2C_FASTMODEPLUS SYSCFG I2C FASTMODEPLUS + * @{ + */ +#if defined(SYSCFG_CFGR_FMPI2C1_SCL) +#define LL_SYSCFG_I2C_FASTMODEPLUS_SCL SYSCFG_CFGR_FMPI2C1_SCL /*!< Enable Fast Mode Plus on FMPI2C_SCL pin */ +#define LL_SYSCFG_I2C_FASTMODEPLUS_SDA SYSCFG_CFGR_FMPI2C1_SDA /*!< Enable Fast Mode Plus on FMPI2C_SDA pin*/ +#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_EXTI_PORT SYSCFG EXTI PORT + * @{ + */ +#define LL_SYSCFG_EXTI_PORTA (uint32_t)0 /*!< EXTI PORT A */ +#define LL_SYSCFG_EXTI_PORTB (uint32_t)1 /*!< EXTI PORT B */ +#define LL_SYSCFG_EXTI_PORTC (uint32_t)2 /*!< EXTI PORT C */ +#define LL_SYSCFG_EXTI_PORTD (uint32_t)3 /*!< EXTI PORT D */ +#define LL_SYSCFG_EXTI_PORTE (uint32_t)4 /*!< EXTI PORT E */ +#if defined(GPIOF) +#define LL_SYSCFG_EXTI_PORTF (uint32_t)5 /*!< EXTI PORT F */ +#endif /* GPIOF */ +#if defined(GPIOG) +#define LL_SYSCFG_EXTI_PORTG (uint32_t)6 /*!< EXTI PORT G */ +#endif /* GPIOG */ +#define LL_SYSCFG_EXTI_PORTH (uint32_t)7 /*!< EXTI PORT H */ +#if defined(GPIOI) +#define LL_SYSCFG_EXTI_PORTI (uint32_t)8 /*!< EXTI PORT I */ +#endif /* GPIOI */ +#if defined(GPIOJ) +#define LL_SYSCFG_EXTI_PORTJ (uint32_t)9 /*!< EXTI PORT J */ +#endif /* GPIOJ */ +#if defined(GPIOK) +#define LL_SYSCFG_EXTI_PORTK (uint32_t)10 /*!< EXTI PORT k */ +#endif /* GPIOK */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_EXTI_LINE SYSCFG EXTI LINE + * @{ + */ +#define LL_SYSCFG_EXTI_LINE0 (uint32_t)(0x000FU << 16 | 0) /*!< EXTI_POSITION_0 | EXTICR[0] */ +#define LL_SYSCFG_EXTI_LINE1 (uint32_t)(0x00F0U << 16 | 0) /*!< EXTI_POSITION_4 | EXTICR[0] */ +#define LL_SYSCFG_EXTI_LINE2 (uint32_t)(0x0F00U << 16 | 0) /*!< EXTI_POSITION_8 | EXTICR[0] */ +#define LL_SYSCFG_EXTI_LINE3 (uint32_t)(0xF000U << 16 | 0) /*!< EXTI_POSITION_12 | EXTICR[0] */ +#define LL_SYSCFG_EXTI_LINE4 (uint32_t)(0x000FU << 16 | 1) /*!< EXTI_POSITION_0 | EXTICR[1] */ +#define LL_SYSCFG_EXTI_LINE5 (uint32_t)(0x00F0U << 16 | 1) /*!< EXTI_POSITION_4 | EXTICR[1] */ +#define LL_SYSCFG_EXTI_LINE6 (uint32_t)(0x0F00U << 16 | 1) /*!< EXTI_POSITION_8 | EXTICR[1] */ +#define LL_SYSCFG_EXTI_LINE7 (uint32_t)(0xF000U << 16 | 1) /*!< EXTI_POSITION_12 | EXTICR[1] */ +#define LL_SYSCFG_EXTI_LINE8 (uint32_t)(0x000FU << 16 | 2) /*!< EXTI_POSITION_0 | EXTICR[2] */ +#define LL_SYSCFG_EXTI_LINE9 (uint32_t)(0x00F0U << 16 | 2) /*!< EXTI_POSITION_4 | EXTICR[2] */ +#define LL_SYSCFG_EXTI_LINE10 (uint32_t)(0x0F00U << 16 | 2) /*!< EXTI_POSITION_8 | EXTICR[2] */ +#define LL_SYSCFG_EXTI_LINE11 (uint32_t)(0xF000U << 16 | 2) /*!< EXTI_POSITION_12 | EXTICR[2] */ +#define LL_SYSCFG_EXTI_LINE12 (uint32_t)(0x000FU << 16 | 3) /*!< EXTI_POSITION_0 | EXTICR[3] */ +#define LL_SYSCFG_EXTI_LINE13 (uint32_t)(0x00F0U << 16 | 3) /*!< EXTI_POSITION_4 | EXTICR[3] */ +#define LL_SYSCFG_EXTI_LINE14 (uint32_t)(0x0F00U << 16 | 3) /*!< EXTI_POSITION_8 | EXTICR[3] */ +#define LL_SYSCFG_EXTI_LINE15 (uint32_t)(0xF000U << 16 | 3) /*!< EXTI_POSITION_12 | EXTICR[3] */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_TIMBREAK SYSCFG TIMER BREAK + * @{ + */ +#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) +#define LL_SYSCFG_TIMBREAK_LOCKUP SYSCFG_CFGR2_LOCKUP_LOCK /*!< Enables and locks the LOCKUP output of CortexM4 + with Break Input of TIM1/8 */ +#define LL_SYSCFG_TIMBREAK_PVD SYSCFG_CFGR2_PVD_LOCK /*!< Enables and locks the PVD connection with TIM1/8 Break Input + and also the PVDE and PLS bits of the Power Control Interface */ +#endif /* SYSCFG_CFGR2_CLL */ +/** + * @} + */ + +#if defined(SYSCFG_MCHDLYCR_BSCKSEL) +/** @defgroup SYSTEM_LL_DFSDM_BitStream_ClockSource SYSCFG MCHDLY BCKKSEL + * @{ + */ +#define LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 (uint32_t)0x00000000 +#define LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 SYSCFG_MCHDLYCR_BSCKSEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM_MCHDLYEN SYSCFG MCHDLY MCHDLYEN + * @{ + */ +#define LL_SYSCFG_DFSDM1_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY1EN +#define LL_SYSCFG_DFSDM2_MCHDLYEN SYSCFG_MCHDLYCR_MCHDLY2EN +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM_DataIn0_Source SYSCFG MCHDLY DFSDMD0SEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_DataIn0 SYSCFG_MCHDLYCR_DFSDM1D0SEL +#define LL_SYSCFG_DFSDM2_DataIn0 SYSCFG_MCHDLYCR_DFSDM2D0SEL + +#define LL_SYSCFG_DFSDM1_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | 0x00000000) +#define LL_SYSCFG_DFSDM1_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D0SEL) +#define LL_SYSCFG_DFSDM2_DataIn0_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | 0x00000000) +#define LL_SYSCFG_DFSDM2_DataIn0_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D0SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D0SEL) +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM_DataIn2_Source SYSCFG MCHDLY DFSDMD2SEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_DataIn2 SYSCFG_MCHDLYCR_DFSDM1D2SEL +#define LL_SYSCFG_DFSDM2_DataIn2 SYSCFG_MCHDLYCR_DFSDM2D2SEL + +#define LL_SYSCFG_DFSDM1_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | 0x00000000) +#define LL_SYSCFG_DFSDM1_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM1D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM1D2SEL) +#define LL_SYSCFG_DFSDM2_DataIn2_PAD (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | 0x00000000) +#define LL_SYSCFG_DFSDM2_DataIn2_DM (uint32_t)((SYSCFG_MCHDLYCR_DFSDM2D2SEL << 16) | SYSCFG_MCHDLYCR_DFSDM2D2SEL) +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK02SEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 SYSCFG_MCHDLYCR_DFSDM1CK02SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM1_TIM4OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM1CK13SEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 SYSCFG_MCHDLYCR_DFSDM1CK13SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM1_CLKIN_SourceSelection SYSCFG MCHDLY DFSDMCFG + * @{ + */ +#define LL_SYSCFG_DFSDM1_CKIN_PAD (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM1_CKIN_DM SYSCFG_MCHDLYCR_DFSDM1CFG +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM1_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM1CKOSEL + * @{ + */ +#define LL_SYSCFG_DFSDM1_CKOUT (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM1_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM1CKOSEL +/** + * @} + */ + +/** @defgroup SYSTEM_LL_DFSDM2_DataIn4_SourceSelection SYSCFG MCHDLY DFSDM2D4SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_DataIn4_PAD (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_DataIn4_DM SYSCFG_MCHDLYCR_DFSDM2D4SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_DataIn6_SourceSelection SYSCFG MCHDLY DFSDM2D6SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_DataIn6_PAD (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_DataIn6_DM SYSCFG_MCHDLYCR_DFSDM2D6SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC4_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK04SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 SYSCFG_MCHDLYCR_DFSDM2CK04SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC3_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK15SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 SYSCFG_MCHDLYCR_DFSDM2CK15SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC2_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK26SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 SYSCFG_MCHDLYCR_DFSDM2CK26SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_TIM3OC1_BitstreamDistribution SYSCFG MCHDLY DFSDM2CK37SEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 SYSCFG_MCHDLYCR_DFSDM2CK37SEL +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_CLKIN_SourceSelection SYSCFG MCHDLY DFSDM2CFG + * @{ + */ +#define LL_SYSCFG_DFSDM2_CKIN_PAD (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_CKIN_DM SYSCFG_MCHDLYCR_DFSDM2CFG +/** + * @} + */ +/** @defgroup SYSTEM_LL_DFSDM2_CLKOUT_SourceSelection SYSCFG MCHDLY DFSDM2CKOSEL + * @{ + */ +#define LL_SYSCFG_DFSDM2_CKOUT (uint32_t)0x00000000 +#define LL_SYSCFG_DFSDM2_CKOUT_M27 SYSCFG_MCHDLYCR_DFSDM2CKOSEL +/** + * @} + */ +#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ + +/** @defgroup SYSTEM_LL_EC_TRACE DBGMCU TRACE Pin Assignment + * @{ + */ +#define LL_DBGMCU_TRACE_NONE 0x00000000U /*!< TRACE pins not assigned (default state) */ +#define LL_DBGMCU_TRACE_ASYNCH DBGMCU_CR_TRACE_IOEN /*!< TRACE pin assignment for Asynchronous Mode */ +#define LL_DBGMCU_TRACE_SYNCH_SIZE1 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_0) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 1 */ +#define LL_DBGMCU_TRACE_SYNCH_SIZE2 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE_1) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 2 */ +#define LL_DBGMCU_TRACE_SYNCH_SIZE4 (DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE) /*!< TRACE pin assignment for Synchronous Mode with a TRACEDATA size of 4 */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_APB1_GRP1_STOP_IP DBGMCU APB1 GRP1 STOP IP + * @{ + */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM2_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM2_STOP DBGMCU_APB1_FZ_DBG_TIM2_STOP /*!< TIM2 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM2_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM3_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM3_STOP DBGMCU_APB1_FZ_DBG_TIM3_STOP /*!< TIM3 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM3_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM4_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM4_STOP DBGMCU_APB1_FZ_DBG_TIM4_STOP /*!< TIM4 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM4_STOP */ +#define LL_DBGMCU_APB1_GRP1_TIM5_STOP DBGMCU_APB1_FZ_DBG_TIM5_STOP /*!< TIM5 counter stopped when core is halted */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM6_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM6_STOP DBGMCU_APB1_FZ_DBG_TIM6_STOP /*!< TIM6 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM6_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM7_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM7_STOP DBGMCU_APB1_FZ_DBG_TIM7_STOP /*!< TIM7 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM7_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM12_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM12_STOP DBGMCU_APB1_FZ_DBG_TIM12_STOP /*!< TIM12 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM12_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM13_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM13_STOP DBGMCU_APB1_FZ_DBG_TIM13_STOP /*!< TIM13 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM13_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_TIM14_STOP) +#define LL_DBGMCU_APB1_GRP1_TIM14_STOP DBGMCU_APB1_FZ_DBG_TIM14_STOP /*!< TIM14 counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_TIM14_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_LPTIM_STOP) +#define LL_DBGMCU_APB1_GRP1_LPTIM_STOP DBGMCU_APB1_FZ_DBG_LPTIM_STOP /*!< LPTIM counter stopped when core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_LPTIM_STOP */ +#define LL_DBGMCU_APB1_GRP1_RTC_STOP DBGMCU_APB1_FZ_DBG_RTC_STOP /*!< RTC counter stopped when core is halted */ +#define LL_DBGMCU_APB1_GRP1_WWDG_STOP DBGMCU_APB1_FZ_DBG_WWDG_STOP /*!< Debug Window Watchdog stopped when Core is halted */ +#define LL_DBGMCU_APB1_GRP1_IWDG_STOP DBGMCU_APB1_FZ_DBG_IWDG_STOP /*!< Debug Independent Watchdog stopped when Core is halted */ +#define LL_DBGMCU_APB1_GRP1_I2C1_STOP DBGMCU_APB1_FZ_DBG_I2C1_SMBUS_TIMEOUT /*!< I2C1 SMBUS timeout mode stopped when Core is halted */ +#define LL_DBGMCU_APB1_GRP1_I2C2_STOP DBGMCU_APB1_FZ_DBG_I2C2_SMBUS_TIMEOUT /*!< I2C2 SMBUS timeout mode stopped when Core is halted */ +#if defined(DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT) +#define LL_DBGMCU_APB1_GRP1_I2C3_STOP DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT /*!< I2C3 SMBUS timeout mode stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_I2C3_SMBUS_TIMEOUT */ +#if defined(DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT) +#define LL_DBGMCU_APB1_GRP1_I2C4_STOP DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT /*!< I2C4 SMBUS timeout mode stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_I2C4_SMBUS_TIMEOUT */ +#if defined(DBGMCU_APB1_FZ_DBG_CAN1_STOP) +#define LL_DBGMCU_APB1_GRP1_CAN1_STOP DBGMCU_APB1_FZ_DBG_CAN1_STOP /*!< CAN1 debug stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_CAN1_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_CAN2_STOP) +#define LL_DBGMCU_APB1_GRP1_CAN2_STOP DBGMCU_APB1_FZ_DBG_CAN2_STOP /*!< CAN2 debug stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_CAN2_STOP */ +#if defined(DBGMCU_APB1_FZ_DBG_CAN3_STOP) +#define LL_DBGMCU_APB1_GRP1_CAN3_STOP DBGMCU_APB1_FZ_DBG_CAN3_STOP /*!< CAN3 debug stopped when Core is halted */ +#endif /* DBGMCU_APB1_FZ_DBG_CAN3_STOP */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_APB2_GRP1_STOP_IP DBGMCU APB2 GRP1 STOP IP + * @{ + */ +#define LL_DBGMCU_APB2_GRP1_TIM1_STOP DBGMCU_APB2_FZ_DBG_TIM1_STOP /*!< TIM1 counter stopped when core is halted */ +#if defined(DBGMCU_APB2_FZ_DBG_TIM8_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM8_STOP DBGMCU_APB2_FZ_DBG_TIM8_STOP /*!< TIM8 counter stopped when core is halted */ +#endif /* DBGMCU_APB2_FZ_DBG_TIM8_STOP */ +#define LL_DBGMCU_APB2_GRP1_TIM9_STOP DBGMCU_APB2_FZ_DBG_TIM9_STOP /*!< TIM9 counter stopped when core is halted */ +#if defined(DBGMCU_APB2_FZ_DBG_TIM10_STOP) +#define LL_DBGMCU_APB2_GRP1_TIM10_STOP DBGMCU_APB2_FZ_DBG_TIM10_STOP /*!< TIM10 counter stopped when core is halted */ +#endif /* DBGMCU_APB2_FZ_DBG_TIM10_STOP */ +#define LL_DBGMCU_APB2_GRP1_TIM11_STOP DBGMCU_APB2_FZ_DBG_TIM11_STOP /*!< TIM11 counter stopped when core is halted */ +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EC_LATENCY FLASH LATENCY + * @{ + */ +#define LL_FLASH_LATENCY_0 FLASH_ACR_LATENCY_0WS /*!< FLASH Zero wait state */ +#define LL_FLASH_LATENCY_1 FLASH_ACR_LATENCY_1WS /*!< FLASH One wait state */ +#define LL_FLASH_LATENCY_2 FLASH_ACR_LATENCY_2WS /*!< FLASH Two wait states */ +#define LL_FLASH_LATENCY_3 FLASH_ACR_LATENCY_3WS /*!< FLASH Three wait states */ +#define LL_FLASH_LATENCY_4 FLASH_ACR_LATENCY_4WS /*!< FLASH Four wait states */ +#define LL_FLASH_LATENCY_5 FLASH_ACR_LATENCY_5WS /*!< FLASH five wait state */ +#define LL_FLASH_LATENCY_6 FLASH_ACR_LATENCY_6WS /*!< FLASH six wait state */ +#define LL_FLASH_LATENCY_7 FLASH_ACR_LATENCY_7WS /*!< FLASH seven wait states */ +#define LL_FLASH_LATENCY_8 FLASH_ACR_LATENCY_8WS /*!< FLASH eight wait states */ +#define LL_FLASH_LATENCY_9 FLASH_ACR_LATENCY_9WS /*!< FLASH nine wait states */ +#define LL_FLASH_LATENCY_10 FLASH_ACR_LATENCY_10WS /*!< FLASH ten wait states */ +#define LL_FLASH_LATENCY_11 FLASH_ACR_LATENCY_11WS /*!< FLASH eleven wait states */ +#define LL_FLASH_LATENCY_12 FLASH_ACR_LATENCY_12WS /*!< FLASH twelve wait states */ +#define LL_FLASH_LATENCY_13 FLASH_ACR_LATENCY_13WS /*!< FLASH thirteen wait states */ +#define LL_FLASH_LATENCY_14 FLASH_ACR_LATENCY_14WS /*!< FLASH fourteen wait states */ +#define LL_FLASH_LATENCY_15 FLASH_ACR_LATENCY_15WS /*!< FLASH fifteen wait states */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup SYSTEM_LL_Exported_Functions SYSTEM Exported Functions + * @{ + */ + +/** @defgroup SYSTEM_LL_EF_SYSCFG SYSCFG + * @{ + */ +/** + * @brief Set memory mapping at address 0x00000000 + * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_SetRemapMemory + * @param Memory This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_REMAP_FLASH + * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH + * @arg @ref LL_SYSCFG_REMAP_SRAM + * @arg @ref LL_SYSCFG_REMAP_FSMC (*) + * @arg @ref LL_SYSCFG_REMAP_FMC (*) + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapMemory(uint32_t Memory) +{ + MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE, Memory); +} + +/** + * @brief Get memory mapping at address 0x00000000 + * @rmtoll SYSCFG_MEMRMP MEM_MODE LL_SYSCFG_GetRemapMemory + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_REMAP_FLASH + * @arg @ref LL_SYSCFG_REMAP_SYSTEMFLASH + * @arg @ref LL_SYSCFG_REMAP_SRAM + * @arg @ref LL_SYSCFG_REMAP_FSMC (*) + * @arg @ref LL_SYSCFG_REMAP_FMC (*) + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetRemapMemory(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_MEM_MODE)); +} + +#if defined(SYSCFG_MEMRMP_SWP_FMC) +/** + * @brief Enables the FMC Memory Mapping Swapping + * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_EnableFMCMemorySwapping + * @note SDRAM is accessible at 0x60000000 and NOR/RAM + * is accessible at 0xC0000000 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableFMCMemorySwapping(void) +{ + SET_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC_0); +} + +/** + * @brief Disables the FMC Memory Mapping Swapping + * @rmtoll SYSCFG_MEMRMP SWP_FMC LL_SYSCFG_DisableFMCMemorySwapping + * @note SDRAM is accessible at 0xC0000000 (default mapping) + * and NOR/RAM is accessible at 0x60000000 (default mapping) + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableFMCMemorySwapping(void) +{ + CLEAR_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_SWP_FMC); +} + +#endif /* SYSCFG_MEMRMP_SWP_FMC */ +/** + * @brief Enables the Compensation cell Power Down + * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_EnableCompensationCell + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableCompensationCell(void) +{ + SET_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); +} + +/** + * @brief Disables the Compensation cell Power Down + * @rmtoll SYSCFG_CMPCR CMP_PD LL_SYSCFG_DisableCompensationCell + * @note The I/O compensation cell can be used only when the device supply + * voltage ranges from 2.4 to 3.6 V + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableCompensationCell(void) +{ + CLEAR_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_CMP_PD); +} + +/** + * @brief Get Compensation Cell ready Flag + * @rmtoll SYSCFG_CMPCR READY LL_SYSCFG_IsActiveFlag_CMPCR + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSCFG_IsActiveFlag_CMPCR(void) +{ + return (READ_BIT(SYSCFG->CMPCR, SYSCFG_CMPCR_READY) == (SYSCFG_CMPCR_READY)); +} + +#if defined(SYSCFG_PMC_MII_RMII_SEL) +/** + * @brief Select Ethernet PHY interface + * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_SetPHYInterface + * @param Interface This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_PMC_ETHMII + * @arg @ref LL_SYSCFG_PMC_ETHRMII + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetPHYInterface(uint32_t Interface) +{ + MODIFY_REG(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL, Interface); +} + +/** + * @brief Get Ethernet PHY interface + * @rmtoll SYSCFG_PMC MII_RMII_SEL LL_SYSCFG_GetPHYInterface + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_PMC_ETHMII + * @arg @ref LL_SYSCFG_PMC_ETHRMII + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetPHYInterface(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->PMC, SYSCFG_PMC_MII_RMII_SEL)); +} +#endif /* SYSCFG_PMC_MII_RMII_SEL */ + + + +#if defined(SYSCFG_MEMRMP_UFB_MODE) +/** + * @brief Select Flash bank mode (Bank flashed at 0x08000000) + * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_SetFlashBankMode + * @param Bank This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_BANKMODE_BANK1 + * @arg @ref LL_SYSCFG_BANKMODE_BANK2 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetFlashBankMode(uint32_t Bank) +{ + MODIFY_REG(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE, Bank); +} + +/** + * @brief Get Flash bank mode (Bank flashed at 0x08000000) + * @rmtoll SYSCFG_MEMRMP UFB_MODE LL_SYSCFG_GetFlashBankMode + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_BANKMODE_BANK1 + * @arg @ref LL_SYSCFG_BANKMODE_BANK2 + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetFlashBankMode(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MEMRMP, SYSCFG_MEMRMP_UFB_MODE)); +} +#endif /* SYSCFG_MEMRMP_UFB_MODE */ + +#if defined(SYSCFG_CFGR_FMPI2C1_SCL) +/** + * @brief Enable the I2C fast mode plus driving capability. + * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_EnableFastModePlus\n + * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_EnableFastModePlus + * @param ConfigFastModePlus This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA + * (*) value not defined in all devices + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableFastModePlus(uint32_t ConfigFastModePlus) +{ + SET_BIT(SYSCFG->CFGR, ConfigFastModePlus); +} + +/** + * @brief Disable the I2C fast mode plus driving capability. + * @rmtoll SYSCFG_CFGR FMPI2C1_SCL LL_SYSCFG_DisableFastModePlus\n + * SYSCFG_CFGR FMPI2C1_SDA LL_SYSCFG_DisableFastModePlus\n + * @param ConfigFastModePlus This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SCL + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_SDA + * (*) value not defined in all devices + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableFastModePlus(uint32_t ConfigFastModePlus) +{ + CLEAR_BIT(SYSCFG->CFGR, ConfigFastModePlus); +} +#endif /* SYSCFG_CFGR_FMPI2C1_SCL */ + +/** + * @brief Configure source input for the EXTI external interrupt. + * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_SetEXTISource + * @param Port This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_EXTI_PORTA + * @arg @ref LL_SYSCFG_EXTI_PORTB + * @arg @ref LL_SYSCFG_EXTI_PORTC + * @arg @ref LL_SYSCFG_EXTI_PORTD + * @arg @ref LL_SYSCFG_EXTI_PORTE + * @arg @ref LL_SYSCFG_EXTI_PORTF (*) + * @arg @ref LL_SYSCFG_EXTI_PORTG (*) + * @arg @ref LL_SYSCFG_EXTI_PORTH + * + * (*) value not defined in all devices + * @param Line This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_EXTI_LINE0 + * @arg @ref LL_SYSCFG_EXTI_LINE1 + * @arg @ref LL_SYSCFG_EXTI_LINE2 + * @arg @ref LL_SYSCFG_EXTI_LINE3 + * @arg @ref LL_SYSCFG_EXTI_LINE4 + * @arg @ref LL_SYSCFG_EXTI_LINE5 + * @arg @ref LL_SYSCFG_EXTI_LINE6 + * @arg @ref LL_SYSCFG_EXTI_LINE7 + * @arg @ref LL_SYSCFG_EXTI_LINE8 + * @arg @ref LL_SYSCFG_EXTI_LINE9 + * @arg @ref LL_SYSCFG_EXTI_LINE10 + * @arg @ref LL_SYSCFG_EXTI_LINE11 + * @arg @ref LL_SYSCFG_EXTI_LINE12 + * @arg @ref LL_SYSCFG_EXTI_LINE13 + * @arg @ref LL_SYSCFG_EXTI_LINE14 + * @arg @ref LL_SYSCFG_EXTI_LINE15 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetEXTISource(uint32_t Port, uint32_t Line) +{ + MODIFY_REG(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16), Port << POSITION_VAL((Line >> 16))); +} + +/** + * @brief Get the configured defined for specific EXTI Line + * @rmtoll SYSCFG_EXTICR1 EXTIx LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTIx LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTIx LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTIx LL_SYSCFG_GetEXTISource + * @param Line This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_EXTI_LINE0 + * @arg @ref LL_SYSCFG_EXTI_LINE1 + * @arg @ref LL_SYSCFG_EXTI_LINE2 + * @arg @ref LL_SYSCFG_EXTI_LINE3 + * @arg @ref LL_SYSCFG_EXTI_LINE4 + * @arg @ref LL_SYSCFG_EXTI_LINE5 + * @arg @ref LL_SYSCFG_EXTI_LINE6 + * @arg @ref LL_SYSCFG_EXTI_LINE7 + * @arg @ref LL_SYSCFG_EXTI_LINE8 + * @arg @ref LL_SYSCFG_EXTI_LINE9 + * @arg @ref LL_SYSCFG_EXTI_LINE10 + * @arg @ref LL_SYSCFG_EXTI_LINE11 + * @arg @ref LL_SYSCFG_EXTI_LINE12 + * @arg @ref LL_SYSCFG_EXTI_LINE13 + * @arg @ref LL_SYSCFG_EXTI_LINE14 + * @arg @ref LL_SYSCFG_EXTI_LINE15 + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_EXTI_PORTA + * @arg @ref LL_SYSCFG_EXTI_PORTB + * @arg @ref LL_SYSCFG_EXTI_PORTC + * @arg @ref LL_SYSCFG_EXTI_PORTD + * @arg @ref LL_SYSCFG_EXTI_PORTE + * @arg @ref LL_SYSCFG_EXTI_PORTF (*) + * @arg @ref LL_SYSCFG_EXTI_PORTG (*) + * @arg @ref LL_SYSCFG_EXTI_PORTH + * (*) value not defined in all devices + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetEXTISource(uint32_t Line) +{ + return (uint32_t)(READ_BIT(SYSCFG->EXTICR[Line & 0xFF], (Line >> 16)) >> POSITION_VAL(Line >> 16)); +} + +#if defined(SYSCFG_CFGR2_LOCKUP_LOCK) +/** + * @brief Set connections to TIM1/8 break inputs + * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n + * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs + * @param Break This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP + * @arg @ref LL_SYSCFG_TIMBREAK_PVD + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetTIMBreakInputs(uint32_t Break) +{ + MODIFY_REG(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK, Break); +} + +/** + * @brief Get connections to TIM1/8 Break inputs + * @rmtoll SYSCFG_CFGR2 LockUp Lock LL_SYSCFG_SetTIMBreakInputs \n + * SYSCFG_CFGR2 PVD Lock LL_SYSCFG_SetTIMBreakInputs + * @retval Returned value can be can be a combination of the following values: + * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP + * @arg @ref LL_SYSCFG_TIMBREAK_PVD + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetTIMBreakInputs(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK)); +} +#endif /* SYSCFG_CFGR2_LOCKUP_LOCK */ +#if defined(SYSCFG_MCHDLYCR_BSCKSEL) +/** + * @brief Select the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. + * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 + * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_SetBitstreamClockSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL, ClockSource); +} +/** + * @brief Get the DFSDM2 or TIM2_OC1 as clock source for the bitstream clock. + * @rmtoll SYSCFG_MCHDLYCR BSCKSEL LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_DFSDM2 + * @arg @ref LL_SYSCFG_BITSTREAM_CLOCK_TIM2OC1 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetBitstreamClockSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_BSCKSEL)); +} +/** + * @brief Enables the DFSDM1 or DFSDM2 Delay clock + * @rmtoll SYSCFG_MCHDLYCR MCHDLYEN LL_SYSCFG_DFSDM_EnableDelayClock + * @param MCHDLY This parameter can be one of the following values + * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN + * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_EnableDelayClock(uint32_t MCHDLY) +{ + SET_BIT(SYSCFG->MCHDLYCR, MCHDLY); +} + +/** + * @brief Disables the DFSDM1 or the DFSDM2 Delay clock + * @rmtoll SYSCFG_MCHDLYCR MCHDLY1EN LL_SYSCFG_DFSDM1_DisableDelayClock + * @param MCHDLY This parameter can be one of the following values + * @arg @ref LL_SYSCFG_DFSDM1_MCHDLYEN + * @arg @ref LL_SYSCFG_DFSDM2_MCHDLYEN + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_DisableDelayClock(uint32_t MCHDLY) +{ + CLEAR_BIT(SYSCFG->MCHDLYCR, MCHDLY); +} + +/** + * @brief Select the source for DFSDM1 or DFSDM2 DatIn0 + * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_SetDataIn0Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn0Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); +} +/** + * @brief Get the source for DFSDM1 or DFSDM2 DatIn0. + * @rmtoll SYSCFG_MCHDLYCR DFSDMD0SEL LL_SYSCFG_DFSDM_GetDataIn0Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0 + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0 + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM1_DataIn0_DM + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn0Source(uint32_t Source) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); +} +/** + * @brief Select the source for DFSDM1 or DFSDM2 DatIn2 + * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_SetDataIn2Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM_SetDataIn2Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, (Source >> 16), (Source & 0x0000FFFF)); +} +/** + * @brief Get the source for DFSDM1 or DFSDM2 DatIn2. + * @rmtoll SYSCFG_MCHDLYCR DFSDMD2SEL LL_SYSCFG_DFSDM_GetDataIn2Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2 + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2 + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM1_DataIn2_DM + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM_GetDataIn2Source(uint32_t Source) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, Source)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM4 OC2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK02SEL LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC2BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM4 OC2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN0 + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC2_CLKIN2 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC2BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK02SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM4 OC1 + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CK13SEL LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetTIM4OC1BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM4 OC1 + * @rmtoll SYSCFG_MCHDLYCR DFSDM1D2SEL LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN1 + * @arg @ref LL_SYSCFG_DFSDM1_TIM4OC1_CLKIN3 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetTIM4OC1BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CK13SEL)); +} + +/** + * @brief Select the DFSDM1 Clock In + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_SetClockInSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD + * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockInSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG, ClockSource); +} +/** + * @brief GET the DFSDM1 Clock In + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CFG LL_SYSCFG_DFSDM1_GetClockInSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_CKIN_PAD + * @arg @ref LL_SYSCFG_DFSDM1_CKIN_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockInSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CFG)); +} + +/** + * @brief Select the DFSDM1 Clock Out + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_SetClockOutSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_CKOUT + * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM1_SetClockOutSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL, ClockSource); +} +/** + * @brief GET the DFSDM1 Clock Out + * @rmtoll SYSCFG_MCHDLYCR DFSDM1CKOSEL LL_SYSCFG_DFSDM1_GetClockOutSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM1_CKOUT + * @arg @ref LL_SYSCFG_DFSDM1_CKOUT_M27 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM1_GetClockOutSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM1CKOSEL)); +} + +/** + * @brief Enables the DFSDM2 Delay clock + * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_EnableDelayClock + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_EnableDelayClock(void) +{ + SET_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); +} + +/** + * @brief Disables the DFSDM2 Delay clock + * @rmtoll SYSCFG_MCHDLYCR MCHDLY2EN LL_SYSCFG_DFSDM2_DisableDelayClock + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_DisableDelayClock(void) +{ + CLEAR_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_MCHDLY2EN); +} +/** + * @brief Select the source for DFSDM2 DatIn0 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_SetDataIn0Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn0Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL, Source); +} +/** + * @brief Get the source for DFSDM2 DatIn0. + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D0SEL LL_SYSCFG_DFSDM2_GetDataIn0Source + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn0_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn0Source(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D0SEL)); +} + +/** + * @brief Select the source for DFSDM2 DatIn2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_SetDataIn2Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn2Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL, Source); +} +/** + * @brief Get the source for DFSDM2 DatIn2. + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D2SEL LL_SYSCFG_DFSDM2_GetDataIn2Source + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn2_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn2Source(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D2SEL)); +} + +/** + * @brief Select the source for DFSDM2 DatIn4 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_SetDataIn4Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn4Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL, Source); +} +/** + * @brief Get the source for DFSDM2 DatIn4. + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D4SEL LL_SYSCFG_DFSDM2_GetDataIn4Source + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn4_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn4Source(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D4SEL)); +} + +/** + * @brief Select the source for DFSDM2 DatIn6 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_SetDataIn6Source + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetDataIn6Source(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL, Source); +} +/** + * @brief Get the source for DFSDM2 DatIn6. + * @rmtoll SYSCFG_MCHDLYCR DFSDM2D6SEL LL_SYSCFG_DFSDM2_GetDataIn6Source + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_PAD + * @arg @ref LL_SYSCFG_DFSDM2_DataIn6_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetDataIn6Source(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2D6SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM3 OC4 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC4BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN0 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC4_CLKIN4 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC4BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK04SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM3 OC3 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK15SEL LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC3BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM3 OC4 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN1 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC3_CLKIN5 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC3BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK15SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM3 OC2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK26SEL LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC2BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM3 OC2 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK04SEL LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN2 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC2_CLKIN6 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC2BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK26SEL)); +} + +/** + * @brief Select the distribution of the bitsream lock gated by TIM3 OC1 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetTIM3OC1BitStreamDistribution(uint32_t Source) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL, Source); +} +/** + * @brief Get the distribution of the bitsream lock gated by TIM3 OC1 + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CK37SEL LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN3 + * @arg @ref LL_SYSCFG_DFSDM2_TIM3OC1_CLKIN7 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetTIM3OC1BitStreamDistribution(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CK37SEL)); +} + +/** + * @brief Select the DFSDM2 Clock In + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_SetClockInSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD + * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockInSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG, ClockSource); +} +/** + * @brief GET the DFSDM2 Clock In + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CFG LL_SYSCFG_DFSDM2_GetClockInSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_CKIN_PAD + * @arg @ref LL_SYSCFG_DFSDM2_CKIN_DM + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockInSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CFG)); +} + +/** + * @brief Select the DFSDM2 Clock Out + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_SetClockOutSourceSelection + * @param ClockSource This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_CKOUT + * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DFSDM2_SetClockOutSourceSelection(uint32_t ClockSource) +{ + MODIFY_REG(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL, ClockSource); +} +/** + * @brief GET the DFSDM2 Clock Out + * @rmtoll SYSCFG_MCHDLYCR DFSDM2CKOSEL LL_SYSCFG_DFSDM2_GetClockOutSourceSelection + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSCFG_DFSDM2_CKOUT + * @arg @ref LL_SYSCFG_DFSDM2_CKOUT_M27 + * @retval None + */ +__STATIC_INLINE uint32_t LL_SYSCFG_DFSDM2_GetClockOutSourceSelection(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->MCHDLYCR, SYSCFG_MCHDLYCR_DFSDM2CKOSEL)); +} + +#endif /* SYSCFG_MCHDLYCR_BSCKSEL */ +/** + * @} + */ + + +/** @defgroup SYSTEM_LL_EF_DBGMCU DBGMCU + * @{ + */ + +/** + * @brief Return the device identifier + * @note For STM32F405/407xx and STM32F415/417xx devices, the device ID is 0x413 + * @note For STM32F42xxx and STM32F43xxx devices, the device ID is 0x419 + * @note For STM32F401xx devices, the device ID is 0x423 + * @note For STM32F401xx devices, the device ID is 0x433 + * @note For STM32F411xx devices, the device ID is 0x431 + * @note For STM32F410xx devices, the device ID is 0x458 + * @note For STM32F412xx devices, the device ID is 0x441 + * @note For STM32F413xx and STM32423xx devices, the device ID is 0x463 + * @note For STM32F446xx devices, the device ID is 0x421 + * @note For STM32F469xx and STM32F479xx devices, the device ID is 0x434 + * @rmtoll DBGMCU_IDCODE DEV_ID LL_DBGMCU_GetDeviceID + * @retval Values between Min_Data=0x00 and Max_Data=0xFFF + */ +__STATIC_INLINE uint32_t LL_DBGMCU_GetDeviceID(void) +{ + return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_DEV_ID)); +} + +/** + * @brief Return the device revision identifier + * @note This field indicates the revision of the device. + For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001, rev1 -> 0x1003, rev2 ->0x1007, revY -> 0x100F for STM32F405/407xx and STM32F415/417xx devices + For example, it is read as RevA -> 0x1000, Cat 2 revY -> 0x1003, rev1 -> 0x1007, rev3 ->0x2001 for STM32F42xxx and STM32F43xxx devices + For example, it is read as RevZ -> 0x1000, Cat 2 revA -> 0x1001 for STM32F401xB/C devices + For example, it is read as RevA -> 0x1000, Cat 2 revZ -> 0x1001 for STM32F401xD/E devices + For example, it is read as RevA -> 0x1000 for STM32F411xx,STM32F413/423xx,STM32F469/423xx, STM32F446xx and STM32F410xx devices + For example, it is read as RevZ -> 0x1001, Cat 2 revB -> 0x2000, revC -> 0x3000 for STM32F412xx devices + * @rmtoll DBGMCU_IDCODE REV_ID LL_DBGMCU_GetRevisionID + * @retval Values between Min_Data=0x00 and Max_Data=0xFFFF + */ +__STATIC_INLINE uint32_t LL_DBGMCU_GetRevisionID(void) +{ + return (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_REV_ID) >> DBGMCU_IDCODE_REV_ID_Pos); +} + +/** + * @brief Enable the Debug Module during SLEEP mode + * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_EnableDBGSleepMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_EnableDBGSleepMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Disable the Debug Module during SLEEP mode + * @rmtoll DBGMCU_CR DBG_SLEEP LL_DBGMCU_DisableDBGSleepMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_DisableDBGSleepMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Enable the Debug Module during STOP mode + * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_EnableDBGStopMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_EnableDBGStopMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Disable the Debug Module during STOP mode + * @rmtoll DBGMCU_CR DBG_STOP LL_DBGMCU_DisableDBGStopMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_DisableDBGStopMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); +} + +/** + * @brief Enable the Debug Module during STANDBY mode + * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_EnableDBGStandbyMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_EnableDBGStandbyMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Disable the Debug Module during STANDBY mode + * @rmtoll DBGMCU_CR DBG_STANDBY LL_DBGMCU_DisableDBGStandbyMode + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_DisableDBGStandbyMode(void) +{ + CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); +} + +/** + * @brief Set Trace pin assignment control + * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_SetTracePinAssignment\n + * DBGMCU_CR TRACE_MODE LL_DBGMCU_SetTracePinAssignment + * @param PinAssignment This parameter can be one of the following values: + * @arg @ref LL_DBGMCU_TRACE_NONE + * @arg @ref LL_DBGMCU_TRACE_ASYNCH + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_SetTracePinAssignment(uint32_t PinAssignment) +{ + MODIFY_REG(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE, PinAssignment); +} + +/** + * @brief Get Trace pin assignment control + * @rmtoll DBGMCU_CR TRACE_IOEN LL_DBGMCU_GetTracePinAssignment\n + * DBGMCU_CR TRACE_MODE LL_DBGMCU_GetTracePinAssignment + * @retval Returned value can be one of the following values: + * @arg @ref LL_DBGMCU_TRACE_NONE + * @arg @ref LL_DBGMCU_TRACE_ASYNCH + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE1 + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE2 + * @arg @ref LL_DBGMCU_TRACE_SYNCH_SIZE4 + */ +__STATIC_INLINE uint32_t LL_DBGMCU_GetTracePinAssignment(void) +{ + return (uint32_t)(READ_BIT(DBGMCU->CR, DBGMCU_CR_TRACE_IOEN | DBGMCU_CR_TRACE_MODE)); +} + +/** + * @brief Freeze APB1 peripherals (group1 peripherals) + * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_FreezePeriph(uint32_t Periphs) +{ + SET_BIT(DBGMCU->APB1FZ, Periphs); +} + +/** + * @brief Unfreeze APB1 peripherals (group1 peripherals) + * @rmtoll DBGMCU_APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_LPTIM_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_I2C4_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN1_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * DBGMCU_APB1_FZ DBG_CAN3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM2_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM3_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM4_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM5_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM6_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM7_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM12_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM13_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_TIM14_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_LPTIM_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_RTC_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_WWDG_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_IWDG_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C1_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C2_STOP + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C3_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_I2C4_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN1_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN2_STOP (*) + * @arg @ref LL_DBGMCU_APB1_GRP1_CAN3_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB1_GRP1_UnFreezePeriph(uint32_t Periphs) +{ + CLEAR_BIT(DBGMCU->APB1FZ, Periphs); +} + +/** + * @brief Freeze APB2 peripherals + * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_FreezePeriph(uint32_t Periphs) +{ + SET_BIT(DBGMCU->APB2FZ, Periphs); +} + +/** + * @brief Unfreeze APB2 peripherals + * @rmtoll DBGMCU_APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM9_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM10_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * DBGMCU_APB2_FZ DBG_TIM11_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM1_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM8_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM9_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM10_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM11_STOP (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_DBGMCU_APB2_GRP1_UnFreezePeriph(uint32_t Periphs) +{ + CLEAR_BIT(DBGMCU->APB2FZ, Periphs); +} +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EF_FLASH FLASH + * @{ + */ + +/** + * @brief Set FLASH Latency + * @rmtoll FLASH_ACR LATENCY LL_FLASH_SetLatency + * @param Latency This parameter can be one of the following values: + * @arg @ref LL_FLASH_LATENCY_0 + * @arg @ref LL_FLASH_LATENCY_1 + * @arg @ref LL_FLASH_LATENCY_2 + * @arg @ref LL_FLASH_LATENCY_3 + * @arg @ref LL_FLASH_LATENCY_4 + * @arg @ref LL_FLASH_LATENCY_5 + * @arg @ref LL_FLASH_LATENCY_6 + * @arg @ref LL_FLASH_LATENCY_7 + * @arg @ref LL_FLASH_LATENCY_8 + * @arg @ref LL_FLASH_LATENCY_9 + * @arg @ref LL_FLASH_LATENCY_10 + * @arg @ref LL_FLASH_LATENCY_11 + * @arg @ref LL_FLASH_LATENCY_12 + * @arg @ref LL_FLASH_LATENCY_13 + * @arg @ref LL_FLASH_LATENCY_14 + * @arg @ref LL_FLASH_LATENCY_15 + * @retval None + */ +__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency) +{ + MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, Latency); +} + +/** + * @brief Get FLASH Latency + * @rmtoll FLASH_ACR LATENCY LL_FLASH_GetLatency + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_LATENCY_0 + * @arg @ref LL_FLASH_LATENCY_1 + * @arg @ref LL_FLASH_LATENCY_2 + * @arg @ref LL_FLASH_LATENCY_3 + * @arg @ref LL_FLASH_LATENCY_4 + * @arg @ref LL_FLASH_LATENCY_5 + * @arg @ref LL_FLASH_LATENCY_6 + * @arg @ref LL_FLASH_LATENCY_7 + * @arg @ref LL_FLASH_LATENCY_8 + * @arg @ref LL_FLASH_LATENCY_9 + * @arg @ref LL_FLASH_LATENCY_10 + * @arg @ref LL_FLASH_LATENCY_11 + * @arg @ref LL_FLASH_LATENCY_12 + * @arg @ref LL_FLASH_LATENCY_13 + * @arg @ref LL_FLASH_LATENCY_14 + * @arg @ref LL_FLASH_LATENCY_15 + */ +__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void) +{ + return (uint32_t)(READ_BIT(FLASH->ACR, FLASH_ACR_LATENCY)); +} + +/** + * @brief Enable Prefetch + * @rmtoll FLASH_ACR PRFTEN LL_FLASH_EnablePrefetch + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnablePrefetch(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); +} + +/** + * @brief Disable Prefetch + * @rmtoll FLASH_ACR PRFTEN LL_FLASH_DisablePrefetch + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisablePrefetch(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_PRFTEN); +} + +/** + * @brief Check if Prefetch buffer is enabled + * @rmtoll FLASH_ACR PRFTEN LL_FLASH_IsPrefetchEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_FLASH_IsPrefetchEnabled(void) +{ + return (READ_BIT(FLASH->ACR, FLASH_ACR_PRFTEN) == (FLASH_ACR_PRFTEN)); +} + +/** + * @brief Enable Instruction cache + * @rmtoll FLASH_ACR ICEN LL_FLASH_EnableInstCache + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableInstCache(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_ICEN); +} + +/** + * @brief Disable Instruction cache + * @rmtoll FLASH_ACR ICEN LL_FLASH_DisableInstCache + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableInstCache(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICEN); +} + +/** + * @brief Enable Data cache + * @rmtoll FLASH_ACR DCEN LL_FLASH_EnableDataCache + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableDataCache(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_DCEN); +} + +/** + * @brief Disable Data cache + * @rmtoll FLASH_ACR DCEN LL_FLASH_DisableDataCache + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableDataCache(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCEN); +} + +/** + * @brief Enable Instruction cache reset + * @note bit can be written only when the instruction cache is disabled + * @rmtoll FLASH_ACR ICRST LL_FLASH_EnableInstCacheReset + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableInstCacheReset(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_ICRST); +} + +/** + * @brief Disable Instruction cache reset + * @rmtoll FLASH_ACR ICRST LL_FLASH_DisableInstCacheReset + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableInstCacheReset(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_ICRST); +} + +/** + * @brief Enable Data cache reset + * @note bit can be written only when the data cache is disabled + * @rmtoll FLASH_ACR DCRST LL_FLASH_EnableDataCacheReset + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableDataCacheReset(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_DCRST); +} + +/** + * @brief Disable Data cache reset + * @rmtoll FLASH_ACR DCRST LL_FLASH_DisableDataCacheReset + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableDataCacheReset(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_DCRST); +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_SYSTEM_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h new file mode 100644 index 0000000..e07c232 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h @@ -0,0 +1,2521 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_usart.h + * @author MCD Application Team + * @brief Header file of USART LL module. + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_USART_H +#define __STM32F4xx_LL_USART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +#if defined (USART1) || defined (USART2) || defined (USART3) || defined (USART6) || defined (UART4) || defined (UART5) || defined (UART7) || defined (UART8) || defined (UART9) || defined (UART10) + +/** @defgroup USART_LL USART + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup USART_LL_Private_Constants USART Private Constants + * @{ + */ + +/* Defines used for the bit position in the register and perform offsets*/ +#define USART_POSITION_GTPR_GT USART_GTPR_GT_Pos +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup USART_LL_Private_Macros USART Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup USART_LL_ES_INIT USART Exported Init structures + * @{ + */ + +/** + * @brief LL USART Init Structure definition + */ +typedef struct +{ + uint32_t BaudRate; /*!< This field defines expected Usart communication baud rate. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetBaudRate().*/ + + uint32_t DataWidth; /*!< Specifies the number of data bits transmitted or received in a frame. + This parameter can be a value of @ref USART_LL_EC_DATAWIDTH. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetDataWidth().*/ + + uint32_t StopBits; /*!< Specifies the number of stop bits transmitted. + This parameter can be a value of @ref USART_LL_EC_STOPBITS. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetStopBitsLength().*/ + + uint32_t Parity; /*!< Specifies the parity mode. + This parameter can be a value of @ref USART_LL_EC_PARITY. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetParity().*/ + + uint32_t TransferDirection; /*!< Specifies whether the Receive and/or Transmit mode is enabled or disabled. + This parameter can be a value of @ref USART_LL_EC_DIRECTION. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetTransferDirection().*/ + + uint32_t HardwareFlowControl; /*!< Specifies whether the hardware flow control mode is enabled or disabled. + This parameter can be a value of @ref USART_LL_EC_HWCONTROL. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetHWFlowCtrl().*/ + + uint32_t OverSampling; /*!< Specifies whether USART oversampling mode is 16 or 8. + This parameter can be a value of @ref USART_LL_EC_OVERSAMPLING. + + This feature can be modified afterwards using unitary function @ref LL_USART_SetOverSampling().*/ + +} LL_USART_InitTypeDef; + +/** + * @brief LL USART Clock Init Structure definition + */ +typedef struct +{ + uint32_t ClockOutput; /*!< Specifies whether the USART clock is enabled or disabled. + This parameter can be a value of @ref USART_LL_EC_CLOCK. + + USART HW configuration can be modified afterwards using unitary functions + @ref LL_USART_EnableSCLKOutput() or @ref LL_USART_DisableSCLKOutput(). + For more details, refer to description of this function. */ + + uint32_t ClockPolarity; /*!< Specifies the steady state of the serial clock. + This parameter can be a value of @ref USART_LL_EC_POLARITY. + + USART HW configuration can be modified afterwards using unitary functions @ref LL_USART_SetClockPolarity(). + For more details, refer to description of this function. */ + + uint32_t ClockPhase; /*!< Specifies the clock transition on which the bit capture is made. + This parameter can be a value of @ref USART_LL_EC_PHASE. + + USART HW configuration can be modified afterwards using unitary functions @ref LL_USART_SetClockPhase(). + For more details, refer to description of this function. */ + + uint32_t LastBitClockPulse; /*!< Specifies whether the clock pulse corresponding to the last transmitted + data bit (MSB) has to be output on the SCLK pin in synchronous mode. + This parameter can be a value of @ref USART_LL_EC_LASTCLKPULSE. + + USART HW configuration can be modified afterwards using unitary functions @ref LL_USART_SetLastClkPulseOutput(). + For more details, refer to description of this function. */ + +} LL_USART_ClockInitTypeDef; + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup USART_LL_Exported_Constants USART Exported Constants + * @{ + */ + +/** @defgroup USART_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_USART_ReadReg function + * @{ + */ +#define LL_USART_SR_PE USART_SR_PE /*!< Parity error flag */ +#define LL_USART_SR_FE USART_SR_FE /*!< Framing error flag */ +#define LL_USART_SR_NE USART_SR_NE /*!< Noise detected flag */ +#define LL_USART_SR_ORE USART_SR_ORE /*!< Overrun error flag */ +#define LL_USART_SR_IDLE USART_SR_IDLE /*!< Idle line detected flag */ +#define LL_USART_SR_RXNE USART_SR_RXNE /*!< Read data register not empty flag */ +#define LL_USART_SR_TC USART_SR_TC /*!< Transmission complete flag */ +#define LL_USART_SR_TXE USART_SR_TXE /*!< Transmit data register empty flag */ +#define LL_USART_SR_LBD USART_SR_LBD /*!< LIN break detection flag */ +#define LL_USART_SR_CTS USART_SR_CTS /*!< CTS flag */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_USART_ReadReg and LL_USART_WriteReg functions + * @{ + */ +#define LL_USART_CR1_IDLEIE USART_CR1_IDLEIE /*!< IDLE interrupt enable */ +#define LL_USART_CR1_RXNEIE USART_CR1_RXNEIE /*!< Read data register not empty interrupt enable */ +#define LL_USART_CR1_TCIE USART_CR1_TCIE /*!< Transmission complete interrupt enable */ +#define LL_USART_CR1_TXEIE USART_CR1_TXEIE /*!< Transmit data register empty interrupt enable */ +#define LL_USART_CR1_PEIE USART_CR1_PEIE /*!< Parity error */ +#define LL_USART_CR2_LBDIE USART_CR2_LBDIE /*!< LIN break detection interrupt enable */ +#define LL_USART_CR3_EIE USART_CR3_EIE /*!< Error interrupt enable */ +#define LL_USART_CR3_CTSIE USART_CR3_CTSIE /*!< CTS interrupt enable */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_DIRECTION Communication Direction + * @{ + */ +#define LL_USART_DIRECTION_NONE 0x00000000U /*!< Transmitter and Receiver are disabled */ +#define LL_USART_DIRECTION_RX USART_CR1_RE /*!< Transmitter is disabled and Receiver is enabled */ +#define LL_USART_DIRECTION_TX USART_CR1_TE /*!< Transmitter is enabled and Receiver is disabled */ +#define LL_USART_DIRECTION_TX_RX (USART_CR1_TE |USART_CR1_RE) /*!< Transmitter and Receiver are enabled */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_PARITY Parity Control + * @{ + */ +#define LL_USART_PARITY_NONE 0x00000000U /*!< Parity control disabled */ +#define LL_USART_PARITY_EVEN USART_CR1_PCE /*!< Parity control enabled and Even Parity is selected */ +#define LL_USART_PARITY_ODD (USART_CR1_PCE | USART_CR1_PS) /*!< Parity control enabled and Odd Parity is selected */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_WAKEUP Wakeup + * @{ + */ +#define LL_USART_WAKEUP_IDLELINE 0x00000000U /*!< USART wake up from Mute mode on Idle Line */ +#define LL_USART_WAKEUP_ADDRESSMARK USART_CR1_WAKE /*!< USART wake up from Mute mode on Address Mark */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_DATAWIDTH Datawidth + * @{ + */ +#define LL_USART_DATAWIDTH_8B 0x00000000U /*!< 8 bits word length : Start bit, 8 data bits, n stop bits */ +#define LL_USART_DATAWIDTH_9B USART_CR1_M /*!< 9 bits word length : Start bit, 9 data bits, n stop bits */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_OVERSAMPLING Oversampling + * @{ + */ +#define LL_USART_OVERSAMPLING_16 0x00000000U /*!< Oversampling by 16 */ +#define LL_USART_OVERSAMPLING_8 USART_CR1_OVER8 /*!< Oversampling by 8 */ +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup USART_LL_EC_CLOCK Clock Signal + * @{ + */ + +#define LL_USART_CLOCK_DISABLE 0x00000000U /*!< Clock signal not provided */ +#define LL_USART_CLOCK_ENABLE USART_CR2_CLKEN /*!< Clock signal provided */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/** @defgroup USART_LL_EC_LASTCLKPULSE Last Clock Pulse + * @{ + */ +#define LL_USART_LASTCLKPULSE_NO_OUTPUT 0x00000000U /*!< The clock pulse of the last data bit is not output to the SCLK pin */ +#define LL_USART_LASTCLKPULSE_OUTPUT USART_CR2_LBCL /*!< The clock pulse of the last data bit is output to the SCLK pin */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_PHASE Clock Phase + * @{ + */ +#define LL_USART_PHASE_1EDGE 0x00000000U /*!< The first clock transition is the first data capture edge */ +#define LL_USART_PHASE_2EDGE USART_CR2_CPHA /*!< The second clock transition is the first data capture edge */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_POLARITY Clock Polarity + * @{ + */ +#define LL_USART_POLARITY_LOW 0x00000000U /*!< Steady low value on SCLK pin outside transmission window*/ +#define LL_USART_POLARITY_HIGH USART_CR2_CPOL /*!< Steady high value on SCLK pin outside transmission window */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_STOPBITS Stop Bits + * @{ + */ +#define LL_USART_STOPBITS_0_5 USART_CR2_STOP_0 /*!< 0.5 stop bit */ +#define LL_USART_STOPBITS_1 0x00000000U /*!< 1 stop bit */ +#define LL_USART_STOPBITS_1_5 (USART_CR2_STOP_0 | USART_CR2_STOP_1) /*!< 1.5 stop bits */ +#define LL_USART_STOPBITS_2 USART_CR2_STOP_1 /*!< 2 stop bits */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_HWCONTROL Hardware Control + * @{ + */ +#define LL_USART_HWCONTROL_NONE 0x00000000U /*!< CTS and RTS hardware flow control disabled */ +#define LL_USART_HWCONTROL_RTS USART_CR3_RTSE /*!< RTS output enabled, data is only requested when there is space in the receive buffer */ +#define LL_USART_HWCONTROL_CTS USART_CR3_CTSE /*!< CTS mode enabled, data is only transmitted when the nCTS input is asserted (tied to 0) */ +#define LL_USART_HWCONTROL_RTS_CTS (USART_CR3_RTSE | USART_CR3_CTSE) /*!< CTS and RTS hardware flow control enabled */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_IRDA_POWER IrDA Power + * @{ + */ +#define LL_USART_IRDA_POWER_NORMAL 0x00000000U /*!< IrDA normal power mode */ +#define LL_USART_IRDA_POWER_LOW USART_CR3_IRLP /*!< IrDA low power mode */ +/** + * @} + */ + +/** @defgroup USART_LL_EC_LINBREAK_DETECT LIN Break Detection Length + * @{ + */ +#define LL_USART_LINBREAK_DETECT_10B 0x00000000U /*!< 10-bit break detection method selected */ +#define LL_USART_LINBREAK_DETECT_11B USART_CR2_LBDL /*!< 11-bit break detection method selected */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup USART_LL_Exported_Macros USART Exported Macros + * @{ + */ + +/** @defgroup USART_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in USART register + * @param __INSTANCE__ USART Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_USART_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in USART register + * @param __INSTANCE__ USART Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_USART_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup USART_LL_EM_Exported_Macros_Helper Exported_Macros_Helper + * @{ + */ + +/** + * @brief Compute USARTDIV value according to Peripheral Clock and + * expected Baud Rate in 8 bits sampling mode (32 bits value of USARTDIV is returned) + * @param __PERIPHCLK__ Peripheral Clock frequency used for USART instance + * @param __BAUDRATE__ Baud rate value to achieve + * @retval USARTDIV value to be used for BRR register filling in OverSampling_8 case + */ +#define __LL_USART_DIV_SAMPLING8_100(__PERIPHCLK__, __BAUDRATE__) ((uint32_t)((((uint64_t)(__PERIPHCLK__))*25)/(2*((uint64_t)(__BAUDRATE__))))) +#define __LL_USART_DIVMANT_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) (__LL_USART_DIV_SAMPLING8_100((__PERIPHCLK__), (__BAUDRATE__))/100) +#define __LL_USART_DIVFRAQ_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__LL_USART_DIV_SAMPLING8_100((__PERIPHCLK__), (__BAUDRATE__)) - (__LL_USART_DIVMANT_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) * 100)) * 8)\ + + 50) / 100) +/* UART BRR = mantissa + overflow + fraction + = (UART DIVMANT << 4) + ((UART DIVFRAQ & 0xF8) << 1) + (UART DIVFRAQ & 0x07) */ +#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) (((__LL_USART_DIVMANT_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) << 4) + \ + ((__LL_USART_DIVFRAQ_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) & 0xF8) << 1)) + \ + (__LL_USART_DIVFRAQ_SAMPLING8((__PERIPHCLK__), (__BAUDRATE__)) & 0x07)) + +/** + * @brief Compute USARTDIV value according to Peripheral Clock and + * expected Baud Rate in 16 bits sampling mode (32 bits value of USARTDIV is returned) + * @param __PERIPHCLK__ Peripheral Clock frequency used for USART instance + * @param __BAUDRATE__ Baud rate value to achieve + * @retval USARTDIV value to be used for BRR register filling in OverSampling_16 case + */ +#define __LL_USART_DIV_SAMPLING16_100(__PERIPHCLK__, __BAUDRATE__) ((uint32_t)((((uint64_t)(__PERIPHCLK__))*25)/(4*((uint64_t)(__BAUDRATE__))))) +#define __LL_USART_DIVMANT_SAMPLING16(__PERIPHCLK__, __BAUDRATE__) (__LL_USART_DIV_SAMPLING16_100((__PERIPHCLK__), (__BAUDRATE__))/100) +#define __LL_USART_DIVFRAQ_SAMPLING16(__PERIPHCLK__, __BAUDRATE__) ((((__LL_USART_DIV_SAMPLING16_100((__PERIPHCLK__), (__BAUDRATE__)) - (__LL_USART_DIVMANT_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) * 100)) * 16)\ + + 50) / 100) +/* USART BRR = mantissa + overflow + fraction + = (USART DIVMANT << 4) + (USART DIVFRAQ & 0xF0) + (USART DIVFRAQ & 0x0F) */ +#define __LL_USART_DIV_SAMPLING16(__PERIPHCLK__, __BAUDRATE__) (((__LL_USART_DIVMANT_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) << 4) + \ + (__LL_USART_DIVFRAQ_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) & 0xF0)) + \ + (__LL_USART_DIVFRAQ_SAMPLING16((__PERIPHCLK__), (__BAUDRATE__)) & 0x0F)) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup USART_LL_Exported_Functions USART Exported Functions + * @{ + */ + +/** @defgroup USART_LL_EF_Configuration Configuration functions + * @{ + */ + +/** + * @brief USART Enable + * @rmtoll CR1 UE LL_USART_Enable + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_Enable(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_UE); +} + +/** + * @brief USART Disable (all USART prescalers and outputs are disabled) + * @note When USART is disabled, USART prescalers and outputs are stopped immediately, + * and current operations are discarded. The configuration of the USART is kept, but all the status + * flags, in the USARTx_SR are set to their default values. + * @rmtoll CR1 UE LL_USART_Disable + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_Disable(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_UE); +} + +/** + * @brief Indicate if USART is enabled + * @rmtoll CR1 UE LL_USART_IsEnabled + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabled(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_UE) == (USART_CR1_UE)); +} + +/** + * @brief Receiver Enable (Receiver is enabled and begins searching for a start bit) + * @rmtoll CR1 RE LL_USART_EnableDirectionRx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDirectionRx(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_RE); +} + +/** + * @brief Receiver Disable + * @rmtoll CR1 RE LL_USART_DisableDirectionRx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDirectionRx(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_RE); +} + +/** + * @brief Transmitter Enable + * @rmtoll CR1 TE LL_USART_EnableDirectionTx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDirectionTx(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_TE); +} + +/** + * @brief Transmitter Disable + * @rmtoll CR1 TE LL_USART_DisableDirectionTx + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDirectionTx(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_TE); +} + +/** + * @brief Configure simultaneously enabled/disabled states + * of Transmitter and Receiver + * @rmtoll CR1 RE LL_USART_SetTransferDirection\n + * CR1 TE LL_USART_SetTransferDirection + * @param USARTx USART Instance + * @param TransferDirection This parameter can be one of the following values: + * @arg @ref LL_USART_DIRECTION_NONE + * @arg @ref LL_USART_DIRECTION_RX + * @arg @ref LL_USART_DIRECTION_TX + * @arg @ref LL_USART_DIRECTION_TX_RX + * @retval None + */ +__STATIC_INLINE void LL_USART_SetTransferDirection(USART_TypeDef *USARTx, uint32_t TransferDirection) +{ + ATOMIC_MODIFY_REG(USARTx->CR1, USART_CR1_RE | USART_CR1_TE, TransferDirection); +} + +/** + * @brief Return enabled/disabled states of Transmitter and Receiver + * @rmtoll CR1 RE LL_USART_GetTransferDirection\n + * CR1 TE LL_USART_GetTransferDirection + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_DIRECTION_NONE + * @arg @ref LL_USART_DIRECTION_RX + * @arg @ref LL_USART_DIRECTION_TX + * @arg @ref LL_USART_DIRECTION_TX_RX + */ +__STATIC_INLINE uint32_t LL_USART_GetTransferDirection(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_RE | USART_CR1_TE)); +} + +/** + * @brief Configure Parity (enabled/disabled and parity mode if enabled). + * @note This function selects if hardware parity control (generation and detection) is enabled or disabled. + * When the parity control is enabled (Odd or Even), computed parity bit is inserted at the MSB position + * (9th or 8th bit depending on data width) and parity is checked on the received data. + * @rmtoll CR1 PS LL_USART_SetParity\n + * CR1 PCE LL_USART_SetParity + * @param USARTx USART Instance + * @param Parity This parameter can be one of the following values: + * @arg @ref LL_USART_PARITY_NONE + * @arg @ref LL_USART_PARITY_EVEN + * @arg @ref LL_USART_PARITY_ODD + * @retval None + */ +__STATIC_INLINE void LL_USART_SetParity(USART_TypeDef *USARTx, uint32_t Parity) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE, Parity); +} + +/** + * @brief Return Parity configuration (enabled/disabled and parity mode if enabled) + * @rmtoll CR1 PS LL_USART_GetParity\n + * CR1 PCE LL_USART_GetParity + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_PARITY_NONE + * @arg @ref LL_USART_PARITY_EVEN + * @arg @ref LL_USART_PARITY_ODD + */ +__STATIC_INLINE uint32_t LL_USART_GetParity(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE)); +} + +/** + * @brief Set Receiver Wake Up method from Mute mode. + * @rmtoll CR1 WAKE LL_USART_SetWakeUpMethod + * @param USARTx USART Instance + * @param Method This parameter can be one of the following values: + * @arg @ref LL_USART_WAKEUP_IDLELINE + * @arg @ref LL_USART_WAKEUP_ADDRESSMARK + * @retval None + */ +__STATIC_INLINE void LL_USART_SetWakeUpMethod(USART_TypeDef *USARTx, uint32_t Method) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_WAKE, Method); +} + +/** + * @brief Return Receiver Wake Up method from Mute mode + * @rmtoll CR1 WAKE LL_USART_GetWakeUpMethod + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_WAKEUP_IDLELINE + * @arg @ref LL_USART_WAKEUP_ADDRESSMARK + */ +__STATIC_INLINE uint32_t LL_USART_GetWakeUpMethod(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_WAKE)); +} + +/** + * @brief Set Word length (i.e. nb of data bits, excluding start and stop bits) + * @rmtoll CR1 M LL_USART_SetDataWidth + * @param USARTx USART Instance + * @param DataWidth This parameter can be one of the following values: + * @arg @ref LL_USART_DATAWIDTH_8B + * @arg @ref LL_USART_DATAWIDTH_9B + * @retval None + */ +__STATIC_INLINE void LL_USART_SetDataWidth(USART_TypeDef *USARTx, uint32_t DataWidth) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_M, DataWidth); +} + +/** + * @brief Return Word length (i.e. nb of data bits, excluding start and stop bits) + * @rmtoll CR1 M LL_USART_GetDataWidth + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_DATAWIDTH_8B + * @arg @ref LL_USART_DATAWIDTH_9B + */ +__STATIC_INLINE uint32_t LL_USART_GetDataWidth(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_M)); +} + +/** + * @brief Set Oversampling to 8-bit or 16-bit mode + * @rmtoll CR1 OVER8 LL_USART_SetOverSampling + * @param USARTx USART Instance + * @param OverSampling This parameter can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + * @retval None + */ +__STATIC_INLINE void LL_USART_SetOverSampling(USART_TypeDef *USARTx, uint32_t OverSampling) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_OVER8, OverSampling); +} + +/** + * @brief Return Oversampling mode + * @rmtoll CR1 OVER8 LL_USART_GetOverSampling + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + */ +__STATIC_INLINE uint32_t LL_USART_GetOverSampling(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR1, USART_CR1_OVER8)); +} + +/** + * @brief Configure if Clock pulse of the last data bit is output to the SCLK pin or not + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 LBCL LL_USART_SetLastClkPulseOutput + * @param USARTx USART Instance + * @param LastBitClockPulse This parameter can be one of the following values: + * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT + * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT + * @retval None + */ +__STATIC_INLINE void LL_USART_SetLastClkPulseOutput(USART_TypeDef *USARTx, uint32_t LastBitClockPulse) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_LBCL, LastBitClockPulse); +} + +/** + * @brief Retrieve Clock pulse of the last data bit output configuration + * (Last bit Clock pulse output to the SCLK pin or not) + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 LBCL LL_USART_GetLastClkPulseOutput + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT + * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT + */ +__STATIC_INLINE uint32_t LL_USART_GetLastClkPulseOutput(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_LBCL)); +} + +/** + * @brief Select the phase of the clock output on the SCLK pin in synchronous mode + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPHA LL_USART_SetClockPhase + * @param USARTx USART Instance + * @param ClockPhase This parameter can be one of the following values: + * @arg @ref LL_USART_PHASE_1EDGE + * @arg @ref LL_USART_PHASE_2EDGE + * @retval None + */ +__STATIC_INLINE void LL_USART_SetClockPhase(USART_TypeDef *USARTx, uint32_t ClockPhase) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_CPHA, ClockPhase); +} + +/** + * @brief Return phase of the clock output on the SCLK pin in synchronous mode + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPHA LL_USART_GetClockPhase + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_PHASE_1EDGE + * @arg @ref LL_USART_PHASE_2EDGE + */ +__STATIC_INLINE uint32_t LL_USART_GetClockPhase(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_CPHA)); +} + +/** + * @brief Select the polarity of the clock output on the SCLK pin in synchronous mode + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPOL LL_USART_SetClockPolarity + * @param USARTx USART Instance + * @param ClockPolarity This parameter can be one of the following values: + * @arg @ref LL_USART_POLARITY_LOW + * @arg @ref LL_USART_POLARITY_HIGH + * @retval None + */ +__STATIC_INLINE void LL_USART_SetClockPolarity(USART_TypeDef *USARTx, uint32_t ClockPolarity) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_CPOL, ClockPolarity); +} + +/** + * @brief Return polarity of the clock output on the SCLK pin in synchronous mode + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CPOL LL_USART_GetClockPolarity + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_POLARITY_LOW + * @arg @ref LL_USART_POLARITY_HIGH + */ +__STATIC_INLINE uint32_t LL_USART_GetClockPolarity(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_CPOL)); +} + +/** + * @brief Configure Clock signal format (Phase Polarity and choice about output of last bit clock pulse) + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clock Phase configuration using @ref LL_USART_SetClockPhase() function + * - Clock Polarity configuration using @ref LL_USART_SetClockPolarity() function + * - Output of Last bit Clock pulse configuration using @ref LL_USART_SetLastClkPulseOutput() function + * @rmtoll CR2 CPHA LL_USART_ConfigClock\n + * CR2 CPOL LL_USART_ConfigClock\n + * CR2 LBCL LL_USART_ConfigClock + * @param USARTx USART Instance + * @param Phase This parameter can be one of the following values: + * @arg @ref LL_USART_PHASE_1EDGE + * @arg @ref LL_USART_PHASE_2EDGE + * @param Polarity This parameter can be one of the following values: + * @arg @ref LL_USART_POLARITY_LOW + * @arg @ref LL_USART_POLARITY_HIGH + * @param LBCPOutput This parameter can be one of the following values: + * @arg @ref LL_USART_LASTCLKPULSE_NO_OUTPUT + * @arg @ref LL_USART_LASTCLKPULSE_OUTPUT + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigClock(USART_TypeDef *USARTx, uint32_t Phase, uint32_t Polarity, uint32_t LBCPOutput) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_LBCL, Phase | Polarity | LBCPOutput); +} + +/** + * @brief Enable Clock output on SCLK pin + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CLKEN LL_USART_EnableSCLKOutput + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableSCLKOutput(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR2, USART_CR2_CLKEN); +} + +/** + * @brief Disable Clock output on SCLK pin + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CLKEN LL_USART_DisableSCLKOutput + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableSCLKOutput(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR2, USART_CR2_CLKEN); +} + +/** + * @brief Indicate if Clock output on SCLK pin is enabled + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @rmtoll CR2 CLKEN LL_USART_IsEnabledSCLKOutput + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledSCLKOutput(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR2, USART_CR2_CLKEN) == (USART_CR2_CLKEN)); +} + +/** + * @brief Set the length of the stop bits + * @rmtoll CR2 STOP LL_USART_SetStopBitsLength + * @param USARTx USART Instance + * @param StopBits This parameter can be one of the following values: + * @arg @ref LL_USART_STOPBITS_0_5 + * @arg @ref LL_USART_STOPBITS_1 + * @arg @ref LL_USART_STOPBITS_1_5 + * @arg @ref LL_USART_STOPBITS_2 + * @retval None + */ +__STATIC_INLINE void LL_USART_SetStopBitsLength(USART_TypeDef *USARTx, uint32_t StopBits) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_STOP, StopBits); +} + +/** + * @brief Retrieve the length of the stop bits + * @rmtoll CR2 STOP LL_USART_GetStopBitsLength + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_STOPBITS_0_5 + * @arg @ref LL_USART_STOPBITS_1 + * @arg @ref LL_USART_STOPBITS_1_5 + * @arg @ref LL_USART_STOPBITS_2 + */ +__STATIC_INLINE uint32_t LL_USART_GetStopBitsLength(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_STOP)); +} + +/** + * @brief Configure Character frame format (Datawidth, Parity control, Stop Bits) + * @note Call of this function is equivalent to following function call sequence : + * - Data Width configuration using @ref LL_USART_SetDataWidth() function + * - Parity Control and mode configuration using @ref LL_USART_SetParity() function + * - Stop bits configuration using @ref LL_USART_SetStopBitsLength() function + * @rmtoll CR1 PS LL_USART_ConfigCharacter\n + * CR1 PCE LL_USART_ConfigCharacter\n + * CR1 M LL_USART_ConfigCharacter\n + * CR2 STOP LL_USART_ConfigCharacter + * @param USARTx USART Instance + * @param DataWidth This parameter can be one of the following values: + * @arg @ref LL_USART_DATAWIDTH_8B + * @arg @ref LL_USART_DATAWIDTH_9B + * @param Parity This parameter can be one of the following values: + * @arg @ref LL_USART_PARITY_NONE + * @arg @ref LL_USART_PARITY_EVEN + * @arg @ref LL_USART_PARITY_ODD + * @param StopBits This parameter can be one of the following values: + * @arg @ref LL_USART_STOPBITS_0_5 + * @arg @ref LL_USART_STOPBITS_1 + * @arg @ref LL_USART_STOPBITS_1_5 + * @arg @ref LL_USART_STOPBITS_2 + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigCharacter(USART_TypeDef *USARTx, uint32_t DataWidth, uint32_t Parity, + uint32_t StopBits) +{ + MODIFY_REG(USARTx->CR1, USART_CR1_PS | USART_CR1_PCE | USART_CR1_M, Parity | DataWidth); + MODIFY_REG(USARTx->CR2, USART_CR2_STOP, StopBits); +} + +/** + * @brief Set Address of the USART node. + * @note This is used in multiprocessor communication during Mute mode or Stop mode, + * for wake up with address mark detection. + * @rmtoll CR2 ADD LL_USART_SetNodeAddress + * @param USARTx USART Instance + * @param NodeAddress 4 bit Address of the USART node. + * @retval None + */ +__STATIC_INLINE void LL_USART_SetNodeAddress(USART_TypeDef *USARTx, uint32_t NodeAddress) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_ADD, (NodeAddress & USART_CR2_ADD)); +} + +/** + * @brief Return 4 bit Address of the USART node as set in ADD field of CR2. + * @note only 4bits (b3-b0) of returned value are relevant (b31-b4 are not relevant) + * @rmtoll CR2 ADD LL_USART_GetNodeAddress + * @param USARTx USART Instance + * @retval Address of the USART node (Value between Min_Data=0 and Max_Data=255) + */ +__STATIC_INLINE uint32_t LL_USART_GetNodeAddress(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_ADD)); +} + +/** + * @brief Enable RTS HW Flow Control + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_EnableRTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableRTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_RTSE); +} + +/** + * @brief Disable RTS HW Flow Control + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_DisableRTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableRTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_RTSE); +} + +/** + * @brief Enable CTS HW Flow Control + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSE LL_USART_EnableCTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableCTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_CTSE); +} + +/** + * @brief Disable CTS HW Flow Control + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSE LL_USART_DisableCTSHWFlowCtrl + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableCTSHWFlowCtrl(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_CTSE); +} + +/** + * @brief Configure HW Flow Control mode (both CTS and RTS) + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_SetHWFlowCtrl\n + * CR3 CTSE LL_USART_SetHWFlowCtrl + * @param USARTx USART Instance + * @param HardwareFlowControl This parameter can be one of the following values: + * @arg @ref LL_USART_HWCONTROL_NONE + * @arg @ref LL_USART_HWCONTROL_RTS + * @arg @ref LL_USART_HWCONTROL_CTS + * @arg @ref LL_USART_HWCONTROL_RTS_CTS + * @retval None + */ +__STATIC_INLINE void LL_USART_SetHWFlowCtrl(USART_TypeDef *USARTx, uint32_t HardwareFlowControl) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_RTSE | USART_CR3_CTSE, HardwareFlowControl); +} + +/** + * @brief Return HW Flow Control configuration (both CTS and RTS) + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 RTSE LL_USART_GetHWFlowCtrl\n + * CR3 CTSE LL_USART_GetHWFlowCtrl + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_HWCONTROL_NONE + * @arg @ref LL_USART_HWCONTROL_RTS + * @arg @ref LL_USART_HWCONTROL_CTS + * @arg @ref LL_USART_HWCONTROL_RTS_CTS + */ +__STATIC_INLINE uint32_t LL_USART_GetHWFlowCtrl(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_RTSE | USART_CR3_CTSE)); +} + +/** + * @brief Enable One bit sampling method + * @rmtoll CR3 ONEBIT LL_USART_EnableOneBitSamp + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableOneBitSamp(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_ONEBIT); +} + +/** + * @brief Disable One bit sampling method + * @rmtoll CR3 ONEBIT LL_USART_DisableOneBitSamp + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableOneBitSamp(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_ONEBIT); +} + +/** + * @brief Indicate if One bit sampling method is enabled + * @rmtoll CR3 ONEBIT LL_USART_IsEnabledOneBitSamp + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledOneBitSamp(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_ONEBIT) == (USART_CR3_ONEBIT)); +} + +/** + * @brief Configure USART BRR register for achieving expected Baud Rate value. + * @note Compute and set USARTDIV value in BRR Register (full BRR content) + * according to used Peripheral Clock, Oversampling mode, and expected Baud Rate values + * @note Peripheral clock and Baud rate values provided as function parameters should be valid + * (Baud rate value != 0) + * @rmtoll BRR BRR LL_USART_SetBaudRate + * @param USARTx USART Instance + * @param PeriphClk Peripheral Clock + * @param OverSampling This parameter can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + * @param BaudRate Baud Rate + * @retval None + */ +__STATIC_INLINE void LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, + uint32_t BaudRate) +{ + if (OverSampling == LL_USART_OVERSAMPLING_8) + { + USARTx->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING8(PeriphClk, BaudRate)); + } + else + { + USARTx->BRR = (uint16_t)(__LL_USART_DIV_SAMPLING16(PeriphClk, BaudRate)); + } +} + +/** + * @brief Return current Baud Rate value, according to USARTDIV present in BRR register + * (full BRR content), and to used Peripheral Clock and Oversampling mode values + * @note In case of non-initialized or invalid value stored in BRR register, value 0 will be returned. + * @rmtoll BRR BRR LL_USART_GetBaudRate + * @param USARTx USART Instance + * @param PeriphClk Peripheral Clock + * @param OverSampling This parameter can be one of the following values: + * @arg @ref LL_USART_OVERSAMPLING_16 + * @arg @ref LL_USART_OVERSAMPLING_8 + * @retval Baud Rate + */ +__STATIC_INLINE uint32_t LL_USART_GetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling) +{ + uint32_t usartdiv = 0x0U; + uint32_t brrresult = 0x0U; + + usartdiv = USARTx->BRR; + + if (OverSampling == LL_USART_OVERSAMPLING_8) + { + if ((usartdiv & 0xFFF7U) != 0U) + { + usartdiv = (uint16_t)((usartdiv & 0xFFF0U) | ((usartdiv & 0x0007U) << 1U)) ; + brrresult = (PeriphClk * 2U) / usartdiv; + } + } + else + { + if ((usartdiv & 0xFFFFU) != 0U) + { + brrresult = PeriphClk / usartdiv; + } + } + return (brrresult); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_IRDA Configuration functions related to Irda feature + * @{ + */ + +/** + * @brief Enable IrDA mode + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IREN LL_USART_EnableIrda + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIrda(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_IREN); +} + +/** + * @brief Disable IrDA mode + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IREN LL_USART_DisableIrda + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIrda(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_IREN); +} + +/** + * @brief Indicate if IrDA mode is enabled + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IREN LL_USART_IsEnabledIrda + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIrda(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_IREN) == (USART_CR3_IREN)); +} + +/** + * @brief Configure IrDA Power Mode (Normal or Low Power) + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IRLP LL_USART_SetIrdaPowerMode + * @param USARTx USART Instance + * @param PowerMode This parameter can be one of the following values: + * @arg @ref LL_USART_IRDA_POWER_NORMAL + * @arg @ref LL_USART_IRDA_POWER_LOW + * @retval None + */ +__STATIC_INLINE void LL_USART_SetIrdaPowerMode(USART_TypeDef *USARTx, uint32_t PowerMode) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_IRLP, PowerMode); +} + +/** + * @brief Retrieve IrDA Power Mode configuration (Normal or Low Power) + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll CR3 IRLP LL_USART_GetIrdaPowerMode + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_IRDA_POWER_NORMAL + * @arg @ref LL_USART_PHASE_2EDGE + */ +__STATIC_INLINE uint32_t LL_USART_GetIrdaPowerMode(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_IRLP)); +} + +/** + * @brief Set Irda prescaler value, used for dividing the USART clock source + * to achieve the Irda Low Power frequency (8 bits value) + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_SetIrdaPrescaler + * @param USARTx USART Instance + * @param PrescalerValue Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_USART_SetIrdaPrescaler(USART_TypeDef *USARTx, uint32_t PrescalerValue) +{ + MODIFY_REG(USARTx->GTPR, USART_GTPR_PSC, PrescalerValue); +} + +/** + * @brief Return Irda prescaler value, used for dividing the USART clock source + * to achieve the Irda Low Power frequency (8 bits value) + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_GetIrdaPrescaler + * @param USARTx USART Instance + * @retval Irda prescaler value (Value between Min_Data=0x00 and Max_Data=0xFF) + */ +__STATIC_INLINE uint32_t LL_USART_GetIrdaPrescaler(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_PSC)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_Smartcard Configuration functions related to Smartcard feature + * @{ + */ + +/** + * @brief Enable Smartcard NACK transmission + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 NACK LL_USART_EnableSmartcardNACK + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableSmartcardNACK(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_NACK); +} + +/** + * @brief Disable Smartcard NACK transmission + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 NACK LL_USART_DisableSmartcardNACK + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableSmartcardNACK(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_NACK); +} + +/** + * @brief Indicate if Smartcard NACK transmission is enabled + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 NACK LL_USART_IsEnabledSmartcardNACK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledSmartcardNACK(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_NACK) == (USART_CR3_NACK)); +} + +/** + * @brief Enable Smartcard mode + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 SCEN LL_USART_EnableSmartcard + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableSmartcard(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_SCEN); +} + +/** + * @brief Disable Smartcard mode + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 SCEN LL_USART_DisableSmartcard + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableSmartcard(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_SCEN); +} + +/** + * @brief Indicate if Smartcard mode is enabled + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll CR3 SCEN LL_USART_IsEnabledSmartcard + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledSmartcard(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_SCEN) == (USART_CR3_SCEN)); +} + +/** + * @brief Set Smartcard prescaler value, used for dividing the USART clock + * source to provide the SMARTCARD Clock (5 bits value) + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_SetSmartcardPrescaler + * @param USARTx USART Instance + * @param PrescalerValue Value between Min_Data=0 and Max_Data=31 + * @retval None + */ +__STATIC_INLINE void LL_USART_SetSmartcardPrescaler(USART_TypeDef *USARTx, uint32_t PrescalerValue) +{ + MODIFY_REG(USARTx->GTPR, USART_GTPR_PSC, PrescalerValue); +} + +/** + * @brief Return Smartcard prescaler value, used for dividing the USART clock + * source to provide the SMARTCARD Clock (5 bits value) + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR PSC LL_USART_GetSmartcardPrescaler + * @param USARTx USART Instance + * @retval Smartcard prescaler value (Value between Min_Data=0 and Max_Data=31) + */ +__STATIC_INLINE uint32_t LL_USART_GetSmartcardPrescaler(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_PSC)); +} + +/** + * @brief Set Smartcard Guard time value, expressed in nb of baud clocks periods + * (GT[7:0] bits : Guard time value) + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR GT LL_USART_SetSmartcardGuardTime + * @param USARTx USART Instance + * @param GuardTime Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_USART_SetSmartcardGuardTime(USART_TypeDef *USARTx, uint32_t GuardTime) +{ + MODIFY_REG(USARTx->GTPR, USART_GTPR_GT, GuardTime << USART_POSITION_GTPR_GT); +} + +/** + * @brief Return Smartcard Guard time value, expressed in nb of baud clocks periods + * (GT[7:0] bits : Guard time value) + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @rmtoll GTPR GT LL_USART_GetSmartcardGuardTime + * @param USARTx USART Instance + * @retval Smartcard Guard time value (Value between Min_Data=0x00 and Max_Data=0xFF) + */ +__STATIC_INLINE uint32_t LL_USART_GetSmartcardGuardTime(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->GTPR, USART_GTPR_GT) >> USART_POSITION_GTPR_GT); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_HalfDuplex Configuration functions related to Half Duplex feature + * @{ + */ + +/** + * @brief Enable Single Wire Half-Duplex mode + * @note Macro @ref IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @rmtoll CR3 HDSEL LL_USART_EnableHalfDuplex + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableHalfDuplex(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_HDSEL); +} + +/** + * @brief Disable Single Wire Half-Duplex mode + * @note Macro @ref IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @rmtoll CR3 HDSEL LL_USART_DisableHalfDuplex + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableHalfDuplex(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_HDSEL); +} + +/** + * @brief Indicate if Single Wire Half-Duplex mode is enabled + * @note Macro @ref IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @rmtoll CR3 HDSEL LL_USART_IsEnabledHalfDuplex + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledHalfDuplex(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_HDSEL) == (USART_CR3_HDSEL)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Configuration_LIN Configuration functions related to LIN feature + * @{ + */ + +/** + * @brief Set LIN Break Detection Length + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDL LL_USART_SetLINBrkDetectionLen + * @param USARTx USART Instance + * @param LINBDLength This parameter can be one of the following values: + * @arg @ref LL_USART_LINBREAK_DETECT_10B + * @arg @ref LL_USART_LINBREAK_DETECT_11B + * @retval None + */ +__STATIC_INLINE void LL_USART_SetLINBrkDetectionLen(USART_TypeDef *USARTx, uint32_t LINBDLength) +{ + MODIFY_REG(USARTx->CR2, USART_CR2_LBDL, LINBDLength); +} + +/** + * @brief Return LIN Break Detection Length + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDL LL_USART_GetLINBrkDetectionLen + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_LINBREAK_DETECT_10B + * @arg @ref LL_USART_LINBREAK_DETECT_11B + */ +__STATIC_INLINE uint32_t LL_USART_GetLINBrkDetectionLen(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR2, USART_CR2_LBDL)); +} + +/** + * @brief Enable LIN mode + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LINEN LL_USART_EnableLIN + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableLIN(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR2, USART_CR2_LINEN); +} + +/** + * @brief Disable LIN mode + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LINEN LL_USART_DisableLIN + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableLIN(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR2, USART_CR2_LINEN); +} + +/** + * @brief Indicate if LIN mode is enabled + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LINEN LL_USART_IsEnabledLIN + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledLIN(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR2, USART_CR2_LINEN) == (USART_CR2_LINEN)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_AdvancedConfiguration Advanced Configurations services + * @{ + */ + +/** + * @brief Perform basic configuration of USART for enabling use in Asynchronous Mode (UART) + * @note In UART mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - CLKEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * @note Other remaining configurations items related to Asynchronous Mode + * (as Baud Rate, Word length, Parity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigAsyncMode\n + * CR2 CLKEN LL_USART_ConfigAsyncMode\n + * CR3 SCEN LL_USART_ConfigAsyncMode\n + * CR3 IREN LL_USART_ConfigAsyncMode\n + * CR3 HDSEL LL_USART_ConfigAsyncMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigAsyncMode(USART_TypeDef *USARTx) +{ + /* In Asynchronous mode, the following bits must be kept cleared: + - LINEN, CLKEN bits in the USART_CR2 register, + - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Synchronous Mode + * @note In Synchronous mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also sets the USART in Synchronous mode. + * @note Macro @ref IS_USART_INSTANCE(USARTx) can be used to check whether or not + * Synchronous mode is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Set CLKEN in CR2 using @ref LL_USART_EnableSCLKOutput() function + * @note Other remaining configurations items related to Synchronous Mode + * (as Baud Rate, Word length, Parity, Clock Polarity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigSyncMode\n + * CR2 CLKEN LL_USART_ConfigSyncMode\n + * CR3 SCEN LL_USART_ConfigSyncMode\n + * CR3 IREN LL_USART_ConfigSyncMode\n + * CR3 HDSEL LL_USART_ConfigSyncMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigSyncMode(USART_TypeDef *USARTx) +{ + /* In Synchronous mode, the following bits must be kept cleared: + - LINEN bit in the USART_CR2 register, + - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); + /* set the UART/USART in Synchronous mode */ + SET_BIT(USARTx->CR2, USART_CR2_CLKEN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in LIN Mode + * @note In LIN mode, the following bits must be kept cleared: + * - STOP and CLKEN bits in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also set the UART/USART in LIN mode. + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear STOP in CR2 using @ref LL_USART_SetStopBitsLength() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Set LINEN in CR2 using @ref LL_USART_EnableLIN() function + * @note Other remaining configurations items related to LIN Mode + * (as Baud Rate, Word length, LIN Break Detection Length, ...) should be set using + * dedicated functions + * @rmtoll CR2 CLKEN LL_USART_ConfigLINMode\n + * CR2 STOP LL_USART_ConfigLINMode\n + * CR2 LINEN LL_USART_ConfigLINMode\n + * CR3 IREN LL_USART_ConfigLINMode\n + * CR3 SCEN LL_USART_ConfigLINMode\n + * CR3 HDSEL LL_USART_ConfigLINMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigLINMode(USART_TypeDef *USARTx) +{ + /* In LIN mode, the following bits must be kept cleared: + - STOP and CLKEN bits in the USART_CR2 register, + - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_CLKEN | USART_CR2_STOP)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_SCEN | USART_CR3_HDSEL)); + /* Set the UART/USART in LIN mode */ + SET_BIT(USARTx->CR2, USART_CR2_LINEN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Half Duplex Mode + * @note In Half Duplex mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - CLKEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * This function also sets the UART/USART in Half Duplex mode. + * @note Macro @ref IS_UART_HALFDUPLEX_INSTANCE(USARTx) can be used to check whether or not + * Half-Duplex mode is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Set HDSEL in CR3 using @ref LL_USART_EnableHalfDuplex() function + * @note Other remaining configurations items related to Half Duplex Mode + * (as Baud Rate, Word length, Parity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigHalfDuplexMode\n + * CR2 CLKEN LL_USART_ConfigHalfDuplexMode\n + * CR3 HDSEL LL_USART_ConfigHalfDuplexMode\n + * CR3 SCEN LL_USART_ConfigHalfDuplexMode\n + * CR3 IREN LL_USART_ConfigHalfDuplexMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigHalfDuplexMode(USART_TypeDef *USARTx) +{ + /* In Half Duplex mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN)); + /* set the UART/USART in Half Duplex mode */ + SET_BIT(USARTx->CR3, USART_CR3_HDSEL); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Smartcard Mode + * @note In Smartcard mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also configures Stop bits to 1.5 bits and + * sets the USART in Smartcard mode (SCEN bit). + * Clock Output is also enabled (CLKEN). + * @note Macro @ref IS_SMARTCARD_INSTANCE(USARTx) can be used to check whether or not + * Smartcard feature is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Configure STOP in CR2 using @ref LL_USART_SetStopBitsLength() function + * - Set CLKEN in CR2 using @ref LL_USART_EnableSCLKOutput() function + * - Set SCEN in CR3 using @ref LL_USART_EnableSmartcard() function + * @note Other remaining configurations items related to Smartcard Mode + * (as Baud Rate, Word length, Parity, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigSmartcardMode\n + * CR2 STOP LL_USART_ConfigSmartcardMode\n + * CR2 CLKEN LL_USART_ConfigSmartcardMode\n + * CR3 HDSEL LL_USART_ConfigSmartcardMode\n + * CR3 SCEN LL_USART_ConfigSmartcardMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigSmartcardMode(USART_TypeDef *USARTx) +{ + /* In Smartcard mode, the following bits must be kept cleared: + - LINEN bit in the USART_CR2 register, + - IREN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_HDSEL)); + /* Configure Stop bits to 1.5 bits */ + /* Synchronous mode is activated by default */ + SET_BIT(USARTx->CR2, (USART_CR2_STOP_0 | USART_CR2_STOP_1 | USART_CR2_CLKEN)); + /* set the UART/USART in Smartcard mode */ + SET_BIT(USARTx->CR3, USART_CR3_SCEN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Irda Mode + * @note In IRDA mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - STOP and CLKEN bits in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * This function also sets the UART/USART in IRDA mode (IREN bit). + * @note Macro @ref IS_IRDA_INSTANCE(USARTx) can be used to check whether or not + * IrDA feature is supported by the USARTx instance. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * - Configure STOP in CR2 using @ref LL_USART_SetStopBitsLength() function + * - Set IREN in CR3 using @ref LL_USART_EnableIrda() function + * @note Other remaining configurations items related to Irda Mode + * (as Baud Rate, Word length, Power mode, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigIrdaMode\n + * CR2 CLKEN LL_USART_ConfigIrdaMode\n + * CR2 STOP LL_USART_ConfigIrdaMode\n + * CR3 SCEN LL_USART_ConfigIrdaMode\n + * CR3 HDSEL LL_USART_ConfigIrdaMode\n + * CR3 IREN LL_USART_ConfigIrdaMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigIrdaMode(USART_TypeDef *USARTx) +{ + /* In IRDA mode, the following bits must be kept cleared: + - LINEN, STOP and CLKEN bits in the USART_CR2 register, + - SCEN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL)); + /* set the UART/USART in IRDA mode */ + SET_BIT(USARTx->CR3, USART_CR3_IREN); +} + +/** + * @brief Perform basic configuration of USART for enabling use in Multi processor Mode + * (several USARTs connected in a network, one of the USARTs can be the master, + * its TX output connected to the RX inputs of the other slaves USARTs). + * @note In MultiProcessor mode, the following bits must be kept cleared: + * - LINEN bit in the USART_CR2 register, + * - CLKEN bit in the USART_CR2 register, + * - SCEN bit in the USART_CR3 register, + * - IREN bit in the USART_CR3 register, + * - HDSEL bit in the USART_CR3 register. + * @note Call of this function is equivalent to following function call sequence : + * - Clear LINEN in CR2 using @ref LL_USART_DisableLIN() function + * - Clear CLKEN in CR2 using @ref LL_USART_DisableSCLKOutput() function + * - Clear SCEN in CR3 using @ref LL_USART_DisableSmartcard() function + * - Clear IREN in CR3 using @ref LL_USART_DisableIrda() function + * - Clear HDSEL in CR3 using @ref LL_USART_DisableHalfDuplex() function + * @note Other remaining configurations items related to Multi processor Mode + * (as Baud Rate, Wake Up Method, Node address, ...) should be set using + * dedicated functions + * @rmtoll CR2 LINEN LL_USART_ConfigMultiProcessMode\n + * CR2 CLKEN LL_USART_ConfigMultiProcessMode\n + * CR3 SCEN LL_USART_ConfigMultiProcessMode\n + * CR3 HDSEL LL_USART_ConfigMultiProcessMode\n + * CR3 IREN LL_USART_ConfigMultiProcessMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ConfigMultiProcessMode(USART_TypeDef *USARTx) +{ + /* In Multi Processor mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Check if the USART Parity Error Flag is set or not + * @rmtoll SR PE LL_USART_IsActiveFlag_PE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_PE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_PE) == (USART_SR_PE)); +} + +/** + * @brief Check if the USART Framing Error Flag is set or not + * @rmtoll SR FE LL_USART_IsActiveFlag_FE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_FE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_FE) == (USART_SR_FE)); +} + +/** + * @brief Check if the USART Noise error detected Flag is set or not + * @rmtoll SR NF LL_USART_IsActiveFlag_NE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_NE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_NE) == (USART_SR_NE)); +} + +/** + * @brief Check if the USART OverRun Error Flag is set or not + * @rmtoll SR ORE LL_USART_IsActiveFlag_ORE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_ORE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_ORE) == (USART_SR_ORE)); +} + +/** + * @brief Check if the USART IDLE line detected Flag is set or not + * @rmtoll SR IDLE LL_USART_IsActiveFlag_IDLE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_IDLE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_IDLE) == (USART_SR_IDLE)); +} + +/** + * @brief Check if the USART Read Data Register Not Empty Flag is set or not + * @rmtoll SR RXNE LL_USART_IsActiveFlag_RXNE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RXNE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_RXNE) == (USART_SR_RXNE)); +} + +/** + * @brief Check if the USART Transmission Complete Flag is set or not + * @rmtoll SR TC LL_USART_IsActiveFlag_TC + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TC(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_TC) == (USART_SR_TC)); +} + +/** + * @brief Check if the USART Transmit Data Register Empty Flag is set or not + * @rmtoll SR TXE LL_USART_IsActiveFlag_TXE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TXE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_TXE) == (USART_SR_TXE)); +} + +/** + * @brief Check if the USART LIN Break Detection Flag is set or not + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll SR LBD LL_USART_IsActiveFlag_LBD + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_LBD(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_LBD) == (USART_SR_LBD)); +} + +/** + * @brief Check if the USART CTS Flag is set or not + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll SR CTS LL_USART_IsActiveFlag_nCTS + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_nCTS(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->SR, USART_SR_CTS) == (USART_SR_CTS)); +} + +/** + * @brief Check if the USART Send Break Flag is set or not + * @rmtoll CR1 SBK LL_USART_IsActiveFlag_SBK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_SBK(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_SBK) == (USART_CR1_SBK)); +} + +/** + * @brief Check if the USART Receive Wake Up from mute mode Flag is set or not + * @rmtoll CR1 RWU LL_USART_IsActiveFlag_RWU + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RWU(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_RWU) == (USART_CR1_RWU)); +} + +/** + * @brief Clear Parity Error Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * NE, FE, ORE, IDLE would also be cleared. + * @rmtoll SR PE LL_USART_ClearFlag_PE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_PE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear Framing Error Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, NE, ORE, IDLE would also be cleared. + * @rmtoll SR FE LL_USART_ClearFlag_FE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_FE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear Noise detected Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, FE, ORE, IDLE would also be cleared. + * @rmtoll SR NF LL_USART_ClearFlag_NE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_NE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear OverRun Error Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, NE, FE, IDLE would also be cleared. + * @rmtoll SR ORE LL_USART_ClearFlag_ORE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_ORE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear IDLE line detected Flag + * @note Clearing this flag is done by a read access to the USARTx_SR + * register followed by a read access to the USARTx_DR register. + * @note Please also consider that when clearing this flag, other flags as + * PE, NE, FE, ORE would also be cleared. + * @rmtoll SR IDLE LL_USART_ClearFlag_IDLE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_IDLE(USART_TypeDef *USARTx) +{ + __IO uint32_t tmpreg; + tmpreg = USARTx->SR; + (void) tmpreg; + tmpreg = USARTx->DR; + (void) tmpreg; +} + +/** + * @brief Clear Transmission Complete Flag + * @rmtoll SR TC LL_USART_ClearFlag_TC + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_TC(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR, ~(USART_SR_TC)); +} + +/** + * @brief Clear RX Not Empty Flag + * @rmtoll SR RXNE LL_USART_ClearFlag_RXNE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_RXNE(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR, ~(USART_SR_RXNE)); +} + +/** + * @brief Clear LIN Break Detection Flag + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll SR LBD LL_USART_ClearFlag_LBD + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_LBD(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR, ~(USART_SR_LBD)); +} + +/** + * @brief Clear CTS Interrupt Flag + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll SR CTS LL_USART_ClearFlag_nCTS + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_nCTS(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->SR, ~(USART_SR_CTS)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable IDLE Interrupt + * @rmtoll CR1 IDLEIE LL_USART_EnableIT_IDLE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_IDLE(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_IDLEIE); +} + +/** + * @brief Enable RX Not Empty Interrupt + * @rmtoll CR1 RXNEIE LL_USART_EnableIT_RXNE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_RXNE(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_RXNEIE); +} + +/** + * @brief Enable Transmission Complete Interrupt + * @rmtoll CR1 TCIE LL_USART_EnableIT_TC + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_TC(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_TCIE); +} + +/** + * @brief Enable TX Empty Interrupt + * @rmtoll CR1 TXEIE LL_USART_EnableIT_TXE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_TXE(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_TXEIE); +} + +/** + * @brief Enable Parity Error Interrupt + * @rmtoll CR1 PEIE LL_USART_EnableIT_PE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_PE(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR1, USART_CR1_PEIE); +} + +/** + * @brief Enable LIN Break Detection Interrupt + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDIE LL_USART_EnableIT_LBD + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_LBD(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR2, USART_CR2_LBDIE); +} + +/** + * @brief Enable Error Interrupt + * @note When set, Error Interrupt Enable Bit is enabling interrupt generation in case of a framing + * error, overrun error or noise flag (FE=1 or ORE=1 or NF=1 in the USARTx_SR register). + * 0: Interrupt is inhibited + * 1: An interrupt is generated when FE=1 or ORE=1 or NF=1 in the USARTx_SR register. + * @rmtoll CR3 EIE LL_USART_EnableIT_ERROR + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_ERROR(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_EIE); +} + +/** + * @brief Enable CTS Interrupt + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSIE LL_USART_EnableIT_CTS + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_CTS(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_CTSIE); +} + +/** + * @brief Disable IDLE Interrupt + * @rmtoll CR1 IDLEIE LL_USART_DisableIT_IDLE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_IDLE(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_IDLEIE); +} + +/** + * @brief Disable RX Not Empty Interrupt + * @rmtoll CR1 RXNEIE LL_USART_DisableIT_RXNE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_RXNE(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_RXNEIE); +} + +/** + * @brief Disable Transmission Complete Interrupt + * @rmtoll CR1 TCIE LL_USART_DisableIT_TC + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_TC(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_TCIE); +} + +/** + * @brief Disable TX Empty Interrupt + * @rmtoll CR1 TXEIE LL_USART_DisableIT_TXE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_TXE(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_TXEIE); +} + +/** + * @brief Disable Parity Error Interrupt + * @rmtoll CR1 PEIE LL_USART_DisableIT_PE + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_PE(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR1, USART_CR1_PEIE); +} + +/** + * @brief Disable LIN Break Detection Interrupt + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDIE LL_USART_DisableIT_LBD + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_LBD(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR2, USART_CR2_LBDIE); +} + +/** + * @brief Disable Error Interrupt + * @note When set, Error Interrupt Enable Bit is enabling interrupt generation in case of a framing + * error, overrun error or noise flag (FE=1 or ORE=1 or NF=1 in the USARTx_SR register). + * 0: Interrupt is inhibited + * 1: An interrupt is generated when FE=1 or ORE=1 or NF=1 in the USARTx_SR register. + * @rmtoll CR3 EIE LL_USART_DisableIT_ERROR + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_ERROR(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_EIE); +} + +/** + * @brief Disable CTS Interrupt + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSIE LL_USART_DisableIT_CTS + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_CTS(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_CTSIE); +} + +/** + * @brief Check if the USART IDLE Interrupt source is enabled or disabled. + * @rmtoll CR1 IDLEIE LL_USART_IsEnabledIT_IDLE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_IDLE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_IDLEIE) == (USART_CR1_IDLEIE)); +} + +/** + * @brief Check if the USART RX Not Empty Interrupt is enabled or disabled. + * @rmtoll CR1 RXNEIE LL_USART_IsEnabledIT_RXNE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_RXNE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_RXNEIE) == (USART_CR1_RXNEIE)); +} + +/** + * @brief Check if the USART Transmission Complete Interrupt is enabled or disabled. + * @rmtoll CR1 TCIE LL_USART_IsEnabledIT_TC + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TC(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_TCIE) == (USART_CR1_TCIE)); +} + +/** + * @brief Check if the USART TX Empty Interrupt is enabled or disabled. + * @rmtoll CR1 TXEIE LL_USART_IsEnabledIT_TXE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TXE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_TXEIE) == (USART_CR1_TXEIE)); +} + +/** + * @brief Check if the USART Parity Error Interrupt is enabled or disabled. + * @rmtoll CR1 PEIE LL_USART_IsEnabledIT_PE + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_PE(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR1, USART_CR1_PEIE) == (USART_CR1_PEIE)); +} + +/** + * @brief Check if the USART LIN Break Detection Interrupt is enabled or disabled. + * @note Macro @ref IS_UART_LIN_INSTANCE(USARTx) can be used to check whether or not + * LIN feature is supported by the USARTx instance. + * @rmtoll CR2 LBDIE LL_USART_IsEnabledIT_LBD + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_LBD(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR2, USART_CR2_LBDIE) == (USART_CR2_LBDIE)); +} + +/** + * @brief Check if the USART Error Interrupt is enabled or disabled. + * @rmtoll CR3 EIE LL_USART_IsEnabledIT_ERROR + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_ERROR(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_EIE) == (USART_CR3_EIE)); +} + +/** + * @brief Check if the USART CTS Interrupt is enabled or disabled. + * @note Macro @ref IS_UART_HWFLOW_INSTANCE(USARTx) can be used to check whether or not + * Hardware Flow control feature is supported by the USARTx instance. + * @rmtoll CR3 CTSIE LL_USART_IsEnabledIT_CTS + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_CTS(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_CTSIE) == (USART_CR3_CTSIE)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_DMA_Management DMA_Management + * @{ + */ + +/** + * @brief Enable DMA Mode for reception + * @rmtoll CR3 DMAR LL_USART_EnableDMAReq_RX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDMAReq_RX(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_DMAR); +} + +/** + * @brief Disable DMA Mode for reception + * @rmtoll CR3 DMAR LL_USART_DisableDMAReq_RX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDMAReq_RX(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_DMAR); +} + +/** + * @brief Check if DMA Mode is enabled for reception + * @rmtoll CR3 DMAR LL_USART_IsEnabledDMAReq_RX + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_RX(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_DMAR) == (USART_CR3_DMAR)); +} + +/** + * @brief Enable DMA Mode for transmission + * @rmtoll CR3 DMAT LL_USART_EnableDMAReq_TX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableDMAReq_TX(USART_TypeDef *USARTx) +{ + ATOMIC_SET_BIT(USARTx->CR3, USART_CR3_DMAT); +} + +/** + * @brief Disable DMA Mode for transmission + * @rmtoll CR3 DMAT LL_USART_DisableDMAReq_TX + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableDMAReq_TX(USART_TypeDef *USARTx) +{ + ATOMIC_CLEAR_BIT(USARTx->CR3, USART_CR3_DMAT); +} + +/** + * @brief Check if DMA Mode is enabled for transmission + * @rmtoll CR3 DMAT LL_USART_IsEnabledDMAReq_TX + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledDMAReq_TX(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_DMAT) == (USART_CR3_DMAT)); +} + +/** + * @brief Get the data register address used for DMA transfer + * @rmtoll DR DR LL_USART_DMA_GetRegAddr + * @note Address of Data Register is valid for both Transmit and Receive transfers. + * @param USARTx USART Instance + * @retval Address of data register + */ +__STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx) +{ + /* return address of DR register */ + return ((uint32_t) &(USARTx->DR)); +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Data_Management Data_Management + * @{ + */ + +/** + * @brief Read Receiver Data register (Receive Data value, 8 bits) + * @rmtoll DR DR LL_USART_ReceiveData8 + * @param USARTx USART Instance + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx) +{ + return (uint8_t)(READ_BIT(USARTx->DR, USART_DR_DR)); +} + +/** + * @brief Read Receiver Data register (Receive Data value, 9 bits) + * @rmtoll DR DR LL_USART_ReceiveData9 + * @param USARTx USART Instance + * @retval Value between Min_Data=0x00 and Max_Data=0x1FF + */ +__STATIC_INLINE uint16_t LL_USART_ReceiveData9(USART_TypeDef *USARTx) +{ + return (uint16_t)(READ_BIT(USARTx->DR, USART_DR_DR)); +} + +/** + * @brief Write in Transmitter Data Register (Transmit Data value, 8 bits) + * @rmtoll DR DR LL_USART_TransmitData8 + * @param USARTx USART Instance + * @param Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_USART_TransmitData8(USART_TypeDef *USARTx, uint8_t Value) +{ + USARTx->DR = Value; +} + +/** + * @brief Write in Transmitter Data Register (Transmit Data value, 9 bits) + * @rmtoll DR DR LL_USART_TransmitData9 + * @param USARTx USART Instance + * @param Value between Min_Data=0x00 and Max_Data=0x1FF + * @retval None + */ +__STATIC_INLINE void LL_USART_TransmitData9(USART_TypeDef *USARTx, uint16_t Value) +{ + USARTx->DR = Value & 0x1FFU; +} + +/** + * @} + */ + +/** @defgroup USART_LL_EF_Execution Execution + * @{ + */ + +/** + * @brief Request Break sending + * @rmtoll CR1 SBK LL_USART_RequestBreakSending + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_RequestBreakSending(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_SBK); +} + +/** + * @brief Put USART in Mute mode + * @rmtoll CR1 RWU LL_USART_RequestEnterMuteMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_RequestEnterMuteMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_RWU); +} + +/** + * @brief Put USART in Active mode + * @rmtoll CR1 RWU LL_USART_RequestExitMuteMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_RequestExitMuteMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_RWU); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup USART_LL_EF_Init Initialization and de-initialization functions + * @{ + */ +ErrorStatus LL_USART_DeInit(USART_TypeDef *USARTx); +ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, LL_USART_InitTypeDef *USART_InitStruct); +void LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct); +ErrorStatus LL_USART_ClockInit(USART_TypeDef *USARTx, LL_USART_ClockInitTypeDef *USART_ClockInitStruct); +void LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* USART1 || USART2 || USART3 || USART6 || UART4 || UART5 || UART7 || UART8 || UART9 || UART10 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_USART_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h new file mode 100644 index 0000000..2b254a1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h @@ -0,0 +1,307 @@ +/** + ****************************************************************************** + * @file stm32f4xx_ll_utils.h + * @author MCD Application Team + * @brief Header file of UTILS LL module. + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The LL UTILS driver contains a set of generic APIs that can be + used by user: + (+) Device electronic signature + (+) Timing functions + (+) PLL configuration functions + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_LL_UTILS_H +#define __STM32F4xx_LL_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" + +/** @addtogroup STM32F4xx_LL_Driver + * @{ + */ + +/** @defgroup UTILS_LL UTILS + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup UTILS_LL_Private_Constants UTILS Private Constants + * @{ + */ + +/* Max delay can be used in LL_mDelay */ +#define LL_MAX_DELAY 0xFFFFFFFFU + +/** + * @brief Unique device ID register base address + */ +#define UID_BASE_ADDRESS UID_BASE + +/** + * @brief Flash size data register base address + */ +#define FLASHSIZE_BASE_ADDRESS FLASHSIZE_BASE + +/** + * @brief Package data register base address + */ +#define PACKAGE_BASE_ADDRESS PACKAGE_BASE + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup UTILS_LL_Private_Macros UTILS Private Macros + * @{ + */ +/** + * @} + */ +/* Exported types ------------------------------------------------------------*/ +/** @defgroup UTILS_LL_ES_INIT UTILS Exported structures + * @{ + */ +/** + * @brief UTILS PLL structure definition + */ +typedef struct +{ + uint32_t PLLM; /*!< Division factor for PLL VCO input clock. + This parameter can be a value of @ref RCC_LL_EC_PLLM_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ + + uint32_t PLLN; /*!< Multiplication factor for PLL VCO output clock. + This parameter must be a number between Min_Data = @ref RCC_PLLN_MIN_VALUE + and Max_Data = @ref RCC_PLLN_MIN_VALUE + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ + + uint32_t PLLP; /*!< Division for the main system clock. + This parameter can be a value of @ref RCC_LL_EC_PLLP_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ +} LL_UTILS_PLLInitTypeDef; + +/** + * @brief UTILS System, AHB and APB buses clock configuration structure definition + */ +typedef struct +{ + uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). + This parameter can be a value of @ref RCC_LL_EC_SYSCLK_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAHBPrescaler(). */ + + uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_LL_EC_APB1_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAPB1Prescaler(). */ + + uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_LL_EC_APB2_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAPB2Prescaler(). */ + +} LL_UTILS_ClkInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup UTILS_LL_Exported_Constants UTILS Exported Constants + * @{ + */ + +/** @defgroup UTILS_EC_HSE_BYPASS HSE Bypass activation + * @{ + */ +#define LL_UTILS_HSEBYPASS_OFF 0x00000000U /*!< HSE Bypass is not enabled */ +#define LL_UTILS_HSEBYPASS_ON 0x00000001U /*!< HSE Bypass is enabled */ +/** + * @} + */ + +/** @defgroup UTILS_EC_PACKAGETYPE PACKAGE TYPE + * @{ + */ +#define LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 0x00000000U /*!< WLCSP36 or UFQFPN48 or LQFP64 package type */ +#define LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 0x00000100U /*!< WLCSP168 or FBGA169 or LQFP100 or LQFP64 or UFQFPN48 package type */ +#define LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 0x00000200U /*!< WLCSP64 or WLCSP81 or LQFP176 or UFBGA176 package type */ +#define LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 0x00000300U /*!< LQFP144 or UFBGA144 or UFBGA144 or UFBGA100 package type */ +#define LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 0x00000400U /*!< LQFP100 or LQFP208 or TFBGA216 package type */ +#define LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 0x00000500U /*!< LQFP208 or TFBGA216 package type */ +#define LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 0x00000700U /*!< TQFP64 or UFBGA144 or LQFP144 package type */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup UTILS_LL_Exported_Functions UTILS Exported Functions + * @{ + */ + +/** @defgroup UTILS_EF_DEVICE_ELECTRONIC_SIGNATURE DEVICE ELECTRONIC SIGNATURE + * @{ + */ + +/** + * @brief Get Word0 of the unique device identifier (UID based on 96 bits) + * @retval UID[31:0] + */ +__STATIC_INLINE uint32_t LL_GetUID_Word0(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)UID_BASE_ADDRESS))); +} + +/** + * @brief Get Word1 of the unique device identifier (UID based on 96 bits) + * @retval UID[63:32] + */ +__STATIC_INLINE uint32_t LL_GetUID_Word1(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 4U)))); +} + +/** + * @brief Get Word2 of the unique device identifier (UID based on 96 bits) + * @retval UID[95:64] + */ +__STATIC_INLINE uint32_t LL_GetUID_Word2(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 8U)))); +} + +/** + * @brief Get Flash memory size + * @note This bitfield indicates the size of the device Flash memory expressed in + * Kbytes. As an example, 0x040 corresponds to 64 Kbytes. + * @retval FLASH_SIZE[15:0]: Flash memory size + */ +__STATIC_INLINE uint32_t LL_GetFlashSize(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE_ADDRESS)) & 0xFFFF); +} + +/** + * @brief Get Package type + * @retval Returned value can be one of the following values: + * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP36_UFQFPN48_LQFP64 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP168_FBGA169_LQFP100_LQFP64_UFQFPN48 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_WLCSP64_WLCSP81_LQFP176_UFBGA176 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_LQFP144_UFBGA144_UFBGA144_UFBGA100 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_LQFP100_LQFP208_TFBGA216 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_LQFP208_TFBGA216 (*) + * @arg @ref LL_UTILS_PACKAGETYPE_TQFP64_UFBGA144_LQFP144 (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_GetPackageType(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)PACKAGE_BASE_ADDRESS)) & 0x0700U); +} + +/** + * @} + */ + +/** @defgroup UTILS_LL_EF_DELAY DELAY + * @{ + */ + +/** + * @brief This function configures the Cortex-M SysTick source of the time base. + * @param HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro) + * @note When a RTOS is used, it is recommended to avoid changing the SysTick + * configuration by calling this function, for a delay use rather osDelay RTOS service. + * @param Ticks Number of ticks + * @retval None + */ +__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks) +{ + /* Configure the SysTick to have interrupt in 1ms time base */ + SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */ +} + +void LL_Init1msTick(uint32_t HCLKFrequency); +void LL_mDelay(uint32_t Delay); + +/** + * @} + */ + +/** @defgroup UTILS_EF_SYSTEM SYSTEM + * @{ + */ + +void LL_SetSystemCoreClock(uint32_t HCLKFrequency); +ErrorStatus LL_SetFlashLatency(uint32_t HCLK_Frequency); +ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, + LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); +ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, + LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_LL_UTILS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt new file mode 100644 index 0000000..3edc4d1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt @@ -0,0 +1,6 @@ +This software component is provided to you as part of a software package and +applicable license terms are in the Package_license file. If you received this +software component outside of a package or without applicable license terms, +the terms of the BSD-3-Clause license shall apply. +You may obtain a copy of the BSD-3-Clause at: +https://opensource.org/licenses/BSD-3-Clause diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c new file mode 100644 index 0000000..9ba2ba7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c @@ -0,0 +1,615 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal.c + * @author MCD Application Team + * @brief HAL module driver. + * This is the common part of the HAL initialization + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The common HAL driver contains a set of generic and common APIs that can be + used by the PPP peripheral drivers and the user to start using the HAL. + [..] + The HAL contains two APIs' categories: + (+) Common HAL APIs + (+) Services HAL APIs + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL HAL + * @brief HAL module driver. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup HAL_Private_Constants + * @{ + */ +/** + * @brief STM32F4xx HAL Driver version number V1.8.1 + */ +#define __STM32F4xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ +#define __STM32F4xx_HAL_VERSION_SUB1 (0x08U) /*!< [23:16] sub1 version */ +#define __STM32F4xx_HAL_VERSION_SUB2 (0x01U) /*!< [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 */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c new file mode 100644 index 0000000..98515c5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c @@ -0,0 +1,502 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_cortex.c + * @author MCD Application Team + * @brief CORTEX HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the CORTEX: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + + [..] + *** How to configure Interrupts using CORTEX HAL driver *** + =========================================================== + [..] + This section provides functions allowing to configure the NVIC interrupts (IRQ). + The Cortex-M4 exceptions are managed by CMSIS functions. + + (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() + function according to the following table. + (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority(). + (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ(). + (#) please refer to programming manual for details in how to configure priority. + + -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ preemption is no more possible. + The pending IRQ priority will be managed only by the sub priority. + + -@- IRQ priority order (sorted by highest to lowest priority): + (+@) Lowest preemption priority + (+@) Lowest sub priority + (+@) Lowest hardware priority (IRQ number) + + [..] + *** How to configure Systick using CORTEX HAL driver *** + ======================================================== + [..] + Setup SysTick Timer for time base. + + (+) The HAL_SYSTICK_Config() function calls the SysTick_Config() function which + is a CMSIS function that: + (++) Configures the SysTick Reload register with value passed as function parameter. + (++) Configures the SysTick IRQ priority to the lowest value 0x0F. + (++) Resets the SysTick Counter register. + (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). + (++) Enables the SysTick Interrupt. + (++) Starts the SysTick Counter. + + (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro + __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the + HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined + inside the stm32f4xx_hal_cortex.h file. + + (+) You can change the SysTick IRQ priority by calling the + HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function + call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS function. + + (+) To adjust the SysTick time base, use the following formula: + + Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) + (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function + (++) Reload Value should not exceed 0xFFFFFF + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup CORTEX CORTEX + * @brief CORTEX HAL module driver + * @{ + */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions + * @{ + */ + + +/** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + ============================================================================== + ##### Initialization and de-initialization functions ##### + ============================================================================== + [..] + This section provides the CORTEX HAL driver functions allowing to configure Interrupts + Systick functionalities + +@endverbatim + * @{ + */ + + +/** + * @brief Sets the priority grouping field (preemption priority and subpriority) + * using the required unlock sequence. + * @param PriorityGroup The priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority + * 4 bits for subpriority + * @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority + * 3 bits for subpriority + * @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority + * 2 bits for subpriority + * @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority + * 1 bits for subpriority + * @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority + * 0 bits for subpriority + * @note When the NVIC_PriorityGroup_0 is selected, IRQ preemption is no more possible. + * The pending IRQ priority will be managed only by the subpriority. + * @retval None + */ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ + NVIC_SetPriorityGrouping(PriorityGroup); +} + +/** + * @brief Sets the priority of an interrupt. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @param PreemptPriority The preemption priority for the IRQn channel. + * This parameter can be a value between 0 and 15 + * A lower priority value indicates a higher priority + * @param SubPriority the subpriority level for the IRQ channel. + * This parameter can be a value between 0 and 15 + * A lower priority value indicates a higher priority. + * @retval None + */ +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t prioritygroup = 0x00U; + + /* Check the parameters */ + assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); + + prioritygroup = NVIC_GetPriorityGrouping(); + + NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); +} + +/** + * @brief Enables a device specific interrupt in the NVIC interrupt controller. + * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() + * function should be called before. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Enable interrupt */ + NVIC_EnableIRQ(IRQn); +} + +/** + * @brief Disables a device specific interrupt in the NVIC interrupt controller. + * @param IRQn External interrupt number. + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f4xxxx.h)) + * @retval None + */ +void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) +{ + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Disable interrupt */ + NVIC_DisableIRQ(IRQn); +} + +/** + * @brief Initiates a system reset request to reset the MCU. + * @retval None + */ +void HAL_NVIC_SystemReset(void) +{ + /* System Reset */ + NVIC_SystemReset(); +} + +/** + * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. + * Counter is in free running mode to generate periodic interrupts. + * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. + * @retval status: - 0 Function succeeded. + * - 1 Function failed. + */ +uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) +{ + return SysTick_Config(TicksNumb); +} +/** + * @} + */ + +/** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions + * @brief Cortex control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to control the CORTEX + (NVIC, SYSTICK, MPU) functionalities. + + +@endverbatim + * @{ + */ + +#if (__MPU_PRESENT == 1U) +/** + * @brief Disables the MPU + * @retval None + */ +void HAL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + + /* Disable fault exceptions */ + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; + + /* Disable the MPU and clear the control register*/ + MPU->CTRL = 0U; +} + +/** + * @brief Enable the MPU. + * @param MPU_Control Specifies the control mode of the MPU during hard fault, + * NMI, FAULTMASK and privileged access to the default memory + * This parameter can be one of the following values: + * @arg MPU_HFNMI_PRIVDEF_NONE + * @arg MPU_HARDFAULT_NMI + * @arg MPU_PRIVILEGED_DEFAULT + * @arg MPU_HFNMI_PRIVDEF + * @retval None + */ +void HAL_MPU_Enable(uint32_t MPU_Control) +{ + /* Enable the MPU */ + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; + + /* Enable fault exceptions */ + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; + + /* Ensure MPU setting take effects */ + __DSB(); + __ISB(); +} + +/** + * @brief 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 */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c new file mode 100644 index 0000000..3dbb477 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c @@ -0,0 +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 is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup DMA DMA + * @brief DMA HAL module driver + * @{ + */ + +#ifdef HAL_DMA_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +typedef struct +{ + __IO uint32_t ISR; /*!< DMA interrupt status register */ + __IO uint32_t Reserved0; + __IO uint32_t IFCR; /*!< DMA interrupt flag clear register */ +} DMA_Base_Registers; + +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @addtogroup DMA_Private_Constants + * @{ + */ + #define HAL_TIMEOUT_DMA_ABORT 5U /* 5 ms */ +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup DMA_Private_Functions + * @{ + */ +static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma); + +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ +/** @addtogroup DMA_Exported_Functions + * @{ + */ + +/** @addtogroup DMA_Exported_Functions_Group1 + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to initialize the DMA Stream source + and destination addresses, incrementation and data sizes, transfer direction, + circular/normal mode selection, memory-to-memory mode selection and Stream priority value. + [..] + The HAL_DMA_Init() function follows the DMA configuration procedures as described in + reference manual. + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the DMA according to the specified + * parameters in the DMA_InitTypeDef and create the associated handle. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) +{ + uint32_t tmp = 0U; + uint32_t tickstart = HAL_GetTick(); + DMA_Base_Registers *regs; + + /* Check the DMA peripheral state */ + if(hdma == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_CHANNEL(hdma->Init.Channel)); + assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); + assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); + assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); + assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); + assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); + assert_param(IS_DMA_MODE(hdma->Init.Mode)); + assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); + assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode)); + /* Check the memory burst, peripheral burst and FIFO threshold parameters only + when FIFO mode is enabled */ + if(hdma->Init.FIFOMode != DMA_FIFOMODE_DISABLE) + { + assert_param(IS_DMA_FIFO_THRESHOLD(hdma->Init.FIFOThreshold)); + assert_param(IS_DMA_MEMORY_BURST(hdma->Init.MemBurst)); + assert_param(IS_DMA_PERIPHERAL_BURST(hdma->Init.PeriphBurst)); + } + + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Allocate lock resource */ + __HAL_UNLOCK(hdma); + + /* Disable the peripheral */ + __HAL_DMA_DISABLE(hdma); + + /* Check if the DMA Stream is effectively disabled */ + while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) + { + /* Check for the Timeout */ + if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_TIMEOUT; + + return HAL_TIMEOUT; + } + } + + /* Get the CR register value */ + tmp = hdma->Instance->CR; + + /* Clear CHSEL, MBURST, PBURST, PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR, CT and DBM bits */ + tmp &= ((uint32_t)~(DMA_SxCR_CHSEL | DMA_SxCR_MBURST | DMA_SxCR_PBURST | \ + DMA_SxCR_PL | DMA_SxCR_MSIZE | DMA_SxCR_PSIZE | \ + DMA_SxCR_MINC | DMA_SxCR_PINC | DMA_SxCR_CIRC | \ + DMA_SxCR_DIR | DMA_SxCR_CT | DMA_SxCR_DBM)); + + /* Prepare the DMA Stream configuration */ + tmp |= hdma->Init.Channel | hdma->Init.Direction | + hdma->Init.PeriphInc | hdma->Init.MemInc | + hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + hdma->Init.Mode | hdma->Init.Priority; + + /* the Memory burst and peripheral burst are not used when the FIFO is disabled */ + if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) + { + /* Get memory burst and peripheral burst */ + tmp |= hdma->Init.MemBurst | hdma->Init.PeriphBurst; + } + + /* Write to DMA Stream CR register */ + hdma->Instance->CR = tmp; + + /* Get the FCR register value */ + tmp = hdma->Instance->FCR; + + /* Clear Direct mode and FIFO threshold bits */ + tmp &= (uint32_t)~(DMA_SxFCR_DMDIS | DMA_SxFCR_FTH); + + /* Prepare the DMA Stream FIFO configuration */ + tmp |= hdma->Init.FIFOMode; + + /* The FIFO threshold is not used when the FIFO mode is disabled */ + if(hdma->Init.FIFOMode == DMA_FIFOMODE_ENABLE) + { + /* Get the FIFO threshold */ + tmp |= hdma->Init.FIFOThreshold; + + /* Check compatibility between FIFO threshold level and size of the memory burst */ + /* for INCR4, INCR8, INCR16 bursts */ + if (hdma->Init.MemBurst != DMA_MBURST_SINGLE) + { + if (DMA_CheckFifoParam(hdma) != HAL_OK) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_PARAM; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + return HAL_ERROR; + } + } + } + + /* Write to DMA Stream FCR */ + hdma->Instance->FCR = tmp; + + /* Initialize StreamBaseAddress and StreamIndex parameters to be used to calculate + DMA steam Base Address needed by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ + regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); + + /* Clear all interrupt flags */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Initialize the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the DMA peripheral + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) +{ + DMA_Base_Registers *regs; + + /* Check the DMA peripheral state */ + if(hdma == NULL) + { + return HAL_ERROR; + } + + /* Check the DMA peripheral state */ + if(hdma->State == HAL_DMA_STATE_BUSY) + { + /* Return error status */ + return HAL_BUSY; + } + + /* Check the parameters */ + assert_param(IS_DMA_STREAM_ALL_INSTANCE(hdma->Instance)); + + /* Disable the selected DMA Streamx */ + __HAL_DMA_DISABLE(hdma); + + /* Reset DMA Streamx control register */ + hdma->Instance->CR = 0U; + + /* Reset DMA Streamx number of data to transfer register */ + hdma->Instance->NDTR = 0U; + + /* Reset DMA Streamx peripheral address register */ + hdma->Instance->PAR = 0U; + + /* Reset DMA Streamx memory 0 address register */ + hdma->Instance->M0AR = 0U; + + /* Reset DMA Streamx memory 1 address register */ + hdma->Instance->M1AR = 0U; + + /* Reset DMA Streamx FIFO control register */ + hdma->Instance->FCR = 0x00000021U; + + /* Get DMA steam Base Address */ + regs = (DMA_Base_Registers *)DMA_CalcBaseAndBitshift(hdma); + + /* Clean all callbacks */ + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferM1CpltCallback = NULL; + hdma->XferM1HalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Reset the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Reset the DMA state */ + hdma->State = HAL_DMA_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return HAL_OK; +} + +/** + * @} + */ + +/** @addtogroup DMA_Exported_Functions_Group2 + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the source, destination address and data length and Start DMA transfer + (+) Configure the source, destination address and data length and + Start DMA transfer with interrupt + (+) Abort DMA transfer + (+) Poll for transfer complete + (+) Handle DMA interrupt request + +@endverbatim + * @{ + */ + +/** + * @brief Starts the DMA Transfer. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Configure the source, destination address and the data length */ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + /* Return error status */ + status = HAL_BUSY; + } + return status; +} + +/** + * @brief Start the DMA Transfer with interrupt enabled. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Configure the source, destination address and the data length */ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Enable Common interrupts*/ + hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; + + if(hdma->XferHalfCpltCallback != NULL) + { + hdma->Instance->CR |= DMA_IT_HT; + } + + /* Enable the Peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + /* Return error status */ + status = HAL_BUSY; + } + + return status; +} + +/** + * @brief Aborts the DMA Transfer. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * + * @note After disabling a DMA Stream, a check for wait until the DMA Stream is + * effectively disabled is added. If a Stream is disabled + * while a data transfer is ongoing, the current data will be transferred + * and the Stream will be effectively disabled only after the transfer of + * this single data is finished. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) +{ + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + + uint32_t tickstart = HAL_GetTick(); + + if(hdma->State != HAL_DMA_STATE_BUSY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_ERROR; + } + else + { + /* Disable all the transfer interrupts */ + hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); + hdma->Instance->FCR &= ~(DMA_IT_FE); + + if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) + { + hdma->Instance->CR &= ~(DMA_IT_HT); + } + + /* Disable the stream */ + __HAL_DMA_DISABLE(hdma); + + /* Check if the DMA Stream is effectively disabled */ + while((hdma->Instance->CR & DMA_SxCR_EN) != RESET) + { + /* Check for the Timeout */ + if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA_ABORT) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_TIMEOUT; + } + } + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Change the DMA state*/ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + } + return HAL_OK; +} + +/** + * @brief Aborts the DMA Transfer in Interrupt mode. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) +{ + if(hdma->State != HAL_DMA_STATE_BUSY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + return HAL_ERROR; + } + else + { + /* Set Abort State */ + hdma->State = HAL_DMA_STATE_ABORT; + + /* Disable the stream */ + __HAL_DMA_DISABLE(hdma); + } + + return HAL_OK; +} + +/** + * @brief Polling for transfer complete. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CompleteLevel Specifies the DMA level complete. + * @note The polling mode is kept in this version for legacy. it is recommended to use the IT model instead. + * This model could be used for debug purpose. + * @note The HAL_DMA_PollForTransfer API cannot be used in circular and double buffering mode (automatic circular mode). + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t mask_cpltlevel; + uint32_t tickstart = HAL_GetTick(); + uint32_t tmpisr; + + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs; + + if(HAL_DMA_STATE_BUSY != hdma->State) + { + /* No transfer ongoing */ + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + __HAL_UNLOCK(hdma); + return HAL_ERROR; + } + + /* Polling mode not supported in circular mode and double buffering mode */ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) != RESET) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + return HAL_ERROR; + } + + /* Get the level transfer complete flag */ + if(CompleteLevel == HAL_DMA_FULL_TRANSFER) + { + /* Transfer Complete flag */ + mask_cpltlevel = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; + } + else + { + /* Half Transfer Complete flag */ + mask_cpltlevel = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; + } + + regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + tmpisr = regs->ISR; + + while(((tmpisr & mask_cpltlevel) == RESET) && ((hdma->ErrorCode & HAL_DMA_ERROR_TE) == RESET)) + { + /* Check for the Timeout (Not applicable in circular mode)*/ + if(Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0U)||((HAL_GetTick() - tickstart ) > Timeout)) + { + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_TIMEOUT; + } + } + + /* Get the ISR register value */ + tmpisr = regs->ISR; + + if((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) + { + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_TE; + + /* Clear the transfer error flag */ + regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; + } + + if((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) + { + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_FE; + + /* Clear the FIFO error flag */ + regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; + } + + if((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) + { + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_DME; + + /* Clear the Direct Mode error flag */ + regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; + } + } + + if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) + { + if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) + { + HAL_DMA_Abort(hdma); + + /* Clear the half transfer and transfer complete flags */ + regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; + + /* Change the DMA state */ + hdma->State= HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_ERROR; + } + } + + /* Get the level transfer complete flag */ + if(CompleteLevel == HAL_DMA_FULL_TRANSFER) + { + /* Clear the half transfer and transfer complete flags */ + regs->IFCR = (DMA_FLAG_HTIF0_4 | DMA_FLAG_TCIF0_4) << hdma->StreamIndex; + + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + } + else + { + /* Clear the half transfer and transfer complete flags */ + regs->IFCR = (DMA_FLAG_HTIF0_4) << hdma->StreamIndex; + } + + return status; +} + +/** + * @brief Handles DMA interrupt request. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval None + */ +void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) +{ + uint32_t tmpisr; + __IO uint32_t count = 0U; + uint32_t timeout = SystemCoreClock / 9600U; + + /* calculate DMA base and stream number */ + DMA_Base_Registers *regs = (DMA_Base_Registers *)hdma->StreamBaseAddress; + + tmpisr = regs->ISR; + + /* Transfer Error Interrupt management ***************************************/ + if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET) + { + /* Disable the transfer error interrupt */ + hdma->Instance->CR &= ~(DMA_IT_TE); + + /* Clear the transfer error flag */ + regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex; + + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_TE; + } + } + /* FIFO Error Interrupt management ******************************************/ + if ((tmpisr & (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET) + { + /* Clear the FIFO error flag */ + regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex; + + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_FE; + } + } + /* Direct Mode Error Interrupt management ***********************************/ + if ((tmpisr & (DMA_FLAG_DMEIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET) + { + /* Clear the direct mode error flag */ + regs->IFCR = DMA_FLAG_DMEIF0_4 << hdma->StreamIndex; + + /* Update error code */ + hdma->ErrorCode |= HAL_DMA_ERROR_DME; + } + } + /* Half Transfer Complete Interrupt management ******************************/ + if ((tmpisr & (DMA_FLAG_HTIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET) + { + /* Clear the half transfer complete flag */ + regs->IFCR = DMA_FLAG_HTIF0_4 << hdma->StreamIndex; + + /* Multi_Buffering mode enabled */ + if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) + { + /* Current memory buffer used is Memory 0 */ + if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) + { + if(hdma->XferHalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferHalfCpltCallback(hdma); + } + } + /* Current memory buffer used is Memory 1 */ + else + { + if(hdma->XferM1HalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferM1HalfCpltCallback(hdma); + } + } + } + else + { + /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ + if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) + { + /* Disable the half transfer interrupt */ + hdma->Instance->CR &= ~(DMA_IT_HT); + } + + if(hdma->XferHalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferHalfCpltCallback(hdma); + } + } + } + } + /* Transfer Complete Interrupt management ***********************************/ + if ((tmpisr & (DMA_FLAG_TCIF0_4 << hdma->StreamIndex)) != RESET) + { + if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET) + { + /* Clear the transfer complete flag */ + regs->IFCR = DMA_FLAG_TCIF0_4 << hdma->StreamIndex; + + if(HAL_DMA_STATE_ABORT == hdma->State) + { + /* Disable all the transfer interrupts */ + hdma->Instance->CR &= ~(DMA_IT_TC | DMA_IT_TE | DMA_IT_DME); + hdma->Instance->FCR &= ~(DMA_IT_FE); + + if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) + { + hdma->Instance->CR &= ~(DMA_IT_HT); + } + + /* Clear all interrupt flags at correct offset within the register */ + regs->IFCR = 0x3FU << hdma->StreamIndex; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + if(hdma->XferAbortCallback != NULL) + { + hdma->XferAbortCallback(hdma); + } + return; + } + + if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != RESET) + { + /* Current memory buffer used is Memory 0 */ + if((hdma->Instance->CR & DMA_SxCR_CT) == RESET) + { + if(hdma->XferM1CpltCallback != NULL) + { + /* Transfer complete Callback for memory1 */ + hdma->XferM1CpltCallback(hdma); + } + } + /* Current memory buffer used is Memory 1 */ + else + { + if(hdma->XferCpltCallback != NULL) + { + /* Transfer complete Callback for memory0 */ + hdma->XferCpltCallback(hdma); + } + } + } + /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */ + else + { + if((hdma->Instance->CR & DMA_SxCR_CIRC) == RESET) + { + /* Disable the transfer complete interrupt */ + hdma->Instance->CR &= ~(DMA_IT_TC); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + } + + if(hdma->XferCpltCallback != NULL) + { + /* Transfer complete callback */ + hdma->XferCpltCallback(hdma); + } + } + } + } + + /* manage error case */ + if(hdma->ErrorCode != HAL_DMA_ERROR_NONE) + { + if((hdma->ErrorCode & HAL_DMA_ERROR_TE) != RESET) + { + hdma->State = HAL_DMA_STATE_ABORT; + + /* Disable the stream */ + __HAL_DMA_DISABLE(hdma); + + do + { + if (++count > timeout) + { + break; + } + } + while((hdma->Instance->CR & DMA_SxCR_EN) != RESET); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + } + + if(hdma->XferErrorCallback != NULL) + { + /* Transfer error callback */ + hdma->XferErrorCallback(hdma); + } + } +} + +/** + * @brief Register callbacks + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CallbackID User Callback identifier + * a DMA_HandleTypeDef structure as parameter. + * @param pCallback pointer to private callback function which has pointer to + * a DMA_HandleTypeDef structure as parameter. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)(DMA_HandleTypeDef *_hdma)) +{ + + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + switch (CallbackID) + { + case HAL_DMA_XFER_CPLT_CB_ID: + hdma->XferCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_HALFCPLT_CB_ID: + hdma->XferHalfCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_M1CPLT_CB_ID: + hdma->XferM1CpltCallback = pCallback; + break; + + case HAL_DMA_XFER_M1HALFCPLT_CB_ID: + hdma->XferM1HalfCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_ERROR_CB_ID: + hdma->XferErrorCallback = pCallback; + break; + + case HAL_DMA_XFER_ABORT_CB_ID: + hdma->XferAbortCallback = pCallback; + break; + + default: + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @brief UnRegister callbacks + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CallbackID User Callback identifier + * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + switch (CallbackID) + { + case HAL_DMA_XFER_CPLT_CB_ID: + hdma->XferCpltCallback = NULL; + break; + + case HAL_DMA_XFER_HALFCPLT_CB_ID: + hdma->XferHalfCpltCallback = NULL; + break; + + case HAL_DMA_XFER_M1CPLT_CB_ID: + hdma->XferM1CpltCallback = NULL; + break; + + case HAL_DMA_XFER_M1HALFCPLT_CB_ID: + hdma->XferM1HalfCpltCallback = NULL; + break; + + case HAL_DMA_XFER_ERROR_CB_ID: + hdma->XferErrorCallback = NULL; + break; + + case HAL_DMA_XFER_ABORT_CB_ID: + hdma->XferAbortCallback = NULL; + break; + + case HAL_DMA_XFER_ALL_CB_ID: + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferM1CpltCallback = NULL; + hdma->XferM1HalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + break; + + default: + status = HAL_ERROR; + break; + } + } + else + { + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @} + */ + +/** @addtogroup DMA_Exported_Functions_Group3 + * +@verbatim + =============================================================================== + ##### State and Errors functions ##### + =============================================================================== + [..] + This subsection provides functions allowing to + (+) Check the DMA state + (+) Get error code + +@endverbatim + * @{ + */ + +/** + * @brief Returns the DMA state. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL state + */ +HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) +{ + return hdma->State; +} + +/** + * @brief Return the DMA error code + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval DMA Error Code + */ +uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) +{ + return hdma->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup DMA_Private_Functions + * @{ + */ + +/** + * @brief Sets the DMA Transfer parameter. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + /* Clear DBM bit */ + hdma->Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); + + /* Configure DMA Stream data length */ + hdma->Instance->NDTR = DataLength; + + /* Memory to Peripheral */ + if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) + { + /* Configure DMA Stream destination address */ + hdma->Instance->PAR = DstAddress; + + /* Configure DMA Stream source address */ + hdma->Instance->M0AR = SrcAddress; + } + /* Peripheral to Memory */ + else + { + /* Configure DMA Stream source address */ + hdma->Instance->PAR = SrcAddress; + + /* Configure DMA Stream destination address */ + hdma->Instance->M0AR = DstAddress; + } +} + +/** + * @brief Returns the DMA Stream base address depending on stream number + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval Stream base address + */ +static uint32_t DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) +{ + uint32_t stream_number = (((uint32_t)hdma->Instance & 0xFFU) - 16U) / 24U; + + /* lookup table for necessary bitshift of flags within status registers */ + static const uint8_t flagBitshiftOffset[8U] = {0U, 6U, 16U, 22U, 0U, 6U, 16U, 22U}; + hdma->StreamIndex = flagBitshiftOffset[stream_number]; + + if (stream_number > 3U) + { + /* return pointer to HISR and HIFCR */ + hdma->StreamBaseAddress = (((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)) + 4U); + } + else + { + /* return pointer to LISR and LIFCR */ + hdma->StreamBaseAddress = ((uint32_t)hdma->Instance & (uint32_t)(~0x3FFU)); + } + + return hdma->StreamBaseAddress; +} + +/** + * @brief Check compatibility between FIFO threshold level and size of the memory burst + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval HAL status + */ +static HAL_StatusTypeDef DMA_CheckFifoParam(DMA_HandleTypeDef *hdma) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmp = hdma->Init.FIFOThreshold; + + /* Memory Data size equal to Byte */ + if(hdma->Init.MemDataAlignment == DMA_MDATAALIGN_BYTE) + { + switch (tmp) + { + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_HALFFULL: + if (hdma->Init.MemBurst == DMA_MBURST_INC16) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_FULL: + break; + default: + break; + } + } + + /* Memory Data size equal to Half-Word */ + else if (hdma->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) + { + switch (tmp) + { + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + status = HAL_ERROR; + break; + case DMA_FIFO_THRESHOLD_HALFFULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + case DMA_FIFO_THRESHOLD_FULL: + if (hdma->Init.MemBurst == DMA_MBURST_INC16) + { + status = HAL_ERROR; + } + break; + default: + break; + } + } + + /* Memory Data size equal to Word */ + else + { + switch (tmp) + { + case DMA_FIFO_THRESHOLD_1QUARTERFULL: + case DMA_FIFO_THRESHOLD_HALFFULL: + case DMA_FIFO_THRESHOLD_3QUARTERSFULL: + status = HAL_ERROR; + break; + case DMA_FIFO_THRESHOLD_FULL: + if ((hdma->Init.MemBurst & DMA_SxCR_MBURST_1) == DMA_SxCR_MBURST_1) + { + status = HAL_ERROR; + } + break; + default: + break; + } + } + + return status; +} + +/** + * @} + */ + +#endif /* HAL_DMA_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c new file mode 100644 index 0000000..7167e77 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c @@ -0,0 +1,313 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_dma_ex.c + * @author MCD Application Team + * @brief DMA Extension HAL module driver + * This file provides firmware functions to manage the following + * functionalities of the DMA Extension peripheral: + * + Extended features functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The DMA Extension HAL driver can be used as follows: + (#) Start a multi buffer transfer using the HAL_DMA_MultiBufferStart() function + for polling mode or HAL_DMA_MultiBufferStart_IT() for interrupt mode. + + -@- In Memory-to-Memory transfer mode, Multi (Double) Buffer mode is not allowed. + -@- When Multi (Double) Buffer mode is enabled the, transfer is circular by default. + -@- In Multi (Double) buffer mode, it is possible to update the base address for + the AHB memory port on the fly (DMA_SxM0AR or DMA_SxM1AR) when the stream is enabled. + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup DMAEx DMAEx + * @brief DMA Extended HAL module driver + * @{ + */ + +#ifdef HAL_DMA_MODULE_ENABLED + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private Constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @addtogroup DMAEx_Private_Functions + * @{ + */ +static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ + +/** @addtogroup DMAEx_Exported_Functions + * @{ + */ + + +/** @addtogroup DMAEx_Exported_Functions_Group1 + * +@verbatim + =============================================================================== + ##### Extended features functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the source, destination address and data length and + Start MultiBuffer DMA transfer + (+) Configure the source, destination address and data length and + Start MultiBuffer DMA transfer with interrupt + (+) Change on the fly the memory0 or memory1 address. + +@endverbatim + * @{ + */ + + +/** + * @brief Starts the multi_buffer DMA Transfer. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Memory-to-memory transfer not supported in double buffering mode */ + if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + status = HAL_ERROR; + } + else + { + /* Process Locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Enable the double buffer mode */ + hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; + + /* Configure DMA Stream destination address */ + hdma->Instance->M1AR = SecondMemAddress; + + /* Configure the source, destination address and the data length */ + DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Return error status */ + status = HAL_BUSY; + } + } + return status; +} + +/** + * @brief Starts the multi_buffer DMA Transfer with interrupt enabled. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param SecondMemAddress The second memory Buffer address in case of multi buffer Transfer + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMAEx_MultiBufferStart_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t SecondMemAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Memory-to-memory transfer not supported in double buffering mode */ + if (hdma->Init.Direction == DMA_MEMORY_TO_MEMORY) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + return HAL_ERROR; + } + + /* Check callback functions */ + if ((NULL == hdma->XferCpltCallback) || (NULL == hdma->XferM1CpltCallback) || (NULL == hdma->XferErrorCallback)) + { + hdma->ErrorCode = HAL_DMA_ERROR_PARAM; + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Initialize the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Enable the Double buffer mode */ + hdma->Instance->CR |= (uint32_t)DMA_SxCR_DBM; + + /* Configure DMA Stream destination address */ + hdma->Instance->M1AR = SecondMemAddress; + + /* Configure the source, destination address and the data length */ + DMA_MultiBufferSetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Clear all flags */ + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)); + __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)); + + /* Enable Common interrupts*/ + hdma->Instance->CR |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME; + hdma->Instance->FCR |= DMA_IT_FE; + + if((hdma->XferHalfCpltCallback != NULL) || (hdma->XferM1HalfCpltCallback != NULL)) + { + hdma->Instance->CR |= DMA_IT_HT; + } + + /* Enable the peripheral */ + __HAL_DMA_ENABLE(hdma); + } + else + { + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + /* Return error status */ + status = HAL_BUSY; + } + return status; +} + +/** + * @brief Change the memory0 or memory1 address on the fly. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param Address The new address + * @param memory the memory to be changed, This parameter can be one of + * the following values: + * MEMORY0 / + * MEMORY1 + * @note The MEMORY0 address can be changed only when the current transfer use + * MEMORY1 and the MEMORY1 address can be changed only when the current + * transfer use MEMORY0. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMAEx_ChangeMemory(DMA_HandleTypeDef *hdma, uint32_t Address, HAL_DMA_MemoryTypeDef memory) +{ + if(memory == MEMORY0) + { + /* change the memory0 address */ + hdma->Instance->M0AR = Address; + } + else + { + /* change the memory1 address */ + hdma->Instance->M1AR = Address; + } + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup DMAEx_Private_Functions + * @{ + */ + +/** + * @brief Set the DMA Transfer parameter. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +static void DMA_MultiBufferSetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + /* Configure DMA Stream data length */ + hdma->Instance->NDTR = DataLength; + + /* Peripheral to Memory */ + if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) + { + /* Configure DMA Stream destination address */ + hdma->Instance->PAR = DstAddress; + + /* Configure DMA Stream source address */ + hdma->Instance->M0AR = SrcAddress; + } + /* Memory to Peripheral */ + else + { + /* Configure DMA Stream source address */ + hdma->Instance->PAR = SrcAddress; + + /* Configure DMA Stream destination address */ + hdma->Instance->M0AR = DstAddress; + } +} + +/** + * @} + */ + +#endif /* HAL_DMA_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c new file mode 100644 index 0000000..04b5215 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c @@ -0,0 +1,547 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_exti.c + * @author MCD Application Team + * @brief EXTI HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2018 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### EXTI Peripheral features ##### + ============================================================================== + [..] + (+) Each Exti line can be configured within this driver. + + (+) Exti line can be configured in 3 different modes + (++) Interrupt + (++) Event + (++) Both of them + + (+) Configurable Exti lines can be configured with 3 different triggers + (++) Rising + (++) Falling + (++) Both of them + + (+) When set in interrupt mode, configurable Exti lines have two different + interrupts pending registers which allow to distinguish which transition + occurs: + (++) Rising edge pending interrupt + (++) Falling + + (+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can + be selected through multiplexer. + + ##### How to use this driver ##### + ============================================================================== + [..] + + (#) Configure the EXTI line using HAL_EXTI_SetConfigLine(). + (++) Choose the interrupt line number by setting "Line" member from + EXTI_ConfigTypeDef structure. + (++) Configure the interrupt and/or event mode using "Mode" member from + EXTI_ConfigTypeDef structure. + (++) For configurable lines, configure rising and/or falling trigger + "Trigger" member from EXTI_ConfigTypeDef structure. + (++) For Exti lines linked to gpio, choose gpio port using "GPIOSel" + member from GPIO_InitTypeDef structure. + + (#) Get current Exti configuration of a dedicated line using + HAL_EXTI_GetConfigLine(). + (++) Provide exiting handle as parameter. + (++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter. + + (#) Clear Exti configuration of a dedicated line using HAL_EXTI_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 + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @addtogroup EXTI + * @{ + */ +/** MISRA C:2012 deviation rule has been granted for following rule: + * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out + * of bounds [0,3] in following API : + * HAL_EXTI_SetConfigLine + * HAL_EXTI_GetConfigLine + * HAL_EXTI_ClearConfigLine + */ + +#ifdef HAL_EXTI_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @defgroup EXTI_Private_Constants EXTI Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup EXTI_Exported_Functions + * @{ + */ + +/** @addtogroup EXTI_Exported_Functions_Group1 + * @brief Configuration functions + * +@verbatim + =============================================================================== + ##### Configuration functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Set configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @param pExtiConfig Pointer on EXTI configuration to be set. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if ((hexti == NULL) || (pExtiConfig == NULL)) + { + return HAL_ERROR; + } + + /* Check parameters */ + assert_param(IS_EXTI_LINE(pExtiConfig->Line)); + assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); + + /* Assign line number to handle */ + hexti->Line = pExtiConfig->Line; + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; + } + else + { + EXTI->IMR &= ~maskline; + } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + + return HAL_OK; +} + +/** + * @brief Get configuration of a dedicated Exti line. + * @param hexti Exti handle. + * @param pExtiConfig Pointer on structure to store Exti configuration. + * @retval HAL Status. + */ +HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) +{ + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + + /* Check null pointer */ + if ((hexti == NULL) || (pExtiConfig == NULL)) + { + return HAL_ERROR; + } + + /* Check the parameter */ + assert_param(IS_EXTI_LINE(hexti->Line)); + + /* Store handle line number to configuration structure */ + pExtiConfig->Line = hexti->Line; + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) + { + pExtiConfig->Mode = EXTI_MODE_INTERRUPT; + } + else + { + pExtiConfig->Mode = EXTI_MODE_NONE; + } + + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) + { + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* Get default Trigger and GPIOSel configuration */ + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger = EXTI_TRIGGER_RISING; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = (SYSCFG->EXTICR[linepos >> 2u] << 16u ); + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 28u); + } + } + + 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 */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c new file mode 100644 index 0000000..2830da0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c @@ -0,0 +1,775 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash.c + * @author MCD Application Team + * @brief FLASH HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the internal FLASH memory: + * + Program operations functions + * + Memory Control functions + * + Peripheral Errors functions + * + @verbatim + ============================================================================== + ##### FLASH peripheral features ##### + ============================================================================== + + [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses + to the Flash memory. It implements the erase and program Flash memory operations + and the read and write protection mechanisms. + + [..] The Flash memory interface accelerates code execution with a system of instruction + prefetch and cache lines. + + [..] The FLASH main features are: + (+) Flash memory read operations + (+) Flash memory program/erase operations + (+) Read / write protections + (+) Prefetch on I-Code + (+) 64 cache lines of 128 bits on I-Code + (+) 8 cache lines of 128 bits on D-Code + + + ##### How to use this driver ##### + ============================================================================== + [..] + This driver provides functions and macros to configure and program the FLASH + memory of all STM32F4xx devices. + + (#) FLASH Memory IO Programming functions: + (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and + HAL_FLASH_Lock() functions + (++) Program functions: byte, half word, word and double word + (++) There Two modes of programming : + (+++) Polling mode using HAL_FLASH_Program() function + (+++) Interrupt mode using HAL_FLASH_Program_IT() function + + (#) Interrupts and flags management functions : + (++) Handle FLASH interrupts by calling HAL_FLASH_IRQHandler() + (++) Wait for last FLASH operation according to its status + (++) Get error flag status by calling HAL_SetErrorCode() + + [..] + In addition to these functions, this driver includes a set of macros allowing + to handle the following operations: + (+) Set the latency + (+) Enable/Disable the prefetch buffer + (+) Enable/Disable the Instruction cache and the Data cache + (+) Reset the Instruction cache and the Data cache + (+) Enable/Disable the FLASH interrupts + (+) Monitor the FLASH flags status + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASH FLASH + * @brief FLASH HAL module driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup FLASH_Private_Constants + * @{ + */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup FLASH_Private_Variables + * @{ + */ +/* Variable used for Erase sectors under interruption */ +FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/* 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 */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c new file mode 100644 index 0000000..d99eace --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c @@ -0,0 +1,1347 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ex.c + * @author MCD Application Team + * @brief Extended FLASH HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the FLASH extension peripheral: + * + Extended programming operations functions + * + @verbatim + ============================================================================== + ##### Flash Extension features ##### + ============================================================================== + + [..] Comparing to other previous devices, the FLASH interface for STM32F427xx/437xx and + STM32F429xx/439xx devices contains the following additional features + + (+) Capacity up to 2 Mbyte with dual bank architecture supporting read-while-write + capability (RWW) + (+) Dual bank memory organization + (+) PCROP protection for all banks + + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to configure and program the FLASH memory + of all STM32F427xx/437xx, STM32F429xx/439xx, STM32F469xx/479xx and STM32F446xx + devices. It includes + (#) FLASH Memory Erase functions: + (++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and + HAL_FLASH_Lock() functions + (++) Erase function: Erase sector, erase all sectors + (++) There are two modes of erase : + (+++) Polling Mode using HAL_FLASHEx_Erase() + (+++) Interrupt Mode using HAL_FLASHEx_Erase_IT() + + (#) Option Bytes Programming functions: Use HAL_FLASHEx_OBProgram() to : + (++) Set/Reset the write protection + (++) Set the Read protection Level + (++) Set the BOR level + (++) Program the user Option Bytes + (#) Advanced Option Bytes Programming functions: Use HAL_FLASHEx_AdvOBProgram() to : + (++) Extended space (bank 2) erase function + (++) Full FLASH space (2 Mo) erase (bank 1 and bank 2) + (++) Dual Boot activation + (++) Write protection configuration for bank 2 + (++) PCROP protection configuration and control for both banks + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASHEx FLASHEx + * @brief FLASH HAL Extension module driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Constants + * @{ + */ +#define FLASH_TIMEOUT_VALUE 50000U /* 50 s */ +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Variables + * @{ + */ +extern FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup FLASHEx_Private_Functions + * @{ + */ +/* Option bytes control */ +static void FLASH_MassErase(uint8_t VoltageRange, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WRPSector, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WRPSector, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t Level); +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t Iwdg, uint8_t Stop, uint8_t Stdby); +static HAL_StatusTypeDef FLASH_OB_BOR_LevelConfig(uint8_t Level); +static uint8_t FLASH_OB_GetUser(void); +static uint16_t FLASH_OB_GetWRP(void); +static uint8_t FLASH_OB_GetRDP(void); +static uint8_t FLASH_OB_GetBOR(void); + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) ||\ + defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) || defined(STM32F413xx) ||\ + defined(STM32F423xx) +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t Sector); +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t Sector); +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) +static HAL_StatusTypeDef FLASH_OB_EnablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_DisablePCROP(uint32_t SectorBank1, uint32_t SectorBank2, uint32_t Banks); +static HAL_StatusTypeDef FLASH_OB_BootConfig(uint8_t BootConfig); +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout); +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions + * @{ + */ + +/** @defgroup FLASHEx_Exported_Functions_Group1 Extended IO operation functions + * @brief Extended IO operation functions + * +@verbatim + =============================================================================== + ##### Extended programming operation functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to manage the Extension FLASH + programming operations. + +@endverbatim + * @{ + */ +/** + * @brief Perform a mass erase or erase the specified FLASH memory sectors + * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @param[out] SectorError pointer to variable that + * contains the configuration information on faulty sector in case of error + * (0xFFFFFFFFU means that all the sectors have been correctly erased) + * + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) +{ + HAL_StatusTypeDef status = 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 */ + +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c new file mode 100644 index 0000000..952595b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c @@ -0,0 +1,172 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_flash_ramfunc.c + * @author MCD Application Team + * @brief FLASH RAMFUNC module driver. + * This file provides a FLASH firmware functions which should be + * executed from internal SRAM + * + Stop/Start the flash interface while System Run + * + Enable/Disable the flash sleep while System Run + @verbatim + ============================================================================== + ##### APIs executed from Internal RAM ##### + ============================================================================== + [..] + *** ARM Compiler *** + -------------------- + [..] RAM functions are defined using the toolchain options. + Functions that are be executed in RAM should reside in a separate + source module. Using the 'Options for File' dialog you can simply change + the 'Code / Const' area of a module to a memory space in physical RAM. + Available memory areas are declared in the 'Target' tab of the + Options for Target' dialog. + + *** ICCARM Compiler *** + ----------------------- + [..] RAM functions are defined using a specific toolchain keyword "__ramfunc". + + *** GNU Compiler *** + -------------------- + [..] RAM functions are defined using a specific toolchain attribute + "__attribute__((section(".RamFunc")))". + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup FLASH_RAMFUNC FLASH RAMFUNC + * @brief FLASH functions executed from RAM + * @{ + */ +#ifdef HAL_FLASH_MODULE_ENABLED +#if defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || \ + defined(STM32F412Rx) || defined(STM32F412Cx) + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup FLASH_RAMFUNC_Exported_Functions FLASH RAMFUNC Exported Functions + * @{ + */ + +/** @defgroup FLASH_RAMFUNC_Exported_Functions_Group1 Peripheral features functions executed from internal RAM + * @brief Peripheral Extended features functions + * +@verbatim + + =============================================================================== + ##### ramfunc functions ##### + =============================================================================== + [..] + This subsection provides a set of functions that should be executed from RAM + transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Stop the flash interface while System Run + * @note This mode is only available for STM32F41xxx/STM32F446xx devices. + * @note This mode couldn't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StopFlashInterfaceClk(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Stop the flash interface while System Run */ + SET_BIT(PWR->CR, PWR_CR_FISSR); + + return HAL_OK; +} + +/** + * @brief Start the flash interface while System Run + * @note This mode is only available for STM32F411xx/STM32F446xx devices. + * @note This mode couldn't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_StartFlashInterfaceClk(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Start the flash interface while System Run */ + CLEAR_BIT(PWR->CR, PWR_CR_FISSR); + + return HAL_OK; +} + +/** + * @brief Enable the flash sleep while System Run + * @note This mode is only available for STM32F41xxx/STM32F446xx devices. + * @note This mode could n't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_EnableFlashSleepMode(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Enable the flash sleep while System Run */ + SET_BIT(PWR->CR, PWR_CR_FMSSR); + + return HAL_OK; +} + +/** + * @brief Disable the flash sleep while System Run + * @note This mode is only available for STM32F41xxx/STM32F446xx devices. + * @note This mode couldn't be set while executing with the flash itself. + * It should be done with specific routine executed from RAM. + * @retval HAL status + */ +__RAM_FUNC HAL_StatusTypeDef HAL_FLASHEx_DisableFlashSleepMode(void) +{ + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Disable the flash sleep while System Run */ + CLEAR_BIT(PWR->CR, PWR_CR_FMSSR); + + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* STM32F410xx || STM32F411xE || STM32F446xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx */ +#endif /* HAL_FLASH_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c new file mode 100644 index 0000000..b3ce9bb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c @@ -0,0 +1,533 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_gpio.c + * @author MCD Application Team + * @brief GPIO HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the General Purpose Input/Output (GPIO) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### GPIO Peripheral features ##### + ============================================================================== + [..] + Subject to the specific hardware characteristics of each I/O port listed in the datasheet, each + port bit of the General Purpose IO (GPIO) Ports, can be individually configured by software + in several modes: + (+) Input mode + (+) Analog mode + (+) Output mode + (+) Alternate function mode + (+) External interrupt/event lines + + [..] + During and just after reset, the alternate functions and external interrupt + lines are not active and the I/O ports are configured in input floating mode. + + [..] + All GPIO pins have weak internal pull-up and pull-down resistors, which can be + activated or not. + + [..] + In Output or Alternate mode, each IO can be configured on open-drain or push-pull + type and the IO speed can be selected depending on the VDD value. + + [..] + All ports have external interrupt/event capability. To use external interrupt + lines, the port must be configured in input mode. All available GPIO pins are + connected to the 16 external interrupt/event lines from EXTI0 to EXTI15. + + [..] + The external interrupt/event controller consists of up to 23 edge detectors + (16 lines are connected to GPIO) for generating event/interrupt requests (each + input line can be independently configured to select the type (interrupt or event) + and the corresponding trigger event (rising or falling or both). Each line can + also be masked independently. + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable the GPIO AHB clock using the following function: __HAL_RCC_GPIOx_CLK_ENABLE(). + + (#) Configure the GPIO pin(s) using HAL_GPIO_Init(). + (++) Configure the IO mode using "Mode" member from GPIO_InitTypeDef structure + (++) Activate Pull-up, Pull-down resistor using "Pull" member from GPIO_InitTypeDef + structure. + (++) In case of Output or alternate function mode selection: the speed is + configured through "Speed" member from GPIO_InitTypeDef structure. + (++) In alternate mode is selection, the alternate function connected to the IO + is configured through "Alternate" member from GPIO_InitTypeDef structure. + (++) Analog mode is required when a pin is to be used as ADC channel + or DAC output. + (++) In case of external interrupt/event selection the "Mode" member from + GPIO_InitTypeDef structure select the type (interrupt or event) and + the corresponding trigger event (rising or falling or both). + + (#) In case of external interrupt/event mode selection, configure NVIC IRQ priority + mapped to the EXTI line using HAL_NVIC_SetPriority() and enable it using + HAL_NVIC_EnableIRQ(). + + (#) To get the level of a pin configured in input mode use HAL_GPIO_ReadPin(). + + (#) To set/reset the level of a pin configured in output mode use + HAL_GPIO_WritePin()/HAL_GPIO_TogglePin(). + + (#) To lock pin configuration until next reset use HAL_GPIO_LockPin(). + + + (#) During and just after reset, the alternate functions are not + active and the GPIO pins are configured in input floating mode (except JTAG + pins). + + (#) The LSE oscillator pins OSC32_IN and OSC32_OUT can be used as general purpose + (PC14 and PC15, respectively) when the LSE oscillator is off. The LSE has + priority over the GPIO function. + + (#) The HSE oscillator pins OSC_IN/OSC_OUT can be used as + general purpose PH0 and PH1, respectively, when the HSE oscillator is off. + The HSE has priority over the GPIO function. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIO GPIO + * @brief GPIO HAL module driver + * @{ + */ + +#ifdef HAL_GPIO_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup GPIO_Private_Constants GPIO Private Constants + * @{ + */ + +#define GPIO_NUMBER 16U +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Functions GPIO Exported Functions + * @{ + */ + +/** @defgroup GPIO_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to initialize and de-initialize the GPIOs + to be ready for use. + +@endverbatim + * @{ + */ + + +/** + * @brief Initializes the GPIOx peripheral according to the specified parameters in the GPIO_Init. + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains + * the configuration information for the specified GPIO peripheral. + * @retval None + */ +void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) +{ + uint32_t position; + uint32_t ioposition = 0x00U; + uint32_t iocurrent = 0x00U; + uint32_t temp = 0x00U; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); + assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); + + /* Configure the port pins */ + for(position = 0U; position < GPIO_NUMBER; position++) + { + /* Get the IO position */ + ioposition = 0x01U << position; + /* Get the current IO position */ + iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; + + if(iocurrent == ioposition) + { + /*--------------------- GPIO Mode Configuration ------------------------*/ + /* In case of Output or Alternate function mode selection */ + if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || \ + (GPIO_Init->Mode & GPIO_MODE) == MODE_AF) + { + /* Check the Speed parameter */ + assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + /* Configure the IO Speed */ + temp = GPIOx->OSPEEDR; + temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); + temp |= (GPIO_Init->Speed << (position * 2U)); + GPIOx->OSPEEDR = temp; + + /* Configure the IO Output Type */ + temp = GPIOx->OTYPER; + temp &= ~(GPIO_OTYPER_OT_0 << position) ; + temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position); + GPIOx->OTYPER = temp; + } + + if((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG) + { + /* Check the parameters */ + assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); + + /* Activate the Pull-up or Pull down resistor for the current IO */ + temp = GPIOx->PUPDR; + temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); + temp |= ((GPIO_Init->Pull) << (position * 2U)); + GPIOx->PUPDR = temp; + } + + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3U]; + temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); + GPIOx->AFR[position >> 3U] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); + GPIOx->MODER = temp; + + /*--------------------- EXTI Mode Configuration ------------------------*/ + /* Configure the External Interrupt or event for the current IO */ + if((GPIO_Init->Mode & EXTI_MODE) != 0x00U) + { + /* Enable SYSCFG Clock */ + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + temp = SYSCFG->EXTICR[position >> 2U]; + temp &= ~(0x0FU << (4U * (position & 0x03U))); + temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); + SYSCFG->EXTICR[position >> 2U] = temp; + + /* Clear Rising Falling edge configuration */ + temp = EXTI->RTSR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00U) + { + temp |= iocurrent; + } + EXTI->RTSR = temp; + + temp = EXTI->FTSR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00U) + { + temp |= iocurrent; + } + EXTI->FTSR = temp; + + temp = EXTI->EMR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & EXTI_EVT) != 0x00U) + { + temp |= iocurrent; + } + EXTI->EMR = temp; + + /* Clear EXTI line configuration */ + temp = EXTI->IMR; + temp &= ~((uint32_t)iocurrent); + if((GPIO_Init->Mode & EXTI_IT) != 0x00U) + { + temp |= iocurrent; + } + EXTI->IMR = temp; + } + } + } +} + +/** + * @brief De-initializes the GPIOx peripheral registers to their default reset values. + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin specifies the port bit to be written. + * This parameter can be one of GPIO_PIN_x where x can be (0..15). + * @retval None + */ +void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) +{ + uint32_t position; + uint32_t ioposition = 0x00U; + uint32_t iocurrent = 0x00U; + uint32_t tmp = 0x00U; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + + /* Configure the port pins */ + for(position = 0U; position < GPIO_NUMBER; position++) + { + /* Get the IO position */ + ioposition = 0x01U << position; + /* Get the current IO position */ + iocurrent = (GPIO_Pin) & ioposition; + + if(iocurrent == ioposition) + { + /*------------------------- EXTI Mode Configuration --------------------*/ + tmp = SYSCFG->EXTICR[position >> 2U]; + tmp &= (0x0FU << (4U * (position & 0x03U))); + if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U)))) + { + /* Clear EXTI line configuration */ + EXTI->IMR &= ~((uint32_t)iocurrent); + EXTI->EMR &= ~((uint32_t)iocurrent); + + /* Clear Rising Falling edge configuration */ + EXTI->FTSR &= ~((uint32_t)iocurrent); + EXTI->RTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = 0x0FU << (4U * (position & 0x03U)); + SYSCFG->EXTICR[position >> 2U] &= ~tmp; + } + + /*------------------------- GPIO Mode Configuration --------------------*/ + /* Configure IO Direction in Input Floating Mode */ + GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2U)); + + /* Configure the default Alternate Function in current IO */ + GPIOx->AFR[position >> 3U] &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; + + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); + + /* Configure the default value IO Output Type */ + GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; + + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); + } + } +} + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions + * @brief GPIO Read and Write + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Reads the specified input port pin. + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin specifies the port bit to read. + * This parameter can be GPIO_PIN_x where x can be (0..15). + * @retval The input port pin value. + */ +GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + GPIO_PinState bitstatus; + + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) + { + bitstatus = GPIO_PIN_SET; + } + else + { + bitstatus = GPIO_PIN_RESET; + } + return bitstatus; +} + +/** + * @brief Sets or clears the selected data port bit. + * + * @note This function uses GPIOx_BSRR register to allow atomic read/modify + * accesses. In this way, there is no risk of an IRQ occurring between + * the read and the modify access. + * + * @param GPIOx where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin specifies the port bit to be written. + * This parameter can be one of GPIO_PIN_x where x can be (0..15). + * @param PinState specifies the value to be written to the selected bit. + * This parameter can be one of the GPIO_PinState enum values: + * @arg GPIO_PIN_RESET: to clear the port pin + * @arg GPIO_PIN_SET: to set the port pin + * @retval None + */ +void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) +{ + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + assert_param(IS_GPIO_PIN_ACTION(PinState)); + + if(PinState != GPIO_PIN_RESET) + { + GPIOx->BSRR = GPIO_Pin; + } + else + { + GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; + } +} + +/** + * @brief Toggles the specified GPIO pins. + * @param GPIOx Where x can be (A..K) to select the GPIO peripheral for STM32F429X device or + * x can be (A..I) to select the GPIO peripheral for STM32F40XX and STM32F427X devices. + * @param GPIO_Pin Specifies the pins to be toggled. + * @retval None + */ +void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + uint32_t odr; + + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + /* get current Output Data Register value */ + odr = GPIOx->ODR; + + /* Set selected pins that were at low level, and reset ones that were high */ + GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin); +} + +/** + * @brief Locks GPIO Pins configuration registers. + * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, + * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. + * @note The configuration of the locked GPIO pins can no longer be modified + * until the next reset. + * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F4 family + * @param GPIO_Pin specifies the port bit to be locked. + * This parameter can be any combination of GPIO_PIN_x where x can be (0..15). + * @retval None + */ +HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + __IO uint32_t tmp = GPIO_LCKR_LCKK; + + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + /* Apply lock key write sequence */ + tmp |= GPIO_Pin; + /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ + GPIOx->LCKR = tmp; + /* Reset LCKx bit(s): LCKK='0' + LCK[15-0] */ + GPIOx->LCKR = GPIO_Pin; + /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ + GPIOx->LCKR = tmp; + /* Read LCKR register. This read is mandatory to complete key lock sequence */ + tmp = GPIOx->LCKR; + + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + { + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief This function handles EXTI interrupt request. + * @param GPIO_Pin Specifies the pins connected EXTI line + * @retval None + */ +void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) +{ + /* EXTI line interrupt detected */ + if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) + { + __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); + HAL_GPIO_EXTI_Callback(GPIO_Pin); + } +} + +/** + * @brief EXTI line detection callbacks. + * @param GPIO_Pin Specifies the pins connected EXTI line + * @retval None + */ +__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(GPIO_Pin); + /* NOTE: This function Should not be modified, when the callback is needed, + the HAL_GPIO_EXTI_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + + +/** + * @} + */ + +#endif /* HAL_GPIO_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c new file mode 100644 index 0000000..b4bb483 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c @@ -0,0 +1,571 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr.c + * @author MCD Application Team + * @brief PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Power Controller (PWR) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup PWR PWR + * @brief PWR HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup PWR_Private_Constants + * @{ + */ + +/** @defgroup PWR_PVD_Mode_Mask PWR PVD Mode Mask + * @{ + */ +#define PVD_MODE_IT 0x00010000U +#define PVD_MODE_EVT 0x00020000U +#define PVD_RISING_EDGE 0x00000001U +#define PVD_FALLING_EDGE 0x00000002U +/** + * @} + */ + +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup PWR_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + After reset, the backup domain (RTC registers, RTC backup data + registers and backup SRAM) is protected against possible unwanted + write accesses. + To enable access to the RTC Domain and RTC registers, proceed as follows: + (+) Enable the Power Controller (PWR) APB1 interface clock using the + __HAL_RCC_PWR_CLK_ENABLE() macro. + (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. + +@endverbatim + * @{ + */ + +/** + * @brief Deinitializes the HAL PWR peripheral registers to their default reset values. + * @retval None + */ +void HAL_PWR_DeInit(void) +{ + __HAL_RCC_PWR_FORCE_RESET(); + __HAL_RCC_PWR_RELEASE_RESET(); +} + +/** + * @brief Enables access to the backup domain (RTC registers, RTC + * backup data registers and backup SRAM). + * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @note The following sequence is required to bypass the delay between + * DBP bit programming and the effective enabling of the backup domain. + * Please check the Errata Sheet for more details under "Possible delay + * in backup domain protection disabling/enabling after programming the + * DBP bit" section. + * @retval None + */ +void HAL_PWR_EnableBkUpAccess(void) +{ + __IO uint32_t dummyread; + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)ENABLE; + dummyread = PWR->CR; + UNUSED(dummyread); +} + +/** + * @brief Disables access to the backup domain (RTC registers, RTC + * backup data registers and backup SRAM). + * @note If the HSE divided by 2, 3, ..31 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @note The following sequence is required to bypass the delay between + * DBP bit programming and the effective disabling of the backup domain. + * Please check the Errata Sheet for more details under "Possible delay + * in backup domain protection disabling/enabling after programming the + * DBP bit" section. + * @retval None + */ +void HAL_PWR_DisableBkUpAccess(void) +{ + __IO uint32_t dummyread; + *(__IO uint32_t *) CR_DBP_BB = (uint32_t)DISABLE; + dummyread = PWR->CR; + UNUSED(dummyread); +} + +/** + * @} + */ + +/** @defgroup PWR_Exported_Functions_Group2 Peripheral Control functions + * @brief Low Power modes configuration functions + * +@verbatim + + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + + *** PVD configuration *** + ========================= + [..] + (+) The PVD is used to monitor the VDD power supply by comparing it to a + threshold selected by the PVD Level (PLS[2:0] bits in the PWR_CR). + (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower + than the PVD threshold. This event is internally connected to the EXTI + line16 and can generate an interrupt if enabled. This is done through + __HAL_PWR_PVD_EXTI_ENABLE_IT() macro. + (+) The PVD is stopped in Standby mode. + + *** Wake-up pin configuration *** + ================================ + [..] + (+) Wake-up pin is used to wake up the system from Standby mode. This pin is + forced in input pull-down configuration and is active on rising edges. + (+) There is one Wake-up pin: Wake-up Pin 1 on PA.00. + (++) For STM32F446xx there are two Wake-Up pins: Pin1 on PA.00 and Pin2 on PC.13 + (++) For STM32F410xx/STM32F412xx/STM32F413xx/STM32F423xx there are three Wake-Up pins: Pin1 on PA.00, Pin2 on PC.00 and Pin3 on PC.01 + + *** Low Power modes configuration *** + ===================================== + [..] + The devices feature 3 low-power modes: + (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. + (+) Stop mode: all clocks are stopped, regulator running, regulator + in low power mode + (+) Standby mode: 1.2V domain powered off. + + *** Sleep mode *** + ================== + [..] + (+) Entry: + The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(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 */ +/** + * @} + */ + +/** + * @} + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c new file mode 100644 index 0000000..77f9c35 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c @@ -0,0 +1,600 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_pwr_ex.c + * @author MCD Application Team + * @brief Extended PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of PWR extension peripheral: + * + Peripheral Extended features functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup PWREx PWREx + * @brief PWR HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup PWREx_Private_Constants + * @{ + */ +#define PWR_OVERDRIVE_TIMEOUT_VALUE 1000U +#define PWR_UDERDRIVE_TIMEOUT_VALUE 1000U +#define PWR_BKPREG_TIMEOUT_VALUE 1000U +#define PWR_VOSRDY_TIMEOUT_VALUE 1000U +/** + * @} + */ + + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Functions PWREx Exported Functions + * @{ + */ + +/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended features functions + * @brief Peripheral Extended features functions + * +@verbatim + + =============================================================================== + ##### Peripheral extended features functions ##### + =============================================================================== + + *** Main and Backup Regulators configuration *** + ================================================ + [..] + (+) The backup domain includes 4 Kbytes of backup SRAM accessible only from + the CPU, and address in 32-bit, 16-bit or 8-bit mode. Its content is + retained even in Standby or VBAT mode when the low power backup regulator + is enabled. It can be considered as an internal EEPROM when VBAT is + always present. You can use the HAL_PWREx_EnableBkUpReg() function to + enable the low power backup regulator. + + (+) When the backup domain is supplied by VDD (analog switch connected to VDD) + the backup SRAM is powered from VDD which replaces the VBAT power supply to + save battery life. + + (+) The backup SRAM is not mass erased by a tamper event. It is read + protected to prevent confidential data, such as cryptographic private + key, from being accessed. The backup SRAM can be erased only through + the Flash interface when a protection level change from level 1 to + level 0 is requested. + -@- Refer to the description of Read protection (RDP) in the Flash + programming manual. + + (+) The main internal regulator can be configured to have a tradeoff between + performance and power consumption when the device does not operate at + the maximum frequency. This is done through __HAL_PWR_MAINREGULATORMODE_CONFIG() + macro which configure VOS bit in PWR_CR register + + Refer to the product datasheets for more details. + + *** FLASH Power Down configuration **** + ======================================= + [..] + (+) By setting the FPDS bit in the PWR_CR register by using the + HAL_PWREx_EnableFlashPowerDown() function, the Flash memory also enters power + down mode when the device enters Stop mode. When the Flash memory + is in power down mode, an additional startup delay is incurred when + waking up from Stop mode. + + (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, the scale can be modified only when the PLL + is OFF and the HSI or HSE clock source is selected as system clock. + The new value programmed is active only when the PLL is ON. + When the PLL is OFF, the voltage scale 3 is automatically selected. + Refer to the datasheets for more details. + + *** Over-Drive and Under-Drive configuration **** + ================================================= + [..] + (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Run mode: the main regulator has + 2 operating modes available: + (++) Normal mode: The CPU and core logic operate at maximum frequency at a given + voltage scaling (scale 1, scale 2 or scale 3) + (++) Over-drive mode: This mode allows the CPU and the core logic to operate at a + higher frequency than the normal mode for a given voltage scaling (scale 1, + scale 2 or scale 3). This mode is enabled through HAL_PWREx_EnableOverDrive() function and + disabled by HAL_PWREx_DisableOverDrive() function, to enter or exit from Over-drive mode please follow + the sequence described in Reference manual. + + (+) For STM32F42xxx/43xxx/446xx/469xx/479xx Devices, in Stop mode: the main regulator or low power regulator + supplies a low power voltage to the 1.2V domain, thus preserving the content of registers + and internal SRAM. 2 operating modes are available: + (++) Normal mode: the 1.2V domain is preserved in nominal leakage mode. This mode is only + available when the main regulator or the low power regulator is used in Scale 3 or + low voltage mode. + (++) Under-drive mode: the 1.2V domain is preserved in reduced leakage mode. This mode is only + available when the main regulator or the low power regulator is in low voltage mode. + +@endverbatim + * @{ + */ + +/** + * @brief Enables the Backup Regulator. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_EnableBkUpReg(void) +{ + uint32_t tickstart = 0U; + + *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)ENABLE; + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till Backup regulator ready flag is set */ + while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) == RESET) + { + if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Disables the Backup Regulator. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_DisableBkUpReg(void) +{ + uint32_t tickstart = 0U; + + *(__IO uint32_t *) CSR_BRE_BB = (uint32_t)DISABLE; + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till Backup regulator ready flag is set */ + while(__HAL_PWR_GET_FLAG(PWR_FLAG_BRR) != RESET) + { + if((HAL_GetTick() - tickstart ) > PWR_BKPREG_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Enables the Flash Power Down in Stop mode. + * @retval None + */ +void HAL_PWREx_EnableFlashPowerDown(void) +{ + *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables the Flash Power Down in Stop mode. + * @retval None + */ +void HAL_PWREx_DisableFlashPowerDown(void) +{ + *(__IO uint32_t *) CR_FPDS_BB = (uint32_t)DISABLE; +} + +/** + * @brief Return Voltage Scaling Range. + * @retval The configured scale for the regulator voltage(VOS bit field). + * The returned value can be one of the following: + * - @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output Scale 1 mode + * - @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output Scale 2 mode + * - @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output Scale 3 mode + */ +uint32_t HAL_PWREx_GetVoltageRange(void) +{ + return (PWR->CR & PWR_CR_VOS); +} + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx) +/** + * @brief Configures the main internal regulator output voltage. + * @param VoltageScaling specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption. + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, + * the maximum value of fHCLK = 168 MHz. + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, + * the maximum value of fHCLK = 144 MHz. + * @note When moving from Range 1 to Range 2, the system frequency must be decreased to + * a value below 144 MHz before calling HAL_PWREx_ConfigVoltageScaling() API. + * When moving from Range 2 to Range 1, the system frequency can be increased to + * a value up to 168 MHz after calling HAL_PWREx_ConfigVoltageScaling() API. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) +{ + uint32_t tickstart = 0U; + + assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); + + /* Enable PWR RCC Clock Peripheral */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Set Range */ + __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) + { + if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +#elif defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) || \ + defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || \ + defined(STM32F410Rx) || defined(STM32F411xE) || defined(STM32F446xx) || defined(STM32F469xx) || \ + defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || \ + defined(STM32F412Cx) || defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Configures the main internal regulator output voltage. + * @param VoltageScaling specifies the regulator output voltage to achieve + * a tradeoff between performance and power consumption. + * This parameter can be one of the following values: + * @arg PWR_REGULATOR_VOLTAGE_SCALE1: Regulator voltage output range 1 mode, + * the maximum value of fHCLK is 168 MHz. It can be extended to + * 180 MHz by activating the over-drive mode. + * @arg PWR_REGULATOR_VOLTAGE_SCALE2: Regulator voltage output range 2 mode, + * the maximum value of fHCLK is 144 MHz. It can be extended to, + * 168 MHz by activating the over-drive mode. + * @arg PWR_REGULATOR_VOLTAGE_SCALE3: Regulator voltage output range 3 mode, + * the maximum value of fHCLK is 120 MHz. + * @note To update the system clock frequency(SYSCLK): + * - Set the HSI or HSE as system clock frequency using the HAL_RCC_ClockConfig(). + * - Call the HAL_RCC_OscConfig() to configure the PLL. + * - Call HAL_PWREx_ConfigVoltageScaling() API to adjust the voltage scale. + * - Set the new system clock frequency using the HAL_RCC_ClockConfig(). + * @note The scale can be modified only when the HSI or HSE clock source is selected + * as system clock source, otherwise the API returns HAL_ERROR. + * @note When the PLL is OFF, the voltage scale 3 is automatically selected and the VOS bits + * value in the PWR_CR1 register are not taken in account. + * @note This API forces the PLL state ON to allow the possibility to configure the voltage scale 1 or 2. + * @note The new voltage scale is active only when the PLL is ON. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling) +{ + uint32_t tickstart = 0U; + + assert_param(IS_PWR_VOLTAGE_SCALING_RANGE(VoltageScaling)); + + /* Enable PWR RCC Clock Peripheral */ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + /* Disable the main PLL */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + /* Wait till PLL is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Set Range */ + __HAL_PWR_VOLTAGESCALING_CONFIG(VoltageScaling); + + /* Enable the main PLL */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + while((__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY) == RESET)) + { + if((HAL_GetTick() - tickstart ) > PWR_VOSRDY_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#if defined(STM32F401xC) || defined(STM32F401xE) || defined(STM32F410Tx) || defined(STM32F410Cx) || defined(STM32F410Rx) ||\ + defined(STM32F411xE) || defined(STM32F412Zx) || defined(STM32F412Vx) || defined(STM32F412Rx) || defined(STM32F412Cx) ||\ + defined(STM32F413xx) || defined(STM32F423xx) +/** + * @brief Enables Main Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xx devices. + * @retval None + */ +void HAL_PWREx_EnableMainRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables Main Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xxdevices. + * @retval None + */ +void HAL_PWREx_DisableMainRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_MRLVDS_BB = (uint32_t)DISABLE; +} + +/** + * @brief Enables Low Power Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xx devices. + * @retval None + */ +void HAL_PWREx_EnableLowRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)ENABLE; +} + +/** + * @brief Disables Low Power Regulator low voltage mode. + * @note This mode is only available for STM32F401xx/STM32F410xx/STM32F411xx/STM32F412Zx/STM32F412Rx/STM32F412Vx/STM32F412Cx/ + * STM32F413xx/STM32F423xx devices. + * @retval None + */ +void HAL_PWREx_DisableLowRegulatorLowVoltage(void) +{ + *(__IO uint32_t *) CR_LPLVDS_BB = (uint32_t)DISABLE; +} + +#endif /* STM32F401xC || STM32F401xE || STM32F410xx || STM32F411xE || STM32F412Zx || STM32F412Rx || STM32F412Vx || STM32F412Cx || + STM32F413xx || STM32F423xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Activates the Over-Drive mode. + * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * This mode allows the CPU and the core logic to operate at a higher frequency + * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). + * @note It is recommended to enter or exit Over-drive mode when the application is not running + * critical tasks and when the system clock source is either HSI or HSE. + * During the Over-drive switch activation, no peripheral clocks should be enabled. + * The peripheral clocks must be enabled once the Over-drive mode is activated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_EnableOverDrive(void) +{ + uint32_t tickstart = 0U; + + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable the Over-drive to extend the clock frequency to 180 Mhz */ + __HAL_PWR_OVERDRIVE_ENABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) + { + if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Enable the Over-drive switch */ + __HAL_PWR_OVERDRIVESWITCHING_ENABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) + { + if((HAL_GetTick() - tickstart ) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @brief Deactivates the Over-Drive mode. + * @note This function can be used only for STM32F42xx/STM32F43xx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * This mode allows the CPU and the core logic to operate at a higher frequency + * than the normal mode for a given voltage scaling (scale 1, scale 2 or scale 3). + * @note It is recommended to enter or exit Over-drive mode when the application is not running + * critical tasks and when the system clock source is either HSI or HSE. + * During the Over-drive switch activation, no peripheral clocks should be enabled. + * The peripheral clocks must be enabled once the Over-drive mode is activated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_PWREx_DisableOverDrive(void) +{ + uint32_t tickstart = 0U; + + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Disable the Over-drive switch */ + __HAL_PWR_OVERDRIVESWITCHING_DISABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODSWRDY)) + { + if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Disable the Over-drive */ + __HAL_PWR_OVERDRIVE_DISABLE(); + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(__HAL_PWR_GET_FLAG(PWR_FLAG_ODRDY)) + { + if((HAL_GetTick() - tickstart) > PWR_OVERDRIVE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + return HAL_OK; +} + +/** + * @brief Enters in Under-Drive STOP mode. + * + * @note This mode is only available for STM32F42xxx/STM32F43xxx/STM32F446xx/STM32F469xx/STM32F479xx devices. + * + * @note This mode can be selected only when the Under-Drive is already active + * + * @note This mode is enabled only with STOP low power mode. + * In this mode, the 1.2V domain is preserved in reduced leakage mode. This + * mode is only available when the main regulator or the low power regulator + * is in low voltage mode + * + * @note If the Under-drive mode was enabled, it is automatically disabled after + * exiting Stop mode. + * When the voltage regulator operates in Under-drive mode, an additional + * startup delay is induced when waking up from Stop mode. + * + * @note In Stop mode, all I/O pins keep the same state as in Run mode. + * + * @note When exiting Stop mode by issuing an interrupt or a wake-up event, + * the HSI RC oscillator is selected as system clock. + * + * @note When the voltage regulator operates in low power mode, an additional + * startup delay is incurred when waking up from Stop mode. + * By keeping the internal regulator ON during Stop mode, the consumption + * is higher although the startup time is reduced. + * + * @param Regulator specifies the regulator state in STOP mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_UNDERDRIVE_ON: Main Regulator in under-drive mode + * and Flash memory in power-down when the device is in Stop under-drive mode + * @arg PWR_LOWPOWERREGULATOR_UNDERDRIVE_ON: Low Power Regulator in under-drive mode + * and Flash memory in power-down when the device is in Stop under-drive mode + * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_SLEEPENTRY_WFI: enter STOP mode with WFI instruction + * @arg PWR_SLEEPENTRY_WFE: enter STOP mode with WFE instruction + * @retval None + */ +HAL_StatusTypeDef HAL_PWREx_EnterUnderDriveSTOPMode(uint32_t Regulator, uint8_t STOPEntry) +{ + uint32_t tmpreg1 = 0U; + + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR_UNDERDRIVE(Regulator)); + assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); + + /* Enable Power ctrl clock */ + __HAL_RCC_PWR_CLK_ENABLE(); + /* Enable the Under-drive Mode ---------------------------------------------*/ + /* Clear Under-drive flag */ + __HAL_PWR_CLEAR_ODRUDR_FLAG(); + + /* Enable the Under-drive */ + __HAL_PWR_UNDERDRIVE_ENABLE(); + + /* Select the regulator state in STOP mode ---------------------------------*/ + tmpreg1 = PWR->CR; + /* Clear PDDS, LPDS, MRLUDS and LPLUDS bits */ + tmpreg1 &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS | PWR_CR_LPUDS | PWR_CR_MRUDS); + + /* Set LPDS, MRLUDS and LPLUDS bits according to PWR_Regulator value */ + tmpreg1 |= Regulator; + + /* Store the new value */ + PWR->CR = tmpreg1; + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + /* Select STOP mode entry --------------------------------------------------*/ + if(STOPEntry == PWR_SLEEPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __WFE(); + } + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + + return HAL_OK; +} + +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c new file mode 100644 index 0000000..f187348 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c @@ -0,0 +1,1122 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc.c + * @author MCD Application Team + * @brief RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Reset and Clock Control (RCC) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### RCC specific features ##### + ============================================================================== + [..] + After reset the device is running from Internal High Speed oscillator + (HSI 16MHz) with Flash 0 wait state, Flash prefetch buffer, D-Cache + and I-Cache are disabled, and all peripherals are off except internal + SRAM, Flash and JTAG. + (+) There is no prescaler on High speed (AHB) and Low speed (APB) busses; + all peripherals mapped on these busses are running at HSI speed. + (+) The clock for all peripherals is switched off, except the SRAM and FLASH. + (+) All GPIOs are in input floating state, except the JTAG pins which + are assigned to be used for debug purpose. + + [..] + Once the device started from reset, the user application has to: + (+) Configure the clock source to be used to drive the System clock + (if the application needs higher frequency/performance) + (+) Configure the System clock frequency and Flash settings + (+) Configure the AHB and APB busses prescalers + (+) Enable the clock for the peripheral(s) to be used + (+) Configure the clock source(s) for peripherals which clocks are not + derived from the System clock (I2S, RTC, ADC, USB OTG FS/SDIO/RNG) + + ##### RCC Limitations ##### + ============================================================================== + [..] + A delay between an RCC peripheral clock enable and the effective peripheral + enabling should be taken into account in order to manage the peripheral read/write + from/to registers. + (+) This delay depends on the peripheral mapping. + (+) If peripheral is mapped on AHB: the delay is 2 AHB clock cycle + after the clock enable bit is set on the hardware register + (+) If peripheral is mapped on APB: the delay is 2 APB clock cycle + after the clock enable bit is set on the hardware register + + [..] + Implemented Workaround: + (+) For AHB & APB peripherals, a dummy read to the peripheral register has been + inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. + + @endverbatim + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup RCC RCC + * @brief RCC HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup RCC_Private_Constants + * @{ + */ + +/* Private macro -------------------------------------------------------------*/ +#define __MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define MCO1_GPIO_PORT GPIOA +#define MCO1_PIN GPIO_PIN_8 + +#define __MCO2_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() +#define MCO2_GPIO_PORT GPIOC +#define MCO2_PIN GPIO_PIN_9 +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Variables RCC Private Variables + * @{ + */ +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to configure the internal/external oscillators + (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System busses clocks (SYSCLK, AHB, APB1 + and APB2). + + [..] Internal/external clock and PLL configuration + (#) HSI (high-speed internal), 16 MHz factory-trimmed RC used directly or through + the PLL as System clock source. + + (#) LSI (low-speed internal), 32 KHz low consumption RC used as IWDG and/or RTC + clock source. + + (#) HSE (high-speed external), 4 to 26 MHz crystal oscillator used directly or + through the PLL as System clock source. Can be used also as RTC clock source. + + (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. + + (#) PLL (clocked by HSI or HSE), featuring two different output clocks: + (++) The first output is used to generate the high speed system clock (up to 168 MHz) + (++) The second output is used to generate the clock for the USB OTG FS (48 MHz), + the random analog generator (<=48 MHz) and the SDIO (<= 48 MHz). + + (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() + and if a HSE clock failure occurs(HSE used directly or through PLL as System + clock source), the System clocks automatically switched to HSI and an interrupt + is generated if enabled. The interrupt is linked to the Cortex-M4 NMI + (Non-Maskable Interrupt) exception vector. + + (#) MCO1 (microcontroller clock output), used to output HSI, LSE, HSE or PLL + clock (through a configurable prescaler) on PA8 pin. + + (#) MCO2 (microcontroller clock output), used to output HSE, PLL, SYSCLK or PLLI2S + clock (through a configurable prescaler) on PC9 pin. + + [..] System, AHB and APB busses clocks configuration + (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, + HSE and PLL. + The AHB clock (HCLK) is derived from System clock through configurable + prescaler and used to clock the CPU, memory and peripherals mapped + on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived + from AHB clock through configurable prescalers and used to clock + the peripherals mapped on these busses. You can use + "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. + + (#) For the STM32F405xx/07xx and STM32F415xx/17xx devices, the maximum + frequency of the SYSCLK and HCLK is 168 MHz, PCLK2 84 MHz and PCLK1 42 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F42xxx, STM32F43xxx, STM32F446xx, STM32F469xx and STM32F479xx devices, + the maximum frequency of the SYSCLK and HCLK is 180 MHz, PCLK2 90 MHz and PCLK1 45 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F401xx, the maximum frequency of the SYSCLK and HCLK is 84 MHz, + PCLK2 84 MHz and PCLK1 42 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + + (#) For the STM32F41xxx, the maximum frequency of the SYSCLK and HCLK is 100 MHz, + PCLK2 100 MHz and PCLK1 50 MHz. + Depending on the device voltage range, the maximum frequency should + be adapted accordingly (refer to the product datasheets for more details). + +@endverbatim + * @{ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE and PLL OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS, MCO1 and MCO2 OFF + * - All interrupts disabled + * @note This function doesn't modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + return HAL_OK; +} + +/** + * @brief Initializes the RCC Oscillators according to the specified parameters in the + * RCC_OscInitTypeDef. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC Oscillators. + * @note The PLL is not disabled when used as system clock. + * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not + * supported by this API. User should request a transition to LSE Off + * first and then LSE On or LSE Bypass. + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this API. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_RCC_OscConfig(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 defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + 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 */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c new file mode 100644 index 0000000..5076628 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c @@ -0,0 +1,3784 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_rcc_ex.c + * @author MCD Application Team + * @brief Extension RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities RCC extension peripheral: + * + Extended Peripheral Control functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file in + * the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup RCCEx RCCEx + * @brief RCCEx HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup RCCEx_Private_Constants + * @{ + */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions + * @{ + */ + +/** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions + * @brief Extended Peripheral Control functions + * +@verbatim + =============================================================================== + ##### Extended Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the RCC Clocks + frequencies. + [..] + (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to + select the RTC clock source; in this case the Backup domain will be reset in + order to modify the RTC Clock source, as consequence RTC registers (including + the backup registers) and RCC_BDCR register are set to their reset values. + +@endverbatim + * @{ + */ + +#if defined(STM32F446xx) +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals + * clocks(I2S, SAI, LTDC RTC and TIM). + * + * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + * the RTC clock source; in this case the Backup domain will be reset in + * order to modify the RTC Clock source, as consequence RTC registers (including + * the backup registers) and RCC_BDCR register are set to their reset values. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t tmpreg1 = 0U; + uint32_t plli2sp = 0U; + uint32_t plli2sq = 0U; + uint32_t plli2sr = 0U; + uint32_t pllsaip = 0U; + uint32_t pllsaiq = 0U; + uint32_t plli2sused = 0U; + uint32_t pllsaiused = 0U; + + /* Check the peripheral clock selection parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*------------------------ I2S APB1 configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == (RCC_PERIPHCLK_I2S_APB1)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB1CLKSOURCE(PeriphClkInit->I2sApb1ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB1_CONFIG(PeriphClkInit->I2sApb1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- I2S APB2 configuration ----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == (RCC_PERIPHCLK_I2S_APB2)) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SAPB2CLKSOURCE(PeriphClkInit->I2sApb2ClockSelection)); + + /* Configure I2S Clock source */ + __HAL_RCC_I2S_APB2_CONFIG(PeriphClkInit->I2sApb2ClockSelection); + /* Enable the PLLI2S when it's used as clock source for I2S */ + if(PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*--------------------------- SAI1 configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == (RCC_PERIPHCLK_SAI1)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAI1CLKSOURCE(PeriphClkInit->Sai1ClockSelection)); + + /* Configure SAI1 Clock source */ + __HAL_RCC_SAI1_CONFIG(PeriphClkInit->Sai1ClockSelection); + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*-------------------------- SAI2 configuration ----------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == (RCC_PERIPHCLK_SAI2)) + { + /* Check the parameters */ + assert_param(IS_RCC_SAI2CLKSOURCE(PeriphClkInit->Sai2ClockSelection)); + + /* Configure SAI2 Clock source */ + __HAL_RCC_SAI2_CONFIG(PeriphClkInit->Sai2ClockSelection); + + /* Enable the PLLI2S when it's used as clock source for SAI */ + if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S) + { + plli2sused = 1U; + } + /* Enable the PLLSAI when it's used as clock source for SAI */ + if(PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- RTC configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + { + /* Check for RTC Parameters used to output RTCCLK */ + assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + + /* Enable Power Clock*/ + __HAL_RCC_PWR_CLK_ENABLE(); + + /* Enable write access to Backup domain */ + PWR->CR |= PWR_CR_DBP; + + /* Get tick */ + tickstart = HAL_GetTick(); + + while((PWR->CR & PWR_CR_DBP) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + tmpreg1 = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((tmpreg1 != 0x00000000U) && ((tmpreg1) != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = tmpreg1; + + /* Wait for LSE reactivation if LSE was enable prior to Backup Domain reset */ + if(HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSEON)) + { + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- TIM configuration ---------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM) == (RCC_PERIPHCLK_TIM)) + { + /* Configure Timer Prescaler */ + __HAL_RCC_TIMCLKPRESCALER(PeriphClkInit->TIMPresSelection); + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- FMPI2C1 Configuration -----------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_FMPI2C1) == RCC_PERIPHCLK_FMPI2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_FMPI2C1CLKSOURCE(PeriphClkInit->Fmpi2c1ClockSelection)); + + /* Configure the FMPI2C1 clock source */ + __HAL_RCC_FMPI2C1_CONFIG(PeriphClkInit->Fmpi2c1ClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ CEC Configuration -------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) + { + /* Check the parameters */ + assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- CLK48 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) + { + /* Check the parameters */ + assert_param(IS_RCC_CLK48CLKSOURCE(PeriphClkInit->Clk48ClockSelection)); + + /* Configure the CLK48 clock source */ + __HAL_RCC_CLK48_CONFIG(PeriphClkInit->Clk48ClockSelection); + + /* Enable the PLLSAI when it's used as clock source for CLK48 */ + if(PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP) + { + pllsaiused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- SDIO Configuration -------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDIO) == RCC_PERIPHCLK_SDIO) + { + /* Check the parameters */ + assert_param(IS_RCC_SDIOCLKSOURCE(PeriphClkInit->SdioClockSelection)); + + /* Configure the SDIO clock source */ + __HAL_RCC_SDIO_CONFIG(PeriphClkInit->SdioClockSelection); + } + /*--------------------------------------------------------------------------*/ + + /*------------------------------ SPDIFRX Configuration ---------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) + { + /* Check the parameters */ + assert_param(IS_RCC_SPDIFRXCLKSOURCE(PeriphClkInit->SpdifClockSelection)); + + /* Configure the SPDIFRX clock source */ + __HAL_RCC_SPDIFRX_CONFIG(PeriphClkInit->SpdifClockSelection); + /* Enable the PLLI2S when it's used as clock source for SPDIFRX */ + if(PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP) + { + plli2sused = 1U; + } + } + /*--------------------------------------------------------------------------*/ + + /*---------------------------- PLLI2S Configuration ------------------------*/ + /* PLLI2S is configured when a peripheral will use it as source clock : SAI1, SAI2, I2S on APB1, + I2S on APB2 or SPDIFRX */ + if((plli2sused == 1U) || (PeriphClkInit->PeriphClockSelection == RCC_PERIPHCLK_PLLI2S)) + { + /* Disable the PLLI2S */ + __HAL_RCC_PLLI2S_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* check for common PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SM_VALUE(PeriphClkInit->PLLI2S.PLLI2SM)); + assert_param(IS_RCC_PLLI2SN_VALUE(PeriphClkInit->PLLI2S.PLLI2SN)); + + /*------ In Case of PLLI2S is selected as source clock for I2S -----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB1) == RCC_PERIPHCLK_I2S_APB1) && (PeriphClkInit->I2sApb1ClockSelection == RCC_I2SAPB1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S_APB2) == RCC_PERIPHCLK_I2S_APB2) && (PeriphClkInit->I2sApb2ClockSelection == RCC_I2SAPB2CLKSOURCE_PLLI2S))) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + + /* Read PLLI2SP/PLLI2SQ value from PLLI2SCFGR register (this value is not needed for I2S configuration) */ + plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sq = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* I2SCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SR */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, plli2sq, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /*------- In Case of PLLI2S is selected as source clock for SAI ----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLI2S)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLI2S))) + { + /* Check for PLLI2S Parameters */ + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + /* Check for PLLI2S/DIVQ parameters */ + assert_param(IS_RCC_PLLI2S_DIVQ_VALUE(PeriphClkInit->PLLI2SDivQ)); + + /* Read PLLI2SP/PLLI2SR value from PLLI2SCFGR register (this value is not needed for SAI configuration) */ + plli2sp = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , plli2sp, PeriphClkInit->PLLI2S.PLLI2SQ, plli2sr); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + __HAL_RCC_PLLI2S_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLI2SDivQ); + } + + /*------ In Case of PLLI2S is selected as source clock for SPDIFRX -------*/ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SPDIFRX) == RCC_PERIPHCLK_SPDIFRX) && (PeriphClkInit->SpdifClockSelection == RCC_SPDIFRXCLKSOURCE_PLLI2SP)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); + /* Read PLLI2SR value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + plli2sq = ((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + plli2sr = ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + /* SPDIFRXCLK = f(PLLI2S clock output) = f(VCO clock) / PLLI2SP */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, plli2sq, plli2sr); + } + + /*----------------- In Case of PLLI2S is just selected -----------------*/ + if((PeriphClkInit->PeriphClockSelection & RCC_PERIPHCLK_PLLI2S) == RCC_PERIPHCLK_PLLI2S) + { + /* Check for Parameters */ + assert_param(IS_RCC_PLLI2SP_VALUE(PeriphClkInit->PLLI2S.PLLI2SP)); + assert_param(IS_RCC_PLLI2SR_VALUE(PeriphClkInit->PLLI2S.PLLI2SR)); + assert_param(IS_RCC_PLLI2SQ_VALUE(PeriphClkInit->PLLI2S.PLLI2SQ)); + + /* Configure the PLLI2S division factors */ + /* PLLI2S_VCO = f(VCO clock) = f(PLLI2S clock input) * (PLLI2SN/PLLI2SM) */ + __HAL_RCC_PLLI2S_CONFIG(PeriphClkInit->PLLI2S.PLLI2SM, PeriphClkInit->PLLI2S.PLLI2SN , PeriphClkInit->PLLI2S.PLLI2SP, PeriphClkInit->PLLI2S.PLLI2SQ, PeriphClkInit->PLLI2S.PLLI2SR); + } + + /* Enable the PLLI2S */ + __HAL_RCC_PLLI2S_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLI2S is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLI2SRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLI2S_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + /*--------------------------------------------------------------------------*/ + + /*----------------------------- PLLSAI Configuration -----------------------*/ + /* PLLSAI is configured when a peripheral will use it as source clock : SAI1, SAI2, CLK48 or SDIO */ + if(pllsaiused == 1U) + { + /* Disable PLLSAI Clock */ + __HAL_RCC_PLLSAI_DISABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is disabled */ + while(__HAL_RCC_PLLSAI_GET_FLAG() != RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + + /* Check the PLLSAI division factors */ + assert_param(IS_RCC_PLLSAIM_VALUE(PeriphClkInit->PLLSAI.PLLSAIM)); + assert_param(IS_RCC_PLLSAIN_VALUE(PeriphClkInit->PLLSAI.PLLSAIN)); + + /*------ In Case of PLLSAI is selected as source clock for SAI -----------*/ + if(((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI1) == RCC_PERIPHCLK_SAI1) && (PeriphClkInit->Sai1ClockSelection == RCC_SAI1CLKSOURCE_PLLSAI)) || + ((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SAI2) == RCC_PERIPHCLK_SAI2) && (PeriphClkInit->Sai2ClockSelection == RCC_SAI2CLKSOURCE_PLLSAI))) + { + /* check for PLLSAIQ Parameter */ + assert_param(IS_RCC_PLLSAIQ_VALUE(PeriphClkInit->PLLSAI.PLLSAIQ)); + /* check for PLLSAI/DIVQ Parameter */ + assert_param(IS_RCC_PLLSAI_DIVQ_VALUE(PeriphClkInit->PLLSAIDivQ)); + + /* Read PLLSAIP value from PLLSAICFGR register (this value is not needed for SAI configuration) */ + pllsaip = ((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + /* PLLSAI_VCO Input = PLL_SOURCE/PLLM */ + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , pllsaip, PeriphClkInit->PLLSAI.PLLSAIQ, 0U); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + __HAL_RCC_PLLSAI_PLLSAICLKDIVQ_CONFIG(PeriphClkInit->PLLSAIDivQ); + } + + /*------ In Case of PLLSAI is selected as source clock for CLK48 ---------*/ + /* In Case of PLLI2S is selected as source clock for CLK48 */ + if((((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CLK48) == RCC_PERIPHCLK_CLK48) && (PeriphClkInit->Clk48ClockSelection == RCC_CLK48CLKSOURCE_PLLSAIP)) + { + /* check for Parameters */ + assert_param(IS_RCC_PLLSAIP_VALUE(PeriphClkInit->PLLSAI.PLLSAIP)); + /* Read PLLSAIQ value from PLLI2SCFGR register (this value is not need for SAI configuration) */ + pllsaiq = ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Configure the PLLSAI division factors */ + /* PLLSAI_VCO = f(VCO clock) = f(PLLSAI clock input) * (PLLI2SN/PLLSAIM) */ + /* 48CLK = f(PLLSAI clock output) = f(VCO clock) / PLLSAIP */ + __HAL_RCC_PLLSAI_CONFIG(PeriphClkInit->PLLSAI.PLLSAIM, PeriphClkInit->PLLSAI.PLLSAIN , PeriphClkInit->PLLSAI.PLLSAIP, pllsaiq, 0U); + } + + /* Enable PLLSAI Clock */ + __HAL_RCC_PLLSAI_ENABLE(); + /* Get tick */ + tickstart = HAL_GetTick(); + /* Wait till PLLSAI is ready */ + while(__HAL_RCC_PLLSAI_GET_FLAG() == RESET) + { + if((HAL_GetTick() - tickstart ) > PLLSAI_TIMEOUT_VALUE) + { + /* return in case of Timeout detected */ + return HAL_TIMEOUT; + } + } + } + return HAL_OK; +} + +/** + * @brief Get the RCC_PeriphCLKInitTypeDef according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tempreg; + + /* Set all possible values for the extended clock type parameter------------*/ + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_I2S_APB2 |\ + RCC_PERIPHCLK_SAI1 | RCC_PERIPHCLK_SAI2 |\ + RCC_PERIPHCLK_TIM | RCC_PERIPHCLK_RTC |\ + RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_FMPI2C1 |\ + RCC_PERIPHCLK_CLK48 | RCC_PERIPHCLK_SDIO |\ + RCC_PERIPHCLK_SPDIFRX; + + /* Get the PLLI2S Clock configuration --------------------------------------*/ + PeriphClkInit->PLLI2S.PLLI2SM = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM) >> RCC_PLLI2SCFGR_PLLI2SM_Pos); + PeriphClkInit->PLLI2S.PLLI2SN = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> RCC_PLLI2SCFGR_PLLI2SN_Pos); + PeriphClkInit->PLLI2S.PLLI2SP = (uint32_t)((((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SP) >> RCC_PLLI2SCFGR_PLLI2SP_Pos) + 1U) << 1U); + PeriphClkInit->PLLI2S.PLLI2SQ = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> RCC_PLLI2SCFGR_PLLI2SQ_Pos); + PeriphClkInit->PLLI2S.PLLI2SR = (uint32_t)((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> RCC_PLLI2SCFGR_PLLI2SR_Pos); + /* Get the PLLSAI Clock configuration --------------------------------------*/ + PeriphClkInit->PLLSAI.PLLSAIM = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM) >> RCC_PLLSAICFGR_PLLSAIM_Pos); + PeriphClkInit->PLLSAI.PLLSAIN = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> RCC_PLLSAICFGR_PLLSAIN_Pos); + PeriphClkInit->PLLSAI.PLLSAIP = (uint32_t)((((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIP) >> RCC_PLLSAICFGR_PLLSAIP_Pos) + 1U) << 1U); + PeriphClkInit->PLLSAI.PLLSAIQ = (uint32_t)((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> RCC_PLLSAICFGR_PLLSAIQ_Pos); + /* Get the PLLSAI/PLLI2S division factors ----------------------------------*/ + PeriphClkInit->PLLI2SDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) >> RCC_DCKCFGR_PLLI2SDIVQ_Pos); + PeriphClkInit->PLLSAIDivQ = (uint32_t)((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> RCC_DCKCFGR_PLLSAIDIVQ_Pos); + + /* Get the SAI1 clock configuration ----------------------------------------*/ + PeriphClkInit->Sai1ClockSelection = __HAL_RCC_GET_SAI1_SOURCE(); + + /* Get the SAI2 clock configuration ----------------------------------------*/ + PeriphClkInit->Sai2ClockSelection = __HAL_RCC_GET_SAI2_SOURCE(); + + /* Get the I2S APB1 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb1ClockSelection = __HAL_RCC_GET_I2S_APB1_SOURCE(); + + /* Get the I2S APB2 clock configuration ------------------------------------*/ + PeriphClkInit->I2sApb2ClockSelection = __HAL_RCC_GET_I2S_APB2_SOURCE(); + + /* Get the RTC Clock configuration -----------------------------------------*/ + tempreg = (RCC->CFGR & RCC_CFGR_RTCPRE); + PeriphClkInit->RTCClockSelection = (uint32_t)((tempreg) | (RCC->BDCR & RCC_BDCR_RTCSEL)); + + /* Get the CEC clock configuration -----------------------------------------*/ + PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); + + /* Get the FMPI2C1 clock configuration -------------------------------------*/ + PeriphClkInit->Fmpi2c1ClockSelection = __HAL_RCC_GET_FMPI2C1_SOURCE(); + + /* Get the CLK48 clock configuration ----------------------------------------*/ + PeriphClkInit->Clk48ClockSelection = __HAL_RCC_GET_CLK48_SOURCE(); + + /* Get the SDIO clock configuration ----------------------------------------*/ + PeriphClkInit->SdioClockSelection = __HAL_RCC_GET_SDIO_SOURCE(); + + /* Get the SPDIFRX clock configuration -------------------------------------*/ + PeriphClkInit->SpdifClockSelection = __HAL_RCC_GET_SPDIFRX_SOURCE(); + + /* Get the TIM Prescaler configuration -------------------------------------*/ + if ((RCC->DCKCFGR & RCC_DCKCFGR_TIMPRE) == RESET) + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_DESACTIVATED; + } + else + { + PeriphClkInit->TIMPresSelection = RCC_TIMPRES_ACTIVATED; + } +} + +/** + * @brief Return the peripheral clock frequency for a given peripheral(SAI..) + * @note Return 0 if peripheral clock identifier not managed by this API + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg RCC_PERIPHCLK_SAI1: SAI1 peripheral clock + * @arg RCC_PERIPHCLK_SAI2: SAI2 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB1: I2S APB1 peripheral clock + * @arg RCC_PERIPHCLK_I2S_APB2: I2S APB2 peripheral clock + * @retval Frequency in KHz + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + uint32_t tmpreg1 = 0U; + /* This variable used to store the SAI clock frequency (value in Hz) */ + uint32_t frequency = 0U; + /* This variable used to store the VCO Input (value in Hz) */ + uint32_t vcoinput = 0U; + /* This variable used to store the SAI clock source */ + uint32_t saiclocksource = 0U; + uint32_t srcclk = 0U; + /* This variable used to store the VCO Output (value in Hz) */ + uint32_t vcooutput = 0U; + switch (PeriphClk) + { + case RCC_PERIPHCLK_SAI1: + case RCC_PERIPHCLK_SAI2: + { + saiclocksource = RCC->DCKCFGR; + saiclocksource &= (RCC_DCKCFGR_SAI1SRC | RCC_DCKCFGR_SAI2SRC); + switch (saiclocksource) + { + case 0U: /* PLLSAI is the clock source for SAI*/ + { + /* Configure the PLLSAI division factor */ + /* PLLSAI_VCO Input = PLL_SOURCE/PLLSAIM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIM))); + } + /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN */ + /* SAI_CLK(first level) = PLLSAI_VCO Output/PLLSAIQ */ + tmpreg1 = (RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLSAICFGR & RCC_PLLSAICFGR_PLLSAIN) >> 6U))/(tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLSAIDIVQ */ + tmpreg1 = (((RCC->DCKCFGR & RCC_DCKCFGR_PLLSAIDIVQ) >> 8U) + 1U); + frequency = frequency/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC_0: /* PLLI2S is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_0: /* PLLI2S is the clock source for SAI*/ + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM))); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + /* SAI_CLK(first level) = PLLI2S_VCO Output/PLLI2SQ */ + tmpreg1 = (RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SQ) >> 24U; + frequency = (vcoinput * ((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U))/(tmpreg1); + + /* SAI_CLK_x = SAI_CLK(first level)/PLLI2SDIVQ */ + tmpreg1 = ((RCC->DCKCFGR & RCC_DCKCFGR_PLLI2SDIVQ) + 1U); + frequency = frequency/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC_1: /* PLLR is the clock source for SAI*/ + case RCC_DCKCFGR_SAI2SRC_1: /* PLLR is the clock source for SAI*/ + { + /* Configure the PLLI2S division factor */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + vcoinput = (HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + vcoinput = ((HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM))); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + /* SAI_CLK_x = PLL_VCO Output/PLLR */ + tmpreg1 = (RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U; + frequency = (vcoinput * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U))/(tmpreg1); + break; + } + case RCC_DCKCFGR_SAI1SRC: /* External clock is the clock source for SAI*/ + { + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + case RCC_DCKCFGR_SAI2SRC: /* PLLSRC(HSE or HSI) is the clock source for SAI*/ + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSI) + { + /* In Case the PLL Source is HSI (Internal Clock) */ + frequency = (uint32_t)(HSI_VALUE); + } + else + { + /* In Case the PLL Source is HSE (External Clock) */ + frequency = (uint32_t)(HSE_VALUE); + } + break; + } + default : + { + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB1: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB1_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB1CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB1CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + case RCC_PERIPHCLK_I2S_APB2: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_APB2_SOURCE(); + switch (srcclk) + { + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_EXT: + { + /* Set the I2S clock to the external clock value */ + frequency = EXTERNAL_CLOCK_VALUE; + break; + } + /* Check if I2S clock selection is PLLI2S VCO output clock divided by PLLI2SR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLI2S: + { + /* Configure the PLLI2S division factor */ + /* PLLI2S_VCO Input = PLL_SOURCE/PLLI2SM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SM)); + } + + /* PLLI2S_VCO Output = PLLI2S_VCO Input * PLLI2SN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SN) >> 6U) & (RCC_PLLI2SCFGR_PLLI2SN >> 6U))); + /* I2S_CLK = PLLI2S_VCO Output/PLLI2SR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLI2SCFGR & RCC_PLLI2SCFGR_PLLI2SR) >> 28U) & (RCC_PLLI2SCFGR_PLLI2SR >> 28U))); + break; + } + /* Check if I2S clock selection is PLL VCO Output divided by PLLR used as I2S clock */ + case RCC_I2SAPB2CLKSOURCE_PLLR: + { + /* Configure the PLL division factor R */ + /* PLL_VCO Input = PLL_SOURCE/PLLM */ + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSE_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + else + { + /* Get the I2S source clock value */ + vcoinput = (uint32_t)(HSI_VALUE / (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM)); + } + + /* PLL_VCO Output = PLL_VCO Input * PLLN */ + vcooutput = (uint32_t)(vcoinput * (((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6U) & (RCC_PLLCFGR_PLLN >> 6U))); + /* I2S_CLK = PLL_VCO Output/PLLR */ + frequency = (uint32_t)(vcooutput /(((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 28U) & (RCC_PLLCFGR_PLLR >> 28U))); + break; + } + /* Check if I2S clock selection is HSI or HSE depending from PLL source Clock */ + case RCC_I2SAPB2CLKSOURCE_PLLSRC: + { + if((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLSOURCE_HSE) + { + frequency = HSE_VALUE; + } + else + { + frequency = HSI_VALUE; + } + break; + } + /* Clock not enabled for I2S*/ + default: + { + frequency = 0U; + break; + } + } + break; + } + } + 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, pll_config; + + /* Check Null pointer */ + if(RCC_OscInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + /*------------------------------- HSE Configuration ------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + /* When the HSE is used as system clock or clock source for PLL in these cases HSE will not disabled */ +#if defined(STM32F446xx) + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) +#else + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) +#endif /* STM32F446xx */ + { + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + + /* Check the HSE State */ + if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSE is bypassed or disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + + /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ +#if defined(STM32F446xx) + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) +#else + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ + ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) +#endif /* STM32F446xx */ + { + /* When HSI is used as system clock it will not disabled */ + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + { + return HAL_ERROR; + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + } + else + { + /* Check the HSI State */ + if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + { + FlagStatus pwrclkchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + + /* Update LSE configuration in Backup Domain control register */ + /* Requires to enable write access to Backup Domain of necessary */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + /* Check the LSE State */ + if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Restore clock configuration if changed */ + if(pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + { + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) + { + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLLM_VALUE(RCC_OscInitStruct->PLL.PLLM)); + assert_param(IS_RCC_PLLN_VALUE(RCC_OscInitStruct->PLL.PLLN)); + assert_param(IS_RCC_PLLP_VALUE(RCC_OscInitStruct->PLL.PLLP)); + assert_param(IS_RCC_PLLQ_VALUE(RCC_OscInitStruct->PLL.PLLQ)); + assert_param(IS_RCC_PLLR_VALUE(RCC_OscInitStruct->PLL.PLLR)); + + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Configure the main PLL clock source, multiplication and division factors. */ + WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ + RCC_OscInitStruct->PLL.PLLM | \ + (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ + (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ + (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos) | \ + (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))); + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick*/ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + else + { + /* Check if there is a request to disable the PLL used as System clock source */ + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + { + return HAL_ERROR; + } + else + { + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + } + } + } + } + return HAL_OK; +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that will be configured. + * + * @note This function is only available in case of STM32F410xx/STM32F446xx/STM32F469xx/STM32F479xx/STM32F412Zx/STM32F412Vx/STM32F412Rx/STM32F412Cx devices. + * @note This function add the PLL/PLLR factor management + * @retval None + */ +void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Set all possible values for the Oscillator type parameter ---------------*/ + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; + + /* Get the HSE configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + { + RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; + } + else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + { + RCC_OscInitStruct->HSEState = RCC_HSE_ON; + } + else + { + RCC_OscInitStruct->HSEState = RCC_HSE_OFF; + } + + /* Get the HSI configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + { + RCC_OscInitStruct->HSIState = RCC_HSI_ON; + } + else + { + RCC_OscInitStruct->HSIState = RCC_HSI_OFF; + } + + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + + /* Get the LSE configuration -----------------------------------------------*/ + if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + { + RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + } + else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + { + RCC_OscInitStruct->LSEState = RCC_LSE_ON; + } + else + { + RCC_OscInitStruct->LSEState = RCC_LSE_OFF; + } + + /* Get the LSI configuration -----------------------------------------------*/ + if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + { + RCC_OscInitStruct->LSIState = RCC_LSI_ON; + } + else + { + RCC_OscInitStruct->LSIState = RCC_LSI_OFF; + } + + /* Get the PLL configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + } + else + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; + } + RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLM = (uint32_t)(RCC->PLLCFGR & RCC_PLLCFGR_PLLM); + RCC_OscInitStruct->PLL.PLLN = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + RCC_OscInitStruct->PLL.PLLP = (uint32_t)((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) + RCC_PLLCFGR_PLLP_0) << 1U) >> RCC_PLLCFGR_PLLP_Pos); + RCC_OscInitStruct->PLL.PLLQ = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLQ) >> RCC_PLLCFGR_PLLQ_Pos); + RCC_OscInitStruct->PLL.PLLR = (uint32_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); +} +#endif /* STM32F410xx || STM32F446xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx || STM32F412Rx || STM32F412Cx || STM32F413xx || STM32F423xx */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c new file mode 100644 index 0000000..1ca1781 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c @@ -0,0 +1,7621 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer (TIM) peripheral: + * + TIM Time Base Initialization + * + TIM Time Base Start + * + TIM Time Base Start Interruption + * + TIM Time Base Start DMA + * + TIM Output Compare/PWM Initialization + * + TIM Output Compare/PWM Channel Configuration + * + TIM Output Compare/PWM Start + * + TIM Output Compare/PWM Start Interruption + * + TIM Output Compare/PWM Start DMA + * + TIM Input Capture Initialization + * + TIM Input Capture Channel Configuration + * + TIM Input Capture Start + * + TIM Input Capture Start Interruption + * + TIM Input Capture Start DMA + * + TIM One Pulse Initialization + * + TIM One Pulse Channel Configuration + * + TIM One Pulse Start + * + TIM Encoder Interface Initialization + * + TIM Encoder Interface Start + * + TIM Encoder Interface Start Interruption + * + TIM Encoder Interface Start DMA + * + Commutation Event configuration with Interruption and DMA + * + TIM OCRef clear configuration + * + TIM External Clock configuration + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### TIMER Generic features ##### + ============================================================================== + [..] The Timer features include: + (#) 16-bit up, down, up/down auto-reload counter. + (#) 16-bit programmable prescaler allowing dividing (also on the fly) the + counter clock frequency either by any factor between 1 and 65536. + (#) Up to 4 independent channels for: + (++) Input Capture + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to interconnect + several timers together. + (#) Supports incremental encoder for positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Time Base : HAL_TIM_Base_MspInit() + (++) Input Capture : HAL_TIM_IC_MspInit() + (++) Output Compare : HAL_TIM_OC_MspInit() + (++) PWM generation : HAL_TIM_PWM_MspInit() + (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() + (++) Encoder mode output : HAL_TIM_Encoder_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + Initialization function of this driver: + (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base + (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an + Output Compare signal. + (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a + PWM signal. + (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an + external signal. + (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer + in One Pulse Mode. + (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. + + (#) Activate the TIM peripheral using one of the start functions depending from the feature used: + (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() + (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() + (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() + (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() + (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() + (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). + + (#) The DMA Burst is managed with the two following functions: + HAL_TIM_DMABurst_WriteStart() + HAL_TIM_DMABurst_ReadStart() + + *** Callback registration *** + ============================================= + + [..] + The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function HAL_TIM_RegisterCallback() to register a callback. + HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, + the Callback ID and a pointer to the user callback function. + + [..] + Use function HAL_TIM_UnRegisterCallback() to reset a callback to the default + weak function. + HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + + [..] + These functions allow to register/unregister following callbacks: + (+) Base_MspInitCallback : TIM Base Msp Init Callback. + (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. + (+) IC_MspInitCallback : TIM IC Msp Init Callback. + (+) IC_MspDeInitCallback : TIM IC Msp DeInit Callback. + (+) OC_MspInitCallback : TIM OC Msp Init Callback. + (+) OC_MspDeInitCallback : TIM OC Msp DeInit Callback. + (+) PWM_MspInitCallback : TIM PWM Msp Init Callback. + (+) PWM_MspDeInitCallback : TIM PWM Msp DeInit Callback. + (+) OnePulse_MspInitCallback : TIM One Pulse Msp Init Callback. + (+) OnePulse_MspDeInitCallback : TIM One Pulse Msp DeInit Callback. + (+) Encoder_MspInitCallback : TIM Encoder Msp Init Callback. + (+) Encoder_MspDeInitCallback : TIM Encoder Msp DeInit Callback. + (+) HallSensor_MspInitCallback : TIM Hall Sensor Msp Init Callback. + (+) HallSensor_MspDeInitCallback : TIM Hall Sensor Msp DeInit Callback. + (+) PeriodElapsedCallback : TIM Period Elapsed Callback. + (+) PeriodElapsedHalfCpltCallback : TIM Period Elapsed half complete Callback. + (+) TriggerCallback : TIM Trigger Callback. + (+) TriggerHalfCpltCallback : TIM Trigger half complete Callback. + (+) IC_CaptureCallback : TIM Input Capture Callback. + (+) IC_CaptureHalfCpltCallback : TIM Input Capture half complete Callback. + (+) OC_DelayElapsedCallback : TIM Output Compare Delay Elapsed Callback. + (+) PWM_PulseFinishedCallback : TIM PWM Pulse Finished Callback. + (+) PWM_PulseFinishedHalfCpltCallback : TIM PWM Pulse Finished half complete Callback. + (+) ErrorCallback : TIM Error Callback. + (+) CommutationCallback : TIM Commutation Callback. + (+) CommutationHalfCpltCallback : TIM Commutation half complete Callback. + (+) BreakCallback : TIM Break Callback. + + [..] +By default, after the Init and when the state is HAL_TIM_STATE_RESET +all interrupt callbacks are set to the corresponding weak functions: + examples HAL_TIM_TriggerCallback(), HAL_TIM_ErrorCallback(). + + [..] + Exception done for MspInit and MspDeInit functions that are reset to the legacy weak + functionalities in the Init / DeInit only when these callbacks are null + (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit + keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + + [..] + Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. + Exception done MspInit / MspDeInit that can be registered / unregistered + in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, + thus registered(user) MspInit / DeInit callbacks can be used during the Init / DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_TIM_RegisterCallback() before calling DeInit or Init function. + + [..] + When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup TIM TIM + * @brief TIM HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup TIM_Private_Functions + * @{ + */ +static void TIM_OC1_SetConfig(TIM_TypeDef *TIMx, 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_DMADelayPulseCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, + 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 DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Base peripheral + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Base_MspDeInitCallback == NULL) + { + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Base_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Base_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Base MSP. + * @param htim TIM Base handle + * @retval None + */ +__weak void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Base_MspDeInit could be implemented in the user file + */ +} + + +/** + * @brief Starts the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Check the TIM state */ + if (htim->State != HAL_TIM_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Check the TIM state */ + if (htim->State != HAL_TIM_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Enable the TIM Update interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in interrupt mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + /* Disable the TIM Update interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_UPDATE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + /* Set the TIM state */ + if (htim->State == HAL_TIM_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->State == HAL_TIM_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + htim->State = HAL_TIM_STATE_BUSY; + } + } + else + { + return HAL_ERROR; + } + + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)pData, (uint32_t)&htim->Instance->ARR, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Update DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_UPDATE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Base generation in DMA mode. + * @param htim TIM Base handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); + + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_UPDATE); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions + * @brief TIM Output Compare functions + * +@verbatim + ============================================================================== + ##### TIM Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Output Compare. + (+) De-initialize the TIM Output Compare. + (+) Start the TIM Output Compare. + (+) Stop the TIM Output Compare. + (+) Start the TIM Output Compare and enable interrupt. + (+) Stop the TIM Output Compare and disable interrupt. + (+) Start the TIM Output Compare and enable DMA transfer. + (+) Stop the TIM Output Compare and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Output Compare according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OC_DeInit() before HAL_TIM_OC_Init() + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OC_MspInitCallback == NULL) + { + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the Output Compare */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Output Compare handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OC_MspDeInitCallback == NULL) + { + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Output Compare MSP. + * @param htim TIM Output Compare handle + * @retval None + */ +__weak void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Output compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions + * @brief TIM PWM functions + * +@verbatim + ============================================================================== + ##### TIM PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM PWM. + (+) De-initialize the TIM PWM. + (+) Start the TIM PWM. + (+) Stop the TIM PWM. + (+) Start the TIM PWM and enable interrupt. + (+) Stop the TIM PWM and disable interrupt. + (+) Start the TIM PWM and enable DMA transfer. + (+) Stop the TIM PWM and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM PWM Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_PWM_DeInit() before HAL_TIM_PWM_Init() + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->PWM_MspInitCallback == NULL) + { + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->PWM_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the PWM */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM PWM handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->PWM_MspDeInitCallback == NULL) + { + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + } + /* DeInit the low level hardware */ + htim->PWM_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_PWM_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM PWM MSP. + * @param htim TIM PWM handle + * @retval None + */ +__weak void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_PWM_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the PWM signal generation. + * @param htim TIM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM channel state */ + if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Capture/Compare 3 request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)pData, (uint32_t)&htim->Instance->CCR4, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode. + * @param htim TIM PWM handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions + * @brief TIM Input Capture functions + * +@verbatim + ============================================================================== + ##### TIM Input Capture functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Input Capture. + (+) De-initialize the TIM Input Capture. + (+) Start the TIM Input Capture. + (+) Stop the TIM Input Capture. + (+) Start the TIM Input Capture and enable interrupt. + (+) Stop the TIM Input Capture and disable interrupt. + (+) Start the TIM Input Capture and enable DMA transfer. + (+) Stop the TIM Input Capture and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Input Capture Time base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_IC_DeInit() before HAL_TIM_IC_Init() + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->IC_MspInitCallback == NULL) + { + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->IC_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Init the base time for the input capture */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM peripheral + * @param htim TIM Input Capture handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->IC_MspDeInitCallback == NULL) + { + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + } + /* DeInit the low level hardware */ + htim->IC_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_IC_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET_ALL(htim, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Input Capture MSP. + * @param htim TIM Input Capture handle + * @retval None + */ +__weak void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Input Capture MSP. + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_IC_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Input Capture measurement. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM channel state */ + if ((channel_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Enable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Input Capture measurement in interrupt mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + HAL_TIM_ChannelStateTypeDef channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + HAL_TIM_ChannelStateTypeDef complementary_channel_state = TIM_CHANNEL_N_STATE_GET(htim, Channel); + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + /* Set the TIM channel state */ + if ((channel_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + /* Enable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->CCR3, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + case TIM_CHANNEL_4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->CCR4, (uint32_t)pData, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC4); + break; + } + + default: + status = HAL_ERROR; + break; + } + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Input Capture measurement in DMA mode. + * @param htim TIM Input Capture handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel */ + TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_DISABLE); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + case TIM_CHANNEL_4: + { + /* Disable the TIM Capture/Compare 4 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC4); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions + * @brief TIM One Pulse functions + * +@verbatim + ============================================================================== + ##### TIM One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM One Pulse. + (+) De-initialize the TIM One Pulse. + (+) Start the TIM One Pulse. + (+) Stop the TIM One Pulse. + (+) Start the TIM One Pulse and enable interrupt. + (+) Stop the TIM One Pulse and disable interrupt. + (+) Start the TIM One Pulse and enable DMA transfer. + (+) Stop the TIM One Pulse and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM One Pulse Time Base according to the specified + * parameters in the TIM_HandleTypeDef and initializes the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_OnePulse_DeInit() before HAL_TIM_OnePulse_Init() + * @note When the timer instance is initialized in One Pulse mode, timer + * channels 1 and channel 2 are reserved and cannot be used for other + * purpose. + * @param htim TIM One Pulse handle + * @param OnePulseMode Select the One pulse mode. + * This parameter can be one of the following values: + * @arg TIM_OPMODE_SINGLE: Only one pulse will be generated. + * @arg TIM_OPMODE_REPETITIVE: Repetitive pulses will be generated. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode) +{ + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_OPM_MODE(OnePulseMode)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->OnePulse_MspInitCallback == NULL) + { + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->OnePulse_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_OnePulse_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the One Pulse Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Reset the OPM Bit */ + htim->Instance->CR1 &= ~TIM_CR1_OPM; + + /* Configure the OPM Mode */ + htim->Instance->CR1 |= OnePulseMode; + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM One Pulse + * @param htim TIM One Pulse handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->OnePulse_MspDeInitCallback == NULL) + { + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + } + /* DeInit the low level hardware */ + htim->OnePulse_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_OnePulse_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM One Pulse MSP. + * @param htim TIM One Pulse handle + * @retval None + */ +__weak void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_OnePulse_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM One Pulse signal generation. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be enabled together + + No need to enable the counter, it's enabled automatically by hardware + (the counter starts in response to a stimulus and generate a pulse */ + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Enable the main output */ + __HAL_TIM_MOE_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode. + * @note Though OutputChannel parameter is deprecated and ignored by the function + * it has been kept to avoid HAL_TIM API compatibility break. + * @note The pulse output channel is determined when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel See note above + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(OutputChannel); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the Capture compare and the Input Capture channels + (in the OPM Mode the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) + if TIM_CHANNEL_1 is used as output, the TIM_CHANNEL_2 will be used as input and + if TIM_CHANNEL_1 is used as input, the TIM_CHANNEL_2 will be used as output + whatever the combination, the TIM_CHANNEL_1 and TIM_CHANNEL_2 should be disabled together */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET) + { + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions + * @brief TIM Encoder functions + * +@verbatim + ============================================================================== + ##### TIM Encoder functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure the TIM Encoder. + (+) De-initialize the TIM Encoder. + (+) Start the TIM Encoder. + (+) Stop the TIM Encoder. + (+) Start the TIM Encoder and enable interrupt. + (+) Stop the TIM Encoder and disable interrupt. + (+) Start the TIM Encoder and enable DMA transfer. + (+) Stop the TIM Encoder and disable DMA transfer. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Encoder Interface and initialize the associated handle. + * @note Switching from Center Aligned counter mode to Edge counter mode (or reverse) + * requires a timer reset to avoid unexpected direction + * due to DIR bit readonly in center aligned mode. + * Ex: call @ref HAL_TIM_Encoder_DeInit() before HAL_TIM_Encoder_Init() + * @note Encoder mode and External clock mode 2 are not compatible and must not be selected together + * Ex: A call for @ref HAL_TIM_Encoder_Init will erase the settings of @ref HAL_TIM_ConfigClockSource + * using TIM_CLOCKSOURCE_ETRMODE2 and vice versa + * @note When the timer instance is initialized in Encoder mode, timer + * channels 1 and channel 2 are reserved and cannot be used for other + * purpose. + * @param htim TIM Encoder Interface handle + * @param sConfig TIM Encoder Interface configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig) +{ + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); + assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC2Filter)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy weak callbacks */ + TIM_ResetCallback(htim); + + if (htim->Encoder_MspInitCallback == NULL) + { + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->Encoder_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIM_Encoder_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Reset the SMS and ECE bits */ + htim->Instance->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Get the TIMx CCMR1 register value */ + tmpccmr1 = htim->Instance->CCMR1; + + /* Get the TIMx CCER register value */ + tmpccer = htim->Instance->CCER; + + /* Set the encoder Mode */ + tmpsmcr |= sConfig->EncoderMode; + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmr1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S); + tmpccmr1 |= (sConfig->IC1Selection | (sConfig->IC2Selection << 8U)); + + /* Set the Capture Compare 1 and the Capture Compare 2 prescalers and filters */ + tmpccmr1 &= ~(TIM_CCMR1_IC1PSC | TIM_CCMR1_IC2PSC); + tmpccmr1 &= ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC2F); + tmpccmr1 |= sConfig->IC1Prescaler | (sConfig->IC2Prescaler << 8U); + tmpccmr1 |= (sConfig->IC1Filter << 4U) | (sConfig->IC2Filter << 12U); + + /* Set the TI1 and the TI2 Polarities */ + tmpccer &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P); + tmpccer &= ~(TIM_CCER_CC1NP | TIM_CCER_CC2NP); + tmpccer |= sConfig->IC1Polarity | (sConfig->IC2Polarity << 4U); + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Write to TIMx CCMR1 */ + htim->Instance->CCMR1 = tmpccmr1; + + /* Write to TIMx CCER */ + htim->Instance->CCER = tmpccer; + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + + +/** + * @brief DeInitializes the TIM Encoder interface + * @param htim TIM Encoder Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->Encoder_MspDeInitCallback == NULL) + { + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + } + /* DeInit the low level hardware */ + htim->Encoder_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIM_Encoder_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Encoder Interface MSP. + * @param htim TIM Encoder Interface handle + * @retval None + */ +__weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIM_Encoder_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel(s) state */ + if (Channel == TIM_CHANNEL_1) + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else if (Channel == TIM_CHANNEL_2) + { + if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + + /* Enable the encoder interface channels */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + break; + } + } + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + break; + } + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel(s) state */ + if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel(s) state */ + if (Channel == TIM_CHANNEL_1) + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else if (Channel == TIM_CHANNEL_2) + { + if ((channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + + /* Enable the encoder interface channels */ + /* Enable the capture compare Interrupts 1 and/or 2 */ + switch (Channel) + { + case TIM_CHANNEL_1: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + default : + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + } + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in interrupt mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts 1 and 2 */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel(s) state */ + if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @param pData1 The destination Buffer address for IC1. + * @param pData2 The destination Buffer address for IC2. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) +{ + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel(s) state */ + if (Channel == TIM_CHANNEL_1) + { + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData1 == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + } + else if (Channel == TIM_CHANNEL_2) + { + if ((channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_2_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData2 == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + } + else + { + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (channel_2_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_2_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError; + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + break; + } + + default: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->CCR2, (uint32_t)pData2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + /* Enable the TIM Input Capture DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + + /* Enable the Capture compare channel */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_ENABLE); + + /* Enable the Peripheral */ + __HAL_TIM_ENABLE(htim); + + break; + } + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Encoder Interface in DMA mode. + * @param htim TIM Encoder Interface handle + * @param Channel TIM Channels to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1 and 2 + (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ + if (Channel == TIM_CHANNEL_1) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + } + else if (Channel == TIM_CHANNEL_2) + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + else + { + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_2, TIM_CCx_DISABLE); + + /* Disable the capture compare DMA Request 1 and 2 */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + } + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel(s) state */ + if ((Channel == TIM_CHANNEL_1) || (Channel == TIM_CHANNEL_2)) + { + TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ +/** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management + * @brief TIM IRQ handler management + * +@verbatim + ============================================================================== + ##### IRQ handler management ##### + ============================================================================== + [..] + This section provides Timer IRQ handler function. + +@endverbatim + * @{ + */ +/** + * @brief This function handles TIM interrupts requests. + * @param htim TIM handle + * @retval None + */ +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) +{ + /* 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) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_OC_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + + /* Process Locked */ + __HAL_LOCK(htim); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 1 in Output Compare */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 2 in Output Compare */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 3 in Output Compare */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the TIM Channel 4 in Output Compare */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + break; + } + + default: + status = HAL_ERROR; + break; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Initializes the TIM Input Capture Channels according to the specified + * parameters in the TIM_IC_InitTypeDef. + * @param htim TIM IC handle + * @param sConfig TIM Input Capture configuration structure + * @param Channel TIM Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_IC_POLARITY(sConfig->ICPolarity)); + assert_param(IS_TIM_IC_SELECTION(sConfig->ICSelection)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->ICPrescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->ICFilter)); + + /* Process Locked */ + __HAL_LOCK(htim); + + if (Channel == TIM_CHANNEL_1) + { + /* TI1 Configuration */ + TIM_TI1_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->ICPrescaler; + } + else if (Channel == TIM_CHANNEL_2) + { + /* TI2 Configuration */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Set the IC2PSC value */ + htim->Instance->CCMR1 |= (sConfig->ICPrescaler << 8U); + } + else if (Channel == TIM_CHANNEL_3) + { + /* TI3 Configuration */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + TIM_TI3_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC3PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC; + + /* Set the IC3PSC value */ + htim->Instance->CCMR2 |= sConfig->ICPrescaler; + } + else if (Channel == TIM_CHANNEL_4) + { + /* TI4 Configuration */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + TIM_TI4_SetConfig(htim->Instance, + sConfig->ICPolarity, + sConfig->ICSelection, + sConfig->ICFilter); + + /* Reset the IC4PSC Bits */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC; + + /* Set the IC4PSC value */ + htim->Instance->CCMR2 |= (sConfig->ICPrescaler << 8U); + } + else + { + status = HAL_ERROR; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Initializes the TIM PWM channels according to the specified + * parameters in the TIM_OC_InitTypeDef. + * @param htim TIM PWM handle + * @param sConfig TIM PWM configuration structure + * @param Channel TIM Channels to be configured + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, + TIM_OC_InitTypeDef *sConfig, + uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CHANNELS(Channel)); + assert_param(IS_TIM_PWM_MODE(sConfig->OCMode)); + assert_param(IS_TIM_OC_POLARITY(sConfig->OCPolarity)); + assert_param(IS_TIM_FAST_STATE(sConfig->OCFastMode)); + + /* Process Locked */ + __HAL_LOCK(htim); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + /* Configure the Channel 1 in PWM mode */ + TIM_OC1_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel1 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC1PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + /* Configure the Channel 2 in PWM mode */ + TIM_OC2_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel2 */ + htim->Instance->CCMR1 |= TIM_CCMR1_OC2PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE; + htim->Instance->CCMR1 |= sConfig->OCFastMode << 8U; + break; + } + + case TIM_CHANNEL_3: + { + /* Check the parameters */ + assert_param(IS_TIM_CC3_INSTANCE(htim->Instance)); + + /* Configure the Channel 3 in PWM mode */ + TIM_OC3_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel3 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC3PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode; + break; + } + + case TIM_CHANNEL_4: + { + /* Check the parameters */ + assert_param(IS_TIM_CC4_INSTANCE(htim->Instance)); + + /* Configure the Channel 4 in PWM mode */ + TIM_OC4_SetConfig(htim->Instance, sConfig); + + /* Set the Preload enable bit for channel4 */ + htim->Instance->CCMR2 |= TIM_CCMR2_OC4PE; + + /* Configure the Output Fast mode */ + htim->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE; + htim->Instance->CCMR2 |= sConfig->OCFastMode << 8U; + break; + } + + default: + status = HAL_ERROR; + break; + } + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Initializes the TIM One Pulse Channels according to the specified + * parameters in the TIM_OnePulse_InitTypeDef. + * @param htim TIM One Pulse handle + * @param sConfig TIM One Pulse configuration structure + * @param OutputChannel TIM output channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @param InputChannel TIM input Channel to configure + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) +{ + HAL_StatusTypeDef status = HAL_OK; + TIM_OC_InitTypeDef temp1; + + /* Check the parameters */ + assert_param(IS_TIM_OPM_CHANNELS(OutputChannel)); + assert_param(IS_TIM_OPM_CHANNELS(InputChannel)); + + if (OutputChannel != InputChannel) + { + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Extract the Output compare configuration from sConfig structure */ + temp1.OCMode = sConfig->OCMode; + temp1.Pulse = sConfig->Pulse; + temp1.OCPolarity = sConfig->OCPolarity; + temp1.OCNPolarity = sConfig->OCNPolarity; + temp1.OCIdleState = sConfig->OCIdleState; + temp1.OCNIdleState = sConfig->OCNIdleState; + + switch (OutputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_OC1_SetConfig(htim->Instance, &temp1); + break; + } + + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_OC2_SetConfig(htim->Instance, &temp1); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + switch (InputChannel) + { + case TIM_CHANNEL_1: + { + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + + TIM_TI1_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1FP1; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + + case TIM_CHANNEL_2: + { + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + + TIM_TI2_SetConfig(htim->Instance, sConfig->ICPolarity, + sConfig->ICSelection, sConfig->ICFilter); + + /* Reset the IC2PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC; + + /* Select the Trigger source */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI2FP2; + + /* Select the Slave Mode */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_TRIGGER; + break; + } + + default: + status = HAL_ERROR; + break; + } + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return status; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Configure the DMA Burst to transfer Data from the memory to the TIM peripheral + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) +{ + HAL_StatusTypeDef status; + + status = HAL_TIM_DMABurst_MultiWriteStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, + ((BurstLength) >> 8U) + 1U); + + + + return status; +} + +/** + * @brief Configure the DMA Burst to transfer multiple Data from the memory to the TIM peripheral + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data write + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @param DataLength Data length. This parameter can be one value + * between 1 and 0xFFFF. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); + + if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMADelayPulseCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM DMA Burst mode + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA stream) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + } + + /* Return function status */ + return status; +} + +/** + * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @note This function should be used only when BurstLength is equal to DMA data transfer length. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) +{ + HAL_StatusTypeDef status; + + status = HAL_TIM_DMABurst_MultiReadStart(htim, BurstBaseAddress, BurstRequestSrc, BurstBuffer, BurstLength, + ((BurstLength) >> 8U) + 1U); + + + return status; +} + +/** + * @brief Configure the DMA Burst to transfer Data from the TIM peripheral to the memory + * @param htim TIM handle + * @param BurstBaseAddress TIM Base address from where the DMA will start the Data read + * This parameter can be one of the following values: + * @arg TIM_DMABASE_CR1 + * @arg TIM_DMABASE_CR2 + * @arg TIM_DMABASE_SMCR + * @arg TIM_DMABASE_DIER + * @arg TIM_DMABASE_SR + * @arg TIM_DMABASE_EGR + * @arg TIM_DMABASE_CCMR1 + * @arg TIM_DMABASE_CCMR2 + * @arg TIM_DMABASE_CCER + * @arg TIM_DMABASE_CNT + * @arg TIM_DMABASE_PSC + * @arg TIM_DMABASE_ARR + * @arg TIM_DMABASE_RCR + * @arg TIM_DMABASE_CCR1 + * @arg TIM_DMABASE_CCR2 + * @arg TIM_DMABASE_CCR3 + * @arg TIM_DMABASE_CCR4 + * @arg TIM_DMABASE_BDTR + * @param BurstRequestSrc TIM DMA Request sources + * This parameter can be one of the following values: + * @arg TIM_DMA_UPDATE: TIM update Interrupt source + * @arg TIM_DMA_CC1: TIM Capture Compare 1 DMA source + * @arg TIM_DMA_CC2: TIM Capture Compare 2 DMA source + * @arg TIM_DMA_CC3: TIM Capture Compare 3 DMA source + * @arg TIM_DMA_CC4: TIM Capture Compare 4 DMA source + * @arg TIM_DMA_COM: TIM Commutation DMA source + * @arg TIM_DMA_TRIGGER: TIM Trigger DMA source + * @param BurstBuffer The Buffer address. + * @param BurstLength DMA Burst length. This parameter can be one value + * between: TIM_DMABURSTLENGTH_1TRANSFER and TIM_DMABURSTLENGTH_18TRANSFERS. + * @param DataLength Data length. This parameter can be one value + * between 1 and 0xFFFF. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + assert_param(IS_TIM_DMA_BASE(BurstBaseAddress)); + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + assert_param(IS_TIM_DMA_LENGTH(BurstLength)); + assert_param(IS_TIM_DMA_DATA_LENGTH(DataLength)); + + if (htim->DMABurstState == HAL_DMA_BURST_STATE_BUSY) + { + return HAL_BUSY; + } + else if (htim->DMABurstState == HAL_DMA_BURST_STATE_READY) + { + if ((BurstBuffer == NULL) && (BurstLength > 0U)) + { + return HAL_ERROR; + } + else + { + htim->DMABurstState = HAL_DMA_BURST_STATE_BUSY; + } + } + else + { + /* nothing to do */ + } + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + /* Set the DMA Period elapsed callbacks */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferCpltCallback = TIM_DMAPeriodElapsedCplt; + htim->hdma[TIM_DMA_ID_UPDATE]->XferHalfCpltCallback = TIM_DMAPeriodElapsedHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_UPDATE]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_UPDATE], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC1: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC2: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC3: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_CC4: + { + /* Set the DMA capture callbacks */ + htim->hdma[TIM_DMA_ID_CC4]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC4]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_COM: + { + /* Set the DMA commutation callbacks */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + case TIM_DMA_TRIGGER: + { + /* Set the DMA trigger callbacks */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferCpltCallback = TIM_DMATriggerCplt; + htim->hdma[TIM_DMA_ID_TRIGGER]->XferHalfCpltCallback = TIM_DMATriggerHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)&htim->Instance->DMAR, (uint32_t)BurstBuffer, + DataLength) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Configure the DMA Burst Mode */ + htim->Instance->DCR = (BurstBaseAddress | BurstLength); + + /* Enable the TIM DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, BurstRequestSrc); + } + + /* Return function status */ + return status; +} + +/** + * @brief Stop the DMA burst reading + * @param htim TIM handle + * @param BurstRequestSrc TIM DMA Request sources to disable. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); + + /* Abort the DMA transfer (at least disable the DMA stream) */ + switch (BurstRequestSrc) + { + case TIM_DMA_UPDATE: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_UPDATE]); + break; + } + case TIM_DMA_CC1: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + case TIM_DMA_CC2: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + case TIM_DMA_CC3: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + case TIM_DMA_CC4: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC4]); + break; + } + case TIM_DMA_COM: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_COMMUTATION]); + break; + } + case TIM_DMA_TRIGGER: + { + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_TRIGGER]); + break; + } + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the TIM Update DMA request */ + __HAL_TIM_DISABLE_DMA(htim, BurstRequestSrc); + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + } + + /* Return function status */ + return status; +} + +/** + * @brief Generate a software event + * @param htim TIM handle + * @param EventSource specifies the event source. + * This parameter can be one of the following values: + * @arg TIM_EVENTSOURCE_UPDATE: Timer update Event source + * @arg TIM_EVENTSOURCE_CC1: Timer Capture Compare 1 Event source + * @arg TIM_EVENTSOURCE_CC2: Timer Capture Compare 2 Event source + * @arg TIM_EVENTSOURCE_CC3: Timer Capture Compare 3 Event source + * @arg TIM_EVENTSOURCE_CC4: Timer Capture Compare 4 Event source + * @arg TIM_EVENTSOURCE_COM: Timer COM event source + * @arg TIM_EVENTSOURCE_TRIGGER: Timer Trigger Event source + * @arg TIM_EVENTSOURCE_BREAK: Timer Break event source + * @note Basic timers can only generate an update event. + * @note TIM_EVENTSOURCE_COM is relevant only with advanced timer instances. + * @note TIM_EVENTSOURCE_BREAK are relevant only for timer instances + * supporting a break input. + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_EVENT_SOURCE(EventSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Set the event sources */ + htim->Instance->EGR = EventSource; + + /* Change the TIM state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Configures the OCRef clear feature + * @param htim TIM handle + * @param sClearInputConfig pointer to a TIM_ClearInputConfigTypeDef structure that + * contains the OCREF clear feature and parameters for the TIM peripheral. + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, + TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_OCXREF_CLEAR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_CLEARINPUT_SOURCE(sClearInputConfig->ClearInputSource)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + switch (sClearInputConfig->ClearInputSource) + { + case TIM_CLEARINPUTSOURCE_NONE: + { + /* Clear the OCREF clear selection bit and the the ETR Bits */ + CLEAR_BIT(htim->Instance->SMCR, (TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP)); + break; + } + + case TIM_CLEARINPUTSOURCE_ETR: + { + /* Check the parameters */ + assert_param(IS_TIM_CLEARINPUT_POLARITY(sClearInputConfig->ClearInputPolarity)); + assert_param(IS_TIM_CLEARINPUT_PRESCALER(sClearInputConfig->ClearInputPrescaler)); + assert_param(IS_TIM_CLEARINPUT_FILTER(sClearInputConfig->ClearInputFilter)); + + /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ + if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) + { + htim->State = HAL_TIM_STATE_READY; + __HAL_UNLOCK(htim); + return HAL_ERROR; + } + + TIM_ETR_SetConfig(htim->Instance, + sClearInputConfig->ClearInputPrescaler, + sClearInputConfig->ClearInputPolarity, + sClearInputConfig->ClearInputFilter); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + switch (Channel) + { + case TIM_CHANNEL_1: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 1 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + else + { + /* Disable the OCREF clear feature for Channel 1 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC1CE); + } + break; + } + case TIM_CHANNEL_2: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 2 */ + SET_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + else + { + /* Disable the OCREF clear feature for Channel 2 */ + CLEAR_BIT(htim->Instance->CCMR1, TIM_CCMR1_OC2CE); + } + break; + } + case TIM_CHANNEL_3: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 3 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + else + { + /* Disable the OCREF clear feature for Channel 3 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC3CE); + } + break; + } + case TIM_CHANNEL_4: + { + if (sClearInputConfig->ClearInputState != (uint32_t)DISABLE) + { + /* Enable the OCREF clear feature for Channel 4 */ + SET_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + else + { + /* Disable the OCREF clear feature for Channel 4 */ + CLEAR_BIT(htim->Instance->CCMR2, TIM_CCMR2_OC4CE); + } + break; + } + default: + break; + } + } + + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Configures the clock source to be used + * @param htim TIM handle + * @param sClockSourceConfig pointer to a TIM_ClockConfigTypeDef structure that + * contains the clock source information for the TIM peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE(sClockSourceConfig->ClockSource)); + + /* Reset the SMS, TS, ECE, ETPS and ETRF bits */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr &= ~(TIM_SMCR_SMS | TIM_SMCR_TS); + tmpsmcr &= ~(TIM_SMCR_ETF | TIM_SMCR_ETPS | TIM_SMCR_ECE | TIM_SMCR_ETP); + htim->Instance->SMCR = tmpsmcr; + + switch (sClockSourceConfig->ClockSource) + { + case TIM_CLOCKSOURCE_INTERNAL: + { + assert_param(IS_TIM_INSTANCE(htim->Instance)); + break; + } + + case TIM_CLOCKSOURCE_ETRMODE1: + { + /* Check whether or not the timer instance supports external trigger input mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + + /* Select the External clock mode1 and the ETRF trigger */ + tmpsmcr = htim->Instance->SMCR; + tmpsmcr |= (TIM_SLAVEMODE_EXTERNAL1 | TIM_CLOCKSOURCE_ETRMODE1); + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + break; + } + + case TIM_CLOCKSOURCE_ETRMODE2: + { + /* Check whether or not the timer instance supports external trigger input mode 2 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(htim->Instance)); + + /* Check ETR input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPRESCALER(sClockSourceConfig->ClockPrescaler)); + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + /* Configure the ETR Clock source */ + TIM_ETR_SetConfig(htim->Instance, + sClockSourceConfig->ClockPrescaler, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + /* Enable the External clock mode2 */ + htim->Instance->SMCR |= TIM_SMCR_ECE; + break; + } + + case TIM_CLOCKSOURCE_TI1: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1); + break; + } + + case TIM_CLOCKSOURCE_TI2: + { + /* Check whether or not the timer instance supports external clock mode 1 (ETRF)*/ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI2 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI2_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI2); + break; + } + + case TIM_CLOCKSOURCE_TI1ED: + { + /* Check whether or not the timer instance supports external clock mode 1 */ + assert_param(IS_TIM_CLOCKSOURCE_TIX_INSTANCE(htim->Instance)); + + /* Check TI1 input conditioning related parameters */ + assert_param(IS_TIM_CLOCKPOLARITY(sClockSourceConfig->ClockPolarity)); + assert_param(IS_TIM_CLOCKFILTER(sClockSourceConfig->ClockFilter)); + + TIM_TI1_ConfigInputStage(htim->Instance, + sClockSourceConfig->ClockPolarity, + sClockSourceConfig->ClockFilter); + TIM_ITRx_SetConfig(htim->Instance, TIM_CLOCKSOURCE_TI1ED); + break; + } + + case TIM_CLOCKSOURCE_ITR0: + case TIM_CLOCKSOURCE_ITR1: + case TIM_CLOCKSOURCE_ITR2: + case TIM_CLOCKSOURCE_ITR3: + { + /* Check whether or not the timer instance supports internal trigger input */ + assert_param(IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(htim->Instance)); + + TIM_ITRx_SetConfig(htim->Instance, sClockSourceConfig->ClockSource); + break; + } + + default: + status = HAL_ERROR; + break; + } + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return status; +} + +/** + * @brief Selects the signal connected to the TI1 input: direct from CH1_input + * or a XOR combination between CH1_input, CH2_input & CH3_input + * @param htim TIM handle. + * @param TI1_Selection Indicate whether or not channel 1 is connected to the + * output of a XOR gate. + * This parameter can be one of the following values: + * @arg TIM_TI1SELECTION_CH1: The TIMx_CH1 pin is connected to TI1 input + * @arg TIM_TI1SELECTION_XORCOMBINATION: The TIMx_CH1, CH2 and CH3 + * pins are connected to the TI1 input (XOR combination) + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection) +{ + uint32_t tmpcr2; + + /* Check the parameters */ + assert_param(IS_TIM_XOR_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TI1SELECTION(TI1_Selection)); + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Reset the TI1 selection */ + tmpcr2 &= ~TIM_CR2_TI1S; + + /* Set the TI1 selection */ + tmpcr2 |= TI1_Selection; + + /* Write to TIMxCR2 */ + htim->Instance->CR2 = tmpcr2; + + return HAL_OK; +} + +/** + * @brief Configures the TIM in Slave mode + * @param htim TIM handle. + * @param sSlaveConfig pointer to a TIM_SlaveConfigTypeDef structure that + * contains the selected trigger (internal trigger input, filtered + * timer input or external trigger input) and the Slave mode + * (Disable, Reset, Gated, Trigger, External clock mode 1). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, 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 : + /* Legacy weak Base MspInit Callback */ + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + /* Legacy weak Base Msp DeInit Callback */ + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + /* Legacy weak IC Msp Init Callback */ + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + /* Legacy weak IC Msp DeInit Callback */ + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + /* Legacy weak OC Msp Init Callback */ + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + /* Legacy weak OC Msp DeInit Callback */ + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + /* Legacy weak PWM Msp Init Callback */ + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + /* Legacy weak PWM Msp DeInit Callback */ + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + /* Legacy weak One Pulse Msp Init Callback */ + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + /* Legacy weak One Pulse Msp DeInit Callback */ + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + /* Legacy weak Encoder Msp Init Callback */ + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + /* Legacy weak Encoder Msp DeInit Callback */ + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + /* Legacy weak Hall Sensor Msp Init Callback */ + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + /* Legacy weak Hall Sensor Msp DeInit Callback */ + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + break; + + case HAL_TIM_PERIOD_ELAPSED_CB_ID : + /* Legacy weak Period Elapsed Callback */ + htim->PeriodElapsedCallback = HAL_TIM_PeriodElapsedCallback; + break; + + case HAL_TIM_PERIOD_ELAPSED_HALF_CB_ID : + /* Legacy weak Period Elapsed half complete Callback */ + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; + break; + + case HAL_TIM_TRIGGER_CB_ID : + /* Legacy weak Trigger Callback */ + htim->TriggerCallback = HAL_TIM_TriggerCallback; + break; + + case HAL_TIM_TRIGGER_HALF_CB_ID : + /* Legacy weak Trigger half complete Callback */ + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; + break; + + case HAL_TIM_IC_CAPTURE_CB_ID : + /* Legacy weak IC Capture Callback */ + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; + break; + + case HAL_TIM_IC_CAPTURE_HALF_CB_ID : + /* Legacy weak IC Capture half complete Callback */ + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; + break; + + case HAL_TIM_OC_DELAY_ELAPSED_CB_ID : + /* Legacy weak OC Delay Elapsed Callback */ + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_CB_ID : + /* Legacy weak PWM Pulse Finished Callback */ + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; + break; + + case HAL_TIM_PWM_PULSE_FINISHED_HALF_CB_ID : + /* Legacy weak PWM Pulse Finished half complete Callback */ + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; + break; + + case HAL_TIM_ERROR_CB_ID : + /* Legacy weak Error Callback */ + htim->ErrorCallback = HAL_TIM_ErrorCallback; + break; + + case HAL_TIM_COMMUTATION_CB_ID : + /* Legacy weak Commutation Callback */ + htim->CommutationCallback = HAL_TIMEx_CommutCallback; + break; + + case HAL_TIM_COMMUTATION_HALF_CB_ID : + /* Legacy weak Commutation half complete Callback */ + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; + break; + + case HAL_TIM_BREAK_CB_ID : + /* Legacy weak Break Callback */ + htim->BreakCallback = HAL_TIMEx_BreakCallback; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (htim->State == HAL_TIM_STATE_RESET) + { + switch (CallbackID) + { + case HAL_TIM_BASE_MSPINIT_CB_ID : + /* Legacy weak Base MspInit Callback */ + htim->Base_MspInitCallback = HAL_TIM_Base_MspInit; + break; + + case HAL_TIM_BASE_MSPDEINIT_CB_ID : + /* Legacy weak Base Msp DeInit Callback */ + htim->Base_MspDeInitCallback = HAL_TIM_Base_MspDeInit; + break; + + case HAL_TIM_IC_MSPINIT_CB_ID : + /* Legacy weak IC Msp Init Callback */ + htim->IC_MspInitCallback = HAL_TIM_IC_MspInit; + break; + + case HAL_TIM_IC_MSPDEINIT_CB_ID : + /* Legacy weak IC Msp DeInit Callback */ + htim->IC_MspDeInitCallback = HAL_TIM_IC_MspDeInit; + break; + + case HAL_TIM_OC_MSPINIT_CB_ID : + /* Legacy weak OC Msp Init Callback */ + htim->OC_MspInitCallback = HAL_TIM_OC_MspInit; + break; + + case HAL_TIM_OC_MSPDEINIT_CB_ID : + /* Legacy weak OC Msp DeInit Callback */ + htim->OC_MspDeInitCallback = HAL_TIM_OC_MspDeInit; + break; + + case HAL_TIM_PWM_MSPINIT_CB_ID : + /* Legacy weak PWM Msp Init Callback */ + htim->PWM_MspInitCallback = HAL_TIM_PWM_MspInit; + break; + + case HAL_TIM_PWM_MSPDEINIT_CB_ID : + /* Legacy weak PWM Msp DeInit Callback */ + htim->PWM_MspDeInitCallback = HAL_TIM_PWM_MspDeInit; + break; + + case HAL_TIM_ONE_PULSE_MSPINIT_CB_ID : + /* Legacy weak One Pulse Msp Init Callback */ + htim->OnePulse_MspInitCallback = HAL_TIM_OnePulse_MspInit; + break; + + case HAL_TIM_ONE_PULSE_MSPDEINIT_CB_ID : + /* Legacy weak One Pulse Msp DeInit Callback */ + htim->OnePulse_MspDeInitCallback = HAL_TIM_OnePulse_MspDeInit; + break; + + case HAL_TIM_ENCODER_MSPINIT_CB_ID : + /* Legacy weak Encoder Msp Init Callback */ + htim->Encoder_MspInitCallback = HAL_TIM_Encoder_MspInit; + break; + + case HAL_TIM_ENCODER_MSPDEINIT_CB_ID : + /* Legacy weak Encoder Msp DeInit Callback */ + htim->Encoder_MspDeInitCallback = HAL_TIM_Encoder_MspDeInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPINIT_CB_ID : + /* Legacy weak Hall Sensor Msp Init Callback */ + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + break; + + case HAL_TIM_HALL_SENSOR_MSPDEINIT_CB_ID : + /* Legacy weak Hall Sensor Msp DeInit Callback */ + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + break; + + default : + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Return error status */ + status = HAL_ERROR; + } + + /* 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; +} + +/** + * @brief Return the TIM Encoder Mode handle state. + * @param htim TIM handle + * @retval Active channel + */ +HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(TIM_HandleTypeDef *htim) +{ + return htim->Channel; +} + +/** + * @brief Return actual state of the TIM channel. + * @param htim TIM handle + * @param Channel TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @arg TIM_CHANNEL_4: TIM Channel 4 + * @arg TIM_CHANNEL_5: TIM Channel 5 + * @arg TIM_CHANNEL_6: TIM Channel 6 + * @retval TIM Channel state + */ +HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_TIM_ChannelStateTypeDef channel_state; + + /* Check the parameters */ + assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); + + channel_state = TIM_CHANNEL_STATE_GET(htim, Channel); + + return channel_state; +} + +/** + * @brief Return actual state of a DMA burst operation. + * @param htim TIM handle + * @retval DMA burst state + */ +HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); + + return htim->DMABurstState; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup TIM_Private_Functions TIM Private Functions + * @{ + */ + +/** + * @brief TIM DMA error callback + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMAError(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + htim->State = HAL_TIM_STATE_READY; + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->ErrorCallback(htim); +#else + HAL_TIM_ErrorCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Delay Pulse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMADelayPulseCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Delay Pulse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedHalfCpltCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureCallback(htim); +#else + HAL_TIM_IC_CaptureCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Capture half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->IC_CaptureHalfCpltCallback(htim); +#else + HAL_TIM_IC_CaptureHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA Period Elapse complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (htim->hdma[TIM_DMA_ID_UPDATE]->Init.Mode == DMA_NORMAL) + { + htim->State = HAL_TIM_STATE_READY; + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedCallback(htim); +#else + HAL_TIM_PeriodElapsedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Period Elapse half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PeriodElapsedHalfCpltCallback(htim); +#else + HAL_TIM_PeriodElapsedHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (htim->hdma[TIM_DMA_ID_TRIGGER]->Init.Mode == DMA_NORMAL) + { + htim->State = HAL_TIM_STATE_READY; + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerCallback(htim); +#else + HAL_TIM_TriggerCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Trigger half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->TriggerHalfCpltCallback(htim); +#else + HAL_TIM_TriggerHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief Time Base configuration + * @param TIMx TIM peripheral + * @param Structure TIM Base configuration structure + * @retval None + */ +void TIM_Base_SetConfig(TIM_TypeDef *TIMx, 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 output 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 output 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 output 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 output 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) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + + /* Reset the Trigger Selection Bits */ + tmpsmcr &= ~TIM_SMCR_TS; + /* Set the Input Trigger source */ + tmpsmcr |= sSlaveConfig->InputTrigger; + + /* Reset the slave mode Bits */ + tmpsmcr &= ~TIM_SMCR_SMS; + /* Set the slave mode */ + tmpsmcr |= sSlaveConfig->SlaveMode; + + /* Write to TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + + /* Configure the trigger prescaler, filter, and polarity */ + switch (sSlaveConfig->InputTrigger) + { + case TIM_TS_ETRF: + { + /* Check the parameters */ + assert_param(IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPRESCALER(sSlaveConfig->TriggerPrescaler)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + /* Configure the ETR Trigger source */ + TIM_ETR_SetConfig(htim->Instance, + sSlaveConfig->TriggerPrescaler, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI1F_ED: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + if (sSlaveConfig->SlaveMode == TIM_SLAVEMODE_GATED) + { + return HAL_ERROR; + } + + /* Disable the Channel 1: Reset the CC1E Bit */ + tmpccer = htim->Instance->CCER; + htim->Instance->CCER &= ~TIM_CCER_CC1E; + tmpccmr1 = htim->Instance->CCMR1; + + /* Set the filter */ + tmpccmr1 &= ~TIM_CCMR1_IC1F; + tmpccmr1 |= ((sSlaveConfig->TriggerFilter) << 4U); + + /* Write to TIMx CCMR1 and CCER registers */ + htim->Instance->CCMR1 = tmpccmr1; + htim->Instance->CCER = tmpccer; + break; + } + + case TIM_TS_TI1FP1: + { + /* Check the parameters */ + assert_param(IS_TIM_CC1_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI1 Filter and Polarity */ + TIM_TI1_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_TI2FP2: + { + /* Check the parameters */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRIGGERPOLARITY(sSlaveConfig->TriggerPolarity)); + assert_param(IS_TIM_TRIGGERFILTER(sSlaveConfig->TriggerFilter)); + + /* Configure TI2 Filter and Polarity */ + TIM_TI2_ConfigInputStage(htim->Instance, + sSlaveConfig->TriggerPolarity, + sSlaveConfig->TriggerFilter); + break; + } + + case TIM_TS_ITR0: + case TIM_TS_ITR1: + case TIM_TS_ITR2: + case TIM_TS_ITR3: + { + /* Check the parameter */ + assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + break; + } + + default: + status = HAL_ERROR; + break; + } + + return status; +} + +/** + * @brief Configure the TI1 as Input. + * @param TIMx to select the TIM peripheral. + * @param TIM_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * @arg TIM_ICPOLARITY_RISING + * @arg TIM_ICPOLARITY_FALLING + * @arg TIM_ICPOLARITY_BOTHEDGE + * @param TIM_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * @arg TIM_ICSELECTION_DIRECTTI: TIM Input 1 is selected to be connected to IC1. + * @arg TIM_ICSELECTION_INDIRECTTI: TIM Input 1 is selected to be connected to IC2. + * @arg TIM_ICSELECTION_TRC: TIM Input 1 is selected to be connected to TRC. + * @param TIM_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + * @note TIM_ICFilter and TIM_ICPolarity are not used in INDIRECT mode as TI2FP1 + * (on channel2 path) is used as the input signal. Therefore CCMR1 must be + * protected against un-initialized filter and polarity values. + */ +void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, + uint32_t TIM_ICFilter) +{ + uint32_t tmpccmr1; + uint32_t tmpccer; + + /* Disable the Channel 1: Reset the CC1E Bit */ + 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; + htim->PeriodElapsedHalfCpltCallback = HAL_TIM_PeriodElapsedHalfCpltCallback; + htim->TriggerCallback = HAL_TIM_TriggerCallback; + htim->TriggerHalfCpltCallback = HAL_TIM_TriggerHalfCpltCallback; + htim->IC_CaptureCallback = HAL_TIM_IC_CaptureCallback; + htim->IC_CaptureHalfCpltCallback = HAL_TIM_IC_CaptureHalfCpltCallback; + htim->OC_DelayElapsedCallback = HAL_TIM_OC_DelayElapsedCallback; + htim->PWM_PulseFinishedCallback = HAL_TIM_PWM_PulseFinishedCallback; + htim->PWM_PulseFinishedHalfCpltCallback = HAL_TIM_PWM_PulseFinishedHalfCpltCallback; + htim->ErrorCallback = HAL_TIM_ErrorCallback; + htim->CommutationCallback = HAL_TIMEx_CommutCallback; + htim->CommutationHalfCpltCallback = HAL_TIMEx_CommutHalfCpltCallback; + htim->BreakCallback = HAL_TIMEx_BreakCallback; +} +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c new file mode 100644 index 0000000..092175f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c @@ -0,0 +1,2428 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_tim_ex.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer Extended peripheral: + * + Time Hall Sensor Interface Initialization + * + Time Hall Sensor Interface Start + * + Time Complementary signal break and dead time configuration + * + Time Master and Slave synchronization configuration + * + Timer remapping capabilities configuration + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### TIMER Extended features ##### + ============================================================================== + [..] + The Timer Extended features include: + (#) Complementary outputs with programmable dead-time for : + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to + interconnect several timers together. + (#) Break input to put the timer output signals in reset state or in a known state. + (#) Supports incremental (quadrature) encoder and hall-sensor circuitry for + positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Hall Sensor output : HAL_TIMEx_HallSensor_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + initialization function of this driver: + (++) HAL_TIMEx_HallSensor_Init() and HAL_TIMEx_ConfigCommutEvent(): to use the + Timer Hall Sensor Interface and the commutation event with the corresponding + Interrupt and DMA request if needed (Note that One Timer is used to interface + with the Hall sensor Interface and another Timer should be used to use + the commutation event). + + (#) Activate the TIM peripheral using one of the start functions: + (++) Complementary Output Compare : HAL_TIMEx_OCN_Start(), HAL_TIMEx_OCN_Start_DMA(), + HAL_TIMEx_OCN_Start_IT() + (++) Complementary PWM generation : HAL_TIMEx_PWMN_Start(), HAL_TIMEx_PWMN_Start_DMA(), + HAL_TIMEx_PWMN_Start_IT() + (++) Complementary One-pulse mode output : HAL_TIMEx_OnePulseN_Start(), HAL_TIMEx_OnePulseN_Start_IT() + (++) Hall Sensor output : HAL_TIMEx_HallSensor_Start(), HAL_TIMEx_HallSensor_Start_DMA(), + HAL_TIMEx_HallSensor_Start_IT(). + + @endverbatim + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup TIMEx TIMEx + * @brief TIM Extended HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma); +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * +@verbatim + ============================================================================== + ##### Timer Hall Sensor functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure TIM HAL Sensor. + (+) De-initialize TIM HAL Sensor. + (+) Start the Hall Sensor Interface. + (+) Stop the Hall Sensor Interface. + (+) Start the Hall Sensor Interface and enable interrupts. + (+) Stop the Hall Sensor Interface and disable interrupts. + (+) Start the Hall Sensor Interface and enable DMA transfers. + (+) Stop the Hall Sensor Interface and disable DMA transfers. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. + * @note When the timer instance is initialized in Hall Sensor Interface mode, + * timer channels 1 and channel 2 are reserved and cannot be used for + * other purpose. + * @param htim TIM Hall Sensor Interface handle + * @param sConfig TIM Hall Sensor configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, 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 DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Hall Sensor interface + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->HallSensor_MspDeInitCallback == NULL) + { + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + } + /* DeInit the low level hardware */ + htim->HallSensor_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIMEx_HallSensor_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Hall Sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1, 2 and 3 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the capture compare Interrupts 1 event */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts event */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel state */ + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Set the DMA Input Capture 1 Callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA stream for Capture 1*/ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the capture compare 1 Interrupt */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + + /* Disable the capture compare Interrupts 1 event */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * +@verbatim + ============================================================================== + ##### Timer Complementary Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary Output Compare/PWM. + (+) Stop the Complementary Output Compare/PWM. + (+) Start the Complementary Output Compare/PWM and enable interrupts. + (+) Stop the Complementary Output Compare/PWM and disable interrupts. + (+) Start the Complementary Output Compare/PWM and enable DMA transfers. + (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM OC handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_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); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * +@verbatim + ============================================================================== + ##### Timer Complementary PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary PWM. + (+) Stop the Complementary PWM. + (+) Start the Complementary PWM and enable interrupts. + (+) Stop the Complementary PWM and disable interrupts. + (+) Start the Complementary PWM and enable DMA transfers. + (+) Stop the Complementary PWM and disable DMA transfers. + (+) 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)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_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); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode on the + * complementary output + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)pData, (uint32_t)&htim->Instance->CCR1, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC2]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC2]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)pData, (uint32_t)&htim->Instance->CCR2, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC3]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC3]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA stream */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM PWM signal generation in DMA mode on the complementary + * output + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions + * @brief Timer Complementary One Pulse functions + * +@verbatim + ============================================================================== + ##### Timer Complementary One Pulse functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary One Pulse generation. + (+) Stop the Complementary One Pulse. + (+) Start the Complementary One Pulse and enable interrupts. + (+) Stop the Complementary One Pulse and disable interrupts. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM One Pulse signal generation on the complementary + * output. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to enable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation on the complementary + * output. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to disable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to enable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + + /* Enable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_ENABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM One Pulse signal generation in interrupt mode on the + * complementary channel. + * @note OutputChannel must match the pulse output channel chosen when calling + * @ref HAL_TIM_OnePulse_ConfigChannel(). + * @param htim TIM One Pulse handle + * @param OutputChannel pulse output channel to disable + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel) +{ + uint32_t input_channel = (OutputChannel == TIM_CHANNEL_1) ? TIM_CHANNEL_2 : TIM_CHANNEL_1; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, OutputChannel)); + + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + + /* Disable the complementary One Pulse output channel and the Input Capture channel */ + TIM_CCxNChannelCmd(htim->Instance, OutputChannel, TIM_CCxN_DISABLE); + TIM_CCxChannelCmd(htim->Instance, input_channel, TIM_CCx_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions + * @brief Peripheral Control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Configure the commutation event in case of use of the Hall sensor interface. + (+) Configure Output channels for OC and PWM mode. + + (+) Configure Complementary channels, break features and dead time. + (+) Configure Master synchronization. + (+) Configure timer remapping capabilities. + +@endverbatim + * @{ + */ + +/** + * @brief Configure the TIM commutation event sequence. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with interrupt. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + /* Enable the Commutation Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with DMA. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Enable the Commutation DMA Request */ + /* Set the DMA Commutation Callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Enable the Commutation DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in master mode. + * @param htim TIM handle. + * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that + * contains the selected trigger output (TRGO) and the Master/Slave + * mode. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + 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) +{ + + /* Check parameters */ + assert_param(IS_TIM_REMAP(htim->Instance, Remap)); + + __HAL_LOCK(htim); + +#if defined(LPTIM_OR_TIM1_ITR2_RMP) && defined(LPTIM_OR_TIM5_ITR1_RMP) && defined(LPTIM_OR_TIM9_ITR1_RMP) + if ((Remap & LPTIM_REMAP_MASK) == LPTIM_REMAP_MASK) + { + /* Connect TIMx internal trigger to LPTIM1 output */ + __HAL_RCC_LPTIM1_CLK_ENABLE(); + MODIFY_REG(LPTIM1->OR, + (LPTIM_OR_TIM1_ITR2_RMP | LPTIM_OR_TIM5_ITR1_RMP | LPTIM_OR_TIM9_ITR1_RMP), + Remap & ~(LPTIM_REMAP_MASK)); + } + else + { + /* Set the Timer remapping configuration */ + WRITE_REG(htim->Instance->OR, Remap); + } +#else + /* Set the Timer remapping configuration */ + WRITE_REG(htim->Instance->OR, Remap); +#endif /* LPTIM_OR_TIM1_ITR2_RMP && LPTIM_OR_TIM5_ITR1_RMP && LPTIM_OR_TIM9_ITR1_RMP */ + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions + * @brief Extended Callbacks functions + * +@verbatim + ============================================================================== + ##### Extended Callbacks functions ##### + ============================================================================== + [..] + This section provides Extended TIM callback functions: + (+) Timer Commutation callback + (+) Timer Break callback + +@endverbatim + * @{ + */ + +/** + * @brief 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; +} + +/** + * @brief Return actual state of the TIM complementary channel. + * @param htim TIM handle + * @param ChannelN TIM Complementary channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @retval TIM Complementary channel state + */ +HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(TIM_HandleTypeDef *htim, uint32_t ChannelN) +{ + HAL_TIM_ChannelStateTypeDef channel_state; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, ChannelN)); + + channel_state = TIM_CHANNEL_N_STATE_GET(htim, ChannelN); + + return channel_state; +} +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions + * @{ + */ + +/** + * @brief TIM DMA Commutation callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Commutation half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationHalfCpltCallback(htim); +#else + HAL_TIMEx_CommutHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + + +/** + * @brief TIM DMA Delay Pulse complete callback (complementary channel). + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA error callback (complementary channel) + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->ErrorCallback(htim); +#else + HAL_TIM_ErrorCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel xN. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @param ChannelNState specifies the TIM Channel CCxNE bit new state. + * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. + * @retval None + */ +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) +{ + uint32_t tmp; + + tmp = TIM_CCER_CC1NE << (Channel & 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 */ +/** + * @} + */ + +/** + * @} + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c new file mode 100644 index 0000000..36b7317 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c @@ -0,0 +1,3751 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_uart.c + * @author MCD Application Team + * @brief UART HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Universal Asynchronous Receiver Transmitter Peripheral (UART). + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral Control functions + * + Peripheral State and Errors functions + * + ****************************************************************************** + * @attention + * + * Copyright (c) 2016 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The UART HAL driver can be used as follows: + + (#) Declare a UART_HandleTypeDef handle structure (eg. UART_HandleTypeDef huart). + (#) Initialize the UART low level resources by implementing the HAL_UART_MspInit() API: + (##) Enable the USARTx interface clock. + (##) UART pins configuration: + (+++) Enable the clock for the UART GPIOs. + (+++) Configure the UART TX/RX pins as alternate function pull-up. + (##) NVIC configuration if you need to use interrupt process (HAL_UART_Transmit_IT() + and HAL_UART_Receive_IT() APIs): + (+++) Configure the USARTx interrupt priority. + (+++) Enable the NVIC USART IRQ handle. + (##) DMA Configuration if you need to use DMA process (HAL_UART_Transmit_DMA() + and HAL_UART_Receive_DMA() APIs): + (+++) Declare a DMA handle structure for the Tx/Rx stream. + (+++) Enable the DMAx interface clock. + (+++) Configure the declared DMA handle structure with the required + Tx/Rx parameters. + (+++) Configure the DMA Tx/Rx stream. + (+++) Associate the initialized DMA handle to the UART DMA Tx/Rx handle. + (+++) Configure the priority and enable the NVIC for the transfer complete + interrupt on the DMA Tx/Rx stream. + (+++) Configure the USARTx interrupt priority and enable the NVIC USART IRQ handle + (used for last byte sending completion detection in DMA non circular mode) + + (#) Program the Baud Rate, Word Length, Stop Bit, Parity, Hardware + flow control and Mode(Receiver/Transmitter) in the huart Init structure. + + (#) For the UART asynchronous mode, initialize the UART registers by calling + the HAL_UART_Init() API. + + (#) For the UART Half duplex mode, initialize the UART registers by calling + the HAL_HalfDuplex_Init() API. + + (#) For the LIN mode, initialize the UART registers by calling the HAL_LIN_Init() API. + + (#) For the Multi-Processor mode, initialize the UART registers by calling + the HAL_MultiProcessor_Init() API. + + [..] + (@) The specific UART interrupts (Transmission complete interrupt, + RXNE interrupt and Error Interrupts) will be managed using the macros + __HAL_UART_ENABLE_IT() and __HAL_UART_DISABLE_IT() inside the transmit + and receive process. + + [..] + (@) These APIs (HAL_UART_Init() and HAL_HalfDuplex_Init()) configure also the + low level Hardware GPIO, CLOCK, CORTEX...etc) by calling the customized + HAL_UART_MspInit() API. + + ##### Callback registration ##### + ================================== + + [..] + The compilation define USE_HAL_UART_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function HAL_UART_RegisterCallback() to register a user callback. + Function HAL_UART_RegisterCallback() allows to register following callbacks: + (+) TxHalfCpltCallback : Tx Half Complete Callback. + (+) TxCpltCallback : Tx Complete Callback. + (+) RxHalfCpltCallback : Rx Half Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. + (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. + (+) MspInitCallback : UART MspInit. + (+) MspDeInitCallback : UART MspDeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + [..] + Use function HAL_UART_UnRegisterCallback() to reset a callback to the default + weak (surcharged) function. + HAL_UART_UnRegisterCallback() takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) TxHalfCpltCallback : Tx Half Complete Callback. + (+) TxCpltCallback : Tx Complete Callback. + (+) RxHalfCpltCallback : Rx Half Complete Callback. + (+) RxCpltCallback : Rx Complete Callback. + (+) ErrorCallback : Error Callback. + (+) AbortCpltCallback : Abort Complete Callback. + (+) AbortTransmitCpltCallback : Abort Transmit Complete Callback. + (+) AbortReceiveCpltCallback : Abort Receive Complete Callback. + (+) MspInitCallback : UART MspInit. + (+) MspDeInitCallback : UART MspDeInit. + + [..] + For specific callback RxEventCallback, use dedicated registration/reset functions: + respectively HAL_UART_RegisterRxEventCallback() , HAL_UART_UnRegisterRxEventCallback(). + + [..] + By default, after the HAL_UART_Init() and when the state is HAL_UART_STATE_RESET + all callbacks are set to the corresponding weak (surcharged) functions: + examples HAL_UART_TxCpltCallback(), HAL_UART_RxHalfCpltCallback(). + Exception done for MspInit and MspDeInit functions that are respectively + reset to the legacy weak (surcharged) functions in the HAL_UART_Init() + and HAL_UART_DeInit() only when these callbacks are null (not registered beforehand). + If not, MspInit or MspDeInit are not null, the HAL_UART_Init() and HAL_UART_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand). + + [..] + Callbacks can be registered/unregistered in HAL_UART_STATE_READY state only. + Exception done MspInit/MspDeInit that can be registered/unregistered + in HAL_UART_STATE_READY or HAL_UART_STATE_RESET state, thus registered (user) + MspInit/DeInit callbacks can be used during the Init/DeInit. + In that case first register the MspInit/MspDeInit user callbacks + using HAL_UART_RegisterCallback() before calling HAL_UART_DeInit() + or HAL_UART_Init() function. + + [..] + When The compilation define USE_HAL_UART_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available + and weak (surcharged) callbacks are used. + + [..] + Three operation modes are available within this driver : + + *** Polling mode IO operation *** + ================================= + [..] + (+) Send an amount of data in blocking mode using HAL_UART_Transmit() + (+) Receive an amount of data in blocking mode using HAL_UART_Receive() + + *** Interrupt mode IO operation *** + =================================== + [..] + (+) Send an amount of data in non blocking mode using HAL_UART_Transmit_IT() + (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_TxCpltCallback + (+) Receive an amount of data in non blocking mode using HAL_UART_Receive_IT() + (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_RxCpltCallback + (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_UART_ErrorCallback + + *** DMA mode IO operation *** + ============================== + [..] + (+) Send an amount of data in non blocking mode (DMA) using HAL_UART_Transmit_DMA() + (+) At transmission end of half transfer HAL_UART_TxHalfCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_TxHalfCpltCallback + (+) At transmission end of transfer HAL_UART_TxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_TxCpltCallback + (+) Receive an amount of data in non blocking mode (DMA) using HAL_UART_Receive_DMA() + (+) At reception end of half transfer HAL_UART_RxHalfCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_RxHalfCpltCallback + (+) At reception end of transfer HAL_UART_RxCpltCallback is executed and user can + add his own code by customization of function pointer HAL_UART_RxCpltCallback + (+) In case of transfer Error, HAL_UART_ErrorCallback() function is executed and user can + add his own code by customization of function pointer HAL_UART_ErrorCallback + (+) Pause the DMA Transfer using HAL_UART_DMAPause() + (+) Resume the DMA Transfer using HAL_UART_DMAResume() + (+) Stop the DMA Transfer using HAL_UART_DMAStop() + + + [..] This subsection also provides a set of additional functions providing enhanced reception + services to user. (For example, these functions allow application to handle use cases + where number of data to be received is unknown). + + (#) Compared to standard reception services which only consider number of received + data elements as reception completion criteria, these functions also consider additional events + as triggers for updating reception status to caller : + (+) Detection of inactivity period (RX line has not been active for a given period). + (++) RX inactivity detected by IDLE event, i.e. RX line has been in idle state (normally high state) + for 1 frame time, after last received byte. + + (#) There are two mode of transfer: + (+) Blocking mode: The reception is performed in polling mode, until either expected number of data is received, + or till IDLE event occurs. Reception is handled only during function execution. + When function exits, no data reception could occur. HAL status and number of actually received data elements, + are returned by function after finishing transfer. + (+) Non-Blocking mode: The reception is performed using Interrupts or DMA. + These API's return the HAL status. + The end of the data processing will be indicated through the + dedicated UART IRQ when using Interrupt mode or the DMA IRQ when using DMA mode. + The HAL_UARTEx_RxEventCallback() user callback will be executed during Receive process + The HAL_UART_ErrorCallback()user callback will be executed when a reception error is detected. + + (#) Blocking mode API: + (+) HAL_UARTEx_ReceiveToIdle() + + (#) Non-Blocking mode API with Interrupt: + (+) HAL_UARTEx_ReceiveToIdle_IT() + + (#) Non-Blocking mode API with DMA: + (+) HAL_UARTEx_ReceiveToIdle_DMA() + + + *** UART HAL driver macros list *** + ============================================= + [..] + Below the list of most used macros in UART HAL driver. + + (+) __HAL_UART_ENABLE: Enable the UART peripheral + (+) __HAL_UART_DISABLE: Disable the UART peripheral + (+) __HAL_UART_GET_FLAG : Check whether the specified UART flag is set or not + (+) __HAL_UART_CLEAR_FLAG : Clear the specified UART pending flag + (+) __HAL_UART_ENABLE_IT: Enable the specified UART interrupt + (+) __HAL_UART_DISABLE_IT: Disable the specified UART interrupt + (+) __HAL_UART_GET_IT_SOURCE: Check whether the specified UART interrupt has occurred or not + + [..] + (@) You can refer to the UART HAL driver header file for more useful macros + + @endverbatim + [..] + (@) Additional remark: If the parity is enabled, then the MSB bit of the data written + in the data register is transmitted but is changed by the parity bit. + Depending on the frame length defined by the M bit (8-bits or 9-bits), + the possible UART frame formats are as listed in the following table: + +-------------------------------------------------------------+ + | M bit | PCE bit | UART frame | + |---------------------|---------------------------------------| + | 0 | 0 | | SB | 8 bit data | STB | | + |---------|-----------|---------------------------------------| + | 0 | 1 | | SB | 7 bit data | PB | STB | | + |---------|-----------|---------------------------------------| + | 1 | 0 | | SB | 9 bit data | STB | | + |---------|-----------|---------------------------------------| + | 1 | 1 | | SB | 8 bit data | PB | STB | | + +-------------------------------------------------------------+ + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/** @addtogroup STM32F4xx_HAL_Driver + * @{ + */ + +/** @defgroup UART UART + * @brief HAL UART module driver + * @{ + */ +#ifdef HAL_UART_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup UART_Private_Constants + * @{ + */ +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @addtogroup UART_Private_Functions UART Private Functions + * @{ + */ + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +static void UART_EndTxTransfer(UART_HandleTypeDef *huart); +static void UART_EndRxTransfer(UART_HandleTypeDef *huart); +static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma); +static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma); +static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma); +static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma); +static void UART_DMAError(DMA_HandleTypeDef *hdma); +static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma); +static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma); +static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma); +static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart); +static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart); +static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart); +static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout); +static void UART_SetConfig(UART_HandleTypeDef *huart); + +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ +/** @defgroup UART_Exported_Functions UART Exported Functions + * @{ + */ + +/** @defgroup UART_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and Configuration functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to initialize the USARTx or the UARTy + in asynchronous mode. + (+) For the asynchronous mode only these parameters can be configured: + (++) Baud Rate + (++) Word Length + (++) Stop Bit + (++) Parity: If the parity is enabled, then the MSB bit of the data written + in the data register is transmitted but is changed by the parity bit. + Depending on the frame length defined by the M bit (8-bits or 9-bits), + please refer to Reference manual for possible UART frame formats. + (++) Hardware flow control + (++) Receiver/transmitter modes + (++) Over Sampling Method + [..] + The HAL_UART_Init(), HAL_HalfDuplex_Init(), HAL_LIN_Init() and HAL_MultiProcessor_Init() APIs + follow respectively the UART asynchronous, UART Half duplex, LIN and Multi-Processor configuration + procedures (details for the procedures are available in reference manual + (RM0430 for STM32F4X3xx MCUs and RM0402 for STM32F412xx MCUs + RM0383 for STM32F411xC/E MCUs and RM0401 for STM32F410xx MCUs + RM0090 for STM32F4X5xx/STM32F4X7xx/STM32F429xx/STM32F439xx MCUs + RM0390 for STM32F446xx MCUs and RM0386 for STM32F469xx/STM32F479xx MCUs)). + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the UART mode according to the specified parameters in + * the UART_InitTypeDef and create the associated handle. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE) + { + /* The hardware flow control is available only for USART1, USART2, USART3 and USART6. + Except for STM32F446xx devices, that is available for USART1, USART2, USART3, USART6, UART4 and UART5. + */ + assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance)); + assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl)); + } + else + { + assert_param(IS_UART_INSTANCE(huart->Instance)); + } + assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); + assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + UART_SetConfig(huart); + + /* In asynchronous mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); + + /* Enable the peripheral */ + __HAL_UART_ENABLE(huart); + + /* Initialize the UART state */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Initializes the half-duplex mode according to the specified + * parameters in the UART_InitTypeDef and create the associated handle. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_UART_HALFDUPLEX_INSTANCE(huart->Instance)); + assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); + assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + UART_SetConfig(huart); + + /* In half-duplex mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_IREN | USART_CR3_SCEN)); + + /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ + SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL); + + /* Enable the peripheral */ + __HAL_UART_ENABLE(huart); + + /* Initialize the UART state*/ + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Initializes the LIN mode according to the specified + * parameters in the UART_InitTypeDef and create the associated handle. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param BreakDetectLength Specifies the LIN break detection length. + * This parameter can be one of the following values: + * @arg UART_LINBREAKDETECTLENGTH_10B: 10-bit break detection + * @arg UART_LINBREAKDETECTLENGTH_11B: 11-bit break detection + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLength) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the LIN UART instance */ + assert_param(IS_UART_LIN_INSTANCE(huart->Instance)); + + /* Check the Break detection length parameter */ + assert_param(IS_UART_LIN_BREAK_DETECT_LENGTH(BreakDetectLength)); + assert_param(IS_UART_LIN_WORD_LENGTH(huart->Init.WordLength)); + assert_param(IS_UART_LIN_OVERSAMPLING(huart->Init.OverSampling)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + UART_SetConfig(huart); + + /* In LIN mode, the following bits must be kept cleared: + - CLKEN bits in the USART_CR2 register, + - SCEN, HDSEL and IREN bits in the USART_CR3 register.*/ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_HDSEL | USART_CR3_IREN | USART_CR3_SCEN)); + + /* Enable the LIN mode by setting the LINEN bit in the CR2 register */ + SET_BIT(huart->Instance->CR2, USART_CR2_LINEN); + + /* Set the USART LIN Break detection length. */ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_LBDL); + SET_BIT(huart->Instance->CR2, BreakDetectLength); + + /* Enable the peripheral */ + __HAL_UART_ENABLE(huart); + + /* Initialize the UART state*/ + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Initializes the Multi-Processor mode according to the specified + * parameters in the UART_InitTypeDef and create the associated handle. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param Address USART address + * @param WakeUpMethod specifies the USART wake-up method. + * This parameter can be one of the following values: + * @arg UART_WAKEUPMETHOD_IDLELINE: Wake-up by an idle line detection + * @arg UART_WAKEUPMETHOD_ADDRESSMARK: Wake-up by an address mark + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Address, uint32_t WakeUpMethod) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + /* Check the Address & wake up method parameters */ + assert_param(IS_UART_WAKEUPMETHOD(WakeUpMethod)); + assert_param(IS_UART_ADDRESS(Address)); + assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); + assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); + + if (huart->gState == HAL_UART_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + huart->Lock = HAL_UNLOCKED; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + UART_InitCallbacksToDefault(huart); + + if (huart->MspInitCallback == NULL) + { + huart->MspInitCallback = HAL_UART_MspInit; + } + + /* Init the low level hardware */ + huart->MspInitCallback(huart); +#else + /* Init the low level hardware : GPIO, CLOCK */ + HAL_UART_MspInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + } + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the UART Communication parameters */ + UART_SetConfig(huart); + + /* In Multi-Processor mode, the following bits must be kept cleared: + - LINEN and CLKEN bits in the USART_CR2 register, + - SCEN, HDSEL and IREN bits in the USART_CR3 register */ + CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); + CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); + + /* Set the USART address node */ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_ADD); + SET_BIT(huart->Instance->CR2, Address); + + /* Set the wake up method by setting the WAKE bit in the CR1 register */ + CLEAR_BIT(huart->Instance->CR1, USART_CR1_WAKE); + SET_BIT(huart->Instance->CR1, WakeUpMethod); + + /* Enable the peripheral */ + __HAL_UART_ENABLE(huart); + + /* Initialize the UART state */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the UART peripheral. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) +{ + /* Check the UART handle allocation */ + if (huart == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_UART_DISABLE(huart); + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + if (huart->MspDeInitCallback == NULL) + { + huart->MspDeInitCallback = HAL_UART_MspDeInit; + } + /* DeInit the low level hardware */ + huart->MspDeInitCallback(huart); +#else + /* DeInit the low level hardware */ + HAL_UART_MspDeInit(huart); +#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */ + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_RESET; + huart->RxState = HAL_UART_STATE_RESET; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Process Unlock */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief UART MSP Init. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_MspInit(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_MspInit could be implemented in the user file + */ +} + +/** + * @brief UART MSP DeInit. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_MspDeInit could be implemented in the user file + */ +} + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +/** + * @brief Register a User UART Callback + * To be used instead of the weak predefined callback + * @param huart uart handle + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID + * @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID + * @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID + * @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID + * @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + /* Process locked */ + __HAL_LOCK(huart); + + if (huart->gState == HAL_UART_STATE_READY) + { + switch (CallbackID) + { + case HAL_UART_TX_HALFCOMPLETE_CB_ID : + huart->TxHalfCpltCallback = pCallback; + break; + + case HAL_UART_TX_COMPLETE_CB_ID : + huart->TxCpltCallback = pCallback; + break; + + case HAL_UART_RX_HALFCOMPLETE_CB_ID : + huart->RxHalfCpltCallback = pCallback; + break; + + case HAL_UART_RX_COMPLETE_CB_ID : + huart->RxCpltCallback = pCallback; + break; + + case HAL_UART_ERROR_CB_ID : + huart->ErrorCallback = pCallback; + break; + + case HAL_UART_ABORT_COMPLETE_CB_ID : + huart->AbortCpltCallback = pCallback; + break; + + case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID : + huart->AbortTransmitCpltCallback = pCallback; + break; + + case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID : + huart->AbortReceiveCpltCallback = pCallback; + break; + + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = pCallback; + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (huart->gState == HAL_UART_STATE_RESET) + { + switch (CallbackID) + { + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = pCallback; + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief Unregister an UART Callback + * UART callaback is redirected to the weak predefined callback + * @param huart uart handle + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_UART_TX_HALFCOMPLETE_CB_ID Tx Half Complete Callback ID + * @arg @ref HAL_UART_TX_COMPLETE_CB_ID Tx Complete Callback ID + * @arg @ref HAL_UART_RX_HALFCOMPLETE_CB_ID Rx Half Complete Callback ID + * @arg @ref HAL_UART_RX_COMPLETE_CB_ID Rx Complete Callback ID + * @arg @ref HAL_UART_ERROR_CB_ID Error Callback ID + * @arg @ref HAL_UART_ABORT_COMPLETE_CB_ID Abort Complete Callback ID + * @arg @ref HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID Abort Transmit Complete Callback ID + * @arg @ref HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID Abort Receive Complete Callback ID + * @arg @ref HAL_UART_MSPINIT_CB_ID MspInit Callback ID + * @arg @ref HAL_UART_MSPDEINIT_CB_ID MspDeInit Callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(huart); + + if (HAL_UART_STATE_READY == huart->gState) + { + switch (CallbackID) + { + case HAL_UART_TX_HALFCOMPLETE_CB_ID : + huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + break; + + case HAL_UART_TX_COMPLETE_CB_ID : + huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */ + break; + + case HAL_UART_RX_HALFCOMPLETE_CB_ID : + huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + break; + + case HAL_UART_RX_COMPLETE_CB_ID : + huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */ + break; + + case HAL_UART_ERROR_CB_ID : + huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */ + break; + + case HAL_UART_ABORT_COMPLETE_CB_ID : + huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + break; + + case HAL_UART_ABORT_TRANSMIT_COMPLETE_CB_ID : + huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ + break; + + case HAL_UART_ABORT_RECEIVE_COMPLETE_CB_ID : + huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ + break; + + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */ + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = HAL_UART_MspDeInit; /* Legacy weak MspDeInitCallback */ + break; + + default : + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (HAL_UART_STATE_RESET == huart->gState) + { + switch (CallbackID) + { + case HAL_UART_MSPINIT_CB_ID : + huart->MspInitCallback = HAL_UART_MspInit; + break; + + case HAL_UART_MSPDEINIT_CB_ID : + huart->MspDeInitCallback = HAL_UART_MspDeInit; + break; + + default : + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief Register a User UART Rx Event Callback + * To be used instead of the weak predefined callback + * @param huart Uart handle + * @param pCallback Pointer to the Rx Event Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_RegisterRxEventCallback(UART_HandleTypeDef *huart, pUART_RxEventCallbackTypeDef pCallback) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + /* Process locked */ + __HAL_LOCK(huart); + + if (huart->gState == HAL_UART_STATE_READY) + { + huart->RxEventCallback = pCallback; + } + else + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief UnRegister the UART Rx Event Callback + * UART Rx Event Callback is redirected to the weak HAL_UARTEx_RxEventCallback() predefined callback + * @param huart Uart handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_UnRegisterRxEventCallback(UART_HandleTypeDef *huart) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(huart); + + if (huart->gState == HAL_UART_STATE_READY) + { + huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak UART Rx Event Callback */ + } + else + { + huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; + + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(huart); + return status; +} +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup UART_Exported_Functions_Group2 IO operation functions + * @brief UART Transmit and Receive functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + This subsection provides a set of functions allowing to manage the UART asynchronous + and Half duplex data transfers. + + (#) There are two modes of transfer: + (+) Blocking mode: The communication is performed in polling mode. + The HAL status of all data processing is returned by the same function + after finishing transfer. + (+) Non-Blocking mode: The communication is performed using Interrupts + or DMA, these API's return the HAL status. + The end of the data processing will be indicated through the + dedicated UART IRQ when using Interrupt mode or the DMA IRQ when + using DMA mode. + The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks + will be executed respectively at the end of the transmit or receive process + The HAL_UART_ErrorCallback()user callback will be executed when a communication error is detected. + + (#) Blocking mode API's are : + (+) HAL_UART_Transmit() + (+) HAL_UART_Receive() + + (#) Non-Blocking mode API's with Interrupt are : + (+) HAL_UART_Transmit_IT() + (+) HAL_UART_Receive_IT() + (+) HAL_UART_IRQHandler() + + (#) Non-Blocking mode API's with DMA are : + (+) HAL_UART_Transmit_DMA() + (+) HAL_UART_Receive_DMA() + (+) HAL_UART_DMAPause() + (+) HAL_UART_DMAResume() + (+) HAL_UART_DMAStop() + + (#) A set of Transfer Complete Callbacks are provided in Non_Blocking mode: + (+) HAL_UART_TxHalfCpltCallback() + (+) HAL_UART_TxCpltCallback() + (+) HAL_UART_RxHalfCpltCallback() + (+) HAL_UART_RxCpltCallback() + (+) HAL_UART_ErrorCallback() + + (#) Non-Blocking mode transfers could be aborted using Abort API's : + (+) HAL_UART_Abort() + (+) HAL_UART_AbortTransmit() + (+) HAL_UART_AbortReceive() + (+) HAL_UART_Abort_IT() + (+) HAL_UART_AbortTransmit_IT() + (+) HAL_UART_AbortReceive_IT() + + (#) For Abort services based on interrupts (HAL_UART_Abortxxx_IT), a set of Abort Complete Callbacks are provided: + (+) HAL_UART_AbortCpltCallback() + (+) HAL_UART_AbortTransmitCpltCallback() + (+) HAL_UART_AbortReceiveCpltCallback() + + (#) A Rx Event Reception Callback (Rx event notification) is available for Non_Blocking modes of enhanced reception services: + (+) HAL_UARTEx_RxEventCallback() + + (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. + Errors are handled as follows : + (+) Error is considered as Recoverable and non blocking : Transfer could go till end, but error severity is + to be evaluated by user : this concerns Frame Error, Parity Error or Noise Error in Interrupt mode reception . + Received character is then retrieved and stored in Rx buffer, Error code is set to allow user to identify error type, + and HAL_UART_ErrorCallback() user callback is executed. Transfer is kept ongoing on UART side. + If user wants to abort it, Abort services should be called by user. + (+) Error is considered as Blocking : Transfer could not be completed properly and is aborted. + This concerns Overrun Error In Interrupt mode reception and all errors in DMA mode. + Error code is set to allow user to identify error type, and HAL_UART_ErrorCallback() user callback is executed. + + -@- In the Half duplex communication, it is forbidden to run the transmit + and receive process in parallel, the UART state HAL_UART_STATE_BUSY_TX_RX can't be useful. + +@endverbatim + * @{ + */ + +/** + * @brief Sends an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + const uint8_t *pdata8bits; + const uint16_t *pdata16bits; + uint32_t tickstart = 0U; + + /* Check that a Tx process is not already ongoing */ + if (huart->gState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_BUSY_TX; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + huart->TxXferSize = Size; + huart->TxXferCount = Size; + + /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (const uint16_t *) pData; + } + else + { + pdata8bits = pData; + pdata16bits = NULL; + } + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + while (huart->TxXferCount > 0U) + { + if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + if (pdata8bits == NULL) + { + huart->Instance->DR = (uint16_t)(*pdata16bits & 0x01FFU); + pdata16bits++; + } + else + { + huart->Instance->DR = (uint8_t)(*pdata8bits & 0xFFU); + pdata8bits++; + } + huart->TxXferCount--; + } + + if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + + /* At end of Tx process, restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receives an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint8_t *pdata8bits; + uint16_t *pdata16bits; + uint32_t tickstart = 0U; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + huart->RxXferSize = Size; + huart->RxXferCount = Size; + + /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (uint16_t *) pData; + } + else + { + pdata8bits = pData; + pdata16bits = NULL; + } + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + /* Check the remain data to be received */ + while (huart->RxXferCount > 0U) + { + if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK) + { + return HAL_TIMEOUT; + } + if (pdata8bits == NULL) + { + *pdata16bits = (uint16_t)(huart->Instance->DR & 0x01FF); + pdata16bits++; + } + else + { + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE))) + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); + } + else + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); + } + pdata8bits++; + } + huart->RxXferCount--; + } + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sends an amount of data in non blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size) +{ + /* Check that a Tx process is not already ongoing */ + if (huart->gState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->pTxBuffPtr = pData; + huart->TxXferSize = Size; + huart->TxXferCount = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_BUSY_TX; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + /* Enable the UART Transmit data register empty Interrupt */ + __HAL_UART_ENABLE_IT(huart, UART_IT_TXE); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receives an amount of data in non blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(huart); + + /* Set Reception type to Standard reception */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + return (UART_Start_Receive_IT(huart, pData, Size)); + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sends an amount of data in DMA mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size) +{ + const uint32_t *tmp; + + /* Check that a Tx process is not already ongoing */ + if (huart->gState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->pTxBuffPtr = pData; + huart->TxXferSize = Size; + huart->TxXferCount = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->gState = HAL_UART_STATE_BUSY_TX; + + /* Set the UART DMA transfer complete callback */ + huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt; + + /* Set the UART DMA Half transfer complete callback */ + huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt; + + /* Set the DMA error callback */ + huart->hdmatx->XferErrorCallback = UART_DMAError; + + /* Set the DMA abort callback */ + huart->hdmatx->XferAbortCallback = NULL; + + /* Enable the UART transmit DMA stream */ + tmp = (const uint32_t *)&pData; + HAL_DMA_Start_IT(huart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&huart->Instance->DR, Size); + + /* Clear the TC flag in the SR register by writing 0 to it */ + __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + /* Enable the DMA transfer for transmit request by setting the DMAT bit + in the UART CR3 register */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receives an amount of data in DMA mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @note When the UART parity is enabled (PCE = 1) the received data contains the parity bit. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(huart); + + /* Set Reception type to Standard reception */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + return (UART_Start_Receive_DMA(huart, pData, Size)); + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Pauses the DMA Transfer. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) +{ + uint32_t dmarequest = 0x00U; + + /* Process Locked */ + __HAL_LOCK(huart); + + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT); + if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest) + { + /* Disable the UART DMA Tx request */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + } + + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); + if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest) + { + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Disable the UART DMA Rx request */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + } + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Resumes the DMA Transfer. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + if (huart->gState == HAL_UART_STATE_BUSY_TX) + { + /* Enable the UART DMA Tx request */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAT); + } + + if (huart->RxState == HAL_UART_STATE_BUSY_RX) + { + /* Clear the Overrun flag before resuming the Rx transfer*/ + __HAL_UART_CLEAR_OREFLAG(huart); + + /* Re-enable PE and ERR (Frame error, noise error, overrun error) interrupts */ + if (huart->Init.Parity != UART_PARITY_NONE) + { + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); + } + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Enable the UART DMA Rx request */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); + } + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Stops the DMA Transfer. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) +{ + uint32_t dmarequest = 0x00U; + /* The Lock is not implemented on this API to allow the user application + to call the HAL UART API under callbacks HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback(): + when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated + and the correspond call back is executed HAL_UART_TxCpltCallback() / HAL_UART_RxCpltCallback() + */ + + /* Stop UART DMA Tx request if ongoing */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT); + if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream */ + if (huart->hdmatx != NULL) + { + HAL_DMA_Abort(huart->hdmatx); + } + UART_EndTxTransfer(huart); + } + + /* Stop UART DMA Rx request if ongoing */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); + if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream */ + if (huart->hdmarx != NULL) + { + HAL_DMA_Abort(huart->hdmarx); + } + UART_EndRxTransfer(huart); + } + + return HAL_OK; +} + +/** + * @brief Receive an amount of data in blocking mode till either the expected number of data is received or an IDLE event occurs. + * @note HAL_OK is returned if reception is completed (expected number of data has been received) + * or if reception is stopped after IDLE event (less than the expected number of data has been received) + * In this case, RxLen output parameter indicates number of data available in reception buffer. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M = 01), + * the received data is handled as a set of uint16_t. In this case, Size must indicate the number + * of uint16_t available through pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). + * @param Size Amount of data elements (uint8_t or uint16_t) to be received. + * @param RxLen Number of data elements finally received (could be lower than Size, in case reception ends on IDLE event) + * @param Timeout Timeout duration expressed in ms (covers the whole reception sequence). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen, + uint32_t Timeout) +{ + uint8_t *pdata8bits; + uint16_t *pdata16bits; + uint32_t tickstart; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + __HAL_LOCK(huart); + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + huart->RxXferSize = Size; + huart->RxXferCount = Size; + + /* In case of 9bits/No Parity transfer, pRxData needs to be handled as a uint16_t pointer */ + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (uint16_t *) pData; + } + else + { + pdata8bits = pData; + pdata16bits = NULL; + } + + __HAL_UNLOCK(huart); + + /* Initialize output number of received elements */ + *RxLen = 0U; + + /* as long as data have to be received */ + while (huart->RxXferCount > 0U) + { + /* Check if IDLE flag is set */ + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) + { + /* Clear IDLE flag in ISR */ + __HAL_UART_CLEAR_IDLEFLAG(huart); + + /* If Set, but no data ever received, clear flag without exiting loop */ + /* If Set, and data has already been received, this means Idle Event is valid : End reception */ + if (*RxLen > 0U) + { + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; + } + } + + /* Check if RXNE flag is set */ + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE)) + { + if (pdata8bits == NULL) + { + *pdata16bits = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); + pdata16bits++; + } + else + { + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE))) + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); + } + else + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); + } + + pdata8bits++; + } + /* Increment number of received elements */ + *RxLen += 1U; + huart->RxXferCount--; + } + + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) + { + huart->RxState = HAL_UART_STATE_READY; + + return HAL_TIMEOUT; + } + } + } + + /* Set number of received elements in output parameter : RxLen */ + *RxLen = huart->RxXferSize - huart->RxXferCount; + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in interrupt mode till either the expected number of data is received or an IDLE event occurs. + * @note Reception is initiated by this function call. Further progress of reception is achieved thanks + * to UART interrupts raised by RXNE and IDLE events. Callback is called at end of reception indicating + * number of received data elements. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M = 01), + * the received data is handled as a set of uint16_t. In this case, Size must indicate the number + * of uint16_t available through pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). + * @param Size Amount of data elements (uint8_t or uint16_t) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef status; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + __HAL_LOCK(huart); + + /* Set Reception type to reception till IDLE Event*/ + huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; + + status = UART_Start_Receive_IT(huart, pData, Size); + + /* Check Rx process has been successfully started */ + if (status == HAL_OK) + { + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + __HAL_UART_CLEAR_IDLEFLAG(huart); + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + else + { + /* In case of errors already pending when reception is started, + Interrupts may have already been raised and lead to reception abortion. + (Overrun error for instance). + In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ + status = HAL_ERROR; + } + } + + return status; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Receive an amount of data in DMA mode till either the expected number of data is received or an IDLE event occurs. + * @note Reception is initiated by this function call. Further progress of reception is achieved thanks + * to DMA services, transferring automatically received data elements in user reception buffer and + * calling registered callbacks at half/end of reception. UART IDLE events are also used to consider + * reception phase as ended. In all cases, callback execution will indicate number of received data elements. + * @note When the UART parity is enabled (PCE = 1), the received data contain + * the parity bit (MSB position). + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M = 01), + * the received data is handled as a set of uint16_t. In this case, Size must indicate the number + * of uint16_t available through pData. + * @param huart UART handle. + * @param pData Pointer to data buffer (uint8_t or uint16_t data elements). + * @param Size Amount of data elements (uint8_t or uint16_t) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef status; + + /* Check that a Rx process is not already ongoing */ + if (huart->RxState == HAL_UART_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + return HAL_ERROR; + } + + __HAL_LOCK(huart); + + /* Set Reception type to reception till IDLE Event*/ + huart->ReceptionType = HAL_UART_RECEPTION_TOIDLE; + + status = UART_Start_Receive_DMA(huart, pData, Size); + + /* Check Rx process has been successfully started */ + if (status == HAL_OK) + { + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + __HAL_UART_CLEAR_IDLEFLAG(huart); + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + else + { + /* In case of errors already pending when reception is started, + Interrupts may have already been raised and lead to reception abortion. + (Overrun error for instance). + In such case Reception Type has been reset to HAL_UART_RECEPTION_STANDARD. */ + status = HAL_ERROR; + } + } + + return status; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Abort ongoing transfers (blocking mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) +{ + /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* Disable the UART DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream: use blocking DMA Abort API (no callback) */ + if (huart->hdmatx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmatx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream: use blocking DMA Abort API (no callback) */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Tx and Rx transfer counters */ + huart->TxXferCount = 0x00U; + huart->RxXferCount = 0x00U; + + /* Reset ErrorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Restore huart->RxState and huart->gState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->gState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + return HAL_OK; +} + +/** + * @brief Abort ongoing Transmit transfer (blocking mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) +{ + /* Disable TXEIE and TCIE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE)); + + /* Disable the UART DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream : use blocking DMA Abort API (no callback) */ + if (huart->hdmatx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmatx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmatx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmatx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Tx transfer counter */ + huart->TxXferCount = 0x00U; + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + return HAL_OK; +} + +/** + * @brief Abort ongoing Receive transfer (blocking mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) + * - Set handle State to READY + * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) +{ + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream : use blocking DMA Abort API (no callback) */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback to Null. + No call back execution at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = NULL; + + if (HAL_DMA_Abort(huart->hdmarx) != HAL_OK) + { + if (HAL_DMA_GetError(huart->hdmarx) == HAL_DMA_ERROR_TIMEOUT) + { + /* Set error code to DMA */ + huart->ErrorCode = HAL_UART_ERROR_DMA; + + return HAL_TIMEOUT; + } + } + } + } + + /* Reset Rx transfer counter */ + huart->RxXferCount = 0x00U; + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + return HAL_OK; +} + +/** + * @brief Abort ongoing transfers (Interrupt mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx and Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) +{ + uint32_t AbortCplt = 0x01U; + + /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* If DMA Tx and/or DMA Rx Handles are associated to UART Handle, DMA Abort complete callbacks should be initialised + before any call to DMA Abort functions */ + /* DMA Tx Handle is valid */ + if (huart->hdmatx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + huart->hdmatx->XferAbortCallback = UART_DMATxAbortCallback; + } + else + { + huart->hdmatx->XferAbortCallback = NULL; + } + } + /* DMA Rx Handle is valid */ + if (huart->hdmarx != NULL) + { + /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. + Otherwise, set it to NULL */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + huart->hdmarx->XferAbortCallback = UART_DMARxAbortCallback; + } + else + { + huart->hdmarx->XferAbortCallback = NULL; + } + } + + /* Disable the UART DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + /* Disable DMA Tx at UART level */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream : use non blocking DMA Abort API (callback) */ + if (huart->hdmatx != NULL) + { + /* UART Tx DMA Abort callback has already been initialised : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK) + { + huart->hdmatx->XferAbortCallback = NULL; + } + else + { + AbortCplt = 0x00U; + } + } + } + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream : use non blocking DMA Abort API (callback) */ + if (huart->hdmarx != NULL) + { + /* UART Rx DMA Abort callback has already been initialised : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) + { + huart->hdmarx->XferAbortCallback = NULL; + AbortCplt = 0x01U; + } + else + { + AbortCplt = 0x00U; + } + } + } + + /* if no DMA abort complete callback execution is required => call user Abort Complete callback */ + if (AbortCplt == 0x01U) + { + /* Reset Tx and Rx transfer counters */ + huart->TxXferCount = 0x00U; + huart->RxXferCount = 0x00U; + + /* Reset ErrorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + huart->AbortCpltCallback(huart); +#else + /* Call legacy weak Abort complete callback */ + HAL_UART_AbortCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief Abort ongoing Transmit transfer (Interrupt mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Tx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Tx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) +{ + /* Disable TXEIE and TCIE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE)); + + /* Disable the UART DMA Tx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Abort the UART DMA Tx stream : use blocking DMA Abort API (no callback) */ + if (huart->hdmatx != NULL) + { + /* Set the UART DMA Abort callback : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + huart->hdmatx->XferAbortCallback = UART_DMATxOnlyAbortCallback; + + /* Abort DMA TX */ + if (HAL_DMA_Abort_IT(huart->hdmatx) != HAL_OK) + { + /* Call Directly huart->hdmatx->XferAbortCallback function in case of error */ + huart->hdmatx->XferAbortCallback(huart->hdmatx); + } + } + else + { + /* Reset Tx transfer counter */ + huart->TxXferCount = 0x00U; + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + huart->AbortTransmitCpltCallback(huart); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_UART_AbortTransmitCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Reset Tx transfer counter */ + huart->TxXferCount = 0x00U; + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + huart->AbortTransmitCpltCallback(huart); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_UART_AbortTransmitCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief Abort ongoing Receive transfer (Interrupt mode). + * @param huart UART handle. + * @note This procedure could be used for aborting any ongoing Rx transfer started in Interrupt or DMA mode. + * This procedure performs following operations : + * - Disable UART Interrupts (Rx) + * - Disable the DMA transfer in the peripheral register (if enabled) + * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) + * - Set handle State to READY + * - At abort completion, call user abort complete callback + * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be + * considered as completed only when user abort complete callback is executed (not when exiting function). + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart) +{ + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* If Reception till IDLE event was ongoing, disable IDLEIE interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_IDLEIE)); + } + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream : use blocking DMA Abort API (no callback) */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback : + will lead to call HAL_UART_AbortCpltCallback() at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = UART_DMARxOnlyAbortCallback; + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) + { + /* Call Directly huart->hdmarx->XferAbortCallback function in case of error */ + huart->hdmarx->XferAbortCallback(huart->hdmarx); + } + } + else + { + /* Reset Rx transfer counter */ + huart->RxXferCount = 0x00U; + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + huart->AbortReceiveCpltCallback(huart); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_UART_AbortReceiveCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Reset Rx transfer counter */ + huart->RxXferCount = 0x00U; + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* As no DMA to be aborted, call directly user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + huart->AbortReceiveCpltCallback(huart); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_UART_AbortReceiveCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; +} + +/** + * @brief This function handles UART interrupt request. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) +{ + uint32_t isrflags = READ_REG(huart->Instance->SR); + uint32_t cr1its = READ_REG(huart->Instance->CR1); + uint32_t cr3its = READ_REG(huart->Instance->CR3); + uint32_t errorflags = 0x00U; + uint32_t dmarequest = 0x00U; + + /* If no error occurs */ + errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE)); + if (errorflags == RESET) + { + /* UART in mode Receiver -------------------------------------------------*/ + if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) + { + UART_Receive_IT(huart); + return; + } + } + + /* If some errors occur */ + if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) + || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET))) + { + /* UART parity error interrupt occurred ----------------------------------*/ + if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET)) + { + huart->ErrorCode |= HAL_UART_ERROR_PE; + } + + /* UART noise error interrupt occurred -----------------------------------*/ + if (((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET)) + { + huart->ErrorCode |= HAL_UART_ERROR_NE; + } + + /* UART frame error interrupt occurred -----------------------------------*/ + if (((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET)) + { + huart->ErrorCode |= HAL_UART_ERROR_FE; + } + + /* UART Over-Run interrupt occurred --------------------------------------*/ + if (((isrflags & USART_SR_ORE) != RESET) && (((cr1its & USART_CR1_RXNEIE) != RESET) + || ((cr3its & USART_CR3_EIE) != RESET))) + { + huart->ErrorCode |= HAL_UART_ERROR_ORE; + } + + /* Call UART Error Call back function if need be --------------------------*/ + if (huart->ErrorCode != HAL_UART_ERROR_NONE) + { + /* UART in mode Receiver -----------------------------------------------*/ + if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)) + { + UART_Receive_IT(huart); + } + + /* If Overrun error occurs, or if any error occurs in DMA mode reception, + consider error as blocking */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); + if (((huart->ErrorCode & HAL_UART_ERROR_ORE) != RESET) || dmarequest) + { + /* Blocking error : transfer is aborted + Set the UART state ready to be able to start again the process, + Disable Rx Interrupts, and disable Rx DMA request, if ongoing */ + UART_EndRxTransfer(huart); + + /* Disable the UART DMA Rx request if enabled */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* Abort the UART DMA Rx stream */ + if (huart->hdmarx != NULL) + { + /* Set the UART DMA Abort callback : + will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */ + huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError; + if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK) + { + /* Call Directly XferAbortCallback function in case of error */ + huart->hdmarx->XferAbortCallback(huart->hdmarx); + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Call user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + } + else + { + /* Non Blocking error : transfer could go on. + Error is notified to user through user error callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + + huart->ErrorCode = HAL_UART_ERROR_NONE; + } + } + return; + } /* End if some error occurs */ + + /* Check current reception Mode : + If Reception till IDLE event has been selected : */ + if ((huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + && ((isrflags & USART_SR_IDLE) != 0U) + && ((cr1its & USART_SR_IDLE) != 0U)) + { + __HAL_UART_CLEAR_IDLEFLAG(huart); + + /* Check if DMA mode is enabled in UART */ + if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) + { + /* DMA mode enabled */ + /* Check received length : If all expected data are received, do nothing, + (DMA cplt callback will be called). + Otherwise, if at least one data has already been received, IDLE event is to be notified to user */ + uint16_t nb_remaining_rx_data = (uint16_t) __HAL_DMA_GET_COUNTER(huart->hdmarx); + if ((nb_remaining_rx_data > 0U) + && (nb_remaining_rx_data < huart->RxXferSize)) + { + /* Reception is not complete */ + huart->RxXferCount = nb_remaining_rx_data; + + /* In Normal mode, end DMA xfer and HAL UART Rx process*/ + if (huart->hdmarx->Init.Mode != DMA_CIRCULAR) + { + /* Disable PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Disable the DMA transfer for the receiver request by resetting the DMAR bit + in the UART CR3 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + /* Last bytes received, so no need as the abort is immediate */ + (void)HAL_DMA_Abort(huart->hdmarx); + } +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount)); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount)); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + return; + } + else + { + /* DMA mode not enabled */ + /* Check received length : If all expected data are received, do nothing. + Otherwise, if at least one data has already been received, IDLE event is to be notified to user */ + uint16_t nb_rx_data = huart->RxXferSize - huart->RxXferCount; + if ((huart->RxXferCount > 0U) + && (nb_rx_data > 0U)) + { + /* Disable the UART Parity Error Interrupt and RXNE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); + + /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Rx process is completed, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxEventCallback(huart, nb_rx_data); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, nb_rx_data); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + return; + } + } + + /* UART in mode Transmitter ------------------------------------------------*/ + if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET)) + { + UART_Transmit_IT(huart); + return; + } + + /* UART in mode Transmitter end --------------------------------------------*/ + if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET)) + { + UART_EndTransmit_IT(huart); + return; + } +} + +/** + * @brief Tx Transfer completed callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_TxCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Tx Half Transfer completed callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_TxHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Rx Transfer completed callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_RxCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Rx Half Transfer completed callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_RxHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief UART error callbacks. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_UART_ErrorCallback could be implemented in the user file + */ +} + +/** + * @brief UART Abort Complete callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_AbortCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief UART Abort Complete callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_AbortTransmitCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief UART Abort Receive Complete callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UART_AbortReceiveCpltCallback can be implemented in the user file. + */ +} + +/** + * @brief Reception Event Callback (Rx event notification called after use of advanced reception service). + * @param huart UART handle + * @param Size Number of data available in application reception buffer (indicates a position in + * reception buffer until which, data are available) + * @retval None + */ +__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + UNUSED(Size); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_RxEventCallback can be implemented in the user file. + */ +} + +/** + * @} + */ + +/** @defgroup UART_Exported_Functions_Group3 Peripheral Control functions + * @brief UART control functions + * +@verbatim + ============================================================================== + ##### Peripheral Control functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to control the UART: + (+) HAL_LIN_SendBreak() API can be helpful to transmit the break character. + (+) HAL_MultiProcessor_EnterMuteMode() API can be helpful to enter the UART in mute mode. + (+) HAL_MultiProcessor_ExitMuteMode() API can be helpful to exit the UART mute mode by software. + (+) HAL_HalfDuplex_EnableTransmitter() API to enable the UART transmitter and disables the UART receiver in Half Duplex mode + (+) HAL_HalfDuplex_EnableReceiver() API to enable the UART receiver and disables the UART transmitter in Half Duplex mode + +@endverbatim + * @{ + */ + +/** + * @brief Transmits break characters. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) +{ + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Send break characters */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_SBK); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Enters the UART in mute mode. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) +{ + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Enable the USART mute mode by setting the RWU bit in the CR1 register */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_RWU); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Exits the UART mute mode: wake up software. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart) +{ + /* Check the parameters */ + assert_param(IS_UART_INSTANCE(huart->Instance)); + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the USART mute mode by clearing the RWU bit in the CR1 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_RWU); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Enables the UART transmitter and disables the UART receiver. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) +{ + uint32_t tmpreg = 0x00U; + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /*-------------------------- USART CR1 Configuration -----------------------*/ + tmpreg = huart->Instance->CR1; + + /* Clear TE and RE bits */ + tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); + + /* Enable the USART's transmit interface by setting the TE bit in the USART CR1 register */ + tmpreg |= (uint32_t)USART_CR1_TE; + + /* Write to USART CR1 */ + WRITE_REG(huart->Instance->CR1, (uint32_t)tmpreg); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Enables the UART receiver and disables the UART transmitter. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) +{ + uint32_t tmpreg = 0x00U; + + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /*-------------------------- USART CR1 Configuration -----------------------*/ + tmpreg = huart->Instance->CR1; + + /* Clear TE and RE bits */ + tmpreg &= (uint32_t)~((uint32_t)(USART_CR1_TE | USART_CR1_RE)); + + /* Enable the USART's receive interface by setting the RE bit in the USART CR1 register */ + tmpreg |= (uint32_t)USART_CR1_RE; + + /* Write to USART CR1 */ + WRITE_REG(huart->Instance->CR1, (uint32_t)tmpreg); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup UART_Exported_Functions_Group4 Peripheral State and Errors functions + * @brief UART State and Errors functions + * +@verbatim + ============================================================================== + ##### Peripheral State and Errors functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to return the State of + UART communication process, return Peripheral Errors occurred during communication + process + (+) HAL_UART_GetState() API can be helpful to check in run-time the state of the UART peripheral. + (+) HAL_UART_GetError() check in run-time errors that could be occurred during communication. + +@endverbatim + * @{ + */ + +/** + * @brief Returns the UART state. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL state + */ +HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) +{ + uint32_t temp1 = 0x00U, temp2 = 0x00U; + temp1 = huart->gState; + temp2 = huart->RxState; + + return (HAL_UART_StateTypeDef)(temp1 | temp2); +} + +/** + * @brief Return the UART error code + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART. + * @retval UART Error Code + */ +uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart) +{ + return huart->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup UART_Private_Functions UART Private Functions + * @{ + */ + +/** + * @brief Initialize the callbacks to their default values. + * @param huart UART handle. + * @retval none + */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) +void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart) +{ + /* Init the UART Callback settings */ + huart->TxHalfCpltCallback = HAL_UART_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback */ + huart->TxCpltCallback = HAL_UART_TxCpltCallback; /* Legacy weak TxCpltCallback */ + huart->RxHalfCpltCallback = HAL_UART_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback */ + huart->RxCpltCallback = HAL_UART_RxCpltCallback; /* Legacy weak RxCpltCallback */ + huart->ErrorCallback = HAL_UART_ErrorCallback; /* Legacy weak ErrorCallback */ + huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ + huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ + huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ + huart->RxEventCallback = HAL_UARTEx_RxEventCallback; /* Legacy weak RxEventCallback */ + +} +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + +/** + * @brief DMA UART transmit process complete callback. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + /* DMA Normal mode*/ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) + { + huart->TxXferCount = 0x00U; + + /* Disable the DMA transfer for transmit request by setting the DMAT bit + in the UART CR3 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAT); + + /* Enable the UART Transmit Complete Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_TCIE); + + } + /* DMA Circular mode */ + else + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Tx complete callback*/ + huart->TxCpltCallback(huart); +#else + /*Call legacy weak Tx complete callback*/ + HAL_UART_TxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA UART transmit process half complete callback + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Tx complete callback*/ + huart->TxHalfCpltCallback(huart); +#else + /*Call legacy weak Tx complete callback*/ + HAL_UART_TxHalfCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART receive process complete callback. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + /* DMA Normal mode*/ + if ((hdma->Instance->CR & DMA_SxCR_CIRC) == 0U) + { + huart->RxXferCount = 0U; + + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_PEIE); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Disable the DMA transfer for the receiver request by setting the DMAR bit + in the UART CR3 register */ + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + /* If Reception till IDLE event has been selected, Disable IDLE Interrupt */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + } + + /* Check current reception Mode : + If Reception till IDLE event has been selected : use Rx Event callback */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + else + { + /* In other cases : use Rx Complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxCpltCallback(huart); +#else + /*Call legacy weak Rx complete callback*/ + HAL_UART_RxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA UART receive process half complete callback + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMARxHalfCplt(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : use Rx Event callback */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize / 2U); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize / 2U); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + else + { + /* In other cases : use Rx Half Complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Half complete callback*/ + huart->RxHalfCpltCallback(huart); +#else + /*Call legacy weak Rx Half complete callback*/ + HAL_UART_RxHalfCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } +} + +/** + * @brief DMA UART communication error callback. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMAError(DMA_HandleTypeDef *hdma) +{ + uint32_t dmarequest = 0x00U; + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Stop UART DMA Tx request if ongoing */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT); + if ((huart->gState == HAL_UART_STATE_BUSY_TX) && dmarequest) + { + huart->TxXferCount = 0x00U; + UART_EndTxTransfer(huart); + } + + /* Stop UART DMA Rx request if ongoing */ + dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR); + if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && dmarequest) + { + huart->RxXferCount = 0x00U; + UART_EndRxTransfer(huart); + } + + huart->ErrorCode |= HAL_UART_ERROR_DMA; +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief This function handles UART Communication Timeout. It waits + * until a flag is no longer in the specified status. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param Flag specifies the UART flag to check. + * @param Status The actual Flag status (SET or RESET). + * @param Tickstart Tick start value + * @param Timeout Timeout duration + * @retval HAL status + */ +static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout) +{ + /* Wait until flag is set */ + while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if ((Timeout == 0U) || ((HAL_GetTick() - Tickstart) > Timeout)) + { + /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_TIMEOUT; + } + } + } + return HAL_OK; +} + +/** + * @brief Start Receive operation in interrupt mode. + * @note This function could be called by all HAL UART API providing reception in Interrupt mode. + * @note When calling this function, parameters validity is considered as already checked, + * i.e. Rx State, buffer address, ... + * UART Handle is assumed as Locked. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef UART_Start_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + huart->pRxBuffPtr = pData; + huart->RxXferSize = Size; + huart->RxXferCount = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + if (huart->Init.Parity != UART_PARITY_NONE) + { + /* Enable the UART Parity Error Interrupt */ + __HAL_UART_ENABLE_IT(huart, UART_IT_PE); + } + + /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + __HAL_UART_ENABLE_IT(huart, UART_IT_ERR); + + /* Enable the UART Data Register not empty Interrupt */ + __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE); + + return HAL_OK; +} + +/** + * @brief Start Receive operation in DMA mode. + * @note This function could be called by all HAL UART API providing reception in DMA mode. + * @note When calling this function, parameters validity is considered as already checked, + * i.e. Rx State, buffer address, ... + * UART Handle is assumed as Locked. + * @param huart UART handle. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. + * @retval HAL status + */ +HAL_StatusTypeDef UART_Start_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) +{ + uint32_t *tmp; + + huart->pRxBuffPtr = pData; + huart->RxXferSize = Size; + + huart->ErrorCode = HAL_UART_ERROR_NONE; + huart->RxState = HAL_UART_STATE_BUSY_RX; + + /* Set the UART DMA transfer complete callback */ + huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt; + + /* Set the UART DMA Half transfer complete callback */ + huart->hdmarx->XferHalfCpltCallback = UART_DMARxHalfCplt; + + /* Set the DMA error callback */ + huart->hdmarx->XferErrorCallback = UART_DMAError; + + /* Set the DMA abort callback */ + huart->hdmarx->XferAbortCallback = NULL; + + /* Enable the DMA stream */ + tmp = (uint32_t *)&pData; + HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t *)tmp, Size); + + /* Clear the Overrun flag just before enabling the DMA Rx request: can be mandatory for the second transfer */ + __HAL_UART_CLEAR_OREFLAG(huart); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + if (huart->Init.Parity != UART_PARITY_NONE) + { + /* Enable the UART Parity Error Interrupt */ + ATOMIC_SET_BIT(huart->Instance->CR1, USART_CR1_PEIE); + } + + /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* Enable the DMA transfer for the receiver request by setting the DMAR bit + in the UART CR3 register */ + ATOMIC_SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); + + return HAL_OK; +} + +/** + * @brief End ongoing Tx transfer on UART peripheral (following error detection or Transmit completion). + * @param huart UART handle. + * @retval None + */ +static void UART_EndTxTransfer(UART_HandleTypeDef *huart) +{ + /* Disable TXEIE and TCIE interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_TXEIE | USART_CR1_TCIE)); + + /* At end of Tx process, restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; +} + +/** + * @brief End ongoing Rx transfer on UART peripheral (following error detection or Reception completion). + * @param huart UART handle. + * @retval None + */ +static void UART_EndRxTransfer(UART_HandleTypeDef *huart) +{ + /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE)); + ATOMIC_CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + /* In case of reception waiting for IDLE event, disable also the IDLE IE interrupt source */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + } + + /* At end of Rx process, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; +} + +/** + * @brief DMA UART communication abort callback, when initiated by HAL services on Error + * (To be called at end of DMA Abort procedure following error occurrence). + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMAAbortOnError(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + huart->RxXferCount = 0x00U; + huart->TxXferCount = 0x00U; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered error callback*/ + huart->ErrorCallback(huart); +#else + /*Call legacy weak error callback*/ + HAL_UART_ErrorCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Tx communication abort callback, when initiated by user + * (To be called at end of DMA Tx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Rx DMA Handle. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMATxAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + huart->hdmatx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (huart->hdmarx != NULL) + { + if (huart->hdmarx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + huart->TxXferCount = 0x00U; + huart->RxXferCount = 0x00U; + + /* Reset ErrorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + huart->AbortCpltCallback(huart); +#else + /* Call legacy weak Abort complete callback */ + HAL_UART_AbortCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Rx communication abort callback, when initiated by user + * (To be called at end of DMA Rx Abort procedure following user abort request). + * @note When this callback is executed, User Abort complete call back is called only if no + * Abort still ongoing for Tx DMA Handle. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMARxAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + huart->hdmarx->XferAbortCallback = NULL; + + /* Check if an Abort process is still ongoing */ + if (huart->hdmatx != NULL) + { + if (huart->hdmatx->XferAbortCallback != NULL) + { + return; + } + } + + /* No Abort process still ongoing : All DMA channels are aborted, call user Abort Complete callback */ + huart->TxXferCount = 0x00U; + huart->RxXferCount = 0x00U; + + /* Reset ErrorCode */ + huart->ErrorCode = HAL_UART_ERROR_NONE; + + /* Restore huart->gState and huart->RxState to Ready */ + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort complete callback */ + huart->AbortCpltCallback(huart); +#else + /* Call legacy weak Abort complete callback */ + HAL_UART_AbortCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Tx communication abort callback, when initiated by user by a call to + * HAL_UART_AbortTransmit_IT API (Abort only Tx transfer) + * (This callback is executed at end of DMA Tx Abort procedure following user abort request, + * and leads to user Tx Abort Complete callback execution). + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMATxOnlyAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + huart->TxXferCount = 0x00U; + + /* Restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Transmit Complete Callback */ + huart->AbortTransmitCpltCallback(huart); +#else + /* Call legacy weak Abort Transmit Complete Callback */ + HAL_UART_AbortTransmitCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief DMA UART Rx communication abort callback, when initiated by user by a call to + * HAL_UART_AbortReceive_IT API (Abort only Rx transfer) + * (This callback is executed at end of DMA Rx Abort procedure following user abort request, + * and leads to user Rx Abort Complete callback execution). + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA module. + * @retval None + */ +static void UART_DMARxOnlyAbortCallback(DMA_HandleTypeDef *hdma) +{ + UART_HandleTypeDef *huart = (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + huart->RxXferCount = 0x00U; + + /* Restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Call user Abort complete callback */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Abort Receive Complete Callback */ + huart->AbortReceiveCpltCallback(huart); +#else + /* Call legacy weak Abort Receive Complete Callback */ + HAL_UART_AbortReceiveCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ +} + +/** + * @brief Sends an amount of data in non blocking mode. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart) +{ + const uint16_t *tmp; + + /* Check that a Tx process is ongoing */ + if (huart->gState == HAL_UART_STATE_BUSY_TX) + { + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + tmp = (const uint16_t *) huart->pTxBuffPtr; + huart->Instance->DR = (uint16_t)(*tmp & (uint16_t)0x01FF); + huart->pTxBuffPtr += 2U; + } + else + { + huart->Instance->DR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0x00FF); + } + + if (--huart->TxXferCount == 0U) + { + /* Disable the UART Transmit Data Register Empty Interrupt */ + __HAL_UART_DISABLE_IT(huart, UART_IT_TXE); + + /* Enable the UART Transmit Complete Interrupt */ + __HAL_UART_ENABLE_IT(huart, UART_IT_TC); + } + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Wraps up transmission in non blocking mode. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart) +{ + /* Disable the UART Transmit Complete Interrupt */ + __HAL_UART_DISABLE_IT(huart, UART_IT_TC); + + /* Tx process is ended, restore huart->gState to Ready */ + huart->gState = HAL_UART_STATE_READY; + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Tx complete callback*/ + huart->TxCpltCallback(huart); +#else + /*Call legacy weak Tx complete callback*/ + HAL_UART_TxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + + return HAL_OK; +} + +/** + * @brief Receives an amount of data in non blocking mode + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart) +{ + uint8_t *pdata8bits; + uint16_t *pdata16bits; + + /* Check that a Rx process is ongoing */ + if (huart->RxState == HAL_UART_STATE_BUSY_RX) + { + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) + { + pdata8bits = NULL; + pdata16bits = (uint16_t *) huart->pRxBuffPtr; + *pdata16bits = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF); + huart->pRxBuffPtr += 2U; + } + else + { + pdata8bits = (uint8_t *) huart->pRxBuffPtr; + pdata16bits = NULL; + + if ((huart->Init.WordLength == UART_WORDLENGTH_9B) || ((huart->Init.WordLength == UART_WORDLENGTH_8B) && (huart->Init.Parity == UART_PARITY_NONE))) + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF); + } + else + { + *pdata8bits = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F); + } + huart->pRxBuffPtr += 1U; + } + + if (--huart->RxXferCount == 0U) + { + /* Disable the UART Data Register not empty Interrupt */ + __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE); + + /* Disable the UART Parity Error Interrupt */ + __HAL_UART_DISABLE_IT(huart, UART_IT_PE); + + /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */ + __HAL_UART_DISABLE_IT(huart, UART_IT_ERR); + + /* Rx process is completed, restore huart->RxState to Ready */ + huart->RxState = HAL_UART_STATE_READY; + + /* Check current reception Mode : + If Reception till IDLE event has been selected : */ + if (huart->ReceptionType == HAL_UART_RECEPTION_TOIDLE) + { + /* Set reception type to Standard */ + huart->ReceptionType = HAL_UART_RECEPTION_STANDARD; + + /* Disable IDLE interrupt */ + ATOMIC_CLEAR_BIT(huart->Instance->CR1, USART_CR1_IDLEIE); + + /* Check if IDLE flag is set */ + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)) + { + /* Clear IDLE flag in ISR */ + __HAL_UART_CLEAR_IDLEFLAG(huart); + } + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx Event callback*/ + huart->RxEventCallback(huart, huart->RxXferSize); +#else + /*Call legacy weak Rx Event callback*/ + HAL_UARTEx_RxEventCallback(huart, huart->RxXferSize); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + else + { + /* Standard reception API called */ +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /*Call registered Rx complete callback*/ + huart->RxCpltCallback(huart); +#else + /*Call legacy weak Rx complete callback*/ + HAL_UART_RxCpltCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + } + + return HAL_OK; + } + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Configures the UART peripheral. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval None + */ +static void UART_SetConfig(UART_HandleTypeDef *huart) +{ + uint32_t tmpreg; + uint32_t pclk; + + /* Check the parameters */ + assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); + assert_param(IS_UART_STOPBITS(huart->Init.StopBits)); + assert_param(IS_UART_PARITY(huart->Init.Parity)); + assert_param(IS_UART_MODE(huart->Init.Mode)); + + /*-------------------------- USART CR2 Configuration -----------------------*/ + /* Configure the UART Stop Bits: Set STOP[13:12] bits + according to huart->Init.StopBits value */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_STOP, huart->Init.StopBits); + + /*-------------------------- USART CR1 Configuration -----------------------*/ + /* Configure the UART Word Length, Parity and mode: + Set the M bits according to huart->Init.WordLength value + Set PCE and PS bits according to huart->Init.Parity value + Set TE and RE bits according to huart->Init.Mode value + Set OVER8 bit according to huart->Init.OverSampling value */ + + tmpreg = (uint32_t)huart->Init.WordLength | huart->Init.Parity | huart->Init.Mode | huart->Init.OverSampling; + MODIFY_REG(huart->Instance->CR1, + (uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8), + tmpreg); + + /*-------------------------- USART CR3 Configuration -----------------------*/ + /* Configure the UART HFC: Set CTSE and RTSE bits according to huart->Init.HwFlowCtl value */ + MODIFY_REG(huart->Instance->CR3, (USART_CR3_RTSE | USART_CR3_CTSE), huart->Init.HwFlowCtl); + + +#if defined(USART6) && defined(UART9) && defined(UART10) + if ((huart->Instance == USART1) || (huart->Instance == USART6) || (huart->Instance == UART9) || (huart->Instance == UART10)) + { + pclk = HAL_RCC_GetPCLK2Freq(); + } +#elif defined(USART6) + if ((huart->Instance == USART1) || (huart->Instance == USART6)) + { + pclk = HAL_RCC_GetPCLK2Freq(); + } +#else + if (huart->Instance == USART1) + { + pclk = HAL_RCC_GetPCLK2Freq(); + } +#endif /* USART6 */ + else + { + pclk = HAL_RCC_GetPCLK1Freq(); + } + /*-------------------------- USART BRR Configuration ---------------------*/ + if (huart->Init.OverSampling == UART_OVERSAMPLING_8) + { + huart->Instance->BRR = UART_BRR_SAMPLING8(pclk, huart->Init.BaudRate); + } + else + { + huart->Instance->BRR = UART_BRR_SAMPLING16(pclk, huart->Init.BaudRate); + } +} + +/** + * @} + */ + +#endif /* HAL_UART_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.ioc b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.ioc new file mode 100644 index 0000000..90e8e09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.ioc @@ -0,0 +1,184 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats= +CAD.pinconfig= +CAD.provider= +FREERTOS.FootprintOK=true +FREERTOS.IPParameters=Tasks01,FootprintOK +FREERTOS.Tasks01=defaultTask,0,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;BlinkLED,-3,128,StartTask02,Default,NULL,Dynamic,NULL,NULL +File.Version=6 +KeepUserPlacement=false +Mcu.CPN=STM32F446RET6 +Mcu.Family=STM32F4 +Mcu.IP0=FREERTOS +Mcu.IP1=NVIC +Mcu.IP2=RCC +Mcu.IP3=SYS +Mcu.IP4=USART2 +Mcu.IPNb=5 +Mcu.Name=STM32F446R(C-E)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN +Mcu.Pin10=PB3 +Mcu.Pin11=VP_FREERTOS_VS_CMSIS_V1 +Mcu.Pin12=VP_SYS_VS_Systick +Mcu.Pin2=PC15-OSC32_OUT +Mcu.Pin3=PH0-OSC_IN +Mcu.Pin4=PH1-OSC_OUT +Mcu.Pin5=PA2 +Mcu.Pin6=PA3 +Mcu.Pin7=PA5 +Mcu.Pin8=PA13 +Mcu.Pin9=PA14 +Mcu.PinsNb=13 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F446RETx +MxCube.Version=6.7.0 +MxDb.Version=DB.6.0.70 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false\:false +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:false\:false\:false +NVIC.SavedPendsvIrqHandlerGenerated=true +NVIC.SavedSvcallIrqHandlerGenerated=true +NVIC.SavedSystickIrqHandlerGenerated=true +NVIC.SysTick_IRQn=true\:15\:0\:true\:false\:true\:true\:true\:true\:false +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false\:false +PA13.GPIOParameters=GPIO_Label +PA13.GPIO_Label=TMS +PA13.Locked=true +PA13.Mode=Serial_Wire +PA13.Signal=SYS_JTMS-SWDIO +PA14.GPIOParameters=GPIO_Label +PA14.GPIO_Label=TCK +PA14.Locked=true +PA14.Mode=Serial_Wire +PA14.Signal=SYS_JTCK-SWCLK +PA2.GPIOParameters=GPIO_Label +PA2.GPIO_Label=USART_TX +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=USART_RX +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA5.GPIOParameters=GPIO_Label +PA5.GPIO_Label=LD2 [Green Led] +PA5.Locked=true +PA5.Signal=GPIO_Output +PB3.GPIOParameters=GPIO_Label +PB3.GPIO_Label=SWO +PB3.Locked=true +PB3.Signal=SYS_JTDO-SWO +PC13.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI +PC13.GPIO_Label=B1 [Blue PushButton] +PC13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PC13.Locked=true +PC13.Signal=GPXTI13 +PC14-OSC32_IN.Locked=true +PC14-OSC32_IN.Mode=LSE-External-Oscillator +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.Locked=true +PC15-OSC32_OUT.Mode=LSE-External-Oscillator +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PH0-OSC_IN.Locked=true +PH0-OSC_IN.Mode=HSE-External-Oscillator +PH0-OSC_IN.Signal=RCC_OSC_IN +PH1-OSC_OUT.Locked=true +PH1-OSC_OUT.Mode=HSE-External-Oscillator +PH1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F446RETx +ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.27.1 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=FreeRTOS_LED.ioc +ProjectManager.ProjectName=FreeRTOS_LED +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART2_UART_Init-USART2-false-HAL-true +RCC.48MHZClocksFreq_Value=84000000 +RCC.AHBFreq_Value=84000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV2 +RCC.APB1Freq_Value=42000000 +RCC.APB1TimFreq_Value=84000000 +RCC.APB2Freq_Value=84000000 +RCC.APB2TimFreq_Value=84000000 +RCC.CECFreq_Value=32786.88524590164 +RCC.CortexFreq_Value=84000000 +RCC.EthernetFreq_Value=84000000 +RCC.FCLKCortexFreq_Value=84000000 +RCC.FLatency-AdvancedSettings=FLASH_LATENCY_2 +RCC.FMPI2C1Freq_Value=42000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=84000000 +RCC.HSE_VALUE=8000000 +RCC.HSI_VALUE=16000000 +RCC.I2SClocksFreq_Value=96000000 +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CECFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FLatency-AdvancedSettings,FMPI2C1Freq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLI2SPCLKFreq_Value,PLLI2SQCLKFreq_Value,PLLI2SRCLKFreq_Value,PLLN,PLLP,PLLQCLKFreq_Value,PLLRCLKFreq_Value,PLLSAIPCLKFreq_Value,PLLSAIQCLKFreq_Value,PWRFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SAIAFreq_Value,SAIBFreq_Value,SDIOFreq_Value,SPDIFRXFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USBFreq_Value,VCOI2SInputFreq_Value,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOInputMFreq_Value,VCOOutputFreq_Value,VCOSAIInputFreq_Value,VCOSAIOutputFreq_Value,VcooutputI2S +RCC.LSI_VALUE=32000 +RCC.MCO2PinFreq_Value=84000000 +RCC.PLLCLKFreq_Value=84000000 +RCC.PLLI2SPCLKFreq_Value=96000000 +RCC.PLLI2SQCLKFreq_Value=96000000 +RCC.PLLI2SRCLKFreq_Value=96000000 +RCC.PLLN=336 +RCC.PLLP=RCC_PLLP_DIV4 +RCC.PLLQCLKFreq_Value=168000000 +RCC.PLLRCLKFreq_Value=168000000 +RCC.PLLSAIPCLKFreq_Value=96000000 +RCC.PLLSAIQCLKFreq_Value=96000000 +RCC.PWRFreq_Value=84000000 +RCC.RTCFreq_Value=32000 +RCC.RTCHSEDivFreq_Value=4000000 +RCC.SAIAFreq_Value=96000000 +RCC.SAIBFreq_Value=96000000 +RCC.SDIOFreq_Value=168000000 +RCC.SPDIFRXFreq_Value=168000000 +RCC.SYSCLKFreq_VALUE=84000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.USBFreq_Value=168000000 +RCC.VCOI2SInputFreq_Value=1000000 +RCC.VCOI2SOutputFreq_Value=192000000 +RCC.VCOInputFreq_Value=1000000 +RCC.VCOInputMFreq_Value=1000000 +RCC.VCOOutputFreq_Value=336000000 +RCC.VCOSAIInputFreq_Value=1000000 +RCC.VCOSAIOutputFreq_Value=192000000 +RCC.VcooutputI2S=96000000 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +USART2.IPParameters=VirtualMode +USART2.VirtualMode=VM_ASYNC +VP_FREERTOS_VS_CMSIS_V1.Mode=CMSIS_V1 +VP_FREERTOS_VS_CMSIS_V1.Signal=FREERTOS_VS_CMSIS_V1 +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=NUCLEO-F446RE +boardIOC=true +isbadioc=false diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.launch b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.launch new file mode 100644 index 0000000..ddd7cfa --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.launch @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c new file mode 100644 index 0000000..89c3633 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c @@ -0,0 +1,1727 @@ +/* ---------------------------------------------------------------------- + * $Date: 5. February 2013 + * $Revision: V1.02 + * + * Project: CMSIS-RTOS API + * Title: cmsis_os.c + * + * Version 0.02 + * Initial Proposal Phase + * Version 0.03 + * osKernelStart added, optional feature: main started as thread + * osSemaphores have standard behavior + * osTimerCreate does not start the timer, added osTimerStart + * osThreadPass is renamed to osThreadYield + * Version 1.01 + * Support for C++ interface + * - const attribute removed from the osXxxxDef_t typedef's + * - const attribute added to the osXxxxDef macros + * Added: osTimerDelete, osMutexDelete, osSemaphoreDelete + * Added: osKernelInitialize + * Version 1.02 + * Control functions for short timeouts in microsecond resolution: + * Added: osKernelSysTick, osKernelSysTickFrequency, osKernelSysTickMicroSec + * Removed: osSignalGet + * + * + *---------------------------------------------------------------------------- + * + * Portions Copyright © 2016 STMicroelectronics International N.V. All rights reserved. + * Portions Copyright (c) 2013 ARM LIMITED + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of ARM 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 COPYRIGHT HOLDERS AND 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. + *---------------------------------------------------------------------------*/ + +#include +#include "cmsis_os.h" + +/* + * ARM Compiler 4/5 + */ +#if defined ( __CC_ARM ) + + #define __ASM __asm + #define __INLINE __inline + #define __STATIC_INLINE static __inline + + #include "cmsis_armcc.h" + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + #define __STATIC_INLINE static inline + + #include "cmsis_gcc.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + + #include +#endif + +extern void xPortSysTickHandler(void); + +/* Convert from CMSIS type osPriority to FreeRTOS priority number */ +static unsigned portBASE_TYPE makeFreeRtosPriority (osPriority priority) +{ + unsigned portBASE_TYPE fpriority = tskIDLE_PRIORITY; + + if (priority != osPriorityError) { + fpriority += (priority - osPriorityIdle); + } + + return fpriority; +} + +#if (INCLUDE_uxTaskPriorityGet == 1) +/* Convert from FreeRTOS priority number to CMSIS type osPriority */ +static osPriority makeCmsisPriority (unsigned portBASE_TYPE fpriority) +{ + osPriority priority = osPriorityError; + + if ((fpriority - tskIDLE_PRIORITY) <= (osPriorityRealtime - osPriorityIdle)) { + priority = (osPriority)((int)osPriorityIdle + (int)(fpriority - tskIDLE_PRIORITY)); + } + + return priority; +} +#endif + + +/* Determine whether we are in thread mode or handler mode. */ +static int inHandlerMode (void) +{ + return __get_IPSR() != 0; +} + +/*********************** Kernel Control Functions *****************************/ +/** +* @brief Initialize the RTOS Kernel for creating objects. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osKernelInitialize shall be consistent in every CMSIS-RTOS. +*/ +osStatus osKernelInitialize (void); + +/** +* @brief Start the RTOS Kernel with executing the specified thread. +* @param thread_def thread definition referenced with \ref osThread. +* @param argument pointer that is passed to the thread function as start argument. +* @retval status code that indicates the execution status of the function +* @note MUST REMAIN UNCHANGED: \b osKernelStart shall be consistent in every CMSIS-RTOS. +*/ +osStatus osKernelStart (void) +{ + vTaskStartScheduler(); + + return osOK; +} + +/** +* @brief Check if the RTOS kernel is already started +* @param None +* @retval (0) RTOS is not started +* (1) RTOS is started +* (-1) if this feature is disabled in FreeRTOSConfig.h +* @note MUST REMAIN UNCHANGED: \b osKernelRunning shall be consistent in every CMSIS-RTOS. +*/ +int32_t osKernelRunning(void) +{ +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED) + return 0; + else + return 1; +#else + return (-1); +#endif +} + +#if (defined (osFeature_SysTick) && (osFeature_SysTick != 0)) // System Timer available +/** +* @brief Get the value of the Kernel SysTick timer +* @param None +* @retval None +* @note MUST REMAIN UNCHANGED: \b osKernelSysTick shall be consistent in every CMSIS-RTOS. +*/ +uint32_t osKernelSysTick(void) +{ + if (inHandlerMode()) { + return xTaskGetTickCountFromISR(); + } + else { + return xTaskGetTickCount(); + } +} +#endif // System Timer available +/*********************** Thread Management *****************************/ +/** +* @brief Create a thread and add it to Active Threads and set it to state READY. +* @param thread_def thread definition referenced with \ref osThread. +* @param argument pointer that is passed to the thread function as start argument. +* @retval thread ID for reference by other functions or NULL in case of error. +* @note MUST REMAIN UNCHANGED: \b osThreadCreate shall be consistent in every CMSIS-RTOS. +*/ +osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument) +{ + TaskHandle_t handle; + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + if((thread_def->buffer != NULL) && (thread_def->controlblock != NULL)) { + handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, + thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority), + thread_def->buffer, thread_def->controlblock); + } + else { + if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, + thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority), + &handle) != pdPASS) { + return NULL; + } + } +#elif( configSUPPORT_STATIC_ALLOCATION == 1 ) + + handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, + thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority), + thread_def->buffer, thread_def->controlblock); +#else + if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, + thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority), + &handle) != pdPASS) { + return NULL; + } +#endif + + return handle; +} + +/** +* @brief Return the thread ID of the current running thread. +* @retval thread ID for reference by other functions or NULL in case of error. +* @note MUST REMAIN UNCHANGED: \b osThreadGetId shall be consistent in every CMSIS-RTOS. +*/ +osThreadId osThreadGetId (void) +{ +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + return xTaskGetCurrentTaskHandle(); +#else + return NULL; +#endif +} + +/** +* @brief Terminate execution of a thread and remove it from Active Threads. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osThreadTerminate shall be consistent in every CMSIS-RTOS. +*/ +osStatus osThreadTerminate (osThreadId thread_id) +{ +#if (INCLUDE_vTaskDelete == 1) + vTaskDelete(thread_id); + return osOK; +#else + return osErrorOS; +#endif +} + +/** +* @brief Pass control to next thread that is in state \b READY. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osThreadYield shall be consistent in every CMSIS-RTOS. +*/ +osStatus osThreadYield (void) +{ + taskYIELD(); + + return osOK; +} + +/** +* @brief Change priority of an active thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @param priority new priority value for the thread function. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osThreadSetPriority shall be consistent in every CMSIS-RTOS. +*/ +osStatus osThreadSetPriority (osThreadId thread_id, osPriority priority) +{ +#if (INCLUDE_vTaskPrioritySet == 1) + vTaskPrioritySet(thread_id, makeFreeRtosPriority(priority)); + return osOK; +#else + return osErrorOS; +#endif +} + +/** +* @brief Get current priority of an active thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval current priority value of the thread function. +* @note MUST REMAIN UNCHANGED: \b osThreadGetPriority shall be consistent in every CMSIS-RTOS. +*/ +osPriority osThreadGetPriority (osThreadId thread_id) +{ +#if (INCLUDE_uxTaskPriorityGet == 1) + if (inHandlerMode()) + { + return makeCmsisPriority(uxTaskPriorityGetFromISR(thread_id)); + } + else + { + return makeCmsisPriority(uxTaskPriorityGet(thread_id)); + } +#else + return osPriorityError; +#endif +} + +/*********************** Generic Wait Functions *******************************/ +/** +* @brief Wait for Timeout (Time Delay) +* @param millisec time delay value +* @retval status code that indicates the execution status of the function. +*/ +osStatus osDelay (uint32_t millisec) +{ +#if INCLUDE_vTaskDelay + TickType_t ticks = millisec / portTICK_PERIOD_MS; + + vTaskDelay(ticks ? ticks : 1); /* Minimum delay = 1 tick */ + + return osOK; +#else + (void) millisec; + + return osErrorResource; +#endif +} + +#if (defined (osFeature_Wait) && (osFeature_Wait != 0)) /* Generic Wait available */ +/** +* @brief Wait for Signal, Message, Mail, or Timeout +* @param millisec timeout value or 0 in case of no time-out +* @retval event that contains signal, message, or mail information or error code. +* @note MUST REMAIN UNCHANGED: \b osWait shall be consistent in every CMSIS-RTOS. +*/ +osEvent osWait (uint32_t millisec); + +#endif /* Generic Wait available */ + +/*********************** Timer Management Functions ***************************/ +/** +* @brief Create a timer. +* @param timer_def timer object referenced with \ref osTimer. +* @param type osTimerOnce for one-shot or osTimerPeriodic for periodic behavior. +* @param argument argument to the timer call back function. +* @retval timer ID for reference by other functions or NULL in case of error. +* @note MUST REMAIN UNCHANGED: \b osTimerCreate shall be consistent in every CMSIS-RTOS. +*/ +osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument) +{ +#if (configUSE_TIMERS == 1) + +#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + if(timer_def->controlblock != NULL) { + return xTimerCreateStatic((const char *)"", + 1, // period should be filled when starting the Timer using osTimerStart + (type == osTimerPeriodic) ? pdTRUE : pdFALSE, + (void *) argument, + (TimerCallbackFunction_t)timer_def->ptimer, + (StaticTimer_t *)timer_def->controlblock); + } + else { + return xTimerCreate((const char *)"", + 1, // period should be filled when starting the Timer using osTimerStart + (type == osTimerPeriodic) ? pdTRUE : pdFALSE, + (void *) argument, + (TimerCallbackFunction_t)timer_def->ptimer); + } +#elif( configSUPPORT_STATIC_ALLOCATION == 1 ) + return xTimerCreateStatic((const char *)"", + 1, // period should be filled when starting the Timer using osTimerStart + (type == osTimerPeriodic) ? pdTRUE : pdFALSE, + (void *) argument, + (TimerCallbackFunction_t)timer_def->ptimer, + (StaticTimer_t *)timer_def->controlblock); +#else + return xTimerCreate((const char *)"", + 1, // period should be filled when starting the Timer using osTimerStart + (type == osTimerPeriodic) ? pdTRUE : pdFALSE, + (void *) argument, + (TimerCallbackFunction_t)timer_def->ptimer); +#endif + +#else + return NULL; +#endif +} + +/** +* @brief Start or restart a timer. +* @param timer_id timer ID obtained by \ref osTimerCreate. +* @param millisec time delay value of the timer. +* @retval status code that indicates the execution status of the function +* @note MUST REMAIN UNCHANGED: \b osTimerStart shall be consistent in every CMSIS-RTOS. +*/ +osStatus osTimerStart (osTimerId timer_id, uint32_t millisec) +{ + osStatus result = osOK; +#if (configUSE_TIMERS == 1) + portBASE_TYPE taskWoken = pdFALSE; + TickType_t ticks = millisec / portTICK_PERIOD_MS; + + if (ticks == 0) + ticks = 1; + + if (inHandlerMode()) + { + if (xTimerChangePeriodFromISR(timer_id, ticks, &taskWoken) != pdPASS) + { + result = osErrorOS; + } + else + { + portEND_SWITCHING_ISR(taskWoken); + } + } + else + { + if (xTimerChangePeriod(timer_id, ticks, 0) != pdPASS) + result = osErrorOS; + } + +#else + result = osErrorOS; +#endif + return result; +} + +/** +* @brief Stop a timer. +* @param timer_id timer ID obtained by \ref osTimerCreate +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osTimerStop shall be consistent in every CMSIS-RTOS. +*/ +osStatus osTimerStop (osTimerId timer_id) +{ + osStatus result = osOK; +#if (configUSE_TIMERS == 1) + portBASE_TYPE taskWoken = pdFALSE; + + if (inHandlerMode()) { + if (xTimerStopFromISR(timer_id, &taskWoken) != pdPASS) { + return osErrorOS; + } + portEND_SWITCHING_ISR(taskWoken); + } + else { + if (xTimerStop(timer_id, 0) != pdPASS) { + result = osErrorOS; + } + } +#else + result = osErrorOS; +#endif + return result; +} + +/** +* @brief Delete a timer. +* @param timer_id timer ID obtained by \ref osTimerCreate +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osTimerDelete shall be consistent in every CMSIS-RTOS. +*/ +osStatus osTimerDelete (osTimerId timer_id) +{ +osStatus result = osOK; + +#if (configUSE_TIMERS == 1) + + if (inHandlerMode()) { + return osErrorISR; + } + else { + if ((xTimerDelete(timer_id, osWaitForever )) != pdPASS) { + result = osErrorOS; + } + } + +#else + result = osErrorOS; +#endif + + return result; +} + +/*************************** Signal Management ********************************/ +/** +* @brief Set the specified Signal Flags of an active thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @param signals specifies the signal flags of the thread that should be set. +* @retval previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters. +* @note MUST REMAIN UNCHANGED: \b osSignalSet shall be consistent in every CMSIS-RTOS. +*/ +int32_t osSignalSet (osThreadId thread_id, int32_t signal) +{ +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + uint32_t ulPreviousNotificationValue = 0; + + if (inHandlerMode()) + { + if(xTaskGenericNotifyFromISR( thread_id , (uint32_t)signal, eSetBits, &ulPreviousNotificationValue, &xHigherPriorityTaskWoken ) != pdPASS ) + return 0x80000000; + + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + } + else if(xTaskGenericNotify( thread_id , (uint32_t)signal, eSetBits, &ulPreviousNotificationValue) != pdPASS ) + return 0x80000000; + + return ulPreviousNotificationValue; +#else + (void) thread_id; + (void) signal; + + return 0x80000000; /* Task Notification not supported */ +#endif +} + +/** +* @brief Clear the specified Signal Flags of an active thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @param signals specifies the signal flags of the thread that shall be cleared. +* @retval previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters. +* @note MUST REMAIN UNCHANGED: \b osSignalClear shall be consistent in every CMSIS-RTOS. +*/ +int32_t osSignalClear (osThreadId thread_id, int32_t signal); + +/** +* @brief Wait for one or more Signal Flags to become signaled for the current \b RUNNING thread. +* @param signals wait until all specified signal flags set or 0 for any single signal flag. +* @param millisec timeout value or 0 in case of no time-out. +* @retval event flag information or error code. +* @note MUST REMAIN UNCHANGED: \b osSignalWait shall be consistent in every CMSIS-RTOS. +*/ +osEvent osSignalWait (int32_t signals, uint32_t millisec) +{ + osEvent ret; + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + TickType_t ticks; + + ret.value.signals = 0; + ticks = 0; + if (millisec == osWaitForever) { + ticks = portMAX_DELAY; + } + else if (millisec != 0) { + ticks = millisec / portTICK_PERIOD_MS; + if (ticks == 0) { + ticks = 1; + } + } + + if (inHandlerMode()) + { + ret.status = osErrorISR; /*Not allowed in ISR*/ + } + else + { + if(xTaskNotifyWait( 0,(uint32_t) signals, (uint32_t *)&ret.value.signals, ticks) != pdTRUE) + { + if(ticks == 0) ret.status = osOK; + else ret.status = osEventTimeout; + } + else if(ret.value.signals < 0) + { + ret.status = osErrorValue; + } + else ret.status = osEventSignal; + } +#else + (void) signals; + (void) millisec; + + ret.status = osErrorOS; /* Task Notification not supported */ +#endif + + return ret; +} + +/**************************** Mutex Management ********************************/ +/** +* @brief Create and Initialize a Mutex object +* @param mutex_def mutex definition referenced with \ref osMutex. +* @retval mutex ID for reference by other functions or NULL in case of error. +* @note MUST REMAIN UNCHANGED: \b osMutexCreate shall be consistent in every CMSIS-RTOS. +*/ +osMutexId osMutexCreate (const osMutexDef_t *mutex_def) +{ +#if ( configUSE_MUTEXES == 1) + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + if (mutex_def->controlblock != NULL) { + return xSemaphoreCreateMutexStatic( mutex_def->controlblock ); + } + else { + return xSemaphoreCreateMutex(); + } +#elif ( configSUPPORT_STATIC_ALLOCATION == 1 ) + return xSemaphoreCreateMutexStatic( mutex_def->controlblock ); +#else + return xSemaphoreCreateMutex(); +#endif +#else + return NULL; +#endif +} + +/** +* @brief Wait until a Mutex becomes available +* @param mutex_id mutex ID obtained by \ref osMutexCreate. +* @param millisec timeout value or 0 in case of no time-out. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osMutexWait shall be consistent in every CMSIS-RTOS. +*/ +osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec) +{ + TickType_t ticks; + portBASE_TYPE taskWoken = pdFALSE; + + + if (mutex_id == NULL) { + return osErrorParameter; + } + + ticks = 0; + if (millisec == osWaitForever) { + ticks = portMAX_DELAY; + } + else if (millisec != 0) { + ticks = millisec / portTICK_PERIOD_MS; + if (ticks == 0) { + ticks = 1; + } + } + + if (inHandlerMode()) { + if (xSemaphoreTakeFromISR(mutex_id, &taskWoken) != pdTRUE) { + return osErrorOS; + } + portEND_SWITCHING_ISR(taskWoken); + } + else if (xSemaphoreTake(mutex_id, ticks) != pdTRUE) { + return osErrorOS; + } + + return osOK; +} + +/** +* @brief Release a Mutex that was obtained by \ref osMutexWait +* @param mutex_id mutex ID obtained by \ref osMutexCreate. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osMutexRelease shall be consistent in every CMSIS-RTOS. +*/ +osStatus osMutexRelease (osMutexId mutex_id) +{ + osStatus result = osOK; + portBASE_TYPE taskWoken = pdFALSE; + + if (inHandlerMode()) { + if (xSemaphoreGiveFromISR(mutex_id, &taskWoken) != pdTRUE) { + return osErrorOS; + } + portEND_SWITCHING_ISR(taskWoken); + } + else if (xSemaphoreGive(mutex_id) != pdTRUE) + { + result = osErrorOS; + } + return result; +} + +/** +* @brief Delete a Mutex +* @param mutex_id mutex ID obtained by \ref osMutexCreate. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osMutexDelete shall be consistent in every CMSIS-RTOS. +*/ +osStatus osMutexDelete (osMutexId mutex_id) +{ + if (inHandlerMode()) { + return osErrorISR; + } + + vQueueDelete(mutex_id); + + return osOK; +} + +/******************** Semaphore Management Functions **************************/ + +#if (defined (osFeature_Semaphore) && (osFeature_Semaphore != 0)) + +/** +* @brief Create and Initialize a Semaphore object used for managing resources +* @param semaphore_def semaphore definition referenced with \ref osSemaphore. +* @param count number of available resources. +* @retval semaphore ID for reference by other functions or NULL in case of error. +* @note MUST REMAIN UNCHANGED: \b osSemaphoreCreate shall be consistent in every CMSIS-RTOS. +*/ +osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count) +{ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + osSemaphoreId sema; + + if (semaphore_def->controlblock != NULL){ + if (count == 1) { + return xSemaphoreCreateBinaryStatic( semaphore_def->controlblock ); + } + else { +#if (configUSE_COUNTING_SEMAPHORES == 1 ) + return xSemaphoreCreateCountingStatic( count, count, semaphore_def->controlblock ); +#else + return NULL; +#endif + } + } + else { + if (count == 1) { + vSemaphoreCreateBinary(sema); + return sema; + } + else { +#if (configUSE_COUNTING_SEMAPHORES == 1 ) + return xSemaphoreCreateCounting(count, count); +#else + return NULL; +#endif + } + } +#elif ( configSUPPORT_STATIC_ALLOCATION == 1 ) // configSUPPORT_DYNAMIC_ALLOCATION == 0 + if(count == 1) { + return xSemaphoreCreateBinaryStatic( semaphore_def->controlblock ); + } + else + { +#if (configUSE_COUNTING_SEMAPHORES == 1 ) + return xSemaphoreCreateCountingStatic( count, count, semaphore_def->controlblock ); +#else + return NULL; +#endif + } +#else // configSUPPORT_STATIC_ALLOCATION == 0 && configSUPPORT_DYNAMIC_ALLOCATION == 1 + osSemaphoreId sema; + + if (count == 1) { + vSemaphoreCreateBinary(sema); + return sema; + } + else { +#if (configUSE_COUNTING_SEMAPHORES == 1 ) + return xSemaphoreCreateCounting(count, count); +#else + return NULL; +#endif + } +#endif +} + +/** +* @brief Wait until a Semaphore token becomes available +* @param semaphore_id semaphore object referenced with \ref osSemaphore. +* @param millisec timeout value or 0 in case of no time-out. +* @retval number of available tokens, or -1 in case of incorrect parameters. +* @note MUST REMAIN UNCHANGED: \b osSemaphoreWait shall be consistent in every CMSIS-RTOS. +*/ +int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec) +{ + TickType_t ticks; + portBASE_TYPE taskWoken = pdFALSE; + + + if (semaphore_id == NULL) { + return osErrorParameter; + } + + ticks = 0; + if (millisec == osWaitForever) { + ticks = portMAX_DELAY; + } + else if (millisec != 0) { + ticks = millisec / portTICK_PERIOD_MS; + if (ticks == 0) { + ticks = 1; + } + } + + if (inHandlerMode()) { + if (xSemaphoreTakeFromISR(semaphore_id, &taskWoken) != pdTRUE) { + return osErrorOS; + } + portEND_SWITCHING_ISR(taskWoken); + } + else if (xSemaphoreTake(semaphore_id, ticks) != pdTRUE) { + return osErrorOS; + } + + return osOK; +} + +/** +* @brief Release a Semaphore token +* @param semaphore_id semaphore object referenced with \ref osSemaphore. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osSemaphoreRelease shall be consistent in every CMSIS-RTOS. +*/ +osStatus osSemaphoreRelease (osSemaphoreId semaphore_id) +{ + osStatus result = osOK; + portBASE_TYPE taskWoken = pdFALSE; + + + if (inHandlerMode()) { + if (xSemaphoreGiveFromISR(semaphore_id, &taskWoken) != pdTRUE) { + return osErrorOS; + } + portEND_SWITCHING_ISR(taskWoken); + } + else { + if (xSemaphoreGive(semaphore_id) != pdTRUE) { + result = osErrorOS; + } + } + + return result; +} + +/** +* @brief Delete a Semaphore +* @param semaphore_id semaphore object referenced with \ref osSemaphore. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osSemaphoreDelete shall be consistent in every CMSIS-RTOS. +*/ +osStatus osSemaphoreDelete (osSemaphoreId semaphore_id) +{ + if (inHandlerMode()) { + return osErrorISR; + } + + vSemaphoreDelete(semaphore_id); + + return osOK; +} + +#endif /* Use Semaphores */ + +/******************* Memory Pool Management Functions ***********************/ + +#if (defined (osFeature_Pool) && (osFeature_Pool != 0)) + +//TODO +//This is a primitive and inefficient wrapper around the existing FreeRTOS memory management. +//A better implementation will have to modify heap_x.c! + + +typedef struct os_pool_cb { + void *pool; + uint8_t *markers; + uint32_t pool_sz; + uint32_t item_sz; + uint32_t currentIndex; +} os_pool_cb_t; + + +/** +* @brief Create and Initialize a memory pool +* @param pool_def memory pool definition referenced with \ref osPool. +* @retval memory pool ID for reference by other functions or NULL in case of error. +* @note MUST REMAIN UNCHANGED: \b osPoolCreate shall be consistent in every CMSIS-RTOS. +*/ +osPoolId osPoolCreate (const osPoolDef_t *pool_def) +{ +#if (configSUPPORT_DYNAMIC_ALLOCATION == 1) + osPoolId thePool; + int itemSize = 4 * ((pool_def->item_sz + 3) / 4); + uint32_t i; + + /* First have to allocate memory for the pool control block. */ + thePool = pvPortMalloc(sizeof(os_pool_cb_t)); + + + if (thePool) { + thePool->pool_sz = pool_def->pool_sz; + thePool->item_sz = itemSize; + thePool->currentIndex = 0; + + /* Memory for markers */ + thePool->markers = pvPortMalloc(pool_def->pool_sz); + + if (thePool->markers) { + /* Now allocate the pool itself. */ + thePool->pool = pvPortMalloc(pool_def->pool_sz * itemSize); + + if (thePool->pool) { + for (i = 0; i < pool_def->pool_sz; i++) { + thePool->markers[i] = 0; + } + } + else { + vPortFree(thePool->markers); + vPortFree(thePool); + thePool = NULL; + } + } + else { + vPortFree(thePool); + thePool = NULL; + } + } + + return thePool; + +#else + return NULL; +#endif +} + +/** +* @brief Allocate a memory block from a memory pool +* @param pool_id memory pool ID obtain referenced with \ref osPoolCreate. +* @retval address of the allocated memory block or NULL in case of no memory available. +* @note MUST REMAIN UNCHANGED: \b osPoolAlloc shall be consistent in every CMSIS-RTOS. +*/ +void *osPoolAlloc (osPoolId pool_id) +{ + int dummy = 0; + void *p = NULL; + uint32_t i; + uint32_t index; + + if (inHandlerMode()) { + dummy = portSET_INTERRUPT_MASK_FROM_ISR(); + } + else { + vPortEnterCritical(); + } + + for (i = 0; i < pool_id->pool_sz; i++) { + index = (pool_id->currentIndex + i) % pool_id->pool_sz; + + if (pool_id->markers[index] == 0) { + pool_id->markers[index] = 1; + p = (void *)((uint32_t)(pool_id->pool) + (index * pool_id->item_sz)); + pool_id->currentIndex = index; + break; + } + } + + if (inHandlerMode()) { + portCLEAR_INTERRUPT_MASK_FROM_ISR(dummy); + } + else { + vPortExitCritical(); + } + + return p; +} + +/** +* @brief Allocate a memory block from a memory pool and set memory block to zero +* @param pool_id memory pool ID obtain referenced with \ref osPoolCreate. +* @retval address of the allocated memory block or NULL in case of no memory available. +* @note MUST REMAIN UNCHANGED: \b osPoolCAlloc shall be consistent in every CMSIS-RTOS. +*/ +void *osPoolCAlloc (osPoolId pool_id) +{ + void *p = osPoolAlloc(pool_id); + + if (p != NULL) + { + memset(p, 0, sizeof(pool_id->pool_sz)); + } + + return p; +} + +/** +* @brief Return an allocated memory block back to a specific memory pool +* @param pool_id memory pool ID obtain referenced with \ref osPoolCreate. +* @param block address of the allocated memory block that is returned to the memory pool. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osPoolFree shall be consistent in every CMSIS-RTOS. +*/ +osStatus osPoolFree (osPoolId pool_id, void *block) +{ + uint32_t index; + + if (pool_id == NULL) { + return osErrorParameter; + } + + if (block == NULL) { + return osErrorParameter; + } + + if (block < pool_id->pool) { + return osErrorParameter; + } + + index = (uint32_t)block - (uint32_t)(pool_id->pool); + if (index % pool_id->item_sz) { + return osErrorParameter; + } + index = index / pool_id->item_sz; + if (index >= pool_id->pool_sz) { + return osErrorParameter; + } + + pool_id->markers[index] = 0; + + return osOK; +} + + +#endif /* Use Memory Pool Management */ + +/******************* Message Queue Management Functions *********************/ + +#if (defined (osFeature_MessageQ) && (osFeature_MessageQ != 0)) /* Use Message Queues */ + +/** +* @brief Create and Initialize a Message Queue +* @param queue_def queue definition referenced with \ref osMessageQ. +* @param thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL. +* @retval message queue ID for reference by other functions or NULL in case of error. +* @note MUST REMAIN UNCHANGED: \b osMessageCreate shall be consistent in every CMSIS-RTOS. +*/ +osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id) +{ + (void) thread_id; + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + if ((queue_def->buffer != NULL) && (queue_def->controlblock != NULL)) { + return xQueueCreateStatic(queue_def->queue_sz, queue_def->item_sz, queue_def->buffer, queue_def->controlblock); + } + else { + return xQueueCreate(queue_def->queue_sz, queue_def->item_sz); + } +#elif ( configSUPPORT_STATIC_ALLOCATION == 1 ) + return xQueueCreateStatic(queue_def->queue_sz, queue_def->item_sz, queue_def->buffer, queue_def->controlblock); +#else + return xQueueCreate(queue_def->queue_sz, queue_def->item_sz); +#endif +} + +/** +* @brief Put a Message to a Queue. +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @param info message information. +* @param millisec timeout value or 0 in case of no time-out. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osMessagePut shall be consistent in every CMSIS-RTOS. +*/ +osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec) +{ + portBASE_TYPE taskWoken = pdFALSE; + TickType_t ticks; + + ticks = millisec / portTICK_PERIOD_MS; + if (ticks == 0) { + ticks = 1; + } + + if (inHandlerMode()) { + if (xQueueSendFromISR(queue_id, &info, &taskWoken) != pdTRUE) { + return osErrorOS; + } + portEND_SWITCHING_ISR(taskWoken); + } + else { + if (xQueueSend(queue_id, &info, ticks) != pdTRUE) { + return osErrorOS; + } + } + + return osOK; +} + +/** +* @brief Get a Message or Wait for a Message from a Queue. +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @param millisec timeout value or 0 in case of no time-out. +* @retval event information that includes status code. +* @note MUST REMAIN UNCHANGED: \b osMessageGet shall be consistent in every CMSIS-RTOS. +*/ +osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec) +{ + portBASE_TYPE taskWoken; + TickType_t ticks; + osEvent event; + + event.def.message_id = queue_id; + event.value.v = 0; + + if (queue_id == NULL) { + event.status = osErrorParameter; + return event; + } + + taskWoken = pdFALSE; + + ticks = 0; + if (millisec == osWaitForever) { + ticks = portMAX_DELAY; + } + else if (millisec != 0) { + ticks = millisec / portTICK_PERIOD_MS; + if (ticks == 0) { + ticks = 1; + } + } + + if (inHandlerMode()) { + if (xQueueReceiveFromISR(queue_id, &event.value.v, &taskWoken) == pdTRUE) { + /* We have mail */ + event.status = osEventMessage; + } + else { + event.status = osOK; + } + portEND_SWITCHING_ISR(taskWoken); + } + else { + if (xQueueReceive(queue_id, &event.value.v, ticks) == pdTRUE) { + /* We have mail */ + event.status = osEventMessage; + } + else { + event.status = (ticks == 0) ? osOK : osEventTimeout; + } + } + + return event; +} + +#endif /* Use Message Queues */ + +/******************** Mail Queue Management Functions ***********************/ +#if (defined (osFeature_MailQ) && (osFeature_MailQ != 0)) /* Use Mail Queues */ + + +typedef struct os_mailQ_cb { + const osMailQDef_t *queue_def; + QueueHandle_t handle; + osPoolId pool; +} os_mailQ_cb_t; + +/** +* @brief Create and Initialize mail queue +* @param queue_def reference to the mail queue definition obtain with \ref osMailQ +* @param thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL. +* @retval mail queue ID for reference by other functions or NULL in case of error. +* @note MUST REMAIN UNCHANGED: \b osMailCreate shall be consistent in every CMSIS-RTOS. +*/ +osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id) +{ +#if (configSUPPORT_DYNAMIC_ALLOCATION == 1) + (void) thread_id; + + osPoolDef_t pool_def = {queue_def->queue_sz, queue_def->item_sz, NULL}; + + /* Create a mail queue control block */ + + *(queue_def->cb) = pvPortMalloc(sizeof(struct os_mailQ_cb)); + + if (*(queue_def->cb) == NULL) { + return NULL; + } + (*(queue_def->cb))->queue_def = queue_def; + + /* Create a queue in FreeRTOS */ + (*(queue_def->cb))->handle = xQueueCreate(queue_def->queue_sz, sizeof(void *)); + + + if ((*(queue_def->cb))->handle == NULL) { + vPortFree(*(queue_def->cb)); + return NULL; + } + + /* Create a mail pool */ + (*(queue_def->cb))->pool = osPoolCreate(&pool_def); + if ((*(queue_def->cb))->pool == NULL) { + //TODO: Delete queue. How to do it in FreeRTOS? + vPortFree(*(queue_def->cb)); + return NULL; + } + + return *(queue_def->cb); +#else + return NULL; +#endif +} + +/** +* @brief Allocate a memory block from a mail +* @param queue_id mail queue ID obtained with \ref osMailCreate. +* @param millisec timeout value or 0 in case of no time-out. +* @retval pointer to memory block that can be filled with mail or NULL in case error. +* @note MUST REMAIN UNCHANGED: \b osMailAlloc shall be consistent in every CMSIS-RTOS. +*/ +void *osMailAlloc (osMailQId queue_id, uint32_t millisec) +{ + (void) millisec; + void *p; + + + if (queue_id == NULL) { + return NULL; + } + + p = osPoolAlloc(queue_id->pool); + + return p; +} + +/** +* @brief Allocate a memory block from a mail and set memory block to zero +* @param queue_id mail queue ID obtained with \ref osMailCreate. +* @param millisec timeout value or 0 in case of no time-out. +* @retval pointer to memory block that can be filled with mail or NULL in case error. +* @note MUST REMAIN UNCHANGED: \b osMailCAlloc shall be consistent in every CMSIS-RTOS. +*/ +void *osMailCAlloc (osMailQId queue_id, uint32_t millisec) +{ + uint32_t i; + void *p = osMailAlloc(queue_id, millisec); + + if (p) { + for (i = 0; i < queue_id->queue_def->item_sz; i++) { + ((uint8_t *)p)[i] = 0; + } + } + + return p; +} + +/** +* @brief Put a mail to a queue +* @param queue_id mail queue ID obtained with \ref osMailCreate. +* @param mail memory block previously allocated with \ref osMailAlloc or \ref osMailCAlloc. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osMailPut shall be consistent in every CMSIS-RTOS. +*/ +osStatus osMailPut (osMailQId queue_id, void *mail) +{ + portBASE_TYPE taskWoken; + + + if (queue_id == NULL) { + return osErrorParameter; + } + + taskWoken = pdFALSE; + + if (inHandlerMode()) { + if (xQueueSendFromISR(queue_id->handle, &mail, &taskWoken) != pdTRUE) { + return osErrorOS; + } + portEND_SWITCHING_ISR(taskWoken); + } + else { + if (xQueueSend(queue_id->handle, &mail, 0) != pdTRUE) { + return osErrorOS; + } + } + + return osOK; +} + +/** +* @brief Get a mail from a queue +* @param queue_id mail queue ID obtained with \ref osMailCreate. +* @param millisec timeout value or 0 in case of no time-out +* @retval event that contains mail information or error code. +* @note MUST REMAIN UNCHANGED: \b osMailGet shall be consistent in every CMSIS-RTOS. +*/ +osEvent osMailGet (osMailQId queue_id, uint32_t millisec) +{ + portBASE_TYPE taskWoken; + TickType_t ticks; + osEvent event; + + event.def.mail_id = queue_id; + + if (queue_id == NULL) { + event.status = osErrorParameter; + return event; + } + + taskWoken = pdFALSE; + + ticks = 0; + if (millisec == osWaitForever) { + ticks = portMAX_DELAY; + } + else if (millisec != 0) { + ticks = millisec / portTICK_PERIOD_MS; + if (ticks == 0) { + ticks = 1; + } + } + + if (inHandlerMode()) { + if (xQueueReceiveFromISR(queue_id->handle, &event.value.p, &taskWoken) == pdTRUE) { + /* We have mail */ + event.status = osEventMail; + } + else { + event.status = osOK; + } + portEND_SWITCHING_ISR(taskWoken); + } + else { + if (xQueueReceive(queue_id->handle, &event.value.p, ticks) == pdTRUE) { + /* We have mail */ + event.status = osEventMail; + } + else { + event.status = (ticks == 0) ? osOK : osEventTimeout; + } + } + + return event; +} + +/** +* @brief Free a memory block from a mail +* @param queue_id mail queue ID obtained with \ref osMailCreate. +* @param mail pointer to the memory block that was obtained with \ref osMailGet. +* @retval status code that indicates the execution status of the function. +* @note MUST REMAIN UNCHANGED: \b osMailFree shall be consistent in every CMSIS-RTOS. +*/ +osStatus osMailFree (osMailQId queue_id, void *mail) +{ + if (queue_id == NULL) { + return osErrorParameter; + } + + return osPoolFree(queue_id->pool, mail); +} +#endif /* Use Mail Queues */ + +/*************************** Additional specific APIs to Free RTOS ************/ +/** +* @brief Handles the tick increment +* @param none. +* @retval none. +*/ +void osSystickHandler(void) +{ + +#if (INCLUDE_xTaskGetSchedulerState == 1 ) + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + { +#endif /* INCLUDE_xTaskGetSchedulerState */ + xPortSysTickHandler(); +#if (INCLUDE_xTaskGetSchedulerState == 1 ) + } +#endif /* INCLUDE_xTaskGetSchedulerState */ +} + +#if ( INCLUDE_eTaskGetState == 1 ) +/** +* @brief Obtain the state of any thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval the stae of the thread, states are encoded by the osThreadState enumerated type. +*/ +osThreadState osThreadGetState(osThreadId thread_id) +{ + eTaskState ThreadState; + osThreadState result; + + ThreadState = eTaskGetState(thread_id); + + switch (ThreadState) + { + case eRunning : + result = osThreadRunning; + break; + case eReady : + result = osThreadReady; + break; + case eBlocked : + result = osThreadBlocked; + break; + case eSuspended : + result = osThreadSuspended; + break; + case eDeleted : + result = osThreadDeleted; + break; + default: + result = osThreadError; + } + + return result; +} +#endif /* INCLUDE_eTaskGetState */ + +#if (INCLUDE_eTaskGetState == 1) +/** +* @brief Check if a thread is already suspended or not. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadIsSuspended(osThreadId thread_id) +{ + if (eTaskGetState(thread_id) == eSuspended) + return osOK; + else + return osErrorOS; +} +#endif /* INCLUDE_eTaskGetState */ +/** +* @brief Suspend execution of a thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadSuspend (osThreadId thread_id) +{ +#if (INCLUDE_vTaskSuspend == 1) + vTaskSuspend(thread_id); + + return osOK; +#else + return osErrorResource; +#endif +} + +/** +* @brief Resume execution of a suspended thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadResume (osThreadId thread_id) +{ +#if (INCLUDE_vTaskSuspend == 1) + if(inHandlerMode()) + { + if (xTaskResumeFromISR(thread_id) == pdTRUE) + { + portYIELD_FROM_ISR(pdTRUE); + } + } + else + { + vTaskResume(thread_id); + } + return osOK; +#else + return osErrorResource; +#endif +} + +/** +* @brief Suspend execution of a all active threads. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadSuspendAll (void) +{ + vTaskSuspendAll(); + + return osOK; +} + +/** +* @brief Resume execution of a all suspended threads. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadResumeAll (void) +{ + if (xTaskResumeAll() == pdTRUE) + return osOK; + else + return osErrorOS; + +} + +/** +* @brief Delay a task until a specified time +* @param PreviousWakeTime Pointer to a variable that holds the time at which the +* task was last unblocked. PreviousWakeTime must be initialised with the current time +* prior to its first use (PreviousWakeTime = osKernelSysTick() ) +* @param millisec time delay value +* @retval status code that indicates the execution status of the function. +*/ +osStatus osDelayUntil (uint32_t *PreviousWakeTime, uint32_t millisec) +{ +#if INCLUDE_vTaskDelayUntil + TickType_t ticks = (millisec / portTICK_PERIOD_MS); + vTaskDelayUntil((TickType_t *) PreviousWakeTime, ticks ? ticks : 1); + + return osOK; +#else + (void) millisec; + (void) PreviousWakeTime; + + return osErrorResource; +#endif +} + +/** +* @brief Abort the delay for a specific thread +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId +* @retval status code that indicates the execution status of the function. +*/ +osStatus osAbortDelay(osThreadId thread_id) +{ +#if INCLUDE_xTaskAbortDelay + + xTaskAbortDelay(thread_id); + + return osOK; +#else + (void) thread_id; + + return osErrorResource; +#endif +} + +/** +* @brief Lists all the current threads, along with their current state +* and stack usage high water mark. +* @param buffer A buffer into which the above mentioned details +* will be written +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadList (uint8_t *buffer) +{ +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) ) + vTaskList((char *)buffer); +#endif + return osOK; +} + +/** +* @brief Receive an item from a queue without removing the item from the queue. +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @param millisec timeout value or 0 in case of no time-out. +* @retval event information that includes status code. +*/ +osEvent osMessagePeek (osMessageQId queue_id, uint32_t millisec) +{ + TickType_t ticks; + osEvent event; + + event.def.message_id = queue_id; + + if (queue_id == NULL) { + event.status = osErrorParameter; + return event; + } + + ticks = 0; + if (millisec == osWaitForever) { + ticks = portMAX_DELAY; + } + else if (millisec != 0) { + ticks = millisec / portTICK_PERIOD_MS; + if (ticks == 0) { + ticks = 1; + } + } + + if (xQueuePeek(queue_id, &event.value.v, ticks) == pdTRUE) + { + /* We have mail */ + event.status = osEventMessage; + } + else + { + event.status = (ticks == 0) ? osOK : osEventTimeout; + } + + return event; +} + +/** +* @brief Get the number of messaged stored in a queue. +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @retval number of messages stored in a queue. +*/ +uint32_t osMessageWaiting(osMessageQId queue_id) +{ + if (inHandlerMode()) { + return uxQueueMessagesWaitingFromISR(queue_id); + } + else + { + return uxQueueMessagesWaiting(queue_id); + } +} + +/** +* @brief Get the available space in a message queue. +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @retval available space in a message queue. +*/ +uint32_t osMessageAvailableSpace(osMessageQId queue_id) +{ + return uxQueueSpacesAvailable(queue_id); +} + +/** +* @brief Delete a Message Queue +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osMessageDelete (osMessageQId queue_id) +{ + if (inHandlerMode()) { + return osErrorISR; + } + + vQueueDelete(queue_id); + + return osOK; +} + +/** +* @brief Create and Initialize a Recursive Mutex +* @param mutex_def mutex definition referenced with \ref osMutex. +* @retval mutex ID for reference by other functions or NULL in case of error.. +*/ +osMutexId osRecursiveMutexCreate (const osMutexDef_t *mutex_def) +{ +#if (configUSE_RECURSIVE_MUTEXES == 1) +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + if (mutex_def->controlblock != NULL){ + return xSemaphoreCreateRecursiveMutexStatic( mutex_def->controlblock ); + } + else { + return xSemaphoreCreateRecursiveMutex(); + } +#elif ( configSUPPORT_STATIC_ALLOCATION == 1 ) + return xSemaphoreCreateRecursiveMutexStatic( mutex_def->controlblock ); +#else + return xSemaphoreCreateRecursiveMutex(); +#endif +#else + return NULL; +#endif +} + +/** +* @brief Release a Recursive Mutex +* @param mutex_id mutex ID obtained by \ref osRecursiveMutexCreate. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osRecursiveMutexRelease (osMutexId mutex_id) +{ +#if (configUSE_RECURSIVE_MUTEXES == 1) + osStatus result = osOK; + + if (xSemaphoreGiveRecursive(mutex_id) != pdTRUE) + { + result = osErrorOS; + } + return result; +#else + return osErrorResource; +#endif +} + +/** +* @brief Release a Recursive Mutex +* @param mutex_id mutex ID obtained by \ref osRecursiveMutexCreate. +* @param millisec timeout value or 0 in case of no time-out. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osRecursiveMutexWait (osMutexId mutex_id, uint32_t millisec) +{ +#if (configUSE_RECURSIVE_MUTEXES == 1) + TickType_t ticks; + + if (mutex_id == NULL) + { + return osErrorParameter; + } + + ticks = 0; + if (millisec == osWaitForever) + { + ticks = portMAX_DELAY; + } + else if (millisec != 0) + { + ticks = millisec / portTICK_PERIOD_MS; + if (ticks == 0) + { + ticks = 1; + } + } + + if (xSemaphoreTakeRecursive(mutex_id, ticks) != pdTRUE) + { + return osErrorOS; + } + return osOK; +#else + return osErrorResource; +#endif +} + +/** +* @brief Returns the current count value of a counting semaphore +* @param semaphore_id semaphore_id ID obtained by \ref osSemaphoreCreate. +* @retval count value +*/ +uint32_t osSemaphoreGetCount(osSemaphoreId semaphore_id) +{ + return uxSemaphoreGetCount(semaphore_id); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h new file mode 100644 index 0000000..f53a132 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h @@ -0,0 +1,1026 @@ +/* ---------------------------------------------------------------------- + * $Date: 5. February 2013 + * $Revision: V1.02 + * + * Project: CMSIS-RTOS API + * Title: cmsis_os.h header file + * + * Version 0.02 + * Initial Proposal Phase + * Version 0.03 + * osKernelStart added, optional feature: main started as thread + * osSemaphores have standard behavior + * osTimerCreate does not start the timer, added osTimerStart + * osThreadPass is renamed to osThreadYield + * Version 1.01 + * Support for C++ interface + * - const attribute removed from the osXxxxDef_t typedef's + * - const attribute added to the osXxxxDef macros + * Added: osTimerDelete, osMutexDelete, osSemaphoreDelete + * Added: osKernelInitialize + * Version 1.02 + * Control functions for short timeouts in microsecond resolution: + * Added: osKernelSysTick, osKernelSysTickFrequency, osKernelSysTickMicroSec + * Removed: osSignalGet + * + * + *---------------------------------------------------------------------------- + * + * Portions Copyright © 2016 STMicroelectronics International N.V. All rights reserved. + * Portions Copyright (c) 2013 ARM LIMITED + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * - Neither the name of ARM 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 COPYRIGHT HOLDERS AND 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. + *---------------------------------------------------------------------------*/ + +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "queue.h" +#include "semphr.h" +#include "event_groups.h" + +/** +\page cmsis_os_h Header File Template: cmsis_os.h + +The file \b cmsis_os.h is a template header file for a CMSIS-RTOS compliant Real-Time Operating System (RTOS). +Each RTOS that is compliant with CMSIS-RTOS shall provide a specific \b cmsis_os.h header file that represents +its implementation. + +The file cmsis_os.h contains: + - CMSIS-RTOS API function definitions + - struct definitions for parameters and return types + - status and priority values used by CMSIS-RTOS API functions + - macros for defining threads and other kernel objects + + +Name conventions and header file modifications + +All definitions are prefixed with \b os to give an unique name space for CMSIS-RTOS functions. +Definitions that are prefixed \b os_ are not used in the application code but local to this header file. +All definitions and functions that belong to a module are grouped and have a common prefix, i.e. \b osThread. + +Definitions that are marked with CAN BE CHANGED can be adapted towards the needs of the actual CMSIS-RTOS implementation. +These definitions can be specific to the underlying RTOS kernel. + +Definitions that are marked with MUST REMAIN UNCHANGED cannot be altered. Otherwise the CMSIS-RTOS implementation is no longer +compliant to the standard. Note that some functions are optional and need not to be provided by every CMSIS-RTOS implementation. + + +Function calls from interrupt service routines + +The following CMSIS-RTOS functions can be called from threads and interrupt service routines (ISR): + - \ref osSignalSet + - \ref osSemaphoreRelease + - \ref osPoolAlloc, \ref osPoolCAlloc, \ref osPoolFree + - \ref osMessagePut, \ref osMessageGet + - \ref osMailAlloc, \ref osMailCAlloc, \ref osMailGet, \ref osMailPut, \ref osMailFree + +Functions that cannot be called from an ISR are verifying the interrupt status and return in case that they are called +from an ISR context the status code \b osErrorISR. In some implementations this condition might be caught using the HARD FAULT vector. + +Some CMSIS-RTOS implementations support CMSIS-RTOS function calls from multiple ISR at the same time. +If this is impossible, the CMSIS-RTOS rejects calls by nested ISR functions with the status code \b osErrorISRRecursive. + + +Define and reference object definitions + +With \#define osObjectsExternal objects are defined as external symbols. This allows to create a consistent header file +that is used throughout a project as shown below: + +Header File +\code +#include // CMSIS RTOS header file + +// Thread definition +extern void thread_sample (void const *argument); // function prototype +osThreadDef (thread_sample, osPriorityBelowNormal, 1, 100); + +// Pool definition +osPoolDef(MyPool, 10, long); +\endcode + + +This header file defines all objects when included in a C/C++ source file. When \#define osObjectsExternal is +present before the header file, the objects are defined as external symbols. A single consistent header file can therefore be +used throughout the whole project. + +Example +\code +#include "osObjects.h" // Definition of the CMSIS-RTOS objects +\endcode + +\code +#define osObjectExternal // Objects will be defined as external symbols +#include "osObjects.h" // Reference to the CMSIS-RTOS objects +\endcode + +*/ + +#ifndef _CMSIS_OS_H +#define _CMSIS_OS_H + +/// \note MUST REMAIN UNCHANGED: \b osCMSIS identifies the CMSIS-RTOS API version. +#define osCMSIS 0x10002 ///< API version (main [31:16] .sub [15:0]) + +/// \note CAN BE CHANGED: \b osCMSIS_KERNEL identifies the underlying RTOS kernel and version number. +#define osCMSIS_KERNEL 0x10000 ///< RTOS identification and version (main [31:16] .sub [15:0]) + +/// \note MUST REMAIN UNCHANGED: \b osKernelSystemId shall be consistent in every CMSIS-RTOS. +#define osKernelSystemId "KERNEL V1.00" ///< RTOS identification string + +/// \note MUST REMAIN UNCHANGED: \b osFeature_xxx shall be consistent in every CMSIS-RTOS. +#define osFeature_MainThread 1 ///< main thread 1=main can be thread, 0=not available +#define osFeature_Pool 1 ///< Memory Pools: 1=available, 0=not available +#define osFeature_MailQ 1 ///< Mail Queues: 1=available, 0=not available +#define osFeature_MessageQ 1 ///< Message Queues: 1=available, 0=not available +#define osFeature_Signals 8 ///< maximum number of Signal Flags available per thread +#define osFeature_Semaphore 1 ///< osFeature_Semaphore function: 1=available, 0=not available +#define osFeature_Wait 0 ///< osWait function: 1=available, 0=not available +#define osFeature_SysTick 1 ///< osKernelSysTick functions: 1=available, 0=not available + +#ifdef __cplusplus +extern "C" +{ +#endif + + +// ==== Enumeration, structures, defines ==== + +/// Priority used for thread control. +/// \note MUST REMAIN UNCHANGED: \b osPriority shall be consistent in every CMSIS-RTOS. +typedef enum { + osPriorityIdle = -3, ///< priority: idle (lowest) + osPriorityLow = -2, ///< priority: low + osPriorityBelowNormal = -1, ///< priority: below normal + osPriorityNormal = 0, ///< priority: normal (default) + osPriorityAboveNormal = +1, ///< priority: above normal + osPriorityHigh = +2, ///< priority: high + osPriorityRealtime = +3, ///< priority: realtime (highest) + osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority +} osPriority; + +/// Timeout value. +/// \note MUST REMAIN UNCHANGED: \b osWaitForever shall be consistent in every CMSIS-RTOS. +#define osWaitForever 0xFFFFFFFF ///< wait forever timeout value + +/// Status code values returned by CMSIS-RTOS functions. +/// \note MUST REMAIN UNCHANGED: \b osStatus shall be consistent in every CMSIS-RTOS. +typedef enum { + osOK = 0, ///< function completed; no error or event occurred. + osEventSignal = 0x08, ///< function completed; signal event occurred. + osEventMessage = 0x10, ///< function completed; message event occurred. + osEventMail = 0x20, ///< function completed; mail event occurred. + osEventTimeout = 0x40, ///< function completed; timeout occurred. + osErrorParameter = 0x80, ///< parameter error: a mandatory parameter was missing or specified an incorrect object. + osErrorResource = 0x81, ///< resource not available: a specified resource was not available. + osErrorTimeoutResource = 0xC1, ///< resource not available within given time: a specified resource was not available within the timeout period. + osErrorISR = 0x82, ///< not allowed in ISR context: the function cannot be called from interrupt service routines. + osErrorISRRecursive = 0x83, ///< function called multiple times from ISR with same object. + osErrorPriority = 0x84, ///< system cannot determine priority or thread has illegal priority. + osErrorNoMemory = 0x85, ///< system is out of memory: it was impossible to allocate or reserve memory for the operation. + osErrorValue = 0x86, ///< value of a parameter is out of range. + osErrorOS = 0xFF, ///< unspecified RTOS error: run-time error but no other error message fits. + os_status_reserved = 0x7FFFFFFF ///< prevent from enum down-size compiler optimization. +} osStatus; + +#if ( INCLUDE_eTaskGetState == 1 ) +/* Thread state returned by osThreadGetState */ +typedef enum { + osThreadRunning = 0x0, /* A thread is querying the state of itself, so must be running. */ + osThreadReady = 0x1 , /* The thread being queried is in a read or pending ready list. */ + osThreadBlocked = 0x2, /* The thread being queried is in the Blocked state. */ + osThreadSuspended = 0x3, /* The thread being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + osThreadDeleted = 0x4, /* The thread being queried has been deleted, but its TCB has not yet been freed. */ + osThreadError = 0x7FFFFFFF +} osThreadState; +#endif /* INCLUDE_eTaskGetState */ + +/// Timer type value for the timer definition. +/// \note MUST REMAIN UNCHANGED: \b os_timer_type shall be consistent in every CMSIS-RTOS. +typedef enum { + osTimerOnce = 0, ///< one-shot timer + osTimerPeriodic = 1 ///< repeating timer +} os_timer_type; + +/// Entry point of a thread. +/// \note MUST REMAIN UNCHANGED: \b os_pthread shall be consistent in every CMSIS-RTOS. +typedef void (*os_pthread) (void const *argument); + +/// Entry point of a timer call back function. +/// \note MUST REMAIN UNCHANGED: \b os_ptimer shall be consistent in every CMSIS-RTOS. +typedef void (*os_ptimer) (void const *argument); + +// >>> the following data type definitions may shall adapted towards a specific RTOS + +/// Thread ID identifies the thread (pointer to a thread control block). +/// \note CAN BE CHANGED: \b os_thread_cb is implementation specific in every CMSIS-RTOS. +typedef TaskHandle_t osThreadId; + +/// Timer ID identifies the timer (pointer to a timer control block). +/// \note CAN BE CHANGED: \b os_timer_cb is implementation specific in every CMSIS-RTOS. +typedef TimerHandle_t osTimerId; + +/// Mutex ID identifies the mutex (pointer to a mutex control block). +/// \note CAN BE CHANGED: \b os_mutex_cb is implementation specific in every CMSIS-RTOS. +typedef SemaphoreHandle_t osMutexId; + +/// Semaphore ID identifies the semaphore (pointer to a semaphore control block). +/// \note CAN BE CHANGED: \b os_semaphore_cb is implementation specific in every CMSIS-RTOS. +typedef SemaphoreHandle_t osSemaphoreId; + +/// Pool ID identifies the memory pool (pointer to a memory pool control block). +/// \note CAN BE CHANGED: \b os_pool_cb is implementation specific in every CMSIS-RTOS. +typedef struct os_pool_cb *osPoolId; + +/// Message ID identifies the message queue (pointer to a message queue control block). +/// \note CAN BE CHANGED: \b os_messageQ_cb is implementation specific in every CMSIS-RTOS. +typedef QueueHandle_t osMessageQId; + +/// Mail ID identifies the mail queue (pointer to a mail queue control block). +/// \note CAN BE CHANGED: \b os_mailQ_cb is implementation specific in every CMSIS-RTOS. +typedef struct os_mailQ_cb *osMailQId; + + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + +typedef StaticTask_t osStaticThreadDef_t; +typedef StaticTimer_t osStaticTimerDef_t; +typedef StaticSemaphore_t osStaticMutexDef_t; +typedef StaticSemaphore_t osStaticSemaphoreDef_t; +typedef StaticQueue_t osStaticMessageQDef_t; + +#endif + + + + +/// Thread Definition structure contains startup information of a thread. +/// \note CAN BE CHANGED: \b os_thread_def is implementation specific in every CMSIS-RTOS. +typedef struct os_thread_def { + char *name; ///< Thread name + os_pthread pthread; ///< start address of thread function + osPriority tpriority; ///< initial thread priority + uint32_t instances; ///< maximum number of instances of that thread function + uint32_t stacksize; ///< stack size requirements in bytes; 0 is default stack size +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + uint32_t *buffer; ///< stack buffer for static allocation; NULL for dynamic allocation + osStaticThreadDef_t *controlblock; ///< control block to hold thread's data for static allocation; NULL for dynamic allocation +#endif +} osThreadDef_t; + +/// Timer Definition structure contains timer parameters. +/// \note CAN BE CHANGED: \b os_timer_def is implementation specific in every CMSIS-RTOS. +typedef struct os_timer_def { + os_ptimer ptimer; ///< start address of a timer function +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + osStaticTimerDef_t *controlblock; ///< control block to hold timer's data for static allocation; NULL for dynamic allocation +#endif +} osTimerDef_t; + +/// Mutex Definition structure contains setup information for a mutex. +/// \note CAN BE CHANGED: \b os_mutex_def is implementation specific in every CMSIS-RTOS. +typedef struct os_mutex_def { + uint32_t dummy; ///< dummy value. +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + osStaticMutexDef_t *controlblock; ///< control block for static allocation; NULL for dynamic allocation +#endif +} osMutexDef_t; + +/// Semaphore Definition structure contains setup information for a semaphore. +/// \note CAN BE CHANGED: \b os_semaphore_def is implementation specific in every CMSIS-RTOS. +typedef struct os_semaphore_def { + uint32_t dummy; ///< dummy value. +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + osStaticSemaphoreDef_t *controlblock; ///< control block for static allocation; NULL for dynamic allocation +#endif +} osSemaphoreDef_t; + +/// Definition structure for memory block allocation. +/// \note CAN BE CHANGED: \b os_pool_def is implementation specific in every CMSIS-RTOS. +typedef struct os_pool_def { + uint32_t pool_sz; ///< number of items (elements) in the pool + uint32_t item_sz; ///< size of an item + void *pool; ///< pointer to memory for pool +} osPoolDef_t; + +/// Definition structure for message queue. +/// \note CAN BE CHANGED: \b os_messageQ_def is implementation specific in every CMSIS-RTOS. +typedef struct os_messageQ_def { + uint32_t queue_sz; ///< number of elements in the queue + uint32_t item_sz; ///< size of an item +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + uint8_t *buffer; ///< buffer for static allocation; NULL for dynamic allocation + osStaticMessageQDef_t *controlblock; ///< control block to hold queue's data for static allocation; NULL for dynamic allocation +#endif + //void *pool; ///< memory array for messages +} osMessageQDef_t; + +/// Definition structure for mail queue. +/// \note CAN BE CHANGED: \b os_mailQ_def is implementation specific in every CMSIS-RTOS. +typedef struct os_mailQ_def { + uint32_t queue_sz; ///< number of elements in the queue + uint32_t item_sz; ///< size of an item + struct os_mailQ_cb **cb; +} osMailQDef_t; + +/// Event structure contains detailed information about an event. +/// \note MUST REMAIN UNCHANGED: \b os_event shall be consistent in every CMSIS-RTOS. +/// However the struct may be extended at the end. +typedef struct { + osStatus status; ///< status code: event or error information + union { + uint32_t v; ///< message as 32-bit value + void *p; ///< message or mail as void pointer + int32_t signals; ///< signal flags + } value; ///< event value + union { + osMailQId mail_id; ///< mail id obtained by \ref osMailCreate + osMessageQId message_id; ///< message id obtained by \ref osMessageCreate + } def; ///< event definition +} osEvent; + + +// ==== Kernel Control Functions ==== + +/// Initialize the RTOS Kernel for creating objects. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osKernelInitialize shall be consistent in every CMSIS-RTOS. +osStatus osKernelInitialize (void); + +/// Start the RTOS Kernel. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osKernelStart shall be consistent in every CMSIS-RTOS. +osStatus osKernelStart (void); + +/// Check if the RTOS kernel is already started. +/// \note MUST REMAIN UNCHANGED: \b osKernelRunning shall be consistent in every CMSIS-RTOS. +/// \return 0 RTOS is not started, 1 RTOS is started. +int32_t osKernelRunning(void); + +#if (defined (osFeature_SysTick) && (osFeature_SysTick != 0)) // System Timer available + +/// Get the RTOS kernel system timer counter +/// \note MUST REMAIN UNCHANGED: \b osKernelSysTick shall be consistent in every CMSIS-RTOS. +/// \return RTOS kernel system timer as 32-bit value +uint32_t osKernelSysTick (void); + +/// The RTOS kernel system timer frequency in Hz +/// \note Reflects the system timer setting and is typically defined in a configuration file. +#define osKernelSysTickFrequency (configTICK_RATE_HZ) + +/// Convert a microseconds value to a RTOS kernel system timer value. +/// \param microsec time value in microseconds. +/// \return time value normalized to the \ref osKernelSysTickFrequency +#define osKernelSysTickMicroSec(microsec) (((uint64_t)microsec * (osKernelSysTickFrequency)) / 1000000) + +#endif // System Timer available + +// ==== Thread Management ==== + +/// Create a Thread Definition with function, priority, and stack requirements. +/// \param name name of the thread function. +/// \param priority initial priority of the thread function. +/// \param instances number of possible thread instances. +/// \param stacksz stack size (in bytes) requirements for the thread function. +/// \note CAN BE CHANGED: The parameters to \b osThreadDef shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#if defined (osObjectsExternal) // object is external +#define osThreadDef(name, thread, priority, instances, stacksz) \ +extern const osThreadDef_t os_thread_def_##name +#else // define the object + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) +#define osThreadDef(name, thread, priority, instances, stacksz) \ +const osThreadDef_t os_thread_def_##name = \ +{ #name, (thread), (priority), (instances), (stacksz), NULL, NULL } + +#define osThreadStaticDef(name, thread, priority, instances, stacksz, buffer, control) \ +const osThreadDef_t os_thread_def_##name = \ +{ #name, (thread), (priority), (instances), (stacksz), (buffer), (control) } +#else //configSUPPORT_STATIC_ALLOCATION == 0 + +#define osThreadDef(name, thread, priority, instances, stacksz) \ +const osThreadDef_t os_thread_def_##name = \ +{ #name, (thread), (priority), (instances), (stacksz)} +#endif +#endif + +/// Access a Thread definition. +/// \param name name of the thread definition object. +/// \note CAN BE CHANGED: The parameter to \b osThread shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#define osThread(name) \ +&os_thread_def_##name + +/// Create a thread and add it to Active Threads and set it to state READY. +/// \param[in] thread_def thread definition referenced with \ref osThread. +/// \param[in] argument pointer that is passed to the thread function as start argument. +/// \return thread ID for reference by other functions or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osThreadCreate shall be consistent in every CMSIS-RTOS. +osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument); + +/// Return the thread ID of the current running thread. +/// \return thread ID for reference by other functions or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osThreadGetId shall be consistent in every CMSIS-RTOS. +osThreadId osThreadGetId (void); + +/// Terminate execution of a thread and remove it from Active Threads. +/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osThreadTerminate shall be consistent in every CMSIS-RTOS. +osStatus osThreadTerminate (osThreadId thread_id); + +/// Pass control to next thread that is in state \b READY. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osThreadYield shall be consistent in every CMSIS-RTOS. +osStatus osThreadYield (void); + +/// Change priority of an active thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +/// \param[in] priority new priority value for the thread function. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osThreadSetPriority shall be consistent in every CMSIS-RTOS. +osStatus osThreadSetPriority (osThreadId thread_id, osPriority priority); + +/// Get current priority of an active thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +/// \return current priority value of the thread function. +/// \note MUST REMAIN UNCHANGED: \b osThreadGetPriority shall be consistent in every CMSIS-RTOS. +osPriority osThreadGetPriority (osThreadId thread_id); + + +// ==== Generic Wait Functions ==== + +/// Wait for Timeout (Time Delay). +/// \param[in] millisec time delay value +/// \return status code that indicates the execution status of the function. +osStatus osDelay (uint32_t millisec); + +#if (defined (osFeature_Wait) && (osFeature_Wait != 0)) // Generic Wait available + +/// Wait for Signal, Message, Mail, or Timeout. +/// \param[in] millisec timeout value or 0 in case of no time-out +/// \return event that contains signal, message, or mail information or error code. +/// \note MUST REMAIN UNCHANGED: \b osWait shall be consistent in every CMSIS-RTOS. +osEvent osWait (uint32_t millisec); + +#endif // Generic Wait available + + +// ==== Timer Management Functions ==== +/// Define a Timer object. +/// \param name name of the timer object. +/// \param function name of the timer call back function. +/// \note CAN BE CHANGED: The parameter to \b osTimerDef shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#if defined (osObjectsExternal) // object is external +#define osTimerDef(name, function) \ +extern const osTimerDef_t os_timer_def_##name +#else // define the object + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) +#define osTimerDef(name, function) \ +const osTimerDef_t os_timer_def_##name = \ +{ (function), NULL } + +#define osTimerStaticDef(name, function, control) \ +const osTimerDef_t os_timer_def_##name = \ +{ (function), (control) } +#else //configSUPPORT_STATIC_ALLOCATION == 0 +#define osTimerDef(name, function) \ +const osTimerDef_t os_timer_def_##name = \ +{ (function) } +#endif +#endif + +/// Access a Timer definition. +/// \param name name of the timer object. +/// \note CAN BE CHANGED: The parameter to \b osTimer shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#define osTimer(name) \ +&os_timer_def_##name + +/// Create a timer. +/// \param[in] timer_def timer object referenced with \ref osTimer. +/// \param[in] type osTimerOnce for one-shot or osTimerPeriodic for periodic behavior. +/// \param[in] argument argument to the timer call back function. +/// \return timer ID for reference by other functions or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osTimerCreate shall be consistent in every CMSIS-RTOS. +osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument); + +/// Start or restart a timer. +/// \param[in] timer_id timer ID obtained by \ref osTimerCreate. +/// \param[in] millisec time delay value of the timer. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osTimerStart shall be consistent in every CMSIS-RTOS. +osStatus osTimerStart (osTimerId timer_id, uint32_t millisec); + +/// Stop the timer. +/// \param[in] timer_id timer ID obtained by \ref osTimerCreate. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osTimerStop shall be consistent in every CMSIS-RTOS. +osStatus osTimerStop (osTimerId timer_id); + +/// Delete a timer that was created by \ref osTimerCreate. +/// \param[in] timer_id timer ID obtained by \ref osTimerCreate. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osTimerDelete shall be consistent in every CMSIS-RTOS. +osStatus osTimerDelete (osTimerId timer_id); + + +// ==== Signal Management ==== + +/// Set the specified Signal Flags of an active thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +/// \param[in] signals specifies the signal flags of the thread that should be set. +/// \return osOK if successful, osErrorOS if failed. +/// \note MUST REMAIN UNCHANGED: \b osSignalSet shall be consistent in every CMSIS-RTOS. +int32_t osSignalSet (osThreadId thread_id, int32_t signals); + +/// Clear the specified Signal Flags of an active thread. +/// \param[in] thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +/// \param[in] signals specifies the signal flags of the thread that shall be cleared. +/// \return previous signal flags of the specified thread or 0x80000000 in case of incorrect parameters. +/// \note MUST REMAIN UNCHANGED: \b osSignalClear shall be consistent in every CMSIS-RTOS. +int32_t osSignalClear (osThreadId thread_id, int32_t signals); + +/// Wait for one or more Signal Flags to become signaled for the current \b RUNNING thread. +/// \param[in] signals wait until all specified signal flags set or 0 for any single signal flag. +/// \param[in] millisec timeout value or 0 in case of no time-out. +/// \return event flag information or error code. +/// \note MUST REMAIN UNCHANGED: \b osSignalWait shall be consistent in every CMSIS-RTOS. +osEvent osSignalWait (int32_t signals, uint32_t millisec); + + +// ==== Mutex Management ==== + +/// Define a Mutex. +/// \param name name of the mutex object. +/// \note CAN BE CHANGED: The parameter to \b osMutexDef shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#if defined (osObjectsExternal) // object is external +#define osMutexDef(name) \ +extern const osMutexDef_t os_mutex_def_##name +#else // define the object + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) +#define osMutexDef(name) \ +const osMutexDef_t os_mutex_def_##name = { 0, NULL } + +#define osMutexStaticDef(name, control) \ +const osMutexDef_t os_mutex_def_##name = { 0, (control) } +#else //configSUPPORT_STATIC_ALLOCATION == 0 +#define osMutexDef(name) \ +const osMutexDef_t os_mutex_def_##name = { 0 } + +#endif + +#endif + +/// Access a Mutex definition. +/// \param name name of the mutex object. +/// \note CAN BE CHANGED: The parameter to \b osMutex shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#define osMutex(name) \ +&os_mutex_def_##name + +/// Create and Initialize a Mutex object. +/// \param[in] mutex_def mutex definition referenced with \ref osMutex. +/// \return mutex ID for reference by other functions or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osMutexCreate shall be consistent in every CMSIS-RTOS. +osMutexId osMutexCreate (const osMutexDef_t *mutex_def); + +/// Wait until a Mutex becomes available. +/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate. +/// \param[in] millisec timeout value or 0 in case of no time-out. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osMutexWait shall be consistent in every CMSIS-RTOS. +osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec); + +/// Release a Mutex that was obtained by \ref osMutexWait. +/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osMutexRelease shall be consistent in every CMSIS-RTOS. +osStatus osMutexRelease (osMutexId mutex_id); + +/// Delete a Mutex that was created by \ref osMutexCreate. +/// \param[in] mutex_id mutex ID obtained by \ref osMutexCreate. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osMutexDelete shall be consistent in every CMSIS-RTOS. +osStatus osMutexDelete (osMutexId mutex_id); + + +// ==== Semaphore Management Functions ==== + +#if (defined (osFeature_Semaphore) && (osFeature_Semaphore != 0)) // Semaphore available + +/// Define a Semaphore object. +/// \param name name of the semaphore object. +/// \note CAN BE CHANGED: The parameter to \b osSemaphoreDef shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#if defined (osObjectsExternal) // object is external +#define osSemaphoreDef(name) \ +extern const osSemaphoreDef_t os_semaphore_def_##name +#else // define the object + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) +#define osSemaphoreDef(name) \ +const osSemaphoreDef_t os_semaphore_def_##name = { 0, NULL } + +#define osSemaphoreStaticDef(name, control) \ +const osSemaphoreDef_t os_semaphore_def_##name = { 0, (control) } + +#else //configSUPPORT_STATIC_ALLOCATION == 0 +#define osSemaphoreDef(name) \ +const osSemaphoreDef_t os_semaphore_def_##name = { 0 } +#endif +#endif + +/// Access a Semaphore definition. +/// \param name name of the semaphore object. +/// \note CAN BE CHANGED: The parameter to \b osSemaphore shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#define osSemaphore(name) \ +&os_semaphore_def_##name + +/// Create and Initialize a Semaphore object used for managing resources. +/// \param[in] semaphore_def semaphore definition referenced with \ref osSemaphore. +/// \param[in] count number of available resources. +/// \return semaphore ID for reference by other functions or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osSemaphoreCreate shall be consistent in every CMSIS-RTOS. +osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count); + +/// Wait until a Semaphore token becomes available. +/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate. +/// \param[in] millisec timeout value or 0 in case of no time-out. +/// \return number of available tokens, or -1 in case of incorrect parameters. +/// \note MUST REMAIN UNCHANGED: \b osSemaphoreWait shall be consistent in every CMSIS-RTOS. +int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec); + +/// Release a Semaphore token. +/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osSemaphoreRelease shall be consistent in every CMSIS-RTOS. +osStatus osSemaphoreRelease (osSemaphoreId semaphore_id); + +/// Delete a Semaphore that was created by \ref osSemaphoreCreate. +/// \param[in] semaphore_id semaphore object referenced with \ref osSemaphoreCreate. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osSemaphoreDelete shall be consistent in every CMSIS-RTOS. +osStatus osSemaphoreDelete (osSemaphoreId semaphore_id); + +#endif // Semaphore available + + +// ==== Memory Pool Management Functions ==== + +#if (defined (osFeature_Pool) && (osFeature_Pool != 0)) // Memory Pool Management available + +/// \brief Define a Memory Pool. +/// \param name name of the memory pool. +/// \param no maximum number of blocks (objects) in the memory pool. +/// \param type data type of a single block (object). +/// \note CAN BE CHANGED: The parameter to \b osPoolDef shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#if defined (osObjectsExternal) // object is external +#define osPoolDef(name, no, type) \ +extern const osPoolDef_t os_pool_def_##name +#else // define the object +#define osPoolDef(name, no, type) \ +const osPoolDef_t os_pool_def_##name = \ +{ (no), sizeof(type), NULL } +#endif + +/// \brief Access a Memory Pool definition. +/// \param name name of the memory pool +/// \note CAN BE CHANGED: The parameter to \b osPool shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#define osPool(name) \ +&os_pool_def_##name + +/// Create and Initialize a memory pool. +/// \param[in] pool_def memory pool definition referenced with \ref osPool. +/// \return memory pool ID for reference by other functions or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osPoolCreate shall be consistent in every CMSIS-RTOS. +osPoolId osPoolCreate (const osPoolDef_t *pool_def); + +/// Allocate a memory block from a memory pool. +/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate. +/// \return address of the allocated memory block or NULL in case of no memory available. +/// \note MUST REMAIN UNCHANGED: \b osPoolAlloc shall be consistent in every CMSIS-RTOS. +void *osPoolAlloc (osPoolId pool_id); + +/// Allocate a memory block from a memory pool and set memory block to zero. +/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate. +/// \return address of the allocated memory block or NULL in case of no memory available. +/// \note MUST REMAIN UNCHANGED: \b osPoolCAlloc shall be consistent in every CMSIS-RTOS. +void *osPoolCAlloc (osPoolId pool_id); + +/// Return an allocated memory block back to a specific memory pool. +/// \param[in] pool_id memory pool ID obtain referenced with \ref osPoolCreate. +/// \param[in] block address of the allocated memory block that is returned to the memory pool. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osPoolFree shall be consistent in every CMSIS-RTOS. +osStatus osPoolFree (osPoolId pool_id, void *block); + +#endif // Memory Pool Management available + + +// ==== Message Queue Management Functions ==== + +#if (defined (osFeature_MessageQ) && (osFeature_MessageQ != 0)) // Message Queues available + +/// \brief Create a Message Queue Definition. +/// \param name name of the queue. +/// \param queue_sz maximum number of messages in the queue. +/// \param type data type of a single message element (for debugger). +/// \note CAN BE CHANGED: The parameter to \b osMessageQDef shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#if defined (osObjectsExternal) // object is external +#define osMessageQDef(name, queue_sz, type) \ +extern const osMessageQDef_t os_messageQ_def_##name +#else // define the object +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) +#define osMessageQDef(name, queue_sz, type) \ +const osMessageQDef_t os_messageQ_def_##name = \ +{ (queue_sz), sizeof (type), NULL, NULL } + +#define osMessageQStaticDef(name, queue_sz, type, buffer, control) \ +const osMessageQDef_t os_messageQ_def_##name = \ +{ (queue_sz), sizeof (type) , (buffer), (control)} +#else //configSUPPORT_STATIC_ALLOCATION == 1 +#define osMessageQDef(name, queue_sz, type) \ +const osMessageQDef_t os_messageQ_def_##name = \ +{ (queue_sz), sizeof (type) } + +#endif +#endif + +/// \brief Access a Message Queue Definition. +/// \param name name of the queue +/// \note CAN BE CHANGED: The parameter to \b osMessageQ shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#define osMessageQ(name) \ +&os_messageQ_def_##name + +/// Create and Initialize a Message Queue. +/// \param[in] queue_def queue definition referenced with \ref osMessageQ. +/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL. +/// \return message queue ID for reference by other functions or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osMessageCreate shall be consistent in every CMSIS-RTOS. +osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id); + +/// Put a Message to a Queue. +/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate. +/// \param[in] info message information. +/// \param[in] millisec timeout value or 0 in case of no time-out. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osMessagePut shall be consistent in every CMSIS-RTOS. +osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec); + +/// Get a Message or Wait for a Message from a Queue. +/// \param[in] queue_id message queue ID obtained with \ref osMessageCreate. +/// \param[in] millisec timeout value or 0 in case of no time-out. +/// \return event information that includes status code. +/// \note MUST REMAIN UNCHANGED: \b osMessageGet shall be consistent in every CMSIS-RTOS. +osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec); + +#endif // Message Queues available + + +// ==== Mail Queue Management Functions ==== + +#if (defined (osFeature_MailQ) && (osFeature_MailQ != 0)) // Mail Queues available + +/// \brief Create a Mail Queue Definition. +/// \param name name of the queue +/// \param queue_sz maximum number of messages in queue +/// \param type data type of a single message element +/// \note CAN BE CHANGED: The parameter to \b osMailQDef shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#if defined (osObjectsExternal) // object is external +#define osMailQDef(name, queue_sz, type) \ +extern struct os_mailQ_cb *os_mailQ_cb_##name \ +extern osMailQDef_t os_mailQ_def_##name +#else // define the object +#define osMailQDef(name, queue_sz, type) \ +struct os_mailQ_cb *os_mailQ_cb_##name; \ +const osMailQDef_t os_mailQ_def_##name = \ +{ (queue_sz), sizeof (type), (&os_mailQ_cb_##name) } +#endif + +/// \brief Access a Mail Queue Definition. +/// \param name name of the queue +/// \note CAN BE CHANGED: The parameter to \b osMailQ shall be consistent but the +/// macro body is implementation specific in every CMSIS-RTOS. +#define osMailQ(name) \ +&os_mailQ_def_##name + +/// Create and Initialize mail queue. +/// \param[in] queue_def reference to the mail queue definition obtain with \ref osMailQ +/// \param[in] thread_id thread ID (obtained by \ref osThreadCreate or \ref osThreadGetId) or NULL. +/// \return mail queue ID for reference by other functions or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osMailCreate shall be consistent in every CMSIS-RTOS. +osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id); + +/// Allocate a memory block from a mail. +/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. +/// \param[in] millisec timeout value or 0 in case of no time-out +/// \return pointer to memory block that can be filled with mail or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osMailAlloc shall be consistent in every CMSIS-RTOS. +void *osMailAlloc (osMailQId queue_id, uint32_t millisec); + +/// Allocate a memory block from a mail and set memory block to zero. +/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. +/// \param[in] millisec timeout value or 0 in case of no time-out +/// \return pointer to memory block that can be filled with mail or NULL in case of error. +/// \note MUST REMAIN UNCHANGED: \b osMailCAlloc shall be consistent in every CMSIS-RTOS. +void *osMailCAlloc (osMailQId queue_id, uint32_t millisec); + +/// Put a mail to a queue. +/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. +/// \param[in] mail memory block previously allocated with \ref osMailAlloc or \ref osMailCAlloc. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osMailPut shall be consistent in every CMSIS-RTOS. +osStatus osMailPut (osMailQId queue_id, void *mail); + +/// Get a mail from a queue. +/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. +/// \param[in] millisec timeout value or 0 in case of no time-out +/// \return event that contains mail information or error code. +/// \note MUST REMAIN UNCHANGED: \b osMailGet shall be consistent in every CMSIS-RTOS. +osEvent osMailGet (osMailQId queue_id, uint32_t millisec); + +/// Free a memory block from a mail. +/// \param[in] queue_id mail queue ID obtained with \ref osMailCreate. +/// \param[in] mail pointer to the memory block that was obtained with \ref osMailGet. +/// \return status code that indicates the execution status of the function. +/// \note MUST REMAIN UNCHANGED: \b osMailFree shall be consistent in every CMSIS-RTOS. +osStatus osMailFree (osMailQId queue_id, void *mail); + +#endif // Mail Queues available + +/*************************** Additional specific APIs to Free RTOS ************/ +/** +* @brief Handles the tick increment +* @param none. +* @retval none. +*/ +void osSystickHandler(void); + +#if ( INCLUDE_eTaskGetState == 1 ) +/** +* @brief Obtain the state of any thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval the stae of the thread, states are encoded by the osThreadState enumerated type. +*/ +osThreadState osThreadGetState(osThreadId thread_id); +#endif /* INCLUDE_eTaskGetState */ + +#if ( INCLUDE_eTaskGetState == 1 ) +/** +* @brief Check if a thread is already suspended or not. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval status code that indicates the execution status of the function. +*/ + +osStatus osThreadIsSuspended(osThreadId thread_id); + +#endif /* INCLUDE_eTaskGetState */ + +/** +* @brief Suspend execution of a thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadSuspend (osThreadId thread_id); + +/** +* @brief Resume execution of a suspended thread. +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadResume (osThreadId thread_id); + +/** +* @brief Suspend execution of a all active threads. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadSuspendAll (void); + +/** +* @brief Resume execution of a all suspended threads. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadResumeAll (void); + +/** +* @brief Delay a task until a specified time +* @param PreviousWakeTime Pointer to a variable that holds the time at which the +* task was last unblocked. PreviousWakeTime must be initialised with the current time +* prior to its first use (PreviousWakeTime = osKernelSysTick() ) +* @param millisec time delay value +* @retval status code that indicates the execution status of the function. +*/ +osStatus osDelayUntil (uint32_t *PreviousWakeTime, uint32_t millisec); + +/** +* @brief Abort the delay for a specific thread +* @param thread_id thread ID obtained by \ref osThreadCreate or \ref osThreadGetId +* @retval status code that indicates the execution status of the function. +*/ +osStatus osAbortDelay(osThreadId thread_id); + +/** +* @brief Lists all the current threads, along with their current state +* and stack usage high water mark. +* @param buffer A buffer into which the above mentioned details +* will be written +* @retval status code that indicates the execution status of the function. +*/ +osStatus osThreadList (uint8_t *buffer); + +/** +* @brief Receive an item from a queue without removing the item from the queue. +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @param millisec timeout value or 0 in case of no time-out. +* @retval event information that includes status code. +*/ +osEvent osMessagePeek (osMessageQId queue_id, uint32_t millisec); + +/** +* @brief Get the number of messaged stored in a queue. +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @retval number of messages stored in a queue. +*/ +uint32_t osMessageWaiting(osMessageQId queue_id); + +/** +* @brief Get the available space in a message queue. +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @retval available space in a message queue. +*/ +uint32_t osMessageAvailableSpace(osMessageQId queue_id); + +/** +* @brief Delete a Message Queue +* @param queue_id message queue ID obtained with \ref osMessageCreate. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osMessageDelete (osMessageQId queue_id); + +/** +* @brief Create and Initialize a Recursive Mutex +* @param mutex_def mutex definition referenced with \ref osMutex. +* @retval mutex ID for reference by other functions or NULL in case of error.. +*/ +osMutexId osRecursiveMutexCreate (const osMutexDef_t *mutex_def); + +/** +* @brief Release a Recursive Mutex +* @param mutex_id mutex ID obtained by \ref osRecursiveMutexCreate. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osRecursiveMutexRelease (osMutexId mutex_id); + +/** +* @brief Release a Recursive Mutex +* @param mutex_id mutex ID obtained by \ref osRecursiveMutexCreate. +* @param millisec timeout value or 0 in case of no time-out. +* @retval status code that indicates the execution status of the function. +*/ +osStatus osRecursiveMutexWait (osMutexId mutex_id, uint32_t millisec); + +/** +* @brief Returns the current count value of a counting semaphore +* @param semaphore_id semaphore_id ID obtained by \ref osSemaphoreCreate. +* @retval count value +*/ +uint32_t osSemaphoreGetCount(osSemaphoreId semaphore_id); + +#ifdef __cplusplus +} +#endif + +#endif // _CMSIS_OS_H diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/LICENSE b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/LICENSE new file mode 100644 index 0000000..2ce4711 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/LICENSE @@ -0,0 +1,18 @@ +Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/croutine.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/croutine.c new file mode 100644 index 0000000..9ce5003 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/croutine.c @@ -0,0 +1,353 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +/* Remove the whole file is co-routines are not being used. */ +#if( configUSE_CO_ROUTINES != 0 ) + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + + +/* Lists for ready and blocked co-routines. --------------------*/ +static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ +static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */ +static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ +static List_t * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ +static List_t * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ +static List_t xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + +/* Other file private variables. --------------------------------*/ +CRCB_t * pxCurrentCoRoutine = NULL; +static UBaseType_t uxTopCoRoutineReadyPriority = 0; +static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + +/* The initial state of the co-routine when it is created. */ +#define corINITIAL_STATE ( 0 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * This macro accesses the co-routine ready lists and therefore must not be + * used from within an ISR. + */ +#define prvAddCoRoutineToReadyQueue( pxCRCB ) \ +{ \ + if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ + } \ + vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ +} + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first co-routine. + */ +static void prvInitialiseCoRoutineLists( void ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * in the pending ready list in order that they can later be moved to the ready + * list by the co-routine scheduler. + */ +static void prvCheckPendingReadyList( void ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * meaning once one co-routine has been found whose timer has not expired + * we need not look any further down the list. + */ +static void prvCheckDelayedList( void ); + +/*-----------------------------------------------------------*/ + +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ) +{ +BaseType_t xReturn; +CRCB_t *pxCoRoutine; + + /* Allocate the memory that will store the co-routine control block. */ + pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* Set the co-routine control block as a link back from the ListItem_t. + This is so we can get back to the containing CRCB from a generic item + in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); + + /* Now the co-routine has been initialised it can be added to the ready + list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ) +{ +TickType_t xTimeToWake; + + /* Calculate the time to wake - this may overflow but this is + not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + overflow list. */ + vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + current block list. */ + vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckPendingReadyList( void ) +{ + /* Are there any co-routines waiting to get moved to the ready list? These + are co-routines that have been readied by an ISR. The ISR cannot access + the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + CRCB_t *pxUnblockedCRCB; + + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); + + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckDelayedList( void ) +{ +CRCB_t *pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + List_t * pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. If there are + any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + section. If this is the case then the generic list item will + have been moved to the pending ready list and the following + line is still valid. Also the pvContainer parameter will have + been set to NULL so the following lines are also valid. */ + ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pxContainer ) + { + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineSchedule( void ) +{ + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); + + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); + + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + --uxTopCoRoutineReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + + return; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseCoRoutineLists( void ) +{ +UBaseType_t uxPriority; + + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } + + vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); + + /* Start with pxDelayedCoRoutineList using list1 and the + pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; +} +/*-----------------------------------------------------------*/ + +BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ) +{ +CRCB_t *pxUnblockedCRCB; +BaseType_t xReturn; + + /* This function is called from within an interrupt. It can only access + event lists and the pending ready list. This function assumes that a + check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} + +#endif /* configUSE_CO_ROUTINES == 0 */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c new file mode 100644 index 0000000..bf4ec24 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c @@ -0,0 +1,753 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "event_groups.h" + +/* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified +because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined +for the header files above, but not in this file, in order to generate the +correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */ + +/* The following bit fields convey control information in a task's event list +item value. It is important they don't clash with the +taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ +#if configUSE_16_BIT_TICKS == 1 + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U + #define eventWAIT_FOR_ALL_BITS 0x0400U + #define eventEVENT_BITS_CONTROL_BYTES 0xff00U +#else + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL + #define eventWAIT_FOR_ALL_BITS 0x04000000UL + #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL +#endif + +typedef struct EventGroupDef_t +{ + EventBits_t uxEventBits; + List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */ + + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupNumber; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */ + #endif +} EventGroup_t; + +/*-----------------------------------------------------------*/ + +/* + * Test the bits set in uxCurrentEventBits to see if the wait condition is met. + * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is + * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor + * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the + * wait condition is met if any of the bits set in uxBitsToWait for are also set + * in uxCurrentEventBits. + */ +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) + { + EventGroup_t *pxEventBits; + + /* A StaticEventGroup_t object must be provided. */ + configASSERT( pxEventGroupBuffer ); + + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticEventGroup_t equals the size of the real + event group structure. */ + volatile size_t xSize = sizeof( StaticEventGroup_t ); + configASSERT( xSize == sizeof( EventGroup_t ) ); + } /*lint !e529 xSize is referenced if configASSERT() is defined. */ + #endif /* configASSERT_DEFINED */ + + /* The user has provided a statically allocated event group - use it. */ + pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */ + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note that + this event group was created statically in case the event group + is later deleted. */ + pxEventBits->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + /* xEventGroupCreateStatic should only ever be called with + pxEventGroupBuffer pointing to a pre-allocated (compile time + allocated) StaticEventGroup_t variable. */ + traceEVENT_GROUP_CREATE_FAILED(); + } + + return pxEventBits; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreate( void ) + { + EventGroup_t *pxEventBits; + + /* Allocate the event group. Justification for MISRA deviation as + follows: pvPortMalloc() always ensures returned memory blocks are + aligned per the requirements of the MCU stack. In this case + pvPortMalloc() must return a pointer that is guaranteed to meet the + alignment requirements of the EventGroup_t structure - which (if you + follow it through) is the alignment requirements of the TickType_t type + (EventBits_t being of TickType_t itself). Therefore, whenever the + stack alignment requirements are greater than or equal to the + TickType_t alignment requirements the cast is safe. In other cases, + where the natural word size of the architecture is less than + sizeof( TickType_t ), the TickType_t variables will be accessed in two + or more reads operations, and the alignment requirements is only that + of each individual read. */ + pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */ + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note this + event group was allocated statically in case the event group is + later deleted. */ + pxEventBits->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); /*lint !e9063 Else branch only exists to allow tracing and does not generate code if trace macros are not defined. */ + } + + return pxEventBits; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) +{ +EventBits_t uxOriginalBitValue, uxReturn; +EventGroup_t *pxEventBits = xEventGroup; +BaseType_t xAlreadyYielded; +BaseType_t xTimeoutOccurred = pdFALSE; + + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + uxOriginalBitValue = pxEventBits->uxEventBits; + + ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); + + if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + /* All the rendezvous bits are now set - no need to block. */ + uxReturn = ( uxOriginalBitValue | uxBitsToSet ); + + /* Rendezvous always clear the bits. They will have been cleared + already unless this is the only task in the rendezvous. */ + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + + xTicksToWait = 0; + } + else + { + if( xTicksToWait != ( TickType_t ) 0 ) + { + traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); + + /* Store the bits that the calling task is waiting for in the + task's event list item so the kernel knows when a match is + found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); + + /* This assignment is obsolete as uxReturn will get set after + the task unblocks, but some compilers mistakenly generate a + warning about uxReturn being returned without being set if the + assignment is omitted. */ + uxReturn = 0; + } + else + { + /* The rendezvous bits were not set, but no block time was + specified - just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + xTimeoutOccurred = pdTRUE; + } + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + point either the required bits were set or the block time expired. If + the required bits were set they will have been stored in the task's + event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + /* The task timed out, just return the current event bit value. */ + taskENTER_CRITICAL(); + { + uxReturn = pxEventBits->uxEventBits; + + /* Although the task got here because it timed out before the + bits it was waiting for were set, it is possible that since it + unblocked another task has set the bits. If this is the case + then it needs to clear the bits before exiting. */ + if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* Control bits might be set as the task had blocked should not be + returned. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); + + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) +{ +EventGroup_t *pxEventBits = xEventGroup; +EventBits_t uxReturn, uxControlBits = 0; +BaseType_t xWaitConditionMet, xAlreadyYielded; +BaseType_t xTimeoutOccurred = pdFALSE; + + /* Check the user is not attempting to wait on the bits used by the kernel + itself, and that at least one bit is being requested. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; + + /* Check to see if the wait condition is already met or not. */ + xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); + + if( xWaitConditionMet != pdFALSE ) + { + /* The wait condition has already been met so there is no need to + block. */ + uxReturn = uxCurrentEventBits; + xTicksToWait = ( TickType_t ) 0; + + /* Clear the wait bits if requested to do so. */ + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The wait condition has not been met, but no block time was + specified, so just return the current value. */ + uxReturn = uxCurrentEventBits; + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task is going to block to wait for its required bits to be + set. uxControlBits are used to remember the specified behaviour of + this call to xEventGroupWaitBits() - for use when the event bits + unblock the task. */ + if( xClearOnExit != pdFALSE ) + { + uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xWaitForAllBits != pdFALSE ) + { + uxControlBits |= eventWAIT_FOR_ALL_BITS; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the bits that the calling task is waiting for in the + task's event list item so the kernel knows when a match is + found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); + + /* This is obsolete as it will get set after the task unblocks, but + some compilers mistakenly generate a warning about the variable + being returned without being set if it is not done. */ + uxReturn = 0; + + traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + point either the required bits were set or the block time expired. If + the required bits were set they will have been stored in the task's + event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + taskENTER_CRITICAL(); + { + /* The task timed out, just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + + /* It is possible that the event bits were updated between this + task leaving the Blocked state and running again. */ + if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) + { + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + xTimeoutOccurred = pdTRUE; + } + taskEXIT_CRITICAL(); + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* The task blocked so control bits may have been set. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) +{ +EventGroup_t *pxEventBits = xEventGroup; +EventBits_t uxReturn; + + /* Check the user is not attempting to clear the bits used by the kernel + itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + taskENTER_CRITICAL(); + { + traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); + + /* The value returned is the event group value prior to the bits being + cleared. */ + uxReturn = pxEventBits->uxEventBits; + + /* Clear the bits. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) +{ +UBaseType_t uxSavedInterruptStatus; +EventGroup_t const * const pxEventBits = xEventGroup; +EventBits_t uxReturn; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + uxReturn = pxEventBits->uxEventBits; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return uxReturn; +} /*lint !e818 EventGroupHandle_t is a typedef used in other functions to so can't be pointer to const. */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) +{ +ListItem_t *pxListItem, *pxNext; +ListItem_t const *pxListEnd; +List_t const * pxList; +EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; +EventGroup_t *pxEventBits = xEventGroup; +BaseType_t xMatchFound = pdFALSE; + + /* Check the user is not attempting to set the bits used by the kernel + itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + pxList = &( pxEventBits->xTasksWaitingForBits ); + pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + vTaskSuspendAll(); + { + traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); + + pxListItem = listGET_HEAD_ENTRY( pxList ); + + /* Set the bits. */ + pxEventBits->uxEventBits |= uxBitsToSet; + + /* See if the new bit value should unblock any tasks. */ + while( pxListItem != pxListEnd ) + { + pxNext = listGET_NEXT( pxListItem ); + uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); + xMatchFound = pdFALSE; + + /* Split the bits waited for from the control bits. */ + uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; + uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; + + if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) + { + /* Just looking for single bit being set. */ + if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) + { + xMatchFound = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) + { + /* All bits are set. */ + xMatchFound = pdTRUE; + } + else + { + /* Need all bits to be set, but not all the bits were set. */ + } + + if( xMatchFound != pdFALSE ) + { + /* The bits match. Should the bits be cleared on exit? */ + if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) + { + uxBitsToClear |= uxBitsWaitedFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the actual event flag value in the task's event list + item before removing the task from the event list. The + eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows + that is was unblocked due to its required bits matching, rather + than because it timed out. */ + vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + /* Move onto the next list item. Note pxListItem->pxNext is not + used here as the list item may have been removed from the event list + and inserted into the ready/pending reading list. */ + pxListItem = pxNext; + } + + /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT + bit was set in the control word. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + ( void ) xTaskResumeAll(); + + return pxEventBits->uxEventBits; +} +/*-----------------------------------------------------------*/ + +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ +EventGroup_t *pxEventBits = xEventGroup; +const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); + + vTaskSuspendAll(); + { + traceEVENT_GROUP_DELETE( xEventGroup ); + + while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) + { + /* Unblock the task, returning 0 as the event list is being deleted + and cannot therefore have any bits set. */ + configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); + vTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The event group can only have been allocated dynamically - free + it again. */ + vPortFree( pxEventBits ); + } + #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The event group could have been allocated statically or + dynamically, so check before attempting to free the memory. */ + if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxEventBits ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + ( void ) xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'set bits' command that was pended from +an interrupt. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) +{ + ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'clear bits' command that was pended from +an interrupt. */ +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) +{ + ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, const EventBits_t uxBitsToWaitFor, const BaseType_t xWaitForAllBits ) +{ +BaseType_t xWaitConditionMet = pdFALSE; + + if( xWaitForAllBits == pdFALSE ) + { + /* Task only has to wait for one bit within uxBitsToWaitFor to be + set. Is one already set? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Task has to wait for all the bits in uxBitsToWaitFor to be set. + Are they set already? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return xWaitConditionMet; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ + + return xReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if (configUSE_TRACE_FACILITY == 1) + + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) + { + UBaseType_t xReturn; + EventGroup_t const *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ + + if( xEventGroup == NULL ) + { + xReturn = 0; + } + else + { + xReturn = pxEventBits->uxEventGroupNumber; + } + + return xReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vEventGroupSetNumber( void * xEventGroup, UBaseType_t uxEventGroupNumber ) + { + ( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h new file mode 100644 index 0000000..ceb469a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h @@ -0,0 +1,1295 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include + +/* + * If stdint.h cannot be located then: + * + If using GCC ensure the -nostdint options is *not* being used. + * + Ensure the project's include path includes the directory in which your + * compiler stores stdint.h. + * + Set any compiler options necessary for it to support C99, as technically + * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any + * other way). + * + The FreeRTOS download includes a simple stdint.h definition that can be + * used in cases where none is provided by the compiler. The files only + * contains the typedefs required to build FreeRTOS. Read the instructions + * in FreeRTOS/source/stdint.readme for more information. + */ +#include /* READ COMMENT ABOVE. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + +/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +/* Required if struct _reent is used. */ +#if ( configUSE_NEWLIB_REENTRANT == 1 ) + #include +#endif +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configMINIMAL_STACK_SIZE + #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. +#endif + +#ifndef configMAX_PRIORITIES + #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#if configMAX_PRIORITIES < 1 + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. +#endif + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_16_BIT_TICKS + #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_CO_ROUTINES + #define configUSE_CO_ROUTINES 0 +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #define INCLUDE_vTaskPrioritySet 0 +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #define INCLUDE_uxTaskPriorityGet 0 +#endif + +#ifndef INCLUDE_vTaskDelete + #define INCLUDE_vTaskDelete 0 +#endif + +#ifndef INCLUDE_vTaskSuspend + #define INCLUDE_vTaskSuspend 0 +#endif + +#ifndef INCLUDE_vTaskDelayUntil + #define INCLUDE_vTaskDelayUntil 0 +#endif + +#ifndef INCLUDE_vTaskDelay + #define INCLUDE_vTaskDelay 0 +#endif + +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 0 +#endif + +#ifndef INCLUDE_xTaskAbortDelay + #define INCLUDE_xTaskAbortDelay 0 +#endif + +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 0 +#endif + +#ifndef INCLUDE_xSemaphoreGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder +#endif + +#ifndef INCLUDE_xTaskGetHandle + #define INCLUDE_xTaskGetHandle 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark2 + #define INCLUDE_uxTaskGetStackHighWaterMark2 0 +#endif + +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 0 +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 0 +#endif + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 0 +#endif + +#if configUSE_CO_ROUTINES != 0 + #ifndef configMAX_CO_ROUTINE_PRIORITIES + #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. + #endif +#endif + +#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK + #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 +#endif + +/* configPRECONDITION should be defined as configASSERT. +The CBMC proofs need a way to track assumptions and assertions. +A configPRECONDITION statement should express an implicit invariant or +assumption made. A configASSERT statement should express an invariant that must +hold explicit before calling the code. */ +#ifndef configPRECONDITION + #define configPRECONDITION( X ) configASSERT(X) + #define configPRECONDITION_DEFINED 0 +#else + #define configPRECONDITION_DEFINED 1 +#endif + +#ifndef portMEMORY_BARRIER + #define portMEMORY_BARRIER() +#endif + +#ifndef portSOFTWARE_BARRIER + #define portSOFTWARE_BARRIER() +#endif + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + +#endif /* configUSE_TIMERS */ + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#endif + +#ifndef portCLEAN_UP_TCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef portPRE_TASK_DELETE_HOOK + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) +#endif + +#ifndef portSETUP_TCB + #define portSETUP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1 ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) + #define pcQueueGetName( xQueue ) +#endif + +#ifndef portPOINTER_SIZE_TYPE + #define portPOINTER_SIZE_TYPE uint32_t +#endif + +/* Remove any unused trace macros. */ +#ifndef traceSTART + /* Used to perform any necessary initialisation - for example, open a file + into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + /* Use to close a trace, for example close a file into which trace has been + written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + /* Called after a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceINCREASE_TICK_COUNT + /* Called before stepping the tick count after waking from tickless idle + sleep. */ + #define traceINCREASE_TICK_COUNT( x ) +#endif + +#ifndef traceLOW_POWER_IDLE_BEGIN + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() +#endif + +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() +#endif + +#ifndef traceTASK_SWITCHED_OUT + /* Called before a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceTASK_PRIORITY_INHERIT + /* Called when a task attempts to take a mutex that is already held by a + lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task + that holds the mutex. uxInheritedPriority is the priority the mutex holder + will inherit (the priority of the task that is attempting to obtain the + muted. */ + #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) +#endif + +#ifndef traceTASK_PRIORITY_DISINHERIT + /* Called when a task releases a mutex, the holding of which had resulted in + the task inheriting the priority of a higher priority task. + pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the + mutex. uxOriginalPriority is the task's configured (base) priority. */ + #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + /* Task is about to block because it cannot read from a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the read was attempted. pxCurrentTCB points to the TCB of the + task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_PEEK + /* Task is about to block because it cannot read from a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the read was attempted. pxCurrentTCB points to the TCB of the + task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + /* Task is about to block because it cannot write to a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the write was attempted. pxCurrentTCB points to the TCB of the + task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +#ifndef configRECORD_STACK_HIGH_ADDRESS + #define configRECORD_STACK_HIGH_ADDRESS 0 +#endif + +#ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H + #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceMOVED_TASK_TO_READY_STATE + #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef tracePOST_MOVED_TASK_TO_READY_STATE + #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED( ucQueueType ) +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FAILED + #define traceQUEUE_PEEK_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL( x ) +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef traceEVENT_GROUP_CREATE + #define traceEVENT_GROUP_CREATE( xEventGroup ) +#endif + +#ifndef traceEVENT_GROUP_CREATE_FAILED + #define traceEVENT_GROUP_CREATE_FAILED() +#endif + +#ifndef traceEVENT_GROUP_SYNC_BLOCK + #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_SYNC_END + #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK + #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_END + #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) xTimeoutOccurred +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_DELETE + #define traceEVENT_GROUP_DELETE( xEventGroup ) +#endif + +#ifndef tracePEND_FUNC_CALL + #define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef tracePEND_FUNC_CALL_FROM_ISR + #define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret) +#endif + +#ifndef traceQUEUE_REGISTRY_ADD + #define traceQUEUE_REGISTRY_ADD(xQueue, pcQueueName) +#endif + +#ifndef traceTASK_NOTIFY_TAKE_BLOCK + #define traceTASK_NOTIFY_TAKE_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_TAKE + #define traceTASK_NOTIFY_TAKE() +#endif + +#ifndef traceTASK_NOTIFY_WAIT_BLOCK + #define traceTASK_NOTIFY_WAIT_BLOCK() +#endif + +#ifndef traceTASK_NOTIFY_WAIT + #define traceTASK_NOTIFY_WAIT() +#endif + +#ifndef traceTASK_NOTIFY + #define traceTASK_NOTIFY() +#endif + +#ifndef traceTASK_NOTIFY_FROM_ISR + #define traceTASK_NOTIFY_FROM_ISR() +#endif + +#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR + #define traceTASK_NOTIFY_GIVE_FROM_ISR() +#endif + +#ifndef traceSTREAM_BUFFER_CREATE_FAILED + #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED + #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE + #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_DELETE + #define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RESET + #define traceSTREAM_BUFFER_RESET( xStreamBuffer ) +#endif + +#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND + #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND + #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND_FAILED + #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND_FROM_ISR + #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent ) +#endif + +#ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE + #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE + #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE_FAILED + #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR + #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef portSUPPRESS_TICKS_AND_SLEEP + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) +#endif + +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 +#endif + +#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 + #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 +#endif + +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 +#endif + +#ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING + #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPRE_SLEEP_PROCESSING + #define configPRE_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPOST_SLEEP_PROCESSING + #define configPOST_SLEEP_PROCESSING( x ) +#endif + +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 0 +#endif + +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef portALLOCATE_SECURE_CONTEXT + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) +#endif + +#ifndef portDONT_DISCARD + #define portDONT_DISCARD +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 0 +#endif + +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +#ifndef mtCOVERAGE_TEST_DELAY + #define mtCOVERAGE_TEST_DELAY() +#endif + +#ifndef portASSERT_IF_IN_ISR + #define portASSERT_IF_IN_ISR() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +#ifndef configAPPLICATION_ALLOCATED_HEAP + #define configAPPLICATION_ALLOCATED_HEAP 0 +#endif + +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif + +#ifndef configUSE_POSIX_ERRNO + #define configUSE_POSIX_ERRNO 0 +#endif + +#ifndef portTICK_TYPE_IS_ATOMIC + #define portTICK_TYPE_IS_ATOMIC 0 +#endif + +#ifndef configSUPPORT_STATIC_ALLOCATION + /* Defaults to 0 for backward compatibility. */ + #define configSUPPORT_STATIC_ALLOCATION 0 +#endif + +#ifndef configSUPPORT_DYNAMIC_ALLOCATION + /* Defaults to 1 for backward compatibility. */ + #define configSUPPORT_DYNAMIC_ALLOCATION 1 +#endif + +#ifndef configSTACK_DEPTH_TYPE + /* Defaults to uint16_t for backward compatibility, but can be overridden + in FreeRTOSConfig.h if uint16_t is too restrictive. */ + #define configSTACK_DEPTH_TYPE uint16_t +#endif + +#ifndef configMESSAGE_BUFFER_LENGTH_TYPE + /* Defaults to size_t for backward compatibility, but can be overridden + in FreeRTOSConfig.h if lengths will always be less than the number of bytes + in a size_t. */ + #define configMESSAGE_BUFFER_LENGTH_TYPE size_t +#endif + +/* Sanity check the configuration. */ +#if( configUSE_TICKLESS_IDLE != 0 ) + #if( INCLUDE_vTaskSuspend != 1 ) + #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 + #endif /* INCLUDE_vTaskSuspend */ +#endif /* configUSE_TICKLESS_IDLE */ + +#if( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. +#endif + +#if( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) + #error configUSE_MUTEXES must be set to 1 to use recursive mutexes +#endif + +#ifndef configINITIAL_TICK_COUNT + #define configINITIAL_TICK_COUNT 0 +#endif + +#if( portTICK_TYPE_IS_ATOMIC == 0 ) + /* Either variables of tick type cannot be read atomically, or + portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when + the tick count is returned to the standard critical section macros. */ + #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) +#else + /* The tick type can be read atomically, so critical sections used when the + tick count is returned can be defined away. */ + #define portTICK_TYPE_ENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) x +#endif + +/* Definitions to allow backward compatibility with FreeRTOS versions prior to +V8 if desired. */ +#ifndef configENABLE_BACKWARD_COMPATIBILITY + #define configENABLE_BACKWARD_COMPATIBILITY 1 +#endif + +#ifndef configPRINTF + /* configPRINTF() was not defined, so define it away to nothing. To use + configPRINTF() then define it as follows (where MyPrintFunction() is + provided by the application writer): + + void MyPrintFunction(const char *pcFormat, ... ); + #define configPRINTF( X ) MyPrintFunction X + + Then call like a standard printf() function, but placing brackets around + all parameters so they are passed as a single parameter. For example: + configPRINTF( ("Value = %d", MyVariable) ); */ + #define configPRINTF( X ) +#endif + +#ifndef configMAX + /* The application writer has not provided their own MAX macro, so define + the following generic implementation. */ + #define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#endif + +#ifndef configMIN + /* The application writer has not provided their own MAX macro, so define + the following generic implementation. */ + #define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) +#endif + +#if configENABLE_BACKWARD_COMPATIBILITY == 1 + #define eTaskStateGet eTaskGetState + #define portTickType TickType_t + #define xTaskHandle TaskHandle_t + #define xQueueHandle QueueHandle_t + #define xSemaphoreHandle SemaphoreHandle_t + #define xQueueSetHandle QueueSetHandle_t + #define xQueueSetMemberHandle QueueSetMemberHandle_t + #define xTimeOutType TimeOut_t + #define xMemoryRegion MemoryRegion_t + #define xTaskParameters TaskParameters_t + #define xTaskStatusType TaskStatus_t + #define xTimerHandle TimerHandle_t + #define xCoRoutineHandle CoRoutineHandle_t + #define pdTASK_HOOK_CODE TaskHookFunction_t + #define portTICK_RATE_MS portTICK_PERIOD_MS + #define pcTaskGetTaskName pcTaskGetName + #define pcTimerGetTimerName pcTimerGetName + #define pcQueueGetQueueName pcQueueGetName + #define vTaskGetTaskInfo vTaskGetInfo + #define xTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter + + /* Backward compatibility within the scheduler code only - these definitions + are not really required but are included for completeness. */ + #define tmrTIMER_CALLBACK TimerCallbackFunction_t + #define pdTASK_CODE TaskFunction_t + #define xListItem ListItem_t + #define xList List_t + + /* For libraries that break the list data hiding, and access list structure + members directly (which is not supposed to be done). */ + #define pxContainer pvContainer +#endif /* configENABLE_BACKWARD_COMPATIBILITY */ + +#if( configUSE_ALTERNATIVE_API != 0 ) + #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 +#endif + +/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even +if floating point hardware is otherwise supported by the FreeRTOS port in use. +This constant is not supported by all FreeRTOS ports that include floating +point support. */ +#ifndef configUSE_TASK_FPU_SUPPORT + #define configUSE_TASK_FPU_SUPPORT 1 +#endif + +/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is +currently used in ARMv8M ports. */ +#ifndef configENABLE_MPU + #define configENABLE_MPU 0 +#endif + +/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is +currently used in ARMv8M ports. */ +#ifndef configENABLE_FPU + #define configENABLE_FPU 1 +#endif + +/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it. +This is currently used in ARMv8M ports. */ +#ifndef configENABLE_TRUSTZONE + #define configENABLE_TRUSTZONE 1 +#endif + +/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on +the Secure Side only. */ +#ifndef configRUN_FREERTOS_SECURE_ONLY + #define configRUN_FREERTOS_SECURE_ONLY 0 +#endif + +/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using + * dynamically allocated RAM, in which case when any task is deleted it is known + * that both the task's stack and TCB need to be freed. Sometimes the + * FreeRTOSConfig.h settings only allow a task to be created using statically + * allocated RAM, in which case when any task is deleted it is known that neither + * the task's stack or TCB should be freed. Sometimes the FreeRTOSConfig.h + * settings allow a task to be created using either statically or dynamically + * allocated RAM, in which case a member of the TCB is used to record whether the + * stack and/or TCB were allocated statically or dynamically, so when a task is + * deleted the RAM that was allocated dynamically is freed again and no attempt is + * made to free the RAM that was allocated statically. + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a + * task to be created using either statically or dynamically allocated RAM. Note + * that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with + * a statically allocated stack and a dynamically allocated TCB. + * + * The following table lists various combinations of portUSING_MPU_WRAPPERS, + * configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and + * when it is possible to have both static and dynamic allocation: + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + * | MPU | Dynamic | Static | Available Functions | Possible Allocations | Both Dynamic and | Need Free | + * | | | | | | Static Possible | | + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + * | 0 | 0 | 1 | xTaskCreateStatic | TCB - Static, Stack - Static | No | No | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 0 | 1 | 0 | xTaskCreate | TCB - Dynamic, Stack - Dynamic | No | Yes | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 0 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateStatic | 2. TCB - Static, Stack - Static | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 0 | 1 | xTaskCreateStatic, | TCB - Static, Stack - Static | No | No | + * | | | | xTaskCreateRestrictedStatic | | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 1 | 0 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateRestricted | 2. TCB - Dynamic, Stack - Static | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateStatic, | 2. TCB - Dynamic, Stack - Static | | | + * | | | | xTaskCreateRestricted, | 3. TCB - Static, Stack - Static | | | + * | | | | xTaskCreateRestrictedStatic | | | | + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + */ +#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \ + ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) ) + +/* + * In line with software engineering best practice, FreeRTOS implements a strict + * data hiding policy, so the real structures used by FreeRTOS to maintain the + * state of tasks, queues, semaphores, etc. are not accessible to the application + * code. However, if the application writer wants to statically allocate such + * an object then the size of the object needs to be know. Dummy structures + * that are guaranteed to have the same size and alignment requirements of the + * real objects are used for this purpose. The dummy list and list item + * structures below are used for inclusion in such a dummy structure. + */ +struct xSTATIC_LIST_ITEM +{ + #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void *pvDummy3[ 4 ]; + #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy4; + #endif +}; +typedef struct xSTATIC_LIST_ITEM StaticListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +struct xSTATIC_MINI_LIST_ITEM +{ + #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void *pvDummy3[ 2 ]; +}; +typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +typedef struct xSTATIC_LIST +{ + #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + UBaseType_t uxDummy2; + void *pvDummy3; + StaticMiniListItem_t xDummy4; + #if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy5; + #endif +} StaticList_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Task structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a task then + * the size of the task object needs to be know. The StaticTask_t structure + * below is provided for this purpose. Its sizes and alignment requirements are + * guaranteed to match those of the genuine structure, no matter which + * architecture is being used, and no matter how the values in FreeRTOSConfig.h + * are set. Its contents are somewhat obfuscated in the hope users will + * recognise that it would be unwise to make direct use of the structure members. + */ +typedef struct xSTATIC_TCB +{ + void *pxDummy1; + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xDummy2; + #endif + StaticListItem_t xDummy3[ 2 ]; + UBaseType_t uxDummy5; + void *pxDummy6; + uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + void *pxDummy8; + #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxDummy9; + #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy10[ 2 ]; + #endif + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxDummy12[ 2 ]; + #endif + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void *pxDummy14; + #endif + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void *pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulDummy16; + #endif + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + struct _reent xDummy17; + #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t ulDummy18; + uint8_t ucDummy19; + #endif + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + uint8_t uxDummy20; + #endif + + #if( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDummy21; + #endif + #if ( configUSE_POSIX_ERRNO == 1 ) + int iDummy22; + #endif +} StaticTask_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Queue structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a queue + * then the size of the queue object needs to be know. The StaticQueue_t + * structure below is provided for this purpose. Its sizes and alignment + * requirements are guaranteed to match those of the genuine structure, no + * matter which architecture is being used, and no matter how the values in + * FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in the hope + * users will recognise that it would be unwise to make direct use of the + * structure members. + */ +typedef struct xSTATIC_QUEUE +{ + void *pvDummy1[ 3 ]; + + union + { + void *pvDummy2; + UBaseType_t uxDummy2; + } u; + + StaticList_t xDummy3[ 2 ]; + UBaseType_t uxDummy4[ 3 ]; + uint8_t ucDummy5[ 2 ]; + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy6; + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + void *pvDummy7; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy8; + uint8_t ucDummy9; + #endif + +} StaticQueue_t; +typedef StaticQueue_t StaticSemaphore_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the event group structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create an event group then the size of the event group object needs to be + * know. The StaticEventGroup_t structure below is provided for this purpose. + * Its sizes and alignment requirements are guaranteed to match those of the + * genuine structure, no matter which architecture is being used, and no matter + * how the values in FreeRTOSConfig.h are set. Its contents are somewhat + * obfuscated in the hope users will recognise that it would be unwise to make + * direct use of the structure members. + */ +typedef struct xSTATIC_EVENT_GROUP +{ + TickType_t xDummy1; + StaticList_t xDummy2; + + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy3; + #endif + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy4; + #endif + +} StaticEventGroup_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the software timer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a software timer then the size of the queue object needs to be know. + * The StaticTimer_t structure below is provided for this purpose. Its sizes + * and alignment requirements are guaranteed to match those of the genuine + * structure, no matter which architecture is being used, and no matter how the + * values in FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in + * the hope users will recognise that it would be unwise to make direct use of + * the structure members. + */ +typedef struct xSTATIC_TIMER +{ + void *pvDummy1; + StaticListItem_t xDummy2; + TickType_t xDummy3; + void *pvDummy5; + TaskFunction_t pvDummy6; + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy7; + #endif + uint8_t ucDummy8; + +} StaticTimer_t; + +/* +* In line with software engineering best practice, especially when supplying a +* library that is likely to change in future versions, FreeRTOS implements a +* strict data hiding policy. This means the stream buffer structure used +* internally by FreeRTOS is not accessible to application code. However, if +* the application writer wants to statically allocate the memory required to +* create a stream buffer then the size of the stream buffer object needs to be +* know. The StaticStreamBuffer_t structure below is provided for this purpose. +* Its size and alignment requirements are guaranteed to match those of the +* genuine structure, no matter which architecture is being used, and no matter +* how the values in FreeRTOSConfig.h are set. Its contents are somewhat +* obfuscated in the hope users will recognise that it would be unwise to make +* direct use of the structure members. +*/ +typedef struct xSTATIC_STREAM_BUFFER +{ + size_t uxDummy1[ 4 ]; + void * pvDummy2[ 3 ]; + uint8_t ucDummy3; + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy4; + #endif +} StaticStreamBuffer_t; + +/* Message buffers are built on stream buffers. */ +typedef StaticStreamBuffer_t StaticMessageBuffer_t; + +#ifdef __cplusplus +} +#endif + +#endif /* INC_FREERTOS_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h new file mode 100644 index 0000000..5643991 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h @@ -0,0 +1,133 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +#ifndef _MSC_VER /* Visual Studio doesn't support #warning. */ + #warning The name of this file has changed to stack_macros.h. Please update your code accordingly. This source file (which has the original name) will be removed in future released. +#endif + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ + const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ + \ + if( ( pulStack[ 0 ] != ulCheckValue ) || \ + ( pulStack[ 1 ] != ulCheckValue ) || \ + ( pulStack[ 2 ] != ulCheckValue ) || \ + ( pulStack[ 3 ] != ulCheckValue ) ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ + static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +/* Remove stack overflow macro if not being used. */ +#ifndef taskCHECK_FOR_STACK_OVERFLOW + #define taskCHECK_FOR_STACK_OVERFLOW() +#endif + + + +#endif /* STACK_MACROS_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h new file mode 100644 index 0000000..ceca696 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h @@ -0,0 +1,414 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/** + * @file atomic.h + * @brief FreeRTOS atomic operation support. + * + * This file implements atomic functions by disabling interrupts globally. + * Implementations with architecture specific atomic instructions can be + * provided under each compiler directory. + */ + +#ifndef ATOMIC_H +#define ATOMIC_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include atomic.h" +#endif + +/* Standard includes. */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Port specific definitions -- entering/exiting critical section. + * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h + * + * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with + * ATOMIC_ENTER_CRITICAL(). + * + */ +#if defined( portSET_INTERRUPT_MASK_FROM_ISR ) + + /* Nested interrupt scheme is supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() \ + UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR() + + #define ATOMIC_EXIT_CRITICAL() \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType ) + +#else + + /* Nested interrupt scheme is NOT supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() portENTER_CRITICAL() + #define ATOMIC_EXIT_CRITICAL() portEXIT_CRITICAL() + +#endif /* portSET_INTERRUPT_MASK_FROM_ISR() */ + +/* + * Port specific definition -- "always inline". + * Inline is compiler specific, and may not always get inlined depending on your + * optimization level. Also, inline is considered as performance optimization + * for atomic. Thus, if portFORCE_INLINE is not provided by portmacro.h, + * instead of resulting error, simply define it away. + */ +#ifndef portFORCE_INLINE + #define portFORCE_INLINE +#endif + +#define ATOMIC_COMPARE_AND_SWAP_SUCCESS 0x1U /**< Compare and swap succeeded, swapped. */ +#define ATOMIC_COMPARE_AND_SWAP_FAILURE 0x0U /**< Compare and swap failed, did not swap. */ + +/*----------------------------- Swap && CAS ------------------------------*/ + +/** + * Atomic compare-and-swap + * + * @brief Performs an atomic compare-and-swap operation on the specified values. + * + * @param[in, out] pulDestination Pointer to memory location from where value is + * to be loaded and checked. + * @param[in] ulExchange If condition meets, write this value to memory. + * @param[in] ulComparand Swap condition. + * + * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. + * + * @note This function only swaps *pulDestination with ulExchange, if previous + * *pulDestination value equals ulComparand. + */ +static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination, + uint32_t ulExchange, + uint32_t ulComparand ) +{ +uint32_t ulReturnValue; + + ATOMIC_ENTER_CRITICAL(); + { + if( *pulDestination == ulComparand ) + { + *pulDestination = ulExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } + else + { + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + } + } + ATOMIC_EXIT_CRITICAL(); + + return ulReturnValue; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic swap (pointers) + * + * @brief Atomically sets the address pointed to by *ppvDestination to the value + * of *pvExchange. + * + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and written back to. + * @param[in] pvExchange Pointer value to be written to *ppvDestination. + * + * @return The initial value of *ppvDestination. + */ +static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange ) +{ +void * pReturnValue; + + ATOMIC_ENTER_CRITICAL(); + { + pReturnValue = *ppvDestination; + *ppvDestination = pvExchange; + } + ATOMIC_EXIT_CRITICAL(); + + return pReturnValue; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic compare-and-swap (pointers) + * + * @brief Performs an atomic compare-and-swap operation on the specified pointer + * values. + * + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and checked. + * @param[in] pvExchange If condition meets, write this value to memory. + * @param[in] pvComparand Swap condition. + * + * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. + * + * @note This function only swaps *ppvDestination with pvExchange, if previous + * *ppvDestination value equals pvComparand. + */ +static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange, + void * pvComparand ) +{ +uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + + ATOMIC_ENTER_CRITICAL(); + { + if( *ppvDestination == pvComparand ) + { + *ppvDestination = pvExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } + } + ATOMIC_EXIT_CRITICAL(); + + return ulReturnValue; +} + + +/*----------------------------- Arithmetic ------------------------------*/ + +/** + * Atomic add + * + * @brief Atomically adds count to the value of the specified pointer points to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * @param[in] ulCount Value to be added to *pulAddend. + * + * @return previous *pulAddend value. + */ +static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend += ulCount; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic subtract + * + * @brief Atomically subtracts count from the value of the specified pointer + * pointers to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * @param[in] ulCount Value to be subtract from *pulAddend. + * + * @return previous *pulAddend value. + */ +static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend -= ulCount; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic increment + * + * @brief Atomically increments the value of the specified pointer points to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * + * @return *pulAddend value before increment. + */ +static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend ) +{ +uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend += 1; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic decrement + * + * @brief Atomically decrements the value of the specified pointer points to + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * + * @return *pulAddend value before decrement. + */ +static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend ) +{ +uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend -= 1; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} + +/*----------------------------- Bitwise Logical ------------------------------*/ + +/** + * Atomic OR + * + * @brief Performs an atomic OR operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be ORed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ +uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination |= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic AND + * + * @brief Performs an atomic AND operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be ANDed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ +uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination &= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic NAND + * + * @brief Performs an atomic NAND operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be NANDed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ +uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination = ~( ulCurrent & ulValue ); + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic XOR + * + * @brief Performs an atomic XOR operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be XORed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ +uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination ^= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} + +#ifdef __cplusplus +} +#endif + +#endif /* ATOMIC_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h new file mode 100644 index 0000000..8d7069c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h @@ -0,0 +1,720 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Used to hide the implementation of the co-routine control block. The +control block structure however has to be included in the header due to +the macro implementation of the co-routine functionality. */ +typedef void * CoRoutineHandle_t; + +/* Defines the prototype to which co-routine functions must conform. */ +typedef void (*crCOROUTINE_CODE)( CoRoutineHandle_t, UBaseType_t ); + +typedef struct corCoRoutineControlBlock +{ + crCOROUTINE_CODE pxCoRoutineFunction; + ListItem_t xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + ListItem_t xEventListItem; /*< List item used to place the CRCB in event lists. */ + UBaseType_t uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + UBaseType_t uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + uint16_t uxState; /*< Used internally by the co-routine implementation. */ +} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ + +/** + * croutine. h + *

    + BaseType_t xCoRoutineCreate(
    +                                 crCOROUTINE_CODE pxCoRoutineCode,
    +                                 UBaseType_t uxPriority,
    +                                 UBaseType_t uxIndex
    +                               );
    + * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * list, otherwise an error code defined with ProjDefs.h. + * + * Example usage: +
    + // Co-routine to be created.
    + void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + // This may not be necessary for const variables.
    + static const char cLedToFlash[ 2 ] = { 5, 6 };
    + static const TickType_t uxFlashRates[ 2 ] = { 200, 400 };
    +
    +     // Must start every co-routine with a call to crSTART();
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +         // This co-routine just delays for a fixed period, then toggles
    +         // an LED.  Two co-routines are created using this function, so
    +         // the uxIndex parameter is used to tell the co-routine which
    +         // LED to flash and how int32_t to delay.  This assumes xQueue has
    +         // already been created.
    +         vParTestToggleLED( cLedToFlash[ uxIndex ] );
    +         crDELAY( xHandle, uxFlashRates[ uxIndex ] );
    +     }
    +
    +     // Must end every co-routine with a call to crEND();
    +     crEND();
    + }
    +
    + // Function that creates two co-routines.
    + void vOtherFunction( void )
    + {
    + uint8_t ucParameterToPass;
    + TaskHandle_t xHandle;
    +
    +     // Create two co-routines at priority 0.  The first is given index 0
    +     // so (from the code above) toggles LED 5 every 200 ticks.  The second
    +     // is given index 1 so toggles LED 6 every 400 ticks.
    +     for( uxIndex = 0; uxIndex < 2; uxIndex++ )
    +     {
    +         xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
    +     }
    + }
    +   
    + * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex ); + + +/** + * croutine. h + *
    + void vCoRoutineSchedule( void );
    + * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * hook). + * + * Example usage: +
    + // This idle task hook will schedule a co-routine each time it is called.
    + // The rest of the idle task will execute between co-routine calls.
    + void vApplicationIdleHook( void )
    + {
    +	vCoRoutineSchedule();
    + }
    +
    + // Alternatively, if you do not require any other part of the idle task to
    + // execute, the idle task hook can call vCoRoutineSchedule() within an
    + // infinite loop.
    + void vApplicationIdleHook( void )
    + {
    +    for( ;; )
    +    {
    +        vCoRoutineSchedule();
    +    }
    + }
    + 
    + * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + *
    + crSTART( CoRoutineHandle_t xHandle );
    + * + * This macro MUST always be called at the start of a co-routine function. + * + * Example usage: +
    + // Co-routine to be created.
    + void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + static int32_t ulAVariable;
    +
    +     // Must start every co-routine with a call to crSTART();
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +          // Co-routine functionality goes here.
    +     }
    +
    +     // Must end every co-routine with a call to crEND();
    +     crEND();
    + }
    + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) switch( ( ( CRCB_t * )( pxCRCB ) )->uxState ) { case 0: + +/** + * croutine. h + *
    + crEND();
    + * + * This macro MUST always be called at the end of a co-routine function. + * + * Example usage: +
    + // Co-routine to be created.
    + void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + static int32_t ulAVariable;
    +
    +     // Must start every co-routine with a call to crSTART();
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +          // Co-routine functionality goes here.
    +     }
    +
    +     // Must end every co-routine with a call to crEND();
    +     crEND();
    + }
    + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crEND() } + +/* + * These macros are intended for internal use by the co-routine implementation + * only. The macros should not be used directly by application writers. + */ +#define crSET_STATE0( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): +#define crSET_STATE1( xHandle ) ( ( CRCB_t * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): + +/** + * croutine. h + *
    + crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );
    + * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_PERIOD_MS + * can be used to convert ticks to milliseconds. + * + * Example usage: +
    + // Co-routine to be created.
    + void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + // This may not be necessary for const variables.
    + // We are to delay for 200ms.
    + static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS;
    +
    +     // Must start every co-routine with a call to crSTART();
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +        // Delay for 200ms.
    +        crDELAY( xHandle, xDelayTime );
    +
    +        // Do something here.
    +     }
    +
    +     // Must end every co-routine with a call to crEND();
    +     crEND();
    + }
    + * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); + +/** + *
    + crQUEUE_SEND(
    +                  CoRoutineHandle_t xHandle,
    +                  QueueHandle_t pxQueue,
    +                  void *pvItemToQueue,
    +                  TickType_t xTicksToWait,
    +                  BaseType_t *pxResult
    +             )
    + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * error defined within ProjDefs.h. + * + * Example usage: +
    + // Co-routine function that blocks for a fixed period then posts a number onto
    + // a queue.
    + static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + static BaseType_t xNumberToPost = 0;
    + static BaseType_t xResult;
    +
    +    // Co-routines must begin with a call to crSTART().
    +    crSTART( xHandle );
    +
    +    for( ;; )
    +    {
    +        // This assumes the queue has already been created.
    +        crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
    +
    +        if( xResult != pdPASS )
    +        {
    +            // The message was not posted!
    +        }
    +
    +        // Increment the number to be posted onto the queue.
    +        xNumberToPost++;
    +
    +        // Delay for 100 ticks.
    +        crDELAY( xHandle, 100 );
    +    }
    +
    +    // Co-routines must end with a call to crEND().
    +    crEND();
    + }
    + * \defgroup crQUEUE_SEND crQUEUE_SEND + * \ingroup Tasks + */ +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ +} + +/** + * croutine. h + *
    +  crQUEUE_RECEIVE(
    +                     CoRoutineHandle_t xHandle,
    +                     QueueHandle_t pxQueue,
    +                     void *pvBuffer,
    +                     TickType_t xTicksToWait,
    +                     BaseType_t *pxResult
    +                 )
    + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * an error code as defined within ProjDefs.h. + * + * Example usage: +
    + // A co-routine receives the number of an LED to flash from a queue.  It
    + // blocks on the queue until the number is received.
    + static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // Variables in co-routines must be declared static if they must maintain value across a blocking call.
    + static BaseType_t xResult;
    + static UBaseType_t uxLEDToFlash;
    +
    +    // All co-routines must start with a call to crSTART().
    +    crSTART( xHandle );
    +
    +    for( ;; )
    +    {
    +        // Wait for data to become available on the queue.
    +        crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
    +
    +        if( xResult == pdPASS )
    +        {
    +            // We received the LED to flash - flash it!
    +            vParTestToggleLED( uxLEDToFlash );
    +        }
    +    }
    +
    +    crEND();
    + }
    + * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ +} + +/** + * croutine. h + *
    +  crQUEUE_SEND_FROM_ISR(
    +                            QueueHandle_t pxQueue,
    +                            void *pvItemToQueue,
    +                            BaseType_t xCoRoutinePreviouslyWoken
    +                       )
    + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * the ISR. + * + * Example usage: +
    + // A co-routine that blocks on a queue waiting for characters to be received.
    + static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + char cRxedChar;
    + BaseType_t xResult;
    +
    +     // All co-routines must start with a call to crSTART().
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +         // Wait for data to become available on the queue.  This assumes the
    +         // queue xCommsRxQueue has already been created!
    +         crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
    +
    +         // Was a character received?
    +         if( xResult == pdPASS )
    +         {
    +             // Process the character here.
    +         }
    +     }
    +
    +     // All co-routines must end with a call to crEND().
    +     crEND();
    + }
    +
    + // An ISR that uses a queue to send characters received on a serial port to
    + // a co-routine.
    + void vUART_ISR( void )
    + {
    + char cRxedChar;
    + BaseType_t xCRWokenByPost = pdFALSE;
    +
    +     // We loop around reading characters until there are none left in the UART.
    +     while( UART_RX_REG_NOT_EMPTY() )
    +     {
    +         // Obtain the character from the UART.
    +         cRxedChar = UART_RX_REG;
    +
    +         // Post the character onto a queue.  xCRWokenByPost will be pdFALSE
    +         // the first time around the loop.  If the post causes a co-routine
    +         // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
    +         // In this manner we can ensure that if more than one co-routine is
    +         // blocked on the queue only one is woken by this ISR no matter how
    +         // many characters are posted to the queue.
    +         xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
    +     }
    + }
    + * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + *
    +  crQUEUE_SEND_FROM_ISR(
    +                            QueueHandle_t pxQueue,
    +                            void *pvBuffer,
    +                            BaseType_t * pxCoRoutineWoken
    +                       )
    + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * pdFALSE. + * + * Example usage: +
    + // A co-routine that posts a character to a queue then blocks for a fixed
    + // period.  The character is incremented each time.
    + static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )
    + {
    + // cChar holds its value while this co-routine is blocked and must therefore
    + // be declared static.
    + static char cCharToTx = 'a';
    + BaseType_t xResult;
    +
    +     // All co-routines must start with a call to crSTART().
    +     crSTART( xHandle );
    +
    +     for( ;; )
    +     {
    +         // Send the next character to the queue.
    +         crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
    +
    +         if( xResult == pdPASS )
    +         {
    +             // The character was successfully posted to the queue.
    +         }
    +		 else
    +		 {
    +			// Could not post the character to the queue.
    +		 }
    +
    +         // Enable the UART Tx interrupt to cause an interrupt in this
    +		 // hypothetical UART.  The interrupt will obtain the character
    +		 // from the queue and send it.
    +		 ENABLE_RX_INTERRUPT();
    +
    +		 // Increment to the next character then block for a fixed period.
    +		 // cCharToTx will maintain its value across the delay as it is
    +		 // declared static.
    +		 cCharToTx++;
    +		 if( cCharToTx > 'x' )
    +		 {
    +			cCharToTx = 'a';
    +		 }
    +		 crDELAY( 100 );
    +     }
    +
    +     // All co-routines must end with a call to crEND().
    +     crEND();
    + }
    +
    + // An ISR that uses a queue to receive characters to send on a UART.
    + void vUART_ISR( void )
    + {
    + char cCharToTx;
    + BaseType_t xCRWokenByPost = pdFALSE;
    +
    +     while( UART_TX_REG_EMPTY() )
    +     {
    +         // Are there any characters in the queue waiting to be sent?
    +		 // xCRWokenByPost will automatically be set to pdTRUE if a co-routine
    +		 // is woken by the post - ensuring that only a single co-routine is
    +		 // woken no matter how many times we go around this loop.
    +         if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
    +		 {
    +			 SEND_CHARACTER( cCharToTx );
    +		 }
    +     }
    + }
    + * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) + +/* + * This function is intended for internal use by the co-routine macros only. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * Removes the current co-routine from its ready list and places it in the + * appropriate delayed list. + */ +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * Removes the highest priority co-routine from the event list and places it in + * the pending ready list. + */ +BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList ); + +#ifdef __cplusplus +} +#endif + +#endif /* CO_ROUTINE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h new file mode 100644 index 0000000..21657b9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h @@ -0,0 +1,279 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef DEPRECATED_DEFINITIONS_H +#define DEPRECATED_DEFINITIONS_H + + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a +pre-processor definition was used to ensure the pre-processor found the correct +portmacro.h file for the port being used. That scheme was deprecated in favour +of setting the compiler's include path such that it found the correct +portmacro.h file - removing the need for the constant and allowing the +portmacro.h file to be located anywhere in relation to the port being used. The +definitions below remain in the code for backward compatibility only. New +projects should not use them. */ + +#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef GCC_MEGA_AVR + #include "../portable/GCC/ATMega323/portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR + #include "../portable/IAR/ATMega323/portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" +#endif + +#ifdef _FEDPICC + #include "libFreeRTOS/Include/portmacro.h" +#endif + +#ifdef SDCC_CYGNAL + #include "../../Source/portable/SDCC/Cygnal/portmacro.h" +#endif + +#ifdef GCC_ARM7 + #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx + #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 + #include "../../Source/portable/GCC/MSP430F449/portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 + #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC + #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S + #include "../../Source/portable/GCC/H8S2329/portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 + #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 + #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR + #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC + #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 + #include "../../Source/portable/GCC/HCS12/portmacro.h" +#endif + +#ifdef GCC_MCF5235 + #include "../../Source/portable/GCC/MCF5235/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC + #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR + #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" +#endif + +#ifdef GCC_PPC405 + #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" +#endif + +#ifdef GCC_PPC440 + #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" +#endif + +#ifdef BCC_INDUSTRIAL_PC_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef BCC_FLASH_LITE_186_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#endif /* DEPRECATED_DEFINITIONS_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h new file mode 100644 index 0000000..a87fdf3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h @@ -0,0 +1,757 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef EVENT_GROUPS_H +#define EVENT_GROUPS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" +#endif + +/* FreeRTOS includes. */ +#include "timers.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An event group is a collection of bits to which an application can assign a + * meaning. For example, an application may create an event group to convey + * the status of various CAN bus related events in which bit 0 might mean "A CAN + * message has been received and is ready for processing", bit 1 might mean "The + * application has queued a message that is ready for sending onto the CAN + * network", and bit 2 might mean "It is time to send a SYNC message onto the + * CAN network" etc. A task can then test the bit values to see which events + * are active, and optionally enter the Blocked state to wait for a specified + * bit or a group of specified bits to be active. To continue the CAN bus + * example, a CAN controlling task can enter the Blocked state (and therefore + * not consume any processing time) until either bit 0, bit 1 or bit 2 are + * active, at which time the bit that was actually active would inform the task + * which action it had to take (process a received message, send a message, or + * send a SYNC). + * + * The event groups implementation contains intelligence to avoid race + * conditions that would otherwise occur were an application to use a simple + * variable for the same purpose. This is particularly important with respect + * to when a bit within an event group is to be cleared, and when bits have to + * be set and then tested atomically - as is the case where event groups are + * used to create a synchronisation point between multiple tasks (a + * 'rendezvous'). + * + * \defgroup EventGroup + */ + + + +/** + * event_groups.h + * + * Type by which event groups are referenced. For example, a call to + * xEventGroupCreate() returns an EventGroupHandle_t variable that can then + * be used as a parameter to other event group functions. + * + * \defgroup EventGroupHandle_t EventGroupHandle_t + * \ingroup EventGroup + */ +struct EventGroupDef_t; +typedef struct EventGroupDef_t * EventGroupHandle_t; + +/* + * The type that holds event bits always matches TickType_t - therefore the + * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, + * 32 bits if set to 0. + * + * \defgroup EventBits_t EventBits_t + * \ingroup EventGroup + */ +typedef TickType_t EventBits_t; + +/** + * event_groups.h + *
    + EventGroupHandle_t xEventGroupCreate( void );
    + 
    + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGropuCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see http://www.freertos.org/a00111.html). If an event group is created + * using xEventGropuCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @return If the event group was created then a handle to the event group is + * returned. If there was insufficient FreeRTOS heap available to create the + * event group then NULL is returned. See http://www.freertos.org/a00111.html + * + * Example usage: +
    +	// Declare a variable to hold the created event group.
    +	EventGroupHandle_t xCreatedEventGroup;
    +
    +	// Attempt to create the event group.
    +	xCreatedEventGroup = xEventGroupCreate();
    +
    +	// Was the event group created successfully?
    +	if( xCreatedEventGroup == NULL )
    +	{
    +		// The event group was not created because there was insufficient
    +		// FreeRTOS heap available.
    +	}
    +	else
    +	{
    +		// The event group was created.
    +	}
    +   
    + * \defgroup xEventGroupCreate xEventGroupCreate + * \ingroup EventGroup + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + *
    + EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );
    + 
    + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGropuCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see http://www.freertos.org/a00111.html). If an event group is created + * using xEventGropuCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type + * StaticEventGroup_t, which will be then be used to hold the event group's data + * structures, removing the need for the memory to be allocated dynamically. + * + * @return If the event group was created then a handle to the event group is + * returned. If pxEventGroupBuffer was NULL then NULL is returned. + * + * Example usage: +
    +	// StaticEventGroup_t is a publicly accessible structure that has the same
    +	// size and alignment requirements as the real event group structure.  It is
    +	// provided as a mechanism for applications to know the size of the event
    +	// group (which is dependent on the architecture and configuration file
    +	// settings) without breaking the strict data hiding policy by exposing the
    +	// real event group internals.  This StaticEventGroup_t variable is passed
    +	// into the xSemaphoreCreateEventGroupStatic() function and is used to store
    +	// the event group's data structures
    +	StaticEventGroup_t xEventGroupBuffer;
    +
    +	// Create the event group without dynamically allocating any memory.
    +	xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );
    +   
    + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupWaitBits( 	EventGroupHandle_t xEventGroup,
    +										const EventBits_t uxBitsToWaitFor,
    +										const BaseType_t xClearOnExit,
    +										const BaseType_t xWaitForAllBits,
    +										const TickType_t xTicksToWait );
    + 
    + * + * [Potentially] block to wait for one or more bits to be set within a + * previously created event group. + * + * This function cannot be called from an interrupt. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and/or bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within + * uxBitsToWaitFor that are set within the event group will be cleared before + * xEventGroupWaitBits() returns if the wait condition was met (if the function + * returns for a reason other than a timeout). If xClearOnExit is set to + * pdFALSE then the bits set in the event group are not altered when the call to + * xEventGroupWaitBits() returns. + * + * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then + * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor + * are set or the specified block time expires. If xWaitForAllBits is set to + * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set + * in uxBitsToWaitFor is set or the specified block time expires. The block + * time is specified by the xTicksToWait parameter. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for one/all (depending on the xWaitForAllBits value) of the bits specified by + * uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupWaitBits() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupWaitBits() returned because the bits it was waiting for were set + * then the returned value is the event group value before any bits were + * automatically cleared in the case that xClearOnExit parameter was set to + * pdTRUE. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   void aFunction( EventGroupHandle_t xEventGroup )
    +   {
    +   EventBits_t uxBits;
    +   const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
    +
    +		// Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
    +		// the event group.  Clear the bits before exiting.
    +		uxBits = xEventGroupWaitBits(
    +					xEventGroup,	// The event group being tested.
    +					BIT_0 | BIT_4,	// The bits within the event group to wait for.
    +					pdTRUE,			// BIT_0 and BIT_4 should be cleared before returning.
    +					pdFALSE,		// Don't wait for both bits, either bit will do.
    +					xTicksToWait );	// Wait a maximum of 100ms for either bit to be set.
    +
    +		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
    +		{
    +			// xEventGroupWaitBits() returned because both bits were set.
    +		}
    +		else if( ( uxBits & BIT_0 ) != 0 )
    +		{
    +			// xEventGroupWaitBits() returned because just BIT_0 was set.
    +		}
    +		else if( ( uxBits & BIT_4 ) != 0 )
    +		{
    +			// xEventGroupWaitBits() returned because just BIT_4 was set.
    +		}
    +		else
    +		{
    +			// xEventGroupWaitBits() returned because xTicksToWait ticks passed
    +			// without either BIT_0 or BIT_4 becoming set.
    +		}
    +   }
    +   
    + * \defgroup xEventGroupWaitBits xEventGroupWaitBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
    + 
    + * + * Clear bits within an event group. This function cannot be called from an + * interrupt. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear + * in the event group. For example, to clear bit 3 only, set uxBitsToClear to + * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. + * + * @return The value of the event group before the specified bits were cleared. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   void aFunction( EventGroupHandle_t xEventGroup )
    +   {
    +   EventBits_t uxBits;
    +
    +		// Clear bit 0 and bit 4 in xEventGroup.
    +		uxBits = xEventGroupClearBits(
    +								xEventGroup,	// The event group being updated.
    +								BIT_0 | BIT_4 );// The bits being cleared.
    +
    +		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
    +		{
    +			// Both bit 0 and bit 4 were set before xEventGroupClearBits() was
    +			// called.  Both will now be clear (not set).
    +		}
    +		else if( ( uxBits & BIT_0 ) != 0 )
    +		{
    +			// Bit 0 was set before xEventGroupClearBits() was called.  It will
    +			// now be clear.
    +		}
    +		else if( ( uxBits & BIT_4 ) != 0 )
    +		{
    +			// Bit 4 was set before xEventGroupClearBits() was called.  It will
    +			// now be clear.
    +		}
    +		else
    +		{
    +			// Neither bit 0 nor bit 4 were set in the first place.
    +		}
    +   }
    +   
    + * \defgroup xEventGroupClearBits xEventGroupClearBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
    +	BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
    + 
    + * + * A version of xEventGroupClearBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed + * while interrupts are disabled, so protects event groups that are accessed + * from tasks by suspending the scheduler rather than disabling interrupts. As + * a result event groups cannot be accessed directly from an interrupt service + * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the + * timer task to have the clear operation performed in the context of the timer + * task. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. + * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 + * and bit 0 set uxBitsToClear to 0x09. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   // An event group which it is assumed has already been created by a call to
    +   // xEventGroupCreate().
    +   EventGroupHandle_t xEventGroup;
    +
    +   void anInterruptHandler( void )
    +   {
    +		// Clear bit 0 and bit 4 in xEventGroup.
    +		xResult = xEventGroupClearBitsFromISR(
    +							xEventGroup,	 // The event group being updated.
    +							BIT_0 | BIT_4 ); // The bits being set.
    +
    +		if( xResult == pdPASS )
    +		{
    +			// The message was posted successfully.
    +		}
    +  }
    +   
    + * \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ) +#endif + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
    + 
    + * + * Set bits within an event group. + * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() + * is a version that can be called from an interrupt. + * + * Setting bits in an event group will automatically unblock tasks that are + * blocked waiting for the bits. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @return The value of the event group at the time the call to + * xEventGroupSetBits() returns. There are two reasons why the returned value + * might have the bits specified by the uxBitsToSet parameter cleared. First, + * if setting a bit results in a task that was waiting for the bit leaving the + * blocked state then it is possible the bit will be cleared automatically + * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any + * unblocked (or otherwise Ready state) task that has a priority above that of + * the task that called xEventGroupSetBits() will execute and may change the + * event group value before the call to xEventGroupSetBits() returns. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   void aFunction( EventGroupHandle_t xEventGroup )
    +   {
    +   EventBits_t uxBits;
    +
    +		// Set bit 0 and bit 4 in xEventGroup.
    +		uxBits = xEventGroupSetBits(
    +							xEventGroup,	// The event group being updated.
    +							BIT_0 | BIT_4 );// The bits being set.
    +
    +		if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
    +		{
    +			// Both bit 0 and bit 4 remained set when the function returned.
    +		}
    +		else if( ( uxBits & BIT_0 ) != 0 )
    +		{
    +			// Bit 0 remained set when the function returned, but bit 4 was
    +			// cleared.  It might be that bit 4 was cleared automatically as a
    +			// task that was waiting for bit 4 was removed from the Blocked
    +			// state.
    +		}
    +		else if( ( uxBits & BIT_4 ) != 0 )
    +		{
    +			// Bit 4 remained set when the function returned, but bit 0 was
    +			// cleared.  It might be that bit 0 was cleared automatically as a
    +			// task that was waiting for bit 0 was removed from the Blocked
    +			// state.
    +		}
    +		else
    +		{
    +			// Neither bit 0 nor bit 4 remained set.  It might be that a task
    +			// was waiting for both of the bits to be set, and the bits were
    +			// cleared as the task left the Blocked state.
    +		}
    +   }
    +   
    + * \defgroup xEventGroupSetBits xEventGroupSetBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
    +	BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
    + 
    + * + * A version of xEventGroupSetBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed in + * interrupts or from critical sections. Therefore xEventGroupSetBitsFromISR() + * sends a message to the timer task to have the set operation performed in the + * context of the timer task - where a scheduler lock is used in place of a + * critical section. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task is higher than the priority of the + * currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE by + * xEventGroupSetBitsFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: +
    +   #define BIT_0	( 1 << 0 )
    +   #define BIT_4	( 1 << 4 )
    +
    +   // An event group which it is assumed has already been created by a call to
    +   // xEventGroupCreate().
    +   EventGroupHandle_t xEventGroup;
    +
    +   void anInterruptHandler( void )
    +   {
    +   BaseType_t xHigherPriorityTaskWoken, xResult;
    +
    +		// xHigherPriorityTaskWoken must be initialised to pdFALSE.
    +		xHigherPriorityTaskWoken = pdFALSE;
    +
    +		// Set bit 0 and bit 4 in xEventGroup.
    +		xResult = xEventGroupSetBitsFromISR(
    +							xEventGroup,	// The event group being updated.
    +							BIT_0 | BIT_4   // The bits being set.
    +							&xHigherPriorityTaskWoken );
    +
    +		// Was the message posted successfully?
    +		if( xResult == pdPASS )
    +		{
    +			// If xHigherPriorityTaskWoken is now set to pdTRUE then a context
    +			// switch should be requested.  The macro used is port specific and
    +			// will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -
    +			// refer to the documentation page for the port being used.
    +			portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
    +		}
    +  }
    +   
    + * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR + * \ingroup EventGroup + */ +#if( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ) +#endif + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupSync(	EventGroupHandle_t xEventGroup,
    +									const EventBits_t uxBitsToSet,
    +									const EventBits_t uxBitsToWaitFor,
    +									TickType_t xTicksToWait );
    + 
    + * + * Atomically set bits within an event group, then wait for a combination of + * bits to be set within the same event group. This functionality is typically + * used to synchronise multiple tasks, where each task has to wait for the other + * tasks to reach a synchronisation point before proceeding. + * + * This function cannot be used from an interrupt. + * + * The function will return before its block time expires if the bits specified + * by the uxBitsToWait parameter are set, or become set within that time. In + * this case all the bits specified by uxBitsToWait will be automatically + * cleared before the function returns. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToSet The bits to set in the event group before determining + * if, and possibly waiting for, all the bits specified by the uxBitsToWait + * parameter are set. + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for all of the bits specified by uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupSync() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupSync() returned because all the bits it was waiting for were + * set then the returned value is the event group value before any bits were + * automatically cleared. + * + * Example usage: +
    + // Bits used by the three tasks.
    + #define TASK_0_BIT		( 1 << 0 )
    + #define TASK_1_BIT		( 1 << 1 )
    + #define TASK_2_BIT		( 1 << 2 )
    +
    + #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
    +
    + // Use an event group to synchronise three tasks.  It is assumed this event
    + // group has already been created elsewhere.
    + EventGroupHandle_t xEventBits;
    +
    + void vTask0( void *pvParameters )
    + {
    + EventBits_t uxReturn;
    + TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
    +
    +	 for( ;; )
    +	 {
    +		// Perform task functionality here.
    +
    +		// Set bit 0 in the event flag to note this task has reached the
    +		// sync point.  The other two tasks will set the other two bits defined
    +		// by ALL_SYNC_BITS.  All three tasks have reached the synchronisation
    +		// point when all the ALL_SYNC_BITS are set.  Wait a maximum of 100ms
    +		// for this to happen.
    +		uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
    +
    +		if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
    +		{
    +			// All three tasks reached the synchronisation point before the call
    +			// to xEventGroupSync() timed out.
    +		}
    +	}
    + }
    +
    + void vTask1( void *pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		// Perform task functionality here.
    +
    +		// Set bit 1 in the event flag to note this task has reached the
    +		// synchronisation point.  The other two tasks will set the other two
    +		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
    +		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
    +		// indefinitely for this to happen.
    +		xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
    +
    +		// xEventGroupSync() was called with an indefinite block time, so
    +		// this task will only reach here if the syncrhonisation was made by all
    +		// three tasks, so there is no need to test the return value.
    +	 }
    + }
    +
    + void vTask2( void *pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		// Perform task functionality here.
    +
    +		// Set bit 2 in the event flag to note this task has reached the
    +		// synchronisation point.  The other two tasks will set the other two
    +		// bits defined by ALL_SYNC_BITS.  All three tasks have reached the
    +		// synchronisation point when all the ALL_SYNC_BITS are set.  Wait
    +		// indefinitely for this to happen.
    +		xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
    +
    +		// xEventGroupSync() was called with an indefinite block time, so
    +		// this task will only reach here if the syncrhonisation was made by all
    +		// three tasks, so there is no need to test the return value.
    +	}
    + }
    +
    + 
    + * \defgroup xEventGroupSync xEventGroupSync + * \ingroup EventGroup + */ +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
    + 
    + * + * Returns the current value of the bits in an event group. This function + * cannot be used from an interrupt. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBits() was called. + * + * \defgroup xEventGroupGetBits xEventGroupGetBits + * \ingroup EventGroup + */ +#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 ) + +/** + * event_groups.h + *
    +	EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
    + 
    + * + * A version of xEventGroupGetBits() that can be called from an ISR. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. + * + * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR + * \ingroup EventGroup + */ +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + *
    +	void xEventGroupDelete( EventGroupHandle_t xEventGroup );
    + 
    + * + * Delete an event group that was previously created by a call to + * xEventGroupCreate(). Tasks that are blocked on the event group will be + * unblocked and obtain 0 as the event group's value. + * + * @param xEventGroup The event group being deleted. + */ +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/* For internal use only. */ +void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; +void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; + + +#if (configUSE_TRACE_FACILITY == 1) + UBaseType_t uxEventGroupGetNumber( void* xEventGroup ) PRIVILEGED_FUNCTION; + void vEventGroupSetNumber( void* xEventGroup, UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EVENT_GROUPS_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/list.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/list.h new file mode 100644 index 0000000..a3e3024 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/list.h @@ -0,0 +1,412 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * descending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + +#ifndef INC_FREERTOS_H + #error FreeRTOS.h must be included before list.h +#endif + +#ifndef LIST_H +#define LIST_H + +/* + * The list structure members are modified from within interrupts, and therefore + * by rights should be declared volatile. However, they are only modified in a + * functionally atomic way (within critical sections of with the scheduler + * suspended) and are either passed by reference into a function or indexed via + * a volatile variable. Therefore, in all use cases tested so far, the volatile + * qualifier can be omitted in order to provide a moderate performance + * improvement without adversely affecting functional behaviour. The assembly + * instructions generated by the IAR, ARM and GCC compilers when the respective + * compiler's options were set for maximum optimisation has been inspected and + * deemed to be as intended. That said, as compiler technology advances, and + * especially if aggressive cross module optimisation is used (a use case that + * has not been exercised to any great extend) then it is feasible that the + * volatile qualifier will be needed for correct optimisation. It is expected + * that a compiler removing essential code because, without the volatile + * qualifier on the list structure members and with aggressive cross module + * optimisation, the compiler deemed the code unnecessary will result in + * complete and obvious failure of the scheduler. If this is ever experienced + * then the volatile qualifier can be inserted in the relevant places within the + * list structures by simply defining configLIST_VOLATILE to volatile in + * FreeRTOSConfig.h (as per the example at the bottom of this comment block). + * If configLIST_VOLATILE is not defined then the preprocessor directives below + * will simply #define configLIST_VOLATILE away completely. + * + * To use volatile list structure members then add the following line to + * FreeRTOSConfig.h (without the quotes): + * "#define configLIST_VOLATILE volatile" + */ +#ifndef configLIST_VOLATILE + #define configLIST_VOLATILE +#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Macros that can be used to place known values within the list structures, +then check that the known values do not get corrupted during the execution of +the application. These may catch the list data structures being overwritten in +memory. They will not catch data errors caused by incorrect configuration or +use of FreeRTOS.*/ +#if( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) + /* Define the macros to do nothing. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) + #define listTEST_LIST_INTEGRITY( pxList ) +#else + /* Define macros that add new members into the list structures. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; + + /* Define macros that set the new structure members to known values. */ + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + + /* Define macros that will assert if one of the structure members does not + contain its expected value. */ + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) + #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) +#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ + + +/* + * Definition of the only type of object that a list can contain. + */ +struct xLIST; +struct xLIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ + struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + struct xLIST * configLIST_VOLATILE pxContainer; /*< Pointer to the list in which this list item is placed (if any). */ + listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +}; +typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ + +struct xMINI_LIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; + struct xLIST_ITEM * configLIST_VOLATILE pxNext; + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; +}; +typedef struct xMINI_LIST_ITEM MiniListItem_t; + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + volatile UBaseType_t uxNumberOfItems; + ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ + MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ + listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +} List_t; + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) + +/* + * Access macro to get the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in descending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) + +/* + * Access macro to retrieve the value of the list item. The value can + * represent anything - for example the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro to retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) + +/* + * Return the next list item. + * + * \page listGET_NEXT listGET_NEXT + * \ingroup LinkedList + */ +#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) + +/* + * Return the list item that marks the end of the list + * + * \page listGET_END_MARKER listGET_END_MARKER + * \ingroup LinkedList + */ +#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entry's pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxTCB pxTCB is set to the address of the owner of the next list item. + * @param pxList The list from which the next item owner is to be returned. + * + * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ +{ \ +List_t * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ +} + + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) + +/* + * Check to see if a list item is within a list. The list item maintains a + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @param pxListItem The list item we want to know if is in the list. + * @return pdTRUE if the list item is in the list, otherwise pdFALSE. + */ +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) ) + +/* + * Return the list a list item is contained within (referenced from). + * + * @param pxListItem The list item being queried. + * @return A pointer to the List_t object that references the pxListItem + */ +#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) + +/* + * This provides a crude means of knowing if a list has been initialised, as + * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() + * function. + */ +#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (descending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pxIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pxIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page uxListRemove uxListRemove + * \ingroup LinkedList + */ +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h new file mode 100644 index 0000000..0c3edb9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h @@ -0,0 +1,803 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + + +/* + * Message buffers build functionality on top of FreeRTOS stream buffers. + * Whereas stream buffers are used to send a continuous stream of data from one + * task or interrupt to another, message buffers are used to send variable + * length discrete messages from one task or interrupt to another. Their + * implementation is light weight, making them particularly suited for interrupt + * to task and core to core communication scenarios. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * timeout to 0. + * + * Message buffers hold variable length messages. To enable that, when a + * message is written to the message buffer an additional sizeof( size_t ) bytes + * are also written to store the message's length (that happens internally, with + * the API function). sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so writing a 10 byte message to a message buffer on a 32-bit + * architecture will actually reduce the available space in the message buffer + * by 14 bytes (10 byte are used by the message, and 4 bytes to hold the length + * of the message). + */ + +#ifndef FREERTOS_MESSAGE_BUFFER_H +#define FREERTOS_MESSAGE_BUFFER_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include message_buffer.h" +#endif + +/* Message buffers are built onto of stream buffers. */ +#include "stream_buffer.h" + +#if defined( __cplusplus ) +extern "C" { +#endif + +/** + * Type by which message buffers are referenced. For example, a call to + * xMessageBufferCreate() returns an MessageBufferHandle_t variable that can + * then be used as a parameter to xMessageBufferSend(), xMessageBufferReceive(), + * etc. + */ +typedef void * MessageBufferHandle_t; + +/*-----------------------------------------------------------*/ + +/** + * message_buffer.h + * +
    +MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes );
    +
    + * + * Creates a new message buffer using dynamically allocated memory. See + * xMessageBufferCreateStatic() for a version that uses statically allocated + * memory (memory that is allocated at compile time). + * + * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in + * FreeRTOSConfig.h for xMessageBufferCreate() to be available. + * + * @param xBufferSizeBytes The total number of bytes (not messages) the message + * buffer will be able to hold at any one time. When a message is written to + * the message buffer an additional sizeof( size_t ) bytes are also written to + * store the message's length. sizeof( size_t ) is typically 4 bytes on a + * 32-bit architecture, so on most 32-bit architectures a 10 byte message will + * take up 14 bytes of message buffer space. + * + * @return If NULL is returned, then the message buffer cannot be created + * because there is insufficient heap memory available for FreeRTOS to allocate + * the message buffer data structures and storage area. A non-NULL value being + * returned indicates that the message buffer has been created successfully - + * the returned value should be stored as the handle to the created message + * buffer. + * + * Example use: +
    +
    +void vAFunction( void )
    +{
    +MessageBufferHandle_t xMessageBuffer;
    +const size_t xMessageBufferSizeBytes = 100;
    +
    +    // Create a message buffer that can hold 100 bytes.  The memory used to hold
    +    // both the message buffer structure and the messages themselves is allocated
    +    // dynamically.  Each message added to the buffer consumes an additional 4
    +    // bytes which are used to hold the lengh of the message.
    +    xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes );
    +
    +    if( xMessageBuffer == NULL )
    +    {
    +        // There was not enough heap memory space available to create the
    +        // message buffer.
    +    }
    +    else
    +    {
    +        // The message buffer was created successfully and can now be used.
    +    }
    +
    +
    + * \defgroup xMessageBufferCreate xMessageBufferCreate + * \ingroup MessageBufferManagement + */ +#define xMessageBufferCreate( xBufferSizeBytes ) ( MessageBufferHandle_t ) xStreamBufferGenericCreate( xBufferSizeBytes, ( size_t ) 0, pdTRUE ) + +/** + * message_buffer.h + * +
    +MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes,
    +                                                  uint8_t *pucMessageBufferStorageArea,
    +                                                  StaticMessageBuffer_t *pxStaticMessageBuffer );
    +
    + * Creates a new message buffer using statically allocated memory. See + * xMessageBufferCreate() for a version that uses dynamically allocated memory. + * + * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the + * pucMessageBufferStorageArea parameter. When a message is written to the + * message buffer an additional sizeof( size_t ) bytes are also written to store + * the message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so on most 32-bit architecture a 10 byte message will take up + * 14 bytes of message buffer space. The maximum number of bytes that can be + * stored in the message buffer is actually (xBufferSizeBytes - 1). + * + * @param pucMessageBufferStorageArea Must point to a uint8_t array that is at + * least xBufferSizeBytes + 1 big. This is the array to which messages are + * copied when they are written to the message buffer. + * + * @param pxStaticMessageBuffer Must point to a variable of type + * StaticMessageBuffer_t, which will be used to hold the message buffer's data + * structure. + * + * @return If the message buffer is created successfully then a handle to the + * created message buffer is returned. If either pucMessageBufferStorageArea or + * pxStaticmessageBuffer are NULL then NULL is returned. + * + * Example use: +
    +
    +// Used to dimension the array used to hold the messages.  The available space
    +// will actually be one less than this, so 999.
    +#define STORAGE_SIZE_BYTES 1000
    +
    +// Defines the memory that will actually hold the messages within the message
    +// buffer.
    +static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];
    +
    +// The variable used to hold the message buffer structure.
    +StaticMessageBuffer_t xMessageBufferStruct;
    +
    +void MyFunction( void )
    +{
    +MessageBufferHandle_t xMessageBuffer;
    +
    +    xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucBufferStorage ),
    +                                                 ucBufferStorage,
    +                                                 &xMessageBufferStruct );
    +
    +    // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer
    +    // parameters were NULL, xMessageBuffer will not be NULL, and can be used to
    +    // reference the created message buffer in other message buffer API calls.
    +
    +    // Other code that uses the message buffer can go here.
    +}
    +
    +
    + * \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic + * \ingroup MessageBufferManagement + */ +#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) ( MessageBufferHandle_t ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, 0, pdTRUE, pucMessageBufferStorageArea, pxStaticMessageBuffer ) + +/** + * message_buffer.h + * +
    +size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer,
    +                           const void *pvTxData,
    +                           size_t xDataLengthBytes,
    +                           TickType_t xTicksToWait );
    +
    + *
    + * Sends a discrete message to the message buffer.  The message can be any
    + * length that fits within the buffer's free space, and is copied into the
    + * buffer.
    + *
    + * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer
    + * implementation (so also the message buffer implementation, as message buffers
    + * are built on top of stream buffers) assumes there is only one task or
    + * interrupt that will write to the buffer (the writer), and only one task or
    + * interrupt that will read from the buffer (the reader).  It is safe for the
    + * writer and reader to be different tasks or interrupts, but, unlike other
    + * FreeRTOS objects, it is not safe to have multiple different writers or
    + * multiple different readers.  If there are to be multiple different writers
    + * then the application writer must place each call to a writing API function
    + * (such as xMessageBufferSend()) inside a critical section and set the send
    + * block time to 0.  Likewise, if there are to be multiple different readers
    + * then the application writer must place each call to a reading API function
    + * (such as xMessageBufferRead()) inside a critical section and set the receive
    + * block time to 0.
    + *
    + * Use xMessageBufferSend() to write to a message buffer from a task.  Use
    + * xMessageBufferSendFromISR() to write to a message buffer from an interrupt
    + * service routine (ISR).
    + *
    + * @param xMessageBuffer The handle of the message buffer to which a message is
    + * being sent.
    + *
    + * @param pvTxData A pointer to the message that is to be copied into the
    + * message buffer.
    + *
    + * @param xDataLengthBytes The length of the message.  That is, the number of
    + * bytes to copy from pvTxData into the message buffer.  When a message is
    + * written to the message buffer an additional sizeof( size_t ) bytes are also
    + * written to store the message's length.  sizeof( size_t ) is typically 4 bytes
    + * on a 32-bit architecture, so on most 32-bit architecture setting
    + * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24
    + * bytes (20 bytes of message data and 4 bytes to hold the message length).
    + *
    + * @param xTicksToWait The maximum amount of time the calling task should remain
    + * in the Blocked state to wait for enough space to become available in the
    + * message buffer, should the message buffer have insufficient space when
    + * xMessageBufferSend() is called.  The calling task will never block if
    + * xTicksToWait is zero.  The block time is specified in tick periods, so the
    + * absolute time it represents is dependent on the tick frequency.  The macro
    + * pdMS_TO_TICKS() can be used to convert a time specified in milliseconds into
    + * a time specified in ticks.  Setting xTicksToWait to portMAX_DELAY will cause
    + * the task to wait indefinitely (without timing out), provided
    + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h.  Tasks do not use any
    + * CPU time when they are in the Blocked state.
    + *
    + * @return The number of bytes written to the message buffer.  If the call to
    + * xMessageBufferSend() times out before there was enough space to write the
    + * message into the message buffer then zero is returned.  If the call did not
    + * time out then xDataLengthBytes is returned.
    + *
    + * Example use:
    +
    +void vAFunction( MessageBufferHandle_t xMessageBuffer )
    +{
    +size_t xBytesSent;
    +uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };
    +char *pcStringToSend = "String to send";
    +const TickType_t x100ms = pdMS_TO_TICKS( 100 );
    +
    +    // Send an array to the message buffer, blocking for a maximum of 100ms to
    +    // wait for enough space to be available in the message buffer.
    +    xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );
    +
    +    if( xBytesSent != sizeof( ucArrayToSend ) )
    +    {
    +        // The call to xMessageBufferSend() times out before there was enough
    +        // space in the buffer for the data to be written.
    +    }
    +
    +    // Send the string to the message buffer.  Return immediately if there is
    +    // not enough space in the buffer.
    +    xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );
    +
    +    if( xBytesSent != strlen( pcStringToSend ) )
    +    {
    +        // The string could not be added to the message buffer because there was
    +        // not enough free space in the buffer.
    +    }
    +}
    +
    + * \defgroup xMessageBufferSend xMessageBufferSend + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) xStreamBufferSend( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) + +/** + * message_buffer.h + * +
    +size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer,
    +                                  const void *pvTxData,
    +                                  size_t xDataLengthBytes,
    +                                  BaseType_t *pxHigherPriorityTaskWoken );
    +
    + *
    + * Interrupt safe version of the API function that sends a discrete message to
    + * the message buffer.  The message can be any length that fits within the
    + * buffer's free space, and is copied into the buffer.
    + *
    + * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer
    + * implementation (so also the message buffer implementation, as message buffers
    + * are built on top of stream buffers) assumes there is only one task or
    + * interrupt that will write to the buffer (the writer), and only one task or
    + * interrupt that will read from the buffer (the reader).  It is safe for the
    + * writer and reader to be different tasks or interrupts, but, unlike other
    + * FreeRTOS objects, it is not safe to have multiple different writers or
    + * multiple different readers.  If there are to be multiple different writers
    + * then the application writer must place each call to a writing API function
    + * (such as xMessageBufferSend()) inside a critical section and set the send
    + * block time to 0.  Likewise, if there are to be multiple different readers
    + * then the application writer must place each call to a reading API function
    + * (such as xMessageBufferRead()) inside a critical section and set the receive
    + * block time to 0.
    + *
    + * Use xMessageBufferSend() to write to a message buffer from a task.  Use
    + * xMessageBufferSendFromISR() to write to a message buffer from an interrupt
    + * service routine (ISR).
    + *
    + * @param xMessageBuffer The handle of the message buffer to which a message is
    + * being sent.
    + *
    + * @param pvTxData A pointer to the message that is to be copied into the
    + * message buffer.
    + *
    + * @param xDataLengthBytes The length of the message.  That is, the number of
    + * bytes to copy from pvTxData into the message buffer.  When a message is
    + * written to the message buffer an additional sizeof( size_t ) bytes are also
    + * written to store the message's length.  sizeof( size_t ) is typically 4 bytes
    + * on a 32-bit architecture, so on most 32-bit architecture setting
    + * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24
    + * bytes (20 bytes of message data and 4 bytes to hold the message length).
    + *
    + * @param pxHigherPriorityTaskWoken  It is possible that a message buffer will
    + * have a task blocked on it waiting for data.  Calling
    + * xMessageBufferSendFromISR() can make data available, and so cause a task that
    + * was waiting for data to leave the Blocked state.  If calling
    + * xMessageBufferSendFromISR() causes a task to leave the Blocked state, and the
    + * unblocked task has a priority higher than the currently executing task (the
    + * task that was interrupted), then, internally, xMessageBufferSendFromISR()
    + * will set *pxHigherPriorityTaskWoken to pdTRUE.  If
    + * xMessageBufferSendFromISR() sets this value to pdTRUE, then normally a
    + * context switch should be performed before the interrupt is exited.  This will
    + * ensure that the interrupt returns directly to the highest priority Ready
    + * state task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it
    + * is passed into the function.  See the code example below for an example.
    + *
    + * @return The number of bytes actually written to the message buffer.  If the
    + * message buffer didn't have enough free space for the message to be stored
    + * then 0 is returned, otherwise xDataLengthBytes is returned.
    + *
    + * Example use:
    +
    +// A message buffer that has already been created.
    +MessageBufferHandle_t xMessageBuffer;
    +
    +void vAnInterruptServiceRoutine( void )
    +{
    +size_t xBytesSent;
    +char *pcStringToSend = "String to send";
    +BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
    +
    +    // Attempt to send the string to the message buffer.
    +    xBytesSent = xMessageBufferSendFromISR( xMessageBuffer,
    +                                            ( void * ) pcStringToSend,
    +                                            strlen( pcStringToSend ),
    +                                            &xHigherPriorityTaskWoken );
    +
    +    if( xBytesSent != strlen( pcStringToSend ) )
    +    {
    +        // The string could not be added to the message buffer because there was
    +        // not enough free space in the buffer.
    +    }
    +
    +    // If xHigherPriorityTaskWoken was set to pdTRUE inside
    +    // xMessageBufferSendFromISR() then a task that has a priority above the
    +    // priority of the currently executing task was unblocked and a context
    +    // switch should be performed to ensure the ISR returns to the unblocked
    +    // task.  In most FreeRTOS ports this is done by simply passing
    +    // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
    +    // variables value, and perform the context switch if necessary.  Check the
    +    // documentation for the port in use for port specific instructions.
    +    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
    +}
    +
    + * \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferSendFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) + +/** + * message_buffer.h + * +
    +size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,
    +                              void *pvRxData,
    +                              size_t xBufferLengthBytes,
    +                              TickType_t xTicksToWait );
    +
    + * + * Receives a discrete message from a message buffer. Messages can be of + * variable length and are copied out of the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferReceive() to read from a message buffer from a task. Use + * xMessageBufferReceiveFromISR() to read from a message buffer from an + * interrupt service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer from which a message + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received message is + * to be copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData + * parameter. This sets the maximum length of the message that can be received. + * If xBufferLengthBytes is too small to hold the next message then the message + * will be left in the message buffer and 0 will be returned. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for a message, should the message buffer be empty. + * xMessageBufferReceive() will return immediately if xTicksToWait is zero and + * the message buffer is empty. The block time is specified in tick periods, so + * the absolute time it represents is dependent on the tick frequency. The + * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds + * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will + * cause the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. Tasks do not use any + * CPU time when they are in the Blocked state. + * + * @return The length, in bytes, of the message read from the message buffer, if + * any. If xMessageBufferReceive() times out before a message became available + * then zero is returned. If the length of the message is greater than + * xBufferLengthBytes then the message will be left in the message buffer and + * zero is returned. + * + * Example use: +
    +void vAFunction( MessageBuffer_t xMessageBuffer )
    +{
    +uint8_t ucRxData[ 20 ];
    +size_t xReceivedBytes;
    +const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );
    +
    +    // Receive the next message from the message buffer.  Wait in the Blocked
    +    // state (so not using any CPU processing time) for a maximum of 100ms for
    +    // a message to become available.
    +    xReceivedBytes = xMessageBufferReceive( xMessageBuffer,
    +                                            ( void * ) ucRxData,
    +                                            sizeof( ucRxData ),
    +                                            xBlockTime );
    +
    +    if( xReceivedBytes > 0 )
    +    {
    +        // A ucRxData contains a message that is xReceivedBytes long.  Process
    +        // the message here....
    +    }
    +}
    +
    + * \defgroup xMessageBufferReceive xMessageBufferReceive + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) xStreamBufferReceive( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) + + +/** + * message_buffer.h + * +
    +size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer,
    +                                     void *pvRxData,
    +                                     size_t xBufferLengthBytes,
    +                                     BaseType_t *pxHigherPriorityTaskWoken );
    +
    + * + * An interrupt safe version of the API function that receives a discrete + * message from a message buffer. Messages can be of variable length and are + * copied out of the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferReceive() to read from a message buffer from a task. Use + * xMessageBufferReceiveFromISR() to read from a message buffer from an + * interrupt service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer from which a message + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received message is + * to be copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData + * parameter. This sets the maximum length of the message that can be received. + * If xBufferLengthBytes is too small to hold the next message then the message + * will be left in the message buffer and 0 will be returned. + * + * @param pxHigherPriorityTaskWoken It is possible that a message buffer will + * have a task blocked on it waiting for space to become available. Calling + * xMessageBufferReceiveFromISR() can make space available, and so cause a task + * that is waiting for space to leave the Blocked state. If calling + * xMessageBufferReceiveFromISR() causes a task to leave the Blocked state, and + * the unblocked task has a priority higher than the currently executing task + * (the task that was interrupted), then, internally, + * xMessageBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. + * If xMessageBufferReceiveFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. That will + * ensure the interrupt returns directly to the highest priority Ready state + * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is + * passed into the function. See the code example below for an example. + * + * @return The length, in bytes, of the message read from the message buffer, if + * any. + * + * Example use: +
    +// A message buffer that has already been created.
    +MessageBuffer_t xMessageBuffer;
    +
    +void vAnInterruptServiceRoutine( void )
    +{
    +uint8_t ucRxData[ 20 ];
    +size_t xReceivedBytes;
    +BaseType_t xHigherPriorityTaskWoken = pdFALSE;  // Initialised to pdFALSE.
    +
    +    // Receive the next message from the message buffer.
    +    xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer,
    +                                                  ( void * ) ucRxData,
    +                                                  sizeof( ucRxData ),
    +                                                  &xHigherPriorityTaskWoken );
    +
    +    if( xReceivedBytes > 0 )
    +    {
    +        // A ucRxData contains a message that is xReceivedBytes long.  Process
    +        // the message here....
    +    }
    +
    +    // If xHigherPriorityTaskWoken was set to pdTRUE inside
    +    // xMessageBufferReceiveFromISR() then a task that has a priority above the
    +    // priority of the currently executing task was unblocked and a context
    +    // switch should be performed to ensure the ISR returns to the unblocked
    +    // task.  In most FreeRTOS ports this is done by simply passing
    +    // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the
    +    // variables value, and perform the context switch if necessary.  Check the
    +    // documentation for the port in use for port specific instructions.
    +    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
    +}
    +
    + * \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) xStreamBufferReceiveFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) + +/** + * message_buffer.h + * +
    +void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer );
    +
    + * + * Deletes a message buffer that was previously created using a call to + * xMessageBufferCreate() or xMessageBufferCreateStatic(). If the message + * buffer was created using dynamic memory (that is, by xMessageBufferCreate()), + * then the allocated memory is freed. + * + * A message buffer handle must not be used after the message buffer has been + * deleted. + * + * @param xMessageBuffer The handle of the message buffer to be deleted. + * + */ +#define vMessageBufferDelete( xMessageBuffer ) vStreamBufferDelete( ( StreamBufferHandle_t ) xMessageBuffer ) + +/** + * message_buffer.h +
    +BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ) );
    +
    + * + * Tests to see if a message buffer is full. A message buffer is full if it + * cannot accept any more messages, of any size, until space is made available + * by a message being removed from the message buffer. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return If the message buffer referenced by xMessageBuffer is full then + * pdTRUE is returned. Otherwise pdFALSE is returned. + */ +#define xMessageBufferIsFull( xMessageBuffer ) xStreamBufferIsFull( ( StreamBufferHandle_t ) xMessageBuffer ) + +/** + * message_buffer.h +
    +BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ) );
    +
    + * + * Tests to see if a message buffer is empty (does not contain any messages). + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return If the message buffer referenced by xMessageBuffer is empty then + * pdTRUE is returned. Otherwise pdFALSE is returned. + * + */ +#define xMessageBufferIsEmpty( xMessageBuffer ) xStreamBufferIsEmpty( ( StreamBufferHandle_t ) xMessageBuffer ) + +/** + * message_buffer.h +
    +BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer );
    +
    + * + * Resets a message buffer to its initial empty state, discarding any message it + * contained. + * + * A message buffer can only be reset if there are no tasks blocked on it. + * + * @param xMessageBuffer The handle of the message buffer being reset. + * + * @return If the message buffer was reset then pdPASS is returned. If the + * message buffer could not be reset because either there was a task blocked on + * the message queue to wait for space to become available, or to wait for a + * a message to be available, then pdFAIL is returned. + * + * \defgroup xMessageBufferReset xMessageBufferReset + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReset( xMessageBuffer ) xStreamBufferReset( ( StreamBufferHandle_t ) xMessageBuffer ) + + +/** + * message_buffer.h +
    +size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ) );
    +
    + * Returns the number of bytes of free space in the message buffer. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return The number of bytes that can be written to the message buffer before + * the message buffer would be full. When a message is written to the message + * buffer an additional sizeof( size_t ) bytes are also written to store the + * message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so if xMessageBufferSpacesAvailable() returns 10, then the size + * of the largest message that can be written to the message buffer is 6 bytes. + * + * \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSpaceAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) +#define xMessageBufferSpacesAvailable( xMessageBuffer ) xStreamBufferSpacesAvailable( ( StreamBufferHandle_t ) xMessageBuffer ) /* Corrects typo in original macro name. */ + +/** + * message_buffer.h +
    + size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ) );
    + 
    + * Returns the length (in bytes) of the next message in a message buffer. + * Useful if xMessageBufferReceive() returned 0 because the size of the buffer + * passed into xMessageBufferReceive() was too small to hold the next message. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return The length (in bytes) of the next message in the message buffer, or 0 + * if the message buffer is empty. + * + * \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes + * \ingroup MessageBufferManagement + */ +#define xMessageBufferNextLengthBytes( xMessageBuffer ) xStreamBufferNextMessageLengthBytes( ( StreamBufferHandle_t ) xMessageBuffer ) PRIVILEGED_FUNCTION; + +/** + * message_buffer.h + * +
    +BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
    +
    + * + * For advanced users only. + * + * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is sent to a message buffer or stream buffer. If there was a task that + * was blocked on the message or stream buffer waiting for data to arrive then + * the sbSEND_COMPLETED() macro sends a notification to the task to remove it + * from the Blocked state. xMessageBufferSendCompletedFromISR() does the same + * thing. It is provided to enable application writers to implement their own + * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer to which data was + * written. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xMessageBufferSendCompletedFromISR(). If calling + * xMessageBufferSendCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR + * \ingroup StreamBufferManagement + */ +#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferSendCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) + +/** + * message_buffer.h + * +
    +BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
    +
    + * + * For advanced users only. + * + * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is read out of a message buffer or stream buffer. If there was a task + * that was blocked on the message or stream buffer waiting for data to arrive + * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to + * remove it from the Blocked state. xMessageBufferReceiveCompletedFromISR() + * does the same thing. It is provided to enable application writers to + * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT + * ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer from which data was + * read. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xMessageBufferReceiveCompletedFromISR(). If calling + * xMessageBufferReceiveCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR + * \ingroup StreamBufferManagement + */ +#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) xStreamBufferReceiveCompletedFromISR( ( StreamBufferHandle_t ) xMessageBuffer, pxHigherPriorityTaskWoken ) + +#if defined( __cplusplus ) +} /* extern "C" */ +#endif + +#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h new file mode 100644 index 0000000..a21b7a6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h @@ -0,0 +1,160 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* + * When the MPU is used the standard (non MPU) API functions are mapped to + * equivalents that start "MPU_", the prototypes for which are defined in this + * header files. This will cause the application code to call the MPU_ version + * which wraps the non-MPU version with privilege promoting then demoting code, + * so the kernel code always runs will full privileges. + */ + + +#ifndef MPU_PROTOTYPES_H +#define MPU_PROTOTYPES_H + +/* MPU versions of tasks.h API functions. */ +BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const uint16_t usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, const char * const pcName, const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskStartScheduler( void ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSuspendAll( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskResumeAll( void ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTaskGetTickCount( void ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) FREERTOS_SYSTEM_CALL; +char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetHandle( const char *pcNameToQuery ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL; +TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) FREERTOS_SYSTEM_CALL; +void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL; +uint32_t MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskGetRunTimeStats( char *pcWriteBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +uint32_t MPU_ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskNotifyStateClear( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +uint32_t MPU_ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of queue.h API functions. */ +BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueDelete( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcName ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; +QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL; +QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of timers.h API functions. */ +TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction ) FREERTOS_SYSTEM_CALL; +TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t *pxTimerBuffer ) FREERTOS_SYSTEM_CALL; +void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +void MPU_vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of event_group.h API functions. */ +EventGroupHandle_t MPU_xEventGroupCreate( void ) FREERTOS_SYSTEM_CALL; +EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxEventGroupGetNumber( void* xEventGroup ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of message/stream_buffer.h API functions. */ +size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL; +StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer ) FREERTOS_SYSTEM_CALL; +StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer, uint8_t * const pucStreamBufferStorageArea, StaticStreamBuffer_t * const pxStaticStreamBuffer ) FREERTOS_SYSTEM_CALL; + + + +#endif /* MPU_PROTOTYPES_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h new file mode 100644 index 0000000..5f63d4f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h @@ -0,0 +1,189 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef MPU_WRAPPERS_H +#define MPU_WRAPPERS_H + +/* This file redefines API functions to be called through a wrapper macro, but +only for ports that are using the MPU. */ +#ifdef portUSING_MPU_WRAPPERS + + /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + included from queue.c or task.c to prevent it from having an effect within + those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + + /* + * Map standard (non MPU) API functions to equivalents that start + * "MPU_". This will cause the application code to call the MPU_ + * version, which wraps the non-MPU version with privilege promoting + * then demoting code, so the kernel code always runs will full + * privileges. + */ + + /* Map standard tasks.h API functions to the MPU equivalents. */ + #define xTaskCreate MPU_xTaskCreate + #define xTaskCreateStatic MPU_xTaskCreateStatic + #define xTaskCreateRestricted MPU_xTaskCreateRestricted + #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelay MPU_vTaskDelay + #define vTaskDelayUntil MPU_vTaskDelayUntil + #define xTaskAbortDelay MPU_xTaskAbortDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define eTaskGetState MPU_eTaskGetState + #define vTaskGetInfo MPU_vTaskGetInfo + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define vTaskSuspend MPU_vTaskSuspend + #define vTaskResume MPU_vTaskResume + #define vTaskSuspendAll MPU_vTaskSuspendAll + #define xTaskResumeAll MPU_xTaskResumeAll + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define pcTaskGetName MPU_pcTaskGetName + #define xTaskGetHandle MPU_xTaskGetHandle + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2 + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer + #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + #define vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter + #define xTaskGenericNotify MPU_xTaskGenericNotify + #define xTaskNotifyWait MPU_xTaskNotifyWait + #define ulTaskNotifyTake MPU_ulTaskNotifyTake + #define xTaskNotifyStateClear MPU_xTaskNotifyStateClear + #define ulTaskNotifyValueClear MPU_ulTaskNotifyValueClear + #define xTaskCatchUpTicks MPU_xTaskCatchUpTicks + + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState + #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + + /* Map standard queue.h API functions to the MPU equivalents. */ + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueReceive MPU_xQueueReceive + #define xQueuePeek MPU_xQueuePeek + #define xQueueSemaphoreTake MPU_xQueueSemaphoreTake + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable + #define vQueueDelete MPU_vQueueDelete + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueGenericCreate MPU_xQueueGenericCreate + #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic + #define xQueueCreateSet MPU_xQueueCreateSet + #define xQueueAddToSet MPU_xQueueAddToSet + #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + #define xQueueSelectFromSet MPU_xQueueSelectFromSet + #define xQueueGenericReset MPU_xQueueGenericReset + + #if( configQUEUE_REGISTRY_SIZE > 0 ) + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #define pcQueueGetName MPU_pcQueueGetName + #endif + + /* Map standard timer.h API functions to the MPU equivalents. */ + #define xTimerCreate MPU_xTimerCreate + #define xTimerCreateStatic MPU_xTimerCreateStatic + #define pvTimerGetTimerID MPU_pvTimerGetTimerID + #define vTimerSetTimerID MPU_vTimerSetTimerID + #define xTimerIsTimerActive MPU_xTimerIsTimerActive + #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle + #define xTimerPendFunctionCall MPU_xTimerPendFunctionCall + #define pcTimerGetName MPU_pcTimerGetName + #define vTimerSetReloadMode MPU_vTimerSetReloadMode + #define uxTimerGetReloadMode MPU_uxTimerGetReloadMode + #define xTimerGetPeriod MPU_xTimerGetPeriod + #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime + #define xTimerGenericCommand MPU_xTimerGenericCommand + + /* Map standard event_group.h API functions to the MPU equivalents. */ + #define xEventGroupCreate MPU_xEventGroupCreate + #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic + #define xEventGroupWaitBits MPU_xEventGroupWaitBits + #define xEventGroupClearBits MPU_xEventGroupClearBits + #define xEventGroupSetBits MPU_xEventGroupSetBits + #define xEventGroupSync MPU_xEventGroupSync + #define vEventGroupDelete MPU_vEventGroupDelete + + /* Map standard message/stream_buffer.h API functions to the MPU + equivalents. */ + #define xStreamBufferSend MPU_xStreamBufferSend + #define xStreamBufferReceive MPU_xStreamBufferReceive + #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes + #define vStreamBufferDelete MPU_vStreamBufferDelete + #define xStreamBufferIsFull MPU_xStreamBufferIsFull + #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty + #define xStreamBufferReset MPU_xStreamBufferReset + #define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable + #define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable + #define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel + #define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate + #define xStreamBufferGenericCreateStatic MPU_xStreamBufferGenericCreateStatic + + + /* Remove the privileged function macro, but keep the PRIVILEGED_DATA + macro so applications can place data in privileged access sections + (useful when using statically allocated objects). */ + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) + #define FREERTOS_SYSTEM_CALL + + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + + /* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) + #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) + #define FREERTOS_SYSTEM_CALL __attribute__((section( "freertos_system_calls"))) + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define FREERTOS_SYSTEM_CALL + #define portUSING_MPU_WRAPPERS 0 + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h new file mode 100644 index 0000000..a2099c3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h @@ -0,0 +1,199 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/*----------------------------------------------------------- + * Portable layer API. Each function must be defined for each port. + *----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#define PORTABLE_H + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a +pre-processor definition was used to ensure the pre-processor found the correct +portmacro.h file for the port being used. That scheme was deprecated in favour +of setting the compiler's include path such that it found the correct +portmacro.h file - removing the need for the constant and allowing the +portmacro.h file to be located anywhere in relation to the port being used. +Purely for reasons of backward compatibility the old method is still valid, but +to make it clear that new projects should not use it, support for the port +specific constants has been moved into the deprecated_definitions.h header +file. */ +#include "deprecated_definitions.h" + +/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h +did not result in a portmacro.h header file being included - and it should be +included here. In this case the path to the correct portmacro.h header file +must be set in the compiler's include path. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 32 + #define portBYTE_ALIGNMENT_MASK ( 0x001f ) +#endif + +#if portBYTE_ALIGNMENT == 16 + #define portBYTE_ALIGNMENT_MASK ( 0x000f ) +#endif + +#if portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) +#endif + +#if portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#endif + +#if portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#endif + +#if portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#endif + +#ifndef portBYTE_ALIGNMENT_MASK + #error "Invalid portBYTE_ALIGNMENT definition" +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifndef portHAS_STACK_OVERFLOW_CHECKING + #define portHAS_STACK_OVERFLOW_CHECKING 0 +#endif + +#ifndef portARCH_NAME + #define portARCH_NAME NULL +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mpu_wrappers.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; + #else + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; + #endif +#else + #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; + #else + StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; + #endif +#endif + +/* Used by heap_5.c to define the start address and size of each memory region +that together comprise the total FreeRTOS heap space. */ +typedef struct HeapRegion +{ + uint8_t *pucStartAddress; + size_t xSizeInBytes; +} HeapRegion_t; + +/* Used to pass information about the heap out of vPortGetHeapStats(). */ +typedef struct xHeapStats +{ + size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ + size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ + size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */ + size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */ +} HeapStats_t; + +/* + * Used to define multiple heap regions for use by heap_5.c. This function + * must be called before any calls to pvPortMalloc() - not creating a task, + * queue, semaphore, mutex, software timer, event group, etc. will result in + * pvPortMalloc being called. + * + * pxHeapRegions passes in an array of HeapRegion_t structures - each of which + * defines a region of memory that can be used as the heap. The array is + * terminated by a HeapRegions_t structure that has a size of 0. The region + * with the lowest start address must appear first in the array. + */ +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; + +/* + * Returns a HeapStats_t structure filled with information about the current + * heap state. + */ +void vPortGetHeapStats( HeapStats_t *pxHeapStats ); + +/* + * Map to the memory management routines required for the port. + */ +void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void *pv ) PRIVILEGED_FUNCTION; +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; +size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, StackType_t *pxBottomOfStack, uint32_t ulStackDepth ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTABLE_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h new file mode 100644 index 0000000..0d95130 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h @@ -0,0 +1,124 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef PROJDEFS_H +#define PROJDEFS_H + +/* + * Defines the prototype to which task functions must conform. Defined in this + * file to ensure the type is known before portable.h is included. + */ +typedef void (*TaskFunction_t)( void * ); + +/* Converts a time in milliseconds to a time in ticks. This macro can be +overridden by a macro of the same name defined in FreeRTOSConfig.h in case the +definition here is not suitable for your application. */ +#ifndef pdMS_TO_TICKS + #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) ) +#endif + +#define pdFALSE ( ( BaseType_t ) 0 ) +#define pdTRUE ( ( BaseType_t ) 1 ) + +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) +#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) +#define errQUEUE_FULL ( ( BaseType_t ) 0 ) + +/* FreeRTOS error definitions. */ +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) + +/* Macros used for basic data corruption checks. */ +#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES + #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 +#endif + +#if( configUSE_16_BIT_TICKS == 1 ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a +#else + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL +#endif + +/* The following errno values are used by FreeRTOS+ components, not FreeRTOS +itself. */ +#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ +#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ +#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ +#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ +#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ +#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ +#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ +#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ +#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ +#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ +#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ +#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ +#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ +#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ +#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ +#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ +#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ +#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ +#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ +#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ +#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ +#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ +#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ +#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ +#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ +#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ +#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ +#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ +#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ +#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ +#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ +#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ +#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ +#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ +#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ +#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ +#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ +#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ +#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ + +/* The following endian values are used by FreeRTOS+ components, not FreeRTOS +itself. */ +#define pdFREERTOS_LITTLE_ENDIAN 0 +#define pdFREERTOS_BIG_ENDIAN 1 + +/* Re-defining endian values for generic naming. */ +#define pdLITTLE_ENDIAN pdFREERTOS_LITTLE_ENDIAN +#define pdBIG_ENDIAN pdFREERTOS_BIG_ENDIAN + + +#endif /* PROJDEFS_H */ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h new file mode 100644 index 0000000..52ccca5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h @@ -0,0 +1,1655 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + + +#ifndef QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include queue.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "task.h" + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate() + * returns an QueueHandle_t variable that can then be used as a parameter to + * xQueueSend(), xQueueReceive(), etc. + */ +struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */ +typedef struct QueueDefinition * QueueHandle_t; + +/** + * Type by which queue sets are referenced. For example, a call to + * xQueueCreateSet() returns an xQueueSet variable that can then be used as a + * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. + */ +typedef struct QueueDefinition * QueueSetHandle_t; + +/** + * Queue sets can contain both queues and semaphores, so the + * QueueSetMemberHandle_t is defined as a type to be used where a parameter or + * return value can be either an QueueHandle_t or an SemaphoreHandle_t. + */ +typedef struct QueueDefinition * QueueSetMemberHandle_t; + +/* For internal use only. */ +#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) +#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) +#define queueOVERWRITE ( ( BaseType_t ) 2 ) + +/* For internal use only. These definitions *must* match those in queue.c. */ +#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) +#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) +#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) +#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) + +/** + * queue. h + *
    + QueueHandle_t xQueueCreate(
    +							  UBaseType_t uxQueueLength,
    +							  UBaseType_t uxItemSize
    +						  );
    + * 
    + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * http://www.freertos.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + };
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +	if( xQueue1 == 0 )
    +	{
    +		// Queue was not created and must not be used.
    +	}
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +	if( xQueue2 == 0 )
    +	{
    +		// Queue was not created and must not be used.
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueCreate xQueueCreate + * \ingroup QueueManagement + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) +#endif + +/** + * queue. h + *
    + QueueHandle_t xQueueCreateStatic(
    +							  UBaseType_t uxQueueLength,
    +							  UBaseType_t uxItemSize,
    +							  uint8_t *pucQueueStorageBuffer,
    +							  StaticQueue_t *pxQueueBuffer
    +						  );
    + * 
    + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * http://www.freertos.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * http://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @param pucQueueStorageBuffer If uxItemSize is not zero then + * pucQueueStorageBuffer must point to a uint8_t array that is at least large + * enough to hold the maximum number of items that can be in the queue at any + * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is + * zero then pucQueueStorageBuffer can be NULL. + * + * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which + * will be used to hold the queue's data structure. + * + * @return If the queue is created then a handle to the created queue is + * returned. If pxQueueBuffer is NULL then NULL is returned. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + };
    +
    + #define QUEUE_LENGTH 10
    + #define ITEM_SIZE sizeof( uint32_t )
    +
    + // xQueueBuffer will hold the queue structure.
    + StaticQueue_t xQueueBuffer;
    +
    + // ucQueueStorage will hold the items posted to the queue.  Must be at least
    + // [(queue length) * ( queue item size)] bytes long.
    + uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold.
    +							ITEM_SIZE	  // The size of each item in the queue
    +							&( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue.
    +							&xQueueBuffer ); // The buffer that will hold the queue structure.
    +
    +	// The queue is guaranteed to be created successfully as no dynamic memory
    +	// allocation is used.  Therefore xQueue1 is now a handle to a valid queue.
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueCreateStatic xQueueCreateStatic + * \ingroup QueueManagement + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * queue. h + *
    + BaseType_t xQueueSendToToFront(
    +								   QueueHandle_t	xQueue,
    +								   const void		*pvItemToQueue,
    +								   TickType_t		xTicksToWait
    +							   );
    + * 
    + * + * Post an item to the front of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + uint32_t ulVar = 10UL;
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +
    +	// ...
    +
    +	if( xQueue1 != 0 )
    +	{
    +		// Send an uint32_t.  Wait for 10 ticks for space to become
    +		// available if necessary.
    +		if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
    +		{
    +			// Failed to post the message, even after 10 ticks.
    +		}
    +	}
    +
    +	if( xQueue2 != 0 )
    +	{
    +		// Send a pointer to a struct AMessage object.  Don't block if the
    +		// queue is already full.
    +		pxMessage = & xMessage;
    +		xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * queue. h + *
    + BaseType_t xQueueSendToBack(
    +								   QueueHandle_t	xQueue,
    +								   const void		*pvItemToQueue,
    +								   TickType_t		xTicksToWait
    +							   );
    + * 
    + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + uint32_t ulVar = 10UL;
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +
    +	// ...
    +
    +	if( xQueue1 != 0 )
    +	{
    +		// Send an uint32_t.  Wait for 10 ticks for space to become
    +		// available if necessary.
    +		if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
    +		{
    +			// Failed to post the message, even after 10 ticks.
    +		}
    +	}
    +
    +	if( xQueue2 != 0 )
    +	{
    +		// Send a pointer to a struct AMessage object.  Don't block if the
    +		// queue is already full.
    +		pxMessage = & xMessage;
    +		xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + *
    + BaseType_t xQueueSend(
    +							  QueueHandle_t xQueue,
    +							  const void * pvItemToQueue,
    +							  TickType_t xTicksToWait
    +						 );
    + * 
    + * + * This is a macro that calls xQueueGenericSend(). It is included for + * backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToFront() and xQueueSendToBack() macros. It is + * equivalent to xQueueSendToBack(). + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + uint32_t ulVar = 10UL;
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +
    +	// ...
    +
    +	if( xQueue1 != 0 )
    +	{
    +		// Send an uint32_t.  Wait for 10 ticks for space to become
    +		// available if necessary.
    +		if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )
    +		{
    +			// Failed to post the message, even after 10 ticks.
    +		}
    +	}
    +
    +	if( xQueue2 != 0 )
    +	{
    +		// Send a pointer to a struct AMessage object.  Don't block if the
    +		// queue is already full.
    +		pxMessage = & xMessage;
    +		xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + *
    + BaseType_t xQueueOverwrite(
    +							  QueueHandle_t xQueue,
    +							  const void * pvItemToQueue
    +						 );
    + * 
    + * + * Only for use with queues that have a length of one - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * This function must not be called from an interrupt service routine. + * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle of the queue to which the data is being sent. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and + * therefore has the same return values as xQueueSendToFront(). However, pdPASS + * is the only value that can be returned because xQueueOverwrite() will write + * to the queue even when the queue is already full. + * + * Example usage: +
    +
    + void vFunction( void *pvParameters )
    + {
    + QueueHandle_t xQueue;
    + uint32_t ulVarToSend, ulValReceived;
    +
    +	// Create a queue to hold one uint32_t value.  It is strongly
    +	// recommended *not* to use xQueueOverwrite() on queues that can
    +	// contain more than one value, and doing so will trigger an assertion
    +	// if configASSERT() is defined.
    +	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
    +
    +	// Write the value 10 to the queue using xQueueOverwrite().
    +	ulVarToSend = 10;
    +	xQueueOverwrite( xQueue, &ulVarToSend );
    +
    +	// Peeking the queue should now return 10, but leave the value 10 in
    +	// the queue.  A block time of zero is used as it is known that the
    +	// queue holds a value.
    +	ulValReceived = 0;
    +	xQueuePeek( xQueue, &ulValReceived, 0 );
    +
    +	if( ulValReceived != 10 )
    +	{
    +		// Error unless the item was removed by a different task.
    +	}
    +
    +	// The queue is still full.  Use xQueueOverwrite() to overwrite the
    +	// value held in the queue with 100.
    +	ulVarToSend = 100;
    +	xQueueOverwrite( xQueue, &ulVarToSend );
    +
    +	// This time read from the queue, leaving the queue empty once more.
    +	// A block time of 0 is used again.
    +	xQueueReceive( xQueue, &ulValReceived, 0 );
    +
    +	// The value read should be the last value written, even though the
    +	// queue was already full when the value was written.
    +	if( ulValReceived != 100 )
    +	{
    +		// Error!
    +	}
    +
    +	// ...
    +}
    + 
    + * \defgroup xQueueOverwrite xQueueOverwrite + * \ingroup QueueManagement + */ +#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) + + +/** + * queue. h + *
    + BaseType_t xQueueGenericSend(
    +									QueueHandle_t xQueue,
    +									const void * pvItemToQueue,
    +									TickType_t xTicksToWait
    +									BaseType_t xCopyPosition
    +								);
    + * 
    + * + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + uint32_t ulVar = 10UL;
    +
    + void vATask( void *pvParameters )
    + {
    + QueueHandle_t xQueue1, xQueue2;
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 uint32_t values.
    +	xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +
    +	// ...
    +
    +	if( xQueue1 != 0 )
    +	{
    +		// Send an uint32_t.  Wait for 10 ticks for space to become
    +		// available if necessary.
    +		if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS )
    +		{
    +			// Failed to post the message, even after 10 ticks.
    +		}
    +	}
    +
    +	if( xQueue2 != 0 )
    +	{
    +		// Send a pointer to a struct AMessage object.  Don't block if the
    +		// queue is already full.
    +		pxMessage = & xMessage;
    +		xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK );
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    + BaseType_t xQueuePeek(
    +							 QueueHandle_t xQueue,
    +							 void * const pvBuffer,
    +							 TickType_t xTicksToWait
    +						 );
    + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. See + * xQueuePeekFromISR() for an alternative that can be called from an interrupt + * service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue + * is empty. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + QueueHandle_t xQueue;
    +
    + // Task to create a queue and post a value.
    + void vATask( void *pvParameters )
    + {
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +	if( xQueue == 0 )
    +	{
    +		// Failed to create the queue.
    +	}
    +
    +	// ...
    +
    +	// Send a pointer to a struct AMessage object.  Don't block if the
    +	// queue is already full.
    +	pxMessage = & xMessage;
    +	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +
    +	// ... Rest of task code.
    + }
    +
    + // Task to peek the data from the queue.
    + void vADifferentTask( void *pvParameters )
    + {
    + struct AMessage *pxRxedMessage;
    +
    +	if( xQueue != 0 )
    +	{
    +		// Peek a message on the created queue.  Block for 10 ticks if a
    +		// message is not immediately available.
    +		if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
    +		{
    +			// pcRxedMessage now points to the struct AMessage variable posted
    +			// by vATask, but the item still remains on the queue.
    +		}
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueuePeek xQueuePeek + * \ingroup QueueManagement + */ +BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    + BaseType_t xQueuePeekFromISR(
    +									QueueHandle_t xQueue,
    +									void *pvBuffer,
    +								);
    + * + * A version of xQueuePeek() that can be called from an interrupt service + * routine (ISR). + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * \defgroup xQueuePeekFromISR xQueuePeekFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    + BaseType_t xQueueReceive(
    +								 QueueHandle_t xQueue,
    +								 void *pvBuffer,
    +								 TickType_t xTicksToWait
    +							);
    + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. xQueueReceive() will return immediately if xTicksToWait + * is zero and the queue is empty. The time is defined in tick periods so the + * constant portTICK_PERIOD_MS should be used to convert to real time if this is + * required. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
    + struct AMessage
    + {
    +	char ucMessageID;
    +	char ucData[ 20 ];
    + } xMessage;
    +
    + QueueHandle_t xQueue;
    +
    + // Task to create a queue and post a value.
    + void vATask( void *pvParameters )
    + {
    + struct AMessage *pxMessage;
    +
    +	// Create a queue capable of containing 10 pointers to AMessage structures.
    +	// These should be passed by pointer as they contain a lot of data.
    +	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    +	if( xQueue == 0 )
    +	{
    +		// Failed to create the queue.
    +	}
    +
    +	// ...
    +
    +	// Send a pointer to a struct AMessage object.  Don't block if the
    +	// queue is already full.
    +	pxMessage = & xMessage;
    +	xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );
    +
    +	// ... Rest of task code.
    + }
    +
    + // Task to receive from the queue.
    + void vADifferentTask( void *pvParameters )
    + {
    + struct AMessage *pxRxedMessage;
    +
    +	if( xQueue != 0 )
    +	{
    +		// Receive a message on the created queue.  Block for 10 ticks if a
    +		// message is not immediately available.
    +		if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )
    +		{
    +			// pcRxedMessage now points to the struct AMessage variable posted
    +			// by vATask.
    +		}
    +	}
    +
    +	// ... Rest of task code.
    + }
    + 
    + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );
    + * + * Return the number of messages stored in a queue. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of messages available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
    + * + * Return the number of free spaces available in a queue. This is equal to the + * number of items that can be sent to the queue before the queue becomes full + * if no items are removed. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of spaces available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    void vQueueDelete( QueueHandle_t xQueue );
    + * + * Delete a queue - freeing all the memory allocated for storing of items + * placed on the queue. + * + * @param xQueue A handle to the queue to be deleted. + * + * \defgroup vQueueDelete vQueueDelete + * \ingroup QueueManagement + */ +void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    + BaseType_t xQueueSendToFrontFromISR(
    +										 QueueHandle_t xQueue,
    +										 const void *pvItemToQueue,
    +										 BaseType_t *pxHigherPriorityTaskWoken
    +									  );
    + 
    + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
    + void vBufferISR( void )
    + {
    + char cIn;
    + BaseType_t xHigherPrioritTaskWoken;
    +
    +	// We have not woken a task at the start of the ISR.
    +	xHigherPriorityTaskWoken = pdFALSE;
    +
    +	// Loop until the buffer is empty.
    +	do
    +	{
    +		// Obtain a byte from the buffer.
    +		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    +
    +		// Post the byte.
    +		xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    +
    +	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    +
    +	// Now the buffer is empty we can switch context if necessary.
    +	if( xHigherPriorityTaskWoken )
    +	{
    +		taskYIELD ();
    +	}
    + }
    + 
    + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * queue. h + *
    + BaseType_t xQueueSendToBackFromISR(
    +										 QueueHandle_t xQueue,
    +										 const void *pvItemToQueue,
    +										 BaseType_t *pxHigherPriorityTaskWoken
    +									  );
    + 
    + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
    + void vBufferISR( void )
    + {
    + char cIn;
    + BaseType_t xHigherPriorityTaskWoken;
    +
    +	// We have not woken a task at the start of the ISR.
    +	xHigherPriorityTaskWoken = pdFALSE;
    +
    +	// Loop until the buffer is empty.
    +	do
    +	{
    +		// Obtain a byte from the buffer.
    +		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    +
    +		// Post the byte.
    +		xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    +
    +	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    +
    +	// Now the buffer is empty we can switch context if necessary.
    +	if( xHigherPriorityTaskWoken )
    +	{
    +		taskYIELD ();
    +	}
    + }
    + 
    + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + *
    + BaseType_t xQueueOverwriteFromISR(
    +							  QueueHandle_t xQueue,
    +							  const void * pvItemToQueue,
    +							  BaseType_t *pxHigherPriorityTaskWoken
    +						 );
    + * 
    + * + * A version of xQueueOverwrite() that can be used in an interrupt service + * routine (ISR). + * + * Only for use with queues that can hold a single item - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return xQueueOverwriteFromISR() is a macro that calls + * xQueueGenericSendFromISR(), and therefore has the same return values as + * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be + * returned because xQueueOverwriteFromISR() will write to the queue even when + * the queue is already full. + * + * Example usage: +
    +
    + QueueHandle_t xQueue;
    +
    + void vFunction( void *pvParameters )
    + {
    + 	// Create a queue to hold one uint32_t value.  It is strongly
    +	// recommended *not* to use xQueueOverwriteFromISR() on queues that can
    +	// contain more than one value, and doing so will trigger an assertion
    +	// if configASSERT() is defined.
    +	xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
    +}
    +
    +void vAnInterruptHandler( void )
    +{
    +// xHigherPriorityTaskWoken must be set to pdFALSE before it is used.
    +BaseType_t xHigherPriorityTaskWoken = pdFALSE;
    +uint32_t ulVarToSend, ulValReceived;
    +
    +	// Write the value 10 to the queue using xQueueOverwriteFromISR().
    +	ulVarToSend = 10;
    +	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
    +
    +	// The queue is full, but calling xQueueOverwriteFromISR() again will still
    +	// pass because the value held in the queue will be overwritten with the
    +	// new value.
    +	ulVarToSend = 100;
    +	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
    +
    +	// Reading from the queue will now return 100.
    +
    +	// ...
    +
    +	if( xHigherPrioritytaskWoken == pdTRUE )
    +	{
    +		// Writing to the queue caused a task to unblock and the unblocked task
    +		// has a priority higher than or equal to the priority of the currently
    +		// executing task (the task this interrupt interrupted).  Perform a context
    +		// switch so this interrupt returns directly to the unblocked task.
    +		portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port.
    +	}
    +}
    + 
    + * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR + * \ingroup QueueManagement + */ +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) + +/** + * queue. h + *
    + BaseType_t xQueueSendFromISR(
    +									 QueueHandle_t xQueue,
    +									 const void *pvItemToQueue,
    +									 BaseType_t *pxHigherPriorityTaskWoken
    +								);
    + 
    + * + * This is a macro that calls xQueueGenericSendFromISR(). It is included + * for backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
    + void vBufferISR( void )
    + {
    + char cIn;
    + BaseType_t xHigherPriorityTaskWoken;
    +
    +	// We have not woken a task at the start of the ISR.
    +	xHigherPriorityTaskWoken = pdFALSE;
    +
    +	// Loop until the buffer is empty.
    +	do
    +	{
    +		// Obtain a byte from the buffer.
    +		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    +
    +		// Post the byte.
    +		xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
    +
    +	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    +
    +	// Now the buffer is empty we can switch context if necessary.
    +	if( xHigherPriorityTaskWoken )
    +	{
    +		// Actual macro used here is port specific.
    +		portYIELD_FROM_ISR ();
    +	}
    + }
    + 
    + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + *
    + BaseType_t xQueueGenericSendFromISR(
    +										   QueueHandle_t		xQueue,
    +										   const	void	*pvItemToQueue,
    +										   BaseType_t	*pxHigherPriorityTaskWoken,
    +										   BaseType_t	xCopyPosition
    +									   );
    + 
    + * + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. xQueueGiveFromISR() is an + * equivalent for use by semaphores that don't actually copy any data. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
    + void vBufferISR( void )
    + {
    + char cIn;
    + BaseType_t xHigherPriorityTaskWokenByPost;
    +
    +	// We have not woken a task at the start of the ISR.
    +	xHigherPriorityTaskWokenByPost = pdFALSE;
    +
    +	// Loop until the buffer is empty.
    +	do
    +	{
    +		// Obtain a byte from the buffer.
    +		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
    +
    +		// Post each byte.
    +		xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );
    +
    +	} while( portINPUT_BYTE( BUFFER_COUNT ) );
    +
    +	// Now the buffer is empty we can switch context if necessary.  Note that the
    +	// name of the yield function required is port specific.
    +	if( xHigherPriorityTaskWokenByPost )
    +	{
    +		portYIELD_FROM_ISR();
    +	}
    + }
    + 
    + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
    + BaseType_t xQueueReceiveFromISR(
    +									   QueueHandle_t	xQueue,
    +									   void	*pvBuffer,
    +									   BaseType_t *pxTaskWoken
    +								   );
    + * 
    + * + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param pxTaskWoken A task may be blocked waiting for space to become + * available on the queue. If xQueueReceiveFromISR causes such a task to + * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
    +
    + QueueHandle_t xQueue;
    +
    + // Function to create a queue and post some values.
    + void vAFunction( void *pvParameters )
    + {
    + char cValueToPost;
    + const TickType_t xTicksToWait = ( TickType_t )0xff;
    +
    +	// Create a queue capable of containing 10 characters.
    +	xQueue = xQueueCreate( 10, sizeof( char ) );
    +	if( xQueue == 0 )
    +	{
    +		// Failed to create the queue.
    +	}
    +
    +	// ...
    +
    +	// Post some characters that will be used within an ISR.  If the queue
    +	// is full then this task will block for xTicksToWait ticks.
    +	cValueToPost = 'a';
    +	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
    +	cValueToPost = 'b';
    +	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
    +
    +	// ... keep posting characters ... this task may block when the queue
    +	// becomes full.
    +
    +	cValueToPost = 'c';
    +	xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );
    + }
    +
    + // ISR that outputs all the characters received on the queue.
    + void vISR_Routine( void )
    + {
    + BaseType_t xTaskWokenByReceive = pdFALSE;
    + char cRxedChar;
    +
    +	while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
    +	{
    +		// A character was received.  Output the character now.
    +		vOutputCharacter( cRxedChar );
    +
    +		// If removing the character from the queue woke the task that was
    +		// posting onto the queue cTaskWokenByReceive will have been set to
    +		// pdTRUE.  No matter how many times this loop iterates only one
    +		// task will be woken.
    +	}
    +
    +	if( cTaskWokenByPost != ( char ) pdFALSE;
    +	{
    +		taskYIELD ();
    +	}
    + }
    + 
    + * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* + * Utilities to query queues that are safe to use from an ISR. These utilities + * should be used only from witin an ISR, or within a critical section. + */ +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/* + * The functions defined above are for passing data to and from tasks. The + * functions below are the equivalents for passing data to and from + * co-routines. + * + * These functions are called from the co-routine macro implementation and + * should not be called directly from application code. Instead use the macro + * wrappers defined within croutine.h. + */ +BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ); +BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxTaskWoken ); +BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ); +BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ); + +/* + * For internal use only. Use xSemaphoreCreateMutex(), + * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling + * these functions directly. + */ +QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; +TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Use xSemaphoreTakeMutexRecursive() or + * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. + */ +BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; + +/* + * Reset a queue back to its original empty state. The return value is now + * obsolete and is always set to pdPASS. + */ +#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not effect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. The queue registry only + * stores a pointer to the string - so the string must be persistent (global or + * preferably in ROM/Flash), not on the stack. + */ +#if( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to + * remove the queue, semaphore or mutex from the register. If you are not using + * a kernel aware debugger then this function can be ignored. + * + * @param xQueue The handle of the queue being removed from the registry. + */ +#if( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * The queue registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call pcQueueGetName() to look + * up and return the name of a queue in the queue registry from the queue's + * handle. + * + * @param xQueue The handle of the queue the name of which will be returned. + * @return If the queue is in the registry then a pointer to the name of the + * queue is returned. If the queue is not in the registry then NULL is + * returned. + */ +#if( configQUEUE_REGISTRY_SIZE > 0 ) + const char *pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * Generic version of the function used to creaet a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Generic version of the function used to creaet a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Queue sets provide a mechanism to allow a task to block (pend) on a read + * operation from multiple queues or semaphores simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * A queue set must be explicitly created using a call to xQueueCreateSet() + * before it can be used. Once created, standard FreeRTOS queues and semaphores + * can be added to the set using calls to xQueueAddToSet(). + * xQueueSelectFromSet() is then used to determine which, if any, of the queues + * or semaphores contained in the set is in a state where a queue read or + * semaphore take operation would be successful. + * + * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: An additional 4 bytes of RAM is required for each space in a every + * queue added to a queue set. Therefore counting semaphores that have a high + * maximum count value should not be added to a queue set. + * + * Note 4: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param uxEventQueueLength Queue sets store events that occur on + * the queues and semaphores contained in the set. uxEventQueueLength specifies + * the maximum number of events that can be queued at once. To be absolutely + * certain that events are not lost uxEventQueueLength should be set to the + * total sum of the length of the queues added to the set, where binary + * semaphores and mutexes have a length of 1, and counting semaphores have a + * length set by their maximum count value. Examples: + * + If a queue set is to hold a queue of length 5, another queue of length 12, + * and a binary semaphore, then uxEventQueueLength should be set to + * (5 + 12 + 1), or 18. + * + If a queue set is to hold three binary semaphores then uxEventQueueLength + * should be set to (1 + 1 + 1 ), or 3. + * + If a queue set is to hold a counting semaphore that has a maximum count of + * 5, and a counting semaphore that has a maximum count of 3, then + * uxEventQueueLength should be set to (5 + 3), or 8. + * + * @return If the queue set is created successfully then a handle to the created + * queue set is returned. Otherwise NULL is returned. + */ +QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; + +/* + * Adds a queue or semaphore to a queue set that was previously created by a + * call to xQueueCreateSet(). + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being added to + * the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set to which the queue or semaphore + * is being added. + * + * @return If the queue or semaphore was successfully added to the queue set + * then pdPASS is returned. If the queue could not be successfully added to the + * queue set because it is already a member of a different queue set then pdFAIL + * is returned. + */ +BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * Removes a queue or semaphore from a queue set. A queue or semaphore can only + * be removed from a set if the queue or semaphore is empty. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being removed + * from the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set in which the queue or semaphore + * is included. + * + * @return If the queue or semaphore was successfully removed from the queue set + * then pdPASS is returned. If the queue was not in the queue set, or the + * queue (or semaphore) was not empty, then pdFAIL is returned. + */ +BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * xQueueSelectFromSet() selects from the members of a queue set a queue or + * semaphore that either contains data (in the case of a queue) or is available + * to take (in the case of a semaphore). xQueueSelectFromSet() effectively + * allows a task to block (pend) on a read operation on all the queues and + * semaphores in a queue set simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueSet The queue set on which the task will (potentially) block. + * + * @param xTicksToWait The maximum time, in ticks, that the calling task will + * remain in the Blocked state (with other tasks executing) to wait for a member + * of the queue set to be ready for a successful queue read or semaphore take + * operation. + * + * @return xQueueSelectFromSet() will return the handle of a queue (cast to + * a QueueSetMemberHandle_t type) contained in the queue set that contains data, + * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained + * in the queue set that is available, or NULL if no such queue or semaphore + * exists before before the specified block time expires. + */ +QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * A version of xQueueSelectFromSet() that can be used from an ISR. + */ +QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* Not public API functions. */ +void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; +void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + + +#ifdef __cplusplus +} +#endif + +#endif /* QUEUE_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h new file mode 100644 index 0000000..787c791 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h @@ -0,0 +1,1140 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include semphr.h" +#endif + +#include "queue.h" + +typedef QueueHandle_t SemaphoreHandle_t; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) +#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + + +/** + * semphr. h + *
    vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore )
    + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Macro that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
    +    // This is a macro so pass the variable in directly.
    +    vSemaphoreCreateBinary( xSemaphore );
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define vSemaphoreCreateBinary( xSemaphore ) \ + { \ + ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateBinary( void )
    + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @return Handle to the created semaphore, or NULL if the memory required to + * hold the semaphore's data structures could not be allocated. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
    +    // This is a macro so pass the variable in directly.
    +    xSemaphore = xSemaphoreCreateBinary();
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer )
    + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * NOTE: In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see http://www.freertos.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the semaphore is created then a handle to the created semaphore is + * returned. If pxSemaphoreBuffer is NULL then NULL is returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    + StaticSemaphore_t xSemaphoreBuffer;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to xSemaphoreCreateBinary().
    +    // The semaphore's data structures will be placed in the xSemaphoreBuffer
    +    // variable, the address of which is passed into the function.  The
    +    // function's parameter is not NULL, so the function will not attempt any
    +    // dynamic memory allocation, and therefore the function will not return
    +    // return NULL.
    +    xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );
    +
    +    // Rest of task code goes here.
    + }
    + 
    + * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic + * \ingroup Semaphores + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticSemaphore, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
    xSemaphoreTake(
    + *                   SemaphoreHandle_t xSemaphore,
    + *                   TickType_t xBlockTime
    + *               )
    + * + * Macro to obtain a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + // A task that creates a semaphore.
    + void vATask( void * pvParameters )
    + {
    +    // Create the semaphore to guard a shared resource.
    +    xSemaphore = xSemaphoreCreateBinary();
    + }
    +
    + // A task that uses the semaphore.
    + void vAnotherTask( void * pvParameters )
    + {
    +    // ... Do other things.
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // See if we can obtain the semaphore.  If the semaphore is not available
    +        // wait 10 ticks to see if it becomes free.
    +        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
    +        {
    +            // We were able to obtain the semaphore and can now access the
    +            // shared resource.
    +
    +            // ...
    +
    +            // We have finished accessing the shared resource.  Release the
    +            // semaphore.
    +            xSemaphoreGive( xSemaphore );
    +        }
    +        else
    +        {
    +            // We could not obtain the semaphore and can therefore not access
    +            // the shared resource safely.
    +        }
    +    }
    + }
    + 
    + * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) + +/** + * semphr. h + * xSemaphoreTakeRecursive( + * SemaphoreHandle_t xMutex, + * TickType_t xBlockTime + * ) + * + * Macro to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: +
    + SemaphoreHandle_t xMutex = NULL;
    +
    + // A task that creates a mutex.
    + void vATask( void * pvParameters )
    + {
    +    // Create the mutex to guard a shared resource.
    +    xMutex = xSemaphoreCreateRecursiveMutex();
    + }
    +
    + // A task that uses the mutex.
    + void vAnotherTask( void * pvParameters )
    + {
    +    // ... Do other things.
    +
    +    if( xMutex != NULL )
    +    {
    +        // See if we can obtain the mutex.  If the mutex is not available
    +        // wait 10 ticks to see if it becomes free.
    +        if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
    +        {
    +            // We were able to obtain the mutex and can now access the
    +            // shared resource.
    +
    +            // ...
    +            // For some reason due to the nature of the code further calls to
    +            // xSemaphoreTakeRecursive() are made on the same mutex.  In real
    +            // code these would not be just sequential calls as this would make
    +            // no sense.  Instead the calls are likely to be buried inside
    +            // a more complex call structure.
    +            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    +            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    +
    +            // The mutex has now been 'taken' three times, so will not be
    +            // available to another task until it has also been given back
    +            // three times.  Again it is unlikely that real code would have
    +            // these calls sequentially, but instead buried in a more complex
    +            // call structure.  This is just for illustrative purposes.
    +            xSemaphoreGiveRecursive( xMutex );
    +            xSemaphoreGiveRecursive( xMutex );
    +            xSemaphoreGiveRecursive( xMutex );
    +
    +            // Now the mutex can be taken by other tasks.
    +        }
    +        else
    +        {
    +            // We could not obtain the mutex and can therefore not access
    +            // the shared resource safely.
    +        }
    +    }
    + }
    + 
    + * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#if( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) +#endif + +/** + * semphr. h + *
    xSemaphoreGive( SemaphoreHandle_t xSemaphore )
    + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Create the semaphore to guard a shared resource.
    +    xSemaphore = vSemaphoreCreateBinary();
    +
    +    if( xSemaphore != NULL )
    +    {
    +        if( xSemaphoreGive( xSemaphore ) != pdTRUE )
    +        {
    +            // We would expect this call to fail because we cannot give
    +            // a semaphore without first "taking" it!
    +        }
    +
    +        // Obtain the semaphore - don't block if the semaphore is not
    +        // immediately available.
    +        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
    +        {
    +            // We now have the semaphore and can access the shared resource.
    +
    +            // ...
    +
    +            // We have finished accessing the shared resource so can free the
    +            // semaphore.
    +            if( xSemaphoreGive( xSemaphore ) != pdTRUE )
    +            {
    +                // We would not expect this call to fail because we must have
    +                // obtained the semaphore to get here.
    +            }
    +        }
    +    }
    + }
    + 
    + * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + *
    xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex )
    + * + * Macro to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: +
    + SemaphoreHandle_t xMutex = NULL;
    +
    + // A task that creates a mutex.
    + void vATask( void * pvParameters )
    + {
    +    // Create the mutex to guard a shared resource.
    +    xMutex = xSemaphoreCreateRecursiveMutex();
    + }
    +
    + // A task that uses the mutex.
    + void vAnotherTask( void * pvParameters )
    + {
    +    // ... Do other things.
    +
    +    if( xMutex != NULL )
    +    {
    +        // See if we can obtain the mutex.  If the mutex is not available
    +        // wait 10 ticks to see if it becomes free.
    +        if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )
    +        {
    +            // We were able to obtain the mutex and can now access the
    +            // shared resource.
    +
    +            // ...
    +            // For some reason due to the nature of the code further calls to
    +			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
    +			// code these would not be just sequential calls as this would make
    +			// no sense.  Instead the calls are likely to be buried inside
    +			// a more complex call structure.
    +            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    +            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
    +
    +            // The mutex has now been 'taken' three times, so will not be
    +			// available to another task until it has also been given back
    +			// three times.  Again it is unlikely that real code would have
    +			// these calls sequentially, it would be more likely that the calls
    +			// to xSemaphoreGiveRecursive() would be called as a call stack
    +			// unwound.  This is just for demonstrative purposes.
    +            xSemaphoreGiveRecursive( xMutex );
    +			xSemaphoreGiveRecursive( xMutex );
    +			xSemaphoreGiveRecursive( xMutex );
    +
    +			// Now the mutex can be taken by other tasks.
    +        }
    +        else
    +        {
    +            // We could not obtain the mutex and can therefore not access
    +            // the shared resource safely.
    +        }
    +    }
    + }
    + 
    + * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#if( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) +#endif + +/** + * semphr. h + *
    + xSemaphoreGiveFromISR(
    +                          SemaphoreHandle_t xSemaphore,
    +                          BaseType_t *pxHigherPriorityTaskWoken
    +                      )
    + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: +
    + \#define LONG_TIME 0xffff
    + \#define TICKS_TO_WAIT	10
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    + // Repetitive task.
    + void vATask( void * pvParameters )
    + {
    +    for( ;; )
    +    {
    +        // We want this task to run every 10 ticks of a timer.  The semaphore
    +        // was created before this task was started.
    +
    +        // Block waiting for the semaphore to become available.
    +        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
    +        {
    +            // It is time to execute.
    +
    +            // ...
    +
    +            // We have finished our task.  Return to the top of the loop where
    +            // we will block on the semaphore until it is time to execute
    +            // again.  Note when using the semaphore for synchronisation with an
    +			// ISR in this manner there is no need to 'give' the semaphore back.
    +        }
    +    }
    + }
    +
    + // Timer ISR
    + void vTimerISR( void * pvParameters )
    + {
    + static uint8_t ucLocalTickCount = 0;
    + static BaseType_t xHigherPriorityTaskWoken;
    +
    +    // A timer tick has occurred.
    +
    +    // ... Do other time functions.
    +
    +    // Is it time for vATask () to run?
    +	xHigherPriorityTaskWoken = pdFALSE;
    +    ucLocalTickCount++;
    +    if( ucLocalTickCount >= TICKS_TO_WAIT )
    +    {
    +        // Unblock the task by releasing the semaphore.
    +        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
    +
    +        // Reset the count so we release the semaphore again in 10 ticks time.
    +        ucLocalTickCount = 0;
    +    }
    +
    +    if( xHigherPriorityTaskWoken != pdFALSE )
    +    {
    +        // We can force a context switch here.  Context switching from an
    +        // ISR uses port specific syntax.  Check the demo task for your port
    +        // to find the syntax required.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + *
    + xSemaphoreTakeFromISR(
    +                          SemaphoreHandle_t xSemaphore,
    +                          BaseType_t *pxHigherPriorityTaskWoken
    +                      )
    + * + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to xSemaphoreCreateBinary() or + * xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR, however taking a semaphore from an ISR + * is not a common operation. It is likely to only be useful when taking a + * counting semaphore when an interrupt is obtaining an object from a resource + * pool (when the semaphore count indicates the number of resources available). + * + * @param xSemaphore A handle to the semaphore being taken. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully taken, otherwise + * pdFALSE + */ +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateMutex( void )
    + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * http://www.freertos.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return If the mutex was successfully created then a handle to the created + * semaphore is returned. If there was not enough heap to allocate the mutex + * data structures then NULL is returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
    +    // This is a macro so pass the variable in directly.
    +    xSemaphore = xSemaphoreCreateMutex();
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer )
    + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * http://www.freertos.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will be used to hold the mutex's data structure, removing the need for + * the memory to be allocated dynamically. + * + * @return If the mutex was successfully created then a handle to the created + * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    + StaticSemaphore_t xMutexBuffer;
    +
    + void vATask( void * pvParameters )
    + {
    +    // A mutex cannot be used before it has been created.  xMutexBuffer is
    +    // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is
    +    // attempted.
    +    xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );
    +
    +    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
    +    // so there is no need to check it.
    + }
    + 
    + * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic + * \ingroup Semaphores + */ + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )
    + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * http://www.freertos.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    +
    + void vATask( void * pvParameters )
    + {
    +    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
    +    // This is a macro so pass the variable in directly.
    +    xSemaphore = xSemaphoreCreateRecursiveMutex();
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex + * \ingroup Semaphores + */ +#if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer )
    + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexs use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * http://www.freertos.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the recursive mutex's data structure, + * removing the need for the memory to be allocated dynamically. + * + * @return If the recursive mutex was successfully created then a handle to the + * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is + * returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    + StaticSemaphore_t xMutexBuffer;
    +
    + void vATask( void * pvParameters )
    + {
    +    // A recursive semaphore cannot be used before it is created.  Here a
    +    // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().
    +    // The address of xMutexBuffer is passed into the function, and will hold
    +    // the mutexes data structures - so no dynamic memory allocation will be
    +    // attempted.
    +    xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );
    +
    +    // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,
    +    // so there is no need to check it.
    + }
    + 
    + * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic + * \ingroup Semaphores + */ +#if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, pxStaticSemaphore ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount )
    + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * http://www.freertos.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer can + * instead optionally provide the memory that will get used by the counting + * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting + * semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    +
    + void vATask( void * pvParameters )
    + {
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    +    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
    +    // The max value to which the semaphore can count should be 10, and the
    +    // initial value assigned to the count should be 0.
    +    xSemaphore = xSemaphoreCreateCounting( 10, 0 );
    +
    +    if( xSemaphore != NULL )
    +    {
    +        // The semaphore was created successfully.
    +        // The semaphore can now be used.
    +    }
    + }
    + 
    + * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) +#endif + +/** + * semphr. h + *
    SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer )
    + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * http://www.freertos.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * http://www.freertos.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer must + * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a + * counting semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the counting semaphore was successfully created then a handle to + * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL + * then NULL is returned. + * + * Example usage: +
    + SemaphoreHandle_t xSemaphore;
    + StaticSemaphore_t xSemaphoreBuffer;
    +
    + void vATask( void * pvParameters )
    + {
    + SemaphoreHandle_t xSemaphore = NULL;
    +
    +    // Counting semaphore cannot be used before they have been created.  Create
    +    // a counting semaphore using xSemaphoreCreateCountingStatic().  The max
    +    // value to which the semaphore can count is 10, and the initial value
    +    // assigned to the count will be 0.  The address of xSemaphoreBuffer is
    +    // passed in and will be used to hold the semaphore structure, so no dynamic
    +    // memory allocation will be used.
    +    xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );
    +
    +    // No memory allocation was attempted so xSemaphore cannot be NULL, so there
    +    // is no need to check its value.
    + }
    + 
    + * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic + * \ingroup Semaphores + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + *
    void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
    + * + * Delete a semaphore. This function must be used with care. For example, + * do not delete a mutex type semaphore if the mutex is held by a task. + * + * @param xSemaphore A handle to the semaphore to be deleted. + * + * \defgroup vSemaphoreDelete vSemaphoreDelete + * \ingroup Semaphores + */ +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + *
    TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );
    + * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + * Note: This is a good way of determining if the calling task is the mutex + * holder, but not a good way of determining the identity of the mutex holder as + * the holder may change between the function exiting and the returned value + * being tested. + */ +#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) + +/** + * semphr.h + *
    TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex );
    + * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + */ +#define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) + +/** + * semphr.h + *
    UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );
    + * + * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) + +#endif /* SEMAPHORE_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h new file mode 100644 index 0000000..b5bac08 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h @@ -0,0 +1,129 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ + const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ + \ + if( ( pulStack[ 0 ] != ulCheckValue ) || \ + ( pulStack[ 1 ] != ulCheckValue ) || \ + ( pulStack[ 2 ] != ulCheckValue ) || \ + ( pulStack[ 3 ] != ulCheckValue ) ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + int8_t *pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ + static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +/* Remove stack overflow macro if not being used. */ +#ifndef taskCHECK_FOR_STACK_OVERFLOW + #define taskCHECK_FOR_STACK_OVERFLOW() +#endif + + + +#endif /* STACK_MACROS_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h new file mode 100644 index 0000000..a8b68ad --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h @@ -0,0 +1,859 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* + * Stream buffers are used to send a continuous stream of data from one task or + * interrupt to another. Their implementation is light weight, making them + * particularly suited for interrupt to task and core to core communication + * scenarios. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section section and set the + * receive block time to 0. + * + */ + +#ifndef STREAM_BUFFER_H +#define STREAM_BUFFER_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include stream_buffer.h" +#endif + +#if defined( __cplusplus ) +extern "C" { +#endif + +/** + * Type by which stream buffers are referenced. For example, a call to + * xStreamBufferCreate() returns an StreamBufferHandle_t variable that can + * then be used as a parameter to xStreamBufferSend(), xStreamBufferReceive(), + * etc. + */ +struct StreamBufferDef_t; +typedef struct StreamBufferDef_t * StreamBufferHandle_t; + + +/** + * message_buffer.h + * +
    +StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes );
    +
    + * + * Creates a new stream buffer using dynamically allocated memory. See + * xStreamBufferCreateStatic() for a version that uses statically allocated + * memory (memory that is allocated at compile time). + * + * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in + * FreeRTOSConfig.h for xStreamBufferCreate() to be available. + * + * @param xBufferSizeBytes The total number of bytes the stream buffer will be + * able to hold at any one time. + * + * @param xTriggerLevelBytes The number of bytes that must be in the stream + * buffer before a task that is blocked on the stream buffer to wait for data is + * moved out of the blocked state. For example, if a task is blocked on a read + * of an empty stream buffer that has a trigger level of 1 then the task will be + * unblocked when a single byte is written to the buffer or the task's block + * time expires. As another example, if a task is blocked on a read of an empty + * stream buffer that has a trigger level of 10 then the task will not be + * unblocked until the stream buffer contains at least 10 bytes or the task's + * block time expires. If a reading task's block time expires before the + * trigger level is reached then the task will still receive however many bytes + * are actually available. Setting a trigger level of 0 will result in a + * trigger level of 1 being used. It is not valid to specify a trigger level + * that is greater than the buffer size. + * + * @return If NULL is returned, then the stream buffer cannot be created + * because there is insufficient heap memory available for FreeRTOS to allocate + * the stream buffer data structures and storage area. A non-NULL value being + * returned indicates that the stream buffer has been created successfully - + * the returned value should be stored as the handle to the created stream + * buffer. + * + * Example use: +
    +
    +void vAFunction( void )
    +{
    +StreamBufferHandle_t xStreamBuffer;
    +const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10;
    +
    +    // Create a stream buffer that can hold 100 bytes.  The memory used to hold
    +    // both the stream buffer structure and the data in the stream buffer is
    +    // allocated dynamically.
    +    xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel );
    +
    +    if( xStreamBuffer == NULL )
    +    {
    +        // There was not enough heap memory space available to create the
    +        // stream buffer.
    +    }
    +    else
    +    {
    +        // The stream buffer was created successfully and can now be used.
    +    }
    +}
    +
    + * \defgroup xStreamBufferCreate xStreamBufferCreate + * \ingroup StreamBufferManagement + */ +#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE ) + +/** + * stream_buffer.h + * +
    +StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes,
    +                                                size_t xTriggerLevelBytes,
    +                                                uint8_t *pucStreamBufferStorageArea,
    +                                                StaticStreamBuffer_t *pxStaticStreamBuffer );
    +
    + * Creates a new stream buffer using statically allocated memory. See + * xStreamBufferCreate() for a version that uses dynamically allocated memory. + * + * configSUPPORT_STATIC_ALLOCATION must be set to 1 in FreeRTOSConfig.h for + * xStreamBufferCreateStatic() to be available. + * + * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the + * pucStreamBufferStorageArea parameter. + * + * @param xTriggerLevelBytes The number of bytes that must be in the stream + * buffer before a task that is blocked on the stream buffer to wait for data is + * moved out of the blocked state. For example, if a task is blocked on a read + * of an empty stream buffer that has a trigger level of 1 then the task will be + * unblocked when a single byte is written to the buffer or the task's block + * time expires. As another example, if a task is blocked on a read of an empty + * stream buffer that has a trigger level of 10 then the task will not be + * unblocked until the stream buffer contains at least 10 bytes or the task's + * block time expires. If a reading task's block time expires before the + * trigger level is reached then the task will still receive however many bytes + * are actually available. Setting a trigger level of 0 will result in a + * trigger level of 1 being used. It is not valid to specify a trigger level + * that is greater than the buffer size. + * + * @param pucStreamBufferStorageArea Must point to a uint8_t array that is at + * least xBufferSizeBytes + 1 big. This is the array to which streams are + * copied when they are written to the stream buffer. + * + * @param pxStaticStreamBuffer Must point to a variable of type + * StaticStreamBuffer_t, which will be used to hold the stream buffer's data + * structure. + * + * @return If the stream buffer is created successfully then a handle to the + * created stream buffer is returned. If either pucStreamBufferStorageArea or + * pxStaticstreamBuffer are NULL then NULL is returned. + * + * Example use: +
    +
    +// Used to dimension the array used to hold the streams.  The available space
    +// will actually be one less than this, so 999.
    +#define STORAGE_SIZE_BYTES 1000
    +
    +// Defines the memory that will actually hold the streams within the stream
    +// buffer.
    +static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];
    +
    +// The variable used to hold the stream buffer structure.
    +StaticStreamBuffer_t xStreamBufferStruct;
    +
    +void MyFunction( void )
    +{
    +StreamBufferHandle_t xStreamBuffer;
    +const size_t xTriggerLevel = 1;
    +
    +    xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucBufferStorage ),
    +                                               xTriggerLevel,
    +                                               ucBufferStorage,
    +                                               &xStreamBufferStruct );
    +
    +    // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer
    +    // parameters were NULL, xStreamBuffer will not be NULL, and can be used to
    +    // reference the created stream buffer in other stream buffer API calls.
    +
    +    // Other code that uses the stream buffer can go here.
    +}
    +
    +
    + * \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic + * \ingroup StreamBufferManagement + */ +#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE, pucStreamBufferStorageArea, pxStaticStreamBuffer ) + +/** + * stream_buffer.h + * +
    +size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,
    +                          const void *pvTxData,
    +                          size_t xDataLengthBytes,
    +                          TickType_t xTicksToWait );
    +
    + * + * Sends bytes to a stream buffer. The bytes are copied into the stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferSend() to write to a stream buffer from a task. Use + * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt + * service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer to which a stream is + * being sent. + * + * @param pvTxData A pointer to the buffer that holds the bytes to be copied + * into the stream buffer. + * + * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData + * into the stream buffer. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for enough space to become available in the stream + * buffer, should the stream buffer contain too little space to hold the + * another xDataLengthBytes bytes. The block time is specified in tick periods, + * so the absolute time it represents is dependent on the tick frequency. The + * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds + * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will + * cause the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. If a task times out + * before it can write all xDataLengthBytes into the buffer it will still write + * as many bytes as possible. A task does not use any CPU time when it is in + * the blocked state. + * + * @return The number of bytes written to the stream buffer. If a task times + * out before it can write all xDataLengthBytes into the buffer it will still + * write as many bytes as possible. + * + * Example use: +
    +void vAFunction( StreamBufferHandle_t xStreamBuffer )
    +{
    +size_t xBytesSent;
    +uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };
    +char *pcStringToSend = "String to send";
    +const TickType_t x100ms = pdMS_TO_TICKS( 100 );
    +
    +    // Send an array to the stream buffer, blocking for a maximum of 100ms to
    +    // wait for enough space to be available in the stream buffer.
    +    xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );
    +
    +    if( xBytesSent != sizeof( ucArrayToSend ) )
    +    {
    +        // The call to xStreamBufferSend() times out before there was enough
    +        // space in the buffer for the data to be written, but it did
    +        // successfully write xBytesSent bytes.
    +    }
    +
    +    // Send the string to the stream buffer.  Return immediately if there is not
    +    // enough space in the buffer.
    +    xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );
    +
    +    if( xBytesSent != strlen( pcStringToSend ) )
    +    {
    +        // The entire string could not be added to the stream buffer because
    +        // there was not enough free space in the buffer, but xBytesSent bytes
    +        // were sent.  Could try again to send the remaining bytes.
    +    }
    +}
    +
    + * \defgroup xStreamBufferSend xStreamBufferSend + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void *pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,
    +                                 const void *pvTxData,
    +                                 size_t xDataLengthBytes,
    +                                 BaseType_t *pxHigherPriorityTaskWoken );
    +
    + * + * Interrupt safe version of the API function that sends a stream of bytes to + * the stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferSend() to write to a stream buffer from a task. Use + * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt + * service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer to which a stream is + * being sent. + * + * @param pvTxData A pointer to the data that is to be copied into the stream + * buffer. + * + * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData + * into the stream buffer. + * + * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will + * have a task blocked on it waiting for data. Calling + * xStreamBufferSendFromISR() can make data available, and so cause a task that + * was waiting for data to leave the Blocked state. If calling + * xStreamBufferSendFromISR() causes a task to leave the Blocked state, and the + * unblocked task has a priority higher than the currently executing task (the + * task that was interrupted), then, internally, xStreamBufferSendFromISR() + * will set *pxHigherPriorityTaskWoken to pdTRUE. If + * xStreamBufferSendFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. This will + * ensure that the interrupt returns directly to the highest priority Ready + * state task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it + * is passed into the function. See the example code below for an example. + * + * @return The number of bytes actually written to the stream buffer, which will + * be less than xDataLengthBytes if the stream buffer didn't have enough free + * space for all the bytes to be written. + * + * Example use: +
    +// A stream buffer that has already been created.
    +StreamBufferHandle_t xStreamBuffer;
    +
    +void vAnInterruptServiceRoutine( void )
    +{
    +size_t xBytesSent;
    +char *pcStringToSend = "String to send";
    +BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.
    +
    +    // Attempt to send the string to the stream buffer.
    +    xBytesSent = xStreamBufferSendFromISR( xStreamBuffer,
    +                                           ( void * ) pcStringToSend,
    +                                           strlen( pcStringToSend ),
    +                                           &xHigherPriorityTaskWoken );
    +
    +    if( xBytesSent != strlen( pcStringToSend ) )
    +    {
    +        // There was not enough free space in the stream buffer for the entire
    +        // string to be written, ut xBytesSent bytes were written.
    +    }
    +
    +    // If xHigherPriorityTaskWoken was set to pdTRUE inside
    +    // xStreamBufferSendFromISR() then a task that has a priority above the
    +    // priority of the currently executing task was unblocked and a context
    +    // switch should be performed to ensure the ISR returns to the unblocked
    +    // task.  In most FreeRTOS ports this is done by simply passing
    +    // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
    +    // variables value, and perform the context switch if necessary.  Check the
    +    // documentation for the port in use for port specific instructions.
    +    taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
    +}
    +
    + * \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + const void *pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,
    +                             void *pvRxData,
    +                             size_t xBufferLengthBytes,
    +                             TickType_t xTicksToWait );
    +
    + * + * Receives bytes from a stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferReceive() to read from a stream buffer from a task. Use + * xStreamBufferReceiveFromISR() to read from a stream buffer from an + * interrupt service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer from which bytes are to + * be received. + * + * @param pvRxData A pointer to the buffer into which the received bytes will be + * copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the + * pvRxData parameter. This sets the maximum number of bytes to receive in one + * call. xStreamBufferReceive will return as many bytes as possible up to a + * maximum set by xBufferLengthBytes. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for data to become available if the stream buffer is + * empty. xStreamBufferReceive() will return immediately if xTicksToWait is + * zero. The block time is specified in tick periods, so the absolute time it + * represents is dependent on the tick frequency. The macro pdMS_TO_TICKS() can + * be used to convert a time specified in milliseconds into a time specified in + * ticks. Setting xTicksToWait to portMAX_DELAY will cause the task to wait + * indefinitely (without timing out), provided INCLUDE_vTaskSuspend is set to 1 + * in FreeRTOSConfig.h. A task does not use any CPU time when it is in the + * Blocked state. + * + * @return The number of bytes actually read from the stream buffer, which will + * be less than xBufferLengthBytes if the call to xStreamBufferReceive() timed + * out before xBufferLengthBytes were available. + * + * Example use: +
    +void vAFunction( StreamBuffer_t xStreamBuffer )
    +{
    +uint8_t ucRxData[ 20 ];
    +size_t xReceivedBytes;
    +const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );
    +
    +    // Receive up to another sizeof( ucRxData ) bytes from the stream buffer.
    +    // Wait in the Blocked state (so not using any CPU processing time) for a
    +    // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be
    +    // available.
    +    xReceivedBytes = xStreamBufferReceive( xStreamBuffer,
    +                                           ( void * ) ucRxData,
    +                                           sizeof( ucRxData ),
    +                                           xBlockTime );
    +
    +    if( xReceivedBytes > 0 )
    +    {
    +        // A ucRxData contains another xRecievedBytes bytes of data, which can
    +        // be processed here....
    +    }
    +}
    +
    + * \defgroup xStreamBufferReceive xStreamBufferReceive + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void *pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,
    +                                    void *pvRxData,
    +                                    size_t xBufferLengthBytes,
    +                                    BaseType_t *pxHigherPriorityTaskWoken );
    +
    + * + * An interrupt safe version of the API function that receives bytes from a + * stream buffer. + * + * Use xStreamBufferReceive() to read bytes from a stream buffer from a task. + * Use xStreamBufferReceiveFromISR() to read bytes from a stream buffer from an + * interrupt service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer from which a stream + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received bytes are + * copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the + * pvRxData parameter. This sets the maximum number of bytes to receive in one + * call. xStreamBufferReceive will return as many bytes as possible up to a + * maximum set by xBufferLengthBytes. + * + * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will + * have a task blocked on it waiting for space to become available. Calling + * xStreamBufferReceiveFromISR() can make space available, and so cause a task + * that is waiting for space to leave the Blocked state. If calling + * xStreamBufferReceiveFromISR() causes a task to leave the Blocked state, and + * the unblocked task has a priority higher than the currently executing task + * (the task that was interrupted), then, internally, + * xStreamBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. + * If xStreamBufferReceiveFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. That will + * ensure the interrupt returns directly to the highest priority Ready state + * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is + * passed into the function. See the code example below for an example. + * + * @return The number of bytes read from the stream buffer, if any. + * + * Example use: +
    +// A stream buffer that has already been created.
    +StreamBuffer_t xStreamBuffer;
    +
    +void vAnInterruptServiceRoutine( void )
    +{
    +uint8_t ucRxData[ 20 ];
    +size_t xReceivedBytes;
    +BaseType_t xHigherPriorityTaskWoken = pdFALSE;  // Initialised to pdFALSE.
    +
    +    // Receive the next stream from the stream buffer.
    +    xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer,
    +                                                  ( void * ) ucRxData,
    +                                                  sizeof( ucRxData ),
    +                                                  &xHigherPriorityTaskWoken );
    +
    +    if( xReceivedBytes > 0 )
    +    {
    +        // ucRxData contains xReceivedBytes read from the stream buffer.
    +        // Process the stream here....
    +    }
    +
    +    // If xHigherPriorityTaskWoken was set to pdTRUE inside
    +    // xStreamBufferReceiveFromISR() then a task that has a priority above the
    +    // priority of the currently executing task was unblocked and a context
    +    // switch should be performed to ensure the ISR returns to the unblocked
    +    // task.  In most FreeRTOS ports this is done by simply passing
    +    // xHigherPriorityTaskWoken into taskYIELD_FROM_ISR(), which will test the
    +    // variables value, and perform the context switch if necessary.  Check the
    +    // documentation for the port in use for port specific instructions.
    +    taskYIELD_FROM_ISR( xHigherPriorityTaskWoken );
    +}
    +
    + * \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + void *pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );
    +
    + * + * Deletes a stream buffer that was previously created using a call to + * xStreamBufferCreate() or xStreamBufferCreateStatic(). If the stream + * buffer was created using dynamic memory (that is, by xStreamBufferCreate()), + * then the allocated memory is freed. + * + * A stream buffer handle must not be used after the stream buffer has been + * deleted. + * + * @param xStreamBuffer The handle of the stream buffer to be deleted. + * + * \defgroup vStreamBufferDelete vStreamBufferDelete + * \ingroup StreamBufferManagement + */ +void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );
    +
    + * + * Queries a stream buffer to see if it is full. A stream buffer is full if it + * does not have any free space, and therefore cannot accept any more data. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return If the stream buffer is full then pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferIsFull xStreamBufferIsFull + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer );
    +
    + * + * Queries a stream buffer to see if it is empty. A stream buffer is empty if + * it does not contain any data. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return If the stream buffer is empty then pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferIsEmpty xStreamBufferIsEmpty + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer );
    +
    + * + * Resets a stream buffer to its initial, empty, state. Any data that was in + * the stream buffer is discarded. A stream buffer can only be reset if there + * are no tasks blocked waiting to either send to or receive from the stream + * buffer. + * + * @param xStreamBuffer The handle of the stream buffer being reset. + * + * @return If the stream buffer is reset then pdPASS is returned. If there was + * a task blocked waiting to send to or read from the stream buffer then the + * stream buffer is not reset and pdFAIL is returned. + * + * \defgroup xStreamBufferReset xStreamBufferReset + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer );
    +
    + * + * Queries a stream buffer to see how much free space it contains, which is + * equal to the amount of data that can be sent to the stream buffer before it + * is full. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return The number of bytes that can be written to the stream buffer before + * the stream buffer would be full. + * + * \defgroup xStreamBufferSpacesAvailable xStreamBufferSpacesAvailable + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer );
    +
    + * + * Queries a stream buffer to see how much data it contains, which is equal to + * the number of bytes that can be read from the stream buffer before the stream + * buffer would be empty. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return The number of bytes that can be read from the stream buffer before + * the stream buffer would be empty. + * + * \defgroup xStreamBufferBytesAvailable xStreamBufferBytesAvailable + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel );
    +
    + * + * A stream buffer's trigger level is the number of bytes that must be in the + * stream buffer before a task that is blocked on the stream buffer to + * wait for data is moved out of the blocked state. For example, if a task is + * blocked on a read of an empty stream buffer that has a trigger level of 1 + * then the task will be unblocked when a single byte is written to the buffer + * or the task's block time expires. As another example, if a task is blocked + * on a read of an empty stream buffer that has a trigger level of 10 then the + * task will not be unblocked until the stream buffer contains at least 10 bytes + * or the task's block time expires. If a reading task's block time expires + * before the trigger level is reached then the task will still receive however + * many bytes are actually available. Setting a trigger level of 0 will result + * in a trigger level of 1 being used. It is not valid to specify a trigger + * level that is greater than the buffer size. + * + * A trigger level is set when the stream buffer is created, and can be modified + * using xStreamBufferSetTriggerLevel(). + * + * @param xStreamBuffer The handle of the stream buffer being updated. + * + * @param xTriggerLevel The new trigger level for the stream buffer. + * + * @return If xTriggerLevel was less than or equal to the stream buffer's length + * then the trigger level will be updated and pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
    +
    + * + * For advanced users only. + * + * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is sent to a message buffer or stream buffer. If there was a task that + * was blocked on the message or stream buffer waiting for data to arrive then + * the sbSEND_COMPLETED() macro sends a notification to the task to remove it + * from the Blocked state. xStreamBufferSendCompletedFromISR() does the same + * thing. It is provided to enable application writers to implement their own + * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer to which data was + * written. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xStreamBufferSendCompletedFromISR(). If calling + * xStreamBufferSendCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * +
    +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );
    +
    + * + * For advanced users only. + * + * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is read out of a message buffer or stream buffer. If there was a task + * that was blocked on the message or stream buffer waiting for data to arrive + * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to + * remove it from the Blocked state. xStreamBufferReceiveCompletedFromISR() + * does the same thing. It is provided to enable application writers to + * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT + * ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer from which data was + * read. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xStreamBufferReceiveCompletedFromISR(). If calling + * xStreamBufferReceiveCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* Functions below here are not part of the public API. */ +StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer ) PRIVILEGED_FUNCTION; + +StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer ) PRIVILEGED_FUNCTION; + +size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +#if( configUSE_TRACE_FACILITY == 1 ) + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; +#endif + +#if defined( __cplusplus ) +} +#endif + +#endif /* !defined( STREAM_BUFFER_H ) */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/task.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/task.h new file mode 100644 index 0000000..b0cc60b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/task.h @@ -0,0 +1,2543 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + + +#ifndef INC_TASK_H +#define INC_TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +#define tskKERNEL_VERSION_NUMBER "V10.3.1" +#define tskKERNEL_VERSION_MAJOR 10 +#define tskKERNEL_VERSION_MINOR 3 +#define tskKERNEL_VERSION_BUILD 1 + +/* MPU region parameters passed in ulParameters + * of MemoryRegion_t struct. */ +#define tskMPU_REGION_READ_ONLY ( 1UL << 0UL ) +#define tskMPU_REGION_READ_WRITE ( 1UL << 1UL ) +#define tskMPU_REGION_EXECUTE_NEVER ( 1UL << 2UL ) +#define tskMPU_REGION_NORMAL_MEMORY ( 1UL << 3UL ) +#define tskMPU_REGION_DEVICE_MEMORY ( 1UL << 4UL ) + +/** + * task. h + * + * Type by which tasks are referenced. For example, a call to xTaskCreate + * returns (via a pointer parameter) an TaskHandle_t variable that can then + * be used as a parameter to vTaskDelete to delete the task. + * + * \defgroup TaskHandle_t TaskHandle_t + * \ingroup Tasks + */ +struct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct tskTaskControlBlock* TaskHandle_t; + +/* + * Defines the prototype to which the application task hook function must + * conform. + */ +typedef BaseType_t (*TaskHookFunction_t)( void * ); + +/* Task states returned by eTaskGetState. */ +typedef enum +{ + eRunning = 0, /* A task is querying the state of itself, so must be running. */ + eReady, /* The task being queried is in a read or pending ready list. */ + eBlocked, /* The task being queried is in the Blocked state. */ + eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ + eInvalid /* Used as an 'invalid state' value. */ +} eTaskState; + +/* Actions that can be performed when vTaskNotify() is called. */ +typedef enum +{ + eNoAction = 0, /* Notify the task without updating its notify value. */ + eSetBits, /* Set bits in the task's notification value. */ + eIncrement, /* Increment the task's notification value. */ + eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ + eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ +} eNotifyAction; + +/* + * Used internally only. + */ +typedef struct xTIME_OUT +{ + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; +} TimeOut_t; + +/* + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void *pvBaseAddress; + uint32_t ulLengthInBytes; + uint32_t ulParameters; +} MemoryRegion_t; + +/* + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMETERS +{ + TaskFunction_t pvTaskCode; + const char * const pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + configSTACK_DEPTH_TYPE usStackDepth; + void *pvParameters; + UBaseType_t uxPriority; + StackType_t *puxStackBuffer; + MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; + #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + StaticTask_t * const pxTaskBuffer; + #endif +} TaskParameters_t; + +/* Used with the uxTaskGetSystemState() function to return the state of each task +in the system. */ +typedef struct xTASK_STATUS +{ + TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ + const char *pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + UBaseType_t xTaskNumber; /* A number unique to the task. */ + eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ + UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ + UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ + uint32_t ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ + StackType_t *pxStackBase; /* Points to the lowest address of the task's stack area. */ + configSTACK_DEPTH_TYPE usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ +} TaskStatus_t; + +/* Possible return values for eTaskConfirmSleepModeStatus(). */ +typedef enum +{ + eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ + eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ + eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ +} eSleepModeStatus; + +/** + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \defgroup taskYIELD taskYIELD + * \ingroup SchedulerControl + */ +#define taskYIELD() portYIELD() + +/** + * task. h + * + * Macro to mark the start of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL + * \ingroup SchedulerControl + */ +#define taskENTER_CRITICAL() portENTER_CRITICAL() +#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + +/** + * task. h + * + * Macro to mark the end of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL + * \ingroup SchedulerControl + */ +#define taskEXIT_CRITICAL() portEXIT_CRITICAL() +#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() + +/* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is +0 to generate more optimal code when configASSERT() is defined as the constant +is used in assert() statements. */ +#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) +#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) +#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) + + +/*----------------------------------------------------------- + * TASK CREATION API + *----------------------------------------------------------*/ + +/** + * task. h + *
    + BaseType_t xTaskCreate(
    +							  TaskFunction_t pvTaskCode,
    +							  const char * const pcName,
    +							  configSTACK_DEPTH_TYPE usStackDepth,
    +							  void *pvParameters,
    +							  UBaseType_t uxPriority,
    +							  TaskHandle_t *pvCreatedTask
    +						  );
    + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * http://www.freertos.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * See xTaskCreateStatic() for a version that does not use any dynamic memory + * allocation. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pvCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: +
    + // Task to be created.
    + void vTaskCode( void * pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		 // Task code goes here.
    +	 }
    + }
    +
    + // Function that creates a task.
    + void vOtherFunction( void )
    + {
    + static uint8_t ucParameterToPass;
    + TaskHandle_t xHandle = NULL;
    +
    +	 // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass
    +	 // must exist for the lifetime of the task, so in this case is declared static.  If it was just an
    +	 // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
    +	 // the new task attempts to access it.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
    +	 configASSERT( xHandle );
    +
    +	 // Use the handle to delete the task.
    +	 if( xHandle != NULL )
    +	 {
    +	 	vTaskDelete( xHandle );
    +	 }
    + }
    +   
    + * \defgroup xTaskCreate xTaskCreate + * \ingroup Tasks + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + *
    + TaskHandle_t xTaskCreateStatic( TaskFunction_t pvTaskCode,
    +								 const char * const pcName,
    +								 uint32_t ulStackDepth,
    +								 void *pvParameters,
    +								 UBaseType_t uxPriority,
    +								 StackType_t *pxStackBuffer,
    +								 StaticTask_t *pxTaskBuffer );
    + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * http://www.freertos.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. The maximum length of the string is defined by + * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. + * + * @param ulStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 32-bits wide and ulStackDepth is defined as 100 then 400 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task will run. + * + * @param pxStackBuffer Must point to a StackType_t array that has at least + * ulStackDepth indexes - the array will then be used as the task's stack, + * removing the need for the stack to be allocated dynamically. + * + * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will + * then be used to hold the task's data structures, removing the need for the + * memory to be allocated dynamically. + * + * @return If neither pxStackBuffer or pxTaskBuffer are NULL, then the task will + * be created and a handle to the created task is returned. If either + * pxStackBuffer or pxTaskBuffer are NULL then the task will not be created and + * NULL is returned. + * + * Example usage: +
    +
    +    // Dimensions the buffer that the task being created will use as its stack.
    +    // NOTE:  This is the number of words the stack will hold, not the number of
    +    // bytes.  For example, if each stack item is 32-bits, and this is set to 100,
    +    // then 400 bytes (100 * 32-bits) will be allocated.
    +    #define STACK_SIZE 200
    +
    +    // Structure that will hold the TCB of the task being created.
    +    StaticTask_t xTaskBuffer;
    +
    +    // Buffer that the task being created will use as its stack.  Note this is
    +    // an array of StackType_t variables.  The size of StackType_t is dependent on
    +    // the RTOS port.
    +    StackType_t xStack[ STACK_SIZE ];
    +
    +    // Function that implements the task being created.
    +    void vTaskCode( void * pvParameters )
    +    {
    +        // The parameter value is expected to be 1 as 1 is passed in the
    +        // pvParameters value in the call to xTaskCreateStatic().
    +        configASSERT( ( uint32_t ) pvParameters == 1UL );
    +
    +        for( ;; )
    +        {
    +            // Task code goes here.
    +        }
    +    }
    +
    +    // Function that creates a task.
    +    void vOtherFunction( void )
    +    {
    +        TaskHandle_t xHandle = NULL;
    +
    +        // Create the task without using any dynamic memory allocation.
    +        xHandle = xTaskCreateStatic(
    +                      vTaskCode,       // Function that implements the task.
    +                      "NAME",          // Text name for the task.
    +                      STACK_SIZE,      // Stack size in words, not bytes.
    +                      ( void * ) 1,    // Parameter passed into the task.
    +                      tskIDLE_PRIORITY,// Priority at which the task is created.
    +                      xStack,          // Array to use as the task's stack.
    +                      &xTaskBuffer );  // Variable to hold the task's data structure.
    +
    +        // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have
    +        // been created, and xHandle will be the task's handle.  Use the handle
    +        // to suspend the task.
    +        vTaskSuspend( xHandle );
    +    }
    +   
    + * \defgroup xTaskCreateStatic xTaskCreateStatic + * \ingroup Tasks + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * task. h + *
    + BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );
    + * + * Only available when configSUPPORT_DYNAMIC_ALLOCATION is set to 1. + * + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * See xTaskCreateRestrictedStatic() for a version that does not use any + * dynamic memory allocation. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: +
    +// Create an TaskParameters_t structure that defines the task to be created.
    +static const TaskParameters_t xCheckTaskParameters =
    +{
    +	vATask,		// pvTaskCode - the function that implements the task.
    +	"ATask",	// pcName - just a text name for the task to assist debugging.
    +	100,		// usStackDepth	- the stack size DEFINED IN WORDS.
    +	NULL,		// pvParameters - passed into the task function as the function parameters.
    +	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.
    +	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.
    +
    +	// xRegions - Allocate up to three separate memory regions for access by
    +	// the task, with appropriate access permissions.  Different processors have
    +	// different memory alignment requirements - refer to the FreeRTOS documentation
    +	// for full information.
    +	{
    +		// Base address					Length	Parameters
    +		{ cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },
    +		{ cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },
    +		{ cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }
    +	}
    +};
    +
    +int main( void )
    +{
    +TaskHandle_t xHandle;
    +
    +	// Create a task from the const structure defined above.  The task handle
    +	// is requested (the second parameter is not NULL) but in this case just for
    +	// demonstration purposes as its not actually used.
    +	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );
    +
    +	// Start the scheduler.
    +	vTaskStartScheduler();
    +
    +	// Will only get here if there was insufficient memory to create the idle
    +	// and/or timer task.
    +	for( ;; );
    +}
    +   
    + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + *
    + BaseType_t xTaskCreateRestrictedStatic( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );
    + * + * Only available when configSUPPORT_STATIC_ALLOCATION is set to 1. + * + * xTaskCreateRestrictedStatic() should only be used in systems that include an + * MPU implementation. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreateRestricted() then the stack is provided by the application writer, + * and the memory used to hold the task's data structure is automatically + * dynamically allocated inside the xTaskCreateRestricted() function. If a task + * is created using xTaskCreateRestrictedStatic() then the application writer + * must provide the memory used to hold the task's data structures too. + * xTaskCreateRestrictedStatic() therefore allows a memory protected task to be + * created without using any dynamic memory allocation. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. If configSUPPORT_STATIC_ALLOCATION is set to 1 the structure + * contains an additional member, which is used to point to a variable of type + * StaticTask_t - which is then used to hold the task's data structure. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: +
    +// Create an TaskParameters_t structure that defines the task to be created.
    +// The StaticTask_t variable is only included in the structure when
    +// configSUPPORT_STATIC_ALLOCATION is set to 1.  The PRIVILEGED_DATA macro can
    +// be used to force the variable into the RTOS kernel's privileged data area.
    +static PRIVILEGED_DATA StaticTask_t xTaskBuffer;
    +static const TaskParameters_t xCheckTaskParameters =
    +{
    +	vATask,		// pvTaskCode - the function that implements the task.
    +	"ATask",	// pcName - just a text name for the task to assist debugging.
    +	100,		// usStackDepth	- the stack size DEFINED IN WORDS.
    +	NULL,		// pvParameters - passed into the task function as the function parameters.
    +	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.
    +	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.
    +
    +	// xRegions - Allocate up to three separate memory regions for access by
    +	// the task, with appropriate access permissions.  Different processors have
    +	// different memory alignment requirements - refer to the FreeRTOS documentation
    +	// for full information.
    +	{
    +		// Base address					Length	Parameters
    +		{ cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },
    +		{ cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },
    +		{ cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }
    +	}
    +
    +	&xTaskBuffer; // Holds the task's data structure.
    +};
    +
    +int main( void )
    +{
    +TaskHandle_t xHandle;
    +
    +	// Create a task from the const structure defined above.  The task handle
    +	// is requested (the second parameter is not NULL) but in this case just for
    +	// demonstration purposes as its not actually used.
    +	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );
    +
    +	// Start the scheduler.
    +	vTaskStartScheduler();
    +
    +	// Will only get here if there was insufficient memory to create the idle
    +	// and/or timer task.
    +	for( ;; );
    +}
    +   
    + * \defgroup xTaskCreateRestrictedStatic xTaskCreateRestrictedStatic + * \ingroup Tasks + */ +#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + *
    + void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions );
    + * + * Memory regions are assigned to a restricted task when the task is created by + * a call to xTaskCreateRestricted(). These regions can be redefined using + * vTaskAllocateMPURegions(). + * + * @param xTask The handle of the task being updated. + * + * @param xRegions A pointer to an MemoryRegion_t structure that contains the + * new memory region definitions. + * + * Example usage: +
    +// Define an array of MemoryRegion_t structures that configures an MPU region
    +// allowing read/write access for 1024 bytes starting at the beginning of the
    +// ucOneKByte array.  The other two of the maximum 3 definable regions are
    +// unused so set to zero.
    +static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =
    +{
    +	// Base address		Length		Parameters
    +	{ ucOneKByte,		1024,		portMPU_REGION_READ_WRITE },
    +	{ 0,				0,			0 },
    +	{ 0,				0,			0 }
    +};
    +
    +void vATask( void *pvParameters )
    +{
    +	// This task was created such that it has access to certain regions of
    +	// memory as defined by the MPU configuration.  At some point it is
    +	// desired that these MPU regions are replaced with that defined in the
    +	// xAltRegions const struct above.  Use a call to vTaskAllocateMPURegions()
    +	// for this purpose.  NULL is used as the task handle to indicate that this
    +	// function should modify the MPU regions of the calling task.
    +	vTaskAllocateMPURegions( NULL, xAltRegions );
    +
    +	// Now the task can continue its function, but from this point on can only
    +	// access its stack and the ucOneKByte array (unless any other statically
    +	// defined or shared regions have been declared elsewhere).
    +}
    +   
    + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskDelete( TaskHandle_t xTask );
    + * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Remove a task from the RTOS real time kernel's management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * + * NOTE: The idle task is responsible for freeing the kernel allocated + * memory from tasks that have been deleted. It is therefore important that + * the idle task is not starved of microcontroller processing time if your + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param xTask The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: +
    + void vOtherFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create the task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // Use the handle to delete the task.
    +	 vTaskDelete( xHandle );
    + }
    +   
    + * \defgroup vTaskDelete vTaskDelete + * \ingroup Tasks + */ +void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK CONTROL API + *----------------------------------------------------------*/ + +/** + * task. h + *
    void vTaskDelay( const TickType_t xTicksToDelay );
    + * + * Delay a task for a given number of ticks. The actual time that the + * task remains blocked depends on the tick rate. The constant + * portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * + * vTaskDelay() specifies a time at which the task wishes to unblock relative to + * the time at which vTaskDelay() is called. For example, specifying a block + * period of 100 ticks will cause the task to unblock 100 ticks after + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a periodic task as the path taken through the + * code, as well as other task and interrupt activity, will effect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See vTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + + void vTaskFunction( void * pvParameters ) + { + // Block for 500ms. + const TickType_t xDelay = 500 / portTICK_PERIOD_MS; + + for( ;; ) + { + // Simply toggle the LED every 500ms, blocking between each toggle. + vToggleLED(); + vTaskDelay( xDelay ); + } + } + + * \defgroup vTaskDelay vTaskDelay + * \ingroup TaskCtrl + */ +void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );
    + * + * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Delay a task until a specified time. This function can be used by periodic + * tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The constant portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within vTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * Example usage: +
    + // Perform an action every 10 ticks.
    + void vTaskFunction( void * pvParameters )
    + {
    + TickType_t xLastWakeTime;
    + const TickType_t xFrequency = 10;
    +
    +	 // Initialise the xLastWakeTime variable with the current time.
    +	 xLastWakeTime = xTaskGetTickCount ();
    +	 for( ;; )
    +	 {
    +		 // Wait for the next cycle.
    +		 vTaskDelayUntil( &xLastWakeTime, xFrequency );
    +
    +		 // Perform action here.
    +	 }
    + }
    +   
    + * \defgroup vTaskDelayUntil vTaskDelayUntil + * \ingroup TaskCtrl + */ +void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    BaseType_t xTaskAbortDelay( TaskHandle_t xTask );
    + * + * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this + * function to be available. + * + * A task will enter the Blocked state when it is waiting for an event. The + * event it is waiting for can be a temporal event (waiting for a time), such + * as when vTaskDelay() is called, or an event on an object, such as when + * xQueueReceive() or ulTaskNotifyTake() is called. If the handle of a task + * that is in the Blocked state is used in a call to xTaskAbortDelay() then the + * task will leave the Blocked state, and return from whichever function call + * placed the task into the Blocked state. + * + * There is no 'FromISR' version of this function as an interrupt would need to + * know which object a task was blocked on in order to know which actions to + * take. For example, if the task was blocked on a queue the interrupt handler + * would then need to know if the queue was locked. + * + * @param xTask The handle of the task to remove from the Blocked state. + * + * @return If the task referenced by xTask was not in the Blocked state then + * pdFAIL is returned. Otherwise pdPASS is returned. + * + * \defgroup xTaskAbortDelay xTaskAbortDelay + * \ingroup TaskCtrl + */ +BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
    + * + * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the priority of any task. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of xTask. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create a task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // ...
    +
    +	 // Use the handle to obtain the priority of the created task.
    +	 // It was created with tskIDLE_PRIORITY, but may have changed
    +	 // it itself.
    +	 if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
    +	 {
    +		 // The task has changed it's priority.
    +	 }
    +
    +	 // ...
    +
    +	 // Is our priority higher than the created task?
    +	 if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )
    +	 {
    +		 // Our priority (obtained using NULL handle) is higher.
    +	 }
    + }
    +   
    + * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * \ingroup TaskCtrl + */ +UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );
    + * + * A version of uxTaskPriorityGet() that can be used from an ISR. + */ +UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    eTaskState eTaskGetState( TaskHandle_t xTask );
    + * + * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the state of any task. States are encoded by the eTaskState + * enumerated type. + * + * @param xTask Handle of the task to be queried. + * + * @return The state of xTask at the time the function was called. Note the + * state of the task might change between the function being called, and the + * functions return value being tested by the calling task. + */ +eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
    + * + * configUSE_TRACE_FACILITY must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * Populates a TaskStatus_t structure with information about a task. + * + * @param xTask Handle of the task being queried. If xTask is NULL then + * information will be returned about the calling task. + * + * @param pxTaskStatus A pointer to the TaskStatus_t structure that will be + * filled with information about the task referenced by the handle passed using + * the xTask parameter. + * + * @xGetFreeStackSpace The TaskStatus_t structure contains a member to report + * the stack high water mark of the task being queried. Calculating the stack + * high water mark takes a relatively long time, and can make the system + * temporarily unresponsive - so the xGetFreeStackSpace parameter is provided to + * allow the high water mark checking to be skipped. The high watermark value + * will only be written to the TaskStatus_t structure if xGetFreeStackSpace is + * not set to pdFALSE; + * + * @param eState The TaskStatus_t structure contains a member to report the + * state of the task being queried. Obtaining the task state is not as fast as + * a simple assignment - so the eState parameter is provided to allow the state + * information to be omitted from the TaskStatus_t structure. To obtain state + * information then set eState to eInvalid - otherwise the value passed in + * eState will be reported as the task state in the TaskStatus_t structure. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    + TaskStatus_t xTaskDetails;
    +
    +    // Obtain the handle of a task from its name.
    +    xHandle = xTaskGetHandle( "Task_Name" );
    +
    +    // Check the handle is not NULL.
    +    configASSERT( xHandle );
    +
    +    // Use the handle to obtain further information about the task.
    +    vTaskGetInfo( xHandle,
    +                  &xTaskDetails,
    +                  pdTRUE, // Include the high water mark in xTaskDetails.
    +                  eInvalid ); // Include the task state in xTaskDetails.
    + }
    +   
    + * \defgroup vTaskGetInfo vTaskGetInfo + * \ingroup TaskCtrl + */ +void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
    + * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Set the priority of any task. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param xTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create a task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // ...
    +
    +	 // Use the handle to raise the priority of the created task.
    +	 vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
    +
    +	 // ...
    +
    +	 // Use a NULL handle to raise our priority to the same value.
    +	 vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
    + }
    +   
    + * \defgroup vTaskPrioritySet vTaskPrioritySet + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskSuspend( TaskHandle_t xTaskToSuspend );
    + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Suspend any task. When suspended a task will never get any microcontroller + * processing time, no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create a task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // ...
    +
    +	 // Use the handle to suspend the created task.
    +	 vTaskSuspend( xHandle );
    +
    +	 // ...
    +
    +	 // The created task will not run during this period, unless
    +	 // another task calls vTaskResume( xHandle ).
    +
    +	 //...
    +
    +
    +	 // Suspend ourselves.
    +	 vTaskSuspend( NULL );
    +
    +	 // We cannot get here unless another task calls vTaskResume
    +	 // with our handle as the parameter.
    + }
    +   
    + * \defgroup vTaskSuspend vTaskSuspend + * \ingroup TaskCtrl + */ +void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskResume( TaskHandle_t xTaskToResume );
    + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Resumes a suspended task. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * vTaskResume (). + * + * @param xTaskToResume Handle to the task being readied. + * + * Example usage: +
    + void vAFunction( void )
    + {
    + TaskHandle_t xHandle;
    +
    +	 // Create a task, storing the handle.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
    +
    +	 // ...
    +
    +	 // Use the handle to suspend the created task.
    +	 vTaskSuspend( xHandle );
    +
    +	 // ...
    +
    +	 // The created task will not run during this period, unless
    +	 // another task calls vTaskResume( xHandle ).
    +
    +	 //...
    +
    +
    +	 // Resume the suspended task ourselves.
    +	 vTaskResume( xHandle );
    +
    +	 // The created task will once again get microcontroller processing
    +	 // time in accordance with its priority within the system.
    + }
    +   
    + * \defgroup vTaskResume vTaskResume + * \ingroup TaskCtrl + */ +void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void xTaskResumeFromISR( TaskHandle_t xTaskToResume );
    + * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * An implementation of vTaskResume() that can be called from within an ISR. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * xTaskResumeFromISR (). + * + * xTaskResumeFromISR() should not be used to synchronise a task with an + * interrupt if there is a chance that the interrupt could arrive prior to the + * task being suspended - as this can lead to interrupts being missed. Use of a + * semaphore as a synchronisation mechanism would avoid this eventuality. + * + * @param xTaskToResume Handle to the task being readied. + * + * @return pdTRUE if resuming the task should result in a context switch, + * otherwise pdFALSE. This is used by the ISR to determine if a context switch + * may be required following the ISR. + * + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * \ingroup TaskCtrl + */ +BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * SCHEDULER CONTROL + *----------------------------------------------------------*/ + +/** + * task. h + *
    void vTaskStartScheduler( void );
    + * + * Starts the real time kernel tick processing. After calling the kernel + * has control over which tasks are executed and when. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: +
    + void vAFunction( void )
    + {
    +	 // Create at least one task before starting the kernel.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
    +
    +	 // Start the real time kernel with preemption.
    +	 vTaskStartScheduler ();
    +
    +	 // Will not get here unless a task calls vTaskEndScheduler ()
    + }
    +   
    + * + * \defgroup vTaskStartScheduler vTaskStartScheduler + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskEndScheduler( void );
    + * + * NOTE: At the time of writing only the x86 real mode port, which runs on a PC + * in place of DOS, implements this function. + * + * Stops the real time kernel tick. All created tasks will be automatically + * deleted and multitasking (either preemptive or cooperative) will + * stop. Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: +
    + void vTaskCode( void * pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		 // Task code goes here.
    +
    +		 // At some point we want to end the real time kernel processing
    +		 // so call ...
    +		 vTaskEndScheduler ();
    +	 }
    + }
    +
    + void vAFunction( void )
    + {
    +	 // Create at least one task before starting the kernel.
    +	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
    +
    +	 // Start the real time kernel with preemption.
    +	 vTaskStartScheduler ();
    +
    +	 // Will only get here when the vTaskCode () task has called
    +	 // vTaskEndScheduler ().  When we get here we are back to single task
    +	 // execution.
    + }
    +   
    + * + * \defgroup vTaskEndScheduler vTaskEndScheduler + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskSuspendAll( void );
    + * + * Suspends the scheduler without disabling interrupts. Context switches will + * not occur while the scheduler is suspended. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: +
    + void vTask1( void * pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		 // Task code goes here.
    +
    +		 // ...
    +
    +		 // At some point the task wants to perform a long operation during
    +		 // which it does not want to get swapped out.  It cannot use
    +		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
    +		 // operation may cause interrupts to be missed - including the
    +		 // ticks.
    +
    +		 // Prevent the real time kernel swapping out the task.
    +		 vTaskSuspendAll ();
    +
    +		 // Perform the operation here.  There is no need to use critical
    +		 // sections as we have all the microcontroller processing time.
    +		 // During this time interrupts will still operate and the kernel
    +		 // tick count will be maintained.
    +
    +		 // ...
    +
    +		 // The operation is complete.  Restart the kernel.
    +		 xTaskResumeAll ();
    +	 }
    + }
    +   
    + * \defgroup vTaskSuspendAll vTaskSuspendAll + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    BaseType_t xTaskResumeAll( void );
    + * + * Resumes scheduler activity after it was suspended by a call to + * vTaskSuspendAll(). + * + * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks + * that were previously suspended by a call to vTaskSuspend(). + * + * @return If resuming the scheduler caused a context switch then pdTRUE is + * returned, otherwise pdFALSE is returned. + * + * Example usage: +
    + void vTask1( void * pvParameters )
    + {
    +	 for( ;; )
    +	 {
    +		 // Task code goes here.
    +
    +		 // ...
    +
    +		 // At some point the task wants to perform a long operation during
    +		 // which it does not want to get swapped out.  It cannot use
    +		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
    +		 // operation may cause interrupts to be missed - including the
    +		 // ticks.
    +
    +		 // Prevent the real time kernel swapping out the task.
    +		 vTaskSuspendAll ();
    +
    +		 // Perform the operation here.  There is no need to use critical
    +		 // sections as we have all the microcontroller processing time.
    +		 // During this time interrupts will still operate and the real
    +		 // time kernel tick count will be maintained.
    +
    +		 // ...
    +
    +		 // The operation is complete.  Restart the kernel.  We want to force
    +		 // a context switch - but there is no point if resuming the scheduler
    +		 // caused a context switch already.
    +		 if( !xTaskResumeAll () )
    +		 {
    +			  taskYIELD ();
    +		 }
    +	 }
    + }
    +   
    + * \defgroup xTaskResumeAll xTaskResumeAll + * \ingroup SchedulerControl + */ +BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK UTILITIES + *----------------------------------------------------------*/ + +/** + * task. h + *
    TickType_t xTaskGetTickCount( void );
    + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \defgroup xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    TickType_t xTaskGetTickCountFromISR( void );
    + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that TickType_t is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    uint16_t uxTaskGetNumberOfTasks( void );
    + * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * \ingroup TaskUtils + */ +UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    char *pcTaskGetName( TaskHandle_t xTaskToQuery );
    + * + * @return The text (human readable) name of the task referenced by the handle + * xTaskToQuery. A task can query its own name by either passing in its own + * handle, or by setting xTaskToQuery to NULL. + * + * \defgroup pcTaskGetName pcTaskGetName + * \ingroup TaskUtils + */ +char *pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + *
    TaskHandle_t xTaskGetHandle( const char *pcNameToQuery );
    + * + * NOTE: This function takes a relatively long time to complete and should be + * used sparingly. + * + * @return The handle of the task that has the human readable name pcNameToQuery. + * NULL is returned if no matching name is found. INCLUDE_xTaskGetHandle + * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available. + * + * \defgroup pcTaskGetHandle pcTaskGetHandle + * \ingroup TaskUtils + */ +TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task.h + *
    UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
    + * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task.h + *
    configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask );
    + * + * INCLUDE_uxTaskGetStackHighWaterMark2 must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* When using trace macros it is sometimes necessary to include task.h before +FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, +so the following two prototypes will cause a compilation error. This can be +fixed by simply guarding against the inclusion of these two prototypes unless +they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration +constant. */ +#ifdef configUSE_APPLICATION_TASK_TAG + #if configUSE_APPLICATION_TASK_TAG == 1 + /** + * task.h + *
    void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );
    + * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * Passing xTask as NULL has the effect of setting the calling tasks hook + * function. + */ + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; + + /** + * task.h + *
    void xTaskGetApplicationTaskTag( TaskHandle_t xTask );
    + * + * Returns the pxHookFunction value assigned to the task xTask. Do not + * call from an interrupt service routine - call + * xTaskGetApplicationTaskTagFromISR() instead. + */ + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + + /** + * task.h + *
    void xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask );
    + * + * Returns the pxHookFunction value assigned to the task xTask. Can + * be called from an interrupt service routine. + */ + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +#if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + + /* Each task contains an array of pointers that is dimensioned by the + configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The + kernel does not use the pointers itself, so the application writer can use + the pointers for any purpose they wish. The following two functions are + used to set and query a pointer respectively. */ + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) PRIVILEGED_FUNCTION; + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) PRIVILEGED_FUNCTION; + +#endif + +/** + * task.h + *
    BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );
    + * + * Calls the hook function associated with xTask. Passing xTask as NULL has + * the effect of calling the Running tasks (the calling task) hook function. + * + * pvParameter is passed to the hook function for the task to interpret as it + * wants. The return value is the value returned by the task hook function + * registered by the user. + */ +BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) PRIVILEGED_FUNCTION; + +/** + * xTaskGetIdleTaskHandle() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * Simply returns the handle of the idle task. It is not valid to call + * xTaskGetIdleTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for + * uxTaskGetSystemState() to be available. + * + * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in + * the system. TaskStatus_t structures contain, among other things, members + * for the task handle, task name, task priority, task state, and total amount + * of run time consumed by the task. See the TaskStatus_t structure + * definition in this file for the full member list. + * + * NOTE: This function is intended for debugging use only as its use results in + * the scheduler remaining suspended for an extended period. + * + * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. + * The array must contain at least one TaskStatus_t structure for each task + * that is under the control of the RTOS. The number of tasks under the control + * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. + * + * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray + * parameter. The size is specified as the number of indexes in the array, or + * the number of TaskStatus_t structures contained in the array, not by the + * number of bytes in the array. + * + * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in + * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the + * total run time (as defined by the run time stats clock, see + * http://www.freertos.org/rtos-run-time-stats.html) since the target booted. + * pulTotalRunTime can be set to NULL to omit the total run time information. + * + * @return The number of TaskStatus_t structures that were populated by + * uxTaskGetSystemState(). This should equal the number returned by the + * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed + * in the uxArraySize parameter was too small. + * + * Example usage: +
    +    // This example demonstrates how a human readable table of run time stats
    +	// information is generated from raw data provided by uxTaskGetSystemState().
    +	// The human readable table is written to pcWriteBuffer
    +	void vTaskGetRunTimeStats( char *pcWriteBuffer )
    +	{
    +	TaskStatus_t *pxTaskStatusArray;
    +	volatile UBaseType_t uxArraySize, x;
    +	uint32_t ulTotalRunTime, ulStatsAsPercentage;
    +
    +		// Make sure the write buffer does not contain a string.
    +		*pcWriteBuffer = 0x00;
    +
    +		// Take a snapshot of the number of tasks in case it changes while this
    +		// function is executing.
    +		uxArraySize = uxTaskGetNumberOfTasks();
    +
    +		// Allocate a TaskStatus_t structure for each task.  An array could be
    +		// allocated statically at compile time.
    +		pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );
    +
    +		if( pxTaskStatusArray != NULL )
    +		{
    +			// Generate raw status information about each task.
    +			uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime );
    +
    +			// For percentage calculations.
    +			ulTotalRunTime /= 100UL;
    +
    +			// Avoid divide by zero errors.
    +			if( ulTotalRunTime > 0 )
    +			{
    +				// For each populated position in the pxTaskStatusArray array,
    +				// format the raw data as human readable ASCII data
    +				for( x = 0; x < uxArraySize; x++ )
    +				{
    +					// What percentage of the total run time has the task used?
    +					// This will always be rounded down to the nearest integer.
    +					// ulTotalRunTimeDiv100 has already been divided by 100.
    +					ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;
    +
    +					if( ulStatsAsPercentage > 0UL )
    +					{
    +						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );
    +					}
    +					else
    +					{
    +						// If the percentage is zero here then the task has
    +						// consumed less than 1% of the total run time.
    +						sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter );
    +					}
    +
    +					pcWriteBuffer += strlen( ( char * ) pcWriteBuffer );
    +				}
    +			}
    +
    +			// The array is no longer needed, free the memory it consumes.
    +			vPortFree( pxTaskStatusArray );
    +		}
    +	}
    +	
    + */ +UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    void vTaskList( char *pcWriteBuffer );
    + * + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * both be defined as 1 for this function to be available. See the + * configuration section of the FreeRTOS.org website for more information. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays task + * names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that might + * bloat the code size, use a lot of stack, and provide different results on + * different platforms. An alternative, tiny, third party, and limited + * functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly through a + * call to vTaskList(). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ASCII form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \defgroup vTaskList vTaskList + * \ingroup TaskUtils + */ +void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + *
    void vTaskGetRunTimeStats( char *pcWriteBuffer );
    + * + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both be defined as 1 for this function to be available. The application + * must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays the + * amount of time each task has spent in the Running state in both absolute and + * percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library function + * that might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, and + * limited functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() directly + * to get access to raw stats data, rather than indirectly through a call to + * vTaskGetRunTimeStats(). + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ASCII form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats + * \ingroup TaskUtils + */ +void vTaskGetRunTimeStats( char *pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** +* task. h +*
    uint32_t ulTaskGetIdleRunTimeCounter( void );
    +* +* configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS +* must both be defined as 1 for this function to be available. The application +* must also then provide definitions for +* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() +* to configure a peripheral timer/counter and return the timers current count +* value respectively. The counter should be at least 10 times the frequency of +* the tick count. +* +* Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total +* accumulated execution time being stored for each task. The resolution +* of the accumulated time value depends on the frequency of the timer +* configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. +* While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total +* execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter() +* returns the total execution time of just the idle task. +* +* @return The total run time of the idle task. This is the amount of time the +* idle task has actually been executing. The unit of time is dependent on the +* frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and +* portGET_RUN_TIME_COUNTER_VALUE() macros. +* +* \defgroup ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter +* \ingroup TaskUtils +*/ +uint32_t ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * pulPreviousNotificationValue - + * Can be used to pass out the subject task's notification value before any + * bits are modified by the notify function. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotify xTaskNotify + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) PRIVILEGED_FUNCTION; +#define xTaskNotify( xTaskToNotify, ulValue, eAction ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL ) +#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) xTaskGenericNotify( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) + +/** + * task. h + *
    BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * A version of xTaskNotify() that can be used from an interrupt service routine + * (ISR). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNofify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should + * be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotify xTaskNotify + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + *
    BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWait() or ulTaskNotifyTake(). If the task was + * already in the Blocked state to wait for a notification when the notification + * arrives then the task will automatically be removed from the Blocked state + * (unblocked) and the notification cleared. + * + * A task can use xTaskNotifyWait() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTake() to [optionally] block + * to wait for its notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value + * will be cleared in the calling task's notification value before the task + * checks to see if any notifications are pending, and optionally blocks if no + * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if + * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have + * the effect of resetting the task's notification value to 0. Setting + * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. + * + * @param ulBitsToClearOnExit If a notification is pending or received before + * the calling task exits the xTaskNotifyWait() function then the task's + * notification value (see the xTaskNotify() API function) is passed out using + * the pulNotificationValue parameter. Then any bits that are set in + * ulBitsToClearOnExit will be cleared in the task's notification value (note + * *pulNotificationValue is set before any bits are cleared). Setting + * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL + * (if limits.h is not included) will have the effect of resetting the task's + * notification value to 0 before the function exits. Setting + * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged + * when the function exits (in which case the value passed out in + * pulNotificationValue will match the task's notification value). + * + * @param pulNotificationValue Used to pass the task's notification value out + * of the function. Note the value passed out will not be effected by the + * clearing of any bits caused by ulBitsToClearOnExit being non-zero. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for a notification to be received, should a notification + * not already be pending when xTaskNotifyWait() was called. The task + * will not consume any processing time while it is in the Blocked state. This + * is specified in kernel ticks, the macro pdMS_TO_TICSK( value_in_ms ) can be + * used to convert a time specified in milliseconds to a time specified in + * ticks. + * + * @return If a notification was received (including notifications that were + * already pending when xTaskNotifyWait was called) then pdPASS is + * returned. Otherwise pdFAIL is returned. + * + * \defgroup xTaskNotifyWait xTaskNotifyWait + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro + * to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * xTaskNotifyGive() is a helper macro intended for use when task notifications + * are used as light weight and faster binary or counting semaphore equivalents. + * Actual FreeRTOS semaphores are given using the xSemaphoreGive() API function, + * the equivalent action that instead uses a task notification is + * xTaskNotifyGive(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotificationTake() API function rather than the + * xTaskNotifyWait() API function. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the + * eAction parameter set to eIncrement - so pdPASS is always returned. + * + * \defgroup xTaskNotifyGive xTaskNotifyGive + * \ingroup TaskNotifications + */ +#define xTaskNotifyGive( xTaskToNotify ) xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL ) + +/** + * task. h + *
    void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );
    + *
    + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro
    + * to be available.
    + *
    + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private
    + * "notification value", which is a 32-bit unsigned integer (uint32_t).
    + *
    + * A version of xTaskNotifyGive() that can be called from an interrupt service
    + * routine (ISR).
    + *
    + * Events can be sent to a task using an intermediary object.  Examples of such
    + * objects are queues, semaphores, mutexes and event groups.  Task notifications
    + * are a method of sending an event directly to a task without the need for such
    + * an intermediary object.
    + *
    + * A notification sent to a task can optionally perform an action, such as
    + * update, overwrite or increment the task's notification value.  In that way
    + * task notifications can be used to send data to a task, or be used as light
    + * weight and fast binary or counting semaphores.
    + *
    + * vTaskNotifyGiveFromISR() is intended for use when task notifications are
    + * used as light weight and faster binary or counting semaphore equivalents.
    + * Actual FreeRTOS semaphores are given from an ISR using the
    + * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses
    + * a task notification is vTaskNotifyGiveFromISR().
    + *
    + * When task notifications are being used as a binary or counting semaphore
    + * equivalent then the task being notified should wait for the notification
    + * using the ulTaskNotificationTake() API function rather than the
    + * xTaskNotifyWait() API function.
    + *
    + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for more details.
    + *
    + * @param xTaskToNotify The handle of the task being notified.  The handle to a
    + * task can be returned from the xTaskCreate() API function used to create the
    + * task, and the handle of the currently running task can be obtained by calling
    + * xTaskGetCurrentTaskHandle().
    + *
    + * @param pxHigherPriorityTaskWoken  vTaskNotifyGiveFromISR() will set
    + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the
    + * task to which the notification was sent to leave the Blocked state, and the
    + * unblocked task has a priority higher than the currently running task.  If
    + * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch
    + * should be requested before the interrupt is exited.  How a context switch is
    + * requested from an ISR is dependent on the port - see the documentation page
    + * for the port in use.
    + *
    + * \defgroup xTaskNotifyWait xTaskNotifyWait
    + * \ingroup TaskNotifications
    + */
    +void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;
    +
    +/**
    + * task. h
    + * 
    uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
    + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * When configUSE_TASK_NOTIFICATIONS is set to one each task has its own private + * "notification value", which is a 32-bit unsigned integer (uint32_t). + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment the task's notification value. In that way + * task notifications can be used to send data to a task, or be used as light + * weight and fast binary or counting semaphores. + * + * ulTaskNotifyTake() is intended for use when a task notification is used as a + * faster and lighter weight binary or counting semaphore alternative. Actual + * FreeRTOS semaphores are taken using the xSemaphoreTake() API function, the + * equivalent action that instead uses a task notification is + * ulTaskNotifyTake(). + * + * When a task is using its notification value as a binary or counting semaphore + * other tasks should send notifications to it using the xTaskNotifyGive() + * macro, or xTaskNotify() function with the eAction parameter set to + * eIncrement. + * + * ulTaskNotifyTake() can either clear the task's notification value to + * zero on exit, in which case the notification value acts like a binary + * semaphore, or decrement the task's notification value on exit, in which case + * the notification value acts like a counting semaphore. + * + * A task can use ulTaskNotifyTake() to [optionally] block to wait for a + * the task's notification value to be non-zero. The task does not consume any + * CPU time while it is in the Blocked state. + * + * Where as xTaskNotifyWait() will return when a notification is pending, + * ulTaskNotifyTake() will return when the task's notification value is + * not zero. + * + * See http://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's + * notification value is decremented when the function exits. In this way the + * notification value acts like a counting semaphore. If xClearCountOnExit is + * not pdFALSE then the task's notification value is cleared to zero when the + * function exits. In this way the notification value acts like a binary + * semaphore. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for the task's notification value to be greater than zero, + * should the count not already be greater than zero when + * ulTaskNotifyTake() was called. The task will not consume any processing + * time while it is in the Blocked state. This is specified in kernel ticks, + * the macro pdMS_TO_TICSK( value_in_ms ) can be used to convert a time + * specified in milliseconds to a time specified in ticks. + * + * @return The task's notification count before it is either cleared to zero or + * decremented (see the xClearCountOnExit parameter). + * + * \defgroup ulTaskNotifyTake ulTaskNotifyTake + * \ingroup TaskNotifications + */ +uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
    BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
    + * + * If the notification state of the task referenced by the handle xTask is + * eNotified, then set the task's notification state to eNotWaitingNotification. + * The task's notification value is not altered. Set xTask to NULL to clear the + * notification state of the calling task. + * + * @return pdTRUE if the task's notification state was set to + * eNotWaitingNotification, otherwise pdFALSE. + * \defgroup xTaskNotifyStateClear xTaskNotifyStateClear + * \ingroup TaskNotifications + */ +BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); + +/** +* task. h +*
    uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear );
    +* +* Clears the bits specified by the ulBitsToClear bit mask in the notification +* value of the task referenced by xTask. +* +* Set ulBitsToClear to 0xffffffff (UINT_MAX on 32-bit architectures) to clear +* the notification value to 0. Set ulBitsToClear to 0 to query the task's +* notification value without clearing any bits. +* +* @return The value of the target task's notification value before the bits +* specified by ulBitsToClear were cleared. +* \defgroup ulTaskNotifyValueClear ulTaskNotifyValueClear +* \ingroup TaskNotifications +*/ +uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; + +/** + * task.h + *
    void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )
    + * + * Capture the current time for future use with xTaskCheckForTimeOut(). + * + * @param pxTimeOut Pointer to a timeout object into which the current time + * is to be captured. The captured time includes the tick count and the number + * of times the tick count has overflowed since the system first booted. + * \defgroup vTaskSetTimeOutState vTaskSetTimeOutState + * \ingroup TaskCtrl + */ +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/** + * task.h + *
    BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait );
    + * + * Determines if pxTicksToWait ticks has passed since a time was captured + * using a call to vTaskSetTimeOutState(). The captured time includes the tick + * count and the number of times the tick count has overflowed. + * + * @param pxTimeOut The time status as captured previously using + * vTaskSetTimeOutState. If the timeout has not yet occurred, it is updated + * to reflect the current time status. + * @param pxTicksToWait The number of ticks to check for timeout i.e. if + * pxTicksToWait ticks have passed since pxTimeOut was last updated (either by + * vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred. + * If the timeout has not occurred, pxTIcksToWait is updated to reflect the + * number of remaining ticks. + * + * @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is + * returned and pxTicksToWait is updated to reflect the number of remaining + * ticks. + * + * @see https://www.freertos.org/xTaskCheckForTimeOut.html + * + * Example Usage: + *
    +	// Driver library function used to receive uxWantedBytes from an Rx buffer
    +	// that is filled by a UART interrupt. If there are not enough bytes in the
    +	// Rx buffer then the task enters the Blocked state until it is notified that
    +	// more data has been placed into the buffer. If there is still not enough
    +	// data then the task re-enters the Blocked state, and xTaskCheckForTimeOut()
    +	// is used to re-calculate the Block time to ensure the total amount of time
    +	// spent in the Blocked state does not exceed MAX_TIME_TO_WAIT. This
    +	// continues until either the buffer contains at least uxWantedBytes bytes,
    +	// or the total amount of time spent in the Blocked state reaches
    +	// MAX_TIME_TO_WAIT – at which point the task reads however many bytes are
    +	// available up to a maximum of uxWantedBytes.
    +
    +	size_t xUART_Receive( uint8_t *pucBuffer, size_t uxWantedBytes )
    +	{
    +	size_t uxReceived = 0;
    +	TickType_t xTicksToWait = MAX_TIME_TO_WAIT;
    +	TimeOut_t xTimeOut;
    +
    +		// Initialize xTimeOut.  This records the time at which this function
    +		// was entered.
    +		vTaskSetTimeOutState( &xTimeOut );
    +
    +		// Loop until the buffer contains the wanted number of bytes, or a
    +		// timeout occurs.
    +		while( UART_bytes_in_rx_buffer( pxUARTInstance ) < uxWantedBytes )
    +		{
    +			// The buffer didn't contain enough data so this task is going to
    +			// enter the Blocked state. Adjusting xTicksToWait to account for
    +			// any time that has been spent in the Blocked state within this
    +			// function so far to ensure the total amount of time spent in the
    +			// Blocked state does not exceed MAX_TIME_TO_WAIT.
    +			if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) != pdFALSE )
    +			{
    +				//Timed out before the wanted number of bytes were available,
    +				// exit the loop.
    +				break;
    +			}
    +
    +			// Wait for a maximum of xTicksToWait ticks to be notified that the
    +			// receive interrupt has placed more data into the buffer.
    +			ulTaskNotifyTake( pdTRUE, xTicksToWait );
    +		}
    +
    +		// Attempt to read uxWantedBytes from the receive buffer into pucBuffer.
    +		// The actual number of bytes read (which might be less than
    +		// uxWantedBytes) is returned.
    +		uxReceived = UART_read_from_receive_buffer( pxUARTInstance,
    +													pucBuffer,
    +													uxWantedBytes );
    +
    +		return uxReceived;
    +	}
    + 
    + * \defgroup xTaskCheckForTimeOut xTaskCheckForTimeOut + * \ingroup TaskCtrl + */ +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES + *----------------------------------------------------------*/ + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. If a non-zero value is returned then a context switch is + * required because either: + * + A task was removed from a blocked list because its timeout had expired, + * or + * + Time slicing is in use and there is a task of equal priority to the + * currently running task. + */ +BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * The 'unordered' version replaces the event list item value with the + * xItemValue value, and inserts the list item at the end of the list. + * + * The 'ordered' version uses the existing event list item value (which is the + * owning tasks priority) to insert the list item into the event list is task + * priority order. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xItemValue The item value to use for the event list item when the + * event list is not ordered by task priority. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks,the constant + * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time + * period. + */ +void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + */ +void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList()/vTaskRemoveFromUnorderedEventList() will be called + * if either an event occurs to unblock a task, or the block timeout period + * expires. + * + * xTaskRemoveFromEventList() is used when the event list is in task priority + * order. It removes the list item from the head of the event list as that will + * have the highest priority owning task of all the tasks on the event list. + * vTaskRemoveFromUnorderedEventList() is used when the event list is not + * ordered and the event list items hold something other than the owning tasks + * priority. In this case the event list item value is updated to the value + * passed in the xItemValue parameter. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; +void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; + +/* + * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY + * THE EVENT BITS MODULE. + */ +TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * If a higher priority task attempting to obtain a mutex caused a lower + * priority task to inherit the higher priority task's priority - but the higher + * priority task then timed out without obtaining the mutex, then the lower + * priority task will disinherit the priority again - but only down as far as + * the highest priority task that is still waiting for the mutex (if there were + * more than one task waiting for the mutex). + */ +void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask ) PRIVILEGED_FUNCTION; + +/* + * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. + */ +UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* + * Set the uxTaskNumber of the task referenced by the xTask parameter to + * uxHandle. + */ +void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * If tickless mode is being used, or a low power mode is implemented, then + * the tick interrupt will not execute during idle periods. When this is the + * case, the tick count value maintained by the scheduler needs to be kept up + * to date with the actual execution time by being skipped forward by a time + * equal to the idle period. + */ +void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; + +/* Correct the tick count value after the application code has held +interrupts disabled for an extended period. xTicksToCatchUp is the number +of tick interrupts that have been missed due to interrupts being disabled. +Its value is not computed automatically, so must be computed by the +application writer. + +This function is similar to vTaskStepTick(), however, unlike +vTaskStepTick(), xTaskCatchUpTicks() may move the tick count forward past a +time at which a task should be removed from the blocked state. That means +tasks may have to be removed from the blocked state as the tick count is +moved. */ +BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) PRIVILEGED_FUNCTION; + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port + * specific sleep function to determine if it is ok to proceed with the sleep, + * and if it is ok to proceed, if it is ok to sleep indefinitely. + * + * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only + * called with the scheduler suspended, not from within a critical section. It + * is therefore possible for an interrupt to request a context switch between + * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being + * entered. eTaskConfirmSleepModeStatus() should be called from a short + * critical section between the timer being stopped and the sleep mode being + * entered to ensure it is ok to proceed into the sleep mode. + */ +eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Increment the mutex held count when a mutex is + * taken and return the handle of the task that has taken the mutex. + */ +TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Same as vTaskSetTimeOutState(), but without a critial + * section. + */ +void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + + +#ifdef __cplusplus +} +#endif +#endif /* INC_TASK_H */ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h new file mode 100644 index 0000000..307ea1f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h @@ -0,0 +1,1309 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + + +#ifndef TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +/*lint -save -e537 This headers are only multiply included if the application code +happens to also be including task.h. */ +#include "task.h" +/*lint -restore */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +/* IDs for commands that can be sent/received on the timer queue. These are to +be used solely through the macros that make up the public software timer API, +as defined below. The commands that are sent from interrupts must use the +highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task +or interrupt version of the queue send function should be used. */ +#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) +#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) +#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) +#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) +#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) +#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) +#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) +#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) + +#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) +#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) +#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) + + +/** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an TimerHandle_t variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +struct tmrTimerControl; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct tmrTimerControl * TimerHandle_t; + +/* + * Defines the prototype to which timer callback functions must conform. + */ +typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer ); + +/* + * Defines the prototype to which functions used with the + * xTimerPendFunctionCallFromISR() function must conform. + */ +typedef void (*PendedFunction_t)( void *, uint32_t ); + +/** + * TimerHandle_t xTimerCreate( const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * http://www.freertos.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. Time timer period must be greater than 0. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @return If the timer is successfully created then a handle to the newly + * created timer is returned. If the timer cannot be created because there is + * insufficient FreeRTOS heap remaining to allocate the timer + * structures then NULL is returned. + * + * Example usage: + * @verbatim + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * TimerHandle_t xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( TimerHandle_t pxTimer ) + * { + * int32_t lArrayIndex; + * const int32_t xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * x ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; +#endif + +/** + * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * UBaseType_t uxAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction, + * StaticTimer_t *pxTimerBuffer ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * http://www.freertos.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. The timer period must be greater than 0. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which + * will be then be used to hold the software timer's data structures, removing + * the need for the memory to be allocated dynamically. + * + * @return If the timer is created then a handle to the created timer is + * returned. If pxTimerBuffer was NULL then NULL is returned. + * + * Example usage: + * @verbatim + * + * // The buffer used to hold the software timer's data structure. + * static StaticTimer_t xTimerBuffer; + * + * // A variable that will be incremented by the software timer's callback + * // function. + * UBaseType_t uxVariableToIncrement = 0; + * + * // A software timer callback function that increments a variable passed to + * // it when the software timer was created. After the 5th increment the + * // callback function stops the software timer. + * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) + * { + * UBaseType_t *puxVariableToIncrement; + * BaseType_t xReturned; + * + * // Obtain the address of the variable to increment from the timer ID. + * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); + * + * // Increment the variable to show the timer callback has executed. + * ( *puxVariableToIncrement )++; + * + * // If this callback has executed the required number of times, stop the + * // timer. + * if( *puxVariableToIncrement == 5 ) + * { + * // This is called from a timer callback so must not block. + * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); + * } + * } + * + * + * void main( void ) + * { + * // Create the software time. xTimerCreateStatic() has an extra parameter + * // than the normal xTimerCreate() API function. The parameter is a pointer + * // to the StaticTimer_t structure that will hold the software timer + * // structure. If the parameter is passed as NULL then the structure will be + * // allocated dynamically, just as if xTimerCreate() had been called. + * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. + * xTimerPeriod, // The period of the timer in ticks. + * pdTRUE, // This is an auto-reload timer. + * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function + * prvTimerCallback, // The function to execute when the timer expires. + * &xTimerBuffer ); // The buffer that will hold the software timer structure. + * + * // The scheduler has not started yet so a block time is not used. + * xReturned = xTimerStart( xTimer, 0 ); + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t *pxTimerBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * void *pvTimerGetTimerID( TimerHandle_t xTimer ); + * + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer, and by calling the + * vTimerSetTimerID() API function. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void *pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); + * + * Sets the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being updated. + * + * @param pvNewID The ID to assign to the timer. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ); + * + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * 1) It has been created but not started, or + * 2) It is an expired one-shot timer that has not been restarted. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + * @endverbatim + */ +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); + * + * Simply returns the handle of the timer service/daemon task. It it not valid + * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xTicksToWait is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xTicksToWait is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xTicksToWait is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xTicksToWait ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. If the timer + * // referenced by xTimer is already active when it is called, then the timer + * // is deleted. If the timer referenced by xTimer is not active when it is + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + * @endverbatim + */ + #define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xTicksToWait is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xTicksToWait is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer. + * + * TimerHandle_t xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#define xTimerReset( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + + +/** + * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * + * Used from application interrupt service routines to defer the execution of a + * function to the RTOS daemon task (the timer service task, hence this function + * is implemented in timers.c and is prefixed with 'Timer'). + * + * Ideally an interrupt service routine (ISR) is kept as short as possible, but + * sometimes an ISR either has a lot of processing to do, or needs to perform + * processing that is not deterministic. In these cases + * xTimerPendFunctionCallFromISR() can be used to defer processing of a function + * to the RTOS daemon task. + * + * A mechanism is provided that allows the interrupt to return directly to the + * task that will subsequently execute the pended callback function. This + * allows the callback function to execute contiguously in time with the + * interrupt - just as if the callback had executed in the interrupt itself. + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task (which is set using + * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of + * the currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE within + * xTimerPendFunctionCallFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + * Example usage: + * @verbatim + * + * // The callback function that will execute in the context of the daemon task. + * // Note callback functions must all use this same prototype. + * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) + * { + * BaseType_t xInterfaceToService; + * + * // The interface that requires servicing is passed in the second + * // parameter. The first parameter is not used in this case. + * xInterfaceToService = ( BaseType_t ) ulParameter2; + * + * // ...Perform the processing here... + * } + * + * // An ISR that receives data packets from multiple interfaces + * void vAnISR( void ) + * { + * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; + * + * // Query the hardware to determine which interface needs processing. + * xInterfaceToService = prvCheckInterfaces(); + * + * // The actual processing is to be deferred to a task. Request the + * // vProcessInterface() callback function is executed, passing in the + * // number of the interface that needs processing. The interface to + * // service is passed in the second parameter. The first parameter is + * // not used in this case. + * xHigherPriorityTaskWoken = pdFALSE; + * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); + * + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and will + * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to + * // the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * + * } + * @endverbatim + */ +BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + + /** + * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * TickType_t xTicksToWait ); + * + * + * Used to defer the execution of a function to the RTOS daemon task (the timer + * service task, hence this function is implemented in timers.c and is prefixed + * with 'Timer'). + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param xTicksToWait Calling this function will result in a message being + * sent to the timer daemon task on a queue. xTicksToWait is the amount of + * time the calling task should remain in the Blocked state (so not using any + * processing time) for space to become available on the timer queue if the + * queue is found to be full. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + */ +BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * const char * const pcTimerGetName( TimerHandle_t xTimer ); + * + * Returns the name that was assigned to a timer when the timer was created. + * + * @param xTimer The handle of the timer being queried. + * + * @return The name assigned to the timer specified by the xTimer parameter. + */ +const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ); + * + * Updates a timer to be either an auto-reload timer, in which case the timer + * automatically resets itself each time it expires, or a one-shot timer, in + * which case the timer will only expire once unless it is manually restarted. + * + * @param xTimer The handle of the timer being updated. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the timer's period (see the + * xTimerPeriodInTicks parameter of the xTimerCreate() API function). If + * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + */ +void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) PRIVILEGED_FUNCTION; + +/** +* UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ); +* +* Queries a timer to determine if it is an auto-reload timer, in which case the timer +* automatically resets itself each time it expires, or a one-shot timer, in +* which case the timer will only expire once unless it is manually restarted. +* +* @param xTimer The handle of the timer being queried. +* +* @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise +* pdFALSE is returned. +*/ +UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); + * + * Returns the period of a timer. + * + * @param xTimer The handle of the timer being queried. + * + * @return The period of the timer in ticks. + */ +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** +* TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); +* +* Returns the time in ticks at which the timer will expire. If this is less +* than the current tick count then the expiry time has overflowed from the +* current time. +* +* @param xTimer The handle of the timer being queried. +* +* @return If the timer is running then the time in ticks at which the timer +* will next expire is returned. If the timer is not running then the return +* value is undefined. +*/ +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/* + * Functions beyond this part are not part of the public API and are intended + * for use by the kernel only. + */ +BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +#if( configUSE_TRACE_FACILITY == 1 ) + void vTimerSetTimerNumber( TimerHandle_t xTimer, UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif +#endif /* TIMERS_H */ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/list.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/list.c new file mode 100644 index 0000000..7618ee8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/list.c @@ -0,0 +1,198 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + + +#include +#include "FreeRTOS.h" +#include "list.h" + +/*----------------------------------------------------------- + * PUBLIC LIST API documented in list.h + *----------------------------------------------------------*/ + +void vListInitialise( List_t * const pxList ) +{ + /* The list structure contains a list item which is used to mark the + end of the list. To initialise the list the list end is inserted + as the only list entry. */ + pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + /* The list end value is the highest possible value in the list to + ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + + /* The list end next and previous pointers point to itself so we know + when the list is empty. */ + pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + pxList->uxNumberOfItems = ( UBaseType_t ) 0U; + + /* Write known values into the list if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); + listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( ListItem_t * const pxItem ) +{ + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pxContainer = NULL; + + /* Write known values into the list item if + configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ +ListItem_t * const pxIndex = pxList->pxIndex; + + /* Only effective when configASSERT() is also defined, these tests may catch + the list data structures being overwritten in memory. They will not catch + data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert a new list item into pxList, but rather than sort the list, + makes the new list item the last item to be removed by a call to + listGET_OWNER_OF_NEXT_ENTRY(). */ + pxNewListItem->pxNext = pxIndex; + pxNewListItem->pxPrevious = pxIndex->pxPrevious; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pxContainer = pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) +{ +ListItem_t *pxIterator; +const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; + + /* Only effective when configASSERT() is also defined, these tests may catch + the list data structures being overwritten in memory. They will not catch + data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert the new list item into the list, sorted in xItemValue order. + + If the list already contains a list item with the same item value then the + new list item should be placed after it. This ensures that TCBs which are + stored in ready lists (all of which have the same xItemValue value) get a + share of the CPU. However, if the xItemValue is the same as the back marker + the iteration loop below will not end. Therefore the value is checked + first, and the algorithm slightly modified if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + If you find your application is crashing here then likely causes are + listed below. In addition see https://www.freertos.org/FAQHelp.html for + more tips, and ensure configASSERT() is defined! + https://www.freertos.org/a00110.html#configASSERT + + 1) Stack overflow - + see https://www.freertos.org/Stacks-and-stack-overflow-checking.html + 2) Incorrect interrupt priority assignment, especially on Cortex-M + parts where numerically high priority values denote low actual + interrupt priorities, which can seem counter intuitive. See + https://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition + of configMAX_SYSCALL_INTERRUPT_PRIORITY on + https://www.freertos.org/a00110.html + 3) Calling an API function from within a critical section or when + the scheduler is suspended, or calling an API function that does + not end in "FromISR" from an interrupt. + 4) Using a queue or semaphore before it has been initialised or + before the scheduler has been started (are interrupts firing + before vTaskStartScheduler() has been called?). + **********************************************************************/ + + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */ + { + /* There is nothing to do here, just iterating to the wanted + insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = pxNewListItem; + + /* Remember which list the item is in. This allows fast removal of the + item later. */ + pxNewListItem->pxContainer = pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) +{ +/* The list item knows which list it is in. Obtain the list from the list +item. */ +List_t * const pxList = pxItemToRemove->pxContainer; + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxItemToRemove->pxContainer = NULL; + ( pxList->uxNumberOfItems )--; + + return pxList->uxNumberOfItems; +} +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c new file mode 100644 index 0000000..89a912c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c @@ -0,0 +1,775 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + /* The way the SysTick is clocked is not modified in case it is not the same + as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 +r0p1 port. */ +#define portCPUID ( * ( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* For strict compliance with the Cortex-M spec the task start address should +have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__ (( naked )); + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ) __attribute__ (( naked )); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ +volatile uint32_t ulDummy = 0; + + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + started to remove a compiler warning about the function being defined + but never called. ulDummy is used purely to quieten other warnings + about code appearing after this function is called - making ulDummy + volatile makes the compiler think the function could return and + therefore not output an 'unreachable code' warning for code that appears + after it. */ + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + /* Start the first task. This also clears the bit that indicates the FPU is + in use in case the FPU was used before the scheduler was started - which + would otherwise result in the unnecessary leaving of space in the SVC stack + for lazy saving of FPU registers. */ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " mov r0, #0 \n" /* Clear the bit that indicates the FPU is in use, see comment above. */ + " msr control, r0 \n" + " cpsie i \n" /* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + the r0p1 parts. r0p1 parts should use the port from the + /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + priority bits matches the number of priority bits actually queried + from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + priority bits matches the number of priority bits actually queried + from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. Call + vTaskSwitchContext() so link time optimisation does not remove the + symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " stmdb r0!, {r4-r11, r14} \n" /* Save the core registers. */ + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r0, r3} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r0, r3} \n" + " \n" + " ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" + " \n" + " ldmia r0!, {r4-r11, r14} \n" /* Pop the core registers. */ + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " isb \n" + " \n" + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */ + #if WORKAROUND_PMU_CM001 == 1 + " push { r14 } \n" + " pop { pc } \n" + #endif + #endif + " \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__((weak)) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm volatile( "cpsid i" ::: "memory" ); + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ::: "memory" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm volatile( "dsb" ::: "memory" ); + __asm volatile( "wfi" ); + __asm volatile( "isb" ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + out of sleep mode to execute immediately. see comments above + __disable_interrupt() call above. */ + __asm volatile( "cpsie i" ::: "memory" ); + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + and interrupts that execute while the clock is stopped will increase + any slippage between the time maintained by the RTOS and calendar + time. */ + __asm volatile( "cpsid i" ::: "memory" ); + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + /* Disable the SysTick clock without reading the + portNVIC_SYSTICK_CTRL_REG register to ensure the + portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + the time the SysTick is stopped for is accounted for as best it can + be, but using the tickless mode will inevitably result in some tiny + drift of the time maintained by the kernel with respect to calendar + time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + been set back to the current reload value (the reload back being + correct for the entire expected idle time) or if the SysTick is yet + to count to zero (in which case an interrupt other than the SysTick + must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + function exits, the tick value maintained by the tick is stepped + forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __asm volatile( "cpsie i" ::: "memory" ); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 " + ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..d0a566a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h @@ -0,0 +1,243 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +#define portYIELD() \ +{ \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + within the specified behaviour for the architecture. */ \ + __asm volatile( "dsb" ::: "memory" ); \ + __asm volatile( "isb" ); \ +} + +#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortSetBASEPRI(x) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ +uint32_t ulCurrentInterrupt; +BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) :: "memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ +uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" \ + " msr basepri, %0 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ +uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" \ + " mov %1, %2 \n" \ + " msr basepri, %1 \n" \ + " isb \n" \ + " dsb \n" \ + :"=r" (ulOriginalBASEPRI), "=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 " :: "r" ( ulNewMaskValue ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c new file mode 100644 index 0000000..eaf443f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c @@ -0,0 +1,492 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that combines + * (coalescences) adjacent memory blocks as they are freed, and in so doing + * limits memory fragmentation. + * + * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Allocate the memory for the heap. */ +#if( configAPPLICATION_ALLOCATED_HEAP == 1 ) + /* The application writer has already defined the array used for the RTOS + heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/* Define the linked list structure. This is used to link free blocks in order +of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ); + +/* + * Called automatically to setup the required heap structures the first time + * pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory +block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart, *pxEnd = NULL; + +/* Keeps track of the number of calls to allocate and free memory as well as the +number of free bytes remaining, but says nothing about fragmentation. */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; +static size_t xNumberOfSuccessfulAllocations = 0; +static size_t xNumberOfSuccessfulFrees = 0; + +/* Gets set to the top bit of an size_t type. When this bit in the xBlockSize +member of an BlockLink_t structure is set then the block belongs to the +application. When the bit is free the block is still part of the free heap +space. */ +static size_t xBlockAllocatedBit = 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +void *pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is + set. The top bit of the block size member of the BlockLink_t structure + is used to determine who owns the block - the application or the + kernel, so it must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number + of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + block following the number of bytes requested. The void + cast is used to prevent byte alignment warnings from the + compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the + single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + by the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + xNumberOfSuccessfulAllocations++; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +uint8_t *puc = ( uint8_t * ) pv; +BlockLink_t *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xNumberOfSuccessfulFrees++; + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ +BlockLink_t *pxFirstFreeBlock; +uint8_t *pucAlignedHeap; +size_t uxAddress; +size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( portBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) +{ +BlockLink_t *pxIterator; +uint8_t *puc; + + /* Iterate through the list until a block is found that has a higher address + than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + before and the block after, then it's pxNextFreeBlock pointer will have + already been set, and should not be set here as that would make it point + to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortGetHeapStats( HeapStats_t *pxHeapStats ) +{ +BlockLink_t *pxBlock; +size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */ + + vTaskSuspendAll(); + { + pxBlock = xStart.pxNextFreeBlock; + + /* pxBlock will be NULL if the heap has not been initialised. The heap + is initialised automatically when the first allocation is made. */ + if( pxBlock != NULL ) + { + do + { + /* Increment the number of blocks and record the largest block seen + so far. */ + xBlocks++; + + if( pxBlock->xBlockSize > xMaxSize ) + { + xMaxSize = pxBlock->xBlockSize; + } + + if( pxBlock->xBlockSize < xMinSize ) + { + xMinSize = pxBlock->xBlockSize; + } + + /* Move to the next block in the chain until the last block is + reached. */ + pxBlock = pxBlock->pxNextFreeBlock; + } while( pxBlock != pxEnd ); + } + } + xTaskResumeAll(); + + pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize; + pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize; + pxHeapStats->xNumberOfFreeBlocks = xBlocks; + + taskENTER_CRITICAL(); + { + pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining; + pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations; + pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees; + pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining; + } + taskEXIT_CRITICAL(); +} + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/queue.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/queue.c new file mode 100644 index 0000000..b3203b8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/queue.c @@ -0,0 +1,2945 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +#if ( configUSE_CO_ROUTINES == 1 ) + #include "croutine.h" +#endif + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified +because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined +for the header files above, but not in this file, in order to generate the +correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + + +/* Constants used with the cRxLock and cTxLock structure members. */ +#define queueUNLOCKED ( ( int8_t ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) + +/* When the Queue_t structure is used to represent a base queue its pcHead and +pcTail members are used as pointers into the queue storage area. When the +Queue_t structure is used to represent a mutex pcHead and pcTail pointers are +not necessary, and the pcHead pointer is set to NULL to indicate that the +structure instead holds a pointer to the mutex holder (if any). Map alternative +names to the pcHead and structure member to ensure the readability of the code +is maintained. The QueuePointers_t and SemaphoreData_t types are used to form +a union as their usage is mutually exclusive dependent on what the queue is +being used for. */ +#define uxQueueType pcHead +#define queueQUEUE_IS_MUTEX NULL + +typedef struct QueuePointers +{ + int8_t *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + int8_t *pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ +} QueuePointers_t; + +typedef struct SemaphoreData +{ + TaskHandle_t xMutexHolder; /*< The handle of the task that holds the mutex. */ + UBaseType_t uxRecursiveCallCount;/*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ +} SemaphoreData_t; + +/* Semaphores do not actually store or copy data, so have an item size of +zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define queueYIELD_IF_USING_PREEMPTION() +#else + #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* + * Definition of the queue used by the scheduler. + * Items are queued by copy, not reference. See the following link for the + * rationale: https://www.freertos.org/Embedded-RTOS-Queues.html + */ +typedef struct QueueDefinition /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +{ + int8_t *pcHead; /*< Points to the beginning of the queue storage area. */ + int8_t *pcWriteTo; /*< Points to the free next place in the storage area. */ + + union + { + QueuePointers_t xQueue; /*< Data required exclusively when this structure is used as a queue. */ + SemaphoreData_t xSemaphore; /*< Data required exclusively when this structure is used as a semaphore. */ + } u; + + List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile UBaseType_t uxMessagesWaiting;/*< The number of items currently in the queue. */ + UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ + + volatile int8_t cRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile int8_t cTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + + #if( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + struct QueueDefinition *pxQueueSetContainer; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxQueueNumber; + uint8_t ucQueueType; + #endif + +} xQUEUE; + +/* The old xQUEUE name is maintained above then typedefed to the new Queue_t +name below to enable the use of older kernel aware debuggers. */ +typedef xQUEUE Queue_t; + +/*-----------------------------------------------------------*/ + +/* + * The queue registry is just a means for kernel aware debuggers to locate + * queue structures. It has no other purpose so is an optional component. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + /* The type stored within the queue registry array. This allows a name + to be assigned to each queue making kernel aware debugging a little + more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + const char *pcQueueName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + QueueHandle_t xHandle; + } xQueueRegistryItem; + + /* The old xQueueRegistryItem name is maintained above then typedefed to the + new xQueueRegistryItem name below to enable the use of older kernel aware + debuggers. */ + typedef xQueueRegistryItem QueueRegistryItem_t; + + /* The queue registry is simply an array of QueueRegistryItem_t structures. + The pcQueueName member of a structure being NULL is indicative of the + array position being vacant. */ + PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; + +#endif /* configQUEUE_REGISTRY_SIZE */ + +/* + * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not + * prevent an ISR from adding or removing items to the queue, but does prevent + * an ISR from removing tasks from the queue event lists. If an ISR finds a + * queue is locked it will instead increment the appropriate queue lock count + * to indicate that a task may require unblocking. When the queue in unlocked + * these lock counts are inspected, and the appropriate action taken. + */ +static void prvUnlockQueue( Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any data in a queue. + * + * @return pdTRUE if the queue contains no items, otherwise pdFALSE. + */ +static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any space in a queue. + * + * @return pdTRUE if there is no space, otherwise pdFALSE; + */ +static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Copies an item into the queue, either at the front of the queue or the + * back of the queue. + */ +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) PRIVILEGED_FUNCTION; + +/* + * Copies an item out of a queue. + */ +static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_QUEUE_SETS == 1 ) + /* + * Checks to see if a queue is a member of a queue set, and if so, notifies + * the queue set that the queue contains data. + */ + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * Called after a Queue_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; + +/* + * Mutexes are a special type of queue. When a mutex is created, first the + * queue is created, then prvInitialiseMutex() is called to configure the queue + * as a mutex. + */ +#if( configUSE_MUTEXES == 1 ) + static void prvInitialiseMutex( Queue_t *pxNewQueue ) PRIVILEGED_FUNCTION; +#endif + +#if( configUSE_MUTEXES == 1 ) + /* + * If a task waiting for a mutex causes the mutex holder to inherit a + * priority, but the waiting task times out, then the holder should + * disinherit the priority - but only down to the highest priority of any + * other tasks that are waiting for the same mutex. This function returns + * that priority. + */ + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* + * Macro to mark a queue as locked. Locking a queue prevents an ISR from + * accessing the queue event lists. + */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, BaseType_t xNewQueue ) +{ +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; + pxQueue->pcWriteTo = pxQueue->pcHead; + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->cRxLock = queueUNLOCKED; + pxQueue->cTxLock = queueUNLOCKED; + + if( xNewQueue == pdFALSE ) + { + /* If there are tasks blocked waiting to read from the queue, then + the tasks will remain blocked as after this function exits the queue + will still be empty. If there are tasks blocked waiting to write to + the queue, then one should be unblocked as after this function exits + it will be possible to write to it. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Ensure the event queues start in the correct state. */ + vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); + } + } + taskEXIT_CRITICAL(); + + /* A value is returned for calling semantic consistency with previous + versions. */ + return pdPASS; +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, StaticQueue_t *pxStaticQueue, const uint8_t ucQueueType ) + { + Queue_t *pxNewQueue; + + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + + /* The StaticQueue_t structure and the queue storage area must be + supplied. */ + configASSERT( pxStaticQueue != NULL ); + + /* A queue storage area should be provided if the item size is not 0, and + should not be provided if the item size is 0. */ + configASSERT( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0 ) ) ); + configASSERT( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0 ) ) ); + + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticQueue_t or StaticSemaphore_t equals the size of + the real queue and semaphore structures. */ + volatile size_t xSize = sizeof( StaticQueue_t ); + configASSERT( xSize == sizeof( Queue_t ) ); + ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ + + /* The address of a statically allocated queue was passed in, use it. + The address of a statically allocated storage area was also passed in + but is already set. */ + pxNewQueue = ( Queue_t * ) pxStaticQueue; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + + if( pxNewQueue != NULL ) + { + #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Queues can be allocated wither statically or dynamically, so + note this queue was allocated statically in case the queue is + later deleted. */ + pxNewQueue->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + traceQUEUE_CREATE_FAILED( ucQueueType ); + mtCOVERAGE_TEST_MARKER(); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ) + { + Queue_t *pxNewQueue; + size_t xQueueSizeInBytes; + uint8_t *pucQueueStorage; + + configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); + + /* Allocate enough space to hold the maximum number of items that + can be in the queue at any time. It is valid for uxItemSize to be + zero in the case the queue is used as a semaphore. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Allocate the queue and storage area. Justification for MISRA + deviation as follows: pvPortMalloc() always ensures returned memory + blocks are aligned per the requirements of the MCU stack. In this case + pvPortMalloc() must return a pointer that is guaranteed to meet the + alignment requirements of the Queue_t structure - which in this case + is an int8_t *. Therefore, whenever the stack alignment requirements + are greater than or equal to the pointer to char requirements the cast + is safe. In other cases alignment requirements are not strict (one or + two bytes). */ + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /*lint !e9087 !e9079 see comment above. */ + + if( pxNewQueue != NULL ) + { + /* Jump past the queue structure to find the location of the queue + storage area. */ + pucQueueStorage = ( uint8_t * ) pxNewQueue; + pucQueueStorage += sizeof( Queue_t ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Queues can be created either statically or dynamically, so + note this task was created dynamically in case it is later + deleted. */ + pxNewQueue->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + traceQUEUE_CREATE_FAILED( ucQueueType ); + mtCOVERAGE_TEST_MARKER(); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ) +{ + /* Remove compiler warnings about unused parameters should + configUSE_TRACE_FACILITY not be set to 1. */ + ( void ) ucQueueType; + + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* No RAM was allocated for the queue storage area, but PC head cannot + be set to NULL because NULL is used as a key to say the queue is used as + a mutex. Therefore just set pcHead to point to the queue as a benign + value that is known to be within the memory map. */ + pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; + } + else + { + /* Set the head to the start of the queue storage area. */ + pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; + } + + /* Initialise the queue members as described where the queue type is + defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ + + #if( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif /* configUSE_QUEUE_SETS */ + + traceQUEUE_CREATE( pxNewQueue ); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_MUTEXES == 1 ) + + static void prvInitialiseMutex( Queue_t *pxNewQueue ) + { + if( pxNewQueue != NULL ) + { + /* The queue create function will set all the queue structure members + correctly for a generic queue, but this function is creating a + mutex. Overwrite those members that need to be set differently - + in particular the information required for priority inheritance. */ + pxNewQueue->u.xSemaphore.xMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + + /* In case this is a recursive mutex. */ + pxNewQueue->u.xSemaphore.uxRecursiveCallCount = 0; + + traceCREATE_MUTEX( pxNewQueue ); + + /* Start with the semaphore in the expected state. */ + ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + + return xNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, StaticQueue_t *pxStaticQueue ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + /* Prevent compiler warnings about unused parameters if + configUSE_TRACE_FACILITY does not equal 1. */ + ( void ) ucQueueType; + + xNewQueue = xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + + return xNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; + Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore; + + /* This function is called by xSemaphoreGetMutexHolder(), and should not + be called directly. Note: This is a good way of determining if the + calling task is the mutex holder, but not a good way of determining the + identity of the mutex holder, as the holder may change between the + following critical section exiting and the function returning. */ + taskENTER_CRITICAL(); + { + if( pxSemaphore->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = pxSemaphore->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } + } + taskEXIT_CRITICAL(); + + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + +#endif +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; + + configASSERT( xSemaphore ); + + /* Mutexes cannot be used in interrupt service routines, so the mutex + holder should not change in an ISR, and therefore a critical section is + not required here. */ + if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = ( ( Queue_t * ) xSemaphore )->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } + + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* If this is the task that holds the mutex then xMutexHolder will not + change outside of this task. If this task does not hold the mutex then + pxMutexHolder can never coincidentally equal the tasks handle, and as + this is the only condition we are interested in it does not matter if + pxMutexHolder is accessed simultaneously by another task. Therefore no + mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); + + /* uxRecursiveCallCount cannot be zero if xMutexHolder is equal to + the task handle, therefore no underflow check is required. Also, + uxRecursiveCallCount is only modified by the mutex holder, and as + there can only be one, no mutual exclusion is required to modify the + uxRecursiveCallCount member. */ + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )--; + + /* Has the recursive call count unwound to 0? */ + if( pxMutex->u.xSemaphore.uxRecursiveCallCount == ( UBaseType_t ) 0 ) + { + /* Return the mutex. This will automatically unblock any other + task that might be waiting to access the mutex. */ + ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + /* The mutex cannot be given because the calling task is not the + holder. */ + xReturn = pdFAIL; + + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* Comments regarding mutual exclusion as per those within + xQueueGiveMutexRecursive(). */ + + traceTAKE_MUTEX_RECURSIVE( pxMutex ); + + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueSemaphoreTake( pxMutex, xTicksToWait ); + + /* pdPASS will only be returned if the mutex was successfully + obtained. The calling task may have entered the Blocked state + before reaching here. */ + if( xReturn != pdFAIL ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount, StaticQueue_t *pxStaticQueue ) + { + QueueHandle_t xHandle; + + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); + + xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount ) + { + QueueHandle_t xHandle; + + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); + + xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition ) +{ +BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; +TimeOut_t xTimeOut; +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + + /*lint -save -e904 This function relaxes the coding standard somewhat to + allow return statements within the function itself. This is done in the + interest of execution time efficiency. */ + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? The running task must be the + highest priority task wanting to access the queue. If the head item + in the queue is to be overwritten then it does not matter if the + queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND( pxQueue ); + + #if ( configUSE_QUEUE_SETS == 1 ) + { + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + was overwritten in the queue so the number of items + in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to + do this from within the critical section - the + kernel takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes + and the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to do + this from within the critical section - the kernel + takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + executed if the task was holding multiple mutexes and + the mutexes were given back in an order that is + different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was full and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + event list. It is possible that interrupts occurring now + remove this task from the event list again - but as the + scheduler is suspended the task will go onto the pending + ready last instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + ready list into the ready list - so it is feasible that this + task is already in a ready list before it yields - in which + case the yield will not cause a context switch unless there + is also a higher priority task in the pending ready list. */ + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, const void * const pvItemToQueue, BaseType_t * const pxHigherPriorityTaskWoken, const BaseType_t xCopyPosition ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + /* Similar to xQueueGenericSend, except without blocking if there is no room + in the queue. Also don't directly wake a task that was blocked on a queue + read, instead return a flag to say whether a context switch is required or + not (i.e. has a task with a higher priority than us been woken by this + post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + const int8_t cTxLock = pxQueue->cTxLock; + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a + semaphore or mutex. That means prvCopyDataToQueue() cannot result + in a task disinheriting a priority and prvCopyDataToQueue() can be + called here even though the disinherit function does not check if + the scheduler is suspended before accessing the ready lists. */ + ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* The event list is not altered if the queue is locked. This will + be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + was overwritten in the queue so the number of items + in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Not used in this path. */ + ( void ) uxPreviousMessagesWaiting; + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, BaseType_t * const pxHigherPriorityTaskWoken ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = xQueue; + + /* Similar to xQueueGenericSendFromISR() but used with semaphores where the + item size is 0. Don't directly wake a task that was blocked on a queue + read, instead return a flag to say whether a context switch is required or + not (i.e. has a task with a higher priority than us been woken by this + post). */ + + configASSERT( pxQueue ); + + /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() + if the item size is not 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Normally a mutex would not be given from an interrupt, especially if + there is a mutex holder, as priority inheritance makes no sense for an + interrupts, only tasks. */ + configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* When the queue is used to implement a semaphore no data is ever + moved through the queue but it is still valid to see if the queue 'has + space'. */ + if( uxMessagesWaiting < pxQueue->uxLength ) + { + const int8_t cTxLock = pxQueue->cTxLock; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* A task can only have an inherited priority if it is a mutex + holder - and if there is a mutex holder then the mutex cannot be + given from an ISR. As this is the ISR version of the function it + can be assumed there is no mutex holder and no need to determine if + priority disinheritance is needed. Simply increase the count of + messages (semaphores) available. */ + pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + + /* The event list is not altered if the queue is locked. This will + be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The semaphore is a member of a queue set, and + posting to the queue set caused a higher priority + task to unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + pxQueue->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceive( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) +{ +BaseType_t xEntryTimeSet = pdFALSE; +TimeOut_t xTimeOut; +Queue_t * const pxQueue = xQueue; + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + is zero (so no data is copied into the buffer. */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + + /*lint -save -e904 This function relaxes the coding standard somewhat to + allow return statements within the function itself. This is done in the + interest of execution time efficiency. */ + for( ;; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data available, remove one item. */ + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_RECEIVE( pxQueue ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + + /* There is now space in the queue, were any tasks waiting to + post to the queue? If so, unblock the highest priority waiting + task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* The timeout has not expired. If the queue is still empty place + the task on the list of tasks waiting to receive from the queue. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The queue contains data again. Loop back to try and read the + data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* Timed out. If there is no data in the queue exit, otherwise loop + back and attempt to read the data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait ) +{ +BaseType_t xEntryTimeSet = pdFALSE; +TimeOut_t xTimeOut; +Queue_t * const pxQueue = xQueue; + +#if( configUSE_MUTEXES == 1 ) + BaseType_t xInheritanceOccurred = pdFALSE; +#endif + + /* Check the queue pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* Check this really is a semaphore, in which case the item size will be + 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + + /*lint -save -e904 This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Semaphores are queues with an item size of 0, and where the + number of messages in the queue is the semaphore's count value. */ + const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + must be the highest priority task wanting to access the queue. */ + if( uxSemaphoreCount > ( UBaseType_t ) 0 ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* Semaphores are queues with a data size of zero and where the + messages waiting is the semaphore's count. Reduce the count. */ + pxQueue->uxMessagesWaiting = uxSemaphoreCount - ( UBaseType_t ) 1; + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + priority inheritance should it become necessary. */ + pxQueue->u.xSemaphore.xMutexHolder = pvTaskIncrementMutexHeldCount(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + + /* Check to see if other tasks are blocked waiting to give the + semaphore, and if so, unblock the highest priority such task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* For inheritance to have occurred there must have been an + initial timeout, and an adjusted timeout cannot become 0, as + if it were 0 the function would have exited. */ + #if( configUSE_MUTEXES == 1 ) + { + configASSERT( xInheritanceOccurred == pdFALSE ); + } + #endif /* configUSE_MUTEXES */ + + /* The semaphore count was 0 and no block time is specified + (or the block time has expired) so exit now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The semaphore count was 0 and a block time was specified + so configure the timeout structure ready to block. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can give to and take from the semaphore + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* A block time is specified and not expired. If the semaphore + count is 0 then enter the Blocked state to wait for a semaphore to + become available. As semaphores are implemented with queues the + queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + taskENTER_CRITICAL(); + { + xInheritanceOccurred = xTaskPriorityInherit( pxQueue->u.xSemaphore.xMutexHolder ); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* There was no timeout and the semaphore count was not 0, so + attempt to take the semaphore again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* Timed out. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + /* If the semaphore count is 0 exit now as the timeout has + expired. Otherwise return to attempt to take the semaphore that is + known to be available. As semaphores are implemented by queues the + queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + #if ( configUSE_MUTEXES == 1 ) + { + /* xInheritanceOccurred could only have be set if + pxQueue->uxQueueType == queueQUEUE_IS_MUTEX so no need to + test the mutex type again to check it is actually a mutex. */ + if( xInheritanceOccurred != pdFALSE ) + { + taskENTER_CRITICAL(); + { + UBaseType_t uxHighestWaitingPriority; + + /* This task blocking on the mutex caused another + task to inherit this task's priority. Now this task + has timed out the priority should be disinherited + again, but only as low as the next highest priority + task that is waiting for the same mutex. */ + uxHighestWaitingPriority = prvGetDisinheritPriorityAfterTimeout( pxQueue ); + vTaskPriorityDisinheritAfterTimeout( pxQueue->u.xSemaphore.xMutexHolder, uxHighestWaitingPriority ); + } + taskEXIT_CRITICAL(); + } + } + #endif /* configUSE_MUTEXES */ + + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeek( QueueHandle_t xQueue, void * const pvBuffer, TickType_t xTicksToWait ) +{ +BaseType_t xEntryTimeSet = pdFALSE; +TimeOut_t xTimeOut; +int8_t *pcOriginalReadPosition; +Queue_t * const pxQueue = xQueue; + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + is zero (so no data is copied into the buffer. */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + + /*lint -save -e904 This function relaxes the coding standard somewhat to + allow return statements within the function itself. This is done in the + interest of execution time efficiency. */ + for( ;; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Remember the read position so it can be reset after the data + is read from the queue as this function is only peeking the + data, not removing it. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_PEEK( pxQueue ); + + /* The data is not being removed, so reset the read pointer. */ + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + configure the timeout structure ready to enter the blocked + state. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* Timeout has not expired yet, check to see if there is data in the + queue now, and if not enter the Blocked state to wait for data. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_PEEK( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* There is data in the queue now, so don't enter the blocked + state, instead return to try and obtain the data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. If there is still no data in the queue + exit, otherwise go back and try to read the data again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer, BaseType_t * const pxHigherPriorityTaskWoken ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Cannot block in an ISR, so check there is data available. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + const int8_t cRxLock = pxQueue->cRxLock; + + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + + /* If the queue is locked the event list will not be modified. + Instead update the lock count so the task that unlocks the queue + will know that an ISR has removed data while the queue was + locked. */ + if( cRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + force a context switch. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was removed while it was locked. */ + pxQueue->cRxLock = ( int8_t ) ( cRxLock + 1 ); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, void * const pvBuffer ) +{ +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; +int8_t *pcOriginalReadPosition; +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); + + /* Remember the read position so it can be reset as nothing is + actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; + + configASSERT( xQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) +{ +UBaseType_t uxReturn; +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + uxReturn = pxQueue->uxMessagesWaiting; + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +void vQueueDelete( QueueHandle_t xQueue ) +{ +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + traceQUEUE_DELETE( pxQueue ); + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + vQueueUnregisterQueue( pxQueue ); + } + #endif + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The queue can only have been allocated dynamically - free it + again. */ + vPortFree( pxQueue ); + } + #elif( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The queue could have been allocated statically or dynamically, so + check before attempting to free the memory. */ + if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxQueue ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else + { + /* The queue must have been statically allocated, so is not going to be + deleted. Avoid compiler warnings about the unused parameter. */ + ( void ) pxQueue; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vQueueSetQueueNumber( QueueHandle_t xQueue, UBaseType_t uxQueueNumber ) + { + ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->ucQueueType; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if( configUSE_MUTEXES == 1 ) + + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) + { + UBaseType_t uxHighestPriorityOfWaitingTasks; + + /* If a task waiting for a mutex causes the mutex holder to inherit a + priority, but the waiting task times out, then the holder should + disinherit the priority - but only down to the highest priority of any + other tasks that are waiting for the same mutex. For this purpose, + return the priority of the highest priority task that is waiting for the + mutex. */ + if( listCURRENT_LIST_LENGTH( &( pxQueue->xTasksWaitingToReceive ) ) > 0U ) + { + uxHighestPriorityOfWaitingTasks = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) listGET_ITEM_VALUE_OF_HEAD_ENTRY( &( pxQueue->xTasksWaitingToReceive ) ); + } + else + { + uxHighestPriorityOfWaitingTasks = tskIDLE_PRIORITY; + } + + return uxHighestPriorityOfWaitingTasks; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, const void *pvItemToQueue, const BaseType_t xPosition ) +{ +BaseType_t xReturn = pdFALSE; +UBaseType_t uxMessagesWaiting; + + /* This function is called from a critical section. */ + + uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder ); + pxQueue->u.xSemaphore.xMutexHolder = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + } + else if( xPosition == queueSEND_TO_BACK ) + { + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ + pxQueue->pcWriteTo += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ + if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e9087 !e418 MISRA exception as the casts are only redundant for some ports. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. Assert checks null pointer only used when length is 0. */ + pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize; + if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xPosition == queueOVERWRITE ) + { + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* An item is not being added but overwritten, so subtract + one from the recorded number of items in the queue so when + one is added again below the number of recorded items remains + correct. */ + --uxMessagesWaiting; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataFromQueue( Queue_t * const pxQueue, void * const pvBuffer ) +{ + if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) + { + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ + } +} +/*-----------------------------------------------------------*/ + +static void prvUnlockQueue( Queue_t * const pxQueue ) +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + removed from the queue while the queue was locked. When a queue is + locked items can be added or removed, but the event lists cannot be + updated. */ + taskENTER_CRITICAL(); + { + int8_t cTxLock = pxQueue->cTxLock; + + /* See if data was added to the queue while it was locked. */ + while( cTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + blocked waiting for data to become available? */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting to + the queue set caused a higher priority task to unblock. + A context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Tasks that are removed from the event list will get + added to the pending ready list as the scheduler is still + suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that + a context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + #endif /* configUSE_QUEUE_SETS */ + + --cTxLock; + } + + pxQueue->cTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); + { + int8_t cRxLock = pxQueue->cRxLock; + + while( cRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --cRxLock; + } + else + { + break; + } + } + + pxQueue->cRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueEmpty( const Queue_t *pxQueue ) +{ +BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) +{ +BaseType_t xReturn; +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueFull( const Queue_t *pxQueue ) +{ +BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) +{ +BaseType_t xReturn; +Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + /* If the queue is already full we may have to block. A critical section + is required to prevent an interrupt removing something from the queue + between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + /* The queue is full - do we want to block or just leave without + posting? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; + + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceive( QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + /* If the queue is already empty we may have to block. A critical section + is required to prevent an interrupt adding something to the queue + between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + leave with nothing? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, const void *pvItemToQueue, BaseType_t xCoRoutinePreviouslyWoken ) + { + Queue_t * const pxQueue = xQueue; + + /* Cannot block within an ISR so if there is no space on the queue then + exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + + /* We only want to wake one co-routine per ISR, so check that a + co-routine has not already been woken. */ + if( xCoRoutinePreviouslyWoken == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCoRoutinePreviouslyWoken; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, void *pvBuffer, BaseType_t *pxCoRoutineWoken ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + /* We cannot block from an ISR, so check there is data available. If + not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + if( ( *pxCoRoutineWoken ) == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueAddToRegistry( QueueHandle_t xQueue, const char *pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + + /* See if there is an empty space in the registry. A NULL name denotes + a free slot. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].pcQueueName == NULL ) + { + /* Store the information on this queue. */ + xQueueRegistry[ ux ].pcQueueName = pcQueueName; + xQueueRegistry[ ux ].xHandle = xQueue; + + traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + const char *pcQueueGetName( QueueHandle_t xQueue ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + const char *pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + /* Note there is nothing here to protect against another task adding or + removing entries from the registry while it is being searched. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + pcReturn = xQueueRegistry[ ux ].pcQueueName; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return pcReturn; + } /*lint !e818 xQueue cannot be a pointer to const because it is a typedef. */ + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueUnregisterQueue( QueueHandle_t xQueue ) + { + UBaseType_t ux; + + /* See if the handle of the queue being unregistered in actually in the + registry. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; + + /* Set the handle to NULL to ensure the same queue handle cannot + appear in the registry twice if it is added, removed, then + added again. */ + xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) + { + Queue_t * const pxQueue = xQueue; + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements. + It can result in vListInsert() being called on a list that can only + possibly ever have one item in it, so the list will be fast, but even + so it should be called with the scheduler locked and not from a critical + section. */ + + /* Only do anything if there are no messages in the queue. This function + will not actually cause the task to block, just place it on a blocked + list. It will not block until the scheduler is unlocked - at which + time a yield will be performed. If an item is added to the queue while + the queue is locked, and the calling task blocks on the queue, then the + calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + prvUnlockQueue( pxQueue ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +#if( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) + { + QueueSetHandle_t pxQueue; + + pxQueue = xQueueGenericCreate( uxEventQueueLength, ( UBaseType_t ) sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); + + return pxQueue; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) + { + /* Cannot add a queue/semaphore to more than one queue set. */ + xReturn = pdFAIL; + } + else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* Cannot add a queue/semaphore to a queue set if there are already + items in the queue/semaphore. */ + xReturn = pdFAIL; + } + else + { + ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; + + if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) + { + /* The queue was not a member of the set. */ + xReturn = pdFAIL; + } + else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* It is dangerous to remove a queue from a set when the queue is + not empty because the queue set will still hold pending events for + the queue. */ + xReturn = pdFAIL; + } + else + { + taskENTER_CRITICAL(); + { + /* The queue is no longer contained in the set. */ + pxQueueOrSemaphore->pxQueueSetContainer = NULL; + } + taskEXIT_CRITICAL(); + xReturn = pdPASS; + } + + return xReturn; + } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t const xTicksToWait ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) + { + Queue_t *pxQueueSetContainer = pxQueue->pxQueueSetContainer; + BaseType_t xReturn = pdFALSE; + + /* This function must be called form a critical section. */ + + configASSERT( pxQueueSetContainer ); + configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); + + if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) + { + const int8_t cTxLock = pxQueueSetContainer->cTxLock; + + traceQUEUE_SEND( pxQueueSetContainer ); + + /* The data copied is the handle of the queue that contains data. */ + xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, queueSEND_TO_BACK ); + + if( cTxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + pxQueueSetContainer->cTxLock = ( int8_t ) ( cTxLock + 1 ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ + + + + + + + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c new file mode 100644 index 0000000..7ad5d54 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c @@ -0,0 +1,1263 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "stream_buffer.h" + +#if( configUSE_TASK_NOTIFICATIONS != 1 ) + #error configUSE_TASK_NOTIFICATIONS must be set to 1 to build stream_buffer.c +#endif + +/* Lint e961, e9021 and e750 are suppressed as a MISRA exception justified +because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined +for the header files above, but not in this file, in order to generate the +correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + +/* If the user has not provided application specific Rx notification macros, +or #defined the notification macros away, them provide default implementations +that uses task notifications. */ +/*lint -save -e9026 Function like macros allowed and needed here so they can be overidden. */ +#ifndef sbRECEIVE_COMPLETED + #define sbRECEIVE_COMPLETED( pxStreamBuffer ) \ + vTaskSuspendAll(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + ( void ) xTaskResumeAll(); +#endif /* sbRECEIVE_COMPLETED */ + +#ifndef sbRECEIVE_COMPLETED_FROM_ISR + #define sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \ + pxHigherPriorityTaskWoken ) \ + { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction, \ + pxHigherPriorityTaskWoken ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } +#endif /* sbRECEIVE_COMPLETED_FROM_ISR */ + +/* If the user has not provided an application specific Tx notification macro, +or #defined the notification macro away, them provide a default implementation +that uses task notifications. */ +#ifndef sbSEND_COMPLETED + #define sbSEND_COMPLETED( pxStreamBuffer ) \ + vTaskSuspendAll(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + ( void ) xTaskResumeAll(); +#endif /* sbSEND_COMPLETED */ + +#ifndef sbSEND_COMPLETE_FROM_ISR + #define sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction, \ + pxHigherPriorityTaskWoken ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } +#endif /* sbSEND_COMPLETE_FROM_ISR */ +/*lint -restore (9026) */ + +/* The number of bytes used to hold the length of a message in the buffer. */ +#define sbBYTES_TO_STORE_MESSAGE_LENGTH ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) ) + +/* Bits stored in the ucFlags field of the stream buffer. */ +#define sbFLAGS_IS_MESSAGE_BUFFER ( ( uint8_t ) 1 ) /* Set if the stream buffer was created as a message buffer, in which case it holds discrete messages rather than a stream. */ +#define sbFLAGS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 2 ) /* Set if the stream buffer was created using statically allocated memory. */ + +/*-----------------------------------------------------------*/ + +/* Structure that hold state information on the buffer. */ +typedef struct StreamBufferDef_t /*lint !e9058 Style convention uses tag. */ +{ + volatile size_t xTail; /* Index to the next item to read within the buffer. */ + volatile size_t xHead; /* Index to the next item to write within the buffer. */ + size_t xLength; /* The length of the buffer pointed to by pucBuffer. */ + size_t xTriggerLevelBytes; /* The number of bytes that must be in the stream buffer before a task that is waiting for data is unblocked. */ + volatile TaskHandle_t xTaskWaitingToReceive; /* Holds the handle of a task waiting for data, or NULL if no tasks are waiting. */ + volatile TaskHandle_t xTaskWaitingToSend; /* Holds the handle of a task waiting to send data to a message buffer that is full. */ + uint8_t *pucBuffer; /* Points to the buffer itself - that is - the RAM that stores the data passed through the buffer. */ + uint8_t ucFlags; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; /* Used for tracing purposes. */ + #endif +} StreamBuffer_t; + +/* + * The number of bytes available to be read from the buffer. + */ +static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) PRIVILEGED_FUNCTION; + +/* + * Add xCount bytes from pucData into the pxStreamBuffer message buffer. + * Returns the number of bytes written, which will either equal xCount in the + * success case, or 0 if there was not enough space in the buffer (in which case + * no data is written into the buffer). + */ +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, const uint8_t *pucData, size_t xCount ) PRIVILEGED_FUNCTION; + +/* + * If the stream buffer is being used as a message buffer, then reads an entire + * message out of the buffer. If the stream buffer is being used as a stream + * buffer then read as many bytes as possible from the buffer. + * prvReadBytesFromBuffer() is called to actually extract the bytes from the + * buffer's data storage area. + */ +static size_t prvReadMessageFromBuffer( StreamBuffer_t *pxStreamBuffer, + void *pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable, + size_t xBytesToStoreMessageLength ) PRIVILEGED_FUNCTION; + +/* + * If the stream buffer is being used as a message buffer, then writes an entire + * message to the buffer. If the stream buffer is being used as a stream + * buffer then write as many bytes as possible to the buffer. + * prvWriteBytestoBuffer() is called to actually send the bytes to the buffer's + * data storage area. + */ +static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) PRIVILEGED_FUNCTION; + +/* + * Read xMaxCount bytes from the pxStreamBuffer message buffer and write them + * to pucData. + */ +static size_t prvReadBytesFromBuffer( StreamBuffer_t *pxStreamBuffer, + uint8_t *pucData, + size_t xMaxCount, + size_t xBytesAvailable ) PRIVILEGED_FUNCTION; + +/* + * Called by both pxStreamBufferCreate() and pxStreamBufferCreateStatic() to + * initialise the members of the newly created stream buffer structure. + */ +static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer ) + { + uint8_t *pucAllocatedMemory; + uint8_t ucFlags; + + /* In case the stream buffer is going to be used as a message buffer + (that is, it will hold discrete messages with a little meta data that + says how big the next message is) check the buffer will be large enough + to hold at least one message. */ + if( xIsMessageBuffer == pdTRUE ) + { + /* Is a message buffer but not statically allocated. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER; + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + } + else + { + /* Not a message buffer and not statically allocated. */ + ucFlags = 0; + configASSERT( xBufferSizeBytes > 0 ); + } + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + + /* A trigger level of 0 would cause a waiting task to unblock even when + the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } + + /* A stream buffer requires a StreamBuffer_t structure and a buffer. + Both are allocated in a single call to pvPortMalloc(). The + StreamBuffer_t structure is placed at the start of the allocated memory + and the buffer follows immediately after. The requested size is + incremented so the free space is returned as the user would expect - + this is a quirk of the implementation that means otherwise the free + space would be reported as one byte smaller than would be logically + expected. */ + xBufferSizeBytes++; + pucAllocatedMemory = ( uint8_t * ) pvPortMalloc( xBufferSizeBytes + sizeof( StreamBuffer_t ) ); /*lint !e9079 malloc() only returns void*. */ + + if( pucAllocatedMemory != NULL ) + { + prvInitialiseNewStreamBuffer( ( StreamBuffer_t * ) pucAllocatedMemory, /* Structure at the start of the allocated memory. */ /*lint !e9087 Safe cast as allocated memory is aligned. */ /*lint !e826 Area is not too small and alignment is guaranteed provided malloc() behaves as expected and returns aligned buffer. */ + pucAllocatedMemory + sizeof( StreamBuffer_t ), /* Storage area follows. */ /*lint !e9016 Indexing past structure valid for uint8_t pointer, also storage area has no alignment requirement. */ + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags ); + + traceSTREAM_BUFFER_CREATE( ( ( StreamBuffer_t * ) pucAllocatedMemory ), xIsMessageBuffer ); + } + else + { + traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ); + } + + return ( StreamBufferHandle_t ) pucAllocatedMemory; /*lint !e9087 !e826 Safe cast as allocated memory is aligned. */ + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer ) + { + StreamBuffer_t * const pxStreamBuffer = ( StreamBuffer_t * ) pxStaticStreamBuffer; /*lint !e740 !e9087 Safe cast as StaticStreamBuffer_t is opaque Streambuffer_t. */ + StreamBufferHandle_t xReturn; + uint8_t ucFlags; + + configASSERT( pucStreamBufferStorageArea ); + configASSERT( pxStaticStreamBuffer ); + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + + /* A trigger level of 0 would cause a waiting task to unblock even when + the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } + + if( xIsMessageBuffer != pdFALSE ) + { + /* Statically allocated message buffer. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER | sbFLAGS_IS_STATICALLY_ALLOCATED; + } + else + { + /* Statically allocated stream buffer. */ + ucFlags = sbFLAGS_IS_STATICALLY_ALLOCATED; + } + + /* In case the stream buffer is going to be used as a message buffer + (that is, it will hold discrete messages with a little meta data that + says how big the next message is) check the buffer will be large enough + to hold at least one message. */ + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticStreamBuffer_t equals the size of the real + message buffer structure. */ + volatile size_t xSize = sizeof( StaticStreamBuffer_t ); + configASSERT( xSize == sizeof( StreamBuffer_t ) ); + } /*lint !e529 xSize is referenced is configASSERT() is defined. */ + #endif /* configASSERT_DEFINED */ + + if( ( pucStreamBufferStorageArea != NULL ) && ( pxStaticStreamBuffer != NULL ) ) + { + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pucStreamBufferStorageArea, + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags ); + + /* Remember this was statically allocated in case it is ever deleted + again. */ + pxStreamBuffer->ucFlags |= sbFLAGS_IS_STATICALLY_ALLOCATED; + + traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ); + + xReturn = ( StreamBufferHandle_t ) pxStaticStreamBuffer; /*lint !e9087 Data hiding requires cast to opaque type. */ + } + else + { + xReturn = NULL; + traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ); + } + + return xReturn; + } + +#endif /* ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + +void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) +{ +StreamBuffer_t * pxStreamBuffer = xStreamBuffer; + + configASSERT( pxStreamBuffer ); + + traceSTREAM_BUFFER_DELETE( xStreamBuffer ); + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) pdFALSE ) + { + #if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both the structure and the buffer were allocated using a single call + to pvPortMalloc(), hence only one call to vPortFree() is required. */ + vPortFree( ( void * ) pxStreamBuffer ); /*lint !e9087 Standard free() semantics require void *, plus pxStreamBuffer was allocated by pvPortMalloc(). */ + } + #else + { + /* Should not be possible to get here, ucFlags must be corrupt. + Force an assert. */ + configASSERT( xStreamBuffer == ( StreamBufferHandle_t ) ~0 ); + } + #endif + } + else + { + /* The structure and buffer were not allocated dynamically and cannot be + freed - just scrub the structure so future use will assert. */ + ( void ) memset( pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) +{ +StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +BaseType_t xReturn = pdFAIL; + +#if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; +#endif + + configASSERT( pxStreamBuffer ); + + #if( configUSE_TRACE_FACILITY == 1 ) + { + /* Store the stream buffer number so it can be restored after the + reset. */ + uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber; + } + #endif + + /* Can only reset a message buffer if there are no tasks blocked on it. */ + taskENTER_CRITICAL(); + { + if( pxStreamBuffer->xTaskWaitingToReceive == NULL ) + { + if( pxStreamBuffer->xTaskWaitingToSend == NULL ) + { + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pxStreamBuffer->pucBuffer, + pxStreamBuffer->xLength, + pxStreamBuffer->xTriggerLevelBytes, + pxStreamBuffer->ucFlags ); + xReturn = pdPASS; + + #if( configUSE_TRACE_FACILITY == 1 ) + { + pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } + #endif + + traceSTREAM_BUFFER_RESET( xStreamBuffer ); + } + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) +{ +StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +BaseType_t xReturn; + + configASSERT( pxStreamBuffer ); + + /* It is not valid for the trigger level to be 0. */ + if( xTriggerLevel == ( size_t ) 0 ) + { + xTriggerLevel = ( size_t ) 1; + } + + /* The trigger level is the number of bytes that must be in the stream + buffer before a task that is waiting for data is unblocked. */ + if( xTriggerLevel <= pxStreamBuffer->xLength ) + { + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevel; + xReturn = pdPASS; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) +{ +const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +size_t xSpace; + + configASSERT( pxStreamBuffer ); + + xSpace = pxStreamBuffer->xLength + pxStreamBuffer->xTail; + xSpace -= pxStreamBuffer->xHead; + xSpace -= ( size_t ) 1; + + if( xSpace >= pxStreamBuffer->xLength ) + { + xSpace -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xSpace; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) +{ +const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +size_t xReturn; + + configASSERT( pxStreamBuffer ); + + xReturn = prvBytesInBuffer( pxStreamBuffer ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void *pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) +{ +StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +size_t xReturn, xSpace = 0; +size_t xRequiredSpace = xDataLengthBytes; +TimeOut_t xTimeOut; + + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); + + /* This send function is used to write to both message buffers and stream + buffers. If this is a message buffer then the space needed must be + increased by the amount of bytes needed to store the length of the + message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + + /* Overflow? */ + configASSERT( xRequiredSpace > xDataLengthBytes ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xTicksToWait != ( TickType_t ) 0 ) + { + vTaskSetTimeOutState( &xTimeOut ); + + do + { + /* Wait until the required number of bytes are free in the message + buffer. */ + taskENTER_CRITICAL(); + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + + if( xSpace < xRequiredSpace ) + { + /* Clear notification state as going to wait for space. */ + ( void ) xTaskNotifyStateClear( NULL ); + + /* Should only be one writer. */ + configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL ); + pxStreamBuffer->xTaskWaitingToSend = xTaskGetCurrentTaskHandle(); + } + else + { + taskEXIT_CRITICAL(); + break; + } + } + taskEXIT_CRITICAL(); + + traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToSend = NULL; + + } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xSpace == ( size_t ) 0 ) + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + + if( xReturn > ( size_t ) 0 ) + { + traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ); + + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + sbSEND_COMPLETED( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + const void *pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ +StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +size_t xReturn, xSpace; +size_t xRequiredSpace = xDataLengthBytes; + + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); + + /* This send function is used to write to both message buffers and stream + buffers. If this is a message buffer then the space needed must be + increased by the amount of bytes needed to store the length of the + message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + + if( xReturn > ( size_t ) 0 ) + { + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) +{ + BaseType_t xShouldWrite; + size_t xReturn; + + if( xSpace == ( size_t ) 0 ) + { + /* Doesn't matter if this is a stream buffer or a message buffer, there + is no space to write. */ + xShouldWrite = pdFALSE; + } + else if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) == ( uint8_t ) 0 ) + { + /* This is a stream buffer, as opposed to a message buffer, so writing a + stream of bytes rather than discrete messages. Write as many bytes as + possible. */ + xShouldWrite = pdTRUE; + xDataLengthBytes = configMIN( xDataLengthBytes, xSpace ); + } + else if( xSpace >= xRequiredSpace ) + { + /* This is a message buffer, as opposed to a stream buffer, and there + is enough space to write both the message length and the message itself + into the buffer. Start by writing the length of the data, the data + itself will be written later in this function. */ + xShouldWrite = pdTRUE; + ( void ) prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xDataLengthBytes ), sbBYTES_TO_STORE_MESSAGE_LENGTH ); + } + else + { + /* There is space available, but not enough space. */ + xShouldWrite = pdFALSE; + } + + if( xShouldWrite != pdFALSE ) + { + /* Writes the data itself. */ + xReturn = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes ); /*lint !e9079 Storage buffer is implemented as uint8_t for ease of sizing, alighment and access. */ + } + else + { + xReturn = 0; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void *pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) +{ +StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); + + /* This receive function is used by both message buffers, which store + discrete messages, and stream buffers, which store a continuous stream of + bytes. Discrete messages include an additional + sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + if( xTicksToWait != ( TickType_t ) 0 ) + { + /* Checking if there is data and clearing the notification state must be + performed atomically. */ + taskENTER_CRITICAL(); + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + /* If this function was invoked by a message buffer read then + xBytesToStoreMessageLength holds the number of bytes used to hold + the length of the next discrete message. If this function was + invoked by a stream buffer read then xBytesToStoreMessageLength will + be 0. */ + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Clear notification state as going to wait for data. */ + ( void ) xTaskNotifyStateClear( NULL ); + + /* Should only be one reader. */ + configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL ); + pxStreamBuffer->xTaskWaitingToReceive = xTaskGetCurrentTaskHandle(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Wait for data to be available. */ + traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToReceive = NULL; + + /* Recheck the data available after blocking. */ + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } + + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + holds the number of bytes used to store the message length) or a stream of + bytes (where xBytesToStoreMessageLength is zero), the number of bytes + available must be greater than xBytesToStoreMessageLength to be able to + read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable, xBytesToStoreMessageLength ); + + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ); + sbRECEIVE_COMPLETED( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ); + mtCOVERAGE_TEST_MARKER(); + } + + return xReceivedLength; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) +{ +StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +size_t xReturn, xBytesAvailable, xOriginalTail; +configMESSAGE_BUFFER_LENGTH_TYPE xTempReturn; + + configASSERT( pxStreamBuffer ); + + /* Ensure the stream buffer is being used as a message buffer. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + if( xBytesAvailable > sbBYTES_TO_STORE_MESSAGE_LENGTH ) + { + /* The number of bytes available is greater than the number of bytes + required to hold the length of the next message, so another message + is available. Return its length without removing the length bytes + from the buffer. A copy of the tail is stored so the buffer can be + returned to its prior state as the message is not actually being + removed from the buffer. */ + xOriginalTail = pxStreamBuffer->xTail; + ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempReturn, sbBYTES_TO_STORE_MESSAGE_LENGTH, xBytesAvailable ); + xReturn = ( size_t ) xTempReturn; + pxStreamBuffer->xTail = xOriginalTail; + } + else + { + /* The minimum amount of bytes in a message buffer is + ( sbBYTES_TO_STORE_MESSAGE_LENGTH + 1 ), so if xBytesAvailable is + less than sbBYTES_TO_STORE_MESSAGE_LENGTH the only other valid + value is 0. */ + configASSERT( xBytesAvailable == 0 ); + xReturn = 0; + } + } + else + { + xReturn = 0; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + void *pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ +StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); + + /* This receive function is used by both message buffers, which store + discrete messages, and stream buffers, which store a continuous stream of + bytes. Discrete messages include an additional + sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + holds the number of bytes used to store the message length) or a stream of + bytes (where xBytesToStoreMessageLength is zero), the number of bytes + available must be greater than xBytesToStoreMessageLength to be able to + read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable, xBytesToStoreMessageLength ); + + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ); + + return xReceivedLength; +} +/*-----------------------------------------------------------*/ + +static size_t prvReadMessageFromBuffer( StreamBuffer_t *pxStreamBuffer, + void *pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable, + size_t xBytesToStoreMessageLength ) +{ +size_t xOriginalTail, xReceivedLength, xNextMessageLength; +configMESSAGE_BUFFER_LENGTH_TYPE xTempNextMessageLength; + + if( xBytesToStoreMessageLength != ( size_t ) 0 ) + { + /* A discrete message is being received. First receive the length + of the message. A copy of the tail is stored so the buffer can be + returned to its prior state if the length of the message is too + large for the provided buffer. */ + xOriginalTail = pxStreamBuffer->xTail; + ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempNextMessageLength, xBytesToStoreMessageLength, xBytesAvailable ); + xNextMessageLength = ( size_t ) xTempNextMessageLength; + + /* Reduce the number of bytes available by the number of bytes just + read out. */ + xBytesAvailable -= xBytesToStoreMessageLength; + + /* Check there is enough space in the buffer provided by the + user. */ + if( xNextMessageLength > xBufferLengthBytes ) + { + /* The user has provided insufficient space to read the message + so return the buffer to its previous state (so the length of + the message is in the buffer again). */ + pxStreamBuffer->xTail = xOriginalTail; + xNextMessageLength = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* A stream of bytes is being received (as opposed to a discrete + message), so read as many bytes as possible. */ + xNextMessageLength = xBufferLengthBytes; + } + + /* Read the actual data. */ + xReceivedLength = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) pvRxData, xNextMessageLength, xBytesAvailable ); /*lint !e9079 Data storage area is implemented as uint8_t array for ease of sizing, indexing and alignment. */ + + return xReceivedLength; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) +{ +const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +BaseType_t xReturn; +size_t xTail; + + configASSERT( pxStreamBuffer ); + + /* True if no bytes are available. */ + xTail = pxStreamBuffer->xTail; + if( pxStreamBuffer->xHead == xTail ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) +{ +BaseType_t xReturn; +size_t xBytesToStoreMessageLength; +const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + + configASSERT( pxStreamBuffer ); + + /* This generic version of the receive function is used by both message + buffers, which store discrete messages, and stream buffers, which store a + continuous stream of bytes. Discrete messages include an additional + sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + /* True if the available space equals zero. */ + if( xStreamBufferSpacesAvailable( xStreamBuffer ) <= xBytesToStoreMessageLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) +{ +StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; + + configASSERT( pxStreamBuffer ); + + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ) +{ +StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; +BaseType_t xReturn; +UBaseType_t uxSavedInterruptStatus; + + configASSERT( pxStreamBuffer ); + + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, const uint8_t *pucData, size_t xCount ) +{ +size_t xNextHead, xFirstLength; + + configASSERT( xCount > ( size_t ) 0 ); + + xNextHead = pxStreamBuffer->xHead; + + /* Calculate the number of bytes that can be added in the first write - + which may be less than the total number of bytes that need to be added if + the buffer will wrap back to the beginning. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xNextHead, xCount ); + + /* Write as many bytes as can be written in the first write. */ + configASSERT( ( xNextHead + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void* ) ( &( pxStreamBuffer->pucBuffer[ xNextHead ] ) ), ( const void * ) pucData, xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + + /* If the number of bytes written was less than the number that could be + written in the first write... */ + if( xCount > xFirstLength ) + { + /* ...then write the remaining bytes to the start of the buffer. */ + configASSERT( ( xCount - xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pxStreamBuffer->pucBuffer, ( const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xNextHead += xCount; + if( xNextHead >= pxStreamBuffer->xLength ) + { + xNextHead -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxStreamBuffer->xHead = xNextHead; + + return xCount; +} +/*-----------------------------------------------------------*/ + +static size_t prvReadBytesFromBuffer( StreamBuffer_t *pxStreamBuffer, uint8_t *pucData, size_t xMaxCount, size_t xBytesAvailable ) +{ +size_t xCount, xFirstLength, xNextTail; + + /* Use the minimum of the wanted bytes and the available bytes. */ + xCount = configMIN( xBytesAvailable, xMaxCount ); + + if( xCount > ( size_t ) 0 ) + { + xNextTail = pxStreamBuffer->xTail; + + /* Calculate the number of bytes that can be read - which may be + less than the number wanted if the data wraps around to the start of + the buffer. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xNextTail, xCount ); + + /* Obtain the number of bytes it is possible to obtain in the first + read. Asserts check bounds of read and write. */ + configASSERT( xFirstLength <= xMaxCount ); + configASSERT( ( xNextTail + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pucData, ( const void * ) &( pxStreamBuffer->pucBuffer[ xNextTail ] ), xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + + /* If the total number of wanted bytes is greater than the number + that could be read in the first read... */ + if( xCount > xFirstLength ) + { + /*...then read the remaining bytes from the start of the buffer. */ + configASSERT( xCount <= xMaxCount ); + ( void ) memcpy( ( void * ) &( pucData[ xFirstLength ] ), ( void * ) ( pxStreamBuffer->pucBuffer ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Move the tail pointer to effectively remove the data read from + the buffer. */ + xNextTail += xCount; + + if( xNextTail >= pxStreamBuffer->xLength ) + { + xNextTail -= pxStreamBuffer->xLength; + } + + pxStreamBuffer->xTail = xNextTail; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCount; +} +/*-----------------------------------------------------------*/ + +static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) +{ +/* Returns the distance between xTail and xHead. */ +size_t xCount; + + xCount = pxStreamBuffer->xLength + pxStreamBuffer->xHead; + xCount -= pxStreamBuffer->xTail; + if ( xCount >= pxStreamBuffer->xLength ) + { + xCount -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCount; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags ) +{ + /* Assert here is deliberately writing to the entire buffer to ensure it can + be written to without generating exceptions, and is setting the buffer to a + known value to assist in development/debugging. */ + #if( configASSERT_DEFINED == 1 ) + { + /* The value written just has to be identifiable when looking at the + memory. Don't use 0xA5 as that is the stack fill value and could + result in confusion as to what is actually being observed. */ + const BaseType_t xWriteValue = 0x55; + configASSERT( memset( pucBuffer, ( int ) xWriteValue, xBufferSizeBytes ) == pucBuffer ); + } /*lint !e529 !e438 xWriteValue is only used if configASSERT() is defined. */ + #endif + + ( void ) memset( ( void * ) pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); /*lint !e9087 memset() requires void *. */ + pxStreamBuffer->pucBuffer = pucBuffer; + pxStreamBuffer->xLength = xBufferSizeBytes; + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevelBytes; + pxStreamBuffer->ucFlags = ucFlags; +} + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) + { + return xStreamBuffer->uxStreamBufferNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, UBaseType_t uxStreamBufferNumber ) + { + xStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) + { + return ( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ); + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/tasks.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/tasks.c new file mode 100644 index 0000000..f6a6a9b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/tasks.c @@ -0,0 +1,5310 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "stack_macros.h" + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified +because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined +for the header files above, but not in this file, in order to generate the +correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + +/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting +functions but without including stdio.h here. */ +#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) + /* At the bottom of this file are two optional functions that can be used + to generate human readable text from the raw data generated by the + uxTaskGetSystemState() function. Note the formatting functions are provided + for convenience only, and are NOT considered part of the kernel. */ + #include +#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ + +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define taskYIELD_IF_USING_PREEMPTION() +#else + #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* Values that can be assigned to the ucNotifyState member of the TCB. */ +#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) +#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) +#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) + +/* + * The value used to fill the stack of a task when the task is created. This + * is used purely for checking the high water mark for tasks. + */ +#define tskSTACK_FILL_BYTE ( 0xa5U ) + +/* Bits used to recored how a task's stack and TCB were allocated. */ +#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) +#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) +#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) + +/* If any of the following are set then task stacks are filled with a known +value so the high water mark can be determined. If none of the following are +set then don't fill the stack so there is no unnecessary dependency on memset. */ +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 1 +#else + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 0 +#endif + +/* + * Macros used by vListTask to indicate which state a task is in. + */ +#define tskRUNNING_CHAR ( 'X' ) +#define tskBLOCKED_CHAR ( 'B' ) +#define tskREADY_CHAR ( 'R' ) +#define tskDELETED_CHAR ( 'D' ) +#define tskSUSPENDED_CHAR ( 'S' ) + +/* + * Some kernel aware debuggers require the data the debugger needs access to be + * global, rather than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + +/* The name allocated to the Idle task. This can be overridden by defining +configIDLE_TASK_NAME in FreeRTOSConfig.h. */ +#ifndef configIDLE_TASK_NAME + #define configIDLE_TASK_NAME "IDLE" +#endif + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + + /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is + performed in a generic way that is not optimised to any particular + microcontroller architecture. */ + + /* uxTopReadyPriority holds the priority of the highest priority ready + state task. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) \ + { \ + if( ( uxPriority ) > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( uxPriority ); \ + } \ + } /* taskRECORD_READY_PRIORITY */ + + /*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority = uxTopReadyPriority; \ + \ + /* Find the highest priority queue that contains ready tasks. */ \ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \ + { \ + configASSERT( uxTopPriority ); \ + --uxTopPriority; \ + } \ + \ + /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ + the same priority get an equal share of the processor time. */ \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + uxTopReadyPriority = uxTopPriority; \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK */ + + /*-----------------------------------------------------------*/ + + /* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as + they are only required when a port optimised method of task selection is + being used. */ + #define taskRESET_READY_PRIORITY( uxPriority ) + #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + +#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is + performed in a way that is tailored to the particular microcontroller + architecture being used. */ + + /* A port optimised version is provided. Call the port defined macros. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + + /*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority; \ + \ + /* Find the highest priority list that contains ready tasks. */ \ + portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ + configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ + + /*-----------------------------------------------------------*/ + + /* A port optimised version is provided, call it only if the TCB being reset + is being referenced from a ready list. If it is referenced from a delayed + or suspended list then it won't be in a ready list. */ + #define taskRESET_READY_PRIORITY( uxPriority ) \ + { \ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ + { \ + portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ + } \ + } + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick +count overflows. */ +#define taskSWITCH_DELAYED_LISTS() \ +{ \ + List_t *pxTemp; \ + \ + /* The delayed tasks list should be empty when the lists are switched. */ \ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ + \ + pxTemp = pxDelayedTaskList; \ + pxDelayedTaskList = pxOverflowDelayedTaskList; \ + pxOverflowDelayedTaskList = pxTemp; \ + xNumOfOverflows++; \ + prvResetNextTaskUnblockTime(); \ +} + +/*-----------------------------------------------------------*/ + +/* + * Place the task represented by pxTCB into the appropriate ready list for + * the task. It is inserted at the end of the list. + */ +#define prvAddTaskToReadyList( pxTCB ) \ + traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ + tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +/*-----------------------------------------------------------*/ + +/* + * Several functions take an TaskHandle_t parameter that can optionally be NULL, + * where NULL is used to indicate that the handle of the currently executing + * task should be used in place of the parameter. This macro simply checks to + * see if the parameter is NULL and returns a pointer to the appropriate TCB. + */ +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) ) + +/* The item value of the event list item is normally used to hold the priority +of the task to which it belongs (coded to allow it to be held in reverse +priority order). However, it is occasionally borrowed for other purposes. It +is important its value is not updated due to a task priority change while it is +being used for another purpose. The following bit definition is used to inform +the scheduler that the value should not be changed - in which case it is the +responsibility of whichever module is using the value to ensure it gets set back +to its original value when it is released. */ +#if( configUSE_16_BIT_TICKS == 1 ) + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U +#else + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL +#endif + +/* + * Task control block. A task control block (TCB) is allocated for each task, + * and stores task state information, including a pointer to the task's context + * (the task's run time environment, including register values) + */ +typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +{ + volatile StackType_t *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif + + ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + StackType_t *pxStack; /*< Points to the start of the stack. */ + char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + StackType_t *pxEndOfStack; /*< Points to the highest valid address for the stack. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + #endif + + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t pxTaskTag; + #endif + + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void *pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + + #if( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + /* Allocate a Newlib reent structure that is specific to this task. + Note Newlib support has been included by popular demand, but is not + used by the FreeRTOS maintainers themselves. FreeRTOS is not + responsible for resulting newlib operation. User must be familiar with + newlib and must provide system-wide implementations of the necessary + stubs. Be warned that (at the time of writing) the current newlib design + implements a system-wide malloc() that must be provided with locks. + + See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + for additional information. */ + struct _reent xNewLib_reent; + #endif + + #if( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue; + volatile uint8_t ucNotifyState; + #endif + + /* See the comments in FreeRTOS.h with the definition of + tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDelayAborted; + #endif + + #if( configUSE_POSIX_ERRNO == 1 ) + int iTaskErrno; + #endif + +} tskTCB; + +/* The old tskTCB name is maintained above then typedefed to the new TCB_t name +below to enable the use of older kernel aware debuggers. */ +typedef tskTCB TCB_t; + +/*lint -save -e956 A manual analysis and inspection has been used to determine +which static variables must be declared volatile. */ +PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL; + +/* Lists for ready and blocked tasks. -------------------- +xDelayedTaskList1 and xDelayedTaskList2 could be move to function scople but +doing so breaks some kernel aware debuggers and debuggers that rely on removing +the static qualifier. */ +PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ + +#if( INCLUDE_vTaskDelete == 1 ) + + PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */ + PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U; + +#endif + +#if ( INCLUDE_vTaskSuspend == 1 ) + + PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */ + +#endif + +/* Global POSIX errno. Its value is changed upon context switching to match +the errno of the currently running task. */ +#if ( configUSE_POSIX_ERRNO == 1 ) + int FreeRTOS_errno = 0; +#endif + +/* Other file private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; +PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile TickType_t xPendedTicks = ( TickType_t ) 0U; +PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE; +PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; +PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ +PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ + +/* Context switches are held pending while the scheduler is suspended. Also, +interrupts must not manipulate the xStateListItem of a TCB, or any of the +lists the xStateListItem can be referenced from, if the scheduler is suspended. +If an interrupt needs to unblock a task while the scheduler is suspended then it +moves the task's event list item into the xPendingReadyList, ready for the +kernel to move the task from the pending ready list into the real ready list +when the scheduler is unsuspended. The pending ready list itself can only be +accessed from a critical section. */ +PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE; + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + /* Do not move these variables to function scope as doing so prevents the + code working with debuggers that need to remove the static qualifier. */ + PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ + PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ + +#endif + +/*lint -restore */ + +/*-----------------------------------------------------------*/ + +/* Callback function prototypes. --------------------------*/ +#if( configCHECK_FOR_STACK_OVERFLOW > 0 ) + + extern void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName ); + +#endif + +#if( configUSE_TICK_HOOK > 0 ) + + extern void vApplicationTickHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */ + +#endif + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */ + +#endif + +/* File private functions. --------------------------------*/ + +/** + * Utility task that simply returns pdTRUE if the task referenced by xTask is + * currently in the Suspended state, or pdFALSE if the task referenced by xTask + * is in any other state. + */ +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +#endif /* INCLUDE_vTaskSuspend */ + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first task. + */ +static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; + +/* + * The idle task, which as all tasks is implemented as a never ending loop. + * The idle task is automatically created and added to the ready lists upon + * creation of the first user task. + * + * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); + +/* + * Utility to free all memory allocated by the scheduler to hold a TCB, + * including the stack pointed to by the TCB. + * + * This does not free memory allocated by the task itself (i.e. memory + * allocated by calls to pvPortMalloc from within the tasks application code). + */ +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t *pxTCB ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Used only by the idle task. This checks to see if anything has been placed + * in the list of tasks waiting to be deleted. If so the task is cleaned up + * and its TCB deleted. + */ +static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; + +/* + * The currently executing task is entering the Blocked state. Add the task to + * either the current or the overflow delayed task list. + */ +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * Fills an TaskStatus_t structure with information on each task that is + * referenced from the pxList list (which may be a ready list, a delayed list, + * a suspended list, etc.). + * + * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM + * NORMAL APPLICATION CODE. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Searches pxList for a task with name pcNameToQuery - returning a handle to + * the task if it is found, or NULL if the task is not found. + */ +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) PRIVILEGED_FUNCTION; + +#endif + +/* + * When a task is created, the stack of the task is filled with a known value. + * This function determines the 'high water mark' of the task stack by + * determining how much of the stack remains at the original preset value. + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Return the amount of time, in ticks, that will pass before the kernel will + * next move a task from the Blocked state to the Running state. + * + * This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user + * defined low power mode implementations require configUSE_TICKLESS_IDLE to be + * set to a value other than 1. + */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Set xNextTaskUnblockTime to the time at which the next Blocked state task + * will exit the Blocked state. + */ +static void prvResetNextTaskUnblockTime( void ); + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + /* + * Helper function used to pad task names with spaces when printing out + * human readable tables of task information. + */ + static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Called after a Task_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t *pxNewTCB, + const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION; + +/* + * Called after a new task has been created and initialised to place the task + * under the control of the scheduler. + */ +static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION; + +/* + * freertos_tasks_c_additions_init() should only be called if the user definable + * macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is the only macro + * called by the function. + */ +#ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + + static void freertos_tasks_c_additions_init( void ) PRIVILEGED_FUNCTION; + +#endif + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) + { + TCB_t *pxNewTCB; + TaskHandle_t xReturn; + + configASSERT( puxStackBuffer != NULL ); + configASSERT( pxTaskBuffer != NULL ); + + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticTask_t equals the size of the real task + structure. */ + volatile size_t xSize = sizeof( StaticTask_t ); + configASSERT( xSize == sizeof( TCB_t ) ); + ( void ) xSize; /* Prevent lint warning when configASSERT() is not used. */ + } + #endif /* configASSERT_DEFINED */ + + + if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) ) + { + /* The memory used for the task's TCB and stack are passed into this + function - use them. */ + pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer; + + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + } + else + { + xReturn = NULL; + } + + return xReturn; + } + +#endif /* SUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) + { + TCB_t *pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + + configASSERT( pxTaskDefinition->puxStackBuffer != NULL ); + configASSERT( pxTaskDefinition->pxTaskBuffer != NULL ); + + if( ( pxTaskDefinition->puxStackBuffer != NULL ) && ( pxTaskDefinition->pxTaskBuffer != NULL ) ) + { + /* Allocate space for the TCB. Where the memory comes from depends + on the implementation of the port malloc function and whether or + not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pxTaskDefinition->pxTaskBuffer; + + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + + return xReturn; + } + +#endif /* ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + +#if( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask ) + { + TCB_t *pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + + configASSERT( pxTaskDefinition->puxStackBuffer ); + + if( pxTaskDefinition->puxStackBuffer != NULL ) + { + /* Allocate space for the TCB. Where the memory comes from depends + on the implementation of the port malloc function and whether or + not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note + this task had a statically allocated stack in case it is + later deleted. The TCB was allocated dynamically. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + } + + return xReturn; + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) + { + TCB_t *pxNewTCB; + BaseType_t xReturn; + + /* If the stack grows down then allocate the stack then the TCB so the stack + does not grow into the TCB. Likewise if the stack grows up then allocate + the TCB then the stack. */ + #if( portSTACK_GROWTH > 0 ) + { + /* Allocate space for the TCB. Where the memory comes from depends on + the implementation of the port malloc function and whether or not static + allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + /* Allocate space for the stack used by the task being created. + The base of the stack memory stored in the TCB so the task can + be deleted later if required. */ + pxNewTCB->pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + } + } + #else /* portSTACK_GROWTH */ + { + StackType_t *pxStack; + + /* Allocate space for the stack used by the task being created. */ + pxStack = pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ + + if( pxStack != NULL ) + { + /* Allocate space for the TCB. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */ + + if( pxNewTCB != NULL ) + { + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxStack; + } + else + { + /* The stack cannot be used as the TCB was not created. Free + it again. */ + vPortFree( pxStack ); + } + } + else + { + pxNewTCB = NULL; + } + } + #endif /* portSTACK_GROWTH */ + + if( pxNewTCB != NULL ) + { + #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + task was created dynamically in case it is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t *pxNewTCB, + const MemoryRegion_t * const xRegions ) +{ +StackType_t *pxTopOfStack; +UBaseType_t x; + + #if( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + BaseType_t xRunPrivileged; + if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ + + /* Avoid dependency on memset() if it is not required. */ + #if( tskSET_NEW_STACKS_TO_KNOWN_VALUE == 1 ) + { + /* Fill the stack with a known value to assist debugging. */ + ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) ); + } + #endif /* tskSET_NEW_STACKS_TO_KNOWN_VALUE */ + + /* Calculate the top of stack address. This depends on whether the stack + grows from high memory to low (as per the 80x86) or vice versa. + portSTACK_GROWTH is used to make the result positive or negative as required + by the port. */ + #if( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] ); + pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */ + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + #if( configRECORD_STACK_HIGH_ADDRESS == 1 ) + { + /* Also record the stack's high address, which may assist + debugging. */ + pxNewTCB->pxEndOfStack = pxTopOfStack; + } + #endif /* configRECORD_STACK_HIGH_ADDRESS */ + } + #else /* portSTACK_GROWTH */ + { + pxTopOfStack = pxNewTCB->pxStack; + + /* Check the alignment of the stack buffer is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxNewTCB->pxStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + /* The other extreme of the stack space is required if stack checking is + performed. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + } + #endif /* portSTACK_GROWTH */ + + /* Store the task name in the TCB. */ + if( pcName != NULL ) + { + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + pxNewTCB->pcTaskName[ x ] = pcName[ x ]; + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + configMAX_TASK_NAME_LEN characters just in case the memory after the + string is not accessible (extremely unlikely). */ + if( pcName[ x ] == ( char ) 0x00 ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Ensure the name string is terminated in the case that the string length + was greater or equal to configMAX_TASK_NAME_LEN. */ + pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; + } + else + { + /* The task has not been given a name, so just ensure there is a NULL + terminator when it is read out. */ + pxNewTCB->pcTaskName[ 0 ] = 0x00; + } + + /* This is used as an array index so must ensure it's not too large. First + remove the privilege bit if one is present. */ + if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxNewTCB->uxPriority = uxPriority; + #if ( configUSE_MUTEXES == 1 ) + { + pxNewTCB->uxBasePriority = uxPriority; + pxNewTCB->uxMutexesHeld = 0; + } + #endif /* configUSE_MUTEXES */ + + vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); + vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); + + /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get + back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + { + pxNewTCB->uxCriticalNesting = ( UBaseType_t ) 0U; + } + #endif /* portCRITICAL_NESTING_IN_TCB */ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + { + pxNewTCB->pxTaskTag = NULL; + } + #endif /* configUSE_APPLICATION_TASK_TAG */ + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxNewTCB->ulRunTimeCounter = 0UL; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth ); + } + #else + { + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) xRegions; + } + #endif + + #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + { + for( x = 0; x < ( UBaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS; x++ ) + { + pxNewTCB->pvThreadLocalStoragePointers[ x ] = NULL; + } + } + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + pxNewTCB->ulNotifiedValue = 0; + pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Initialise this task's Newlib reent structure. + See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + for additional information. */ + _REENT_INIT_PTR( ( &( pxNewTCB->xNewLib_reent ) ) ); + } + #endif + + #if( INCLUDE_xTaskAbortDelay == 1 ) + { + pxNewTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Initialize the TCB stack to look as if the task was already running, + but had been interrupted by the scheduler. The return address is set + to the start of the task function. Once the stack has been initialised + the top of stack variable is updated. */ + #if( portUSING_MPU_WRAPPERS == 1 ) + { + /* If the port has capability to detect stack overflow, + pass the stack end address to the stack initialization + function as well. */ + #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #else /* portUSING_MPU_WRAPPERS */ + { + /* If the port has capability to detect stack overflow, + pass the stack end address to the stack initialization + function as well. */ + #if( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #endif /* portUSING_MPU_WRAPPERS */ + + if( pxCreatedTask != NULL ) + { + /* Pass the handle out in an anonymous way. The handle can be used to + change the created task's priority, delete the created task, etc.*/ + *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) +{ + /* Ensure interrupts don't access the task lists while the lists are being + updated. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + if( pxCurrentTCB == NULL ) + { + /* There are no other tasks, or all the other tasks are in + the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) + { + /* This is the first task to be created so do the preliminary + initialisation required. We will not recover if this call + fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If the scheduler is not already running, make this task the + current task if it is the highest priority task to be created + so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) + { + pxCurrentTCB = pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + uxTaskNumber++; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); + + prvAddTaskToReadyList( pxNewTCB ); + + portSETUP_TCB( pxNewTCB ); + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + then it should run now. */ + if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + void vTaskDelete( TaskHandle_t xTaskToDelete ) + { + TCB_t *pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the calling task that is + being deleted. */ + pxTCB = prvGetTCBFromHandle( xTaskToDelete ); + + /* Remove task from the ready/delayed list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Increment the uxTaskNumber also so kernel aware debuggers can + detect that the task lists need re-generating. This is done before + portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will + not return. */ + uxTaskNumber++; + + if( pxTCB == pxCurrentTCB ) + { + /* A task is deleting itself. This cannot complete within the + task itself, as a context switch to another task is required. + Place the task in the termination list. The idle task will + check the termination list and free up any memory allocated by + the scheduler for the TCB and stack of the deleted task. */ + vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) ); + + /* Increment the ucTasksDeleted variable so the idle task knows + there is a task that has been deleted and that it should therefore + check the xTasksWaitingTermination list. */ + ++uxDeletedTasksWaitingCleanUp; + + /* Call the delete hook before portPRE_TASK_DELETE_HOOK() as + portPRE_TASK_DELETE_HOOK() does not return in the Win32 port. */ + traceTASK_DELETE( pxTCB ); + + /* The pre-delete hook is primarily for the Windows simulator, + in which Windows specific clean up operations are performed, + after which it is not possible to yield away from this task - + hence xYieldPending is used to latch that a context switch is + required. */ + portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending ); + } + else + { + --uxCurrentNumberOfTasks; + traceTASK_DELETE( pxTCB ); + prvDeleteTCB( pxTCB ); + + /* Reset the next expected unblock time in case it referred to + the task that has just been deleted. */ + prvResetNextTaskUnblockTime(); + } + } + taskEXIT_CRITICAL(); + + /* Force a reschedule if it is the currently running task that has just + been deleted. */ + if( xSchedulerRunning != pdFALSE ) + { + if( pxTCB == pxCurrentTCB ) + { + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelayUntil == 1 ) + + void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement ) + { + TickType_t xTimeToWake; + BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE; + + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0U ) ); + configASSERT( uxSchedulerSuspended == 0 ); + + vTaskSuspendAll(); + { + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount; + + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + + if( xConstTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + lasted called. In this case the only time we should ever + actually delay is if the wake time has also overflowed, + and the wake time is greater than the tick time. When this + is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The tick time has not overflowed. In this case we will + delay if either the wake time has overflowed, and/or the + tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; + + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL( xTimeToWake ); + + /* prvAddCurrentTaskToDelayedList() needs the block time, not + the time to wake, so subtract the current tick count. */ + prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount, pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + xAlreadyYielded = xTaskResumeAll(); + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskDelayUntil */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( const TickType_t xTicksToDelay ) + { + BaseType_t xAlreadyYielded = pdFALSE; + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( TickType_t ) 0U ) + { + configASSERT( uxSchedulerSuspended == 0 ); + vTaskSuspendAll(); + { + traceTASK_DELAY(); + + /* A task that is removed from the event list while the + scheduler is suspended will not get placed in the ready + list or removed from the blocked list until the scheduler + is resumed. + + This task cannot be in an event list as it is the currently + executing task. */ + prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); + } + xAlreadyYielded = xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskDelay */ +/*-----------------------------------------------------------*/ + +#if( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) ) + + eTaskState eTaskGetState( TaskHandle_t xTask ) + { + eTaskState eReturn; + List_t const * pxStateList, *pxDelayedList, *pxOverflowedDelayedList; + const TCB_t * const pxTCB = xTask; + + configASSERT( pxTCB ); + + if( pxTCB == pxCurrentTCB ) + { + /* The task calling this function is querying its own state. */ + eReturn = eRunning; + } + else + { + taskENTER_CRITICAL(); + { + pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); + pxDelayedList = pxDelayedTaskList; + pxOverflowedDelayedList = pxOverflowDelayedTaskList; + } + taskEXIT_CRITICAL(); + + if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) ) + { + /* The task being queried is referenced from one of the Blocked + lists. */ + eReturn = eBlocked; + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( pxStateList == &xSuspendedTaskList ) + { + /* The task being queried is referenced from the suspended + list. Is it genuinely suspended or is it blocked + indefinitely? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) + { + #if( configUSE_TASK_NOTIFICATIONS == 1 ) + { + /* The task does not appear on the event list item of + and of the RTOS objects, but could still be in the + blocked state if it is waiting on its notification + rather than waiting on an object. */ + if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION ) + { + eReturn = eBlocked; + } + else + { + eReturn = eSuspended; + } + } + #else + { + eReturn = eSuspended; + } + #endif + } + else + { + eReturn = eBlocked; + } + } + #endif + + #if ( INCLUDE_vTaskDelete == 1 ) + else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) ) + { + /* The task being queried is referenced from the deleted + tasks list, or it is not referenced from any lists at + all. */ + eReturn = eDeleted; + } + #endif + + else /*lint !e525 Negative indentation is intended to make use of pre-processor clearer. */ + { + /* If the task is not in any other state, it must be in the + Ready (including pending ready) state. */ + eReturn = eReady; + } + } + + return eReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_eTaskGetState */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) + { + TCB_t const *pxTCB; + UBaseType_t uxReturn; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the task + that called uxTaskPriorityGet() that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL(); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) + { + TCB_t const *pxTCB; + UBaseType_t uxReturn, uxSavedInterruptState; + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* If null is passed in here then it is the priority of the calling + task that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptState ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + + void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ) + { + TCB_t *pxTCB; + UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; + BaseType_t xYieldRequired = pdFALSE; + + configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); + + /* Ensure the new priority is valid. */ + if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the calling + task that is being changed. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); + + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentBasePriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentBasePriority = pxTCB->uxPriority; + } + #endif + + if( uxCurrentBasePriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + priority than the calling task. */ + if( uxNewPriority > uxCurrentBasePriority ) + { + if( pxTCB != pxCurrentTCB ) + { + /* The priority of a task other than the currently + running task is being raised. Is the priority being + raised above that of the running task? */ + if( uxNewPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The priority of the running task is being raised, + but the running task must already be the highest + priority task able to run so no yield is required. */ + } + } + else if( pxTCB == pxCurrentTCB ) + { + /* Setting the priority of the running task down means + there may now be another task of higher priority that + is ready to execute. */ + xYieldRequired = pdTRUE; + } + else + { + /* Setting the priority of any other task down does not + require a yield as the running task must be above the + new priority of the task being modified. */ + } + + /* Remember the ready list the task might be referenced from + before its uxPriority member is changed so the + taskRESET_READY_PRIORITY() macro can function correctly. */ + uxPriorityUsedOnEntry = pxTCB->uxPriority; + + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + currently using an inherited priority. */ + if( pxTCB->uxBasePriority == pxTCB->uxPriority ) + { + pxTCB->uxPriority = uxNewPriority; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else + { + pxTCB->uxPriority = uxNewPriority; + } + #endif + + /* Only reset the event list item value if the value is not + being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task is in the blocked or suspended list we need do + nothing more than change its priority variable. However, if + the task is in a ready list it needs to be removed and placed + in the list appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* The task is currently in its ready list - remove before + adding it to it's new ready list. As we are in a critical + section we can do this even if the scheduler is suspended. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xYieldRequired != pdFALSE ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Remove compiler warning about unused variables when the port + optimised task selection is not being used. */ + ( void ) uxPriorityUsedOnEntry; + } + } + taskEXIT_CRITICAL(); + } + +#endif /* INCLUDE_vTaskPrioritySet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskSuspend( TaskHandle_t xTaskToSuspend ) + { + TCB_t *pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the running task that is + being suspended. */ + pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); + + traceTASK_SUSPEND( pxTCB ); + + /* Remove task from the ready/delayed list and place in the + suspended list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); + + #if( configUSE_TASK_NOTIFICATIONS == 1 ) + { + if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task was blocked to wait for a notification, but is + now suspended, so no notification was received. */ + pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + } + #endif + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* Reset the next expected unblock time in case it referred to the + task that is now in the Suspended state. */ + taskENTER_CRITICAL(); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( pxTCB == pxCurrentTCB ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* The current task has just been suspended. */ + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + to by pxCurrentTCB has just been suspended and pxCurrentTCB + must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) /*lint !e931 Right has no side effect, just volatile. */ + { + /* No other tasks are ready, so set pxCurrentTCB back to + NULL so when the next task is created pxCurrentTCB will + be set to point to it no matter what its relative priority + is. */ + pxCurrentTCB = NULL; + } + else + { + vTaskSwitchContext(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) + { + BaseType_t xReturn = pdFALSE; + const TCB_t * const pxTCB = xTask; + + /* Accesses xPendingReadyList so must be called from a critical + section. */ + + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); + + /* Is the task being resumed actually in the suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE ) + { + /* Is it in the suspended list because it is in the Suspended + state, or because is is blocked with no timeout? */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) /*lint !e961. The cast is only redundant when NULL is used. */ + { + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskResume( TaskHandle_t xTaskToResume ) + { + TCB_t * const pxTCB = xTaskToResume; + + /* It does not make sense to resume the calling task. */ + configASSERT( xTaskToResume ); + + /* The parameter cannot be NULL as it is impossible to resume the + currently executing task. */ + if( ( pxTCB != pxCurrentTCB ) && ( pxTCB != NULL ) ) + { + taskENTER_CRITICAL(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME( pxTCB ); + + /* The ready list can be accessed even if the scheduler is + suspended because this is inside a critical section. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* A higher priority task may have just been resumed. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* This yield may not cause the task just resumed to run, + but will leave the lists in the correct state for the + next yield. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) + { + BaseType_t xYieldRequired = pdFALSE; + TCB_t * const pxTCB = xTaskToResume; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToResume ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); + + /* Check the ready lists can be accessed. */ + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Ready lists can be accessed so move the task from the + suspended list to the ready list directly. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed or ready lists cannot be accessed so the task + is held in the pending ready list until the scheduler is + unsuspended. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xYieldRequired; + } + +#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ +/*-----------------------------------------------------------*/ + +void vTaskStartScheduler( void ) +{ +BaseType_t xReturn; + + /* Add the idle task at the lowest priority. */ + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t *pxIdleTaskTCBBuffer = NULL; + StackType_t *pxIdleTaskStackBuffer = NULL; + uint32_t ulIdleTaskStackSize; + + /* The Idle task is created using user provided RAM - obtain the + address of the RAM then create the idle task. */ + vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); + xIdleTaskHandle = xTaskCreateStatic( prvIdleTask, + configIDLE_TASK_NAME, + ulIdleTaskStackSize, + ( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */ + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + pxIdleTaskStackBuffer, + pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + + if( xIdleTaskHandle != NULL ) + { + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + #else + { + /* The Idle task is being created using dynamically allocated RAM. */ + xReturn = xTaskCreate( prvIdleTask, + configIDLE_TASK_NAME, + configMINIMAL_STACK_SIZE, + ( void * ) NULL, + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TIMERS */ + + if( xReturn == pdPASS ) + { + /* freertos_tasks_c_additions_init() should only be called if the user + definable macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is + the only macro called by the function. */ + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + { + freertos_tasks_c_additions_init(); + } + #endif + + /* Interrupts are turned off here, to ensure a tick does not occur + before or during the call to xPortStartScheduler(). The stacks of + the created tasks contain a status word with interrupts switched on + so interrupts will automatically get re-enabled when the first task + starts to run. */ + portDISABLE_INTERRUPTS(); + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to the task that will run first. + See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + for additional information. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + xNextTaskUnblockTime = portMAX_DELAY; + xSchedulerRunning = pdTRUE; + xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; + + /* If configGENERATE_RUN_TIME_STATS is defined then the following + macro must be defined to configure the timer/counter used to generate + the run time counter time base. NOTE: If configGENERATE_RUN_TIME_STATS + is set to 0 and the following line fails to build then ensure you do not + have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() defined in your + FreeRTOSConfig.h file. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + + traceTASK_SWITCHED_IN(); + + /* Setting up the timer tick is hardware specific and thus in the + portable interface. */ + if( xPortStartScheduler() != pdFALSE ) + { + /* Should not reach here as if the scheduler is running the + function will not return. */ + } + else + { + /* Should only reach here if a task calls xTaskEndScheduler(). */ + } + } + else + { + /* This line will only be reached if the kernel could not be started, + because there was not enough FreeRTOS heap to create the idle task + or the timer task. */ + configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); + } + + /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, + meaning xIdleTaskHandle is not used anywhere else. */ + ( void ) xIdleTaskHandle; +} +/*-----------------------------------------------------------*/ + +void vTaskEndScheduler( void ) +{ + /* Stop the scheduler interrupts and call the portable scheduler end + routine so the original ISRs can be restored if necessary. The port + layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + /* A critical section is not required as the variable is of type + BaseType_t. Please read Richard Barry's reply in the following link to a + post in the FreeRTOS support forum before reporting this as a bug! - + http://goo.gl/wu4acr */ + + /* portSOFRWARE_BARRIER() is only implemented for emulated/simulated ports that + do not otherwise exhibit real time behaviour. */ + portSOFTWARE_BARRIER(); + + /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment + is used to allow calls to vTaskSuspendAll() to nest. */ + ++uxSchedulerSuspended; + + /* Enforces ordering for ports and optimised compilers that may otherwise place + the above increment elsewhere. */ + portMEMORY_BARRIER(); +} +/*----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) + { + TickType_t xReturn; + UBaseType_t uxHigherPriorityReadyTasks = pdFALSE; + + /* uxHigherPriorityReadyTasks takes care of the case where + configUSE_PREEMPTION is 0, so there may be tasks above the idle priority + task that are in the Ready state, even though the idle task is + running. */ + #if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + { + if( uxTopReadyPriority > tskIDLE_PRIORITY ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #else + { + const UBaseType_t uxLeastSignificantBit = ( UBaseType_t ) 0x01; + + /* When port optimised task selection is used the uxTopReadyPriority + variable is used as a bit map. If bits other than the least + significant bit are set then there are tasks that have a priority + above the idle priority that are in the Ready state. This takes + care of the case where the co-operative scheduler is in use. */ + if( uxTopReadyPriority > uxLeastSignificantBit ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #endif + + if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY ) + { + xReturn = 0; + } + else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1 ) + { + /* There are other idle priority tasks in the ready state. If + time slicing is used then the very next tick interrupt must be + processed. */ + xReturn = 0; + } + else if( uxHigherPriorityReadyTasks != pdFALSE ) + { + /* There are tasks in the Ready state that have a priority above the + idle priority. This path can only be reached if + configUSE_PREEMPTION is 0. */ + xReturn = 0; + } + else + { + xReturn = xNextTaskUnblockTime - xTickCount; + } + + return xReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskResumeAll( void ) +{ +TCB_t *pxTCB = NULL; +BaseType_t xAlreadyYielded = pdFALSE; + + /* If uxSchedulerSuspended is zero then this function does not match a + previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended ); + + /* It is possible that an ISR caused a task to be removed from an event + list while the scheduler was suspended. If this was the case then the + removed task will have been added to the xPendingReadyList. Once the + scheduler has been resumed it is safe to move all the pending ready + tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + { + --uxSchedulerSuspended; + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) + { + /* Move any readied tasks from the pending list into the + appropriate ready list. */ + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) + { + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* If the moved task has a priority higher than the current + task then a yield must be performed. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( pxTCB != NULL ) + { + /* A task was unblocked while the scheduler was suspended, + which may have prevented the next unblock time from being + re-calculated, in which case re-calculate it now. Mainly + important for low power tickless implementations, where + this can prevent an unnecessary exit from low power + state. */ + prvResetNextTaskUnblockTime(); + } + + /* If any ticks occurred while the scheduler was suspended then + they should be processed now. This ensures the tick count does + not slip, and that any delayed tasks are resumed at the correct + time. */ + { + TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */ + + if( xPendedCounts > ( TickType_t ) 0U ) + { + do + { + if( xTaskIncrementTick() != pdFALSE ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + --xPendedCounts; + } while( xPendedCounts > ( TickType_t ) 0U ); + + xPendedTicks = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xYieldPending != pdFALSE ) + { + #if( configUSE_PREEMPTION != 0 ) + { + xAlreadyYielded = pdTRUE; + } + #endif + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xAlreadyYielded; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCount( void ) +{ +TickType_t xTicks; + + /* Critical section required if running on a 16 bit processor. */ + portTICK_TYPE_ENTER_CRITICAL(); + { + xTicks = xTickCount; + } + portTICK_TYPE_EXIT_CRITICAL(); + + return xTicks; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCountFromISR( void ) +{ +TickType_t xReturn; +UBaseType_t uxSavedInterruptStatus; + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are kept permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = xTickCount; + } + portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxTaskGetNumberOfTasks( void ) +{ + /* A critical section is not required because the variables are of type + BaseType_t. */ + return uxCurrentNumberOfTasks; +} +/*-----------------------------------------------------------*/ + +char *pcTaskGetName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ +TCB_t *pxTCB; + + /* If null is passed in here then the name of the calling task is being + queried. */ + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + configASSERT( pxTCB ); + return &( pxTCB->pcTaskName[ 0 ] ); +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t *prvSearchForNameWithinSingleList( List_t *pxList, const char pcNameToQuery[] ) + { + TCB_t *pxNextTCB, *pxFirstTCB, *pxReturn = NULL; + UBaseType_t x; + char cNextChar; + BaseType_t xBreakLoop; + + /* This function is called with the scheduler suspended. */ + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + /* Check each character in the name looking for a match or + mismatch. */ + xBreakLoop = pdFALSE; + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + cNextChar = pxNextTCB->pcTaskName[ x ]; + + if( cNextChar != pcNameToQuery[ x ] ) + { + /* Characters didn't match. */ + xBreakLoop = pdTRUE; + } + else if( cNextChar == ( char ) 0x00 ) + { + /* Both strings terminated, a match must have been + found. */ + pxReturn = pxNextTCB; + xBreakLoop = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xBreakLoop != pdFALSE ) + { + break; + } + } + + if( pxReturn != NULL ) + { + /* The handle has been found. */ + break; + } + + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return pxReturn; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t uxQueue = configMAX_PRIORITIES; + TCB_t* pxTCB; + + /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */ + configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN ); + + vTaskSuspendAll(); + { + /* Search the ready lists. */ + do + { + uxQueue--; + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery ); + + if( pxTCB != NULL ) + { + /* Found the handle. */ + break; + } + + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Search the delayed lists. */ + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery ); + } + + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery ); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the suspended list. */ + pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery ); + } + } + #endif + + #if( INCLUDE_vTaskDelete == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the deleted list. */ + pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery ); + } + } + #endif + } + ( void ) xTaskResumeAll(); + + return pxTCB; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime ) + { + UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; + + vTaskSuspendAll(); + { + /* Is there a space in the array for each task in the system? */ + if( uxArraySize >= uxCurrentNumberOfTasks ) + { + /* Fill in an TaskStatus_t structure with information on each + task in the Ready state. */ + do + { + uxQueue--; + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); + + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Fill in an TaskStatus_t structure with information on each + task in the Blocked state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ); + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ); + + #if( INCLUDE_vTaskDelete == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + each task that has been deleted but not yet cleaned up. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + each task in the Suspended state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1) + { + if( pulTotalRunTime != NULL ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); + #else + *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + } + } + #else + { + if( pulTotalRunTime != NULL ) + { + *pulTotalRunTime = 0; + } + } + #endif + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + + TaskHandle_t xTaskGetIdleTaskHandle( void ) + { + /* If xTaskGetIdleTaskHandle() is called before the scheduler has been + started, then xIdleTaskHandle will be NULL. */ + configASSERT( ( xIdleTaskHandle != NULL ) ); + return xIdleTaskHandle; + } + +#endif /* INCLUDE_xTaskGetIdleTaskHandle */ +/*----------------------------------------------------------*/ + +/* This conditional compilation should use inequality to 0, not equality to 1. +This is to ensure vTaskStepTick() is available when user defined low power mode +implementations require configUSE_TICKLESS_IDLE to be set to a value other than +1. */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + void vTaskStepTick( const TickType_t xTicksToJump ) + { + /* Correct the tick count value after a period during which the tick + was suppressed. Note this does *not* call the tick hook function for + each stepped tick. */ + configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); + xTickCount += xTicksToJump; + traceINCREASE_TICK_COUNT( xTicksToJump ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) +{ +BaseType_t xYieldRequired = pdFALSE; + + /* Must not be called with the scheduler suspended as the implementation + relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */ + configASSERT( uxSchedulerSuspended == 0 ); + + /* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occurring when + the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */ + vTaskSuspendAll(); + xPendedTicks += xTicksToCatchUp; + xYieldRequired = xTaskResumeAll(); + + return xYieldRequired; +} +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskAbortDelay == 1 ) + + BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) + { + TCB_t *pxTCB = xTask; + BaseType_t xReturn; + + configASSERT( pxTCB ); + + vTaskSuspendAll(); + { + /* A task can only be prematurely removed from the Blocked state if + it is actually in the Blocked state. */ + if( eTaskGetState( xTask ) == eBlocked ) + { + xReturn = pdPASS; + + /* Remove the reference to the task from the blocked list. An + interrupt won't touch the xStateListItem because the + scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove it from + the event list too. Interrupts can touch the event list item, + even though the scheduler is suspended, so a critical section + is used. */ + taskENTER_CRITICAL(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + + /* This lets the task know it was forcibly removed from the + blocked state so it should not re-evaluate its block time and + then block again. */ + pxTCB->ucDelayAborted = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + /* Place the unblocked task into the appropriate ready list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate context + switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should only be + performed if the unblocked task has a priority that is + equal to or higher than the currently executing task. */ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Pend the yield to be performed when the scheduler + is unsuspended. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + else + { + xReturn = pdFAIL; + } + } + ( void ) xTaskResumeAll(); + + return xReturn; + } + +#endif /* INCLUDE_xTaskAbortDelay */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskIncrementTick( void ) +{ +TCB_t * pxTCB; +TickType_t xItemValue; +BaseType_t xSwitchRequired = pdFALSE; + + /* Called by the portable layer each time a tick interrupt occurs. + Increments the tick then checks to see if the new tick value will cause any + tasks to be unblocked. */ + traceTASK_INCREMENT_TICK( xTickCount ); + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Minor optimisation. The tick count cannot change in this + block. */ + const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1; + + /* Increment the RTOS tick, switching the delayed and overflowed + delayed lists if it wraps to 0. */ + xTickCount = xConstTickCount; + + if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */ + { + taskSWITCH_DELAYED_LISTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* See if this tick has made a timeout expire. Tasks are stored in + the queue in the order of their wake time - meaning once one task + has been found whose block time has not expired there is no need to + look any further down the list. */ + if( xConstTickCount >= xNextTaskUnblockTime ) + { + for( ;; ) + { + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The delayed list is empty. Set xNextTaskUnblockTime + to the maximum possible value so it is extremely + unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass + next time through. */ + xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + break; + } + else + { + /* The delayed list is not empty, get the value of the + item at the head of the delayed list. This is the time + at which the task at the head of the delayed list must + be removed from the Blocked state. */ + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); + + if( xConstTickCount < xItemValue ) + { + /* It is not time to unblock this item yet, but the + item value is the time at which the task at the head + of the blocked list must be removed from the Blocked + state - so record the item value in + xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* It is time to remove the item from the Blocked state. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove + it from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Place the unblocked task into the appropriate ready + list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate + context switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should + only be performed if the unblocked task has a + priority that is equal to or higher than the + currently executing task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + } + } + + /* Tasks of equal priority to the currently running task will share + processing time (time slice) if preemption is on, and the application + writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ + + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the pended tick + count is being unwound (when the scheduler is being unlocked). */ + if( xPendedTicks == ( TickType_t ) 0 ) + { + vApplicationTickHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICK_HOOK */ + + #if ( configUSE_PREEMPTION == 1 ) + { + if( xYieldPending != pdFALSE ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + else + { + ++xPendedTicks; + + /* The tick hook gets called at regular intervals, even if the + scheduler is locked. */ + #if ( configUSE_TICK_HOOK == 1 ) + { + vApplicationTickHook(); + } + #endif + } + + return xSwitchRequired; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ) + { + TCB_t *xTCB; + + /* If xTask is NULL then it is the task hook of the calling task that is + getting set. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xTCB->pxTaskTag = pxHookFunction; + } + taskEXIT_CRITICAL(); + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + TaskHookFunction_t xReturn; + + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xReturn = pxTCB->pxTaskTag; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + TaskHookFunction_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = pxTCB->pxTaskTag; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ) + { + TCB_t *xTCB; + BaseType_t xReturn; + + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = pxCurrentTCB; + } + else + { + xTCB = xTask; + } + + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +void vTaskSwitchContext( void ) +{ + if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) + { + /* The scheduler is currently suspended - do not allow a context + switch. */ + xYieldPending = pdTRUE; + } + else + { + xYieldPending = pdFALSE; + traceTASK_SWITCHED_OUT(); + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); + #else + ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the + accumulated time so far. The time the task started running was + stored in ulTaskSwitchedInTime. Note that there is no overflow + protection here so count values are only valid until the timer + overflows. The guard against negative values is to protect + against suspect run time stat counter implementations - which + are provided by the application, not the kernel. */ + if( ulTotalRunTime > ulTaskSwitchedInTime ) + { + pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + ulTaskSwitchedInTime = ulTotalRunTime; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + /* Check for stack overflow, if configured. */ + taskCHECK_FOR_STACK_OVERFLOW(); + + /* Before the currently running task is switched out, save its errno. */ + #if( configUSE_POSIX_ERRNO == 1 ) + { + pxCurrentTCB->iTaskErrno = FreeRTOS_errno; + } + #endif + + /* Select a new task to run using either the generic C or port + optimised asm code. */ + taskSELECT_HIGHEST_PRIORITY_TASK(); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + traceTASK_SWITCHED_IN(); + + /* After the new task is switched in, update the global errno. */ + #if( configUSE_POSIX_ERRNO == 1 ) + { + FreeRTOS_errno = pxCurrentTCB->iTaskErrno; + } + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to this task. + See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + for additional information. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + } +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ + + /* Place the event list item of the TCB in the appropriate event list. + This is placed in the list in priority order so the highest priority task + is the first to be woken by the event. The queue that contains the event + list is locked, preventing simultaneous access from interrupts. */ + vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + the event groups implementation. */ + configASSERT( uxSchedulerSuspended != 0 ); + + /* Store the item value in the event list item. It is safe to access the + event list item here as interrupts won't access the event list item of a + task that is not in the Blocked state. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Place the event list item of the TCB at the end of the appropriate event + list. It is safe to access the event list here because it is part of an + event group implementation - and interrupts don't access event groups + directly (instead they access them indirectly by pending function calls to + the task level). */ + vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TIMERS == 1 ) + + void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely ) + { + configASSERT( pxEventList ); + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements - + it should be called with the scheduler suspended. */ + + + /* Place the event list item of the TCB in the appropriate event list. + In this case it is assume that this is the only task that is going to + be waiting on this event list, so the faster vListInsertEnd() function + can be used in place of vListInsert. */ + vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* If the task should block indefinitely then set the block time to a + value that will be recognised as an indefinite delay inside the + prvAddCurrentTaskToDelayedList() function. */ + if( xWaitIndefinitely != pdFALSE ) + { + xTicksToWait = portMAX_DELAY; + } + + traceTASK_DELAY_UNTIL( ( xTickCount + xTicksToWait ) ); + prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) +{ +TCB_t *pxUnblockedTCB; +BaseType_t xReturn; + + /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be + called from a critical section within an ISR. */ + + /* The event list is sorted in priority order, so the first in the list can + be removed as it is known to be the highest priority. Remove the TCB from + the delayed list, and add it to the ready list. + + If an event is for a queue that is locked then this function will never + get called - the lock count on the queue will get modified instead. This + means exclusive access to the event list is guaranteed here. + + This function assumes that a check has already been made to ensure that + pxEventList is not empty. */ + pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + might be set to the blocked task's time out time. If the task is + unblocked for a reason other than a timeout xNextTaskUnblockTime is + normally left unchanged, because it is automatically reset to a new + value when the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter sleep mode + at the earliest possible time - so reset xNextTaskUnblockTime here to + ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + } + else + { + /* The delayed and ready lists cannot be accessed, so hold this task + pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has a higher + priority than the calling task. This allows the calling task to know if + it should force a context switch now. */ + xReturn = pdTRUE; + + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, const TickType_t xItemValue ) +{ +TCB_t *pxUnblockedTCB; + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + the event flags implementation. */ + configASSERT( uxSchedulerSuspended != pdFALSE ); + + /* Store the new item value in the event list. */ + listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Remove the event list form the event flag. Interrupts do not access + event flags. */ + pxUnblockedTCB = listGET_LIST_ITEM_OWNER( pxEventListItem ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( pxEventListItem ); + + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + might be set to the blocked task's time out time. If the task is + unblocked for a reason other than a timeout xNextTaskUnblockTime is + normally left unchanged, because it is automatically reset to a new + value when the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter sleep mode + at the earliest possible time - so reset xNextTaskUnblockTime here to + ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + /* Remove the task from the delayed list and add it to the ready list. The + scheduler is suspended so interrupts will not be accessing the ready + lists. */ + ( void ) uxListRemove( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The unblocked task has a priority above that of the calling task, so + a context switch is required. This function is called with the + scheduler suspended so xYieldPending is set so the context switch + occurs immediately that the scheduler is resumed (unsuspended). */ + xYieldPending = pdTRUE; + } +} +/*-----------------------------------------------------------*/ + +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + configASSERT( pxTimeOut ); + taskENTER_CRITICAL(); + { + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + /* For internal use only as it does not use a critical section. */ + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; +} +/*-----------------------------------------------------------*/ + +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ) +{ +BaseType_t xReturn; + + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); + + taskENTER_CRITICAL(); + { + /* Minor optimisation. The tick count cannot change in this block. */ + const TickType_t xConstTickCount = xTickCount; + const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering; + + #if( INCLUDE_xTaskAbortDelay == 1 ) + if( pxCurrentTCB->ucDelayAborted != ( uint8_t ) pdFALSE ) + { + /* The delay was aborted, which is not the same as a time out, + but has the same result. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + xReturn = pdTRUE; + } + else + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + if( *pxTicksToWait == portMAX_DELAY ) + { + /* If INCLUDE_vTaskSuspend is set to 1 and the block time + specified is the maximum block time then the task should block + indefinitely, and therefore never time out. */ + xReturn = pdFALSE; + } + else + #endif + + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ + { + /* The tick count is greater than the time at which + vTaskSetTimeout() was called, but has also overflowed since + vTaskSetTimeOut() was called. It must have wrapped all the way + around and gone past again. This passed since vTaskSetTimeout() + was called. */ + xReturn = pdTRUE; + } + else if( xElapsedTime < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */ + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= xElapsedTime; + vTaskInternalSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + *pxTicksToWait = 0; + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskMissedYield( void ) +{ + xYieldPending = pdTRUE; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) + { + UBaseType_t uxReturn; + TCB_t const *pxTCB; + + if( xTask != NULL ) + { + pxTCB = xTask; + uxReturn = pxTCB->uxTaskNumber; + } + else + { + uxReturn = 0U; + } + + return uxReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle ) + { + TCB_t * pxTCB; + + if( xTask != NULL ) + { + pxTCB = xTask; + pxTCB->uxTaskNumber = uxHandle; + } + } + +#endif /* configUSE_TRACE_FACILITY */ + +/* + * ----------------------------------------------------------- + * The Idle task. + * ---------------------------------------------------------- + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + /* Stop warnings. */ + ( void ) pvParameters; + + /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE + SCHEDULER IS STARTED. **/ + + /* In case a task that has a secure context deletes itself, in which case + the idle task is responsible for deleting the task's secure context, if + any. */ + portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE ); + + for( ;; ) + { + /* See if any tasks have deleted themselves - if so then the idle task + is responsible for freeing the deleted task's TCB and stack. */ + prvCheckTasksWaitingTermination(); + + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + see if any other task has become available. If we are using + preemption we don't need to do this as any task becoming available + will automatically get the processor anyway. */ + taskYIELD(); + } + #endif /* configUSE_PREEMPTION */ + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + timesliced. If a task that is sharing the idle priority is ready + to run then the idle task should yield before the end of the + timeslice. + + A critical region is not required here as we are just reading from + the list, and an occasional incorrect value will not matter. If + the ready list at the idle priority contains more than one task + then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) + { + taskYIELD(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ + + #if ( configUSE_IDLE_HOOK == 1 ) + { + extern void vApplicationIdleHook( void ); + + /* Call the user defined function from within the idle task. This + allows the application designer to add background functionality + without the overhead of a separate task. + NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationIdleHook(); + } + #endif /* configUSE_IDLE_HOOK */ + + /* This conditional compilation should use inequality to 0, not equality + to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when + user defined low power mode implementations require + configUSE_TICKLESS_IDLE to be set to a value other than 1. */ + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + TickType_t xExpectedIdleTime; + + /* It is not desirable to suspend then resume the scheduler on + each iteration of the idle task. Therefore, a preliminary + test of the expected idle time is performed without the + scheduler suspended. The result here is not necessarily + valid. */ + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + vTaskSuspendAll(); + { + /* Now the scheduler is suspended, the expected idle + time can be sampled again, and this time its value can + be used. */ + configASSERT( xNextTaskUnblockTime >= xTickCount ); + xExpectedIdleTime = prvGetExpectedIdleTime(); + + /* Define the following macro to set xExpectedIdleTime to 0 + if the application does not want + portSUPPRESS_TICKS_AND_SLEEP() to be called. */ + configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime ); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + traceLOW_POWER_IDLE_BEGIN(); + portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); + traceLOW_POWER_IDLE_END(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICKLESS_IDLE */ + } +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TICKLESS_IDLE != 0 ) + + eSleepModeStatus eTaskConfirmSleepModeStatus( void ) + { + /* The idle task exists in addition to the application tasks. */ + const UBaseType_t uxNonApplicationTasks = 1; + eSleepModeStatus eReturn = eStandardSleep; + + /* This function must be called from a critical section. */ + + if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 ) + { + /* A task was made ready while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xYieldPending != pdFALSE ) + { + /* A yield was pended while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else + { + /* If all the tasks are in the suspended list (which might mean they + have an infinite block time rather than actually being suspended) + then it is safe to turn all clocks off and just wait for external + interrupts. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) + { + eReturn = eNoTasksWaitingTimeout; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return eReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, BaseType_t xIndex, void *pvValue ) + { + TCB_t *pxTCB; + + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToSet ); + configASSERT( pxTCB != NULL ); + pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; + } + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void *pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, BaseType_t xIndex ) + { + void *pvReturn = NULL; + TCB_t *pxTCB; + + if( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) + { + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; + } + else + { + pvReturn = NULL; + } + + return pvReturn; + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, const MemoryRegion_t * const xRegions ) + { + TCB_t *pxTCB; + + /* If null is passed in here then we are modifying the MPU settings of + the calling task. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); + + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseTaskLists( void ) +{ +UBaseType_t uxPriority; + + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); + } + + vListInitialise( &xDelayedTaskList1 ); + vListInitialise( &xDelayedTaskList2 ); + vListInitialise( &xPendingReadyList ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( &xTasksWaitingTermination ); + } + #endif /* INCLUDE_vTaskDelete */ + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( &xSuspendedTaskList ); + } + #endif /* INCLUDE_vTaskSuspend */ + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + + /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/ + + #if ( INCLUDE_vTaskDelete == 1 ) + { + TCB_t *pxTCB; + + /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL() + being called too often in the idle task. */ + while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + { + taskENTER_CRITICAL(); + { + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + --uxCurrentNumberOfTasks; + --uxDeletedTasksWaitingCleanUp; + } + taskEXIT_CRITICAL(); + + prvDeleteTCB( pxTCB ); + } + } + #endif /* INCLUDE_vTaskDelete */ +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TRACE_FACILITY == 1 ) + + void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ) + { + TCB_t *pxTCB; + + /* xTask is NULL then get the state of the calling task. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB; + pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName [ 0 ] ); + pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority; + pxTaskStatus->pxStackBase = pxTCB->pxStack; + pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber; + + #if ( configUSE_MUTEXES == 1 ) + { + pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority; + } + #else + { + pxTaskStatus->uxBasePriority = 0; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; + } + #else + { + pxTaskStatus->ulRunTimeCounter = 0; + } + #endif + + /* Obtaining the task state is a little fiddly, so is only done if the + value of eState passed into this function is eInvalid - otherwise the + state is just set to whatever is passed in. */ + if( eState != eInvalid ) + { + if( pxTCB == pxCurrentTCB ) + { + pxTaskStatus->eCurrentState = eRunning; + } + else + { + pxTaskStatus->eCurrentState = eState; + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* If the task is in the suspended list then there is a + chance it is actually just blocked indefinitely - so really + it should be reported as being in the Blocked state. */ + if( eState == eSuspended ) + { + vTaskSuspendAll(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + pxTaskStatus->eCurrentState = eBlocked; + } + } + ( void ) xTaskResumeAll(); + } + } + #endif /* INCLUDE_vTaskSuspend */ + } + } + else + { + pxTaskStatus->eCurrentState = eTaskGetState( pxTCB ); + } + + /* Obtaining the stack space takes some time, so the xGetFreeStackSpace + parameter is provided to allow it to be skipped. */ + if( xGetFreeStackSpace != pdFALSE ) + { + #if ( portSTACK_GROWTH > 0 ) + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack ); + } + #else + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack ); + } + #endif + } + else + { + pxTaskStatus->usStackHighWaterMark = 0; + } + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t *pxTaskStatusArray, List_t *pxList, eTaskState eState ) + { + configLIST_VOLATILE TCB_t *pxNextTCB, *pxFirstTCB; + UBaseType_t uxTask = 0; + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + /* Populate an TaskStatus_t structure within the + pxTaskStatusArray array for each task that is referenced from + pxList. See the definition of TaskStatus_t in task.h for the + meaning of each TaskStatus_t structure member. */ + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState ); + uxTask++; + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) + { + uint32_t ulCount = 0U; + + while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + ulCount++; + } + + ulCount /= ( uint32_t ) sizeof( StackType_t ); /*lint !e961 Casting is not redundant on smaller architectures. */ + + return ( configSTACK_DEPTH_TYPE ) ulCount; + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) + + /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + same except for their return type. Using configSTACK_DEPTH_TYPE allows the + user to determine the return type. It gets around the problem of the value + overflowing on 8-bit types without breaking backward compatibility for + applications that expect an 8-bit return type. */ + configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + uint8_t *pucEndOfStack; + configSTACK_DEPTH_TYPE uxReturn; + + /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are + the same except for their return type. Using configSTACK_DEPTH_TYPE + allows the user to determine the return type. It gets around the + problem of the value overflowing on 8-bit types without breaking + backward compatibility for applications that expect an 8-bit return + type. */ + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = prvTaskCheckFreeStackSpace( pucEndOfStack ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark2 */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + + UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + uint8_t *pucEndOfStack; + UBaseType_t uxReturn; + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t *pxTCB ) + { + /* This call is required specifically for the TriCore port. It must be + above the vPortFree() calls. The call is also used by ports/demos that + want to allocate and clean RAM statically. */ + portCLEAN_UP_TCB( pxTCB ); + + /* Free up the memory allocated by the scheduler for the task. It is up + to the task to free any memory allocated at the application level. + See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + for additional information. */ + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + _reclaim_reent( &( pxTCB->xNewLib_reent ) ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + #if( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) + { + /* The task can only have been allocated dynamically - free both + the stack and TCB. */ + vPortFree( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + #elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* The task could have been allocated statically or dynamically, so + check what was statically allocated before trying to free the + memory. */ + if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) + { + /* Both the stack and TCB were allocated dynamically, so both + must be freed. */ + vPortFree( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) + { + /* Only the stack was statically allocated, so the TCB is the + only memory that must be freed. */ + vPortFree( pxTCB ); + } + else + { + /* Neither the stack nor the TCB were allocated dynamically, so + nothing needs to be freed. */ + configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +static void prvResetNextTaskUnblockTime( void ) +{ +TCB_t *pxTCB; + + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The new current delayed list is empty. Set xNextTaskUnblockTime to + the maximum possible value so it is extremely unlikely that the + if( xTickCount >= xNextTaskUnblockTime ) test will pass until + there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + } + else + { + /* The new current delayed list is not empty, get the value of + the item at the head of the delayed list. This is the time at + which the task at the head of the delayed list should be removed + from the Blocked state. */ + ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); + } +} +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + + TaskHandle_t xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + + /* A critical section is not required as this is not called from + an interrupt and the current TCB will always be the same for any + individual execution thread. */ + xReturn = pxCurrentTCB; + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + BaseType_t xTaskGetSchedulerState( void ) + { + BaseType_t xReturn; + + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxMutexHolderTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + /* If the mutex was given back by an interrupt while the queue was + locked then the mutex holder might now be NULL. _RB_ Is this still + needed as interrupts can no longer use mutexes? */ + if( pxMutexHolder != NULL ) + { + /* If the holder of the mutex has a priority below the priority of + the task attempting to obtain the mutex then it will temporarily + inherit the priority of the task attempting to obtain the mutex. */ + if( pxMutexHolderTCB->uxPriority < pxCurrentTCB->uxPriority ) + { + /* Adjust the mutex holder state to account for its new + priority. Only reset the event list item value if the value is + not being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task being modified is in the ready state it will need + to be moved into a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Inherit the priority before being moved into the new list. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; + prvAddTaskToReadyList( pxMutexHolderTCB ); + } + else + { + /* Just inherit the priority. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; + } + + traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB->uxPriority ); + + /* Inheritance occurred. */ + xReturn = pdTRUE; + } + else + { + if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB->uxPriority ) + { + /* The base priority of the mutex holder is lower than the + priority of the task attempting to take the mutex, but the + current priority of the mutex holder is not lower than the + priority of the task attempting to take the mutex. + Therefore the mutex holder must have already inherited a + priority, but inheritance would have occurred if that had + not been the case. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + if( pxMutexHolder != NULL ) + { + /* A task can only have an inherited priority if it holds the mutex. + If the mutex is held by a task then it cannot be given from an + interrupt, and if a mutex is given by the holding task then it must + be the running state task. */ + configASSERT( pxTCB == pxCurrentTCB ); + configASSERT( pxTCB->uxMutexesHeld ); + ( pxTCB->uxMutexesHeld )--; + + /* Has the holder of the mutex inherited the priority of another + task? */ + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* Only disinherit if no other mutexes are held. */ + if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) + { + /* A task can only have an inherited priority if it holds + the mutex. If the mutex is held by a task then it cannot be + given from an interrupt, and if a mutex is given by the + holding task then it must be the running state task. Remove + the holding task from the ready/delayed list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Disinherit the priority before adding the task into the + new ready list. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + pxTCB->uxPriority = pxTCB->uxBasePriority; + + /* Reset the event list item value. It cannot be in use for + any other purpose if this task is running, and it must be + running to give back the mutex. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + prvAddTaskToReadyList( pxTCB ); + + /* Return true to indicate that a context switch is required. + This is only actually required in the corner case whereby + multiple mutexes were held and the mutexes were given back + in an order different to that in which they were taken. + If a context switch did not occur when the first mutex was + returned, even if a task was waiting on it, then a context + switch should occur when the last mutex is returned whether + a task is waiting on it or not. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask ) + { + TCB_t * const pxTCB = pxMutexHolder; + UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse; + const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1; + + if( pxMutexHolder != NULL ) + { + /* If pxMutexHolder is not NULL then the holder must hold at least + one mutex. */ + configASSERT( pxTCB->uxMutexesHeld ); + + /* Determine the priority to which the priority of the task that + holds the mutex should be set. This will be the greater of the + holding task's base priority and the priority of the highest + priority task that is waiting to obtain the mutex. */ + if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask ) + { + uxPriorityToUse = uxHighestPriorityWaitingTask; + } + else + { + uxPriorityToUse = pxTCB->uxBasePriority; + } + + /* Does the priority need to change? */ + if( pxTCB->uxPriority != uxPriorityToUse ) + { + /* Only disinherit if no other mutexes are held. This is a + simplification in the priority inheritance implementation. If + the task that holds the mutex is also holding other mutexes then + the other mutexes may have caused the priority inheritance. */ + if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld ) + { + /* If a task has timed out because it already holds the + mutex it was trying to obtain then it cannot of inherited + its own priority. */ + configASSERT( pxTCB != pxCurrentTCB ); + + /* Disinherit the priority, remembering the previous + priority to facilitate determining the subject task's + state. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + uxPriorityUsedOnEntry = pxTCB->uxPriority; + pxTCB->uxPriority = uxPriorityToUse; + + /* Only reset the event list item value if the value is not + being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the running task is not the task that holds the mutex + then the task that holds the mutex could be in either the + Ready, Blocked or Suspended states. Only remove the task + from its current state list if it is in the Ready state as + the task's priority is going to change and there is one + Ready list per priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB->uxCriticalNesting )++; + + /* This is not the interrupt safe version of the enter critical + function so assert() if it is being called from an interrupt + context. Only API functions that end in "FromISR" can be used in an + interrupt. Only assert if the critical nesting count is 1 to + protect against recursive calls if the assert function also uses a + critical section. */ + if( pxCurrentTCB->uxCriticalNesting == 1 ) + { + portASSERT_IF_IN_ISR(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskExitCritical( void ) + { + if( xSchedulerRunning != pdFALSE ) + { + if( pxCurrentTCB->uxCriticalNesting > 0U ) + { + ( pxCurrentTCB->uxCriticalNesting )--; + + if( pxCurrentTCB->uxCriticalNesting == 0U ) + { + portENABLE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + static char *prvWriteNameToBuffer( char *pcBuffer, const char *pcTaskName ) + { + size_t x; + + /* Start by copying the entire string. */ + strcpy( pcBuffer, pcTaskName ); + + /* Pad the end of the string with spaces to ensure columns line up when + printed out. */ + for( x = strlen( pcBuffer ); x < ( size_t ) ( configMAX_TASK_NAME_LEN - 1 ); x++ ) + { + pcBuffer[ x ] = ' '; + } + + /* Terminate. */ + pcBuffer[ x ] = ( char ) 0x00; + + /* Return the new end of string. */ + return &( pcBuffer[ x ] ); + } + +#endif /* ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + void vTaskList( char * pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + UBaseType_t uxArraySize, x; + char cStatus; + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that + * displays task names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that + * might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, + * and limited functionality implementation of sprintf() is provided in + * many of the FreeRTOS/Demo sub-directories in a file called + * printf-stdarg.c (note printf-stdarg.c does not provide a full + * snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskList(). + */ + + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! if + configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); + + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + switch( pxTaskStatusArray[ x ].eCurrentState ) + { + case eRunning: cStatus = tskRUNNING_CHAR; + break; + + case eReady: cStatus = tskREADY_CHAR; + break; + + case eBlocked: cStatus = tskBLOCKED_CHAR; + break; + + case eSuspended: cStatus = tskSUSPENDED_CHAR; + break; + + case eDeleted: cStatus = tskDELETED_CHAR; + break; + + case eInvalid: /* Fall through. */ + default: /* Should not get here, but it is included + to prevent static checking errors. */ + cStatus = ( char ) 0x00; + break; + } + + /* Write the task name to the string, padding with spaces so it + can be printed in tabular form more easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + /* Write the rest of the string. */ + sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + void vTaskGetRunTimeStats( char *pcWriteBuffer ) + { + TaskStatus_t *pxTaskStatusArray; + UBaseType_t uxArraySize, x; + uint32_t ulTotalTime, ulStatsAsPercentage; + + #if( configUSE_TRACE_FACILITY != 1 ) + { + #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). + } + #endif + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part + * of the uxTaskGetSystemState() output into a human readable table that + * displays the amount of time each task has spent in the Running state + * in both absolute and percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library + * function that might bloat the code size, use a lot of stack, and + * provide different results on different platforms. An alternative, + * tiny, third party, and limited functionality implementation of + * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in + * a file called printf-stdarg.c (note printf-stdarg.c does not provide + * a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskGetRunTimeStats(). + */ + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! If + configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); + + /* For percentage calculations. */ + ulTotalTime /= 100UL; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > 0UL ) + { + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + /* What percentage of the total run time has the task used? + This will always be rounded down to the nearest integer. + ulTotalRunTimeDiv100 has already been divided by 100. */ + ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; + + /* Write the task name to the string, padding with + spaces so it can be printed in tabular form more + easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + } + #endif + } + else + { + /* If the percentage is zero here then the task has + consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + } + #endif + } + + pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +TickType_t uxTaskResetEventItemValue( void ) +{ +TickType_t uxReturn; + + uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ) ); + + /* Reset the event list item to its normal value - so it can be used with + queues and semaphores. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + TaskHandle_t pvTaskIncrementMutexHeldCount( void ) + { + /* If xSemaphoreCreateMutex() is called before any tasks have been created + then pxCurrentTCB will be NULL. */ + if( pxCurrentTCB != NULL ) + { + ( pxCurrentTCB->uxMutexesHeld )++; + } + + return pxCurrentTCB; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ) + { + uint32_t ulReturn; + + taskENTER_CRITICAL(); + { + /* Only block if the notification count is not already non-zero. */ + if( pxCurrentTCB->ulNotifiedValue == 0UL ) + { + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_TAKE_BLOCK(); + + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_TAKE(); + ulReturn = pxCurrentTCB->ulNotifiedValue; + + if( ulReturn != 0UL ) + { + if( xClearCountOnExit != pdFALSE ) + { + pxCurrentTCB->ulNotifiedValue = 0UL; + } + else + { + pxCurrentTCB->ulNotifiedValue = ulReturn - ( uint32_t ) 1; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxCurrentTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ) + { + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + /* Only block if a notification is not already pending. */ + if( pxCurrentTCB->ucNotifyState != taskNOTIFICATION_RECEIVED ) + { + /* Clear bits in the task's notification value as bits may get + set by the notifying task or interrupt. This can be used to + clear the value to zero. */ + pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnEntry; + + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_WAIT_BLOCK(); + + /* All ports are written to allow a yield in a critical + section (some will yield immediately, others wait until the + critical section exits) - but it is not something that + application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_WAIT(); + + if( pulNotificationValue != NULL ) + { + /* Output the current notification value, which may or may not + have changed. */ + *pulNotificationValue = pxCurrentTCB->ulNotifiedValue; + } + + /* If ucNotifyValue is set then either the task never entered the + blocked state (because a notification was already pending) or the + task unblocked because of a notification. Otherwise the task + unblocked because of a timeout. */ + if( pxCurrentTCB->ucNotifyState != taskNOTIFICATION_RECEIVED ) + { + /* A notification was not received. */ + xReturn = pdFALSE; + } + else + { + /* A notification was already pending or a notification was + received while the task was waiting. */ + pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnExit; + xReturn = pdTRUE; + } + + pxCurrentTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue ) + { + TCB_t * pxTCB; + BaseType_t xReturn = pdPASS; + uint8_t ucOriginalNotifyState; + + configASSERT( xTaskToNotify ); + pxTCB = xTaskToNotify; + + taskENTER_CRITICAL(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState; + + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; + + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; + + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; + + case eSetValueWithoutOverwrite : + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; + + case eNoAction: + /* The task is being notified without its notify value being + updated. */ + break; + + default: + /* Should not get here if all enums are handled. + Artificially force an assert by testing a value the + compiler can't assume is const. */ + configASSERT( pxTCB->ulNotifiedValue == ~0UL ); + + break; + } + + traceTASK_NOTIFY(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + #if( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked waiting for a notification then + xNextTaskUnblockTime might be set to the blocked task's time + out time. If the task is unblocked for a reason other than + a timeout xNextTaskUnblockTime is normally left unchanged, + because it will automatically get reset to a new value when + the tick count equals xNextTaskUnblockTime. However if + tickless idling is used it might be more important to enter + sleep mode at the earliest possible time - so reset + xNextTaskUnblockTime here to ensure it is updated at the + earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + BaseType_t xReturn = pdPASS; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState; + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits : + pxTCB->ulNotifiedValue |= ulValue; + break; + + case eIncrement : + ( pxTCB->ulNotifiedValue )++; + break; + + case eSetValueWithOverwrite : + pxTCB->ulNotifiedValue = ulValue; + break; + + case eSetValueWithoutOverwrite : + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + break; + + case eNoAction : + /* The task is being notified without its notify value being + updated. */ + break; + + default: + /* Should not get here if all enums are handled. + Artificially force an assert by testing a value the + compiler can't assume is const. */ + configASSERT( pxTCB->ulNotifiedValue == ~0UL ); + break; + } + + traceTASK_NOTIFY_FROM_ISR(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + + /* Mark that a yield is pending in case the user is not + using the "xHigherPriorityTaskWoken" parameter to an ISR + safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + ucOriginalNotifyState = pxTCB->ucNotifyState; + pxTCB->ucNotifyState = taskNOTIFICATION_RECEIVED; + + /* 'Giving' is equivalent to incrementing a count in a counting + semaphore. */ + ( pxTCB->ulNotifiedValue )++; + + traceTASK_NOTIFY_GIVE_FROM_ISR(); + + /* If the task is in the blocked state specifically to wait for a + notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + this task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + + /* Mark that a yield is pending in case the user is not + using the "xHigherPriorityTaskWoken" parameter in an ISR + safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ) + { + TCB_t *pxTCB; + BaseType_t xReturn; + + /* If null is passed in here then it is the calling task that is having + its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + if( pxTCB->ucNotifyState == taskNOTIFICATION_RECEIVED ) + { + pxTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ) + { + TCB_t *pxTCB; + uint32_t ulReturn; + + /* If null is passed in here then it is the calling task that is having + its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + /* Return the notification as it was before the bits were cleared, + then clear the bit mask. */ + ulReturn = pxCurrentTCB->ulNotifiedValue; + pxTCB->ulNotifiedValue &= ~ulBitsToClear; + } + taskEXIT_CRITICAL(); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + + uint32_t ulTaskGetIdleRunTimeCounter( void ) + { + return xIdleTaskHandle->ulRunTimeCounter; + } + +#endif +/*-----------------------------------------------------------*/ + +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) +{ +TickType_t xTimeToWake; +const TickType_t xConstTickCount = xTickCount; + + #if( INCLUDE_xTaskAbortDelay == 1 ) + { + /* About to enter a delayed list, so ensure the ucDelayAborted flag is + reset to pdFALSE so it can be detected as having been set to pdTRUE + when the task leaves the Blocked state. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Remove the task from the ready list before adding it to the blocked list + as the same list item is used for both lists. */ + if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB cannot change as it is the calling task. pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) ) + { + /* Add the task to the suspended task list instead of a delayed task + list to ensure it is not woken by a timing event. It will block + indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event + does not occur. This may overflow but this doesn't matter, the + kernel will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow + list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list + is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the + head of the list of blocked tasks then xNextTaskUnblockTime + needs to be updated too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be woken if the event + does not occur. This may overflow but this doesn't matter, the kernel + will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the head of the + list of blocked tasks then xNextTaskUnblockTime needs to be updated + too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */ + ( void ) xCanBlockIndefinitely; + } + #endif /* INCLUDE_vTaskSuspend */ +} + +/* Code below here allows additional code to be inserted into this source file, +especially where access to file scope functions and data is needed (for example +when performing module tests). */ + +#ifdef FREERTOS_MODULE_TEST + #include "tasks_test_access_functions.h" +#endif + + +#if( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) + + #include "freertos_tasks_c_additions.h" + + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + static void freertos_tasks_c_additions_init( void ) + { + FREERTOS_TASKS_C_ADDITIONS_INIT(); + } + #endif + +#endif + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/timers.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/timers.c new file mode 100644 index 0000000..00200b8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/timers.c @@ -0,0 +1,1127 @@ +/* + * FreeRTOS Kernel V10.3.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" + +#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) + #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. +#endif + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified +because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined +for the header files above, but not in this file, in order to generate the +correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e9021 !e961 !e750. */ + + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. This #if is closed at the very bottom +of this file. If you want to include software timer functionality then ensure +configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#if ( configUSE_TIMERS == 1 ) + +/* Misc definitions. */ +#define tmrNO_DELAY ( TickType_t ) 0U + +/* The name assigned to the timer service task. This can be overridden by +defining trmTIMER_SERVICE_TASK_NAME in FreeRTOSConfig.h. */ +#ifndef configTIMER_SERVICE_TASK_NAME + #define configTIMER_SERVICE_TASK_NAME "Tmr Svc" +#endif + +/* Bit definitions used in the ucStatus member of a timer structure. */ +#define tmrSTATUS_IS_ACTIVE ( ( uint8_t ) 0x01 ) +#define tmrSTATUS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 0x02 ) +#define tmrSTATUS_IS_AUTORELOAD ( ( uint8_t ) 0x04 ) + +/* The definition of the timers themselves. */ +typedef struct tmrTimerControl /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +{ + const char *pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + ListItem_t xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + TickType_t xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */ + void *pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + TimerCallbackFunction_t pxCallbackFunction; /*<< The function that will be called when the timer expires. */ + #if( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTimerNumber; /*<< An ID assigned by trace tools such as FreeRTOS+Trace */ + #endif + uint8_t ucStatus; /*<< Holds bits to say if the timer was statically allocated or not, and if it is active or not. */ +} xTIMER; + +/* The old xTIMER name is maintained above then typedefed to the new Timer_t +name below to enable the use of older kernel aware debuggers. */ +typedef xTIMER Timer_t; + +/* The definition of messages that can be sent and received on the timer queue. +Two types of message can be queued - messages that manipulate a software timer, +and messages that request the execution of a non-timer related callback. The +two message types are defined in two separate structures, xTimerParametersType +and xCallbackParametersType respectively. */ +typedef struct tmrTimerParameters +{ + TickType_t xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + Timer_t * pxTimer; /*<< The timer to which the command will be applied. */ +} TimerParameter_t; + + +typedef struct tmrCallbackParameters +{ + PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ + void *pvParameter1; /* << The value that will be used as the callback functions first parameter. */ + uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ +} CallbackParameters_t; + +/* The structure that contains the two message types, along with an identifier +that is used to determine which message type is valid. */ +typedef struct tmrTimerQueueMessage +{ + BaseType_t xMessageID; /*<< The command being sent to the timer service task. */ + union + { + TimerParameter_t xTimerParameters; + + /* Don't include xCallbackParameters if it is not going to be used as + it makes the structure (and therefore the timer queue) larger. */ + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + CallbackParameters_t xCallbackParameters; + #endif /* INCLUDE_xTimerPendFunctionCall */ + } u; +} DaemonTaskMessage_t; + +/*lint -save -e956 A manual analysis and inspection has been used to determine +which static variables must be declared volatile. */ + +/* The list in which active timers are stored. Timers are referenced in expire +time order, with the nearest expiry time at the front of the list. Only the +timer service task is allowed to access these lists. +xActiveTimerList1 and xActiveTimerList2 could be at function scope but that +breaks some kernel aware debuggers, and debuggers that reply on removing the +static qualifier. */ +PRIVILEGED_DATA static List_t xActiveTimerList1; +PRIVILEGED_DATA static List_t xActiveTimerList2; +PRIVILEGED_DATA static List_t *pxCurrentTimerList; +PRIVILEGED_DATA static List_t *pxOverflowTimerList; + +/* A queue that is used to send commands to the timer service task. */ +PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; +PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; + +/*lint -restore */ + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + /* If static allocation is supported then the application must provide the + following callback function - which enables the application to optionally + provide the memory that will be used by the timer task as the task's stack + and TCB. */ + extern void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ); + +#endif + +/* + * Initialise the infrastructure used by the timer service task if it has not + * been initialised already. + */ +static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + +/* + * The timer service task (daemon). Timer functionality is controlled by this + * task. Other tasks communicate with the timer service task using the + * xTimerQueue queue. + */ +static portTASK_FUNCTION_PROTO( prvTimerTask, pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Called by the timer service task to interpret and process a command it + * received on the timer queue. + */ +static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + +/* + * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, + * depending on if the expire time causes a timer counter overflow. + */ +static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) PRIVILEGED_FUNCTION; + +/* + * An active timer has reached its expire time. Reload the timer if it is an + * auto-reload timer, then call its callback. + */ +static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * The tick count has overflowed. Switch the timer lists after ensuring the + * current timer list does not still reference some timers. + */ +static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION; + +/* + * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE + * if a tick count overflow occurred since prvSampleTimeNow() was last called. + */ +static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + +/* + * If the timer list contains any active timers then return the expire time of + * the timer that will expire first and set *pxListWasEmpty to false. If the + * timer list does not contain any timers then return 0 and set *pxListWasEmpty + * to pdTRUE. + */ +static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * If a timer has expired, process it. Otherwise, block the timer service task + * until either a timer does expire or a command is received. + */ +static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * Called after a Timer_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t *pxNewTimer ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +BaseType_t xTimerCreateTimerTask( void ) +{ +BaseType_t xReturn = pdFAIL; + + /* This function is called when the scheduler is started if + configUSE_TIMERS is set to 1. Check that the infrastructure used by the + timer service task has been created/initialised. If timers have already + been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); + + if( xTimerQueue != NULL ) + { + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t *pxTimerTaskTCBBuffer = NULL; + StackType_t *pxTimerTaskStackBuffer = NULL; + uint32_t ulTimerTaskStackSize; + + vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); + xTimerTaskHandle = xTaskCreateStatic( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + ulTimerTaskStackSize, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + pxTimerTaskStackBuffer, + pxTimerTaskTCBBuffer ); + + if( xTimerTaskHandle != NULL ) + { + xReturn = pdPASS; + } + } + #else + { + xReturn = xTaskCreate( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + configTIMER_TASK_STACK_DEPTH, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + &xTimerTaskHandle ); + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + configASSERT( xReturn ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) + { + Timer_t *pxNewTimer; + + pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of Timer_t is always a pointer to the timer's mame. */ + + if( pxNewTimer != NULL ) + { + /* Status is thus far zero as the timer is not created statically + and has not been started. The auto-reload bit may get set in + prvInitialiseNewTimer. */ + pxNewTimer->ucStatus = 0x00; + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } + + return pxNewTimer; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t *pxTimerBuffer ) + { + Timer_t *pxNewTimer; + + #if( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + variable of type StaticTimer_t equals the size of the real timer + structure. */ + volatile size_t xSize = sizeof( StaticTimer_t ); + configASSERT( xSize == sizeof( Timer_t ) ); + ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ + + /* A pointer to a StaticTimer_t structure MUST be provided, use it. */ + configASSERT( pxTimerBuffer ); + pxNewTimer = ( Timer_t * ) pxTimerBuffer; /*lint !e740 !e9087 StaticTimer_t is a pointer to a Timer_t, so guaranteed to be aligned and sized correctly (checked by an assert()), so this is safe. */ + + if( pxNewTimer != NULL ) + { + /* Timers can be created statically or dynamically so note this + timer was created statically in case it is later deleted. The + auto-reload bit may get set in prvInitialiseNewTimer(). */ + pxNewTimer->ucStatus = tmrSTATUS_IS_STATICALLY_ALLOCATED; + + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } + + return pxNewTimer; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t *pxNewTimer ) +{ + /* 0 is not a valid value for xTimerPeriodInTicks. */ + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + + if( pxNewTimer != NULL ) + { + /* Ensure the infrastructure used by the timer service task has been + created/initialised. */ + prvCheckForValidListAndQueue(); + + /* Initialise the timer structure members using the function + parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + if( uxAutoReload != pdFALSE ) + { + pxNewTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; + } + traceTIMER_CREATE( pxNewTimer ); + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait ) +{ +BaseType_t xReturn = pdFAIL; +DaemonTaskMessage_t xMessage; + + configASSERT( xTimer ); + + /* Send a message to the timer service task to perform a particular action + on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; + xMessage.u.xTimerParameters.pxTimer = xTimer; + + if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + else + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) +{ + /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been + started, then xTimerTaskHandle will be NULL. */ + configASSERT( ( xTimerTaskHandle != NULL ) ); + return xTimerTaskHandle; +} +/*-----------------------------------------------------------*/ + +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) +{ +Timer_t *pxTimer = xTimer; + + configASSERT( xTimer ); + return pxTimer->xTimerPeriodInTicks; +} +/*-----------------------------------------------------------*/ + +void vTimerSetReloadMode( TimerHandle_t xTimer, const UBaseType_t uxAutoReload ) +{ +Timer_t * pxTimer = xTimer; + + configASSERT( xTimer ); + taskENTER_CRITICAL(); + { + if( uxAutoReload != pdFALSE ) + { + pxTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; + } + else + { + pxTimer->ucStatus &= ~tmrSTATUS_IS_AUTORELOAD; + } + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) +{ +Timer_t * pxTimer = xTimer; +UBaseType_t uxReturn; + + configASSERT( xTimer ); + taskENTER_CRITICAL(); + { + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0 ) + { + /* Not an auto-reload timer. */ + uxReturn = ( UBaseType_t ) pdFALSE; + } + else + { + /* Is an auto-reload timer. */ + uxReturn = ( UBaseType_t ) pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) +{ +Timer_t * pxTimer = xTimer; +TickType_t xReturn; + + configASSERT( xTimer ); + xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +const char * pcTimerGetName( TimerHandle_t xTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ +Timer_t *pxTimer = xTimer; + + configASSERT( xTimer ); + return pxTimer->pcTimerName; +} +/*-----------------------------------------------------------*/ + +static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, const TickType_t xTimeNow ) +{ +BaseType_t xResult; +Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + /* Remove the timer from the list of active timers. A check has already + been performed to ensure the list is not empty. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); + + /* If the timer is an auto-reload timer then calculate the next + expiry time and re-insert the timer in the list of active timers. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + /* The timer is inserted into a list using a time relative to anything + other than the current time. It will therefore be inserted into the + correct list relative to the time this task thinks it is now. */ + if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) != pdFALSE ) + { + /* The timer expired before it was added to the active timer + list. Reload it now. */ + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; + mtCOVERAGE_TEST_MARKER(); + } + + /* Call the timer callback. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( prvTimerTask, pvParameters ) +{ +TickType_t xNextExpireTime; +BaseType_t xListWasEmpty; + + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; + + #if( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 ) + { + extern void vApplicationDaemonTaskStartupHook( void ); + + /* Allow the application writer to execute some code in the context of + this task at the point the task starts executing. This is useful if the + application includes initialisation code that would benefit from + executing after the scheduler has been started. */ + vApplicationDaemonTaskStartupHook(); + } + #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */ + + for( ;; ) + { + /* Query the timers list to see if it contains any timers, and if so, + obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + + /* If a timer has expired, process it. Otherwise, block this task + until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } +} +/*-----------------------------------------------------------*/ + +static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, BaseType_t xListWasEmpty ) +{ +TickType_t xTimeNow; +BaseType_t xTimerListsWereSwitched; + + vTaskSuspendAll(); + { + /* Obtain the time now to make an assessment as to whether the timer + has expired or not. If obtaining the time causes the lists to switch + then don't process this timer as any timers that remained in the list + when the lists were switched will have been processed within the + prvSampleTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + ( void ) xTaskResumeAll(); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + time has not been reached yet. This task should therefore + block to wait for the next expire time or a command to be + received - whichever comes first. The following line cannot + be reached unless xNextExpireTime > xTimeNow, except in the + case when the current timer list is empty. */ + if( xListWasEmpty != pdFALSE ) + { + /* The current timer list is empty - is the overflow list + also empty? */ + xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); + } + + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); + + if( xTaskResumeAll() == pdFALSE ) + { + /* Yield to wait for either a command to arrive, or the + block time to expire. If a command arrived between the + critical section being exited and this yield then the yield + will not cause the task to block. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + ( void ) xTaskResumeAll(); + } + } +} +/*-----------------------------------------------------------*/ + +static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) +{ +TickType_t xNextExpireTime; + + /* Timers are listed in expiry time order, with the head of the list + referencing the task that will expire first. Obtain the time at which + the timer with the nearest expiry time will expire. If there are no + active timers then just set the next expire time to 0. That will cause + this task to unblock when the tick count overflows, at which point the + timer lists will be switched and the next expiry time can be + re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( TickType_t ) 0U; + } + + return xNextExpireTime; +} +/*-----------------------------------------------------------*/ + +static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) +{ +TickType_t xTimeNow; +PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */ + + xTimeNow = xTaskGetTickCount(); + + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists(); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } + + xLastTime = xTimeNow; + + return xTimeNow; +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime ) +{ +BaseType_t xProcessTimerNow = pdFALSE; + + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + timer was issued, and the time the command was processed? */ + if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + { + /* The time between a command being issued and the command being + processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + but the expiry time has not, then the timer must have already passed + its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } + + return xProcessTimerNow; +} +/*-----------------------------------------------------------*/ + +static void prvProcessReceivedCommands( void ) +{ +DaemonTaskMessage_t xMessage; +Timer_t *pxTimer; +BaseType_t xTimerListsWereSwitched, xResult; +TickType_t xTimeNow; + + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ + { + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + { + /* Negative commands are pended function calls rather than timer + commands. */ + if( xMessage.xMessageID < ( BaseType_t ) 0 ) + { + const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); + + /* The timer uses the xCallbackParameters member to request a + callback be executed. Check the callback is not NULL. */ + configASSERT( pxCallback ); + + /* Call the function. */ + pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* INCLUDE_xTimerPendFunctionCall */ + + /* Commands that are positive are timer commands rather than pended + function calls. */ + if( xMessage.xMessageID >= ( BaseType_t ) 0 ) + { + /* The messages uses the xTimerParameters member to work on a + software timer. */ + pxTimer = xMessage.u.xTimerParameters.pxTimer; + + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) /*lint !e961. The cast is only redundant when NULL is passed into the macro. */ + { + /* The timer is in a list, remove it. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); + + /* In this case the xTimerListsWereSwitched parameter is not used, but + it must be present in the function call. prvSampleTimeNow() must be + called after the message is received from xTimerQueue so there is no + possibility of a higher priority task adding a message to the message + queue with a time that is ahead of the timer daemon task (because it + pre-empted the timer daemon task after the xTimeNow value was set). */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START : + case tmrCOMMAND_START_FROM_ISR : + case tmrCOMMAND_RESET : + case tmrCOMMAND_RESET_FROM_ISR : + case tmrCOMMAND_START_DONT_TRACE : + /* Start or restart a timer. */ + pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; + if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE ) + { + /* The timer expired before it was added to the active + timer list. Process it now. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + traceTIMER_EXPIRED( pxTimer ); + + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + break; + + case tmrCOMMAND_STOP : + case tmrCOMMAND_STOP_FROM_ISR : + /* The timer has already been removed from the active list. */ + pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; + break; + + case tmrCOMMAND_CHANGE_PERIOD : + case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR : + pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; + pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + + /* The new period does not really have a reference, and can + be longer or shorter than the old one. The command time is + therefore set to the current time, and as the period cannot + be zero the next expiry time can only be in the future, + meaning (unlike for the xTimerStart() case above) there is + no fail case that needs to be handled here. */ + ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE : + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* The timer has already been removed from the active list, + just free up the memory if the memory was dynamically + allocated. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 ) + { + vPortFree( pxTimer ); + } + else + { + pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; + } + } + #else + { + /* If dynamic allocation is not enabled, the memory + could not have been dynamically allocated. So there is + no need to free the memory - just mark the timer as + "not active". */ + pxTimer->ucStatus &= ~tmrSTATUS_IS_ACTIVE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + break; + + default : + /* Don't expect to get here. */ + break; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSwitchTimerLists( void ) +{ +TickType_t xNextExpireTime, xReloadTime; +List_t *pxTemp; +Timer_t *pxTimer; +BaseType_t xResult; + + /* The tick count has overflowed. The timer lists must be switched. + If there are any timers still referenced from the current timer list + then they must have expired and should be processed before the lists + are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Remove the timer from the list. */ + pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); + + /* Execute its callback, then send a command to restart the timer if + it is an auto-reload timer. It cannot be restarted here as the lists + have not yet been switched. */ + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + /* Calculate the reload value, and if the reload value results in + the timer going into the same timer list then it has already expired + and the timer should be re-inserted into the current list so it is + processed again within this loop. Otherwise a command should be sent + to restart the timer to ensure it is only inserted into a list after + the lists have been swapped. */ + xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ); + if( xReloadTime > xNextExpireTime ) + { + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + else + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START_DONT_TRACE, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; +} +/*-----------------------------------------------------------*/ + +static void prvCheckForValidListAndQueue( void ) +{ + /* Check that the list from which active timers are referenced, and the + queue used to communicate with the timer service, have been + initialised. */ + taskENTER_CRITICAL(); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; + + #if( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* The timer queue is allocated statically in case + configSUPPORT_DYNAMIC_ALLOCATION is 0. */ + static StaticQueue_t xStaticTimerQueue; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ + static uint8_t ucStaticTimerQueueStorage[ ( size_t ) configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ + + xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue ); + } + #else + { + xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) ); + } + #endif + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + if( xTimerQueue != NULL ) + { + vQueueAddToRegistry( xTimerQueue, "TmrQ" ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configQUEUE_REGISTRY_SIZE */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) +{ +BaseType_t xReturn; +Timer_t *pxTimer = xTimer; + + configASSERT( xTimer ); + + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL(); + { + if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} /*lint !e818 Can't be pointer to const due to the typedef. */ +/*-----------------------------------------------------------*/ + +void *pvTimerGetTimerID( const TimerHandle_t xTimer ) +{ +Timer_t * const pxTimer = xTimer; +void *pvReturn; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pvReturn = pxTimer->pvTimerID; + } + taskEXIT_CRITICAL(); + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ) +{ +Timer_t * const pxTimer = xTimer; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pxTimer->pvTimerID = pvNewID; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +#if( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* Complete the message with the function parameters and post it to the + daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + + tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + +#endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + +#if( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* This function can only be called after a timer has been created or + after the scheduler has been started because, until then, the timer + queue does not exist. */ + configASSERT( xTimerQueue ); + + /* Complete the message with the function parameters and post it to the + daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + + tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + +#endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) + { + return ( ( Timer_t * ) xTimer )->uxTimerNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTimerSetTimerNumber( TimerHandle_t xTimer, UBaseType_t uxTimerNumber ) + { + ( ( Timer_t * ) xTimer )->uxTimerNumber = uxTimerNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. If you want to include software timer +functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#endif /* configUSE_TIMERS == 1 */ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_FLASH.ld b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_FLASH.ld new file mode 100644 index 0000000..fa58ad3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_FLASH.ld @@ -0,0 +1,185 @@ +/* +****************************************************************************** +** +** @file : LinkerScript.ld +** +** @author : Auto-generated by STM32CubeIDE +** +** Abstract : Linker script for NUCLEO-F446RE Board embedding STM32F446RETx Device from stm32f4 series +** 512Kbytes FLASH +** 128Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +****************************************************************************** +** @attention +** +** Copyright (c) 2023 STMicroelectronics. +** All rights reserved. +** +** This software is licensed under terms that can be found in the LICENSE file +** in the root directory of this software component. +** If no LICENSE file comes with this software, it is provided AS-IS. +** +****************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ + +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into "FLASH" Rom type memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data into "FLASH" Rom type memory */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + *(.RamFunc) /* .RamFunc sections */ + *(.RamFunc*) /* .RamFunc* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + + } >RAM AT> FLASH + + /* Uninitialized data section into "RAM" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_RAM.ld b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_RAM.ld new file mode 100644 index 0000000..ad06f1d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_RAM.ld @@ -0,0 +1,185 @@ +/* +****************************************************************************** +** +** @file : LinkerScript.ld (debug in RAM dedicated) +** +** @author : Auto-generated by STM32CubeIDE +** +** Abstract : Linker script for NUCLEO-F446RE Board embedding STM32F446RETx Device from stm32f4 series +** 512Kbytes FLASH +** 128Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +****************************************************************************** +** @attention +** +** Copyright (c) 2023 STMicroelectronics. +** All rights reserved. +** +** This software is licensed under terms that can be found in the LICENSE file +** in the root directory of this software component. +** If no LICENSE file comes with this software, it is provided AS-IS. +** +****************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ + +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into "RAM" Ram type memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >RAM + + /* The program code and other data into "RAM" Ram type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + *(.RamFunc) /* .RamFunc sections */ + *(.RamFunc*) /* .RamFunc* sections */ + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >RAM + + /* Constant data into "RAM" Ram type memory */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >RAM + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >RAM + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >RAM + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >RAM + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >RAM + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >RAM + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + + } >RAM + + /* Uninitialized data section into "RAM" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/croutine.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/croutine.c new file mode 100644 index 0000000..aa5ea6f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/croutine.c @@ -0,0 +1,363 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +/* Remove the whole file is co-routines are not being used. */ +#if ( configUSE_CO_ROUTINES != 0 ) + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ + #ifdef portREMOVE_STATIC_QUALIFIER + #define static + #endif + + +/* Lists for ready and blocked co-routines. --------------------*/ + static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ + static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */ + static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ + static List_t * pxDelayedCoRoutineList = NULL; /*< Points to the delayed co-routine list currently being used. */ + static List_t * pxOverflowDelayedCoRoutineList = NULL; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ + static List_t xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + +/* Other file private variables. --------------------------------*/ + CRCB_t * pxCurrentCoRoutine = NULL; + static UBaseType_t uxTopCoRoutineReadyPriority = 0; + static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + +/* The initial state of the co-routine when it is created. */ + #define corINITIAL_STATE ( 0 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * This macro accesses the co-routine ready lists and therefore must not be + * used from within an ISR. + */ + #define prvAddCoRoutineToReadyQueue( pxCRCB ) \ + { \ + if( ( pxCRCB )->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = ( pxCRCB )->uxPriority; \ + } \ + vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ ( pxCRCB )->uxPriority ] ), &( ( pxCRCB )->xGenericListItem ) ); \ + } + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first co-routine. + */ + static void prvInitialiseCoRoutineLists( void ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * in the pending ready list in order that they can later be moved to the ready + * list by the co-routine scheduler. + */ + static void prvCheckPendingReadyList( void ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * meaning once one co-routine has been found whose timer has not expired + * we need not look any further down the list. + */ + static void prvCheckDelayedList( void ); + +/*-----------------------------------------------------------*/ + + BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, + UBaseType_t uxPriority, + UBaseType_t uxIndex ) + { + BaseType_t xReturn; + CRCB_t * pxCoRoutine; + + /* Allocate the memory that will store the co-routine control block. */ + pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) ); + + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + * be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* Set the co-routine control block as a link back from the ListItem_t. + * This is so we can get back to the containing CRCB from a generic item + * in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) ); + + /* Now the co-routine has been initialised it can be added to the ready + * list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, + List_t * pxEventList ) + { + TickType_t xTimeToWake; + + /* Calculate the time to wake - this may overflow but this is + * not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + * ourselves to the blocked list as the same list item is used for + * both lists. */ + ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + * overflow list. */ + vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + * current block list. */ + vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + * function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } + } +/*-----------------------------------------------------------*/ + + static void prvCheckPendingReadyList( void ) + { + /* Are there any co-routines waiting to get moved to the ready list? These + * are co-routines that have been readied by an ISR. The ISR cannot access + * the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + CRCB_t * pxUnblockedCRCB; + + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyCoRoutineList ) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); + + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } + } +/*-----------------------------------------------------------*/ + + static void prvCheckDelayedList( void ) + { + CRCB_t * pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + List_t * pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. If there are + * any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + * section. If this is the case then the generic list item will + * have been moved to the pending ready list and the following + * line is still valid. Also the pvContainer parameter will have + * been set to NULL so the following lines are also valid. */ + ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pxContainer ) + { + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; + } +/*-----------------------------------------------------------*/ + + void vCoRoutineSchedule( void ) + { + /* Only run a co-routine after prvInitialiseCoRoutineLists() has been + * called. prvInitialiseCoRoutineLists() is called automatically when a + * co-routine is created. */ + if( pxDelayedCoRoutineList != NULL ) + { + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); + + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); + + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + + --uxTopCoRoutineReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + * of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + } + } +/*-----------------------------------------------------------*/ + + static void prvInitialiseCoRoutineLists( void ) + { + UBaseType_t uxPriority; + + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } + + vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList ); + + /* Start with pxDelayedCoRoutineList using list1 and the + * pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; + } +/*-----------------------------------------------------------*/ + + BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList ) + { + CRCB_t * pxUnblockedCRCB; + BaseType_t xReturn; + + /* This function is called from within an interrupt. It can only access + * event lists and the pending ready list. This function assumes that a + * check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES == 0 */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/event_groups.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/event_groups.c new file mode 100644 index 0000000..f3e6aff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/event_groups.c @@ -0,0 +1,778 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "event_groups.h" + +/* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */ + +/* The following bit fields convey control information in a task's event list + * item value. It is important they don't clash with the + * taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */ +#if configUSE_16_BIT_TICKS == 1 + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x0100U + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x0200U + #define eventWAIT_FOR_ALL_BITS 0x0400U + #define eventEVENT_BITS_CONTROL_BYTES 0xff00U +#else + #define eventCLEAR_EVENTS_ON_EXIT_BIT 0x01000000UL + #define eventUNBLOCKED_DUE_TO_BIT_SET 0x02000000UL + #define eventWAIT_FOR_ALL_BITS 0x04000000UL + #define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL +#endif + +typedef struct EventGroupDef_t +{ + EventBits_t uxEventBits; + List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */ + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupNumber; + #endif + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */ + #endif +} EventGroup_t; + +/*-----------------------------------------------------------*/ + +/* + * Test the bits set in uxCurrentEventBits to see if the wait condition is met. + * The wait condition is defined by xWaitForAllBits. If xWaitForAllBits is + * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor + * are also set in uxCurrentEventBits. If xWaitForAllBits is pdFALSE then the + * wait condition is met if any of the bits set in uxBitsToWait for are also set + * in uxCurrentEventBits. + */ +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) + { + EventGroup_t * pxEventBits; + + /* A StaticEventGroup_t object must be provided. */ + configASSERT( pxEventGroupBuffer ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticEventGroup_t equals the size of the real + * event group structure. */ + volatile size_t xSize = sizeof( StaticEventGroup_t ); + configASSERT( xSize == sizeof( EventGroup_t ) ); + } /*lint !e529 xSize is referenced if configASSERT() is defined. */ + #endif /* configASSERT_DEFINED */ + + /* The user has provided a statically allocated event group - use it. */ + pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */ + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note that + * this event group was created statically in case the event group + * is later deleted. */ + pxEventBits->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + /* xEventGroupCreateStatic should only ever be called with + * pxEventGroupBuffer pointing to a pre-allocated (compile time + * allocated) StaticEventGroup_t variable. */ + traceEVENT_GROUP_CREATE_FAILED(); + } + + return pxEventBits; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + EventGroupHandle_t xEventGroupCreate( void ) + { + EventGroup_t * pxEventBits; + + /* Allocate the event group. Justification for MISRA deviation as + * follows: pvPortMalloc() always ensures returned memory blocks are + * aligned per the requirements of the MCU stack. In this case + * pvPortMalloc() must return a pointer that is guaranteed to meet the + * alignment requirements of the EventGroup_t structure - which (if you + * follow it through) is the alignment requirements of the TickType_t type + * (EventBits_t being of TickType_t itself). Therefore, whenever the + * stack alignment requirements are greater than or equal to the + * TickType_t alignment requirements the cast is safe. In other cases, + * where the natural word size of the architecture is less than + * sizeof( TickType_t ), the TickType_t variables will be accessed in two + * or more reads operations, and the alignment requirements is only that + * of each individual read. */ + pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */ + + if( pxEventBits != NULL ) + { + pxEventBits->uxEventBits = 0; + vListInitialise( &( pxEventBits->xTasksWaitingForBits ) ); + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Both static and dynamic allocation can be used, so note this + * event group was allocated statically in case the event group is + * later deleted. */ + pxEventBits->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + traceEVENT_GROUP_CREATE( pxEventBits ); + } + else + { + traceEVENT_GROUP_CREATE_FAILED(); /*lint !e9063 Else branch only exists to allow tracing and does not generate code if trace macros are not defined. */ + } + + return pxEventBits; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) +{ + EventBits_t uxOriginalBitValue, uxReturn; + EventGroup_t * pxEventBits = xEventGroup; + BaseType_t xAlreadyYielded; + BaseType_t xTimeoutOccurred = pdFALSE; + + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + uxOriginalBitValue = pxEventBits->uxEventBits; + + ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet ); + + if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + /* All the rendezvous bits are now set - no need to block. */ + uxReturn = ( uxOriginalBitValue | uxBitsToSet ); + + /* Rendezvous always clear the bits. They will have been cleared + * already unless this is the only task in the rendezvous. */ + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + + xTicksToWait = 0; + } + else + { + if( xTicksToWait != ( TickType_t ) 0 ) + { + traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ); + + /* Store the bits that the calling task is waiting for in the + * task's event list item so the kernel knows when a match is + * found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait ); + + /* This assignment is obsolete as uxReturn will get set after + * the task unblocks, but some compilers mistakenly generate a + * warning about uxReturn being returned without being set if the + * assignment is omitted. */ + uxReturn = 0; + } + else + { + /* The rendezvous bits were not set, but no block time was + * specified - just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + xTimeoutOccurred = pdTRUE; + } + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + * point either the required bits were set or the block time expired. If + * the required bits were set they will have been stored in the task's + * event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + /* The task timed out, just return the current event bit value. */ + taskENTER_CRITICAL(); + { + uxReturn = pxEventBits->uxEventBits; + + /* Although the task got here because it timed out before the + * bits it was waiting for were set, it is possible that since it + * unblocked another task has set the bits. If this is the case + * then it needs to clear the bits before exiting. */ + if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* Control bits might be set as the task had blocked should not be + * returned. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ); + + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) +{ + EventGroup_t * pxEventBits = xEventGroup; + EventBits_t uxReturn, uxControlBits = 0; + BaseType_t xWaitConditionMet, xAlreadyYielded; + BaseType_t xTimeoutOccurred = pdFALSE; + + /* Check the user is not attempting to wait on the bits used by the kernel + * itself, and that at least one bit is being requested. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + configASSERT( uxBitsToWaitFor != 0 ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + vTaskSuspendAll(); + { + const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits; + + /* Check to see if the wait condition is already met or not. */ + xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits ); + + if( xWaitConditionMet != pdFALSE ) + { + /* The wait condition has already been met so there is no need to + * block. */ + uxReturn = uxCurrentEventBits; + xTicksToWait = ( TickType_t ) 0; + + /* Clear the wait bits if requested to do so. */ + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The wait condition has not been met, but no block time was + * specified, so just return the current value. */ + uxReturn = uxCurrentEventBits; + xTimeoutOccurred = pdTRUE; + } + else + { + /* The task is going to block to wait for its required bits to be + * set. uxControlBits are used to remember the specified behaviour of + * this call to xEventGroupWaitBits() - for use when the event bits + * unblock the task. */ + if( xClearOnExit != pdFALSE ) + { + uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xWaitForAllBits != pdFALSE ) + { + uxControlBits |= eventWAIT_FOR_ALL_BITS; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the bits that the calling task is waiting for in the + * task's event list item so the kernel knows when a match is + * found. Then enter the blocked state. */ + vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait ); + + /* This is obsolete as it will get set after the task unblocks, but + * some compilers mistakenly generate a warning about the variable + * being returned without being set if it is not done. */ + uxReturn = 0; + + traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + if( xTicksToWait != ( TickType_t ) 0 ) + { + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The task blocked to wait for its required bits to be set - at this + * point either the required bits were set or the block time expired. If + * the required bits were set they will have been stored in the task's + * event list item, and they should now be retrieved then cleared. */ + uxReturn = uxTaskResetEventItemValue(); + + if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 ) + { + taskENTER_CRITICAL(); + { + /* The task timed out, just return the current event bit value. */ + uxReturn = pxEventBits->uxEventBits; + + /* It is possible that the event bits were updated between this + * task leaving the Blocked state and running again. */ + if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE ) + { + if( xClearOnExit != pdFALSE ) + { + pxEventBits->uxEventBits &= ~uxBitsToWaitFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xTimeoutOccurred = pdTRUE; + } + taskEXIT_CRITICAL(); + } + else + { + /* The task unblocked because the bits were set. */ + } + + /* The task blocked so control bits may have been set. */ + uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES; + } + + traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ); + + /* Prevent compiler warnings when trace macros are not used. */ + ( void ) xTimeoutOccurred; + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) +{ + EventGroup_t * pxEventBits = xEventGroup; + EventBits_t uxReturn; + + /* Check the user is not attempting to clear the bits used by the kernel + * itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + taskENTER_CRITICAL(); + { + traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ); + + /* The value returned is the event group value prior to the bits being + * cleared. */ + uxReturn = pxEventBits->uxEventBits; + + /* Clear the bits. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ + + return xReturn; + } + +#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) +{ + UBaseType_t uxSavedInterruptStatus; + EventGroup_t const * const pxEventBits = xEventGroup; + EventBits_t uxReturn; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + uxReturn = pxEventBits->uxEventBits; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return uxReturn; +} /*lint !e818 EventGroupHandle_t is a typedef used in other functions to so can't be pointer to const. */ +/*-----------------------------------------------------------*/ + +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) +{ + ListItem_t * pxListItem; + ListItem_t * pxNext; + ListItem_t const * pxListEnd; + List_t const * pxList; + EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits; + EventGroup_t * pxEventBits = xEventGroup; + BaseType_t xMatchFound = pdFALSE; + + /* Check the user is not attempting to set the bits used by the kernel + * itself. */ + configASSERT( xEventGroup ); + configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 ); + + pxList = &( pxEventBits->xTasksWaitingForBits ); + pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + vTaskSuspendAll(); + { + traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ); + + pxListItem = listGET_HEAD_ENTRY( pxList ); + + /* Set the bits. */ + pxEventBits->uxEventBits |= uxBitsToSet; + + /* See if the new bit value should unblock any tasks. */ + while( pxListItem != pxListEnd ) + { + pxNext = listGET_NEXT( pxListItem ); + uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem ); + xMatchFound = pdFALSE; + + /* Split the bits waited for from the control bits. */ + uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES; + uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES; + + if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 ) + { + /* Just looking for single bit being set. */ + if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 ) + { + xMatchFound = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor ) + { + /* All bits are set. */ + xMatchFound = pdTRUE; + } + else + { + /* Need all bits to be set, but not all the bits were set. */ + } + + if( xMatchFound != pdFALSE ) + { + /* The bits match. Should the bits be cleared on exit? */ + if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 ) + { + uxBitsToClear |= uxBitsWaitedFor; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Store the actual event flag value in the task's event list + * item before removing the task from the event list. The + * eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows + * that is was unblocked due to its required bits matching, rather + * than because it timed out. */ + vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET ); + } + + /* Move onto the next list item. Note pxListItem->pxNext is not + * used here as the list item may have been removed from the event list + * and inserted into the ready/pending reading list. */ + pxListItem = pxNext; + } + + /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT + * bit was set in the control word. */ + pxEventBits->uxEventBits &= ~uxBitsToClear; + } + ( void ) xTaskResumeAll(); + + return pxEventBits->uxEventBits; +} +/*-----------------------------------------------------------*/ + +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) +{ + EventGroup_t * pxEventBits = xEventGroup; + const List_t * pxTasksWaitingForBits; + + configASSERT( pxEventBits ); + + pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits ); + + vTaskSuspendAll(); + { + traceEVENT_GROUP_DELETE( xEventGroup ); + + while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 ) + { + /* Unblock the task, returning 0 as the event list is being deleted + * and cannot therefore have any bits set. */ + configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) ); + vTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET ); + } + } + ( void ) xTaskResumeAll(); + + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The event group can only have been allocated dynamically - free + * it again. */ + vPortFree( pxEventBits ); + } + #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The event group could have been allocated statically or + * dynamically, so check before attempting to free the memory. */ + if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxEventBits ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'set bits' command that was pended from + * an interrupt. */ +void vEventGroupSetBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToSet ) +{ + ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ +} +/*-----------------------------------------------------------*/ + +/* For internal use only - execute a 'clear bits' command that was pended from + * an interrupt. */ +void vEventGroupClearBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToClear ) +{ + ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */ +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xWaitForAllBits ) +{ + BaseType_t xWaitConditionMet = pdFALSE; + + if( xWaitForAllBits == pdFALSE ) + { + /* Task only has to wait for one bit within uxBitsToWaitFor to be + * set. Is one already set? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Task has to wait for all the bits in uxBitsToWaitFor to be set. + * Are they set already? */ + if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor ) + { + xWaitConditionMet = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return xWaitConditionMet; +} +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) + + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + BaseType_t * pxHigherPriorityTaskWoken ) + { + BaseType_t xReturn; + + traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ); + xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */ + + return xReturn; + } + +#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) + { + UBaseType_t xReturn; + EventGroup_t const * pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ + + if( xEventGroup == NULL ) + { + xReturn = 0; + } + else + { + xReturn = pxEventBits->uxEventGroupNumber; + } + + return xReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vEventGroupSetNumber( void * xEventGroup, + UBaseType_t uxEventGroupNumber ) + { + ( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */ + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/FreeRTOS.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/FreeRTOS.h new file mode 100644 index 0000000..d829d44 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/FreeRTOS.h @@ -0,0 +1,1440 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include + +/* + * If stdint.h cannot be located then: + * + If using GCC ensure the -nostdint options is *not* being used. + * + Ensure the project's include path includes the directory in which your + * compiler stores stdint.h. + * + Set any compiler options necessary for it to support C99, as technically + * stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any + * other way). + * + The FreeRTOS download includes a simple stdint.h definition that can be + * used in cases where none is provided by the compiler. The files only + * contains the typedefs required to build FreeRTOS. Read the instructions + * in FreeRTOS/source/stdint.readme for more information. + */ +#include /* READ COMMENT ABOVE. */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Definitions specific to the port being used. */ +#include "portable.h" + +/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */ +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +/* Required if struct _reent is used. */ +#if ( configUSE_NEWLIB_REENTRANT == 1 ) + +/* Note Newlib support has been included by popular demand, but is not + * used by the FreeRTOS maintainers themselves. FreeRTOS is not + * responsible for resulting newlib operation. User must be familiar with + * newlib and must provide system-wide implementations of the necessary + * stubs. Be warned that (at the time of writing) the current newlib design + * implements a system-wide malloc() that must be provided with locks. + * + * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html + * for additional information. */ + #include + + #define configUSE_C_RUNTIME_TLS_SUPPORT 1 + + #ifndef configTLS_BLOCK_TYPE + #define configTLS_BLOCK_TYPE struct _reent + #endif + + #ifndef configINIT_TLS_BLOCK + #define configINIT_TLS_BLOCK( xTLSBlock ) _REENT_INIT_PTR( &( xTLSBlock ) ) + #endif + + #ifndef configSET_TLS_BLOCK + #define configSET_TLS_BLOCK( xTLSBlock ) _impure_ptr = &( xTLSBlock ) + #endif + + #ifndef configDEINIT_TLS_BLOCK + #define configDEINIT_TLS_BLOCK( xTLSBlock ) _reclaim_reent( &( xTLSBlock ) ) + #endif +#endif /* if ( configUSE_NEWLIB_REENTRANT == 1 ) */ + +#ifndef configUSE_C_RUNTIME_TLS_SUPPORT + #define configUSE_C_RUNTIME_TLS_SUPPORT 0 +#endif + +#if ( ( configUSE_NEWLIB_REENTRANT == 0 ) && ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) + + #ifndef configTLS_BLOCK_TYPE + #error Missing definition: configTLS_BLOCK_TYPE must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1. + #endif + + #ifndef configINIT_TLS_BLOCK + #error Missing definition: configINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1. + #endif + + #ifndef configSET_TLS_BLOCK + #error Missing definition: configSET_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1. + #endif + + #ifndef configDEINIT_TLS_BLOCK + #error Missing definition: configDEINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1. + #endif +#endif /* if ( ( configUSE_NEWLIB_REENTRANT == 0 ) && ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) */ + +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configMINIMAL_STACK_SIZE + #error Missing definition: configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h. configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task. Refer to the demo project provided for your port for a suitable value. +#endif + +#ifndef configMAX_PRIORITIES + #error Missing definition: configMAX_PRIORITIES must be defined in FreeRTOSConfig.h. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#if configMAX_PRIORITIES < 1 + #error configMAX_PRIORITIES must be defined to be greater than or equal to 1. +#endif + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_16_BIT_TICKS + #error Missing definition: configUSE_16_BIT_TICKS must be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_CO_ROUTINES + #define configUSE_CO_ROUTINES 0 +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #define INCLUDE_vTaskPrioritySet 0 +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #define INCLUDE_uxTaskPriorityGet 0 +#endif + +#ifndef INCLUDE_vTaskDelete + #define INCLUDE_vTaskDelete 0 +#endif + +#ifndef INCLUDE_vTaskSuspend + #define INCLUDE_vTaskSuspend 0 +#endif + +#ifdef INCLUDE_xTaskDelayUntil + #ifdef INCLUDE_vTaskDelayUntil + +/* INCLUDE_vTaskDelayUntil was replaced by INCLUDE_xTaskDelayUntil. Backward + * compatibility is maintained if only one or the other is defined, but + * there is a conflict if both are defined. */ + #error INCLUDE_vTaskDelayUntil and INCLUDE_xTaskDelayUntil are both defined. INCLUDE_vTaskDelayUntil is no longer required and should be removed + #endif +#endif + +#ifndef INCLUDE_xTaskDelayUntil + #ifdef INCLUDE_vTaskDelayUntil + +/* If INCLUDE_vTaskDelayUntil is set but INCLUDE_xTaskDelayUntil is not then + * the project's FreeRTOSConfig.h probably pre-dates the introduction of + * xTaskDelayUntil and setting INCLUDE_xTaskDelayUntil to whatever + * INCLUDE_vTaskDelayUntil is set to will ensure backward compatibility. + */ + #define INCLUDE_xTaskDelayUntil INCLUDE_vTaskDelayUntil + #endif +#endif + +#ifndef INCLUDE_xTaskDelayUntil + #define INCLUDE_xTaskDelayUntil 0 +#endif + +#ifndef INCLUDE_vTaskDelay + #define INCLUDE_vTaskDelay 0 +#endif + +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 0 +#endif + +#ifndef INCLUDE_xTaskAbortDelay + #define INCLUDE_xTaskAbortDelay 0 +#endif + +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 0 +#endif + +#ifndef INCLUDE_xSemaphoreGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder +#endif + +#ifndef INCLUDE_xTaskGetHandle + #define INCLUDE_xTaskGetHandle 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark2 + #define INCLUDE_uxTaskGetStackHighWaterMark2 0 +#endif + +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 0 +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef INCLUDE_xTimerPendFunctionCall + #define INCLUDE_xTimerPendFunctionCall 0 +#endif + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 1 +#endif + +#if configUSE_CO_ROUTINES != 0 + #ifndef configMAX_CO_ROUTINE_PRIORITIES + #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1. + #endif +#endif + +#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK + #define configUSE_DAEMON_TASK_STARTUP_HOOK 0 +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS + #define configNUM_THREAD_LOCAL_STORAGE_POINTERS 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 +#endif + +/* configPRECONDITION should be defined as configASSERT. + * The CBMC proofs need a way to track assumptions and assertions. + * A configPRECONDITION statement should express an implicit invariant or + * assumption made. A configASSERT statement should express an invariant that must + * hold explicit before calling the code. */ +#ifndef configPRECONDITION + #define configPRECONDITION( X ) configASSERT( X ) + #define configPRECONDITION_DEFINED 0 +#else + #define configPRECONDITION_DEFINED 1 +#endif + +#ifndef portMEMORY_BARRIER + #define portMEMORY_BARRIER() +#endif + +#ifndef portSOFTWARE_BARRIER + #define portSOFTWARE_BARRIER() +#endif + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + +#endif /* configUSE_TIMERS */ + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) ( uxSavedStatusValue ) +#endif + +#ifndef portCLEAN_UP_TCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) ( pxTCB ) +#endif + +#ifndef portPRE_TASK_DELETE_HOOK + #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending ) +#endif + +#ifndef portSETUP_TCB + #define portSETUP_TCB( pxTCB ) ( void ) ( pxTCB ) +#endif + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1 ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) + #define pcQueueGetName( xQueue ) +#endif + +#ifndef configUSE_MINI_LIST_ITEM + #define configUSE_MINI_LIST_ITEM 1 +#endif + +#ifndef portPOINTER_SIZE_TYPE + #define portPOINTER_SIZE_TYPE uint32_t +#endif + +/* Remove any unused trace macros. */ +#ifndef traceSTART + +/* Used to perform any necessary initialisation - for example, open a file + * into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + +/* Use to close a trace, for example close a file into which trace has been + * written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + +/* Called after a task has been selected to run. pxCurrentTCB holds a pointer + * to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceINCREASE_TICK_COUNT + +/* Called before stepping the tick count after waking from tickless idle + * sleep. */ + #define traceINCREASE_TICK_COUNT( x ) +#endif + +#ifndef traceLOW_POWER_IDLE_BEGIN + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() +#endif + +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() +#endif + +#ifndef traceTASK_SWITCHED_OUT + +/* Called before a task has been selected to run. pxCurrentTCB holds a pointer + * to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceTASK_PRIORITY_INHERIT + +/* Called when a task attempts to take a mutex that is already held by a + * lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task + * that holds the mutex. uxInheritedPriority is the priority the mutex holder + * will inherit (the priority of the task that is attempting to obtain the + * muted. */ + #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) +#endif + +#ifndef traceTASK_PRIORITY_DISINHERIT + +/* Called when a task releases a mutex, the holding of which had resulted in + * the task inheriting the priority of a higher priority task. + * pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the + * mutex. uxOriginalPriority is the task's configured (base) priority. */ + #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + +/* Task is about to block because it cannot read from a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the read was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_PEEK + +/* Task is about to block because it cannot read from a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the read was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + +/* Task is about to block because it cannot write to a + * queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + * upon which the write was attempted. pxCurrentTCB points to the TCB of the + * task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +#ifndef configRECORD_STACK_HIGH_ADDRESS + #define configRECORD_STACK_HIGH_ADDRESS 0 +#endif + +#ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H + #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceMOVED_TASK_TO_READY_STATE + #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef tracePOST_MOVED_TASK_TO_READY_STATE + #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED( ucQueueType ) +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SET_SEND + #define traceQUEUE_SET_SEND traceQUEUE_SEND +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FAILED + #define traceQUEUE_PEEK_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL( x ) +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef traceEVENT_GROUP_CREATE + #define traceEVENT_GROUP_CREATE( xEventGroup ) +#endif + +#ifndef traceEVENT_GROUP_CREATE_FAILED + #define traceEVENT_GROUP_CREATE_FAILED() +#endif + +#ifndef traceEVENT_GROUP_SYNC_BLOCK + #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_SYNC_END + #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) ( xTimeoutOccurred ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK + #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor ) +#endif + +#ifndef traceEVENT_GROUP_WAIT_BITS_END + #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred ) ( void ) ( xTimeoutOccurred ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS + #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR + #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS + #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR + #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet ) +#endif + +#ifndef traceEVENT_GROUP_DELETE + #define traceEVENT_GROUP_DELETE( xEventGroup ) +#endif + +#ifndef tracePEND_FUNC_CALL + #define tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, ret ) +#endif + +#ifndef tracePEND_FUNC_CALL_FROM_ISR + #define tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, ret ) +#endif + +#ifndef traceQUEUE_REGISTRY_ADD + #define traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ) +#endif + +#ifndef traceTASK_NOTIFY_TAKE_BLOCK + #define traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY_TAKE + #define traceTASK_NOTIFY_TAKE( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY_WAIT_BLOCK + #define traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY_WAIT + #define traceTASK_NOTIFY_WAIT( uxIndexToWait ) +#endif + +#ifndef traceTASK_NOTIFY + #define traceTASK_NOTIFY( uxIndexToNotify ) +#endif + +#ifndef traceTASK_NOTIFY_FROM_ISR + #define traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify ) +#endif + +#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR + #define traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE_FAILED + #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED + #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_CREATE + #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_DELETE + #define traceSTREAM_BUFFER_DELETE( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RESET + #define traceSTREAM_BUFFER_RESET( xStreamBuffer ) +#endif + +#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND + #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND + #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND_FAILED + #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_SEND_FROM_ISR + #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent ) +#endif + +#ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE + #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE + #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE_FAILED + #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ) +#endif + +#ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR + #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ) +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef portSUPPRESS_TICKS_AND_SLEEP + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) +#endif + +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 +#endif + +#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 + #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 +#endif + +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 +#endif + +#ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING + #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPRE_SLEEP_PROCESSING + #define configPRE_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPOST_SLEEP_PROCESSING + #define configPOST_SLEEP_PROCESSING( x ) +#endif + +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 0 +#endif + +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef portALLOCATE_SECURE_CONTEXT + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) +#endif + +#ifndef portDONT_DISCARD + #define portDONT_DISCARD +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +#ifndef configUSE_TRACE_FACILITY + #define configUSE_TRACE_FACILITY 0 +#endif + +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +#ifndef mtCOVERAGE_TEST_DELAY + #define mtCOVERAGE_TEST_DELAY() +#endif + +#ifndef portASSERT_IF_IN_ISR + #define portASSERT_IF_IN_ISR() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +#ifndef configAPPLICATION_ALLOCATED_HEAP + #define configAPPLICATION_ALLOCATED_HEAP 0 +#endif + +#ifndef configUSE_TASK_NOTIFICATIONS + #define configUSE_TASK_NOTIFICATIONS 1 +#endif + +#ifndef configTASK_NOTIFICATION_ARRAY_ENTRIES + #define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 +#endif + +#if configTASK_NOTIFICATION_ARRAY_ENTRIES < 1 + #error configTASK_NOTIFICATION_ARRAY_ENTRIES must be at least 1 +#endif + +#ifndef configUSE_POSIX_ERRNO + #define configUSE_POSIX_ERRNO 0 +#endif + +#ifndef configUSE_SB_COMPLETED_CALLBACK + +/* By default per-instance callbacks are not enabled for stream buffer or message buffer. */ + #define configUSE_SB_COMPLETED_CALLBACK 0 +#endif + +#ifndef portTICK_TYPE_IS_ATOMIC + #define portTICK_TYPE_IS_ATOMIC 0 +#endif + +#ifndef configSUPPORT_STATIC_ALLOCATION + /* Defaults to 0 for backward compatibility. */ + #define configSUPPORT_STATIC_ALLOCATION 0 +#endif + +#ifndef configSUPPORT_DYNAMIC_ALLOCATION + /* Defaults to 1 for backward compatibility. */ + #define configSUPPORT_DYNAMIC_ALLOCATION 1 +#endif + +#if ( ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION != 1 ) ) + #error configUSE_STATS_FORMATTING_FUNCTIONS cannot be used without dynamic allocation, but configSUPPORT_DYNAMIC_ALLOCATION is not set to 1. +#endif + +#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) + #if ( ( configUSE_TRACE_FACILITY != 1 ) && ( configGENERATE_RUN_TIME_STATS != 1 ) ) + #error configUSE_STATS_FORMATTING_FUNCTIONS is 1 but the functions it enables are not used because neither configUSE_TRACE_FACILITY or configGENERATE_RUN_TIME_STATS are 1. Set configUSE_STATS_FORMATTING_FUNCTIONS to 0 in FreeRTOSConfig.h. + #endif +#endif + +#ifndef configSTACK_DEPTH_TYPE + +/* Defaults to uint16_t for backward compatibility, but can be overridden + * in FreeRTOSConfig.h if uint16_t is too restrictive. */ + #define configSTACK_DEPTH_TYPE uint16_t +#endif + +#ifndef configRUN_TIME_COUNTER_TYPE + +/* Defaults to uint32_t for backward compatibility, but can be overridden in + * FreeRTOSConfig.h if uint32_t is too restrictive. */ + + #define configRUN_TIME_COUNTER_TYPE uint32_t +#endif + +#ifndef configMESSAGE_BUFFER_LENGTH_TYPE + +/* Defaults to size_t for backward compatibility, but can be overridden + * in FreeRTOSConfig.h if lengths will always be less than the number of bytes + * in a size_t. */ + #define configMESSAGE_BUFFER_LENGTH_TYPE size_t +#endif + +/* Sanity check the configuration. */ +#if ( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1. +#endif + +#if ( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) ) + #error configUSE_MUTEXES must be set to 1 to use recursive mutexes +#endif + +#ifndef configINITIAL_TICK_COUNT + #define configINITIAL_TICK_COUNT 0 +#endif + +#if ( portTICK_TYPE_IS_ATOMIC == 0 ) + +/* Either variables of tick type cannot be read atomically, or + * portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when + * the tick count is returned to the standard critical section macros. */ + #define portTICK_TYPE_ENTER_CRITICAL() portENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() portEXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) ) +#else + +/* The tick type can be read atomically, so critical sections used when the + * tick count is returned can be defined away. */ + #define portTICK_TYPE_ENTER_CRITICAL() + #define portTICK_TYPE_EXIT_CRITICAL() + #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR() 0 + #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x ) ( void ) ( x ) +#endif /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */ + +/* Definitions to allow backward compatibility with FreeRTOS versions prior to + * V8 if desired. */ +#ifndef configENABLE_BACKWARD_COMPATIBILITY + #define configENABLE_BACKWARD_COMPATIBILITY 1 +#endif + +#ifndef configPRINTF + +/* configPRINTF() was not defined, so define it away to nothing. To use + * configPRINTF() then define it as follows (where MyPrintFunction() is + * provided by the application writer): + * + * void MyPrintFunction(const char *pcFormat, ... ); + #define configPRINTF( X ) MyPrintFunction X + * + * Then call like a standard printf() function, but placing brackets around + * all parameters so they are passed as a single parameter. For example: + * configPRINTF( ("Value = %d", MyVariable) ); */ + #define configPRINTF( X ) +#endif + +#ifndef configMAX + +/* The application writer has not provided their own MAX macro, so define + * the following generic implementation. */ + #define configMAX( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) +#endif + +#ifndef configMIN + +/* The application writer has not provided their own MIN macro, so define + * the following generic implementation. */ + #define configMIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) +#endif + +#if configENABLE_BACKWARD_COMPATIBILITY == 1 + #define eTaskStateGet eTaskGetState + #define portTickType TickType_t + #define xTaskHandle TaskHandle_t + #define xQueueHandle QueueHandle_t + #define xSemaphoreHandle SemaphoreHandle_t + #define xQueueSetHandle QueueSetHandle_t + #define xQueueSetMemberHandle QueueSetMemberHandle_t + #define xTimeOutType TimeOut_t + #define xMemoryRegion MemoryRegion_t + #define xTaskParameters TaskParameters_t + #define xTaskStatusType TaskStatus_t + #define xTimerHandle TimerHandle_t + #define xCoRoutineHandle CoRoutineHandle_t + #define pdTASK_HOOK_CODE TaskHookFunction_t + #define portTICK_RATE_MS portTICK_PERIOD_MS + #define pcTaskGetTaskName pcTaskGetName + #define pcTimerGetTimerName pcTimerGetName + #define pcQueueGetQueueName pcQueueGetName + #define vTaskGetTaskInfo vTaskGetInfo + #define xTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter + +/* Backward compatibility within the scheduler code only - these definitions + * are not really required but are included for completeness. */ + #define tmrTIMER_CALLBACK TimerCallbackFunction_t + #define pdTASK_CODE TaskFunction_t + #define xListItem ListItem_t + #define xList List_t + +/* For libraries that break the list data hiding, and access list structure + * members directly (which is not supposed to be done). */ + #define pxContainer pvContainer +#endif /* configENABLE_BACKWARD_COMPATIBILITY */ + +#if ( configUSE_ALTERNATIVE_API != 0 ) + #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0 +#endif + +/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even + * if floating point hardware is otherwise supported by the FreeRTOS port in use. + * This constant is not supported by all FreeRTOS ports that include floating + * point support. */ +#ifndef configUSE_TASK_FPU_SUPPORT + #define configUSE_TASK_FPU_SUPPORT 1 +#endif + +/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is + * currently used in ARMv8M ports. */ +#ifndef configENABLE_MPU + #define configENABLE_MPU 0 +#endif + +/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is + * currently used in ARMv8M ports. */ +#ifndef configENABLE_FPU + #define configENABLE_FPU 1 +#endif + +/* Set configENABLE_MVE to 1 to enable MVE support and 0 to disable it. This is + * currently used in ARMv8M ports. */ +#ifndef configENABLE_MVE + #define configENABLE_MVE 0 +#endif + +/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it. + * This is currently used in ARMv8M ports. */ +#ifndef configENABLE_TRUSTZONE + #define configENABLE_TRUSTZONE 1 +#endif + +/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on + * the Secure Side only. */ +#ifndef configRUN_FREERTOS_SECURE_ONLY + #define configRUN_FREERTOS_SECURE_ONLY 0 +#endif + +#ifndef configRUN_ADDITIONAL_TESTS + #define configRUN_ADDITIONAL_TESTS 0 +#endif + + +/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using + * dynamically allocated RAM, in which case when any task is deleted it is known + * that both the task's stack and TCB need to be freed. Sometimes the + * FreeRTOSConfig.h settings only allow a task to be created using statically + * allocated RAM, in which case when any task is deleted it is known that neither + * the task's stack or TCB should be freed. Sometimes the FreeRTOSConfig.h + * settings allow a task to be created using either statically or dynamically + * allocated RAM, in which case a member of the TCB is used to record whether the + * stack and/or TCB were allocated statically or dynamically, so when a task is + * deleted the RAM that was allocated dynamically is freed again and no attempt is + * made to free the RAM that was allocated statically. + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a + * task to be created using either statically or dynamically allocated RAM. Note + * that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with + * a statically allocated stack and a dynamically allocated TCB. + * + * The following table lists various combinations of portUSING_MPU_WRAPPERS, + * configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and + * when it is possible to have both static and dynamic allocation: + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + * | MPU | Dynamic | Static | Available Functions | Possible Allocations | Both Dynamic and | Need Free | + * | | | | | | Static Possible | | + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + * | 0 | 0 | 1 | xTaskCreateStatic | TCB - Static, Stack - Static | No | No | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 0 | 1 | 0 | xTaskCreate | TCB - Dynamic, Stack - Dynamic | No | Yes | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 0 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateStatic | 2. TCB - Static, Stack - Static | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 0 | 1 | xTaskCreateStatic, | TCB - Static, Stack - Static | No | No | + * | | | | xTaskCreateRestrictedStatic | | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 1 | 0 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateRestricted | 2. TCB - Dynamic, Stack - Static | | | + * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------| + * | 1 | 1 | 1 | xTaskCreate, | 1. TCB - Dynamic, Stack - Dynamic | Yes | Yes | + * | | | | xTaskCreateStatic, | 2. TCB - Dynamic, Stack - Static | | | + * | | | | xTaskCreateRestricted, | 3. TCB - Static, Stack - Static | | | + * | | | | xTaskCreateRestrictedStatic | | | | + * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+ + */ +#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE \ + ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \ + ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) ) + +/* + * In line with software engineering best practice, FreeRTOS implements a strict + * data hiding policy, so the real structures used by FreeRTOS to maintain the + * state of tasks, queues, semaphores, etc. are not accessible to the application + * code. However, if the application writer wants to statically allocate such + * an object then the size of the object needs to be known. Dummy structures + * that are guaranteed to have the same size and alignment requirements of the + * real objects are used for this purpose. The dummy list and list item + * structures below are used for inclusion in such a dummy structure. + */ +struct xSTATIC_LIST_ITEM +{ + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void * pvDummy3[ 4 ]; + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy4; + #endif +}; +typedef struct xSTATIC_LIST_ITEM StaticListItem_t; + +#if ( configUSE_MINI_LIST_ITEM == 1 ) + /* See the comments above the struct xSTATIC_LIST_ITEM definition. */ + struct xSTATIC_MINI_LIST_ITEM + { + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + TickType_t xDummy2; + void * pvDummy3[ 2 ]; + }; + typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t; +#else /* if ( configUSE_MINI_LIST_ITEM == 1 ) */ + typedef struct xSTATIC_LIST_ITEM StaticMiniListItem_t; +#endif /* if ( configUSE_MINI_LIST_ITEM == 1 ) */ + +/* See the comments above the struct xSTATIC_LIST_ITEM definition. */ +typedef struct xSTATIC_LIST +{ + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy1; + #endif + UBaseType_t uxDummy2; + void * pvDummy3; + StaticMiniListItem_t xDummy4; + #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 ) + TickType_t xDummy5; + #endif +} StaticList_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Task structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a task then + * the size of the task object needs to be known. The StaticTask_t structure + * below is provided for this purpose. Its sizes and alignment requirements are + * guaranteed to match those of the genuine structure, no matter which + * architecture is being used, and no matter how the values in FreeRTOSConfig.h + * are set. Its contents are somewhat obfuscated in the hope users will + * recognise that it would be unwise to make direct use of the structure members. + */ +typedef struct xSTATIC_TCB +{ + void * pxDummy1; + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xDummy2; + #endif + StaticListItem_t xDummy3[ 2 ]; + UBaseType_t uxDummy5; + void * pxDummy6; + uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ]; + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + void * pxDummy8; + #endif + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxDummy9; + #endif + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy10[ 2 ]; + #endif + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxDummy12[ 2 ]; + #endif + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void * pxDummy14; + #endif + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + configRUN_TIME_COUNTER_TYPE ulDummy16; + #endif + #if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) + configTLS_BLOCK_TYPE xDummy17; + #endif + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t ulDummy18[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + uint8_t ucDummy19[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + #endif + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + uint8_t uxDummy20; + #endif + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDummy21; + #endif + #if ( configUSE_POSIX_ERRNO == 1 ) + int iDummy22; + #endif +} StaticTask_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the Queue structure used internally by + * FreeRTOS is not accessible to application code. However, if the application + * writer wants to statically allocate the memory required to create a queue + * then the size of the queue object needs to be known. The StaticQueue_t + * structure below is provided for this purpose. Its sizes and alignment + * requirements are guaranteed to match those of the genuine structure, no + * matter which architecture is being used, and no matter how the values in + * FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in the hope + * users will recognise that it would be unwise to make direct use of the + * structure members. + */ +typedef struct xSTATIC_QUEUE +{ + void * pvDummy1[ 3 ]; + + union + { + void * pvDummy2; + UBaseType_t uxDummy2; + } u; + + StaticList_t xDummy3[ 2 ]; + UBaseType_t uxDummy4[ 3 ]; + uint8_t ucDummy5[ 2 ]; + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy6; + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + void * pvDummy7; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy8; + uint8_t ucDummy9; + #endif +} StaticQueue_t; +typedef StaticQueue_t StaticSemaphore_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the event group structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create an event group then the size of the event group object needs to be + * know. The StaticEventGroup_t structure below is provided for this purpose. + * Its sizes and alignment requirements are guaranteed to match those of the + * genuine structure, no matter which architecture is being used, and no matter + * how the values in FreeRTOSConfig.h are set. Its contents are somewhat + * obfuscated in the hope users will recognise that it would be unwise to make + * direct use of the structure members. + */ +typedef struct xSTATIC_EVENT_GROUP +{ + TickType_t xDummy1; + StaticList_t xDummy2; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy3; + #endif + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucDummy4; + #endif +} StaticEventGroup_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the software timer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a software timer then the size of the queue object needs to be known. + * The StaticTimer_t structure below is provided for this purpose. Its sizes + * and alignment requirements are guaranteed to match those of the genuine + * structure, no matter which architecture is being used, and no matter how the + * values in FreeRTOSConfig.h are set. Its contents are somewhat obfuscated in + * the hope users will recognise that it would be unwise to make direct use of + * the structure members. + */ +typedef struct xSTATIC_TIMER +{ + void * pvDummy1; + StaticListItem_t xDummy2; + TickType_t xDummy3; + void * pvDummy5; + TaskFunction_t pvDummy6; + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy7; + #endif + uint8_t ucDummy8; +} StaticTimer_t; + +/* + * In line with software engineering best practice, especially when supplying a + * library that is likely to change in future versions, FreeRTOS implements a + * strict data hiding policy. This means the stream buffer structure used + * internally by FreeRTOS is not accessible to application code. However, if + * the application writer wants to statically allocate the memory required to + * create a stream buffer then the size of the stream buffer object needs to be + * known. The StaticStreamBuffer_t structure below is provided for this + * purpose. Its size and alignment requirements are guaranteed to match those + * of the genuine structure, no matter which architecture is being used, and + * no matter how the values in FreeRTOSConfig.h are set. Its contents are + * somewhat obfuscated in the hope users will recognise that it would be unwise + * to make direct use of the structure members. + */ +typedef struct xSTATIC_STREAM_BUFFER +{ + size_t uxDummy1[ 4 ]; + void * pvDummy2[ 3 ]; + uint8_t ucDummy3; + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxDummy4; + #endif + #if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + void * pvDummy5[ 2 ]; + #endif +} StaticStreamBuffer_t; + +/* Message buffers are built on stream buffers. */ +typedef StaticStreamBuffer_t StaticMessageBuffer_t; + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* INC_FREERTOS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/StackMacros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/StackMacros.h new file mode 100644 index 0000000..099ac0c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/StackMacros.h @@ -0,0 +1,34 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef _MSC_VER /* Visual Studio doesn't support #warning. */ + #warning The name of this file has changed to stack_macros.h. Please update your code accordingly. This source file (which has the original name) will be removed in a future release. +#endif + +#include "stack_macros.h" diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/atomic.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/atomic.h new file mode 100644 index 0000000..8e356e1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/atomic.h @@ -0,0 +1,419 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * @file atomic.h + * @brief FreeRTOS atomic operation support. + * + * This file implements atomic functions by disabling interrupts globally. + * Implementations with architecture specific atomic instructions can be + * provided under each compiler directory. + */ + +#ifndef ATOMIC_H +#define ATOMIC_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include atomic.h" +#endif + +/* Standard includes. */ +#include + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* + * Port specific definitions -- entering/exiting critical section. + * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h + * + * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with + * ATOMIC_ENTER_CRITICAL(). + * + */ +#if defined( portSET_INTERRUPT_MASK_FROM_ISR ) + +/* Nested interrupt scheme is supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() \ + UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR() + + #define ATOMIC_EXIT_CRITICAL() \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType ) + +#else + +/* Nested interrupt scheme is NOT supported in this port. */ + #define ATOMIC_ENTER_CRITICAL() portENTER_CRITICAL() + #define ATOMIC_EXIT_CRITICAL() portEXIT_CRITICAL() + +#endif /* portSET_INTERRUPT_MASK_FROM_ISR() */ + +/* + * Port specific definition -- "always inline". + * Inline is compiler specific, and may not always get inlined depending on your + * optimization level. Also, inline is considered as performance optimization + * for atomic. Thus, if portFORCE_INLINE is not provided by portmacro.h, + * instead of resulting error, simply define it away. + */ +#ifndef portFORCE_INLINE + #define portFORCE_INLINE +#endif + +#define ATOMIC_COMPARE_AND_SWAP_SUCCESS 0x1U /**< Compare and swap succeeded, swapped. */ +#define ATOMIC_COMPARE_AND_SWAP_FAILURE 0x0U /**< Compare and swap failed, did not swap. */ + +/*----------------------------- Swap && CAS ------------------------------*/ + +/** + * Atomic compare-and-swap + * + * @brief Performs an atomic compare-and-swap operation on the specified values. + * + * @param[in, out] pulDestination Pointer to memory location from where value is + * to be loaded and checked. + * @param[in] ulExchange If condition meets, write this value to memory. + * @param[in] ulComparand Swap condition. + * + * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. + * + * @note This function only swaps *pulDestination with ulExchange, if previous + * *pulDestination value equals ulComparand. + */ +static portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination, + uint32_t ulExchange, + uint32_t ulComparand ) +{ + uint32_t ulReturnValue; + + ATOMIC_ENTER_CRITICAL(); + { + if( *pulDestination == ulComparand ) + { + *pulDestination = ulExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } + else + { + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + } + } + ATOMIC_EXIT_CRITICAL(); + + return ulReturnValue; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic swap (pointers) + * + * @brief Atomically sets the address pointed to by *ppvDestination to the value + * of *pvExchange. + * + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and written back to. + * @param[in] pvExchange Pointer value to be written to *ppvDestination. + * + * @return The initial value of *ppvDestination. + */ +static portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange ) +{ + void * pReturnValue; + + ATOMIC_ENTER_CRITICAL(); + { + pReturnValue = *ppvDestination; + *ppvDestination = pvExchange; + } + ATOMIC_EXIT_CRITICAL(); + + return pReturnValue; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic compare-and-swap (pointers) + * + * @brief Performs an atomic compare-and-swap operation on the specified pointer + * values. + * + * @param[in, out] ppvDestination Pointer to memory location from where a pointer + * value is to be loaded and checked. + * @param[in] pvExchange If condition meets, write this value to memory. + * @param[in] pvComparand Swap condition. + * + * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped. + * + * @note This function only swaps *ppvDestination with pvExchange, if previous + * *ppvDestination value equals pvComparand. + */ +static portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination, + void * pvExchange, + void * pvComparand ) +{ + uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE; + + ATOMIC_ENTER_CRITICAL(); + { + if( *ppvDestination == pvComparand ) + { + *ppvDestination = pvExchange; + ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS; + } + } + ATOMIC_EXIT_CRITICAL(); + + return ulReturnValue; +} + + +/*----------------------------- Arithmetic ------------------------------*/ + +/** + * Atomic add + * + * @brief Atomically adds count to the value of the specified pointer points to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * @param[in] ulCount Value to be added to *pulAddend. + * + * @return previous *pulAddend value. + */ +static portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend += ulCount; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic subtract + * + * @brief Atomically subtracts count from the value of the specified pointer + * pointers to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * @param[in] ulCount Value to be subtract from *pulAddend. + * + * @return previous *pulAddend value. + */ +static portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend, + uint32_t ulCount ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend -= ulCount; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic increment + * + * @brief Atomically increments the value of the specified pointer points to. + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * + * @return *pulAddend value before increment. + */ +static portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend += 1; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic decrement + * + * @brief Atomically decrements the value of the specified pointer points to + * + * @param[in,out] pulAddend Pointer to memory location from where value is to be + * loaded and written back to. + * + * @return *pulAddend value before decrement. + */ +static portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulAddend; + *pulAddend -= 1; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} + +/*----------------------------- Bitwise Logical ------------------------------*/ + +/** + * Atomic OR + * + * @brief Performs an atomic OR operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be ORed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination |= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic AND + * + * @brief Performs an atomic AND operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be ANDed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination &= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic NAND + * + * @brief Performs an atomic NAND operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be NANDed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination = ~( ulCurrent & ulValue ); + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} +/*-----------------------------------------------------------*/ + +/** + * Atomic XOR + * + * @brief Performs an atomic XOR operation on the specified values. + * + * @param [in, out] pulDestination Pointer to memory location from where value is + * to be loaded and written back to. + * @param [in] ulValue Value to be XORed with *pulDestination. + * + * @return The original value of *pulDestination. + */ +static portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination, + uint32_t ulValue ) +{ + uint32_t ulCurrent; + + ATOMIC_ENTER_CRITICAL(); + { + ulCurrent = *pulDestination; + *pulDestination ^= ulValue; + } + ATOMIC_EXIT_CRITICAL(); + + return ulCurrent; +} + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* ATOMIC_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/croutine.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/croutine.h new file mode 100644 index 0000000..48e6f03 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/croutine.h @@ -0,0 +1,753 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* Used to hide the implementation of the co-routine control block. The + * control block structure however has to be included in the header due to + * the macro implementation of the co-routine functionality. */ +typedef void * CoRoutineHandle_t; + +/* Defines the prototype to which co-routine functions must conform. */ +typedef void (* crCOROUTINE_CODE)( CoRoutineHandle_t, + UBaseType_t ); + +typedef struct corCoRoutineControlBlock +{ + crCOROUTINE_CODE pxCoRoutineFunction; + ListItem_t xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + ListItem_t xEventListItem; /*< List item used to place the CRCB in event lists. */ + UBaseType_t uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + UBaseType_t uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + uint16_t uxState; /*< Used internally by the co-routine implementation. */ +} CRCB_t; /* Co-routine control block. Note must be identical in size down to uxPriority with TCB_t. */ + +/** + * croutine. h + * @code{c} + * BaseType_t xCoRoutineCreate( + * crCOROUTINE_CODE pxCoRoutineCode, + * UBaseType_t uxPriority, + * UBaseType_t uxIndex + * ); + * @endcode + * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * list, otherwise an error code defined with ProjDefs.h. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * // This may not be necessary for const variables. + * static const char cLedToFlash[ 2 ] = { 5, 6 }; + * static const TickType_t uxFlashRates[ 2 ] = { 200, 400 }; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // This co-routine just delays for a fixed period, then toggles + * // an LED. Two co-routines are created using this function, so + * // the uxIndex parameter is used to tell the co-routine which + * // LED to flash and how int32_t to delay. This assumes xQueue has + * // already been created. + * vParTestToggleLED( cLedToFlash[ uxIndex ] ); + * crDELAY( xHandle, uxFlashRates[ uxIndex ] ); + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * + * // Function that creates two co-routines. + * void vOtherFunction( void ) + * { + * uint8_t ucParameterToPass; + * TaskHandle_t xHandle; + * + * // Create two co-routines at priority 0. The first is given index 0 + * // so (from the code above) toggles LED 5 every 200 ticks. The second + * // is given index 1 so toggles LED 6 every 400 ticks. + * for( uxIndex = 0; uxIndex < 2; uxIndex++ ) + * { + * xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex ); + * } + * } + * @endcode + * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, + UBaseType_t uxPriority, + UBaseType_t uxIndex ); + + +/** + * croutine. h + * @code{c} + * void vCoRoutineSchedule( void ); + * @endcode + * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * hook). + * + * Example usage: + * @code{c} + * // This idle task hook will schedule a co-routine each time it is called. + * // The rest of the idle task will execute between co-routine calls. + * void vApplicationIdleHook( void ) + * { + * vCoRoutineSchedule(); + * } + * + * // Alternatively, if you do not require any other part of the idle task to + * // execute, the idle task hook can call vCoRoutineSchedule() within an + * // infinite loop. + * void vApplicationIdleHook( void ) + * { + * for( ;; ) + * { + * vCoRoutineSchedule(); + * } + * } + * @endcode + * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + * @code{c} + * crSTART( CoRoutineHandle_t xHandle ); + * @endcode + * + * This macro MUST always be called at the start of a co-routine function. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static int32_t ulAVariable; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Co-routine functionality goes here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) \ + switch( ( ( CRCB_t * ) ( pxCRCB ) )->uxState ) { \ + case 0: + +/** + * croutine. h + * @code{c} + * crEND(); + * @endcode + * + * This macro MUST always be called at the end of a co-routine function. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static int32_t ulAVariable; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Co-routine functionality goes here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crEND() } + +/* + * These macros are intended for internal use by the co-routine implementation + * only. The macros should not be used directly by application writers. + */ +#define crSET_STATE0( xHandle ) \ + ( ( CRCB_t * ) ( xHandle ) )->uxState = ( __LINE__ * 2 ); return; \ + case ( __LINE__ * 2 ): +#define crSET_STATE1( xHandle ) \ + ( ( CRCB_t * ) ( xHandle ) )->uxState = ( ( __LINE__ * 2 ) + 1 ); return; \ + case ( ( __LINE__ * 2 ) + 1 ): + +/** + * croutine. h + * @code{c} + * crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay ); + * @endcode + * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_PERIOD_MS + * can be used to convert ticks to milliseconds. + * + * Example usage: + * @code{c} + * // Co-routine to be created. + * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * // This may not be necessary for const variables. + * // We are to delay for 200ms. + * static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS; + * + * // Must start every co-routine with a call to crSTART(); + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Delay for 200ms. + * crDELAY( xHandle, xDelayTime ); + * + * // Do something here. + * } + * + * // Must end every co-routine with a call to crEND(); + * crEND(); + * } + * @endcode + * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); + +/** + * @code{c} + * crQUEUE_SEND( + * CoRoutineHandle_t xHandle, + * QueueHandle_t pxQueue, + * void *pvItemToQueue, + * TickType_t xTicksToWait, + * BaseType_t *pxResult + * ) + * @endcode + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * error defined within ProjDefs.h. + * + * Example usage: + * @code{c} + * // Co-routine function that blocks for a fixed period then posts a number onto + * // a queue. + * static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static BaseType_t xNumberToPost = 0; + * static BaseType_t xResult; + * + * // Co-routines must begin with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // This assumes the queue has already been created. + * crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult ); + * + * if( xResult != pdPASS ) + * { + * // The message was not posted! + * } + * + * // Increment the number to be posted onto the queue. + * xNumberToPost++; + * + * // Delay for 100 ticks. + * crDELAY( xHandle, 100 ); + * } + * + * // Co-routines must end with a call to crEND(). + * crEND(); + * } + * @endcode + * \defgroup crQUEUE_SEND crQUEUE_SEND + * \ingroup Tasks + */ +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ + { \ + *( pxResult ) = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ + } + +/** + * croutine. h + * @code{c} + * crQUEUE_RECEIVE( + * CoRoutineHandle_t xHandle, + * QueueHandle_t pxQueue, + * void *pvBuffer, + * TickType_t xTicksToWait, + * BaseType_t *pxResult + * ) + * @endcode + * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * an error code as defined within ProjDefs.h. + * + * Example usage: + * @code{c} + * // A co-routine receives the number of an LED to flash from a queue. It + * // blocks on the queue until the number is received. + * static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // Variables in co-routines must be declared static if they must maintain value across a blocking call. + * static BaseType_t xResult; + * static UBaseType_t uxLEDToFlash; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Wait for data to become available on the queue. + * crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + * + * if( xResult == pdPASS ) + * { + * // We received the LED to flash - flash it! + * vParTestToggleLED( uxLEDToFlash ); + * } + * } + * + * crEND(); + * } + * @endcode + * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ + { \ + *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ + } + +/** + * croutine. h + * @code{c} + * crQUEUE_SEND_FROM_ISR( + * QueueHandle_t pxQueue, + * void *pvItemToQueue, + * BaseType_t xCoRoutinePreviouslyWoken + * ) + * @endcode + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * the ISR. + * + * Example usage: + * @code{c} + * // A co-routine that blocks on a queue waiting for characters to be received. + * static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * char cRxedChar; + * BaseType_t xResult; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Wait for data to become available on the queue. This assumes the + * // queue xCommsRxQueue has already been created! + * crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + * + * // Was a character received? + * if( xResult == pdPASS ) + * { + * // Process the character here. + * } + * } + * + * // All co-routines must end with a call to crEND(). + * crEND(); + * } + * + * // An ISR that uses a queue to send characters received on a serial port to + * // a co-routine. + * void vUART_ISR( void ) + * { + * char cRxedChar; + * BaseType_t xCRWokenByPost = pdFALSE; + * + * // We loop around reading characters until there are none left in the UART. + * while( UART_RX_REG_NOT_EMPTY() ) + * { + * // Obtain the character from the UART. + * cRxedChar = UART_RX_REG; + * + * // Post the character onto a queue. xCRWokenByPost will be pdFALSE + * // the first time around the loop. If the post causes a co-routine + * // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE. + * // In this manner we can ensure that if more than one co-routine is + * // blocked on the queue only one is woken by this ISR no matter how + * // many characters are posted to the queue. + * xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost ); + * } + * } + * @endcode + * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) \ + xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + * @code{c} + * crQUEUE_SEND_FROM_ISR( + * QueueHandle_t pxQueue, + * void *pvBuffer, + * BaseType_t * pxCoRoutineWoken + * ) + * @endcode + * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * pdFALSE. + * + * Example usage: + * @code{c} + * // A co-routine that posts a character to a queue then blocks for a fixed + * // period. The character is incremented each time. + * static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) + * { + * // cChar holds its value while this co-routine is blocked and must therefore + * // be declared static. + * static char cCharToTx = 'a'; + * BaseType_t xResult; + * + * // All co-routines must start with a call to crSTART(). + * crSTART( xHandle ); + * + * for( ;; ) + * { + * // Send the next character to the queue. + * crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult ); + * + * if( xResult == pdPASS ) + * { + * // The character was successfully posted to the queue. + * } + * else + * { + * // Could not post the character to the queue. + * } + * + * // Enable the UART Tx interrupt to cause an interrupt in this + * // hypothetical UART. The interrupt will obtain the character + * // from the queue and send it. + * ENABLE_RX_INTERRUPT(); + * + * // Increment to the next character then block for a fixed period. + * // cCharToTx will maintain its value across the delay as it is + * // declared static. + * cCharToTx++; + * if( cCharToTx > 'x' ) + * { + * cCharToTx = 'a'; + * } + * crDELAY( 100 ); + * } + * + * // All co-routines must end with a call to crEND(). + * crEND(); + * } + * + * // An ISR that uses a queue to receive characters to send on a UART. + * void vUART_ISR( void ) + * { + * char cCharToTx; + * BaseType_t xCRWokenByPost = pdFALSE; + * + * while( UART_TX_REG_EMPTY() ) + * { + * // Are there any characters in the queue waiting to be sent? + * // xCRWokenByPost will automatically be set to pdTRUE if a co-routine + * // is woken by the post - ensuring that only a single co-routine is + * // woken no matter how many times we go around this loop. + * if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) ) + * { + * SEND_CHARACTER( cCharToTx ); + * } + * } + * } + * @endcode + * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) \ + xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) + +/* + * This function is intended for internal use by the co-routine macros only. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * Removes the current co-routine from its ready list and places it in the + * appropriate delayed list. + */ +void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, + List_t * pxEventList ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * Removes the highest priority co-routine from the event list and places it in + * the pending ready list. + */ +BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList ); + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* CO_ROUTINE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/deprecated_definitions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/deprecated_definitions.h new file mode 100644 index 0000000..1cb9372 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/deprecated_definitions.h @@ -0,0 +1,281 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef DEPRECATED_DEFINITIONS_H +#define DEPRECATED_DEFINITIONS_H + + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a + * pre-processor definition was used to ensure the pre-processor found the correct + * portmacro.h file for the port being used. That scheme was deprecated in favour + * of setting the compiler's include path such that it found the correct + * portmacro.h file - removing the need for the constant and allowing the + * portmacro.h file to be located anywhere in relation to the port being used. The + * definitions below remain in the code for backward compatibility only. New + * projects should not use them. */ + +#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef GCC_MEGA_AVR + #include "../portable/GCC/ATMega323/portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR + #include "../portable/IAR/ATMega323/portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "../../Source/portable/MPLAB/PIC18F/portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" +#endif + +#ifdef _FEDPICC + #include "libFreeRTOS/Include/portmacro.h" +#endif + +#ifdef SDCC_CYGNAL + #include "../../Source/portable/SDCC/Cygnal/portmacro.h" +#endif + +#ifdef GCC_ARM7 + #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx + #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 + #include "../../Source/portable/GCC/MSP430F449/portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 + #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC + #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S + #include "../../Source/portable/GCC/H8S2329/portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 + #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 + #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR + #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC + #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 + #include "../../Source/portable/GCC/HCS12/portmacro.h" +#endif + +#ifdef GCC_MCF5235 + #include "../../Source/portable/GCC/MCF5235/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC + #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR + #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" +#endif + +#ifdef GCC_PPC405 + #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" +#endif + +#ifdef GCC_PPC440 + #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" +#endif + +#ifdef BCC_INDUSTRIAL_PC_PORT + +/* A short file name has to be used in place of the normal + * FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef BCC_FLASH_LITE_186_PORT + +/* A short file name has to be used in place of the normal + * FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far * pxISR )(); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#endif /* DEPRECATED_DEFINITIONS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/event_groups.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/event_groups.h new file mode 100644 index 0000000..275f316 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/event_groups.h @@ -0,0 +1,783 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef EVENT_GROUPS_H +#define EVENT_GROUPS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include event_groups.h" +#endif + +/* FreeRTOS includes. */ +#include "timers.h" + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/** + * An event group is a collection of bits to which an application can assign a + * meaning. For example, an application may create an event group to convey + * the status of various CAN bus related events in which bit 0 might mean "A CAN + * message has been received and is ready for processing", bit 1 might mean "The + * application has queued a message that is ready for sending onto the CAN + * network", and bit 2 might mean "It is time to send a SYNC message onto the + * CAN network" etc. A task can then test the bit values to see which events + * are active, and optionally enter the Blocked state to wait for a specified + * bit or a group of specified bits to be active. To continue the CAN bus + * example, a CAN controlling task can enter the Blocked state (and therefore + * not consume any processing time) until either bit 0, bit 1 or bit 2 are + * active, at which time the bit that was actually active would inform the task + * which action it had to take (process a received message, send a message, or + * send a SYNC). + * + * The event groups implementation contains intelligence to avoid race + * conditions that would otherwise occur were an application to use a simple + * variable for the same purpose. This is particularly important with respect + * to when a bit within an event group is to be cleared, and when bits have to + * be set and then tested atomically - as is the case where event groups are + * used to create a synchronisation point between multiple tasks (a + * 'rendezvous'). + */ + + + +/** + * event_groups.h + * + * Type by which event groups are referenced. For example, a call to + * xEventGroupCreate() returns an EventGroupHandle_t variable that can then + * be used as a parameter to other event group functions. + * + * \defgroup EventGroupHandle_t EventGroupHandle_t + * \ingroup EventGroup + */ +struct EventGroupDef_t; +typedef struct EventGroupDef_t * EventGroupHandle_t; + +/* + * The type that holds event bits always matches TickType_t - therefore the + * number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1, + * 32 bits if set to 0. + * + * \defgroup EventBits_t EventBits_t + * \ingroup EventGroup + */ +typedef TickType_t EventBits_t; + +/** + * event_groups.h + * @code{c} + * EventGroupHandle_t xEventGroupCreate( void ); + * @endcode + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGroupCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see https://www.FreeRTOS.org/a00111.html). If an event group is created + * using xEventGroupCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @return If the event group was created then a handle to the event group is + * returned. If there was insufficient FreeRTOS heap available to create the + * event group then NULL is returned. See https://www.FreeRTOS.org/a00111.html + * + * Example usage: + * @code{c} + * // Declare a variable to hold the created event group. + * EventGroupHandle_t xCreatedEventGroup; + * + * // Attempt to create the event group. + * xCreatedEventGroup = xEventGroupCreate(); + * + * // Was the event group created successfully? + * if( xCreatedEventGroup == NULL ) + * { + * // The event group was not created because there was insufficient + * // FreeRTOS heap available. + * } + * else + * { + * // The event group was created. + * } + * @endcode + * \defgroup xEventGroupCreate xEventGroupCreate + * \ingroup EventGroup + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + * @code{c} + * EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer ); + * @endcode + * + * Create a new event group. + * + * Internally, within the FreeRTOS implementation, event groups use a [small] + * block of memory, in which the event group's structure is stored. If an event + * groups is created using xEventGroupCreate() then the required memory is + * automatically dynamically allocated inside the xEventGroupCreate() function. + * (see https://www.FreeRTOS.org/a00111.html). If an event group is created + * using xEventGroupCreateStatic() then the application writer must instead + * provide the memory that will get used by the event group. + * xEventGroupCreateStatic() therefore allows an event group to be created + * without using any dynamic memory allocation. + * + * Although event groups are not related to ticks, for internal implementation + * reasons the number of bits available for use in an event group is dependent + * on the configUSE_16_BIT_TICKS setting in FreeRTOSConfig.h. If + * configUSE_16_BIT_TICKS is 1 then each event group contains 8 usable bits (bit + * 0 to bit 7). If configUSE_16_BIT_TICKS is set to 0 then each event group has + * 24 usable bits (bit 0 to bit 23). The EventBits_t type is used to store + * event bits within an event group. + * + * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type + * StaticEventGroup_t, which will be then be used to hold the event group's data + * structures, removing the need for the memory to be allocated dynamically. + * + * @return If the event group was created then a handle to the event group is + * returned. If pxEventGroupBuffer was NULL then NULL is returned. + * + * Example usage: + * @code{c} + * // StaticEventGroup_t is a publicly accessible structure that has the same + * // size and alignment requirements as the real event group structure. It is + * // provided as a mechanism for applications to know the size of the event + * // group (which is dependent on the architecture and configuration file + * // settings) without breaking the strict data hiding policy by exposing the + * // real event group internals. This StaticEventGroup_t variable is passed + * // into the xSemaphoreCreateEventGroupStatic() function and is used to store + * // the event group's data structures + * StaticEventGroup_t xEventGroupBuffer; + * + * // Create the event group without dynamically allocating any memory. + * xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer ); + * @endcode + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) PRIVILEGED_FUNCTION; +#endif + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + * const EventBits_t uxBitsToWaitFor, + * const BaseType_t xClearOnExit, + * const BaseType_t xWaitForAllBits, + * const TickType_t xTicksToWait ); + * @endcode + * + * [Potentially] block to wait for one or more bits to be set within a + * previously created event group. + * + * This function cannot be called from an interrupt. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and/or bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and/or bit 1 and/or bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within + * uxBitsToWaitFor that are set within the event group will be cleared before + * xEventGroupWaitBits() returns if the wait condition was met (if the function + * returns for a reason other than a timeout). If xClearOnExit is set to + * pdFALSE then the bits set in the event group are not altered when the call to + * xEventGroupWaitBits() returns. + * + * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then + * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor + * are set or the specified block time expires. If xWaitForAllBits is set to + * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set + * in uxBitsToWaitFor is set or the specified block time expires. The block + * time is specified by the xTicksToWait parameter. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for one/all (depending on the xWaitForAllBits value) of the bits specified by + * uxBitsToWaitFor to become set. A value of portMAX_DELAY can be used to block + * indefinitely (provided INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupWaitBits() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupWaitBits() returned because the bits it was waiting for were set + * then the returned value is the event group value before any bits were + * automatically cleared in the case that xClearOnExit parameter was set to + * pdTRUE. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; + * + * // Wait a maximum of 100ms for either bit 0 or bit 4 to be set within + * // the event group. Clear the bits before exiting. + * uxBits = xEventGroupWaitBits( + * xEventGroup, // The event group being tested. + * BIT_0 | BIT_4, // The bits within the event group to wait for. + * pdTRUE, // BIT_0 and BIT_4 should be cleared before returning. + * pdFALSE, // Don't wait for both bits, either bit will do. + * xTicksToWait ); // Wait a maximum of 100ms for either bit to be set. + * + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // xEventGroupWaitBits() returned because both bits were set. + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // xEventGroupWaitBits() returned because just BIT_0 was set. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // xEventGroupWaitBits() returned because just BIT_4 was set. + * } + * else + * { + * // xEventGroupWaitBits() returned because xTicksToWait ticks passed + * // without either BIT_0 or BIT_4 becoming set. + * } + * } + * @endcode + * \defgroup xEventGroupWaitBits xEventGroupWaitBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); + * @endcode + * + * Clear bits within an event group. This function cannot be called from an + * interrupt. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear + * in the event group. For example, to clear bit 3 only, set uxBitsToClear to + * 0x08. To clear bit 3 and bit 0 set uxBitsToClear to 0x09. + * + * @return The value of the event group before the specified bits were cleared. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * + * // Clear bit 0 and bit 4 in xEventGroup. + * uxBits = xEventGroupClearBits( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 );// The bits being cleared. + * + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // Both bit 0 and bit 4 were set before xEventGroupClearBits() was + * // called. Both will now be clear (not set). + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // Bit 0 was set before xEventGroupClearBits() was called. It will + * // now be clear. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // Bit 4 was set before xEventGroupClearBits() was called. It will + * // now be clear. + * } + * else + * { + * // Neither bit 0 nor bit 4 were set in the first place. + * } + * } + * @endcode + * \defgroup xEventGroupClearBits xEventGroupClearBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); + * @endcode + * + * A version of xEventGroupClearBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed + * while interrupts are disabled, so protects event groups that are accessed + * from tasks by suspending the scheduler rather than disabling interrupts. As + * a result event groups cannot be accessed directly from an interrupt service + * routine. Therefore xEventGroupClearBitsFromISR() sends a message to the + * timer task to have the clear operation performed in the context of the timer + * task. + * + * @note If this function returns pdPASS then the timer task is ready to run + * and a portYIELD_FROM_ISR(pdTRUE) should be executed to perform the needed + * clear on the event group. This behavior is different from + * xEventGroupSetBitsFromISR because the parameter xHigherPriorityTaskWoken is + * not present. + * + * @param xEventGroup The event group in which the bits are to be cleared. + * + * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear. + * For example, to clear bit 3 only, set uxBitsToClear to 0x08. To clear bit 3 + * and bit 0 set uxBitsToClear to 0x09. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * // An event group which it is assumed has already been created by a call to + * // xEventGroupCreate(). + * EventGroupHandle_t xEventGroup; + * + * void anInterruptHandler( void ) + * { + * // Clear bit 0 and bit 4 in xEventGroup. + * xResult = xEventGroupClearBitsFromISR( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 ); // The bits being set. + * + * if( xResult == pdPASS ) + * { + * // The message was posted successfully. + * portYIELD_FROM_ISR(pdTRUE); + * } + * } + * @endcode + * \defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR + * \ingroup EventGroup + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) \ + xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) ( xEventGroup ), ( uint32_t ) ( uxBitsToClear ), NULL ) +#endif + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); + * @endcode + * + * Set bits within an event group. + * This function cannot be called from an interrupt. xEventGroupSetBitsFromISR() + * is a version that can be called from an interrupt. + * + * Setting bits in an event group will automatically unblock tasks that are + * blocked waiting for the bits. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @return The value of the event group at the time the call to + * xEventGroupSetBits() returns. There are two reasons why the returned value + * might have the bits specified by the uxBitsToSet parameter cleared. First, + * if setting a bit results in a task that was waiting for the bit leaving the + * blocked state then it is possible the bit will be cleared automatically + * (see the xClearBitOnExit parameter of xEventGroupWaitBits()). Second, any + * unblocked (or otherwise Ready state) task that has a priority above that of + * the task that called xEventGroupSetBits() will execute and may change the + * event group value before the call to xEventGroupSetBits() returns. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * void aFunction( EventGroupHandle_t xEventGroup ) + * { + * EventBits_t uxBits; + * + * // Set bit 0 and bit 4 in xEventGroup. + * uxBits = xEventGroupSetBits( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 );// The bits being set. + * + * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) ) + * { + * // Both bit 0 and bit 4 remained set when the function returned. + * } + * else if( ( uxBits & BIT_0 ) != 0 ) + * { + * // Bit 0 remained set when the function returned, but bit 4 was + * // cleared. It might be that bit 4 was cleared automatically as a + * // task that was waiting for bit 4 was removed from the Blocked + * // state. + * } + * else if( ( uxBits & BIT_4 ) != 0 ) + * { + * // Bit 4 remained set when the function returned, but bit 0 was + * // cleared. It might be that bit 0 was cleared automatically as a + * // task that was waiting for bit 0 was removed from the Blocked + * // state. + * } + * else + * { + * // Neither bit 0 nor bit 4 remained set. It might be that a task + * // was waiting for both of the bits to be set, and the bits were + * // cleared as the task left the Blocked state. + * } + * } + * @endcode + * \defgroup xEventGroupSetBits xEventGroupSetBits + * \ingroup EventGroup + */ +EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * A version of xEventGroupSetBits() that can be called from an interrupt. + * + * Setting bits in an event group is not a deterministic operation because there + * are an unknown number of tasks that may be waiting for the bit or bits being + * set. FreeRTOS does not allow nondeterministic operations to be performed in + * interrupts or from critical sections. Therefore xEventGroupSetBitsFromISR() + * sends a message to the timer task to have the set operation performed in the + * context of the timer task - where a scheduler lock is used in place of a + * critical section. + * + * @param xEventGroup The event group in which the bits are to be set. + * + * @param uxBitsToSet A bitwise value that indicates the bit or bits to set. + * For example, to set bit 3 only, set uxBitsToSet to 0x08. To set bit 3 + * and bit 0 set uxBitsToSet to 0x09. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task is higher than the priority of the + * currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE by + * xEventGroupSetBitsFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return If the request to execute the function was posted successfully then + * pdPASS is returned, otherwise pdFALSE is returned. pdFALSE will be returned + * if the timer service queue was full. + * + * Example usage: + * @code{c} + * #define BIT_0 ( 1 << 0 ) + * #define BIT_4 ( 1 << 4 ) + * + * // An event group which it is assumed has already been created by a call to + * // xEventGroupCreate(). + * EventGroupHandle_t xEventGroup; + * + * void anInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken, xResult; + * + * // xHigherPriorityTaskWoken must be initialised to pdFALSE. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Set bit 0 and bit 4 in xEventGroup. + * xResult = xEventGroupSetBitsFromISR( + * xEventGroup, // The event group being updated. + * BIT_0 | BIT_4 // The bits being set. + * &xHigherPriorityTaskWoken ); + * + * // Was the message posted successfully? + * if( xResult == pdPASS ) + * { + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and + * // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - + * // refer to the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * } + * @endcode + * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR + * \ingroup EventGroup + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#else + #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) \ + xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) ( xEventGroup ), ( uint32_t ) ( uxBitsToSet ), ( pxHigherPriorityTaskWoken ) ) +#endif + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + * const EventBits_t uxBitsToSet, + * const EventBits_t uxBitsToWaitFor, + * TickType_t xTicksToWait ); + * @endcode + * + * Atomically set bits within an event group, then wait for a combination of + * bits to be set within the same event group. This functionality is typically + * used to synchronise multiple tasks, where each task has to wait for the other + * tasks to reach a synchronisation point before proceeding. + * + * This function cannot be used from an interrupt. + * + * The function will return before its block time expires if the bits specified + * by the uxBitsToWait parameter are set, or become set within that time. In + * this case all the bits specified by uxBitsToWait will be automatically + * cleared before the function returns. + * + * @param xEventGroup The event group in which the bits are being tested. The + * event group must have previously been created using a call to + * xEventGroupCreate(). + * + * @param uxBitsToSet The bits to set in the event group before determining + * if, and possibly waiting for, all the bits specified by the uxBitsToWait + * parameter are set. + * + * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test + * inside the event group. For example, to wait for bit 0 and bit 2 set + * uxBitsToWaitFor to 0x05. To wait for bits 0 and bit 1 and bit 2 set + * uxBitsToWaitFor to 0x07. Etc. + * + * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait + * for all of the bits specified by uxBitsToWaitFor to become set. + * + * @return The value of the event group at the time either the bits being waited + * for became set, or the block time expired. Test the return value to know + * which bits were set. If xEventGroupSync() returned because its timeout + * expired then not all the bits being waited for will be set. If + * xEventGroupSync() returned because all the bits it was waiting for were + * set then the returned value is the event group value before any bits were + * automatically cleared. + * + * Example usage: + * @code{c} + * // Bits used by the three tasks. + * #define TASK_0_BIT ( 1 << 0 ) + * #define TASK_1_BIT ( 1 << 1 ) + * #define TASK_2_BIT ( 1 << 2 ) + * + * #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT ) + * + * // Use an event group to synchronise three tasks. It is assumed this event + * // group has already been created elsewhere. + * EventGroupHandle_t xEventBits; + * + * void vTask0( void *pvParameters ) + * { + * EventBits_t uxReturn; + * TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS; + * + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 0 in the event flag to note this task has reached the + * // sync point. The other two tasks will set the other two bits defined + * // by ALL_SYNC_BITS. All three tasks have reached the synchronisation + * // point when all the ALL_SYNC_BITS are set. Wait a maximum of 100ms + * // for this to happen. + * uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait ); + * + * if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS ) + * { + * // All three tasks reached the synchronisation point before the call + * // to xEventGroupSync() timed out. + * } + * } + * } + * + * void vTask1( void *pvParameters ) + * { + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 1 in the event flag to note this task has reached the + * // synchronisation point. The other two tasks will set the other two + * // bits defined by ALL_SYNC_BITS. All three tasks have reached the + * // synchronisation point when all the ALL_SYNC_BITS are set. Wait + * // indefinitely for this to happen. + * xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY ); + * + * // xEventGroupSync() was called with an indefinite block time, so + * // this task will only reach here if the synchronisation was made by all + * // three tasks, so there is no need to test the return value. + * } + * } + * + * void vTask2( void *pvParameters ) + * { + * for( ;; ) + * { + * // Perform task functionality here. + * + * // Set bit 2 in the event flag to note this task has reached the + * // synchronisation point. The other two tasks will set the other two + * // bits defined by ALL_SYNC_BITS. All three tasks have reached the + * // synchronisation point when all the ALL_SYNC_BITS are set. Wait + * // indefinitely for this to happen. + * xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY ); + * + * // xEventGroupSync() was called with an indefinite block time, so + * // this task will only reach here if the synchronisation was made by all + * // three tasks, so there is no need to test the return value. + * } + * } + * + * @endcode + * \defgroup xEventGroupSync xEventGroupSync + * \ingroup EventGroup + */ +EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup ); + * @endcode + * + * Returns the current value of the bits in an event group. This function + * cannot be used from an interrupt. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBits() was called. + * + * \defgroup xEventGroupGetBits xEventGroupGetBits + * \ingroup EventGroup + */ +#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( ( xEventGroup ), 0 ) + +/** + * event_groups.h + * @code{c} + * EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ); + * @endcode + * + * A version of xEventGroupGetBits() that can be called from an ISR. + * + * @param xEventGroup The event group being queried. + * + * @return The event group bits at the time xEventGroupGetBitsFromISR() was called. + * + * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR + * \ingroup EventGroup + */ +EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/** + * event_groups.h + * @code{c} + * void xEventGroupDelete( EventGroupHandle_t xEventGroup ); + * @endcode + * + * Delete an event group that was previously created by a call to + * xEventGroupCreate(). Tasks that are blocked on the event group will be + * unblocked and obtain 0 as the event group's value. + * + * @param xEventGroup The event group being deleted. + */ +void vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION; + +/* For internal use only. */ +void vEventGroupSetBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION; +void vEventGroupClearBitsCallback( void * pvEventGroup, + const uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; + + +#if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) PRIVILEGED_FUNCTION; + void vEventGroupSetNumber( void * xEventGroup, + UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION; +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* EVENT_GROUPS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/list.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/list.h new file mode 100644 index 0000000..35e4789 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/list.h @@ -0,0 +1,503 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * list_ts can only store pointers to list_item_ts. Each ListItem_t contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * ascending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + + +#ifndef LIST_H +#define LIST_H + +#ifndef INC_FREERTOS_H + #error "FreeRTOS.h must be included before list.h" +#endif + +/* + * The list structure members are modified from within interrupts, and therefore + * by rights should be declared volatile. However, they are only modified in a + * functionally atomic way (within critical sections of with the scheduler + * suspended) and are either passed by reference into a function or indexed via + * a volatile variable. Therefore, in all use cases tested so far, the volatile + * qualifier can be omitted in order to provide a moderate performance + * improvement without adversely affecting functional behaviour. The assembly + * instructions generated by the IAR, ARM and GCC compilers when the respective + * compiler's options were set for maximum optimisation has been inspected and + * deemed to be as intended. That said, as compiler technology advances, and + * especially if aggressive cross module optimisation is used (a use case that + * has not been exercised to any great extend) then it is feasible that the + * volatile qualifier will be needed for correct optimisation. It is expected + * that a compiler removing essential code because, without the volatile + * qualifier on the list structure members and with aggressive cross module + * optimisation, the compiler deemed the code unnecessary will result in + * complete and obvious failure of the scheduler. If this is ever experienced + * then the volatile qualifier can be inserted in the relevant places within the + * list structures by simply defining configLIST_VOLATILE to volatile in + * FreeRTOSConfig.h (as per the example at the bottom of this comment block). + * If configLIST_VOLATILE is not defined then the preprocessor directives below + * will simply #define configLIST_VOLATILE away completely. + * + * To use volatile list structure members then add the following line to + * FreeRTOSConfig.h (without the quotes): + * "#define configLIST_VOLATILE volatile" + */ +#ifndef configLIST_VOLATILE + #define configLIST_VOLATILE +#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* Macros that can be used to place known values within the list structures, + * then check that the known values do not get corrupted during the execution of + * the application. These may catch the list data structures being overwritten in + * memory. They will not catch data errors caused by incorrect configuration or + * use of FreeRTOS.*/ +#if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) + /* Define the macros to do nothing. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) + #define listTEST_LIST_INTEGRITY( pxList ) +#else /* if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) */ + /* Define macros that add new members into the list structures. */ + #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue1; + #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE TickType_t xListItemIntegrityValue2; + #define listFIRST_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue1; + #define listSECOND_LIST_INTEGRITY_CHECK_VALUE TickType_t xListIntegrityValue2; + +/* Define macros that set the new structure members to known values. */ + #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ) ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ) ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE + #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ) ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE + +/* Define macros that will assert if one of the structure members does not + * contain its expected value. */ + #define listTEST_LIST_ITEM_INTEGRITY( pxItem ) configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) + #define listTEST_LIST_INTEGRITY( pxList ) configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) ) +#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */ + + +/* + * Definition of the only type of object that a list can contain. + */ +struct xLIST; +struct xLIST_ITEM +{ + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; /*< The value being listed. In most cases this is used to sort the list in ascending order. */ + struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */ + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + struct xLIST * configLIST_VOLATILE pxContainer; /*< Pointer to the list in which this list item is placed (if any). */ + listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +}; +typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */ + +#if ( configUSE_MINI_LIST_ITEM == 1 ) + struct xMINI_LIST_ITEM + { + listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + configLIST_VOLATILE TickType_t xItemValue; + struct xLIST_ITEM * configLIST_VOLATILE pxNext; + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; + }; + typedef struct xMINI_LIST_ITEM MiniListItem_t; +#else + typedef struct xLIST_ITEM MiniListItem_t; +#endif + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + listFIRST_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + volatile UBaseType_t uxNumberOfItems; + ListItem_t * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */ + MiniListItem_t xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ + listSECOND_LIST_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ +} List_t; + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) + +/* + * Access macro to get the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( ( pxListItem )->pvOwner ) + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in ascending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) + +/* + * Access macro to retrieve the value of the list item. The value can + * represent anything - for example the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro to retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext->xItemValue ) + +/* + * Return the list item at the head of the list. + * + * \page listGET_HEAD_ENTRY listGET_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_HEAD_ENTRY( pxList ) ( ( ( pxList )->xListEnd ).pxNext ) + +/* + * Return the next list item. + * + * \page listGET_NEXT listGET_NEXT + * \ingroup LinkedList + */ +#define listGET_NEXT( pxListItem ) ( ( pxListItem )->pxNext ) + +/* + * Return the list item that marks the end of the list + * + * \page listGET_END_MARKER listGET_END_MARKER + * \ingroup LinkedList + */ +#define listGET_END_MARKER( pxList ) ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entry's pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxTCB pxTCB is set to the address of the owner of the next list item. + * @param pxList The list from which the next item owner is to be returned. + * + * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ + { \ + List_t * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ + } + +/* + * Version of uxListRemove() that does not return a value. Provided as a slight + * optimisation for xTaskIncrementTick() by being inline. + * + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page listREMOVE_ITEM listREMOVE_ITEM + * \ingroup LinkedList + */ +#define listREMOVE_ITEM( pxItemToRemove ) \ + { \ + /* The list item knows which list it is in. Obtain the list from the list \ + * item. */ \ + List_t * const pxList = ( pxItemToRemove )->pxContainer; \ + \ + ( pxItemToRemove )->pxNext->pxPrevious = ( pxItemToRemove )->pxPrevious; \ + ( pxItemToRemove )->pxPrevious->pxNext = ( pxItemToRemove )->pxNext; \ + /* Make sure the index is left pointing to a valid item. */ \ + if( pxList->pxIndex == ( pxItemToRemove ) ) \ + { \ + pxList->pxIndex = ( pxItemToRemove )->pxPrevious; \ + } \ + \ + ( pxItemToRemove )->pxContainer = NULL; \ + ( pxList->uxNumberOfItems )--; \ + } + +/* + * Inline version of vListInsertEnd() to provide slight optimisation for + * xTaskIncrementTick(). + * + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pxIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pxIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page listINSERT_END listINSERT_END + * \ingroup LinkedList + */ +#define listINSERT_END( pxList, pxNewListItem ) \ + { \ + ListItem_t * const pxIndex = ( pxList )->pxIndex; \ + \ + /* Only effective when configASSERT() is also defined, these tests may catch \ + * the list data structures being overwritten in memory. They will not catch \ + * data errors caused by incorrect configuration or use of FreeRTOS. */ \ + listTEST_LIST_INTEGRITY( ( pxList ) ); \ + listTEST_LIST_ITEM_INTEGRITY( ( pxNewListItem ) ); \ + \ + /* Insert a new list item into ( pxList ), but rather than sort the list, \ + * makes the new list item the last item to be removed by a call to \ + * listGET_OWNER_OF_NEXT_ENTRY(). */ \ + ( pxNewListItem )->pxNext = pxIndex; \ + ( pxNewListItem )->pxPrevious = pxIndex->pxPrevious; \ + \ + pxIndex->pxPrevious->pxNext = ( pxNewListItem ); \ + pxIndex->pxPrevious = ( pxNewListItem ); \ + \ + /* Remember which list the item is in. */ \ + ( pxNewListItem )->pxContainer = ( pxList ); \ + \ + ( ( pxList )->uxNumberOfItems )++; \ + } + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( ( &( ( pxList )->xListEnd ) )->pxNext->pvOwner ) + +/* + * Check to see if a list item is within a list. The list item maintains a + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @param pxListItem The list item we want to know if is in the list. + * @return pdTRUE if the list item is in the list, otherwise pdFALSE. + */ +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) ) + +/* + * Return the list a list item is contained within (referenced from). + * + * @param pxListItem The list item being queried. + * @return A pointer to the List_t object that references the pxListItem + */ +#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer ) + +/* + * This provides a crude means of knowing if a list has been initialised, as + * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() + * function. + */ +#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION; + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (ascending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( List_t * const pxList, + ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pxIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pxIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( List_t * const pxList, + ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION; + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page uxListRemove uxListRemove + * \ingroup LinkedList + */ +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION; + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* ifndef LIST_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/message_buffer.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/message_buffer.h new file mode 100644 index 0000000..bb8a7f7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/message_buffer.h @@ -0,0 +1,856 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* + * Message buffers build functionality on top of FreeRTOS stream buffers. + * Whereas stream buffers are used to send a continuous stream of data from one + * task or interrupt to another, message buffers are used to send variable + * length discrete messages from one task or interrupt to another. Their + * implementation is light weight, making them particularly suited for interrupt + * to task and core to core communication scenarios. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * timeout to 0. + * + * Message buffers hold variable length messages. To enable that, when a + * message is written to the message buffer an additional sizeof( size_t ) bytes + * are also written to store the message's length (that happens internally, with + * the API function). sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so writing a 10 byte message to a message buffer on a 32-bit + * architecture will actually reduce the available space in the message buffer + * by 14 bytes (10 byte are used by the message, and 4 bytes to hold the length + * of the message). + */ + +#ifndef FREERTOS_MESSAGE_BUFFER_H +#define FREERTOS_MESSAGE_BUFFER_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include message_buffer.h" +#endif + +/* Message buffers are built onto of stream buffers. */ +#include "stream_buffer.h" + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + extern "C" { +#endif +/* *INDENT-ON* */ + +/** + * Type by which message buffers are referenced. For example, a call to + * xMessageBufferCreate() returns an MessageBufferHandle_t variable that can + * then be used as a parameter to xMessageBufferSend(), xMessageBufferReceive(), + * etc. Message buffer is essentially built as a stream buffer hence its handle + * is also set to same type as a stream buffer handle. + */ +typedef StreamBufferHandle_t MessageBufferHandle_t; + +/*-----------------------------------------------------------*/ + +/** + * message_buffer.h + * + * @code{c} + * MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes ); + * @endcode + * + * Creates a new message buffer using dynamically allocated memory. See + * xMessageBufferCreateStatic() for a version that uses statically allocated + * memory (memory that is allocated at compile time). + * + * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in + * FreeRTOSConfig.h for xMessageBufferCreate() to be available. + * + * @param xBufferSizeBytes The total number of bytes (not messages) the message + * buffer will be able to hold at any one time. When a message is written to + * the message buffer an additional sizeof( size_t ) bytes are also written to + * store the message's length. sizeof( size_t ) is typically 4 bytes on a + * 32-bit architecture, so on most 32-bit architectures a 10 byte message will + * take up 14 bytes of message buffer space. + * + * @param pxSendCompletedCallback Callback invoked when a send operation to the + * message buffer is complete. If the parameter is NULL or xMessageBufferCreate() + * is called without the parameter, then it will use the default implementation + * provided by sbSEND_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @param pxReceiveCompletedCallback Callback invoked when a receive operation from + * the message buffer is complete. If the parameter is NULL or xMessageBufferCreate() + * is called without the parameter, it will use the default implementation provided + * by sbRECEIVE_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @return If NULL is returned, then the message buffer cannot be created + * because there is insufficient heap memory available for FreeRTOS to allocate + * the message buffer data structures and storage area. A non-NULL value being + * returned indicates that the message buffer has been created successfully - + * the returned value should be stored as the handle to the created message + * buffer. + * + * Example use: + * @code{c} + * + * void vAFunction( void ) + * { + * MessageBufferHandle_t xMessageBuffer; + * const size_t xMessageBufferSizeBytes = 100; + * + * // Create a message buffer that can hold 100 bytes. The memory used to hold + * // both the message buffer structure and the messages themselves is allocated + * // dynamically. Each message added to the buffer consumes an additional 4 + * // bytes which are used to hold the length of the message. + * xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes ); + * + * if( xMessageBuffer == NULL ) + * { + * // There was not enough heap memory space available to create the + * // message buffer. + * } + * else + * { + * // The message buffer was created successfully and can now be used. + * } + * + * @endcode + * \defgroup xMessageBufferCreate xMessageBufferCreate + * \ingroup MessageBufferManagement + */ +#define xMessageBufferCreate( xBufferSizeBytes ) \ + xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, NULL, NULL ) + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define xMessageBufferCreateWithCallback( xBufferSizeBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \ + xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) ) +#endif + +/** + * message_buffer.h + * + * @code{c} + * MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes, + * uint8_t *pucMessageBufferStorageArea, + * StaticMessageBuffer_t *pxStaticMessageBuffer ); + * @endcode + * Creates a new message buffer using statically allocated memory. See + * xMessageBufferCreate() for a version that uses dynamically allocated memory. + * + * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the + * pucMessageBufferStorageArea parameter. When a message is written to the + * message buffer an additional sizeof( size_t ) bytes are also written to store + * the message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so on most 32-bit architecture a 10 byte message will take up + * 14 bytes of message buffer space. The maximum number of bytes that can be + * stored in the message buffer is actually (xBufferSizeBytes - 1). + * + * @param pucMessageBufferStorageArea Must point to a uint8_t array that is at + * least xBufferSizeBytes big. This is the array to which messages are + * copied when they are written to the message buffer. + * + * @param pxStaticMessageBuffer Must point to a variable of type + * StaticMessageBuffer_t, which will be used to hold the message buffer's data + * structure. + * + * @param pxSendCompletedCallback Callback invoked when a new message is sent to the message buffer. + * If the parameter is NULL or xMessageBufferCreate() is called without the parameter, then it will use the default + * implementation provided by sbSEND_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @param pxReceiveCompletedCallback Callback invoked when a message is read from a + * message buffer. If the parameter is NULL or xMessageBufferCreate() is called without the parameter, it will + * use the default implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @return If the message buffer is created successfully then a handle to the + * created message buffer is returned. If either pucMessageBufferStorageArea or + * pxStaticmessageBuffer are NULL then NULL is returned. + * + * Example use: + * @code{c} + * + * // Used to dimension the array used to hold the messages. The available space + * // will actually be one less than this, so 999. + #define STORAGE_SIZE_BYTES 1000 + * + * // Defines the memory that will actually hold the messages within the message + * // buffer. + * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; + * + * // The variable used to hold the message buffer structure. + * StaticMessageBuffer_t xMessageBufferStruct; + * + * void MyFunction( void ) + * { + * MessageBufferHandle_t xMessageBuffer; + * + * xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucStorageBuffer ), + * ucStorageBuffer, + * &xMessageBufferStruct ); + * + * // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer + * // parameters were NULL, xMessageBuffer will not be NULL, and can be used to + * // reference the created message buffer in other message buffer API calls. + * + * // Other code that uses the message buffer can go here. + * } + * + * @endcode + * \defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic + * \ingroup MessageBufferManagement + */ +#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) \ + xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), NULL, NULL ) + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define xMessageBufferCreateStaticWithCallback( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \ + xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) ) +#endif + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Sends a discrete message to the message buffer. The message can be any + * length that fits within the buffer's free space, and is copied into the + * buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferSend() to write to a message buffer from a task. Use + * xMessageBufferSendFromISR() to write to a message buffer from an interrupt + * service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer to which a message is + * being sent. + * + * @param pvTxData A pointer to the message that is to be copied into the + * message buffer. + * + * @param xDataLengthBytes The length of the message. That is, the number of + * bytes to copy from pvTxData into the message buffer. When a message is + * written to the message buffer an additional sizeof( size_t ) bytes are also + * written to store the message's length. sizeof( size_t ) is typically 4 bytes + * on a 32-bit architecture, so on most 32-bit architecture setting + * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24 + * bytes (20 bytes of message data and 4 bytes to hold the message length). + * + * @param xTicksToWait The maximum amount of time the calling task should remain + * in the Blocked state to wait for enough space to become available in the + * message buffer, should the message buffer have insufficient space when + * xMessageBufferSend() is called. The calling task will never block if + * xTicksToWait is zero. The block time is specified in tick periods, so the + * absolute time it represents is dependent on the tick frequency. The macro + * pdMS_TO_TICKS() can be used to convert a time specified in milliseconds into + * a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will cause + * the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. Tasks do not use any + * CPU time when they are in the Blocked state. + * + * @return The number of bytes written to the message buffer. If the call to + * xMessageBufferSend() times out before there was enough space to write the + * message into the message buffer then zero is returned. If the call did not + * time out then xDataLengthBytes is returned. + * + * Example use: + * @code{c} + * void vAFunction( MessageBufferHandle_t xMessageBuffer ) + * { + * size_t xBytesSent; + * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; + * char *pcStringToSend = "String to send"; + * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); + * + * // Send an array to the message buffer, blocking for a maximum of 100ms to + * // wait for enough space to be available in the message buffer. + * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); + * + * if( xBytesSent != sizeof( ucArrayToSend ) ) + * { + * // The call to xMessageBufferSend() times out before there was enough + * // space in the buffer for the data to be written. + * } + * + * // Send the string to the message buffer. Return immediately if there is + * // not enough space in the buffer. + * xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The string could not be added to the message buffer because there was + * // not enough free space in the buffer. + * } + * } + * @endcode + * \defgroup xMessageBufferSend xMessageBufferSend + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) \ + xStreamBufferSend( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( xTicksToWait ) ) + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * Interrupt safe version of the API function that sends a discrete message to + * the message buffer. The message can be any length that fits within the + * buffer's free space, and is copied into the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferSend() to write to a message buffer from a task. Use + * xMessageBufferSendFromISR() to write to a message buffer from an interrupt + * service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer to which a message is + * being sent. + * + * @param pvTxData A pointer to the message that is to be copied into the + * message buffer. + * + * @param xDataLengthBytes The length of the message. That is, the number of + * bytes to copy from pvTxData into the message buffer. When a message is + * written to the message buffer an additional sizeof( size_t ) bytes are also + * written to store the message's length. sizeof( size_t ) is typically 4 bytes + * on a 32-bit architecture, so on most 32-bit architecture setting + * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24 + * bytes (20 bytes of message data and 4 bytes to hold the message length). + * + * @param pxHigherPriorityTaskWoken It is possible that a message buffer will + * have a task blocked on it waiting for data. Calling + * xMessageBufferSendFromISR() can make data available, and so cause a task that + * was waiting for data to leave the Blocked state. If calling + * xMessageBufferSendFromISR() causes a task to leave the Blocked state, and the + * unblocked task has a priority higher than the currently executing task (the + * task that was interrupted), then, internally, xMessageBufferSendFromISR() + * will set *pxHigherPriorityTaskWoken to pdTRUE. If + * xMessageBufferSendFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. This will + * ensure that the interrupt returns directly to the highest priority Ready + * state task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it + * is passed into the function. See the code example below for an example. + * + * @return The number of bytes actually written to the message buffer. If the + * message buffer didn't have enough free space for the message to be stored + * then 0 is returned, otherwise xDataLengthBytes is returned. + * + * Example use: + * @code{c} + * // A message buffer that has already been created. + * MessageBufferHandle_t xMessageBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * size_t xBytesSent; + * char *pcStringToSend = "String to send"; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Attempt to send the string to the message buffer. + * xBytesSent = xMessageBufferSendFromISR( xMessageBuffer, + * ( void * ) pcStringToSend, + * strlen( pcStringToSend ), + * &xHigherPriorityTaskWoken ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The string could not be added to the message buffer because there was + * // not enough free space in the buffer. + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xMessageBufferSendFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) \ + xStreamBufferSendFromISR( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( pxHigherPriorityTaskWoken ) ) + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Receives a discrete message from a message buffer. Messages can be of + * variable length and are copied out of the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferReceive() to read from a message buffer from a task. Use + * xMessageBufferReceiveFromISR() to read from a message buffer from an + * interrupt service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer from which a message + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received message is + * to be copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData + * parameter. This sets the maximum length of the message that can be received. + * If xBufferLengthBytes is too small to hold the next message then the message + * will be left in the message buffer and 0 will be returned. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for a message, should the message buffer be empty. + * xMessageBufferReceive() will return immediately if xTicksToWait is zero and + * the message buffer is empty. The block time is specified in tick periods, so + * the absolute time it represents is dependent on the tick frequency. The + * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds + * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will + * cause the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. Tasks do not use any + * CPU time when they are in the Blocked state. + * + * @return The length, in bytes, of the message read from the message buffer, if + * any. If xMessageBufferReceive() times out before a message became available + * then zero is returned. If the length of the message is greater than + * xBufferLengthBytes then the message will be left in the message buffer and + * zero is returned. + * + * Example use: + * @code{c} + * void vAFunction( MessageBuffer_t xMessageBuffer ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); + * + * // Receive the next message from the message buffer. Wait in the Blocked + * // state (so not using any CPU processing time) for a maximum of 100ms for + * // a message to become available. + * xReceivedBytes = xMessageBufferReceive( xMessageBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * xBlockTime ); + * + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains a message that is xReceivedBytes long. Process + * // the message here.... + * } + * } + * @endcode + * \defgroup xMessageBufferReceive xMessageBufferReceive + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) \ + xStreamBufferReceive( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( xTicksToWait ) ) + + +/** + * message_buffer.h + * + * @code{c} + * size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * An interrupt safe version of the API function that receives a discrete + * message from a message buffer. Messages can be of variable length and are + * copied out of the buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xMessageBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xMessageBufferRead()) inside a critical section and set the receive + * block time to 0. + * + * Use xMessageBufferReceive() to read from a message buffer from a task. Use + * xMessageBufferReceiveFromISR() to read from a message buffer from an + * interrupt service routine (ISR). + * + * @param xMessageBuffer The handle of the message buffer from which a message + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received message is + * to be copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData + * parameter. This sets the maximum length of the message that can be received. + * If xBufferLengthBytes is too small to hold the next message then the message + * will be left in the message buffer and 0 will be returned. + * + * @param pxHigherPriorityTaskWoken It is possible that a message buffer will + * have a task blocked on it waiting for space to become available. Calling + * xMessageBufferReceiveFromISR() can make space available, and so cause a task + * that is waiting for space to leave the Blocked state. If calling + * xMessageBufferReceiveFromISR() causes a task to leave the Blocked state, and + * the unblocked task has a priority higher than the currently executing task + * (the task that was interrupted), then, internally, + * xMessageBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. + * If xMessageBufferReceiveFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. That will + * ensure the interrupt returns directly to the highest priority Ready state + * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is + * passed into the function. See the code example below for an example. + * + * @return The length, in bytes, of the message read from the message buffer, if + * any. + * + * Example use: + * @code{c} + * // A message buffer that has already been created. + * MessageBuffer_t xMessageBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Receive the next message from the message buffer. + * xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * &xHigherPriorityTaskWoken ); + * + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains a message that is xReceivedBytes long. Process + * // the message here.... + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xMessageBufferReceiveFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) \ + xStreamBufferReceiveFromISR( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( pxHigherPriorityTaskWoken ) ) + +/** + * message_buffer.h + * + * @code{c} + * void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Deletes a message buffer that was previously created using a call to + * xMessageBufferCreate() or xMessageBufferCreateStatic(). If the message + * buffer was created using dynamic memory (that is, by xMessageBufferCreate()), + * then the allocated memory is freed. + * + * A message buffer handle must not be used after the message buffer has been + * deleted. + * + * @param xMessageBuffer The handle of the message buffer to be deleted. + * + */ +#define vMessageBufferDelete( xMessageBuffer ) \ + vStreamBufferDelete( xMessageBuffer ) + +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Tests to see if a message buffer is full. A message buffer is full if it + * cannot accept any more messages, of any size, until space is made available + * by a message being removed from the message buffer. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return If the message buffer referenced by xMessageBuffer is full then + * pdTRUE is returned. Otherwise pdFALSE is returned. + */ +#define xMessageBufferIsFull( xMessageBuffer ) \ + xStreamBufferIsFull( xMessageBuffer ) + +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Tests to see if a message buffer is empty (does not contain any messages). + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return If the message buffer referenced by xMessageBuffer is empty then + * pdTRUE is returned. Otherwise pdFALSE is returned. + * + */ +#define xMessageBufferIsEmpty( xMessageBuffer ) \ + xStreamBufferIsEmpty( xMessageBuffer ) + +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * Resets a message buffer to its initial empty state, discarding any message it + * contained. + * + * A message buffer can only be reset if there are no tasks blocked on it. + * + * @param xMessageBuffer The handle of the message buffer being reset. + * + * @return If the message buffer was reset then pdPASS is returned. If the + * message buffer could not be reset because either there was a task blocked on + * the message queue to wait for space to become available, or to wait for a + * a message to be available, then pdFAIL is returned. + * + * \defgroup xMessageBufferReset xMessageBufferReset + * \ingroup MessageBufferManagement + */ +#define xMessageBufferReset( xMessageBuffer ) \ + xStreamBufferReset( xMessageBuffer ) + + +/** + * message_buffer.h + * @code{c} + * size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * Returns the number of bytes of free space in the message buffer. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return The number of bytes that can be written to the message buffer before + * the message buffer would be full. When a message is written to the message + * buffer an additional sizeof( size_t ) bytes are also written to store the + * message's length. sizeof( size_t ) is typically 4 bytes on a 32-bit + * architecture, so if xMessageBufferSpacesAvailable() returns 10, then the size + * of the largest message that can be written to the message buffer is 6 bytes. + * + * \defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable + * \ingroup MessageBufferManagement + */ +#define xMessageBufferSpaceAvailable( xMessageBuffer ) \ + xStreamBufferSpacesAvailable( xMessageBuffer ) +#define xMessageBufferSpacesAvailable( xMessageBuffer ) \ + xStreamBufferSpacesAvailable( xMessageBuffer ) /* Corrects typo in original macro name. */ + +/** + * message_buffer.h + * @code{c} + * size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * Returns the length (in bytes) of the next message in a message buffer. + * Useful if xMessageBufferReceive() returned 0 because the size of the buffer + * passed into xMessageBufferReceive() was too small to hold the next message. + * + * @param xMessageBuffer The handle of the message buffer being queried. + * + * @return The length (in bytes) of the next message in the message buffer, or 0 + * if the message buffer is empty. + * + * \defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes + * \ingroup MessageBufferManagement + */ +#define xMessageBufferNextLengthBytes( xMessageBuffer ) \ + xStreamBufferNextMessageLengthBytes( xMessageBuffer ) PRIVILEGED_FUNCTION; + +/** + * message_buffer.h + * + * @code{c} + * BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is sent to a message buffer or stream buffer. If there was a task that + * was blocked on the message or stream buffer waiting for data to arrive then + * the sbSEND_COMPLETED() macro sends a notification to the task to remove it + * from the Blocked state. xMessageBufferSendCompletedFromISR() does the same + * thing. It is provided to enable application writers to implement their own + * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xMessageBuffer The handle of the stream buffer to which data was + * written. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xMessageBufferSendCompletedFromISR(). If calling + * xMessageBufferSendCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR + * \ingroup StreamBufferManagement + */ +#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \ + xStreamBufferSendCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) ) + +/** + * message_buffer.h + * + * @code{c} + * BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is read out of a message buffer or stream buffer. If there was a task + * that was blocked on the message or stream buffer waiting for data to arrive + * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to + * remove it from the Blocked state. xMessageBufferReceiveCompletedFromISR() + * does the same thing. It is provided to enable application writers to + * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT + * ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xMessageBuffer The handle of the stream buffer from which data was + * read. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xMessageBufferReceiveCompletedFromISR(). If calling + * xMessageBufferReceiveCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR + * \ingroup StreamBufferManagement + */ +#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \ + xStreamBufferReceiveCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) ) + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + } /* extern "C" */ +#endif +/* *INDENT-ON* */ + +#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_prototypes.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_prototypes.h new file mode 100644 index 0000000..933794c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_prototypes.h @@ -0,0 +1,264 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * When the MPU is used the standard (non MPU) API functions are mapped to + * equivalents that start "MPU_", the prototypes for which are defined in this + * header files. This will cause the application code to call the MPU_ version + * which wraps the non-MPU version with privilege promoting then demoting code, + * so the kernel code always runs will full privileges. + */ + + +#ifndef MPU_PROTOTYPES_H +#define MPU_PROTOTYPES_H + +/* MPU versions of task.h API functions. */ +BaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint16_t usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskStartScheduler( void ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSuspendAll( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskResumeAll( void ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTaskGetTickCount( void ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) FREERTOS_SYSTEM_CALL; +char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL; +TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) FREERTOS_SYSTEM_CALL; +void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL; +configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL; +configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskList( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskGetRunTimeStats( char * pcWriteBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) FREERTOS_SYSTEM_CALL; +uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskIncrementTick( void ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL; +void MPU_vTaskMissedYield( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of queue.h API functions. */ +BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueDelete( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcName ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; +QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) FREERTOS_SYSTEM_CALL; +QueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL; +QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) FREERTOS_SYSTEM_CALL; +void MPU_vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; +uint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of timers.h API functions. */ +TimerHandle_t MPU_xTimerCreate( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) FREERTOS_SYSTEM_CALL; +TimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName, + const TickType_t xTimerPeriodInTicks, + const UBaseType_t uxAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) FREERTOS_SYSTEM_CALL; +void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +void MPU_vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, + const UBaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerCreateTimerTask( void ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of event_group.h API functions. */ +EventGroupHandle_t MPU_xEventGroupCreate( void ) FREERTOS_SYSTEM_CALL; +EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL; +EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) FREERTOS_SYSTEM_CALL; +UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) FREERTOS_SYSTEM_CALL; + +/* MPU versions of message/stream_buffer.h API functions. */ +size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL; +BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL; +StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) FREERTOS_SYSTEM_CALL; +StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) FREERTOS_SYSTEM_CALL; + + + +#endif /* MPU_PROTOTYPES_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_wrappers.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_wrappers.h new file mode 100644 index 0000000..af06ab3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_wrappers.h @@ -0,0 +1,184 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef MPU_WRAPPERS_H +#define MPU_WRAPPERS_H + +/* This file redefines API functions to be called through a wrapper macro, but + * only for ports that are using the MPU. */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + * included from queue.c or task.c to prevent it from having an effect within + * those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* + * Map standard (non MPU) API functions to equivalents that start + * "MPU_". This will cause the application code to call the MPU_ + * version, which wraps the non-MPU version with privilege promoting + * then demoting code, so the kernel code always runs will full + * privileges. + */ + +/* Map standard task.h API functions to the MPU equivalents. */ + #define xTaskCreate MPU_xTaskCreate + #define xTaskCreateStatic MPU_xTaskCreateStatic + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelay MPU_vTaskDelay + #define xTaskDelayUntil MPU_xTaskDelayUntil + #define xTaskAbortDelay MPU_xTaskAbortDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define eTaskGetState MPU_eTaskGetState + #define vTaskGetInfo MPU_vTaskGetInfo + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define vTaskSuspend MPU_vTaskSuspend + #define vTaskResume MPU_vTaskResume + #define vTaskSuspendAll MPU_vTaskSuspendAll + #define xTaskResumeAll MPU_xTaskResumeAll + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define pcTaskGetName MPU_pcTaskGetName + #define xTaskGetHandle MPU_xTaskGetHandle + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define uxTaskGetStackHighWaterMark2 MPU_uxTaskGetStackHighWaterMark2 + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define vTaskSetThreadLocalStoragePointer MPU_vTaskSetThreadLocalStoragePointer + #define pvTaskGetThreadLocalStoragePointer MPU_pvTaskGetThreadLocalStoragePointer + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + #define vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define ulTaskGetIdleRunTimeCounter MPU_ulTaskGetIdleRunTimeCounter + #define ulTaskGetIdleRunTimePercent MPU_ulTaskGetIdleRunTimePercent + #define xTaskGenericNotify MPU_xTaskGenericNotify + #define xTaskGenericNotifyWait MPU_xTaskGenericNotifyWait + #define ulTaskGenericNotifyTake MPU_ulTaskGenericNotifyTake + #define xTaskGenericNotifyStateClear MPU_xTaskGenericNotifyStateClear + #define ulTaskGenericNotifyValueClear MPU_ulTaskGenericNotifyValueClear + #define xTaskCatchUpTicks MPU_xTaskCatchUpTicks + + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define vTaskSetTimeOutState MPU_vTaskSetTimeOutState + #define xTaskCheckForTimeOut MPU_xTaskCheckForTimeOut + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + +/* Map standard queue.h API functions to the MPU equivalents. */ + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueReceive MPU_xQueueReceive + #define xQueuePeek MPU_xQueuePeek + #define xQueueSemaphoreTake MPU_xQueueSemaphoreTake + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define uxQueueSpacesAvailable MPU_uxQueueSpacesAvailable + #define vQueueDelete MPU_vQueueDelete + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueCreateMutexStatic MPU_xQueueCreateMutexStatic + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueCreateCountingSemaphoreStatic MPU_xQueueCreateCountingSemaphoreStatic + #define xQueueGetMutexHolder MPU_xQueueGetMutexHolder + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueGenericCreate MPU_xQueueGenericCreate + #define xQueueGenericCreateStatic MPU_xQueueGenericCreateStatic + #define xQueueCreateSet MPU_xQueueCreateSet + #define xQueueAddToSet MPU_xQueueAddToSet + #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + #define xQueueSelectFromSet MPU_xQueueSelectFromSet + #define xQueueGenericReset MPU_xQueueGenericReset + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #define pcQueueGetName MPU_pcQueueGetName + #endif + +/* Map standard timer.h API functions to the MPU equivalents. */ + #define pvTimerGetTimerID MPU_pvTimerGetTimerID + #define vTimerSetTimerID MPU_vTimerSetTimerID + #define xTimerIsTimerActive MPU_xTimerIsTimerActive + #define xTimerGetTimerDaemonTaskHandle MPU_xTimerGetTimerDaemonTaskHandle + #define pcTimerGetName MPU_pcTimerGetName + #define vTimerSetReloadMode MPU_vTimerSetReloadMode + #define uxTimerGetReloadMode MPU_uxTimerGetReloadMode + #define xTimerGetPeriod MPU_xTimerGetPeriod + #define xTimerGetExpiryTime MPU_xTimerGetExpiryTime + #define xTimerGenericCommand MPU_xTimerGenericCommand + +/* Map standard event_group.h API functions to the MPU equivalents. */ + #define xEventGroupCreate MPU_xEventGroupCreate + #define xEventGroupCreateStatic MPU_xEventGroupCreateStatic + #define xEventGroupWaitBits MPU_xEventGroupWaitBits + #define xEventGroupClearBits MPU_xEventGroupClearBits + #define xEventGroupSetBits MPU_xEventGroupSetBits + #define xEventGroupSync MPU_xEventGroupSync + #define vEventGroupDelete MPU_vEventGroupDelete + +/* Map standard message/stream_buffer.h API functions to the MPU + * equivalents. */ + #define xStreamBufferSend MPU_xStreamBufferSend + #define xStreamBufferReceive MPU_xStreamBufferReceive + #define xStreamBufferNextMessageLengthBytes MPU_xStreamBufferNextMessageLengthBytes + #define vStreamBufferDelete MPU_vStreamBufferDelete + #define xStreamBufferIsFull MPU_xStreamBufferIsFull + #define xStreamBufferIsEmpty MPU_xStreamBufferIsEmpty + #define xStreamBufferReset MPU_xStreamBufferReset + #define xStreamBufferSpacesAvailable MPU_xStreamBufferSpacesAvailable + #define xStreamBufferBytesAvailable MPU_xStreamBufferBytesAvailable + #define xStreamBufferSetTriggerLevel MPU_xStreamBufferSetTriggerLevel + #define xStreamBufferGenericCreate MPU_xStreamBufferGenericCreate + #define xStreamBufferGenericCreateStatic MPU_xStreamBufferGenericCreateStatic + + +/* Remove the privileged function macro, but keep the PRIVILEGED_DATA + * macro so applications can place data in privileged access sections + * (useful when using statically allocated objects). */ + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) ) + #define FREERTOS_SYSTEM_CALL + + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +/* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__( ( section( "privileged_functions" ) ) ) + #define PRIVILEGED_DATA __attribute__( ( section( "privileged_data" ) ) ) + #define FREERTOS_SYSTEM_CALL __attribute__( ( section( "freertos_system_calls" ) ) ) + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define FREERTOS_SYSTEM_CALL + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/portable.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/portable.h new file mode 100644 index 0000000..e7ec7bd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/portable.h @@ -0,0 +1,238 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Portable layer API. Each function must be defined for each port. +*----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#define PORTABLE_H + +/* Each FreeRTOS port has a unique portmacro.h header file. Originally a + * pre-processor definition was used to ensure the pre-processor found the correct + * portmacro.h file for the port being used. That scheme was deprecated in favour + * of setting the compiler's include path such that it found the correct + * portmacro.h file - removing the need for the constant and allowing the + * portmacro.h file to be located anywhere in relation to the port being used. + * Purely for reasons of backward compatibility the old method is still valid, but + * to make it clear that new projects should not use it, support for the port + * specific constants has been moved into the deprecated_definitions.h header + * file. */ +#include "deprecated_definitions.h" + +/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h + * did not result in a portmacro.h header file being included - and it should be + * included here. In this case the path to the correct portmacro.h header file + * must be set in the compiler's include path. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 32 + #define portBYTE_ALIGNMENT_MASK ( 0x001f ) +#elif portBYTE_ALIGNMENT == 16 + #define portBYTE_ALIGNMENT_MASK ( 0x000f ) +#elif portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) +#elif portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#elif portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#elif portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#else /* if portBYTE_ALIGNMENT == 32 */ + #error "Invalid portBYTE_ALIGNMENT definition" +#endif /* if portBYTE_ALIGNMENT == 32 */ + +#ifndef portUSING_MPU_WRAPPERS + #define portUSING_MPU_WRAPPERS 0 +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifndef portHAS_STACK_OVERFLOW_CHECKING + #define portHAS_STACK_OVERFLOW_CHECKING 0 +#endif + +#ifndef portARCH_NAME + #define portARCH_NAME NULL +#endif + +#ifndef configSTACK_ALLOCATION_FROM_SEPARATE_HEAP + /* Defaults to 0 for backward compatibility. */ + #define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0 +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +#include "mpu_wrappers.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; + #else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) PRIVILEGED_FUNCTION; + #endif +#else /* if ( portUSING_MPU_WRAPPERS == 1 ) */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) PRIVILEGED_FUNCTION; + #else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) PRIVILEGED_FUNCTION; + #endif +#endif /* if ( portUSING_MPU_WRAPPERS == 1 ) */ + +/* Used by heap_5.c to define the start address and size of each memory region + * that together comprise the total FreeRTOS heap space. */ +typedef struct HeapRegion +{ + uint8_t * pucStartAddress; + size_t xSizeInBytes; +} HeapRegion_t; + +/* Used to pass information about the heap out of vPortGetHeapStats(). */ +typedef struct xHeapStats +{ + size_t xAvailableHeapSpaceInBytes; /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */ + size_t xSizeOfLargestFreeBlockInBytes; /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xNumberOfFreeBlocks; /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */ + size_t xMinimumEverFreeBytesRemaining; /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */ + size_t xNumberOfSuccessfulAllocations; /* The number of calls to pvPortMalloc() that have returned a valid memory block. */ + size_t xNumberOfSuccessfulFrees; /* The number of calls to vPortFree() that has successfully freed a block of memory. */ +} HeapStats_t; + +/* + * Used to define multiple heap regions for use by heap_5.c. This function + * must be called before any calls to pvPortMalloc() - not creating a task, + * queue, semaphore, mutex, software timer, event group, etc. will result in + * pvPortMalloc being called. + * + * pxHeapRegions passes in an array of HeapRegion_t structures - each of which + * defines a region of memory that can be used as the heap. The array is + * terminated by a HeapRegions_t structure that has a size of 0. The region + * with the lowest start address must appear first in the array. + */ +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION; + +/* + * Returns a HeapStats_t structure filled with information about the current + * heap state. + */ +void vPortGetHeapStats( HeapStats_t * pxHeapStats ); + +/* + * Map to the memory management routines required for the port. + */ +void * pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void * pvPortCalloc( size_t xNum, + size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void * pv ) PRIVILEGED_FUNCTION; +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; +size_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION; + +#if ( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 ) + void * pvPortMallocStack( size_t xSize ) PRIVILEGED_FUNCTION; + void vPortFreeStack( void * pv ) PRIVILEGED_FUNCTION; +#else + #define pvPortMallocStack pvPortMalloc + #define vPortFreeStack vPortFree +#endif + +#if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + +/** + * task.h + * @code{c} + * void vApplicationMallocFailedHook( void ) + * @endcode + * + * This hook function is called when allocation failed. + */ + void vApplicationMallocFailedHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */ +#endif + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +BaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) PRIVILEGED_FUNCTION; +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTABLE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/projdefs.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/projdefs.h new file mode 100644 index 0000000..aa49e59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/projdefs.h @@ -0,0 +1,122 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PROJDEFS_H +#define PROJDEFS_H + +/* + * Defines the prototype to which task functions must conform. Defined in this + * file to ensure the type is known before portable.h is included. + */ +typedef void (* TaskFunction_t)( void * ); + +/* Converts a time in milliseconds to a time in ticks. This macro can be + * overridden by a macro of the same name defined in FreeRTOSConfig.h in case the + * definition here is not suitable for your application. */ +#ifndef pdMS_TO_TICKS + #define pdMS_TO_TICKS( xTimeInMs ) ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000U ) ) +#endif + +#define pdFALSE ( ( BaseType_t ) 0 ) +#define pdTRUE ( ( BaseType_t ) 1 ) + +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) +#define errQUEUE_EMPTY ( ( BaseType_t ) 0 ) +#define errQUEUE_FULL ( ( BaseType_t ) 0 ) + +/* FreeRTOS error definitions. */ +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) + +/* Macros used for basic data corruption checks. */ +#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES + #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES 0 +#endif + +#if ( configUSE_16_BIT_TICKS == 1 ) + #define pdINTEGRITY_CHECK_VALUE 0x5a5a +#else + #define pdINTEGRITY_CHECK_VALUE 0x5a5a5a5aUL +#endif + +/* The following errno values are used by FreeRTOS+ components, not FreeRTOS + * itself. */ +#define pdFREERTOS_ERRNO_NONE 0 /* No errors */ +#define pdFREERTOS_ERRNO_ENOENT 2 /* No such file or directory */ +#define pdFREERTOS_ERRNO_EINTR 4 /* Interrupted system call */ +#define pdFREERTOS_ERRNO_EIO 5 /* I/O error */ +#define pdFREERTOS_ERRNO_ENXIO 6 /* No such device or address */ +#define pdFREERTOS_ERRNO_EBADF 9 /* Bad file number */ +#define pdFREERTOS_ERRNO_EAGAIN 11 /* No more processes */ +#define pdFREERTOS_ERRNO_EWOULDBLOCK 11 /* Operation would block */ +#define pdFREERTOS_ERRNO_ENOMEM 12 /* Not enough memory */ +#define pdFREERTOS_ERRNO_EACCES 13 /* Permission denied */ +#define pdFREERTOS_ERRNO_EFAULT 14 /* Bad address */ +#define pdFREERTOS_ERRNO_EBUSY 16 /* Mount device busy */ +#define pdFREERTOS_ERRNO_EEXIST 17 /* File exists */ +#define pdFREERTOS_ERRNO_EXDEV 18 /* Cross-device link */ +#define pdFREERTOS_ERRNO_ENODEV 19 /* No such device */ +#define pdFREERTOS_ERRNO_ENOTDIR 20 /* Not a directory */ +#define pdFREERTOS_ERRNO_EISDIR 21 /* Is a directory */ +#define pdFREERTOS_ERRNO_EINVAL 22 /* Invalid argument */ +#define pdFREERTOS_ERRNO_ENOSPC 28 /* No space left on device */ +#define pdFREERTOS_ERRNO_ESPIPE 29 /* Illegal seek */ +#define pdFREERTOS_ERRNO_EROFS 30 /* Read only file system */ +#define pdFREERTOS_ERRNO_EUNATCH 42 /* Protocol driver not attached */ +#define pdFREERTOS_ERRNO_EBADE 50 /* Invalid exchange */ +#define pdFREERTOS_ERRNO_EFTYPE 79 /* Inappropriate file type or format */ +#define pdFREERTOS_ERRNO_ENMFILE 89 /* No more files */ +#define pdFREERTOS_ERRNO_ENOTEMPTY 90 /* Directory not empty */ +#define pdFREERTOS_ERRNO_ENAMETOOLONG 91 /* File or path name too long */ +#define pdFREERTOS_ERRNO_EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define pdFREERTOS_ERRNO_ENOBUFS 105 /* No buffer space available */ +#define pdFREERTOS_ERRNO_ENOPROTOOPT 109 /* Protocol not available */ +#define pdFREERTOS_ERRNO_EADDRINUSE 112 /* Address already in use */ +#define pdFREERTOS_ERRNO_ETIMEDOUT 116 /* Connection timed out */ +#define pdFREERTOS_ERRNO_EINPROGRESS 119 /* Connection already in progress */ +#define pdFREERTOS_ERRNO_EALREADY 120 /* Socket already connected */ +#define pdFREERTOS_ERRNO_EADDRNOTAVAIL 125 /* Address not available */ +#define pdFREERTOS_ERRNO_EISCONN 127 /* Socket is already connected */ +#define pdFREERTOS_ERRNO_ENOTCONN 128 /* Socket is not connected */ +#define pdFREERTOS_ERRNO_ENOMEDIUM 135 /* No medium inserted */ +#define pdFREERTOS_ERRNO_EILSEQ 138 /* An invalid UTF-16 sequence was encountered. */ +#define pdFREERTOS_ERRNO_ECANCELED 140 /* Operation canceled. */ + +/* The following endian values are used by FreeRTOS+ components, not FreeRTOS + * itself. */ +#define pdFREERTOS_LITTLE_ENDIAN 0 +#define pdFREERTOS_BIG_ENDIAN 1 + +/* Re-defining endian values for generic naming. */ +#define pdLITTLE_ENDIAN pdFREERTOS_LITTLE_ENDIAN +#define pdBIG_ENDIAN pdFREERTOS_BIG_ENDIAN + + +#endif /* PROJDEFS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/queue.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/queue.h new file mode 100644 index 0000000..df572e1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/queue.h @@ -0,0 +1,1722 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include queue.h" +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +#include "task.h" + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate() + * returns an QueueHandle_t variable that can then be used as a parameter to + * xQueueSend(), xQueueReceive(), etc. + */ +struct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */ +typedef struct QueueDefinition * QueueHandle_t; + +/** + * Type by which queue sets are referenced. For example, a call to + * xQueueCreateSet() returns an xQueueSet variable that can then be used as a + * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. + */ +typedef struct QueueDefinition * QueueSetHandle_t; + +/** + * Queue sets can contain both queues and semaphores, so the + * QueueSetMemberHandle_t is defined as a type to be used where a parameter or + * return value can be either an QueueHandle_t or an SemaphoreHandle_t. + */ +typedef struct QueueDefinition * QueueSetMemberHandle_t; + +/* For internal use only. */ +#define queueSEND_TO_BACK ( ( BaseType_t ) 0 ) +#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 ) +#define queueOVERWRITE ( ( BaseType_t ) 2 ) + +/* For internal use only. These definitions *must* match those in queue.c. */ +#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U ) +#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U ) +#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U ) +#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) +#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U ) + +/** + * queue. h + * @code{c} + * QueueHandle_t xQueueCreate( + * UBaseType_t uxQueueLength, + * UBaseType_t uxItemSize + * ); + * @endcode + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * }; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * if( xQueue1 == 0 ) + * { + * // Queue was not created and must not be used. + * } + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue2 == 0 ) + * { + * // Queue was not created and must not be used. + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueCreate xQueueCreate + * \ingroup QueueManagement + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) ) +#endif + +/** + * queue. h + * @code{c} + * QueueHandle_t xQueueCreateStatic( + * UBaseType_t uxQueueLength, + * UBaseType_t uxItemSize, + * uint8_t *pucQueueStorage, + * StaticQueue_t *pxQueueBuffer + * ); + * @endcode + * + * Creates a new queue instance, and returns a handle by which the new queue + * can be referenced. + * + * Internally, within the FreeRTOS implementation, queues use two blocks of + * memory. The first block is used to hold the queue's data structures. The + * second block is used to hold items placed into the queue. If a queue is + * created using xQueueCreate() then both blocks of memory are automatically + * dynamically allocated inside the xQueueCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a queue is created using + * xQueueCreateStatic() then the application writer must provide the memory that + * will get used by the queue. xQueueCreateStatic() therefore allows a queue to + * be created without using any dynamic memory allocation. + * + * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @param pucQueueStorage If uxItemSize is not zero then + * pucQueueStorage must point to a uint8_t array that is at least large + * enough to hold the maximum number of items that can be in the queue at any + * one time - which is ( uxQueueLength * uxItemsSize ) bytes. If uxItemSize is + * zero then pucQueueStorage can be NULL. + * + * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which + * will be used to hold the queue's data structure. + * + * @return If the queue is created then a handle to the created queue is + * returned. If pxQueueBuffer is NULL then NULL is returned. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * }; + * + #define QUEUE_LENGTH 10 + #define ITEM_SIZE sizeof( uint32_t ) + * + * // xQueueBuffer will hold the queue structure. + * StaticQueue_t xQueueBuffer; + * + * // ucQueueStorage will hold the items posted to the queue. Must be at least + * // [(queue length) * ( queue item size)] bytes long. + * uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ]; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold. + * ITEM_SIZE // The size of each item in the queue + * &( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue. + * &xQueueBuffer ); // The buffer that will hold the queue structure. + * + * // The queue is guaranteed to be created successfully as no dynamic memory + * // allocation is used. Therefore xQueue1 is now a handle to a valid queue. + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueCreateStatic xQueueCreateStatic + * \ingroup QueueManagement + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer ) xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToToFront( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * TickType_t xTicksToWait + * ); + * @endcode + * + * Post an item to the front of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToBack( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * TickType_t xTicksToWait + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSend( + * QueueHandle_t xQueue, + * const void * pvItemToQueue, + * TickType_t xTicksToWait + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSend(). It is included for + * backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToFront() and xQueueSendToBack() macros. It is + * equivalent to xQueueSendToBack(). + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueOverwrite( + * QueueHandle_t xQueue, + * const void * pvItemToQueue + * ); + * @endcode + * + * Only for use with queues that have a length of one - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * This function must not be called from an interrupt service routine. + * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle of the queue to which the data is being sent. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and + * therefore has the same return values as xQueueSendToFront(). However, pdPASS + * is the only value that can be returned because xQueueOverwrite() will write + * to the queue even when the queue is already full. + * + * Example usage: + * @code{c} + * + * void vFunction( void *pvParameters ) + * { + * QueueHandle_t xQueue; + * uint32_t ulVarToSend, ulValReceived; + * + * // Create a queue to hold one uint32_t value. It is strongly + * // recommended *not* to use xQueueOverwrite() on queues that can + * // contain more than one value, and doing so will trigger an assertion + * // if configASSERT() is defined. + * xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + * + * // Write the value 10 to the queue using xQueueOverwrite(). + * ulVarToSend = 10; + * xQueueOverwrite( xQueue, &ulVarToSend ); + * + * // Peeking the queue should now return 10, but leave the value 10 in + * // the queue. A block time of zero is used as it is known that the + * // queue holds a value. + * ulValReceived = 0; + * xQueuePeek( xQueue, &ulValReceived, 0 ); + * + * if( ulValReceived != 10 ) + * { + * // Error unless the item was removed by a different task. + * } + * + * // The queue is still full. Use xQueueOverwrite() to overwrite the + * // value held in the queue with 100. + * ulVarToSend = 100; + * xQueueOverwrite( xQueue, &ulVarToSend ); + * + * // This time read from the queue, leaving the queue empty once more. + * // A block time of 0 is used again. + * xQueueReceive( xQueue, &ulValReceived, 0 ); + * + * // The value read should be the last value written, even though the + * // queue was already full when the value was written. + * if( ulValReceived != 100 ) + * { + * // Error! + * } + * + * // ... + * } + * @endcode + * \defgroup xQueueOverwrite xQueueOverwrite + * \ingroup QueueManagement + */ +#define xQueueOverwrite( xQueue, pvItemToQueue ) \ + xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) + + +/** + * queue. h + * @code{c} + * BaseType_t xQueueGenericSend( + * QueueHandle_t xQueue, + * const void * pvItemToQueue, + * TickType_t xTicksToWait + * BaseType_t xCopyPosition + * ); + * @endcode + * + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * uint32_t ulVar = 10UL; + * + * void vATask( void *pvParameters ) + * { + * QueueHandle_t xQueue1, xQueue2; + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 uint32_t values. + * xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) ); + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * + * // ... + * + * if( xQueue1 != 0 ) + * { + * // Send an uint32_t. Wait for 10 ticks for space to become + * // available if necessary. + * if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS ) + * { + * // Failed to post the message, even after 10 ticks. + * } + * } + * + * if( xQueue2 != 0 ) + * { + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK ); + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueuePeek( + * QueueHandle_t xQueue, + * void * const pvBuffer, + * TickType_t xTicksToWait + * ); + * @endcode + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. See + * xQueuePeekFromISR() for an alternative that can be called from an interrupt + * service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_PERIOD_MS should be used to convert to real time if this is required. + * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue + * is empty. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * QueueHandle_t xQueue; + * + * // Task to create a queue and post a value. + * void vATask( void *pvParameters ) + * { + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue == 0 ) + * { + * // Failed to create the queue. + * } + * + * // ... + * + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * + * // ... Rest of task code. + * } + * + * // Task to peek the data from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * struct AMessage *pxRxedMessage; + * + * if( xQueue != 0 ) + * { + * // Peek a message on the created queue. Block for 10 ticks if a + * // message is not immediately available. + * if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) + * { + * // pcRxedMessage now points to the struct AMessage variable posted + * // by vATask, but the item still remains on the queue. + * } + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueuePeek xQueuePeek + * \ingroup QueueManagement + */ +BaseType_t xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueuePeekFromISR( + * QueueHandle_t xQueue, + * void *pvBuffer, + * ); + * @endcode + * + * A version of xQueuePeek() that can be called from an interrupt service + * routine (ISR). + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * \defgroup xQueuePeekFromISR xQueuePeekFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, + void * const pvBuffer ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueueReceive( + * QueueHandle_t xQueue, + * void *pvBuffer, + * TickType_t xTicksToWait + * ); + * @endcode + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. xQueueReceive() will return immediately if xTicksToWait + * is zero and the queue is empty. The time is defined in tick periods so the + * constant portTICK_PERIOD_MS should be used to convert to real time if this is + * required. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * struct AMessage + * { + * char ucMessageID; + * char ucData[ 20 ]; + * } xMessage; + * + * QueueHandle_t xQueue; + * + * // Task to create a queue and post a value. + * void vATask( void *pvParameters ) + * { + * struct AMessage *pxMessage; + * + * // Create a queue capable of containing 10 pointers to AMessage structures. + * // These should be passed by pointer as they contain a lot of data. + * xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) ); + * if( xQueue == 0 ) + * { + * // Failed to create the queue. + * } + * + * // ... + * + * // Send a pointer to a struct AMessage object. Don't block if the + * // queue is already full. + * pxMessage = & xMessage; + * xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 ); + * + * // ... Rest of task code. + * } + * + * // Task to receive from the queue. + * void vADifferentTask( void *pvParameters ) + * { + * struct AMessage *pxRxedMessage; + * + * if( xQueue != 0 ) + * { + * // Receive a message on the created queue. Block for 10 ticks if a + * // message is not immediately available. + * if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) ) + * { + * // pcRxedMessage now points to the struct AMessage variable posted + * // by vATask. + * } + * } + * + * // ... Rest of task code. + * } + * @endcode + * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +BaseType_t xQueueReceive( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ); + * @endcode + * + * Return the number of messages stored in a queue. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of messages available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ); + * @endcode + * + * Return the number of free spaces available in a queue. This is equal to the + * number of items that can be sent to the queue before the queue becomes full + * if no items are removed. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of spaces available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * void vQueueDelete( QueueHandle_t xQueue ); + * @endcode + * + * Delete a queue - freeing all the memory allocated for storing of items + * placed on the queue. + * + * @param xQueue A handle to the queue to be deleted. + * + * \defgroup vQueueDelete vQueueDelete + * \ingroup QueueManagement + */ +void vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToFrontFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post the byte. + * xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * taskYIELD (); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendToBackFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post the byte. + * xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * taskYIELD (); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueOverwriteFromISR( + * QueueHandle_t xQueue, + * const void * pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * A version of xQueueOverwrite() that can be used in an interrupt service + * routine (ISR). + * + * Only for use with queues that can hold a single item - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return xQueueOverwriteFromISR() is a macro that calls + * xQueueGenericSendFromISR(), and therefore has the same return values as + * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be + * returned because xQueueOverwriteFromISR() will write to the queue even when + * the queue is already full. + * + * Example usage: + * @code{c} + * + * QueueHandle_t xQueue; + * + * void vFunction( void *pvParameters ) + * { + * // Create a queue to hold one uint32_t value. It is strongly + * // recommended *not* to use xQueueOverwriteFromISR() on queues that can + * // contain more than one value, and doing so will trigger an assertion + * // if configASSERT() is defined. + * xQueue = xQueueCreate( 1, sizeof( uint32_t ) ); + * } + * + * void vAnInterruptHandler( void ) + * { + * // xHigherPriorityTaskWoken must be set to pdFALSE before it is used. + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * uint32_t ulVarToSend, ulValReceived; + * + * // Write the value 10 to the queue using xQueueOverwriteFromISR(). + * ulVarToSend = 10; + * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); + * + * // The queue is full, but calling xQueueOverwriteFromISR() again will still + * // pass because the value held in the queue will be overwritten with the + * // new value. + * ulVarToSend = 100; + * xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken ); + * + * // Reading from the queue will now return 100. + * + * // ... + * + * if( xHigherPrioritytaskWoken == pdTRUE ) + * { + * // Writing to the queue caused a task to unblock and the unblocked task + * // has a priority higher than or equal to the priority of the currently + * // executing task (the task this interrupt interrupted). Perform a context + * // switch so this interrupt returns directly to the unblocked task. + * portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port. + * } + * } + * @endcode + * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR + * \ingroup QueueManagement + */ +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueSendFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * This is a macro that calls xQueueGenericSendFromISR(). It is included + * for backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWoken; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWoken = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post the byte. + * xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. + * if( xHigherPriorityTaskWoken ) + * { + * // Actual macro used here is port specific. + * portYIELD_FROM_ISR (); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \ + xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + * @code{c} + * BaseType_t xQueueGenericSendFromISR( + * QueueHandle_t xQueue, + * const void *pvItemToQueue, + * BaseType_t *pxHigherPriorityTaskWoken, + * BaseType_t xCopyPosition + * ); + * @endcode + * + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. xQueueGiveFromISR() is an + * equivalent for use by semaphores that don't actually copy any data. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): + * @code{c} + * void vBufferISR( void ) + * { + * char cIn; + * BaseType_t xHigherPriorityTaskWokenByPost; + * + * // We have not woken a task at the start of the ISR. + * xHigherPriorityTaskWokenByPost = pdFALSE; + * + * // Loop until the buffer is empty. + * do + * { + * // Obtain a byte from the buffer. + * cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS ); + * + * // Post each byte. + * xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK ); + * + * } while( portINPUT_BYTE( BUFFER_COUNT ) ); + * + * // Now the buffer is empty we can switch context if necessary. Note that the + * // name of the yield function required is port specific. + * if( xHigherPriorityTaskWokenByPost ) + * { + * portYIELD_FROM_ISR(); + * } + * } + * @endcode + * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, + const void * const pvItemToQueue, + BaseType_t * const pxHigherPriorityTaskWoken, + const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * queue. h + * @code{c} + * BaseType_t xQueueReceiveFromISR( + * QueueHandle_t xQueue, + * void *pvBuffer, + * BaseType_t *pxTaskWoken + * ); + * @endcode + * + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param pxTaskWoken A task may be blocked waiting for space to become + * available on the queue. If xQueueReceiveFromISR causes such a task to + * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: + * @code{c} + * + * QueueHandle_t xQueue; + * + * // Function to create a queue and post some values. + * void vAFunction( void *pvParameters ) + * { + * char cValueToPost; + * const TickType_t xTicksToWait = ( TickType_t )0xff; + * + * // Create a queue capable of containing 10 characters. + * xQueue = xQueueCreate( 10, sizeof( char ) ); + * if( xQueue == 0 ) + * { + * // Failed to create the queue. + * } + * + * // ... + * + * // Post some characters that will be used within an ISR. If the queue + * // is full then this task will block for xTicksToWait ticks. + * cValueToPost = 'a'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * cValueToPost = 'b'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * + * // ... keep posting characters ... this task may block when the queue + * // becomes full. + * + * cValueToPost = 'c'; + * xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait ); + * } + * + * // ISR that outputs all the characters received on the queue. + * void vISR_Routine( void ) + * { + * BaseType_t xTaskWokenByReceive = pdFALSE; + * char cRxedChar; + * + * while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) ) + * { + * // A character was received. Output the character now. + * vOutputCharacter( cRxedChar ); + * + * // If removing the character from the queue woke the task that was + * // posting onto the queue xTaskWokenByReceive will have been set to + * // pdTRUE. No matter how many times this loop iterates only one + * // task will be woken. + * } + * + * if( xTaskWokenByReceive != ( char ) pdFALSE; + * { + * taskYIELD (); + * } + * } + * @endcode + * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * \ingroup QueueManagement + */ +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, + void * const pvBuffer, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* + * Utilities to query queues that are safe to use from an ISR. These utilities + * should be used only from within an ISR, or within a critical section. + */ +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + +/* + * The functions defined above are for passing data to and from tasks. The + * functions below are the equivalents for passing data to and from + * co-routines. + * + * These functions are called from the co-routine macro implementation and + * should not be called directly from application code. Instead use the macro + * wrappers defined within croutine.h. + */ +BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, + const void * pvItemToQueue, + BaseType_t xCoRoutinePreviouslyWoken ); +BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, + void * pvBuffer, + BaseType_t * pxTaskWoken ); +BaseType_t xQueueCRSend( QueueHandle_t xQueue, + const void * pvItemToQueue, + TickType_t xTicksToWait ); +BaseType_t xQueueCRReceive( QueueHandle_t xQueue, + void * pvBuffer, + TickType_t xTicksToWait ); + +/* + * For internal use only. Use xSemaphoreCreateMutex(), + * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling + * these functions directly. + */ +QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION; +QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION; +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; +TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Use xSemaphoreTakeMutexRecursive() or + * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. + */ +BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION; + +/* + * Reset a queue back to its original empty state. The return value is now + * obsolete and is always set to pdPASS. + */ +#define xQueueReset( xQueue ) xQueueGenericReset( ( xQueue ), pdFALSE ) + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not affect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * If vQueueAddToRegistry is called more than once with the same xQueue + * parameter, the registry will store the pcQueueName parameter from the + * most recent call to vQueueAddToRegistry. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcQueueName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. The queue registry only + * stores a pointer to the string - so the string must be persistent (global or + * preferably in ROM/Flash), not on the stack. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcQueueName ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to + * remove the queue, semaphore or mutex from the register. If you are not using + * a kernel aware debugger then this function can be ignored. + * + * @param xQueue The handle of the queue being removed from the registry. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * The queue registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call pcQueueGetName() to look + * up and return the name of a queue in the queue registry from the queue's + * handle. + * + * @param xQueue The handle of the queue the name of which will be returned. + * @return If the queue is in the registry then a pointer to the name of the + * queue is returned. If the queue is not in the registry then NULL is + * returned. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + const char * pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +#endif + +/* + * Generic version of the function used to create a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Generic version of the function used to create a queue using dynamic memory + * allocation. This is called by other functions and macros that create other + * RTOS objects that use the queue structure as their base. + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) PRIVILEGED_FUNCTION; +#endif + +/* + * Queue sets provide a mechanism to allow a task to block (pend) on a read + * operation from multiple queues or semaphores simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * A queue set must be explicitly created using a call to xQueueCreateSet() + * before it can be used. Once created, standard FreeRTOS queues and semaphores + * can be added to the set using calls to xQueueAddToSet(). + * xQueueSelectFromSet() is then used to determine which, if any, of the queues + * or semaphores contained in the set is in a state where a queue read or + * semaphore take operation would be successful. + * + * Note 1: See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: An additional 4 bytes of RAM is required for each space in a every + * queue added to a queue set. Therefore counting semaphores that have a high + * maximum count value should not be added to a queue set. + * + * Note 4: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param uxEventQueueLength Queue sets store events that occur on + * the queues and semaphores contained in the set. uxEventQueueLength specifies + * the maximum number of events that can be queued at once. To be absolutely + * certain that events are not lost uxEventQueueLength should be set to the + * total sum of the length of the queues added to the set, where binary + * semaphores and mutexes have a length of 1, and counting semaphores have a + * length set by their maximum count value. Examples: + * + If a queue set is to hold a queue of length 5, another queue of length 12, + * and a binary semaphore, then uxEventQueueLength should be set to + * (5 + 12 + 1), or 18. + * + If a queue set is to hold three binary semaphores then uxEventQueueLength + * should be set to (1 + 1 + 1 ), or 3. + * + If a queue set is to hold a counting semaphore that has a maximum count of + * 5, and a counting semaphore that has a maximum count of 3, then + * uxEventQueueLength should be set to (5 + 3), or 8. + * + * @return If the queue set is created successfully then a handle to the created + * queue set is returned. Otherwise NULL is returned. + */ +QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION; + +/* + * Adds a queue or semaphore to a queue set that was previously created by a + * call to xQueueCreateSet(). + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being added to + * the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set to which the queue or semaphore + * is being added. + * + * @return If the queue or semaphore was successfully added to the queue set + * then pdPASS is returned. If the queue could not be successfully added to the + * queue set because it is already a member of a different queue set then pdFAIL + * is returned. + */ +BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * Removes a queue or semaphore from a queue set. A queue or semaphore can only + * be removed from a set if the queue or semaphore is empty. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being removed + * from the queue set (cast to an QueueSetMemberHandle_t type). + * + * @param xQueueSet The handle of the queue set in which the queue or semaphore + * is included. + * + * @return If the queue or semaphore was successfully removed from the queue set + * then pdPASS is returned. If the queue was not in the queue set, or the + * queue (or semaphore) was not empty, then pdFAIL is returned. + */ +BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * xQueueSelectFromSet() selects from the members of a queue set a queue or + * semaphore that either contains data (in the case of a queue) or is available + * to take (in the case of a semaphore). xQueueSelectFromSet() effectively + * allows a task to block (pend) on a read operation on all the queues and + * semaphores in a queue set simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueSet The queue set on which the task will (potentially) block. + * + * @param xTicksToWait The maximum time, in ticks, that the calling task will + * remain in the Blocked state (with other tasks executing) to wait for a member + * of the queue set to be ready for a successful queue read or semaphore take + * operation. + * + * @return xQueueSelectFromSet() will return the handle of a queue (cast to + * a QueueSetMemberHandle_t type) contained in the queue set that contains data, + * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained + * in the queue set that is available, or NULL if no such queue or semaphore + * exists before before the specified block time expires. + */ +QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * A version of xQueueSelectFromSet() that can be used from an ISR. + */ +QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION; + +/* Not public API functions. */ +void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) PRIVILEGED_FUNCTION; +void vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION; +UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; +uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION; + + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* QUEUE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/semphr.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/semphr.h new file mode 100644 index 0000000..d3165d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/semphr.h @@ -0,0 +1,1193 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include semphr.h" +#endif + +#include "queue.h" + +typedef QueueHandle_t SemaphoreHandle_t; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( uint8_t ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) +#define semGIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + + +/** + * semphr. h + * @code{c} + * vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Macro that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type SemaphoreHandle_t. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to vSemaphoreCreateBinary (). + * // This is a macro so pass the variable in directly. + * vSemaphoreCreateBinary( xSemaphore ); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define vSemaphoreCreateBinary( xSemaphore ) \ + { \ + ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateBinary( void ); + * @endcode + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see https://www.FreeRTOS.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @return Handle to the created semaphore, or NULL if the memory required to + * hold the semaphore's data structures could not be allocated. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateBinary(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateBinary(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer ); + * @endcode + * + * Creates a new binary semaphore instance, and returns a handle by which the + * new semaphore can be referenced. + * + * NOTE: In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a binary semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, binary semaphores use a block + * of memory, in which the semaphore structure is stored. If a binary semaphore + * is created using xSemaphoreCreateBinary() then the required memory is + * automatically dynamically allocated inside the xSemaphoreCreateBinary() + * function. (see https://www.FreeRTOS.org/a00111.html). If a binary semaphore + * is created using xSemaphoreCreateBinaryStatic() then the application writer + * must provide the memory. xSemaphoreCreateBinaryStatic() therefore allows a + * binary semaphore to be created without using any dynamic memory allocation. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the semaphore is created then a handle to the created semaphore is + * returned. If pxSemaphoreBuffer is NULL then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * StaticSemaphore_t xSemaphoreBuffer; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateBinary(). + * // The semaphore's data structures will be placed in the xSemaphoreBuffer + * // variable, the address of which is passed into the function. The + * // function's parameter is not NULL, so the function will not attempt any + * // dynamic memory allocation, and therefore the function will not return + * // return NULL. + * xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer ); + * + * // Rest of task code goes here. + * } + * @endcode + * \defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic + * \ingroup Semaphores + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore ) xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, ( pxStaticSemaphore ), queueQUEUE_TYPE_BINARY_SEMAPHORE ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + * @code{c} + * xSemaphoreTake( + * SemaphoreHandle_t xSemaphore, + * TickType_t xBlockTime + * ); + * @endcode + * + * Macro to obtain a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * // A task that creates a semaphore. + * void vATask( void * pvParameters ) + * { + * // Create the semaphore to guard a shared resource. + * xSemaphore = xSemaphoreCreateBinary(); + * } + * + * // A task that uses the semaphore. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xSemaphore != NULL ) + * { + * // See if we can obtain the semaphore. If the semaphore is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the semaphore and can now access the + * // shared resource. + * + * // ... + * + * // We have finished accessing the shared resource. Release the + * // semaphore. + * xSemaphoreGive( xSemaphore ); + * } + * else + * { + * // We could not obtain the semaphore and can therefore not access + * // the shared resource safely. + * } + * } + * } + * @endcode + * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) ) + +/** + * semphr. h + * @code{c} + * xSemaphoreTakeRecursive( + * SemaphoreHandle_t xMutex, + * TickType_t xBlockTime + * ); + * @endcode + * + * Macro to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_PERIOD_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xMutex = NULL; + * + * // A task that creates a mutex. + * void vATask( void * pvParameters ) + * { + * // Create the mutex to guard a shared resource. + * xMutex = xSemaphoreCreateRecursiveMutex(); + * } + * + * // A task that uses the mutex. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xMutex != NULL ) + * { + * // See if we can obtain the mutex. If the mutex is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the mutex and can now access the + * // shared resource. + * + * // ... + * // For some reason due to the nature of the code further calls to + * // xSemaphoreTakeRecursive() are made on the same mutex. In real + * // code these would not be just sequential calls as this would make + * // no sense. Instead the calls are likely to be buried inside + * // a more complex call structure. + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * + * // The mutex has now been 'taken' three times, so will not be + * // available to another task until it has also been given back + * // three times. Again it is unlikely that real code would have + * // these calls sequentially, but instead buried in a more complex + * // call structure. This is just for illustrative purposes. + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * + * // Now the mutex can be taken by other tasks. + * } + * else + * { + * // We could not obtain the mutex and can therefore not access + * // the shared resource safely. + * } + * } + * } + * @endcode + * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) +#endif + +/** + * semphr. h + * @code{c} + * xSemaphoreGive( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore = NULL; + * + * void vATask( void * pvParameters ) + * { + * // Create the semaphore to guard a shared resource. + * xSemaphore = vSemaphoreCreateBinary(); + * + * if( xSemaphore != NULL ) + * { + * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + * { + * // We would expect this call to fail because we cannot give + * // a semaphore without first "taking" it! + * } + * + * // Obtain the semaphore - don't block if the semaphore is not + * // immediately available. + * if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) ) + * { + * // We now have the semaphore and can access the shared resource. + * + * // ... + * + * // We have finished accessing the shared resource so can free the + * // semaphore. + * if( xSemaphoreGive( xSemaphore ) != pdTRUE ) + * { + * // We would not expect this call to fail because we must have + * // obtained the semaphore to get here. + * } + * } + * } + * } + * @endcode + * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + * @code{c} + * xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex ); + * @endcode + * + * Macro to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xMutex = NULL; + * + * // A task that creates a mutex. + * void vATask( void * pvParameters ) + * { + * // Create the mutex to guard a shared resource. + * xMutex = xSemaphoreCreateRecursiveMutex(); + * } + * + * // A task that uses the mutex. + * void vAnotherTask( void * pvParameters ) + * { + * // ... Do other things. + * + * if( xMutex != NULL ) + * { + * // See if we can obtain the mutex. If the mutex is not available + * // wait 10 ticks to see if it becomes free. + * if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE ) + * { + * // We were able to obtain the mutex and can now access the + * // shared resource. + * + * // ... + * // For some reason due to the nature of the code further calls to + * // xSemaphoreTakeRecursive() are made on the same mutex. In real + * // code these would not be just sequential calls as this would make + * // no sense. Instead the calls are likely to be buried inside + * // a more complex call structure. + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ); + * + * // The mutex has now been 'taken' three times, so will not be + * // available to another task until it has also been given back + * // three times. Again it is unlikely that real code would have + * // these calls sequentially, it would be more likely that the calls + * // to xSemaphoreGiveRecursive() would be called as a call stack + * // unwound. This is just for demonstrative purposes. + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * xSemaphoreGiveRecursive( xMutex ); + * + * // Now the mutex can be taken by other tasks. + * } + * else + * { + * // We could not obtain the mutex and can therefore not access + * // the shared resource safely. + * } + * } + * } + * @endcode + * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + #define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) +#endif + +/** + * semphr. h + * @code{c} + * xSemaphoreGiveFromISR( + * SemaphoreHandle_t xSemaphore, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: + * @code{c} + \#define LONG_TIME 0xffff + \#define TICKS_TO_WAIT 10 + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Repetitive task. + * void vATask( void * pvParameters ) + * { + * for( ;; ) + * { + * // We want this task to run every 10 ticks of a timer. The semaphore + * // was created before this task was started. + * + * // Block waiting for the semaphore to become available. + * if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE ) + * { + * // It is time to execute. + * + * // ... + * + * // We have finished our task. Return to the top of the loop where + * // we will block on the semaphore until it is time to execute + * // again. Note when using the semaphore for synchronisation with an + * // ISR in this manner there is no need to 'give' the semaphore back. + * } + * } + * } + * + * // Timer ISR + * void vTimerISR( void * pvParameters ) + * { + * static uint8_t ucLocalTickCount = 0; + * static BaseType_t xHigherPriorityTaskWoken; + * + * // A timer tick has occurred. + * + * // ... Do other time functions. + * + * // Is it time for vATask () to run? + * xHigherPriorityTaskWoken = pdFALSE; + * ucLocalTickCount++; + * if( ucLocalTickCount >= TICKS_TO_WAIT ) + * { + * // Unblock the task by releasing the semaphore. + * xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken ); + * + * // Reset the count so we release the semaphore again in 10 ticks time. + * ucLocalTickCount = 0; + * } + * + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // We can force a context switch here. Context switching from an + * // ISR uses port specific syntax. Check the demo task for your port + * // to find the syntax required. + * } + * } + * @endcode + * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + * @code{c} + * xSemaphoreTakeFromISR( + * SemaphoreHandle_t xSemaphore, + * BaseType_t *pxHigherPriorityTaskWoken + * ); + * @endcode + * + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to xSemaphoreCreateBinary() or + * xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR, however taking a semaphore from an ISR + * is not a common operation. It is likely to only be useful when taking a + * counting semaphore when an interrupt is obtaining an object from a resource + * pool (when the semaphore count indicates the number of resources available). + * + * @param xSemaphore A handle to the semaphore being taken. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully taken, otherwise + * pdFALSE + */ +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateMutex( void ); + * @endcode + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return If the mutex was successfully created then a handle to the created + * semaphore is returned. If there was not enough heap to allocate the mutex + * data structures then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateMutex(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) ) + #define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer ); + * @endcode + * + * Creates a new mutex type semaphore instance, and returns a handle by which + * the new mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, mutex semaphores use a block + * of memory, in which the mutex structure is stored. If a mutex is created + * using xSemaphoreCreateMutex() then the required memory is automatically + * dynamically allocated inside the xSemaphoreCreateMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a mutex is created using + * xSemaphoreCreateMutexStatic() then the application writer must provided the + * memory. xSemaphoreCreateMutexStatic() therefore allows a mutex to be created + * without using any dynamic memory allocation. + * + * Mutexes created using this function can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros must not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will be used to hold the mutex's data structure, removing the need for + * the memory to be allocated dynamically. + * + * @return If the mutex was successfully created then a handle to the created + * mutex is returned. If pxMutexBuffer was NULL then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xMutexBuffer; + * + * void vATask( void * pvParameters ) + * { + * // A mutex cannot be used before it has been created. xMutexBuffer is + * // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is + * // attempted. + * xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer ); + * + * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, + * // so there is no need to check it. + * } + * @endcode + * \defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) ) + #define xSemaphoreCreateMutexStatic( pxMutexBuffer ) xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) ) +#endif + + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void ); + * @endcode + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexes use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * SemaphoreHandle_t. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). + * // This is a macro so pass the variable in directly. + * xSemaphore = xSemaphoreCreateRecursiveMutex(); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer ); + * @endcode + * + * Creates a new recursive mutex type semaphore instance, and returns a handle + * by which the new recursive mutex can be referenced. + * + * Internally, within the FreeRTOS implementation, recursive mutexes use a block + * of memory, in which the mutex structure is stored. If a recursive mutex is + * created using xSemaphoreCreateRecursiveMutex() then the required memory is + * automatically dynamically allocated inside the + * xSemaphoreCreateRecursiveMutex() function. (see + * https://www.FreeRTOS.org/a00111.html). If a recursive mutex is created using + * xSemaphoreCreateRecursiveMutexStatic() then the application writer must + * provide the memory that will get used by the mutex. + * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to + * be created without using any dynamic memory allocation. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros must not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See xSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the recursive mutex's data structure, + * removing the need for the memory to be allocated dynamically. + * + * @return If the recursive mutex was successfully created then a handle to the + * created recursive mutex is returned. If pxMutexBuffer was NULL then NULL is + * returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xMutexBuffer; + * + * void vATask( void * pvParameters ) + * { + * // A recursive semaphore cannot be used before it is created. Here a + * // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic(). + * // The address of xMutexBuffer is passed into the function, and will hold + * // the mutexes data structures - so no dynamic memory allocation will be + * // attempted. + * xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer ); + * + * // As no dynamic memory allocation was performed, xSemaphore cannot be NULL, + * // so there is no need to check it. + * } + * @endcode + * \defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic + * \ingroup Semaphores + */ +#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) ) + #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore ) xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, ( pxStaticSemaphore ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount ); + * @endcode + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * https://www.FreeRTOS.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer can + * instead optionally provide the memory that will get used by the counting + * semaphore. xSemaphoreCreateCountingStatic() therefore allows a counting + * semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * + * void vATask( void * pvParameters ) + * { + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Semaphore cannot be used before a call to xSemaphoreCreateCounting(). + * // The max value to which the semaphore can count should be 10, and the + * // initial value assigned to the count should be 0. + * xSemaphore = xSemaphoreCreateCounting( 10, 0 ); + * + * if( xSemaphore != NULL ) + * { + * // The semaphore was created successfully. + * // The semaphore can now be used. + * } + * } + * @endcode + * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) +#endif + +/** + * semphr. h + * @code{c} + * SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer ); + * @endcode + * + * Creates a new counting semaphore instance, and returns a handle by which the + * new counting semaphore can be referenced. + * + * In many usage scenarios it is faster and more memory efficient to use a + * direct to task notification in place of a counting semaphore! + * https://www.FreeRTOS.org/RTOS-task-notifications.html + * + * Internally, within the FreeRTOS implementation, counting semaphores use a + * block of memory, in which the counting semaphore structure is stored. If a + * counting semaphore is created using xSemaphoreCreateCounting() then the + * required memory is automatically dynamically allocated inside the + * xSemaphoreCreateCounting() function. (see + * https://www.FreeRTOS.org/a00111.html). If a counting semaphore is created + * using xSemaphoreCreateCountingStatic() then the application writer must + * provide the memory. xSemaphoreCreateCountingStatic() therefore allows a + * counting semaphore to be created without using any dynamic memory allocation. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t, + * which will then be used to hold the semaphore's data structure, removing the + * need for the memory to be allocated dynamically. + * + * @return If the counting semaphore was successfully created then a handle to + * the created counting semaphore is returned. If pxSemaphoreBuffer was NULL + * then NULL is returned. + * + * Example usage: + * @code{c} + * SemaphoreHandle_t xSemaphore; + * StaticSemaphore_t xSemaphoreBuffer; + * + * void vATask( void * pvParameters ) + * { + * SemaphoreHandle_t xSemaphore = NULL; + * + * // Counting semaphore cannot be used before they have been created. Create + * // a counting semaphore using xSemaphoreCreateCountingStatic(). The max + * // value to which the semaphore can count is 10, and the initial value + * // assigned to the count will be 0. The address of xSemaphoreBuffer is + * // passed in and will be used to hold the semaphore structure, so no dynamic + * // memory allocation will be used. + * xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer ); + * + * // No memory allocation was attempted so xSemaphore cannot be NULL, so there + * // is no need to check its value. + * } + * @endcode + * \defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic + * \ingroup Semaphores + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer ) xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) ) +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * semphr. h + * @code{c} + * void vSemaphoreDelete( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * Delete a semaphore. This function must be used with care. For example, + * do not delete a mutex type semaphore if the mutex is held by a task. + * + * @param xSemaphore A handle to the semaphore to be deleted. + * + * \defgroup vSemaphoreDelete vSemaphoreDelete + * \ingroup Semaphores + */ +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + * @code{c} + * TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex ); + * @endcode + * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + * Note: This is a good way of determining if the calling task is the mutex + * holder, but not a good way of determining the identity of the mutex holder as + * the holder may change between the function exiting and the returned value + * being tested. + */ +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + #define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) +#endif + +/** + * semphr.h + * @code{c} + * TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex ); + * @endcode + * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + */ +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + #define xSemaphoreGetMutexHolderFromISR( xSemaphore ) xQueueGetMutexHolderFromISR( ( xSemaphore ) ) +#endif + +/** + * semphr.h + * @code{c} + * UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCount( xSemaphore ) uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) ) + +/** + * semphr.h + * @code{c} + * UBaseType_t uxSemaphoreGetCountFromISR( SemaphoreHandle_t xSemaphore ); + * @endcode + * + * If the semaphore is a counting semaphore then uxSemaphoreGetCountFromISR() returns + * its current count value. If the semaphore is a binary semaphore then + * uxSemaphoreGetCountFromISR() returns 1 if the semaphore is available, and 0 if the + * semaphore is not available. + * + */ +#define uxSemaphoreGetCountFromISR( xSemaphore ) uxQueueMessagesWaitingFromISR( ( QueueHandle_t ) ( xSemaphore ) ) + +#endif /* SEMAPHORE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stack_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stack_macros.h new file mode 100644 index 0000000..2455674 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stack_macros.h @@ -0,0 +1,137 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +/* + * portSTACK_LIMIT_PADDING is a number of extra words to consider to be in + * use on the stack. + */ +#ifndef portSTACK_LIMIT_PADDING + #define portSTACK_LIMIT_PADDING 0 +#endif + +#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) + +/* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) + +/* Only the current stack state is to be checked. */ + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ + const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5; \ + \ + if( ( pulStack[ 0 ] != ulCheckValue ) || \ + ( pulStack[ 1 ] != ulCheckValue ) || \ + ( pulStack[ 2 ] != ulCheckValue ) || \ + ( pulStack[ 3 ] != ulCheckValue ) ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskCHECK_FOR_STACK_OVERFLOW() \ + { \ + int8_t * pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack; \ + static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +/* Remove stack overflow macro if not being used. */ +#ifndef taskCHECK_FOR_STACK_OVERFLOW + #define taskCHECK_FOR_STACK_OVERFLOW() +#endif + + + +#endif /* STACK_MACROS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stdint.readme b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stdint.readme new file mode 100644 index 0000000..ef2b7f7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stdint.readme @@ -0,0 +1,58 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef FREERTOS_STDINT +#define FREERTOS_STDINT + +/******************************************************************************* + * THIS IS NOT A FULL stdint.h IMPLEMENTATION - It only contains the definitions + * necessary to build the FreeRTOS code. It is provided to allow FreeRTOS to be + * built using compilers that do not provide their own stdint.h definition. + * + * To use this file: + * + * 1) Copy this file into the directory that contains your FreeRTOSConfig.h + * header file, as that directory will already be in the compiler's include + * path. + * + * 2) Rename the copied file stdint.h. + * + */ + +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef long int32_t; +typedef unsigned long uint32_t; + +#ifndef SIZE_MAX + #define SIZE_MAX ( ( size_t ) -1 ) +#endif + +#endif /* FREERTOS_STDINT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stream_buffer.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stream_buffer.h new file mode 100644 index 0000000..bf5019e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stream_buffer.h @@ -0,0 +1,913 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Stream buffers are used to send a continuous stream of data from one task or + * interrupt to another. Their implementation is light weight, making them + * particularly suited for interrupt to task and core to core communication + * scenarios. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section section and set the + * receive block time to 0. + * + */ + +#ifndef STREAM_BUFFER_H +#define STREAM_BUFFER_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include stream_buffer.h" +#endif + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + extern "C" { +#endif +/* *INDENT-ON* */ + +/** + * Type by which stream buffers are referenced. For example, a call to + * xStreamBufferCreate() returns an StreamBufferHandle_t variable that can + * then be used as a parameter to xStreamBufferSend(), xStreamBufferReceive(), + * etc. + */ +struct StreamBufferDef_t; +typedef struct StreamBufferDef_t * StreamBufferHandle_t; + +/** + * Type used as a stream buffer's optional callback. + */ +typedef void (* StreamBufferCallbackFunction_t)( StreamBufferHandle_t xStreamBuffer, + BaseType_t xIsInsideISR, + BaseType_t * const pxHigherPriorityTaskWoken ); + +/** + * stream_buffer.h + * + * @code{c} + * StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes ); + * @endcode + * + * Creates a new stream buffer using dynamically allocated memory. See + * xStreamBufferCreateStatic() for a version that uses statically allocated + * memory (memory that is allocated at compile time). + * + * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in + * FreeRTOSConfig.h for xStreamBufferCreate() to be available. + * + * @param xBufferSizeBytes The total number of bytes the stream buffer will be + * able to hold at any one time. + * + * @param xTriggerLevelBytes The number of bytes that must be in the stream + * buffer before a task that is blocked on the stream buffer to wait for data is + * moved out of the blocked state. For example, if a task is blocked on a read + * of an empty stream buffer that has a trigger level of 1 then the task will be + * unblocked when a single byte is written to the buffer or the task's block + * time expires. As another example, if a task is blocked on a read of an empty + * stream buffer that has a trigger level of 10 then the task will not be + * unblocked until the stream buffer contains at least 10 bytes or the task's + * block time expires. If a reading task's block time expires before the + * trigger level is reached then the task will still receive however many bytes + * are actually available. Setting a trigger level of 0 will result in a + * trigger level of 1 being used. It is not valid to specify a trigger level + * that is greater than the buffer size. + * + * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to + * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default + * implementation provided by sbSEND_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a + * stream buffer. If the parameter is NULL, it will use the default + * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @return If NULL is returned, then the stream buffer cannot be created + * because there is insufficient heap memory available for FreeRTOS to allocate + * the stream buffer data structures and storage area. A non-NULL value being + * returned indicates that the stream buffer has been created successfully - + * the returned value should be stored as the handle to the created stream + * buffer. + * + * Example use: + * @code{c} + * + * void vAFunction( void ) + * { + * StreamBufferHandle_t xStreamBuffer; + * const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10; + * + * // Create a stream buffer that can hold 100 bytes. The memory used to hold + * // both the stream buffer structure and the data in the stream buffer is + * // allocated dynamically. + * xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel ); + * + * if( xStreamBuffer == NULL ) + * { + * // There was not enough heap memory space available to create the + * // stream buffer. + * } + * else + * { + * // The stream buffer was created successfully and can now be used. + * } + * } + * @endcode + * \defgroup xStreamBufferCreate xStreamBufferCreate + * \ingroup StreamBufferManagement + */ + +#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) \ + xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, NULL, NULL ) + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define xStreamBufferCreateWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \ + xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) ) +#endif + +/** + * stream_buffer.h + * + * @code{c} + * StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes, + * size_t xTriggerLevelBytes, + * uint8_t *pucStreamBufferStorageArea, + * StaticStreamBuffer_t *pxStaticStreamBuffer ); + * @endcode + * Creates a new stream buffer using statically allocated memory. See + * xStreamBufferCreate() for a version that uses dynamically allocated memory. + * + * configSUPPORT_STATIC_ALLOCATION must be set to 1 in FreeRTOSConfig.h for + * xStreamBufferCreateStatic() to be available. + * + * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the + * pucStreamBufferStorageArea parameter. + * + * @param xTriggerLevelBytes The number of bytes that must be in the stream + * buffer before a task that is blocked on the stream buffer to wait for data is + * moved out of the blocked state. For example, if a task is blocked on a read + * of an empty stream buffer that has a trigger level of 1 then the task will be + * unblocked when a single byte is written to the buffer or the task's block + * time expires. As another example, if a task is blocked on a read of an empty + * stream buffer that has a trigger level of 10 then the task will not be + * unblocked until the stream buffer contains at least 10 bytes or the task's + * block time expires. If a reading task's block time expires before the + * trigger level is reached then the task will still receive however many bytes + * are actually available. Setting a trigger level of 0 will result in a + * trigger level of 1 being used. It is not valid to specify a trigger level + * that is greater than the buffer size. + * + * @param pucStreamBufferStorageArea Must point to a uint8_t array that is at + * least xBufferSizeBytes big. This is the array to which streams are + * copied when they are written to the stream buffer. + * + * @param pxStaticStreamBuffer Must point to a variable of type + * StaticStreamBuffer_t, which will be used to hold the stream buffer's data + * structure. + * + * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to + * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default + * implementation provided by sbSEND_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a + * stream buffer. If the parameter is NULL, it will use the default + * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback, + * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h. + * + * @return If the stream buffer is created successfully then a handle to the + * created stream buffer is returned. If either pucStreamBufferStorageArea or + * pxStaticstreamBuffer are NULL then NULL is returned. + * + * Example use: + * @code{c} + * + * // Used to dimension the array used to hold the streams. The available space + * // will actually be one less than this, so 999. + #define STORAGE_SIZE_BYTES 1000 + * + * // Defines the memory that will actually hold the streams within the stream + * // buffer. + * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ]; + * + * // The variable used to hold the stream buffer structure. + * StaticStreamBuffer_t xStreamBufferStruct; + * + * void MyFunction( void ) + * { + * StreamBufferHandle_t xStreamBuffer; + * const size_t xTriggerLevel = 1; + * + * xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucStorageBuffer ), + * xTriggerLevel, + * ucStorageBuffer, + * &xStreamBufferStruct ); + * + * // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer + * // parameters were NULL, xStreamBuffer will not be NULL, and can be used to + * // reference the created stream buffer in other stream buffer API calls. + * + * // Other code that uses the stream buffer can go here. + * } + * + * @endcode + * \defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic + * \ingroup StreamBufferManagement + */ + +#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) \ + xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), NULL, NULL ) + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define xStreamBufferCreateStaticWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \ + xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) ) +#endif + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Sends bytes to a stream buffer. The bytes are copied into the stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferSend() to write to a stream buffer from a task. Use + * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt + * service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer to which a stream is + * being sent. + * + * @param pvTxData A pointer to the buffer that holds the bytes to be copied + * into the stream buffer. + * + * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData + * into the stream buffer. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for enough space to become available in the stream + * buffer, should the stream buffer contain too little space to hold the + * another xDataLengthBytes bytes. The block time is specified in tick periods, + * so the absolute time it represents is dependent on the tick frequency. The + * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds + * into a time specified in ticks. Setting xTicksToWait to portMAX_DELAY will + * cause the task to wait indefinitely (without timing out), provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h. If a task times out + * before it can write all xDataLengthBytes into the buffer it will still write + * as many bytes as possible. A task does not use any CPU time when it is in + * the blocked state. + * + * @return The number of bytes written to the stream buffer. If a task times + * out before it can write all xDataLengthBytes into the buffer it will still + * write as many bytes as possible. + * + * Example use: + * @code{c} + * void vAFunction( StreamBufferHandle_t xStreamBuffer ) + * { + * size_t xBytesSent; + * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 }; + * char *pcStringToSend = "String to send"; + * const TickType_t x100ms = pdMS_TO_TICKS( 100 ); + * + * // Send an array to the stream buffer, blocking for a maximum of 100ms to + * // wait for enough space to be available in the stream buffer. + * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms ); + * + * if( xBytesSent != sizeof( ucArrayToSend ) ) + * { + * // The call to xStreamBufferSend() times out before there was enough + * // space in the buffer for the data to be written, but it did + * // successfully write xBytesSent bytes. + * } + * + * // Send the string to the stream buffer. Return immediately if there is not + * // enough space in the buffer. + * xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // The entire string could not be added to the stream buffer because + * // there was not enough free space in the buffer, but xBytesSent bytes + * // were sent. Could try again to send the remaining bytes. + * } + * } + * @endcode + * \defgroup xStreamBufferSend xStreamBufferSend + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + * const void *pvTxData, + * size_t xDataLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * Interrupt safe version of the API function that sends a stream of bytes to + * the stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferSend() to write to a stream buffer from a task. Use + * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt + * service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer to which a stream is + * being sent. + * + * @param pvTxData A pointer to the data that is to be copied into the stream + * buffer. + * + * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData + * into the stream buffer. + * + * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will + * have a task blocked on it waiting for data. Calling + * xStreamBufferSendFromISR() can make data available, and so cause a task that + * was waiting for data to leave the Blocked state. If calling + * xStreamBufferSendFromISR() causes a task to leave the Blocked state, and the + * unblocked task has a priority higher than the currently executing task (the + * task that was interrupted), then, internally, xStreamBufferSendFromISR() + * will set *pxHigherPriorityTaskWoken to pdTRUE. If + * xStreamBufferSendFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. This will + * ensure that the interrupt returns directly to the highest priority Ready + * state task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it + * is passed into the function. See the example code below for an example. + * + * @return The number of bytes actually written to the stream buffer, which will + * be less than xDataLengthBytes if the stream buffer didn't have enough free + * space for all the bytes to be written. + * + * Example use: + * @code{c} + * // A stream buffer that has already been created. + * StreamBufferHandle_t xStreamBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * size_t xBytesSent; + * char *pcStringToSend = "String to send"; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Attempt to send the string to the stream buffer. + * xBytesSent = xStreamBufferSendFromISR( xStreamBuffer, + * ( void * ) pcStringToSend, + * strlen( pcStringToSend ), + * &xHigherPriorityTaskWoken ); + * + * if( xBytesSent != strlen( pcStringToSend ) ) + * { + * // There was not enough free space in the stream buffer for the entire + * // string to be written, ut xBytesSent bytes were written. + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xStreamBufferSendFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * TickType_t xTicksToWait ); + * @endcode + * + * Receives bytes from a stream buffer. + * + * ***NOTE***: Uniquely among FreeRTOS objects, the stream buffer + * implementation (so also the message buffer implementation, as message buffers + * are built on top of stream buffers) assumes there is only one task or + * interrupt that will write to the buffer (the writer), and only one task or + * interrupt that will read from the buffer (the reader). It is safe for the + * writer and reader to be different tasks or interrupts, but, unlike other + * FreeRTOS objects, it is not safe to have multiple different writers or + * multiple different readers. If there are to be multiple different writers + * then the application writer must place each call to a writing API function + * (such as xStreamBufferSend()) inside a critical section and set the send + * block time to 0. Likewise, if there are to be multiple different readers + * then the application writer must place each call to a reading API function + * (such as xStreamBufferReceive()) inside a critical section and set the receive + * block time to 0. + * + * Use xStreamBufferReceive() to read from a stream buffer from a task. Use + * xStreamBufferReceiveFromISR() to read from a stream buffer from an + * interrupt service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer from which bytes are to + * be received. + * + * @param pvRxData A pointer to the buffer into which the received bytes will be + * copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the + * pvRxData parameter. This sets the maximum number of bytes to receive in one + * call. xStreamBufferReceive will return as many bytes as possible up to a + * maximum set by xBufferLengthBytes. + * + * @param xTicksToWait The maximum amount of time the task should remain in the + * Blocked state to wait for data to become available if the stream buffer is + * empty. xStreamBufferReceive() will return immediately if xTicksToWait is + * zero. The block time is specified in tick periods, so the absolute time it + * represents is dependent on the tick frequency. The macro pdMS_TO_TICKS() can + * be used to convert a time specified in milliseconds into a time specified in + * ticks. Setting xTicksToWait to portMAX_DELAY will cause the task to wait + * indefinitely (without timing out), provided INCLUDE_vTaskSuspend is set to 1 + * in FreeRTOSConfig.h. A task does not use any CPU time when it is in the + * Blocked state. + * + * @return The number of bytes actually read from the stream buffer, which will + * be less than xBufferLengthBytes if the call to xStreamBufferReceive() timed + * out before xBufferLengthBytes were available. + * + * Example use: + * @code{c} + * void vAFunction( StreamBuffer_t xStreamBuffer ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 ); + * + * // Receive up to another sizeof( ucRxData ) bytes from the stream buffer. + * // Wait in the Blocked state (so not using any CPU processing time) for a + * // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be + * // available. + * xReceivedBytes = xStreamBufferReceive( xStreamBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * xBlockTime ); + * + * if( xReceivedBytes > 0 ) + * { + * // A ucRxData contains another xReceivedBytes bytes of data, which can + * // be processed here.... + * } + * } + * @endcode + * \defgroup xStreamBufferReceive xStreamBufferReceive + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + * void *pvRxData, + * size_t xBufferLengthBytes, + * BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * An interrupt safe version of the API function that receives bytes from a + * stream buffer. + * + * Use xStreamBufferReceive() to read bytes from a stream buffer from a task. + * Use xStreamBufferReceiveFromISR() to read bytes from a stream buffer from an + * interrupt service routine (ISR). + * + * @param xStreamBuffer The handle of the stream buffer from which a stream + * is being received. + * + * @param pvRxData A pointer to the buffer into which the received bytes are + * copied. + * + * @param xBufferLengthBytes The length of the buffer pointed to by the + * pvRxData parameter. This sets the maximum number of bytes to receive in one + * call. xStreamBufferReceive will return as many bytes as possible up to a + * maximum set by xBufferLengthBytes. + * + * @param pxHigherPriorityTaskWoken It is possible that a stream buffer will + * have a task blocked on it waiting for space to become available. Calling + * xStreamBufferReceiveFromISR() can make space available, and so cause a task + * that is waiting for space to leave the Blocked state. If calling + * xStreamBufferReceiveFromISR() causes a task to leave the Blocked state, and + * the unblocked task has a priority higher than the currently executing task + * (the task that was interrupted), then, internally, + * xStreamBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE. + * If xStreamBufferReceiveFromISR() sets this value to pdTRUE, then normally a + * context switch should be performed before the interrupt is exited. That will + * ensure the interrupt returns directly to the highest priority Ready state + * task. *pxHigherPriorityTaskWoken should be set to pdFALSE before it is + * passed into the function. See the code example below for an example. + * + * @return The number of bytes read from the stream buffer, if any. + * + * Example use: + * @code{c} + * // A stream buffer that has already been created. + * StreamBuffer_t xStreamBuffer; + * + * void vAnInterruptServiceRoutine( void ) + * { + * uint8_t ucRxData[ 20 ]; + * size_t xReceivedBytes; + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE. + * + * // Receive the next stream from the stream buffer. + * xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer, + * ( void * ) ucRxData, + * sizeof( ucRxData ), + * &xHigherPriorityTaskWoken ); + * + * if( xReceivedBytes > 0 ) + * { + * // ucRxData contains xReceivedBytes read from the stream buffer. + * // Process the stream here.... + * } + * + * // If xHigherPriorityTaskWoken was set to pdTRUE inside + * // xStreamBufferReceiveFromISR() then a task that has a priority above the + * // priority of the currently executing task was unblocked and a context + * // switch should be performed to ensure the ISR returns to the unblocked + * // task. In most FreeRTOS ports this is done by simply passing + * // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the + * // variables value, and perform the context switch if necessary. Check the + * // documentation for the port in use for port specific instructions. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * } + * @endcode + * \defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Deletes a stream buffer that was previously created using a call to + * xStreamBufferCreate() or xStreamBufferCreateStatic(). If the stream + * buffer was created using dynamic memory (that is, by xStreamBufferCreate()), + * then the allocated memory is freed. + * + * A stream buffer handle must not be used after the stream buffer has been + * deleted. + * + * @param xStreamBuffer The handle of the stream buffer to be deleted. + * + * \defgroup vStreamBufferDelete vStreamBufferDelete + * \ingroup StreamBufferManagement + */ +void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see if it is full. A stream buffer is full if it + * does not have any free space, and therefore cannot accept any more data. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return If the stream buffer is full then pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferIsFull xStreamBufferIsFull + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see if it is empty. A stream buffer is empty if + * it does not contain any data. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return If the stream buffer is empty then pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferIsEmpty xStreamBufferIsEmpty + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Resets a stream buffer to its initial, empty, state. Any data that was in + * the stream buffer is discarded. A stream buffer can only be reset if there + * are no tasks blocked waiting to either send to or receive from the stream + * buffer. + * + * @param xStreamBuffer The handle of the stream buffer being reset. + * + * @return If the stream buffer is reset then pdPASS is returned. If there was + * a task blocked waiting to send to or read from the stream buffer then the + * stream buffer is not reset and pdFAIL is returned. + * + * \defgroup xStreamBufferReset xStreamBufferReset + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see how much free space it contains, which is + * equal to the amount of data that can be sent to the stream buffer before it + * is full. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return The number of bytes that can be written to the stream buffer before + * the stream buffer would be full. + * + * \defgroup xStreamBufferSpacesAvailable xStreamBufferSpacesAvailable + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * Queries a stream buffer to see how much data it contains, which is equal to + * the number of bytes that can be read from the stream buffer before the stream + * buffer would be empty. + * + * @param xStreamBuffer The handle of the stream buffer being queried. + * + * @return The number of bytes that can be read from the stream buffer before + * the stream buffer would be empty. + * + * \defgroup xStreamBufferBytesAvailable xStreamBufferBytesAvailable + * \ingroup StreamBufferManagement + */ +size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ); + * @endcode + * + * A stream buffer's trigger level is the number of bytes that must be in the + * stream buffer before a task that is blocked on the stream buffer to + * wait for data is moved out of the blocked state. For example, if a task is + * blocked on a read of an empty stream buffer that has a trigger level of 1 + * then the task will be unblocked when a single byte is written to the buffer + * or the task's block time expires. As another example, if a task is blocked + * on a read of an empty stream buffer that has a trigger level of 10 then the + * task will not be unblocked until the stream buffer contains at least 10 bytes + * or the task's block time expires. If a reading task's block time expires + * before the trigger level is reached then the task will still receive however + * many bytes are actually available. Setting a trigger level of 0 will result + * in a trigger level of 1 being used. It is not valid to specify a trigger + * level that is greater than the buffer size. + * + * A trigger level is set when the stream buffer is created, and can be modified + * using xStreamBufferSetTriggerLevel(). + * + * @param xStreamBuffer The handle of the stream buffer being updated. + * + * @param xTriggerLevel The new trigger level for the stream buffer. + * + * @return If xTriggerLevel was less than or equal to the stream buffer's length + * then the trigger level will be updated and pdTRUE is returned. Otherwise + * pdFALSE is returned. + * + * \defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is sent to a message buffer or stream buffer. If there was a task that + * was blocked on the message or stream buffer waiting for data to arrive then + * the sbSEND_COMPLETED() macro sends a notification to the task to remove it + * from the Blocked state. xStreamBufferSendCompletedFromISR() does the same + * thing. It is provided to enable application writers to implement their own + * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer to which data was + * written. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xStreamBufferSendCompletedFromISR(). If calling + * xStreamBufferSendCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * For advanced users only. + * + * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when + * data is read out of a message buffer or stream buffer. If there was a task + * that was blocked on the message or stream buffer waiting for data to arrive + * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to + * remove it from the Blocked state. xStreamBufferReceiveCompletedFromISR() + * does the same thing. It is provided to enable application writers to + * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT + * ANY OTHER TIME. + * + * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for + * additional information. + * + * @param xStreamBuffer The handle of the stream buffer from which data was + * read. + * + * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be + * initialised to pdFALSE before it is passed into + * xStreamBufferReceiveCompletedFromISR(). If calling + * xStreamBufferReceiveCompletedFromISR() removes a task from the Blocked state, + * and the task has a priority above the priority of the currently running task, + * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a + * context switch should be performed before exiting the ISR. + * + * @return If a task was removed from the Blocked state then pdTRUE is returned. + * Otherwise pdFALSE is returned. + * + * \defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* Functions below here are not part of the public API. */ +StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION; + + +StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION; + +size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_TRACE_FACILITY == 1 ) + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, + UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; +#endif + +/* *INDENT-OFF* */ +#if defined( __cplusplus ) + } +#endif +/* *INDENT-ON* */ + +#endif /* !defined( STREAM_BUFFER_H ) */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/task.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/task.h new file mode 100644 index 0000000..ab8eeb8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/task.h @@ -0,0 +1,3118 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef INC_TASK_H +#define INC_TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include "list.h" + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- +* MACROS AND DEFINITIONS +*----------------------------------------------------------*/ + +/* + * If tskKERNEL_VERSION_NUMBER ends with + it represents the version in development + * after the numbered release. + * + * The tskKERNEL_VERSION_MAJOR, tskKERNEL_VERSION_MINOR, tskKERNEL_VERSION_BUILD + * values will reflect the last released version number. + */ +#define tskKERNEL_VERSION_NUMBER "V10.5.1" +#define tskKERNEL_VERSION_MAJOR 10 +#define tskKERNEL_VERSION_MINOR 5 +#define tskKERNEL_VERSION_BUILD 1 + +/* MPU region parameters passed in ulParameters + * of MemoryRegion_t struct. */ +#define tskMPU_REGION_READ_ONLY ( 1UL << 0UL ) +#define tskMPU_REGION_READ_WRITE ( 1UL << 1UL ) +#define tskMPU_REGION_EXECUTE_NEVER ( 1UL << 2UL ) +#define tskMPU_REGION_NORMAL_MEMORY ( 1UL << 3UL ) +#define tskMPU_REGION_DEVICE_MEMORY ( 1UL << 4UL ) + +/* The direct to task notification feature used to have only a single notification + * per task. Now there is an array of notifications per task that is dimensioned by + * configTASK_NOTIFICATION_ARRAY_ENTRIES. For backward compatibility, any use of the + * original direct to task notification defaults to using the first index in the + * array. */ +#define tskDEFAULT_INDEX_TO_NOTIFY ( 0 ) + +/** + * task. h + * + * Type by which tasks are referenced. For example, a call to xTaskCreate + * returns (via a pointer parameter) an TaskHandle_t variable that can then + * be used as a parameter to vTaskDelete to delete the task. + * + * \defgroup TaskHandle_t TaskHandle_t + * \ingroup Tasks + */ +struct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct tskTaskControlBlock * TaskHandle_t; + +/* + * Defines the prototype to which the application task hook function must + * conform. + */ +typedef BaseType_t (* TaskHookFunction_t)( void * ); + +/* Task states returned by eTaskGetState. */ +typedef enum +{ + eRunning = 0, /* A task is querying the state of itself, so must be running. */ + eReady, /* The task being queried is in a ready or pending ready list. */ + eBlocked, /* The task being queried is in the Blocked state. */ + eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */ + eInvalid /* Used as an 'invalid state' value. */ +} eTaskState; + +/* Actions that can be performed when vTaskNotify() is called. */ +typedef enum +{ + eNoAction = 0, /* Notify the task without updating its notify value. */ + eSetBits, /* Set bits in the task's notification value. */ + eIncrement, /* Increment the task's notification value. */ + eSetValueWithOverwrite, /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */ + eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */ +} eNotifyAction; + +/* + * Used internally only. + */ +typedef struct xTIME_OUT +{ + BaseType_t xOverflowCount; + TickType_t xTimeOnEntering; +} TimeOut_t; + +/* + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void * pvBaseAddress; + uint32_t ulLengthInBytes; + uint32_t ulParameters; +} MemoryRegion_t; + +/* + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMETERS +{ + TaskFunction_t pvTaskCode; + const char * pcName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + configSTACK_DEPTH_TYPE usStackDepth; + void * pvParameters; + UBaseType_t uxPriority; + StackType_t * puxStackBuffer; + MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ]; + #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + StaticTask_t * const pxTaskBuffer; + #endif +} TaskParameters_t; + +/* Used with the uxTaskGetSystemState() function to return the state of each task + * in the system. */ +typedef struct xTASK_STATUS +{ + TaskHandle_t xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ + const char * pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + UBaseType_t xTaskNumber; /* A number unique to the task. */ + eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ + UBaseType_t uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ + UBaseType_t uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ + configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See https://www.FreeRTOS.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ + StackType_t * pxStackBase; /* Points to the lowest address of the task's stack area. */ + #if ( ( portSTACK_GROWTH > 0 ) && ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + StackType_t * pxTopOfStack; /* Points to the top address of the task's stack area. */ + StackType_t * pxEndOfStack; /* Points to the end address of the task's stack area. */ + #endif + configSTACK_DEPTH_TYPE usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ +} TaskStatus_t; + +/* Possible return values for eTaskConfirmSleepModeStatus(). */ +typedef enum +{ + eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPRESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ + eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ + #if ( INCLUDE_vTaskSuspend == 1 ) + eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ + #endif /* INCLUDE_vTaskSuspend */ +} eSleepModeStatus; + +/** + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \defgroup taskYIELD taskYIELD + * \ingroup SchedulerControl + */ +#define taskYIELD() portYIELD() + +/** + * task. h + * + * Macro to mark the start of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL + * \ingroup SchedulerControl + */ +#define taskENTER_CRITICAL() portENTER_CRITICAL() +#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR() + +/** + * task. h + * + * Macro to mark the end of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL + * \ingroup SchedulerControl + */ +#define taskEXIT_CRITICAL() portEXIT_CRITICAL() +#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) + +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() + +/* Definitions returned by xTaskGetSchedulerState(). taskSCHEDULER_SUSPENDED is + * 0 to generate more optimal code when configASSERT() is defined as the constant + * is used in assert() statements. */ +#define taskSCHEDULER_SUSPENDED ( ( BaseType_t ) 0 ) +#define taskSCHEDULER_NOT_STARTED ( ( BaseType_t ) 1 ) +#define taskSCHEDULER_RUNNING ( ( BaseType_t ) 2 ) + + +/*----------------------------------------------------------- +* TASK CREATION API +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * BaseType_t xTaskCreate( + * TaskFunction_t pxTaskCode, + * const char *pcName, + * configSTACK_DEPTH_TYPE usStackDepth, + * void *pvParameters, + * UBaseType_t uxPriority, + * TaskHandle_t *pxCreatedTask + * ); + * @endcode + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * See xTaskCreateStatic() for a version that does not use any dynamic memory + * allocation. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pxTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by configMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // Task to be created. + * void vTaskCode( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * } + * } + * + * // Function that creates a task. + * void vOtherFunction( void ) + * { + * static uint8_t ucParameterToPass; + * TaskHandle_t xHandle = NULL; + * + * // Create the task, storing the handle. Note that the passed parameter ucParameterToPass + * // must exist for the lifetime of the task, so in this case is declared static. If it was just an + * // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time + * // the new task attempts to access it. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); + * configASSERT( xHandle ); + * + * // Use the handle to delete the task. + * if( xHandle != NULL ) + * { + * vTaskDelete( xHandle ); + * } + * } + * @endcode + * \defgroup xTaskCreate xTaskCreate + * \ingroup Tasks + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + * const char *pcName, + * uint32_t ulStackDepth, + * void *pvParameters, + * UBaseType_t uxPriority, + * StackType_t *puxStackBuffer, + * StaticTask_t *pxTaskBuffer ); + * @endcode + * + * Create a new task and add it to the list of tasks that are ready to run. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreate() then both blocks of memory are automatically dynamically + * allocated inside the xTaskCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a task is created using + * xTaskCreateStatic() then the application writer must provide the required + * memory. xTaskCreateStatic() therefore allows a task to be created without + * using any dynamic memory allocation. + * + * @param pxTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. The maximum length of the string is defined by + * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h. + * + * @param ulStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 32-bits wide and ulStackDepth is defined as 100 then 400 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task will run. + * + * @param puxStackBuffer Must point to a StackType_t array that has at least + * ulStackDepth indexes - the array will then be used as the task's stack, + * removing the need for the stack to be allocated dynamically. + * + * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will + * then be used to hold the task's data structures, removing the need for the + * memory to be allocated dynamically. + * + * @return If neither puxStackBuffer nor pxTaskBuffer are NULL, then the task + * will be created and a handle to the created task is returned. If either + * puxStackBuffer or pxTaskBuffer are NULL then the task will not be created and + * NULL is returned. + * + * Example usage: + * @code{c} + * + * // Dimensions of the buffer that the task being created will use as its stack. + * // NOTE: This is the number of words the stack will hold, not the number of + * // bytes. For example, if each stack item is 32-bits, and this is set to 100, + * // then 400 bytes (100 * 32-bits) will be allocated. + #define STACK_SIZE 200 + * + * // Structure that will hold the TCB of the task being created. + * StaticTask_t xTaskBuffer; + * + * // Buffer that the task being created will use as its stack. Note this is + * // an array of StackType_t variables. The size of StackType_t is dependent on + * // the RTOS port. + * StackType_t xStack[ STACK_SIZE ]; + * + * // Function that implements the task being created. + * void vTaskCode( void * pvParameters ) + * { + * // The parameter value is expected to be 1 as 1 is passed in the + * // pvParameters value in the call to xTaskCreateStatic(). + * configASSERT( ( uint32_t ) pvParameters == 1UL ); + * + * for( ;; ) + * { + * // Task code goes here. + * } + * } + * + * // Function that creates a task. + * void vOtherFunction( void ) + * { + * TaskHandle_t xHandle = NULL; + * + * // Create the task without using any dynamic memory allocation. + * xHandle = xTaskCreateStatic( + * vTaskCode, // Function that implements the task. + * "NAME", // Text name for the task. + * STACK_SIZE, // Stack size in words, not bytes. + * ( void * ) 1, // Parameter passed into the task. + * tskIDLE_PRIORITY,// Priority at which the task is created. + * xStack, // Array to use as the task's stack. + * &xTaskBuffer ); // Variable to hold the task's data structure. + * + * // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have + * // been created, and xHandle will be the task's handle. Use the handle + * // to suspend the task. + * vTaskSuspend( xHandle ); + * } + * @endcode + * \defgroup xTaskCreateStatic xTaskCreateStatic + * \ingroup Tasks + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * task. h + * @code{c} + * BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask ); + * @endcode + * + * Only available when configSUPPORT_DYNAMIC_ALLOCATION is set to 1. + * + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * See xTaskCreateRestrictedStatic() for a version that does not use any + * dynamic memory allocation. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // Create an TaskParameters_t structure that defines the task to be created. + * static const TaskParameters_t xCheckTaskParameters = + * { + * vATask, // pvTaskCode - the function that implements the task. + * "ATask", // pcName - just a text name for the task to assist debugging. + * 100, // usStackDepth - the stack size DEFINED IN WORDS. + * NULL, // pvParameters - passed into the task function as the function parameters. + * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + * + * // xRegions - Allocate up to three separate memory regions for access by + * // the task, with appropriate access permissions. Different processors have + * // different memory alignment requirements - refer to the FreeRTOS documentation + * // for full information. + * { + * // Base address Length Parameters + * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + * } + * }; + * + * int main( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task from the const structure defined above. The task handle + * // is requested (the second parameter is not NULL) but in this case just for + * // demonstration purposes as its not actually used. + * xTaskCreateRestricted( &xRegTest1Parameters, &xHandle ); + * + * // Start the scheduler. + * vTaskStartScheduler(); + * + * // Will only get here if there was insufficient memory to create the idle + * // and/or timer task. + * for( ;; ); + * } + * @endcode + * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +#if ( portUSING_MPU_WRAPPERS == 1 ) + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * BaseType_t xTaskCreateRestrictedStatic( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask ); + * @endcode + * + * Only available when configSUPPORT_STATIC_ALLOCATION is set to 1. + * + * xTaskCreateRestrictedStatic() should only be used in systems that include an + * MPU implementation. + * + * Internally, within the FreeRTOS implementation, tasks use two blocks of + * memory. The first block is used to hold the task's data structures. The + * second block is used by the task as its stack. If a task is created using + * xTaskCreateRestricted() then the stack is provided by the application writer, + * and the memory used to hold the task's data structure is automatically + * dynamically allocated inside the xTaskCreateRestricted() function. If a task + * is created using xTaskCreateRestrictedStatic() then the application writer + * must provide the memory used to hold the task's data structures too. + * xTaskCreateRestrictedStatic() therefore allows a memory protected task to be + * created without using any dynamic memory allocation. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. If configSUPPORT_STATIC_ALLOCATION is set to 1 the structure + * contains an additional member, which is used to point to a variable of type + * StaticTask_t - which is then used to hold the task's data structure. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file projdefs.h + * + * Example usage: + * @code{c} + * // Create an TaskParameters_t structure that defines the task to be created. + * // The StaticTask_t variable is only included in the structure when + * // configSUPPORT_STATIC_ALLOCATION is set to 1. The PRIVILEGED_DATA macro can + * // be used to force the variable into the RTOS kernel's privileged data area. + * static PRIVILEGED_DATA StaticTask_t xTaskBuffer; + * static const TaskParameters_t xCheckTaskParameters = + * { + * vATask, // pvTaskCode - the function that implements the task. + * "ATask", // pcName - just a text name for the task to assist debugging. + * 100, // usStackDepth - the stack size DEFINED IN WORDS. + * NULL, // pvParameters - passed into the task function as the function parameters. + * ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state. + * cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack. + * + * // xRegions - Allocate up to three separate memory regions for access by + * // the task, with appropriate access permissions. Different processors have + * // different memory alignment requirements - refer to the FreeRTOS documentation + * // for full information. + * { + * // Base address Length Parameters + * { cReadWriteArray, 32, portMPU_REGION_READ_WRITE }, + * { cReadOnlyArray, 32, portMPU_REGION_READ_ONLY }, + * { cPrivilegedOnlyAccessArray, 128, portMPU_REGION_PRIVILEGED_READ_WRITE } + * } + * + * &xTaskBuffer; // Holds the task's data structure. + * }; + * + * int main( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task from the const structure defined above. The task handle + * // is requested (the second parameter is not NULL) but in this case just for + * // demonstration purposes as its not actually used. + * xTaskCreateRestrictedStatic( &xRegTest1Parameters, &xHandle ); + * + * // Start the scheduler. + * vTaskStartScheduler(); + * + * // Will only get here if there was insufficient memory to create the idle + * // and/or timer task. + * for( ;; ); + * } + * @endcode + * \defgroup xTaskCreateRestrictedStatic xTaskCreateRestrictedStatic + * \ingroup Tasks + */ +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; +#endif + +/** + * task. h + * @code{c} + * void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions ); + * @endcode + * + * Memory regions are assigned to a restricted task when the task is created by + * a call to xTaskCreateRestricted(). These regions can be redefined using + * vTaskAllocateMPURegions(). + * + * @param xTask The handle of the task being updated. + * + * @param xRegions A pointer to a MemoryRegion_t structure that contains the + * new memory region definitions. + * + * Example usage: + * @code{c} + * // Define an array of MemoryRegion_t structures that configures an MPU region + * // allowing read/write access for 1024 bytes starting at the beginning of the + * // ucOneKByte array. The other two of the maximum 3 definable regions are + * // unused so set to zero. + * static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] = + * { + * // Base address Length Parameters + * { ucOneKByte, 1024, portMPU_REGION_READ_WRITE }, + * { 0, 0, 0 }, + * { 0, 0, 0 } + * }; + * + * void vATask( void *pvParameters ) + * { + * // This task was created such that it has access to certain regions of + * // memory as defined by the MPU configuration. At some point it is + * // desired that these MPU regions are replaced with that defined in the + * // xAltRegions const struct above. Use a call to vTaskAllocateMPURegions() + * // for this purpose. NULL is used as the task handle to indicate that this + * // function should modify the MPU regions of the calling task. + * vTaskAllocateMPURegions( NULL, xAltRegions ); + * + * // Now the task can continue its function, but from this point on can only + * // access its stack and the ucOneKByte array (unless any other statically + * // defined or shared regions have been declared elsewhere). + * } + * @endcode + * \defgroup vTaskAllocateMPURegions vTaskAllocateMPURegions + * \ingroup Tasks + */ +void vTaskAllocateMPURegions( TaskHandle_t xTask, + const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskDelete( TaskHandle_t xTaskToDelete ); + * @endcode + * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Remove a task from the RTOS real time kernel's management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * + * NOTE: The idle task is responsible for freeing the kernel allocated + * memory from tasks that have been deleted. It is therefore important that + * the idle task is not starved of microcontroller processing time if your + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param xTaskToDelete The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: + * @code{c} + * void vOtherFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create the task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // Use the handle to delete the task. + * vTaskDelete( xHandle ); + * } + * @endcode + * \defgroup vTaskDelete vTaskDelete + * \ingroup Tasks + */ +void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- +* TASK CONTROL API +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * void vTaskDelay( const TickType_t xTicksToDelay ); + * @endcode + * + * Delay a task for a given number of ticks. The actual time that the + * task remains blocked depends on the tick rate. The constant + * portTICK_PERIOD_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * + * vTaskDelay() specifies a time at which the task wishes to unblock relative to + * the time at which vTaskDelay() is called. For example, specifying a block + * period of 100 ticks will cause the task to unblock 100 ticks after + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a periodic task as the path taken through the + * code, as well as other task and interrupt activity, will affect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See xTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + * + * void vTaskFunction( void * pvParameters ) + * { + * // Block for 500ms. + * const TickType_t xDelay = 500 / portTICK_PERIOD_MS; + * + * for( ;; ) + * { + * // Simply toggle the LED every 500ms, blocking between each toggle. + * vToggleLED(); + * vTaskDelay( xDelay ); + * } + * } + * + * \defgroup vTaskDelay vTaskDelay + * \ingroup TaskCtrl + */ +void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * BaseType_t xTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement ); + * @endcode + * + * INCLUDE_xTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Delay a task until a specified time. This function can be used by periodic + * tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, xTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The macro pdMS_TO_TICKS() can be used to calculate the number of ticks from a + * time specified in milliseconds with a resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within xTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling xTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * @return Value which can be used to check whether the task was actually delayed. + * Will be pdTRUE if the task way delayed and pdFALSE otherwise. A task will not + * be delayed if the next expected wake time is in the past. + * + * Example usage: + * @code{c} + * // Perform an action every 10 ticks. + * void vTaskFunction( void * pvParameters ) + * { + * TickType_t xLastWakeTime; + * const TickType_t xFrequency = 10; + * BaseType_t xWasDelayed; + * + * // Initialise the xLastWakeTime variable with the current time. + * xLastWakeTime = xTaskGetTickCount (); + * for( ;; ) + * { + * // Wait for the next cycle. + * xWasDelayed = xTaskDelayUntil( &xLastWakeTime, xFrequency ); + * + * // Perform action here. xWasDelayed value can be used to determine + * // whether a deadline was missed if the code here took too long. + * } + * } + * @endcode + * \defgroup xTaskDelayUntil xTaskDelayUntil + * \ingroup TaskCtrl + */ +BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION; + +/* + * vTaskDelayUntil() is the older version of xTaskDelayUntil() and does not + * return a value. + */ +#define vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ) \ + do { \ + ( void ) xTaskDelayUntil( ( pxPreviousWakeTime ), ( xTimeIncrement ) ); \ + } while( 0 ) + + +/** + * task. h + * @code{c} + * BaseType_t xTaskAbortDelay( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this + * function to be available. + * + * A task will enter the Blocked state when it is waiting for an event. The + * event it is waiting for can be a temporal event (waiting for a time), such + * as when vTaskDelay() is called, or an event on an object, such as when + * xQueueReceive() or ulTaskNotifyTake() is called. If the handle of a task + * that is in the Blocked state is used in a call to xTaskAbortDelay() then the + * task will leave the Blocked state, and return from whichever function call + * placed the task into the Blocked state. + * + * There is no 'FromISR' version of this function as an interrupt would need to + * know which object a task was blocked on in order to know which actions to + * take. For example, if the task was blocked on a queue the interrupt handler + * would then need to know if the queue was locked. + * + * @param xTask The handle of the task to remove from the Blocked state. + * + * @return If the task referenced by xTask was not in the Blocked state then + * pdFAIL is returned. Otherwise pdPASS is returned. + * + * \defgroup xTaskAbortDelay xTaskAbortDelay + * \ingroup TaskCtrl + */ +BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the priority of any task. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of xTask. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to obtain the priority of the created task. + * // It was created with tskIDLE_PRIORITY, but may have changed + * // it itself. + * if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY ) + * { + * // The task has changed it's priority. + * } + * + * // ... + * + * // Is our priority higher than the created task? + * if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) ) + * { + * // Our priority (obtained using NULL handle) is higher. + * } + * } + * @endcode + * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * \ingroup TaskCtrl + */ +UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ); + * @endcode + * + * A version of uxTaskPriorityGet() that can be used from an ISR. + */ +UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * eTaskState eTaskGetState( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the state of any task. States are encoded by the eTaskState + * enumerated type. + * + * @param xTask Handle of the task to be queried. + * + * @return The state of xTask at the time the function was called. Note the + * state of the task might change between the function being called, and the + * functions return value being tested by the calling task. + */ +eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState ); + * @endcode + * + * configUSE_TRACE_FACILITY must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * Populates a TaskStatus_t structure with information about a task. + * + * @param xTask Handle of the task being queried. If xTask is NULL then + * information will be returned about the calling task. + * + * @param pxTaskStatus A pointer to the TaskStatus_t structure that will be + * filled with information about the task referenced by the handle passed using + * the xTask parameter. + * + * @param xGetFreeStackSpace The TaskStatus_t structure contains a member to report + * the stack high water mark of the task being queried. Calculating the stack + * high water mark takes a relatively long time, and can make the system + * temporarily unresponsive - so the xGetFreeStackSpace parameter is provided to + * allow the high water mark checking to be skipped. The high watermark value + * will only be written to the TaskStatus_t structure if xGetFreeStackSpace is + * not set to pdFALSE; + * + * @param eState The TaskStatus_t structure contains a member to report the + * state of the task being queried. Obtaining the task state is not as fast as + * a simple assignment - so the eState parameter is provided to allow the state + * information to be omitted from the TaskStatus_t structure. To obtain state + * information then set eState to eInvalid - otherwise the value passed in + * eState will be reported as the task state in the TaskStatus_t structure. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * TaskStatus_t xTaskDetails; + * + * // Obtain the handle of a task from its name. + * xHandle = xTaskGetHandle( "Task_Name" ); + * + * // Check the handle is not NULL. + * configASSERT( xHandle ); + * + * // Use the handle to obtain further information about the task. + * vTaskGetInfo( xHandle, + * &xTaskDetails, + * pdTRUE, // Include the high water mark in xTaskDetails. + * eInvalid ); // Include the task state in xTaskDetails. + * } + * @endcode + * \defgroup vTaskGetInfo vTaskGetInfo + * \ingroup TaskCtrl + */ +void vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority ); + * @endcode + * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Set the priority of any task. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param xTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to raise the priority of the created task. + * vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 ); + * + * // ... + * + * // Use a NULL handle to raise our priority to the same value. + * vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 ); + * } + * @endcode + * \defgroup vTaskPrioritySet vTaskPrioritySet + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskSuspend( TaskHandle_t xTaskToSuspend ); + * @endcode + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Suspend any task. When suspended a task will never get any microcontroller + * processing time, no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to suspend the created task. + * vTaskSuspend( xHandle ); + * + * // ... + * + * // The created task will not run during this period, unless + * // another task calls vTaskResume( xHandle ). + * + * //... + * + * + * // Suspend ourselves. + * vTaskSuspend( NULL ); + * + * // We cannot get here unless another task calls vTaskResume + * // with our handle as the parameter. + * } + * @endcode + * \defgroup vTaskSuspend vTaskSuspend + * \ingroup TaskCtrl + */ +void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskResume( TaskHandle_t xTaskToResume ); + * @endcode + * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Resumes a suspended task. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * vTaskResume (). + * + * @param xTaskToResume Handle to the task being readied. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * TaskHandle_t xHandle; + * + * // Create a task, storing the handle. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); + * + * // ... + * + * // Use the handle to suspend the created task. + * vTaskSuspend( xHandle ); + * + * // ... + * + * // The created task will not run during this period, unless + * // another task calls vTaskResume( xHandle ). + * + * //... + * + * + * // Resume the suspended task ourselves. + * vTaskResume( xHandle ); + * + * // The created task will once again get microcontroller processing + * // time in accordance with its priority within the system. + * } + * @endcode + * \defgroup vTaskResume vTaskResume + * \ingroup TaskCtrl + */ +void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void xTaskResumeFromISR( TaskHandle_t xTaskToResume ); + * @endcode + * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * An implementation of vTaskResume() that can be called from within an ISR. + * + * A task that has been suspended by one or more calls to vTaskSuspend () + * will be made available for running again by a single call to + * xTaskResumeFromISR (). + * + * xTaskResumeFromISR() should not be used to synchronise a task with an + * interrupt if there is a chance that the interrupt could arrive prior to the + * task being suspended - as this can lead to interrupts being missed. Use of a + * semaphore as a synchronisation mechanism would avoid this eventuality. + * + * @param xTaskToResume Handle to the task being readied. + * + * @return pdTRUE if resuming the task should result in a context switch, + * otherwise pdFALSE. This is used by the ISR to determine if a context switch + * may be required following the ISR. + * + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * \ingroup TaskCtrl + */ +BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- +* SCHEDULER CONTROL +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * void vTaskStartScheduler( void ); + * @endcode + * + * Starts the real time kernel tick processing. After calling the kernel + * has control over which tasks are executed and when. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: + * @code{c} + * void vAFunction( void ) + * { + * // Create at least one task before starting the kernel. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + * + * // Start the real time kernel with preemption. + * vTaskStartScheduler (); + * + * // Will not get here unless a task calls vTaskEndScheduler () + * } + * @endcode + * + * \defgroup vTaskStartScheduler vTaskStartScheduler + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskEndScheduler( void ); + * @endcode + * + * NOTE: At the time of writing only the x86 real mode port, which runs on a PC + * in place of DOS, implements this function. + * + * Stops the real time kernel tick. All created tasks will be automatically + * deleted and multitasking (either preemptive or cooperative) will + * stop. Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: + * @code{c} + * void vTaskCode( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // At some point we want to end the real time kernel processing + * // so call ... + * vTaskEndScheduler (); + * } + * } + * + * void vAFunction( void ) + * { + * // Create at least one task before starting the kernel. + * xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + * + * // Start the real time kernel with preemption. + * vTaskStartScheduler (); + * + * // Will only get here when the vTaskCode () task has called + * // vTaskEndScheduler (). When we get here we are back to single task + * // execution. + * } + * @endcode + * + * \defgroup vTaskEndScheduler vTaskEndScheduler + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskSuspendAll( void ); + * @endcode + * + * Suspends the scheduler without disabling interrupts. Context switches will + * not occur while the scheduler is suspended. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * xTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: + * @code{c} + * void vTask1( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // ... + * + * // At some point the task wants to perform a long operation during + * // which it does not want to get swapped out. It cannot use + * // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + * // operation may cause interrupts to be missed - including the + * // ticks. + * + * // Prevent the real time kernel swapping out the task. + * vTaskSuspendAll (); + * + * // Perform the operation here. There is no need to use critical + * // sections as we have all the microcontroller processing time. + * // During this time interrupts will still operate and the kernel + * // tick count will be maintained. + * + * // ... + * + * // The operation is complete. Restart the kernel. + * xTaskResumeAll (); + * } + * } + * @endcode + * \defgroup vTaskSuspendAll vTaskSuspendAll + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * BaseType_t xTaskResumeAll( void ); + * @endcode + * + * Resumes scheduler activity after it was suspended by a call to + * vTaskSuspendAll(). + * + * xTaskResumeAll() only resumes the scheduler. It does not unsuspend tasks + * that were previously suspended by a call to vTaskSuspend(). + * + * @return If resuming the scheduler caused a context switch then pdTRUE is + * returned, otherwise pdFALSE is returned. + * + * Example usage: + * @code{c} + * void vTask1( void * pvParameters ) + * { + * for( ;; ) + * { + * // Task code goes here. + * + * // ... + * + * // At some point the task wants to perform a long operation during + * // which it does not want to get swapped out. It cannot use + * // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the + * // operation may cause interrupts to be missed - including the + * // ticks. + * + * // Prevent the real time kernel swapping out the task. + * vTaskSuspendAll (); + * + * // Perform the operation here. There is no need to use critical + * // sections as we have all the microcontroller processing time. + * // During this time interrupts will still operate and the real + * // time kernel tick count will be maintained. + * + * // ... + * + * // The operation is complete. Restart the kernel. We want to force + * // a context switch - but there is no point if resuming the scheduler + * // caused a context switch already. + * if( !xTaskResumeAll () ) + * { + * taskYIELD (); + * } + * } + * } + * @endcode + * \defgroup xTaskResumeAll xTaskResumeAll + * \ingroup SchedulerControl + */ +BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- +* TASK UTILITIES +*----------------------------------------------------------*/ + +/** + * task. h + * @code{c} + * TickType_t xTaskGetTickCount( void ); + * @endcode + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \defgroup xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * TickType_t xTaskGetTickCountFromISR( void ); + * @endcode + * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that TickType_t is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR + * \ingroup TaskUtils + */ +TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * uint16_t uxTaskGetNumberOfTasks( void ); + * @endcode + * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * \ingroup TaskUtils + */ +UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * char *pcTaskGetName( TaskHandle_t xTaskToQuery ); + * @endcode + * + * @return The text (human readable) name of the task referenced by the handle + * xTaskToQuery. A task can query its own name by either passing in its own + * handle, or by setting xTaskToQuery to NULL. + * + * \defgroup pcTaskGetName pcTaskGetName + * \ingroup TaskUtils + */ +char * pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + * @code{c} + * TaskHandle_t xTaskGetHandle( const char *pcNameToQuery ); + * @endcode + * + * NOTE: This function takes a relatively long time to complete and should be + * used sparingly. + * + * @return The handle of the task that has the human readable name pcNameToQuery. + * NULL is returned if no matching name is found. INCLUDE_xTaskGetHandle + * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available. + * + * \defgroup pcTaskGetHandle pcTaskGetHandle + * \ingroup TaskUtils + */ +TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task.h + * @code{c} + * UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ); + * @endcode + * + * INCLUDE_uxTaskGetStackHighWaterMark2 must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in words, so + * actual spaces on the stack rather than bytes) since the task referenced by + * xTask was created. + */ +configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* When using trace macros it is sometimes necessary to include task.h before + * FreeRTOS.h. When this is done TaskHookFunction_t will not yet have been defined, + * so the following two prototypes will cause a compilation error. This can be + * fixed by simply guarding against the inclusion of these two prototypes unless + * they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration + * constant. */ +#ifdef configUSE_APPLICATION_TASK_TAG + #if configUSE_APPLICATION_TASK_TAG == 1 + +/** + * task.h + * @code{c} + * void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction ); + * @endcode + * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * Passing xTask as NULL has the effect of setting the calling tasks hook + * function. + */ + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * void xTaskGetApplicationTaskTag( TaskHandle_t xTask ); + * @endcode + * + * Returns the pxHookFunction value assigned to the task xTask. Do not + * call from an interrupt service routine - call + * xTaskGetApplicationTaskTagFromISR() instead. + */ + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * void xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ); + * @endcode + * + * Returns the pxHookFunction value assigned to the task xTask. Can + * be called from an interrupt service routine. + */ + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + +/* Each task contains an array of pointers that is dimensioned by the + * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h. The + * kernel does not use the pointers itself, so the application writer can use + * the pointers for any purpose they wish. The following two functions are + * used to set and query a pointer respectively. */ + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) PRIVILEGED_FUNCTION; + void * pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) PRIVILEGED_FUNCTION; + +#endif + +#if ( configCHECK_FOR_STACK_OVERFLOW > 0 ) + +/** + * task.h + * @code{c} + * void vApplicationStackOverflowHook( TaskHandle_t xTask char *pcTaskName); + * @endcode + * + * The application stack overflow hook is called when a stack overflow is detected for a task. + * + * Details on stack overflow detection can be found here: https://www.FreeRTOS.org/Stacks-and-stack-overflow-checking.html + * + * @param xTask the task that just exceeded its stack boundaries. + * @param pcTaskName A character string containing the name of the offending task. + */ + void vApplicationStackOverflowHook( TaskHandle_t xTask, + char * pcTaskName ); + +#endif + +#if ( configUSE_TICK_HOOK > 0 ) + +/** + * task.h + * @code{c} + * void vApplicationTickHook( void ); + * @endcode + * + * This hook function is called in the system tick handler after any OS work is completed. + */ + void vApplicationTickHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */ + +#endif + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + +/** + * task.h + * @code{c} + * void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) + * @endcode + * + * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Idle Task TCB. This function is required when + * configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION + * + * @param ppxIdleTaskTCBBuffer A handle to a statically allocated TCB buffer + * @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task + * @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer + */ + void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, + StackType_t ** ppxIdleTaskStackBuffer, + uint32_t * pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */ +#endif + +/** + * task.h + * @code{c} + * BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter ); + * @endcode + * + * Calls the hook function associated with xTask. Passing xTask as NULL has + * the effect of calling the Running tasks (the calling task) hook function. + * + * pvParameter is passed to the hook function for the task to interpret as it + * wants. The return value is the value returned by the task hook function + * registered by the user. + */ +BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) PRIVILEGED_FUNCTION; + +/** + * xTaskGetIdleTaskHandle() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * Simply returns the handle of the idle task. It is not valid to call + * xTaskGetIdleTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for + * uxTaskGetSystemState() to be available. + * + * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in + * the system. TaskStatus_t structures contain, among other things, members + * for the task handle, task name, task priority, task state, and total amount + * of run time consumed by the task. See the TaskStatus_t structure + * definition in this file for the full member list. + * + * NOTE: This function is intended for debugging use only as its use results in + * the scheduler remaining suspended for an extended period. + * + * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures. + * The array must contain at least one TaskStatus_t structure for each task + * that is under the control of the RTOS. The number of tasks under the control + * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. + * + * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray + * parameter. The size is specified as the number of indexes in the array, or + * the number of TaskStatus_t structures contained in the array, not by the + * number of bytes in the array. + * + * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in + * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the + * total run time (as defined by the run time stats clock, see + * https://www.FreeRTOS.org/rtos-run-time-stats.html) since the target booted. + * pulTotalRunTime can be set to NULL to omit the total run time information. + * + * @return The number of TaskStatus_t structures that were populated by + * uxTaskGetSystemState(). This should equal the number returned by the + * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed + * in the uxArraySize parameter was too small. + * + * Example usage: + * @code{c} + * // This example demonstrates how a human readable table of run time stats + * // information is generated from raw data provided by uxTaskGetSystemState(). + * // The human readable table is written to pcWriteBuffer + * void vTaskGetRunTimeStats( char *pcWriteBuffer ) + * { + * TaskStatus_t *pxTaskStatusArray; + * volatile UBaseType_t uxArraySize, x; + * configRUN_TIME_COUNTER_TYPE ulTotalRunTime, ulStatsAsPercentage; + * + * // Make sure the write buffer does not contain a string. + * pcWriteBuffer = 0x00; + * + * // Take a snapshot of the number of tasks in case it changes while this + * // function is executing. + * uxArraySize = uxTaskGetNumberOfTasks(); + * + * // Allocate a TaskStatus_t structure for each task. An array could be + * // allocated statically at compile time. + * pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) ); + * + * if( pxTaskStatusArray != NULL ) + * { + * // Generate raw status information about each task. + * uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime ); + * + * // For percentage calculations. + * ulTotalRunTime /= 100UL; + * + * // Avoid divide by zero errors. + * if( ulTotalRunTime > 0 ) + * { + * // For each populated position in the pxTaskStatusArray array, + * // format the raw data as human readable ASCII data + * for( x = 0; x < uxArraySize; x++ ) + * { + * // What percentage of the total run time has the task used? + * // This will always be rounded down to the nearest integer. + * // ulTotalRunTimeDiv100 has already been divided by 100. + * ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime; + * + * if( ulStatsAsPercentage > 0UL ) + * { + * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + * } + * else + * { + * // If the percentage is zero here then the task has + * // consumed less than 1% of the total run time. + * sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter ); + * } + * + * pcWriteBuffer += strlen( ( char * ) pcWriteBuffer ); + * } + * } + * + * // The array is no longer needed, free the memory it consumes. + * vPortFree( pxTaskStatusArray ); + * } + * } + * @endcode + */ +UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * void vTaskList( char *pcWriteBuffer ); + * @endcode + * + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * both be defined as 1 for this function to be available. See the + * configuration section of the FreeRTOS.org website for more information. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays task: + * names, states, priority, stack usage and task number. + * Stack usage specified as the number of unused StackType_t words stack can hold + * on top of stack - not the number of bytes. + * + * vTaskList() has a dependency on the sprintf() C library function that might + * bloat the code size, use a lot of stack, and provide different results on + * different platforms. An alternative, tiny, third party, and limited + * functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly through a + * call to vTaskList(). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ASCII form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \defgroup vTaskList vTaskList + * \ingroup TaskUtils + */ +void vTaskList( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + * @code{c} + * void vTaskGetRunTimeStats( char *pcWriteBuffer ); + * @endcode + * + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both be defined as 1 for this function to be available. The application + * must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays the + * amount of time each task has spent in the Running state in both absolute and + * percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library function + * that might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, and + * limited functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() directly + * to get access to raw stats data, rather than indirectly through a call to + * vTaskGetRunTimeStats(). + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ASCII form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats + * \ingroup TaskUtils + */ +void vTaskGetRunTimeStats( char * pcWriteBuffer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * task. h + * @code{c} + * configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ); + * configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ); + * @endcode + * + * configGENERATE_RUN_TIME_STATS, configUSE_STATS_FORMATTING_FUNCTIONS and + * INCLUDE_xTaskGetIdleTaskHandle must all be defined as 1 for these functions + * to be available. The application must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE() + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total + * execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter() + * returns the total execution time of just the idle task and + * ulTaskGetIdleRunTimePercent() returns the percentage of the CPU time used by + * just the idle task. + * + * Note the amount of idle time is only a good measure of the slack time in a + * system if there are no other tasks executing at the idle priority, tickless + * idle is not used, and configIDLE_SHOULD_YIELD is set to 0. + * + * @return The total run time of the idle task or the percentage of the total + * run time consumed by the idle task. This is the amount of time the + * idle task has actually been executing. The unit of time is dependent on the + * frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and + * portGET_RUN_TIME_COUNTER_VALUE() macros. + * + * \defgroup ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter + * \ingroup TaskUtils + */ +configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION; +configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction ); + * BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * Sends a direct to task notification to a task, with an optional value and + * action. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * A task can use xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() to + * [optionally] block to wait for a notification to be pending. The task does + * not consume any CPU time while it is in the Blocked state. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their + * un-indexed equivalents). If the task was already in the Blocked state to + * wait for a notification when the notification arrives then the task will + * automatically be removed from the Blocked state (unblocked) and the + * notification cleared. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotify() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling xTaskNotify() is equivalent to calling xTaskNotifyIndexed() + * with the uxIndexToNotify parameter set to 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotify() does + * not have this parameter and always sends notifications to index 0. + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The target notification value is bitwise ORed with ulValue. + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * eIncrement - + * The target notification value is incremented. ulValue is not used and + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The target notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification at the + * same array index (the task already had a notification pending at that index). + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending at the + * same array index then the target notification value is set to ulValue and + * xTaskNotifyIndexed() will return pdPASS. If the task being notified already + * had a notification pending at the same array index then no action is + * performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification at the specified array index without the + * notification value at that index being updated. ulValue is not used and + * xTaskNotifyIndexed() always returns pdPASS in this case. + * + * pulPreviousNotificationValue - + * Can be used to pass out the subject task's notification value before any + * bits are modified by the notify function. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotifyIndexed xTaskNotifyIndexed + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) PRIVILEGED_FUNCTION; +#define xTaskNotify( xTaskToNotify, ulValue, eAction ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL ) +#define xTaskNotifyIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyAndQueryIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue ); + * BaseType_t xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * xTaskNotifyAndQueryIndexed() performs the same operation as + * xTaskNotifyIndexed() with the addition that it also returns the subject + * task's prior notification value (the notification value at the time the + * function is called rather than when the function returns) in the additional + * pulPreviousNotifyValue parameter. + * + * xTaskNotifyAndQuery() performs the same operation as xTaskNotify() with the + * addition that it also returns the subject task's prior notification value + * (the notification value as it was at the time the function is called, rather + * than when the function returns) in the additional pulPreviousNotifyValue + * parameter. + * + * \defgroup xTaskNotifyAndQueryIndexed xTaskNotifyAndQueryIndexed + * \ingroup TaskNotifications + */ +#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) +#define xTaskNotifyAndQueryIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotifyValue ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken ); + * BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * A version of xTaskNotifyIndexed() that can be used from an interrupt service + * routine (ISR). + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block + * to wait for a notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their + * un-indexed equivalents). If the task was already in the Blocked state to + * wait for a notification when the notification arrives then the task will + * automatically be removed from the Blocked state (unblocked) and the + * notification cleared. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyFromISR() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling xTaskNotifyFromISR() is equivalent to calling + * xTaskNotifyIndexedFromISR() with the uxIndexToNotify parameter set to 0. + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyFromISR() + * does not have this parameter and always sends notifications to index 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param ulValue Data that can be sent with the notification. How the data is + * used depends on the value of the eAction parameter. + * + * @param eAction Specifies how the notification updates the task's notification + * value, if at all. Valid values for eAction are as follows: + * + * eSetBits - + * The task's notification value is bitwise ORed with ulValue. xTaskNotify() + * always returns pdPASS in this case. + * + * eIncrement - + * The task's notification value is incremented. ulValue is not used and + * xTaskNotify() always returns pdPASS in this case. + * + * eSetValueWithOverwrite - + * The task's notification value is set to the value of ulValue, even if the + * task being notified had not yet processed the previous notification (the + * task already had a notification pending). xTaskNotify() always returns + * pdPASS in this case. + * + * eSetValueWithoutOverwrite - + * If the task being notified did not already have a notification pending then + * the task's notification value is set to ulValue and xTaskNotify() will + * return pdPASS. If the task being notified already had a notification + * pending then no action is performed and pdFAIL is returned. + * + * eNoAction - + * The task receives a notification without its notification value being + * updated. ulValue is not used and xTaskNotify() always returns pdPASS in + * this case. + * + * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should + * be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * @return Dependent on the value of eAction. See the description of the + * eAction parameter. + * + * \defgroup xTaskNotifyIndexedFromISR xTaskNotifyIndexedFromISR + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyAndQueryIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ); + * BaseType_t xTaskNotifyAndQueryFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * xTaskNotifyAndQueryIndexedFromISR() performs the same operation as + * xTaskNotifyIndexedFromISR() with the addition that it also returns the + * subject task's prior notification value (the notification value at the time + * the function is called rather than at the time the function returns) in the + * additional pulPreviousNotifyValue parameter. + * + * xTaskNotifyAndQueryFromISR() performs the same operation as + * xTaskNotifyFromISR() with the addition that it also returns the subject + * task's prior notification value (the notification value at the time the + * function is called rather than at the time the function returns) in the + * additional pulPreviousNotifyValue parameter. + * + * \defgroup xTaskNotifyAndQueryIndexedFromISR xTaskNotifyAndQueryIndexedFromISR + * \ingroup TaskNotifications + */ +#define xTaskNotifyAndQueryIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) +#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \ + xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyWaitIndexed( UBaseType_t uxIndexToWaitOn, uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ); + * + * BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait ); + * @endcode + * + * Waits for a direct to task notification to be pending at a given index within + * an array of direct to task notifications. + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * A notification sent to a task will remain pending until it is cleared by the + * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their + * un-indexed equivalents). If the task was already in the Blocked state to + * wait for a notification when the notification arrives then the task will + * automatically be removed from the Blocked state (unblocked) and the + * notification cleared. + * + * A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a + * notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block + * to wait for a notification value to have a non-zero value. The task does + * not consume any CPU time while it is in the Blocked state. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyWait() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling xTaskNotifyWait() is equivalent to calling + * xTaskNotifyWaitIndexed() with the uxIndexToWaitOn parameter set to 0. + * + * @param uxIndexToWaitOn The index within the calling task's array of + * notification values on which the calling task will wait for a notification to + * be received. uxIndexToWaitOn must be less than + * configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyWait() does + * not have this parameter and always waits for notifications on index 0. + * + * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value + * will be cleared in the calling task's notification value before the task + * checks to see if any notifications are pending, and optionally blocks if no + * notifications are pending. Setting ulBitsToClearOnEntry to ULONG_MAX (if + * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have + * the effect of resetting the task's notification value to 0. Setting + * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged. + * + * @param ulBitsToClearOnExit If a notification is pending or received before + * the calling task exits the xTaskNotifyWait() function then the task's + * notification value (see the xTaskNotify() API function) is passed out using + * the pulNotificationValue parameter. Then any bits that are set in + * ulBitsToClearOnExit will be cleared in the task's notification value (note + * *pulNotificationValue is set before any bits are cleared). Setting + * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL + * (if limits.h is not included) will have the effect of resetting the task's + * notification value to 0 before the function exits. Setting + * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged + * when the function exits (in which case the value passed out in + * pulNotificationValue will match the task's notification value). + * + * @param pulNotificationValue Used to pass the task's notification value out + * of the function. Note the value passed out will not be effected by the + * clearing of any bits caused by ulBitsToClearOnExit being non-zero. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for a notification to be received, should a notification + * not already be pending when xTaskNotifyWait() was called. The task + * will not consume any processing time while it is in the Blocked state. This + * is specified in kernel ticks, the macro pdMS_TO_TICKS( value_in_ms ) can be + * used to convert a time specified in milliseconds to a time specified in + * ticks. + * + * @return If a notification was received (including notifications that were + * already pending when xTaskNotifyWait was called) then pdPASS is + * returned. Otherwise pdFAIL is returned. + * + * \defgroup xTaskNotifyWaitIndexed xTaskNotifyWaitIndexed + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +#define xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \ + xTaskGenericNotifyWait( tskDEFAULT_INDEX_TO_NOTIFY, ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) ) +#define xTaskNotifyWaitIndexed( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \ + xTaskGenericNotifyWait( ( uxIndexToWaitOn ), ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyGiveIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify ); + * BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); + * @endcode + * + * Sends a direct to task notification to a particular index in the target + * task's notification array in a manner similar to giving a counting semaphore. + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * macros to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * xTaskNotifyGiveIndexed() is a helper macro intended for use when task + * notifications are used as light weight and faster binary or counting + * semaphore equivalents. Actual FreeRTOS semaphores are given using the + * xSemaphoreGive() API function, the equivalent action that instead uses a task + * notification is xTaskNotifyGiveIndexed(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotifyTakeIndexed() API function rather than the + * xTaskNotifyWaitIndexed() API function. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyGive() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling xTaskNotifyGive() is equivalent to calling + * xTaskNotifyGiveIndexed() with the uxIndexToNotify parameter set to 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyGive() + * does not have this parameter and always sends notifications to index 0. + * + * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the + * eAction parameter set to eIncrement - so pdPASS is always returned. + * + * \defgroup xTaskNotifyGiveIndexed xTaskNotifyGiveIndexed + * \ingroup TaskNotifications + */ +#define xTaskNotifyGive( xTaskToNotify ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( 0 ), eIncrement, NULL ) +#define xTaskNotifyGiveIndexed( xTaskToNotify, uxIndexToNotify ) \ + xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( 0 ), eIncrement, NULL ) + +/** + * task. h + * @code{c} + * void vTaskNotifyGiveIndexedFromISR( TaskHandle_t xTaskHandle, UBaseType_t uxIndexToNotify, BaseType_t *pxHigherPriorityTaskWoken ); + * void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken ); + * @endcode + * + * A version of xTaskNotifyGiveIndexed() that can be called from an interrupt + * service routine (ISR). + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro + * to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * vTaskNotifyGiveIndexedFromISR() is intended for use when task notifications + * are used as light weight and faster binary or counting semaphore equivalents. + * Actual FreeRTOS semaphores are given from an ISR using the + * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses + * a task notification is vTaskNotifyGiveIndexedFromISR(). + * + * When task notifications are being used as a binary or counting semaphore + * equivalent then the task being notified should wait for the notification + * using the ulTaskNotifyTakeIndexed() API function rather than the + * xTaskNotifyWaitIndexed() API function. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyFromISR() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling xTaskNotifyGiveFromISR() is equivalent to calling + * xTaskNotifyGiveIndexedFromISR() with the uxIndexToNotify parameter set to 0. + * + * @param xTaskToNotify The handle of the task being notified. The handle to a + * task can be returned from the xTaskCreate() API function used to create the + * task, and the handle of the currently running task can be obtained by calling + * xTaskGetCurrentTaskHandle(). + * + * @param uxIndexToNotify The index within the target task's array of + * notification values to which the notification is to be sent. uxIndexToNotify + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. + * xTaskNotifyGiveFromISR() does not have this parameter and always sends + * notifications to index 0. + * + * @param pxHigherPriorityTaskWoken vTaskNotifyGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the + * task to which the notification was sent to leave the Blocked state, and the + * unblocked task has a priority higher than the currently running task. If + * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch + * should be requested before the interrupt is exited. How a context switch is + * requested from an ISR is dependent on the port - see the documentation page + * for the port in use. + * + * \defgroup vTaskNotifyGiveIndexedFromISR vTaskNotifyGiveIndexedFromISR + * \ingroup TaskNotifications + */ +void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; +#define vTaskNotifyGiveFromISR( xTaskToNotify, pxHigherPriorityTaskWoken ) \ + vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( pxHigherPriorityTaskWoken ) ) +#define vTaskNotifyGiveIndexedFromISR( xTaskToNotify, uxIndexToNotify, pxHigherPriorityTaskWoken ) \ + vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( pxHigherPriorityTaskWoken ) ) + +/** + * task. h + * @code{c} + * uint32_t ulTaskNotifyTakeIndexed( UBaseType_t uxIndexToWaitOn, BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); + * + * uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait ); + * @endcode + * + * Waits for a direct to task notification on a particular index in the calling + * task's notification array in a manner similar to taking a counting semaphore. + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this + * function to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * Events can be sent to a task using an intermediary object. Examples of such + * objects are queues, semaphores, mutexes and event groups. Task notifications + * are a method of sending an event directly to a task without the need for such + * an intermediary object. + * + * A notification sent to a task can optionally perform an action, such as + * update, overwrite or increment one of the task's notification values. In + * that way task notifications can be used to send data to a task, or be used as + * light weight and fast binary or counting semaphores. + * + * ulTaskNotifyTakeIndexed() is intended for use when a task notification is + * used as a faster and lighter weight binary or counting semaphore alternative. + * Actual FreeRTOS semaphores are taken using the xSemaphoreTake() API function, + * the equivalent action that instead uses a task notification is + * ulTaskNotifyTakeIndexed(). + * + * When a task is using its notification value as a binary or counting semaphore + * other tasks should send notifications to it using the xTaskNotifyGiveIndexed() + * macro, or xTaskNotifyIndex() function with the eAction parameter set to + * eIncrement. + * + * ulTaskNotifyTakeIndexed() can either clear the task's notification value at + * the array index specified by the uxIndexToWaitOn parameter to zero on exit, + * in which case the notification value acts like a binary semaphore, or + * decrement the notification value on exit, in which case the notification + * value acts like a counting semaphore. + * + * A task can use ulTaskNotifyTakeIndexed() to [optionally] block to wait for + * a notification. The task does not consume any CPU time while it is in the + * Blocked state. + * + * Where as xTaskNotifyWaitIndexed() will return when a notification is pending, + * ulTaskNotifyTakeIndexed() will return when the task's notification value is + * not zero. + * + * **NOTE** Each notification within the array operates independently - a task + * can only block on one notification within the array at a time and will not be + * unblocked by a notification sent to any other array index. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. ulTaskNotifyTake() is the original API function, and remains backward + * compatible by always operating on the notification value at index 0 in the + * array. Calling ulTaskNotifyTake() is equivalent to calling + * ulTaskNotifyTakeIndexed() with the uxIndexToWaitOn parameter set to 0. + * + * @param uxIndexToWaitOn The index within the calling task's array of + * notification values on which the calling task will wait for a notification to + * be non-zero. uxIndexToWaitOn must be less than + * configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyTake() does + * not have this parameter and always waits for notifications on index 0. + * + * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's + * notification value is decremented when the function exits. In this way the + * notification value acts like a counting semaphore. If xClearCountOnExit is + * not pdFALSE then the task's notification value is cleared to zero when the + * function exits. In this way the notification value acts like a binary + * semaphore. + * + * @param xTicksToWait The maximum amount of time that the task should wait in + * the Blocked state for the task's notification value to be greater than zero, + * should the count not already be greater than zero when + * ulTaskNotifyTake() was called. The task will not consume any processing + * time while it is in the Blocked state. This is specified in kernel ticks, + * the macro pdMS_TO_TICKS( value_in_ms ) can be used to convert a time + * specified in milliseconds to a time specified in ticks. + * + * @return The task's notification count before it is either cleared to zero or + * decremented (see the xClearCountOnExit parameter). + * + * \defgroup ulTaskNotifyTakeIndexed ulTaskNotifyTakeIndexed + * \ingroup TaskNotifications + */ +uint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +#define ulTaskNotifyTake( xClearCountOnExit, xTicksToWait ) \ + ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY ), ( xClearCountOnExit ), ( xTicksToWait ) ) +#define ulTaskNotifyTakeIndexed( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ) \ + ulTaskGenericNotifyTake( ( uxIndexToWaitOn ), ( xClearCountOnExit ), ( xTicksToWait ) ) + +/** + * task. h + * @code{c} + * BaseType_t xTaskNotifyStateClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToCLear ); + * + * BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * If a notification is sent to an index within the array of notifications then + * the notification at that index is said to be 'pending' until it is read or + * explicitly cleared by the receiving task. xTaskNotifyStateClearIndexed() + * is the function that clears a pending notification without reading the + * notification value. The notification value at the same array index is not + * altered. Set xTask to NULL to clear the notification state of the calling + * task. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. xTaskNotifyStateClear() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling xTaskNotifyStateClear() is equivalent to calling + * xTaskNotifyStateClearIndexed() with the uxIndexToNotify parameter set to 0. + * + * @param xTask The handle of the RTOS task that will have a notification state + * cleared. Set xTask to NULL to clear a notification state in the calling + * task. To obtain a task's handle create the task using xTaskCreate() and + * make use of the pxCreatedTask parameter, or create the task using + * xTaskCreateStatic() and store the returned value, or use the task's name in + * a call to xTaskGetHandle(). + * + * @param uxIndexToClear The index within the target task's array of + * notification values to act upon. For example, setting uxIndexToClear to 1 + * will clear the state of the notification at index 1 within the array. + * uxIndexToClear must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. + * ulTaskNotifyStateClear() does not have this parameter and always acts on the + * notification at index 0. + * + * @return pdTRUE if the task's notification state was set to + * eNotWaitingNotification, otherwise pdFALSE. + * + * \defgroup xTaskNotifyStateClearIndexed xTaskNotifyStateClearIndexed + * \ingroup TaskNotifications + */ +BaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) PRIVILEGED_FUNCTION; +#define xTaskNotifyStateClear( xTask ) \ + xTaskGenericNotifyStateClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ) ) +#define xTaskNotifyStateClearIndexed( xTask, uxIndexToClear ) \ + xTaskGenericNotifyStateClear( ( xTask ), ( uxIndexToClear ) ) + +/** + * task. h + * @code{c} + * uint32_t ulTaskNotifyValueClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToClear, uint32_t ulBitsToClear ); + * + * uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear ); + * @endcode + * + * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details. + * + * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these + * functions to be available. + * + * Each task has a private array of "notification values" (or 'notifications'), + * each of which is a 32-bit unsigned integer (uint32_t). The constant + * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the + * array, and (for backward compatibility) defaults to 1 if left undefined. + * Prior to FreeRTOS V10.4.0 there was only one notification value per task. + * + * ulTaskNotifyValueClearIndexed() clears the bits specified by the + * ulBitsToClear bit mask in the notification value at array index uxIndexToClear + * of the task referenced by xTask. + * + * Backward compatibility information: + * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and + * all task notification API functions operated on that value. Replacing the + * single notification value with an array of notification values necessitated a + * new set of API functions that could address specific notifications within the + * array. ulTaskNotifyValueClear() is the original API function, and remains + * backward compatible by always operating on the notification value at index 0 + * within the array. Calling ulTaskNotifyValueClear() is equivalent to calling + * ulTaskNotifyValueClearIndexed() with the uxIndexToClear parameter set to 0. + * + * @param xTask The handle of the RTOS task that will have bits in one of its + * notification values cleared. Set xTask to NULL to clear bits in a + * notification value of the calling task. To obtain a task's handle create the + * task using xTaskCreate() and make use of the pxCreatedTask parameter, or + * create the task using xTaskCreateStatic() and store the returned value, or + * use the task's name in a call to xTaskGetHandle(). + * + * @param uxIndexToClear The index within the target task's array of + * notification values in which to clear the bits. uxIndexToClear + * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. + * ulTaskNotifyValueClear() does not have this parameter and always clears bits + * in the notification value at index 0. + * + * @param ulBitsToClear Bit mask of the bits to clear in the notification value of + * xTask. Set a bit to 1 to clear the corresponding bits in the task's notification + * value. Set ulBitsToClear to 0xffffffff (UINT_MAX on 32-bit architectures) to clear + * the notification value to 0. Set ulBitsToClear to 0 to query the task's + * notification value without clearing any bits. + * + * + * @return The value of the target task's notification value before the bits + * specified by ulBitsToClear were cleared. + * \defgroup ulTaskNotifyValueClear ulTaskNotifyValueClear + * \ingroup TaskNotifications + */ +uint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION; +#define ulTaskNotifyValueClear( xTask, ulBitsToClear ) \ + ulTaskGenericNotifyValueClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulBitsToClear ) ) +#define ulTaskNotifyValueClearIndexed( xTask, uxIndexToClear, ulBitsToClear ) \ + ulTaskGenericNotifyValueClear( ( xTask ), ( uxIndexToClear ), ( ulBitsToClear ) ) + +/** + * task.h + * @code{c} + * void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ); + * @endcode + * + * Capture the current time for future use with xTaskCheckForTimeOut(). + * + * @param pxTimeOut Pointer to a timeout object into which the current time + * is to be captured. The captured time includes the tick count and the number + * of times the tick count has overflowed since the system first booted. + * \defgroup vTaskSetTimeOutState vTaskSetTimeOutState + * \ingroup TaskCtrl + */ +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait ); + * @endcode + * + * Determines if pxTicksToWait ticks has passed since a time was captured + * using a call to vTaskSetTimeOutState(). The captured time includes the tick + * count and the number of times the tick count has overflowed. + * + * @param pxTimeOut The time status as captured previously using + * vTaskSetTimeOutState. If the timeout has not yet occurred, it is updated + * to reflect the current time status. + * @param pxTicksToWait The number of ticks to check for timeout i.e. if + * pxTicksToWait ticks have passed since pxTimeOut was last updated (either by + * vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred. + * If the timeout has not occurred, pxTicksToWait is updated to reflect the + * number of remaining ticks. + * + * @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is + * returned and pxTicksToWait is updated to reflect the number of remaining + * ticks. + * + * @see https://www.FreeRTOS.org/xTaskCheckForTimeOut.html + * + * Example Usage: + * @code{c} + * // Driver library function used to receive uxWantedBytes from an Rx buffer + * // that is filled by a UART interrupt. If there are not enough bytes in the + * // Rx buffer then the task enters the Blocked state until it is notified that + * // more data has been placed into the buffer. If there is still not enough + * // data then the task re-enters the Blocked state, and xTaskCheckForTimeOut() + * // is used to re-calculate the Block time to ensure the total amount of time + * // spent in the Blocked state does not exceed MAX_TIME_TO_WAIT. This + * // continues until either the buffer contains at least uxWantedBytes bytes, + * // or the total amount of time spent in the Blocked state reaches + * // MAX_TIME_TO_WAIT - at which point the task reads however many bytes are + * // available up to a maximum of uxWantedBytes. + * + * size_t xUART_Receive( uint8_t *pucBuffer, size_t uxWantedBytes ) + * { + * size_t uxReceived = 0; + * TickType_t xTicksToWait = MAX_TIME_TO_WAIT; + * TimeOut_t xTimeOut; + * + * // Initialize xTimeOut. This records the time at which this function + * // was entered. + * vTaskSetTimeOutState( &xTimeOut ); + * + * // Loop until the buffer contains the wanted number of bytes, or a + * // timeout occurs. + * while( UART_bytes_in_rx_buffer( pxUARTInstance ) < uxWantedBytes ) + * { + * // The buffer didn't contain enough data so this task is going to + * // enter the Blocked state. Adjusting xTicksToWait to account for + * // any time that has been spent in the Blocked state within this + * // function so far to ensure the total amount of time spent in the + * // Blocked state does not exceed MAX_TIME_TO_WAIT. + * if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) != pdFALSE ) + * { + * //Timed out before the wanted number of bytes were available, + * // exit the loop. + * break; + * } + * + * // Wait for a maximum of xTicksToWait ticks to be notified that the + * // receive interrupt has placed more data into the buffer. + * ulTaskNotifyTake( pdTRUE, xTicksToWait ); + * } + * + * // Attempt to read uxWantedBytes from the receive buffer into pucBuffer. + * // The actual number of bytes read (which might be less than + * // uxWantedBytes) is returned. + * uxReceived = UART_read_from_receive_buffer( pxUARTInstance, + * pucBuffer, + * uxWantedBytes ); + * + * return uxReceived; + * } + * @endcode + * \defgroup xTaskCheckForTimeOut xTaskCheckForTimeOut + * \ingroup TaskCtrl + */ +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * task.h + * @code{c} + * BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ); + * @endcode + * + * This function corrects the tick count value after the application code has held + * interrupts disabled for an extended period resulting in tick interrupts having + * been missed. + * + * This function is similar to vTaskStepTick(), however, unlike + * vTaskStepTick(), xTaskCatchUpTicks() may move the tick count forward past a + * time at which a task should be removed from the blocked state. That means + * tasks may have to be removed from the blocked state as the tick count is + * moved. + * + * @param xTicksToCatchUp The number of tick interrupts that have been missed due to + * interrupts being disabled. Its value is not computed automatically, so must be + * computed by the application writer. + * + * @return pdTRUE if moving the tick count forward resulted in a task leaving the + * blocked state and a context switch being performed. Otherwise pdFALSE. + * + * \defgroup xTaskCatchUpTicks xTaskCatchUpTicks + * \ingroup TaskCtrl + */ +BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) PRIVILEGED_FUNCTION; + + +/*----------------------------------------------------------- +* SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES +*----------------------------------------------------------*/ + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. If a non-zero value is returned then a context switch is + * required because either: + * + A task was removed from a blocked list because its timeout had expired, + * or + * + Time slicing is in use and there is a task of equal priority to the + * currently running task. + */ +BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * The 'unordered' version replaces the event list item value with the + * xItemValue value, and inserts the list item at the end of the list. + * + * The 'ordered' version uses the existing event list item value (which is the + * owning task's priority) to insert the list item into the event list in task + * priority order. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xItemValue The item value to use for the event list item when the + * event list is not ordered by task priority. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks, the constant + * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time + * period. + */ +void vTaskPlaceOnEventList( List_t * const pxEventList, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, + const TickType_t xItemValue, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + */ +void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList()/vTaskRemoveFromUnorderedEventList() will be called + * if either an event occurs to unblock a task, or the block timeout period + * expires. + * + * xTaskRemoveFromEventList() is used when the event list is in task priority + * order. It removes the list item from the head of the event list as that will + * have the highest priority owning task of all the tasks on the event list. + * vTaskRemoveFromUnorderedEventList() is used when the event list is not + * ordered and the event list items hold something other than the owning tasks + * priority. In this case the event list item value is updated to the value + * passed in the xItemValue parameter. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION; +void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, + const TickType_t xItemValue ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; + +/* + * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE. THEY ARE USED BY + * THE EVENT BITS MODULE. + */ +TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * If a higher priority task attempting to obtain a mutex caused a lower + * priority task to inherit the higher priority task's priority - but the higher + * priority task then timed out without obtaining the mutex, then the lower + * priority task will disinherit the priority again - but only down as far as + * the highest priority task that is still waiting for the mutex (if there were + * more than one task waiting for the mutex). + */ +void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, + UBaseType_t uxHighestPriorityWaitingTask ) PRIVILEGED_FUNCTION; + +/* + * Get the uxTaskNumber assigned to the task referenced by the xTask parameter. + */ +UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +/* + * Set the uxTaskNumber of the task referenced by the xTask parameter to + * uxHandle. + */ +void vTaskSetTaskNumber( TaskHandle_t xTask, + const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION; + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * If tickless mode is being used, or a low power mode is implemented, then + * the tick interrupt will not execute during idle periods. When this is the + * case, the tick count value maintained by the scheduler needs to be kept up + * to date with the actual execution time by being skipped forward by a time + * equal to the idle period. + */ +void vTaskStepTick( TickType_t xTicksToJump ) PRIVILEGED_FUNCTION; + +/* + * Only available when configUSE_TICKLESS_IDLE is set to 1. + * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port + * specific sleep function to determine if it is ok to proceed with the sleep, + * and if it is ok to proceed, if it is ok to sleep indefinitely. + * + * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only + * called with the scheduler suspended, not from within a critical section. It + * is therefore possible for an interrupt to request a context switch between + * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being + * entered. eTaskConfirmSleepModeStatus() should be called from a short + * critical section between the timer being stopped and the sleep mode being + * entered to ensure it is ok to proceed into the sleep mode. + */ +eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Increment the mutex held count when a mutex is + * taken and return the handle of the task that has taken the mutex. + */ +TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Same as vTaskSetTimeOutState(), but without a critical + * section. + */ +void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; + + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ +#endif /* INC_TASK_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/timers.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/timers.h new file mode 100644 index 0000000..4b73908 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/timers.h @@ -0,0 +1,1369 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +/*lint -save -e537 This headers are only multiply included if the application code + * happens to also be including task.h. */ +#include "task.h" +/*lint -restore */ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- +* MACROS AND DEFINITIONS +*----------------------------------------------------------*/ + +/* IDs for commands that can be sent/received on the timer queue. These are to + * be used solely through the macros that make up the public software timer API, + * as defined below. The commands that are sent from interrupts must use the + * highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task + * or interrupt version of the queue send function should be used. */ +#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR ( ( BaseType_t ) -2 ) +#define tmrCOMMAND_EXECUTE_CALLBACK ( ( BaseType_t ) -1 ) +#define tmrCOMMAND_START_DONT_TRACE ( ( BaseType_t ) 0 ) +#define tmrCOMMAND_START ( ( BaseType_t ) 1 ) +#define tmrCOMMAND_RESET ( ( BaseType_t ) 2 ) +#define tmrCOMMAND_STOP ( ( BaseType_t ) 3 ) +#define tmrCOMMAND_CHANGE_PERIOD ( ( BaseType_t ) 4 ) +#define tmrCOMMAND_DELETE ( ( BaseType_t ) 5 ) + +#define tmrFIRST_FROM_ISR_COMMAND ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_START_FROM_ISR ( ( BaseType_t ) 6 ) +#define tmrCOMMAND_RESET_FROM_ISR ( ( BaseType_t ) 7 ) +#define tmrCOMMAND_STOP_FROM_ISR ( ( BaseType_t ) 8 ) +#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR ( ( BaseType_t ) 9 ) + + +/** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an TimerHandle_t variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +struct tmrTimerControl; /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +typedef struct tmrTimerControl * TimerHandle_t; + +/* + * Defines the prototype to which timer callback functions must conform. + */ +typedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer ); + +/* + * Defines the prototype to which functions used with the + * xTimerPendFunctionCallFromISR() function must conform. + */ +typedef void (* PendedFunction_t)( void *, + uint32_t ); + +/** + * TimerHandle_t xTimerCreate( const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * BaseType_t xAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. Time timer period must be greater than 0. + * + * @param xAutoReload If xAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If xAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @return If the timer is successfully created then a handle to the newly + * created timer is returned. If the timer cannot be created because there is + * insufficient FreeRTOS heap remaining to allocate the timer + * structures then NULL is returned. + * + * Example usage: + * @verbatim + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * TimerHandle_t xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( TimerHandle_t pxTimer ) + * { + * int32_t lArrayIndex; + * const int32_t xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * ( x + 1 ) ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION; +#endif + +/** + * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, + * TickType_t xTimerPeriodInTicks, + * BaseType_t xAutoReload, + * void * pvTimerID, + * TimerCallbackFunction_t pxCallbackFunction, + * StaticTimer_t *pxTimerBuffer ); + * + * Creates a new software timer instance, and returns a handle by which the + * created software timer can be referenced. + * + * Internally, within the FreeRTOS implementation, software timers use a block + * of memory, in which the timer data structure is stored. If a software timer + * is created using xTimerCreate() then the required memory is automatically + * dynamically allocated inside the xTimerCreate() function. (see + * https://www.FreeRTOS.org/a00111.html). If a software timer is created using + * xTimerCreateStatic() then the application writer must provide the memory that + * will get used by the software timer. xTimerCreateStatic() therefore allows a + * software timer to be created without using any dynamic memory allocation. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a + * timer into the active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer + * by its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick + * periods so the constant portTICK_PERIOD_MS can be used to convert a time that + * has been specified in milliseconds. For example, if the timer must expire + * after 100 ticks, then xTimerPeriodInTicks should be set to 100. + * Alternatively, if the timer must expire after 500ms, then xPeriod can be set + * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or + * equal to 1000. The timer period must be greater than 0. + * + * @param xAutoReload If xAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. + * If xAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by TimerCallbackFunction_t, + * which is "void vCallbackFunction( TimerHandle_t xTimer );". + * + * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which + * will be then be used to hold the software timer's data structures, removing + * the need for the memory to be allocated dynamically. + * + * @return If the timer is created then a handle to the created timer is + * returned. If pxTimerBuffer was NULL then NULL is returned. + * + * Example usage: + * @verbatim + * + * // The buffer used to hold the software timer's data structure. + * static StaticTimer_t xTimerBuffer; + * + * // A variable that will be incremented by the software timer's callback + * // function. + * UBaseType_t uxVariableToIncrement = 0; + * + * // A software timer callback function that increments a variable passed to + * // it when the software timer was created. After the 5th increment the + * // callback function stops the software timer. + * static void prvTimerCallback( TimerHandle_t xExpiredTimer ) + * { + * UBaseType_t *puxVariableToIncrement; + * BaseType_t xReturned; + * + * // Obtain the address of the variable to increment from the timer ID. + * puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer ); + * + * // Increment the variable to show the timer callback has executed. + * ( *puxVariableToIncrement )++; + * + * // If this callback has executed the required number of times, stop the + * // timer. + * if( *puxVariableToIncrement == 5 ) + * { + * // This is called from a timer callback so must not block. + * xTimerStop( xExpiredTimer, staticDONT_BLOCK ); + * } + * } + * + * + * void main( void ) + * { + * // Create the software time. xTimerCreateStatic() has an extra parameter + * // than the normal xTimerCreate() API function. The parameter is a pointer + * // to the StaticTimer_t structure that will hold the software timer + * // structure. If the parameter is passed as NULL then the structure will be + * // allocated dynamically, just as if xTimerCreate() had been called. + * xTimer = xTimerCreateStatic( "T1", // Text name for the task. Helps debugging only. Not used by FreeRTOS. + * xTimerPeriod, // The period of the timer in ticks. + * pdTRUE, // This is an auto-reload timer. + * ( void * ) &uxVariableToIncrement, // A variable incremented by the software timer's callback function + * prvTimerCallback, // The function to execute when the timer expires. + * &xTimerBuffer ); // The buffer that will hold the software timer structure. + * + * // The scheduler has not started yet so a block time is not used. + * xReturned = xTimerStart( xTimer, 0 ); + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) PRIVILEGED_FUNCTION; +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/** + * void *pvTimerGetTimerID( TimerHandle_t xTimer ); + * + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer, and by calling the + * vTimerSetTimerID() API function. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void * pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID ); + * + * Sets the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used as time specific (timer local) storage. + * + * @param xTimer The timer being updated. + * + * @param pvNewID The ID to assign to the timer. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ); + * + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * 1) It has been created but not started, or + * 2) It is an expired one-shot timer that has not been restarted. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + * @endverbatim + */ +BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ); + * + * Simply returns the handle of the timer service/daemon task. It it not valid + * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. + */ +TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xTicksToWait is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xTicksToWait is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xTicksToWait is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xTicksToWait ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. If the timer + * // referenced by xTimer is already active when it is called, then the timer + * // is deleted. If the timer referenced by xTimer is not active when it is + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( TimerHandle_t xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + * @endverbatim + */ +#define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xTicksToWait is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * through a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xTicksToWait Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xTicksToWait is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xTicksToWait ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer. + * + * TimerHandle_t xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * int32_t x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * vTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#define xTimerReset( xTimer, xTicksToWait ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) ) + +/** + * BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer, + * TickType_t xNewPeriod, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( TimerHandle_t pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * BaseType_t xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used). + * } + * } + * @endverbatim + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) \ + xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + + +/** + * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * BaseType_t *pxHigherPriorityTaskWoken ); + * + * + * Used from application interrupt service routines to defer the execution of a + * function to the RTOS daemon task (the timer service task, hence this function + * is implemented in timers.c and is prefixed with 'Timer'). + * + * Ideally an interrupt service routine (ISR) is kept as short as possible, but + * sometimes an ISR either has a lot of processing to do, or needs to perform + * processing that is not deterministic. In these cases + * xTimerPendFunctionCallFromISR() can be used to defer processing of a function + * to the RTOS daemon task. + * + * A mechanism is provided that allows the interrupt to return directly to the + * task that will subsequently execute the pended callback function. This + * allows the callback function to execute contiguously in time with the + * interrupt - just as if the callback had executed in the interrupt itself. + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param pxHigherPriorityTaskWoken As mentioned above, calling this function + * will result in a message being sent to the timer daemon task. If the + * priority of the timer daemon task (which is set using + * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of + * the currently running task (the task the interrupt interrupted) then + * *pxHigherPriorityTaskWoken will be set to pdTRUE within + * xTimerPendFunctionCallFromISR(), indicating that a context switch should be + * requested before the interrupt exits. For that reason + * *pxHigherPriorityTaskWoken must be initialised to pdFALSE. See the + * example code below. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + * Example usage: + * @verbatim + * + * // The callback function that will execute in the context of the daemon task. + * // Note callback functions must all use this same prototype. + * void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 ) + * { + * BaseType_t xInterfaceToService; + * + * // The interface that requires servicing is passed in the second + * // parameter. The first parameter is not used in this case. + * xInterfaceToService = ( BaseType_t ) ulParameter2; + * + * // ...Perform the processing here... + * } + * + * // An ISR that receives data packets from multiple interfaces + * void vAnISR( void ) + * { + * BaseType_t xInterfaceToService, xHigherPriorityTaskWoken; + * + * // Query the hardware to determine which interface needs processing. + * xInterfaceToService = prvCheckInterfaces(); + * + * // The actual processing is to be deferred to a task. Request the + * // vProcessInterface() callback function is executed, passing in the + * // number of the interface that needs processing. The interface to + * // service is passed in the second parameter. The first parameter is + * // not used in this case. + * xHigherPriorityTaskWoken = pdFALSE; + * xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken ); + * + * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context + * // switch should be requested. The macro used is port specific and will + * // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to + * // the documentation page for the port being used. + * portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + * + * } + * @endverbatim + */ +BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + * void *pvParameter1, + * uint32_t ulParameter2, + * TickType_t xTicksToWait ); + * + * + * Used to defer the execution of a function to the RTOS daemon task (the timer + * service task, hence this function is implemented in timers.c and is prefixed + * with 'Timer'). + * + * @param xFunctionToPend The function to execute from the timer service/ + * daemon task. The function must conform to the PendedFunction_t + * prototype. + * + * @param pvParameter1 The value of the callback function's first parameter. + * The parameter has a void * type to allow it to be used to pass any type. + * For example, unsigned longs can be cast to a void *, or the void * can be + * used to point to a structure. + * + * @param ulParameter2 The value of the callback function's second parameter. + * + * @param xTicksToWait Calling this function will result in a message being + * sent to the timer daemon task on a queue. xTicksToWait is the amount of + * time the calling task should remain in the Blocked state (so not using any + * processing time) for space to become available on the timer queue if the + * queue is found to be full. + * + * @return pdPASS is returned if the message was successfully sent to the + * timer daemon task, otherwise pdFALSE is returned. + * + */ +BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +/** + * const char * const pcTimerGetName( TimerHandle_t xTimer ); + * + * Returns the name that was assigned to a timer when the timer was created. + * + * @param xTimer The handle of the timer being queried. + * + * @return The name assigned to the timer specified by the xTimer parameter. + */ +const char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + +/** + * void vTimerSetReloadMode( TimerHandle_t xTimer, const BaseType_t xAutoReload ); + * + * Updates a timer to be either an auto-reload timer, in which case the timer + * automatically resets itself each time it expires, or a one-shot timer, in + * which case the timer will only expire once unless it is manually restarted. + * + * @param xTimer The handle of the timer being updated. + * + * @param xAutoReload If xAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the timer's period (see the + * xTimerPeriodInTicks parameter of the xTimerCreate() API function). If + * xAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + */ +void vTimerSetReloadMode( TimerHandle_t xTimer, + const BaseType_t xAutoReload ) PRIVILEGED_FUNCTION; + +/** + * BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer ); + * + * Queries a timer to determine if it is an auto-reload timer, in which case the timer + * automatically resets itself each time it expires, or a one-shot timer, in + * which case the timer will only expire once unless it is manually restarted. + * + * @param xTimer The handle of the timer being queried. + * + * @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise + * pdFALSE is returned. + */ +BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ); + * + * Queries a timer to determine if it is an auto-reload timer, in which case the timer + * automatically resets itself each time it expires, or a one-shot timer, in + * which case the timer will only expire once unless it is manually restarted. + * + * @param xTimer The handle of the timer being queried. + * + * @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise + * pdFALSE is returned. + */ +UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TickType_t xTimerGetPeriod( TimerHandle_t xTimer ); + * + * Returns the period of a timer. + * + * @param xTimer The handle of the timer being queried. + * + * @return The period of the timer in ticks. + */ +TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/** + * TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ); + * + * Returns the time in ticks at which the timer will expire. If this is less + * than the current tick count then the expiry time has overflowed from the + * current time. + * + * @param xTimer The handle of the timer being queried. + * + * @return If the timer is running then the time in ticks at which the timer + * will next expire is returned. If the timer is not running then the return + * value is undefined. + */ +TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; + +/* + * Functions beyond this part are not part of the public API and are intended + * for use by the kernel only. + */ +BaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; +BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION; + +#if ( configUSE_TRACE_FACILITY == 1 ) + void vTimerSetTimerNumber( TimerHandle_t xTimer, + UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION; + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION; +#endif + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + +/** + * task.h + * @code{c} + * void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, StackType_t ** ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ) + * @endcode + * + * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Timer Task TCB. This function is required when + * configSUPPORT_STATIC_ALLOCATION is set. For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION + * + * @param ppxTimerTaskTCBBuffer A handle to a statically allocated TCB buffer + * @param ppxTimerTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task + * @param pulTimerTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer + */ + void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, + StackType_t ** ppxTimerTaskStackBuffer, + uint32_t * pulTimerTaskStackSize ); + +#endif + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ +#endif /* TIMERS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/list.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/list.c new file mode 100644 index 0000000..0f4f42e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/list.c @@ -0,0 +1,226 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "list.h" + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be + * defined for the header files above, but not in this file, in order to + * generate the correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + +/*----------------------------------------------------------- +* PUBLIC LIST API documented in list.h +*----------------------------------------------------------*/ + +void vListInitialise( List_t * const pxList ) +{ + /* The list structure contains a list item which is used to mark the + * end of the list. To initialise the list the list end is inserted + * as the only list entry. */ + pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) ); + + /* The list end value is the highest possible value in the list to + * ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + + /* The list end next and previous pointers point to itself so we know + * when the list is empty. */ + pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + /* Initialize the remaining fields of xListEnd when it is a proper ListItem_t */ + #if ( configUSE_MINI_LIST_ITEM == 0 ) + { + pxList->xListEnd.pvOwner = NULL; + pxList->xListEnd.pxContainer = NULL; + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) ); + } + #endif + + pxList->uxNumberOfItems = ( UBaseType_t ) 0U; + + /* Write known values into the list if + * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); + listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( ListItem_t * const pxItem ) +{ + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pxContainer = NULL; + + /* Write known values into the list item if + * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ + listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); + listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( List_t * const pxList, + ListItem_t * const pxNewListItem ) +{ + ListItem_t * const pxIndex = pxList->pxIndex; + + /* Only effective when configASSERT() is also defined, these tests may catch + * the list data structures being overwritten in memory. They will not catch + * data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert a new list item into pxList, but rather than sort the list, + * makes the new list item the last item to be removed by a call to + * listGET_OWNER_OF_NEXT_ENTRY(). */ + pxNewListItem->pxNext = pxIndex; + pxNewListItem->pxPrevious = pxIndex->pxPrevious; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pxContainer = pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListInsert( List_t * const pxList, + ListItem_t * const pxNewListItem ) +{ + ListItem_t * pxIterator; + const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; + + /* Only effective when configASSERT() is also defined, these tests may catch + * the list data structures being overwritten in memory. They will not catch + * data errors caused by incorrect configuration or use of FreeRTOS. */ + listTEST_LIST_INTEGRITY( pxList ); + listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); + + /* Insert the new list item into the list, sorted in xItemValue order. + * + * If the list already contains a list item with the same item value then the + * new list item should be placed after it. This ensures that TCBs which are + * stored in ready lists (all of which have the same xItemValue value) get a + * share of the CPU. However, if the xItemValue is the same as the back marker + * the iteration loop below will not end. Therefore the value is checked + * first, and the algorithm slightly modified if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + * If you find your application is crashing here then likely causes are + * listed below. In addition see https://www.FreeRTOS.org/FAQHelp.html for + * more tips, and ensure configASSERT() is defined! + * https://www.FreeRTOS.org/a00110.html#configASSERT + * + * 1) Stack overflow - + * see https://www.FreeRTOS.org/Stacks-and-stack-overflow-checking.html + * 2) Incorrect interrupt priority assignment, especially on Cortex-M + * parts where numerically high priority values denote low actual + * interrupt priorities, which can seem counter intuitive. See + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html and the definition + * of configMAX_SYSCALL_INTERRUPT_PRIORITY on + * https://www.FreeRTOS.org/a00110.html + * 3) Calling an API function from within a critical section or when + * the scheduler is suspended, or calling an API function that does + * not end in "FromISR" from an interrupt. + * 4) Using a queue or semaphore before it has been initialised or + * before the scheduler has been started (are interrupts firing + * before vTaskStartScheduler() has been called?). + * 5) If the FreeRTOS port supports interrupt nesting then ensure that + * the priority of the tick interrupt is at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + **********************************************************************/ + + for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */ + { + /* There is nothing to do here, just iterating to the wanted + * insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = pxNewListItem; + + /* Remember which list the item is in. This allows fast removal of the + * item later. */ + pxNewListItem->pxContainer = pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) +{ +/* The list item knows which list it is in. Obtain the list from the list + * item. */ + List_t * const pxList = pxItemToRemove->pxContainer; + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* Only used during decision coverage testing. */ + mtCOVERAGE_TEST_DELAY(); + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxItemToRemove->pxContainer = NULL; + ( pxList->uxNumberOfItems )--; + + return pxList->uxNumberOfItems; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/manifest.yml b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/manifest.yml new file mode 100644 index 0000000..211e3c2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/manifest.yml @@ -0,0 +1,4 @@ +name : "FreeRTOS-Kernel" +version: "v10.5.1" +description: "FreeRTOS Kernel." +license: "MIT" diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMClang/Use-the-GCC-ports.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMClang/Use-the-GCC-ports.txt new file mode 100644 index 0000000..d2c3a86 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMClang/Use-the-GCC-ports.txt @@ -0,0 +1,2 @@ +The FreeRTOS GCC port layer also builds and works with the ARMClang compiler. +To use the ARMClang compiler build the port files from FreeRTOS/Source/portable/GCC. \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/ReadMe.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/ReadMe.txt new file mode 100644 index 0000000..3f864bb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/ReadMe.txt @@ -0,0 +1,11 @@ +This directory tree contains the master copy of the FreeeRTOS Armv8-M and +Armv8.1-M ports. +Do not use the files located here! These file are copied into separate +FreeRTOS/Source/portable/[compiler]/ARM_CM[23|33|55|85]_NNN directories prior to each +FreeRTOS release. + +If your Armv8-M and Armv8.1-M application uses TrustZone then use the files from the +FreeRTOS/Source/portable/[compiler]/ARM_CM[23|33|55|85] directories. + +If your Armv8-M and Armv8.1-M application does not use TrustZone then use the files from +the FreeRTOS/Source/portable/[compiler]/ARM_CM[23|33|55|85]_NTZ directories. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/copy_files.py b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/copy_files.py new file mode 100644 index 0000000..d73d5b9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/copy_files.py @@ -0,0 +1,152 @@ +#/* +# * FreeRTOS Kernel V10.5.1 +# * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# * +# * SPDX-License-Identifier: MIT +# * +# * Permission is hereby granted, free of charge, to any person obtaining a copy of +# * this software and associated documentation files (the "Software"), to deal in +# * the Software without restriction, including without limitation the rights to +# * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +# * the Software, and to permit persons to whom the Software is furnished to do so, +# * subject to the following conditions: +# * +# * The above copyright notice and this permission notice shall be included in all +# * copies or substantial portions of the Software. +# * +# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +# * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +# * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +# * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# * +# * https://www.FreeRTOS.org +# * https://github.com/FreeRTOS +# * +# */ + +import os +import shutil + +_THIS_FILE_DIRECTORY_ = os.path.dirname(os.path.realpath(__file__)) +_FREERTOS_PORTABLE_DIRECTORY_ = os.path.dirname(_THIS_FILE_DIRECTORY_) + +_COMPILERS_ = ['GCC', 'IAR'] +_ARCH_NS_ = ['ARM_CM85', 'ARM_CM85_NTZ', 'ARM_CM55', 'ARM_CM55_NTZ', 'ARM_CM33', 'ARM_CM33_NTZ', 'ARM_CM23', 'ARM_CM23_NTZ'] +_ARCH_S_ = ['ARM_CM85', 'ARM_CM55', 'ARM_CM33', 'ARM_CM23'] + +# Files to be compiled in the Secure Project +_SECURE_COMMON_FILE_PATHS_ = [ + os.path.join('secure', 'context'), + os.path.join('secure', 'heap'), + os.path.join('secure', 'init'), + os.path.join('secure', 'macros') +] + +_SECURE_PORTABLE_FILE_PATHS_ = { + 'GCC':{ + 'ARM_CM23':[os.path.join('secure', 'context', 'portable', 'GCC', 'ARM_CM23')], + 'ARM_CM33':[os.path.join('secure', 'context', 'portable', 'GCC', 'ARM_CM33')], + 'ARM_CM55':[os.path.join('secure', 'context', 'portable', 'GCC', 'ARM_CM33')], + 'ARM_CM85':[os.path.join('secure', 'context', 'portable', 'GCC', 'ARM_CM33')] + }, + 'IAR':{ + 'ARM_CM23':[os.path.join('secure', 'context', 'portable', 'IAR', 'ARM_CM23')], + 'ARM_CM33':[os.path.join('secure', 'context', 'portable', 'IAR', 'ARM_CM33')], + 'ARM_CM55':[os.path.join('secure', 'context', 'portable', 'IAR', 'ARM_CM33')], + 'ARM_CM85':[os.path.join('secure', 'context', 'portable', 'IAR', 'ARM_CM33')] + } +} + +# Files to be compiled in the Non-Secure Project +_NONSECURE_COMMON_FILE_PATHS_ = [ + 'non_secure' +] + +_NONSECURE_PORTABLE_FILE_PATHS_ = { + 'GCC':{ + 'ARM_CM23' : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM23')], + 'ARM_CM23_NTZ' : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM23_NTZ')], + 'ARM_CM33' : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33')], + 'ARM_CM33_NTZ' : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ')], + 'ARM_CM55' : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33', 'portasm.c'), + os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM55', 'portmacro.h')], + 'ARM_CM55_NTZ' : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ', 'portasm.c'), + os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM55', 'portmacro.h')], + 'ARM_CM85' : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33', 'portasm.c'), + os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM85', 'portmacro.h')], + 'ARM_CM85_NTZ' : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ', 'portasm.c'), + os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM85', 'portmacro.h')] + }, + 'IAR':{ + 'ARM_CM23' : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM23')], + 'ARM_CM23_NTZ' : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM23_NTZ')], + 'ARM_CM33' : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33')], + 'ARM_CM33_NTZ' : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ')], + 'ARM_CM55' : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33', 'portasm.s'), + os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM55', 'portmacro.h')], + 'ARM_CM55_NTZ' : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ', 'portasm.s'), + os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM55', 'portmacro.h')], + 'ARM_CM85' : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33', 'portasm.s'), + os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM85', 'portmacro.h')], + 'ARM_CM85_NTZ' : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ', 'portasm.s'), + os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM85', 'portmacro.h')] + }, +} + + +def copy_files_in_dir(src_abs_path, dst_abs_path): + if os.path.isfile(src_abs_path): + print('Src: {}'.format(src_abs_path)) + print('Dst: {}\n'.format(dst_abs_path)) + shutil.copy2(src_abs_path, dst_abs_path) + else: + for src_file in os.listdir(src_abs_path): + src_file_abs_path = os.path.join(src_abs_path, src_file) + if os.path.isfile(src_file_abs_path) and src_file != 'ReadMe.txt': + if not os.path.exists(dst_abs_path): + os.makedirs(dst_abs_path) + print('Src: {}'.format(src_file_abs_path)) + print('Dst: {}\n'.format(dst_abs_path)) + shutil.copy2(src_file_abs_path, dst_abs_path) + + +def copy_common_files_for_compiler_and_arch(compiler, arch, src_paths, dst_path): + for src_path in src_paths: + + src_abs_path = os.path.join(_THIS_FILE_DIRECTORY_, src_path) + dst_abs_path = os.path.join(_FREERTOS_PORTABLE_DIRECTORY_, compiler, arch, dst_path) + + copy_files_in_dir(src_abs_path, dst_abs_path) + + +def copy_portable_files_for_compiler_and_arch(compiler, arch, src_paths, dst_path): + for src_path in src_paths[compiler][arch]: + + src_abs_path = os.path.join(_THIS_FILE_DIRECTORY_, src_path) + dst_abs_path = os.path.join(_FREERTOS_PORTABLE_DIRECTORY_, compiler, arch, dst_path) + + copy_files_in_dir(src_abs_path, dst_abs_path) + + +def copy_files(): + # Copy Secure Files + for compiler in _COMPILERS_: + for arch in _ARCH_S_: + copy_common_files_for_compiler_and_arch(compiler, arch, _SECURE_COMMON_FILE_PATHS_, 'secure') + copy_portable_files_for_compiler_and_arch(compiler, arch, _SECURE_PORTABLE_FILE_PATHS_, 'secure') + + # Copy Non-Secure Files + for compiler in _COMPILERS_: + for arch in _ARCH_NS_: + copy_common_files_for_compiler_and_arch(compiler, arch, _NONSECURE_COMMON_FILE_PATHS_, 'non_secure') + copy_portable_files_for_compiler_and_arch(compiler, arch, _NONSECURE_PORTABLE_FILE_PATHS_, 'non_secure') + + +def main(): + copy_files() + + +if __name__ == '__main__': + main() diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/ReadMe.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/ReadMe.txt new file mode 100644 index 0000000..ed40fb6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/ReadMe.txt @@ -0,0 +1,11 @@ +This directory tree contains the master copy of the FreeRTOS Armv8-M and +Armv8.1-M ports. +Do not use the files located here! These file are copied into separate +FreeRTOS/Source/portable/[compiler]/ARM_CM[23|33|55|85]_NNN directories prior to +each FreeRTOS release. + +If your Armv8-M/Armv8.1-M application uses TrustZone then use the files from the +FreeRTOS/Source/portable/[compiler]/ARM_CM[23|33|55|85] directories. + +If your Armv8-M/Armv8.1-M application does not use TrustZone then use the files from +the FreeRTOS/Source/portable/[compiler]/ARM_CM[23|33|55|85]_NTZ directories. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c new file mode 100644 index 0000000..c3a9782 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c @@ -0,0 +1,478 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r3, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r3] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r5, #1 \n"/* r5 = 1. */ + " bics r4, r5 \n"/* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + " ldr r4, [r3] \n"/* r4 = *r3 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + " movs r5, #4 \n"/* r5 = 4. */ + " str r5, [r2] \n"/* Program RNR = 4. */ + " ldmia r3!, {r6,r7} \n"/* Read first set of RBAR/RLAR from TCB. */ + " ldr r4, xRBARConst2 \n"/* r4 = 0xe000ed9c [Location of RBAR]. */ + " stmia r4!, {r6,r7} \n"/* Write first set of RBAR/RLAR registers. */ + " movs r5, #5 \n"/* r5 = 5. */ + " str r5, [r2] \n"/* Program RNR = 5. */ + " ldmia r3!, {r6,r7} \n"/* Read second set of RBAR/RLAR from TCB. */ + " ldr r4, xRBARConst2 \n"/* r4 = 0xe000ed9c [Location of RBAR]. */ + " stmia r4!, {r6,r7} \n"/* Write second set of RBAR/RLAR registers. */ + " movs r5, #6 \n"/* r5 = 6. */ + " str r5, [r2] \n"/* Program RNR = 6. */ + " ldmia r3!, {r6,r7} \n"/* Read third set of RBAR/RLAR from TCB. */ + " ldr r4, xRBARConst2 \n"/* r4 = 0xe000ed9c [Location of RBAR]. */ + " stmia r4!, {r6,r7} \n"/* Write third set of RBAR/RLAR registers. */ + " movs r5, #7 \n"/* r5 = 7. */ + " str r5, [r2] \n"/* Program RNR = 7. */ + " ldmia r3!, {r6,r7} \n"/* Read fourth set of RBAR/RLAR from TCB. */ + " ldr r4, xRBARConst2 \n"/* r4 = 0xe000ed9c [Location of RBAR]. */ + " stmia r4!, {r6,r7} \n"/* Write fourth set of RBAR/RLAR registers. */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r5, #1 \n"/* r5 = 1. */ + " orrs r4, r5 \n"/* r4 = r4 | r5 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r4} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + " ldr r5, xSecureContextConst2 \n" + " str r1, [r5] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " msr control, r3 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r4 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + " ldr r4, xSecureContextConst2 \n" + " str r1, [r4] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + "xSecureContextConst2: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " movs r1, #1 \n"/* r1 = 1. */ + " tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */ + " beq running_privileged \n"/* If the result of previous AND operation was 0, branch. */ + " movs r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " bx lr \n"/* Return. */ + " running_privileged: \n" + " movs r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " movs r1, #1 \n"/* r1 = 1. */ + " bics r0, r1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " movs r1, #1 \n"/* r1 = 1. */ + " orrs r0, r1 \n"/* r0 = r0 | r1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr \n" + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr PRIMASK, r0 \n" + " bx lr \n" + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " .extern SecureContext_SaveContext \n" + " .extern SecureContext_LoadContext \n" + " \n" + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " ldr r0, [r3] \n"/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later.*/ + " mrs r2, psp \n"/* Read PSP in r2. */ + " \n" + " cbz r0, save_ns_context \n"/* No secure context to save. */ + " push {r0-r2, r14} \n" + " bl SecureContext_SaveContext \n"/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r0-r3} \n"/* LR is now in r3. */ + " mov lr, r3 \n"/* LR = r3. */ + " lsls r1, r3, #25 \n"/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl save_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #16 \n"/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #12 \n"/* Make space for xSecureContext, PSPLIM and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " b select_next_task \n" + " \n" + " save_ns_context: \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #48 \n"/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #16 \n"/* r2 = r2 + 16. */ + " stmia r2!, {r4-r7} \n"/* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n"/* r4 = r8. */ + " mov r5, r9 \n"/* r5 = r9. */ + " mov r6, r10 \n"/* r6 = r10. */ + " mov r7, r11 \n"/* r7 = r11. */ + " stmia r2!, {r4-r7} \n"/* Store the high registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " subs r2, r2, #48 \n"/* r2 = r2 - 48. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #44 \n"/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3-r7} \n"/* Store xSecureContext, PSPLIM, LR and the low registers that are not saved automatically. */ + " mov r4, r8 \n"/* r4 = r8. */ + " mov r5, r9 \n"/* r5 = r9. */ + " mov r6, r10 \n"/* r6 = r10. */ + " mov r7, r11 \n"/* r7 = r11. */ + " stmia r2!, {r4-r7} \n"/* Store the high registers that are not saved automatically. */ + #endif /* configENABLE_MPU */ + " \n" + " select_next_task: \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " ldr r2, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " movs r5, #1 \n"/* r5 = 1. */ + " bics r4, r5 \n"/* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */ + " str r4, [r3] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r3, xMAIR0Const \n"/* r3 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r3] \n"/* Program MAIR0. */ + " ldr r4, xRNRConst \n"/* r4 = 0xe000ed98 [Location of RNR]. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " movs r5, #4 \n"/* r5 = 4. */ + " str r5, [r4] \n"/* Program RNR = 4. */ + " ldmia r1!, {r6,r7} \n"/* Read first set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r6,r7} \n"/* Write first set of RBAR/RLAR registers. */ + " movs r5, #5 \n"/* r5 = 5. */ + " str r5, [r4] \n"/* Program RNR = 5. */ + " ldmia r1!, {r6,r7} \n"/* Read second set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r6,r7} \n"/* Write second set of RBAR/RLAR registers. */ + " movs r5, #6 \n"/* r5 = 6. */ + " str r5, [r4] \n"/* Program RNR = 6. */ + " ldmia r1!, {r6,r7} \n"/* Read third set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r6,r7} \n"/* Write third set of RBAR/RLAR registers. */ + " movs r5, #7 \n"/* r5 = 7. */ + " str r5, [r4] \n"/* Program RNR = 7. */ + " ldmia r1!, {r6,r7} \n"/* Read fourth set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r6,r7} \n"/* Write fourth set of RBAR/RLAR registers. */ + " \n" + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " movs r5, #1 \n"/* r5 = 1. */ + " orrs r4, r5 \n"/* r4 = r4 | r5 i.e. Set the bit 0 in r4. */ + " str r4, [r3] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r2!, {r0, r1, r3, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r3 \n"/* Restore the CONTROL register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #else /* configENABLE_MPU */ + " ldmia r2!, {r0, r1, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #endif /* configENABLE_MPU */ + " \n" + " restore_ns_context: \n" + " adds r2, r2, #16 \n"/* Move to the high registers. */ + " ldmia r2!, {r4-r7} \n"/* Restore the high registers that are not automatically restored. */ + " mov r8, r4 \n"/* r8 = r4. */ + " mov r9, r5 \n"/* r9 = r5. */ + " mov r10, r6 \n"/* r10 = r6. */ + " mov r11, r7 \n"/* r11 = r7. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " subs r2, r2, #32 \n"/* Go back to the low registers. */ + " ldmia r2!, {r4-r7} \n"/* Restore the low registers that are not automatically restored. */ + " bx lr \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + "xSecureContextConst: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " movs r0, #4 \n" + " mov r1, lr \n" + " tst r0, r1 \n" + " beq stacking_used_msp \n" + " mrs r0, psp \n" + " ldr r2, svchandler_address_const \n" + " bx r2 \n" + " stacking_used_msp: \n" + " mrs r0, msp \n" + " ldr r2, svchandler_address_const \n" + " bx r2 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " svc %0 \n"/* Secure context is allocated in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */ + " ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */ + " cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */ + " bne free_secure_context \n"/* Branch if r1 != 0. */ + " bx lr \n"/* There is no secure context (xSecureContext is NULL). */ + " free_secure_context: \n" + " svc %0 \n"/* Secure context is freed in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_FREE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h new file mode 100644 index 0000000..6852153 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M23" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c new file mode 100644 index 0000000..b668d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c @@ -0,0 +1,381 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r4, #1 \n"/* r4 = 1. */ + " bics r3, r4 \n"/* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r2] \n"/* Program RNR = 4. */ + " ldmia r1!, {r5,r6} \n"/* Read first set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst2 \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write first set of RBAR/RLAR registers. */ + " movs r4, #5 \n"/* r4 = 5. */ + " str r4, [r2] \n"/* Program RNR = 5. */ + " ldmia r1!, {r5,r6} \n"/* Read second set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst2 \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write second set of RBAR/RLAR registers. */ + " movs r4, #6 \n"/* r4 = 6. */ + " str r4, [r2] \n"/* Program RNR = 6. */ + " ldmia r1!, {r5,r6} \n"/* Read third set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst2 \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write third set of RBAR/RLAR registers. */ + " movs r4, #7 \n"/* r4 = 7. */ + " str r4, [r2] \n"/* Program RNR = 7. */ + " ldmia r1!, {r5,r6} \n"/* Read fourth set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst2 \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write fourth set of RBAR/RLAR registers. */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r4, #1 \n"/* r4 = 1. */ + " orrs r3, r4 \n"/* r3 = r3 | r4 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " msr control, r2 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r2} \n"/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r2 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " movs r1, #1 \n"/* r1 = 1. */ + " tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */ + " beq running_privileged \n"/* If the result of previous AND operation was 0, branch. */ + " movs r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " bx lr \n"/* Return. */ + " running_privileged: \n" + " movs r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " movs r1, #1 \n"/* r1 = 1. */ + " bics r0, r1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " movs r1, #1 \n"/* r1 = 1. */ + " orrs r0, r1 \n"/* r0 = r0 | r1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr \n" + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr PRIMASK, r0 \n" + " bx lr \n" + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, psp \n"/* Read PSP in r0. */ + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + #if ( configENABLE_MPU == 1 ) + " subs r0, r0, #44 \n"/* Make space for PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + " str r0, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r2, control \n"/* r2 = CONTROL. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r0!, {r1-r7} \n"/* Store on the stack - PSPLIM, CONTROL, LR and low registers that are not automatically saved. */ + " mov r4, r8 \n"/* r4 = r8. */ + " mov r5, r9 \n"/* r5 = r9. */ + " mov r6, r10 \n"/* r6 = r10. */ + " mov r7, r11 \n"/* r7 = r11. */ + " stmia r0!, {r4-r7} \n"/* Store the high registers that are not saved automatically. */ + #else /* configENABLE_MPU */ + " subs r0, r0, #40 \n"/* Make space for PSPLIM, LR and the remaining registers on the stack. */ + " str r0, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r2, psplim \n"/* r2 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r0!, {r2-r7} \n"/* Store on the stack - PSPLIM, LR and low registers that are not automatically saved. */ + " mov r4, r8 \n"/* r4 = r8. */ + " mov r5, r9 \n"/* r5 = r9. */ + " mov r6, r10 \n"/* r6 = r10. */ + " mov r7, r11 \n"/* r7 = r11. */ + " stmia r0!, {r4-r7} \n"/* Store the high registers that are not saved automatically. */ + #endif /* configENABLE_MPU */ + " \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r4, #1 \n"/* r4 = 1. */ + " bics r3, r4 \n"/* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r2] \n"/* Program RNR = 4. */ + " ldmia r1!, {r5,r6} \n"/* Read first set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write first set of RBAR/RLAR registers. */ + " movs r4, #5 \n"/* r4 = 5. */ + " str r4, [r2] \n"/* Program RNR = 5. */ + " ldmia r1!, {r5,r6} \n"/* Read second set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write second set of RBAR/RLAR registers. */ + " movs r4, #6 \n"/* r4 = 6. */ + " str r4, [r2] \n"/* Program RNR = 6. */ + " ldmia r1!, {r5,r6} \n"/* Read third set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write third set of RBAR/RLAR registers. */ + " movs r4, #7 \n"/* r4 = 7. */ + " str r4, [r2] \n"/* Program RNR = 7. */ + " ldmia r1!, {r5,r6} \n"/* Read fourth set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write fourth set of RBAR/RLAR registers. */ + " \n" + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r4, #1 \n"/* r4 = 1. */ + " orrs r3, r4 \n"/* r3 = r3 | r4 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " adds r0, r0, #28 \n"/* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n"/* Restore the high registers that are not automatically restored. */ + " mov r8, r4 \n"/* r8 = r4. */ + " mov r9, r5 \n"/* r9 = r5. */ + " mov r10, r6 \n"/* r10 = r6. */ + " mov r11, r7 \n"/* r11 = r7. */ + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " subs r0, r0, #44 \n"/* Move to the starting of the saved context. */ + " ldmia r0!, {r1-r7} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r7 restored. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r2 \n"/* Restore the CONTROL register value for the task. */ + " bx r3 \n" + #else /* configENABLE_MPU */ + " adds r0, r0, #24 \n"/* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n"/* Restore the high registers that are not automatically restored. */ + " mov r8, r4 \n"/* r8 = r4. */ + " mov r9, r5 \n"/* r9 = r5. */ + " mov r10, r6 \n"/* r10 = r6. */ + " mov r11, r7 \n"/* r11 = r7. */ + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " subs r0, r0, #40 \n"/* Move to the starting of the saved context. */ + " ldmia r0!, {r2-r7} \n"/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r7 restored. */ + " msr psplim, r2 \n"/* Restore the PSPLIM register value for the task. */ + " bx r3 \n" + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " movs r0, #4 \n" + " mov r1, lr \n" + " tst r0, r1 \n" + " beq stacking_used_msp \n" + " mrs r0, psp \n" + " ldr r2, svchandler_address_const \n" + " bx r2 \n" + " stacking_used_msp: \n" + " mrs r0, msp \n" + " ldr r2, svchandler_address_const \n" + " bx r2 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h new file mode 100644 index 0000000..6852153 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M23" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c new file mode 100644 index 0000000..3424b42 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c @@ -0,0 +1,470 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r3, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r3] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + " ldr r4, [r3] \n"/* r4 = *r3 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r2] \n"/* Program RNR = 4. */ + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #8 \n"/* r4 = 8. */ + " str r4, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #12 \n"/* r4 = 12. */ + " str r4, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r4} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + " ldr r5, xSecureContextConst2 \n" + " str r1, [r5] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " msr control, r3 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r4 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + " ldr r4, xSecureContextConst2 \n" + " str r1, [r4] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + "xSecureContextConst2: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " bic r0, #1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */ + " mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr basepri, r0 \n"/* basepri = ulMask. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " .extern SecureContext_SaveContext \n" + " .extern SecureContext_LoadContext \n" + " \n" + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " ldr r0, [r3] \n"/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + " mrs r2, psp \n"/* Read PSP in r2. */ + " \n" + " cbz r0, save_ns_context \n"/* No secure context to save. */ + " push {r0-r2, r14} \n" + " bl SecureContext_SaveContext \n"/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r0-r3} \n"/* LR is now in r3. */ + " mov lr, r3 \n"/* LR = r3. */ + " lsls r1, r3, #25 \n"/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl save_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB.*/ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #16 \n"/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #12 \n"/* Make space for xSecureContext, PSPLIM and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " b select_next_task \n" + " \n" + " save_ns_context: \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vstmdbeq r2!, {s16-s31} \n"/* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #48 \n"/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #16 \n"/* r2 = r2 + 16. */ + " stm r2, {r4-r11} \n"/* Store the registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " subs r2, r2, #16 \n"/* r2 = r2 - 16. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #44 \n"/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #12 \n"/* r2 = r2 + 12. */ + " stm r2, {r4-r11} \n"/* Store the registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " subs r2, r2, #12 \n"/* r2 = r2 - 12. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " \n" + " select_next_task: \n" + " mov r0, %0 \n"/* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */ + " msr basepri, r0 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n"/* r0 = 0. */ + " msr basepri, r0 \n"/* Enable interrupts. */ + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " ldr r2, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r3] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r3, xMAIR0Const \n"/* r3 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r3] \n"/* Program MAIR0. */ + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r3] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #8 \n"/* r4 = 8. */ + " str r4, [r3] \n"/* Program RNR = 8. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #12 \n"/* r4 = 12. */ + " str r4, [r3] \n"/* Program RNR = 12. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r3] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r2!, {r0, r1, r3, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r3 \n"/* Restore the CONTROL register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #else /* configENABLE_MPU */ + " ldmia r2!, {r0, r1, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #endif /* configENABLE_MPU */ + " \n" + " restore_ns_context: \n" + " ldmia r2!, {r4-r11} \n"/* Restore the registers that are not automatically restored. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vldmiaeq r2!, {s16-s31} \n"/* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + "xSecureContextConst: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, svchandler_address_const \n" + " bx r1 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " svc %0 \n"/* Secure context is allocated in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */ + " ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */ + " cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */ + " it ne \n" + " svcne %0 \n"/* Secure context is freed in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_FREE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h new file mode 100644 index 0000000..82f937a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M33" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c new file mode 100644 index 0000000..3a97911 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c @@ -0,0 +1,365 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r3, [r1] \n"/* r3 = *r1 i.e. r3 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r3, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #4 \n"/* r3 = 4. */ + " str r3, [r2] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #8 \n"/* r3 = 8. */ + " str r3, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #12 \n"/* r3 = 12. */ + " str r3, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " msr control, r2 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r2} \n"/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r2 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " bic r0, #1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */ + " mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr basepri, r0 \n"/* basepri = ulMask. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, psp \n"/* Read PSP in r0. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n"/* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r2, control \n"/* r2 = CONTROL. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmdb r0!, {r1-r11} \n"/* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */ + #else /* configENABLE_MPU */ + " mrs r2, psplim \n"/* r2 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmdb r0!, {r2-r11} \n"/* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */ + #endif /* configENABLE_MPU */ + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " str r0, [r1] \n"/* Save the new top of stack in TCB. */ + " \n" + " mov r0, %0 \n"/* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */ + " msr basepri, r0 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n"/* r0 = 0. */ + " msr basepri, r0 \n"/* Enable interrupts. */ + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r3, [r1] \n"/* r3 = *r1 i.e. r3 = MAIR0. */ + " ldr r2, xMAIR0Const \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r3, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #4 \n"/* r3 = 4. */ + " str r3, [r2] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #8 \n"/* r3 = 8. */ + " str r3, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #12 \n"/* r3 = 12. */ + " str r3, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r0!, {r1-r11} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */ + #else /* configENABLE_MPU */ + " ldmia r0!, {r2-r11} \n"/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst r3, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n"/* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " \n" + #if ( configENABLE_MPU == 1 ) + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r2 \n"/* Restore the CONTROL register value for the task. */ + #else /* configENABLE_MPU */ + " msr psplim, r2 \n"/* Restore the PSPLIM register value for the task. */ + #endif /* configENABLE_MPU */ + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " bx r3 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, svchandler_address_const \n" + " bx r1 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h new file mode 100644 index 0000000..82f937a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M33" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h new file mode 100644 index 0000000..33fc5f5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M55" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h new file mode 100644 index 0000000..2375987 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M85" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s new file mode 100644 index 0000000..6e658f8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s @@ -0,0 +1,391 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN xSecureContext + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + EXTERN SecureContext_SaveContext + EXTERN SecureContext_LoadContext + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vPortAllocateSecureContext + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler + PUBLIC vPortFreeSecureContext + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + movs r1, #1 /* r1 = 1. */ + tst r0, r1 /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */ + beq running_privileged /* If the result of previous AND operation was 0, branch. */ + movs r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + bx lr /* Return. */ + running_privileged: + movs r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + movs r1, #1 /* r1 = 1. */ + orrs r0, r1 /* r0 = r0 | r1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vPortAllocateSecureContext: + svc 0 /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r3, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r3] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + movs r5, #1 /* r5 = 1. */ + bics r4, r5 /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r3, #4 /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + ldr r4, [r3] /* r4 = *r3 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + adds r3, #4 /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + movs r5, #4 /* r5 = 4. */ + str r5, [r2] /* Program RNR = 4. */ + ldmia r3!, {r6,r7} /* Read first set of RBAR/RLAR from TCB. */ + ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */ + stmia r4!, {r6,r7} /* Write first set of RBAR/RLAR registers. */ + movs r5, #5 /* r5 = 5. */ + str r5, [r2] /* Program RNR = 5. */ + ldmia r3!, {r6,r7} /* Read second set of RBAR/RLAR from TCB. */ + ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */ + stmia r4!, {r6,r7} /* Write second set of RBAR/RLAR registers. */ + movs r5, #6 /* r5 = 6. */ + str r5, [r2] /* Program RNR = 6. */ + ldmia r3!, {r6,r7} /* Read third set of RBAR/RLAR from TCB. */ + ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */ + stmia r4!, {r6,r7} /* Write third set of RBAR/RLAR registers. */ + movs r5, #7 /* r5 = 7. */ + str r5, [r2] /* Program RNR = 7. */ + ldmia r3!, {r6,r7} /* Read fourth set of RBAR/RLAR from TCB. */ + ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */ + stmia r4!, {r6,r7} /* Write fourth set of RBAR/RLAR registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + movs r5, #1 /* r5 = 1. */ + orrs r4, r5 /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r4} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + ldr r5, =xSecureContext + str r1, [r5] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + msr control, r3 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + bx r4 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r3} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + ldr r4, =xSecureContext + str r1, [r4] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + bx r3 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + movs r1, #1 /* r1 = 1. */ + bics r0, r1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, PRIMASK + cpsid i + bx lr +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr PRIMASK, r0 + bx lr +/*-----------------------------------------------------------*/ + +PendSV_Handler: + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + ldr r0, [r3] /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + mrs r2, psp /* Read PSP in r2. */ + + cbz r0, save_ns_context /* No secure context to save. */ + push {r0-r2, r14} + bl SecureContext_SaveContext /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r0-r3} /* LR is now in r3. */ + mov lr, r3 /* LR = r3. */ + lsls r1, r3, #25 /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl save_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ +#if ( configENABLE_MPU == 1 ) + subs r2, r2, #16 /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ +#else /* configENABLE_MPU */ + subs r2, r2, #12 /* Make space for xSecureContext, PSPLIM and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ +#endif /* configENABLE_MPU */ + b select_next_task + + save_ns_context: + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + #if ( configENABLE_MPU == 1 ) + subs r2, r2, #48 /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #16 /* r2 = r2 + 16. */ + stmia r2!, {r4-r7} /* Store the low registers that are not saved automatically. */ + mov r4, r8 /* r4 = r8. */ + mov r5, r9 /* r5 = r9. */ + mov r6, r10 /* r6 = r10. */ + mov r7, r11 /* r7 = r11. */ + stmia r2!, {r4-r7} /* Store the high registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + subs r2, r2, #48 /* r2 = r2 - 48. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + subs r2, r2, #44 /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3-r7} /* Store xSecureContext, PSPLIM, LR and the low registers that are not saved automatically. */ + mov r4, r8 /* r4 = r8. */ + mov r5, r9 /* r5 = r9. */ + mov r6, r10 /* r6 = r10. */ + mov r7, r11 /* r7 = r11. */ + stmia r2!, {r4-r7} /* Store the high registers that are not saved automatically. */ + #endif /* configENABLE_MPU */ + + select_next_task: + cpsid i + bl vTaskSwitchContext + cpsie i + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + ldr r2, [r1] /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + + #if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + movs r5, #1 /* r5 = 1. */ + bics r4, r5 /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */ + str r4, [r3] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r3, =0xe000edc0 /* r3 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r3] /* Program MAIR0. */ + ldr r4, =0xe000ed98 /* r4 = 0xe000ed98 [Location of RNR]. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + movs r5, #4 /* r5 = 4. */ + str r5, [r4] /* Program RNR = 4. */ + ldmia r1!, {r6,r7} /* Read first set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r6,r7} /* Write first set of RBAR/RLAR registers. */ + movs r5, #5 /* r5 = 5. */ + str r5, [r4] /* Program RNR = 5. */ + ldmia r1!, {r6,r7} /* Read second set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r6,r7} /* Write second set of RBAR/RLAR registers. */ + movs r5, #6 /* r5 = 6. */ + str r5, [r4] /* Program RNR = 6. */ + ldmia r1!, {r6,r7} /* Read third set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r6,r7} /* Write third set of RBAR/RLAR registers. */ + movs r5, #7 /* r5 = 7. */ + str r5, [r4] /* Program RNR = 7. */ + ldmia r1!, {r6,r7} /* Read fourth set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r6,r7} /* Write fourth set of RBAR/RLAR registers. */ + + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + movs r5, #1 /* r5 = 1. */ + orrs r4, r5 /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */ + str r4, [r3] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + + #if ( configENABLE_MPU == 1 ) + ldmia r2!, {r0, r1, r3, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r3 /* Restore the CONTROL register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #else /* configENABLE_MPU */ + ldmia r2!, {r0, r1, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #endif /* configENABLE_MPU */ + + restore_ns_context: + adds r2, r2, #16 /* Move to the high registers. */ + ldmia r2!, {r4-r7} /* Restore the high registers that are not automatically restored. */ + mov r8, r4 /* r8 = r4. */ + mov r9, r5 /* r9 = r5. */ + mov r10, r6 /* r10 = r6. */ + mov r11, r7 /* r11 = r7. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + subs r2, r2, #32 /* Go back to the low registers. */ + ldmia r2!, {r4-r7} /* Restore the low registers that are not automatically restored. */ + bx lr +/*-----------------------------------------------------------*/ + +SVC_Handler: + movs r0, #4 + mov r1, lr + tst r0, r1 + beq stacking_used_msp + mrs r0, psp + b vPortSVCHandler_C + stacking_used_msp: + mrs r0, msp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + +vPortFreeSecureContext: + ldr r2, [r0] /* The first item in the TCB is the top of the stack. */ + ldr r1, [r2] /* The first item on the stack is the task's xSecureContext. */ + cmp r1, #0 /* Raise svc if task's xSecureContext is not NULL. */ + bne free_secure_context /* Branch if r1 != 0. */ + bx lr /* There is no secure context (xSecureContext is NULL). */ + free_secure_context: + svc 1 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h new file mode 100644 index 0000000..f31bd3f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h @@ -0,0 +1,78 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M23" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s new file mode 100644 index 0000000..9850588 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s @@ -0,0 +1,310 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + movs r1, #1 /* r1 = 1. */ + tst r0, r1 /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */ + beq running_privileged /* If the result of previous AND operation was 0, branch. */ + movs r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + bx lr /* Return. */ + running_privileged: + movs r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + bx lr /* Return. */ + +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + movs r1, #1 /* r1 = 1. */ + orrs r0, r1 /* r0 = r0 | r1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + movs r4, #1 /* r4 = 1. */ + bics r3, r4 /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */ + str r3, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r2] /* Program RNR = 4. */ + ldmia r1!, {r5,r6} /* Read first set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write first set of RBAR/RLAR registers. */ + movs r4, #5 /* r4 = 5. */ + str r4, [r2] /* Program RNR = 5. */ + ldmia r1!, {r5,r6} /* Read second set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write second set of RBAR/RLAR registers. */ + movs r4, #6 /* r4 = 6. */ + str r4, [r2] /* Program RNR = 6. */ + ldmia r1!, {r5,r6} /* Read third set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write third set of RBAR/RLAR registers. */ + movs r4, #7 /* r4 = 7. */ + str r4, [r2] /* Program RNR = 7. */ + ldmia r1!, {r5,r6} /* Read fourth set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write fourth set of RBAR/RLAR registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + movs r4, #1 /* r4 = 1. */ + orrs r3, r4 /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */ + str r3, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r3} /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + msr control, r2 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + bx r3 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r2} /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + bx r2 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + movs r1, #1 /* r1 = 1. */ + bics r0, r1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ + nop +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, PRIMASK + cpsid i + bx lr +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr PRIMASK, r0 + bx lr +/*-----------------------------------------------------------*/ + +PendSV_Handler: + mrs r0, psp /* Read PSP in r0. */ + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ +#if ( configENABLE_MPU == 1 ) + subs r0, r0, #44 /* Make space for PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + str r0, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r2, control /* r2 = CONTROL. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r0!, {r1-r7} /* Store on the stack - PSPLIM, CONTROL, LR and low registers that are not automatically saved. */ + mov r4, r8 /* r4 = r8. */ + mov r5, r9 /* r5 = r9. */ + mov r6, r10 /* r6 = r10. */ + mov r7, r11 /* r7 = r11. */ + stmia r0!, {r4-r7} /* Store the high registers that are not saved automatically. */ +#else /* configENABLE_MPU */ + subs r0, r0, #40 /* Make space for PSPLIM, LR and the remaining registers on the stack. */ + str r0, [r1] /* Save the new top of stack in TCB. */ + mrs r2, psplim /* r2 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r0!, {r2-r7} /* Store on the stack - PSPLIM, LR and low registers that are not automatically saved. */ + mov r4, r8 /* r4 = r8. */ + mov r5, r9 /* r5 = r9. */ + mov r6, r10 /* r6 = r10. */ + mov r7, r11 /* r7 = r11. */ + stmia r0!, {r4-r7} /* Store the high registers that are not saved automatically. */ +#endif /* configENABLE_MPU */ + + cpsid i + bl vTaskSwitchContext + cpsie i + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + movs r4, #1 /* r4 = 1. */ + bics r3, r4 /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */ + str r3, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r2] /* Program RNR = 4. */ + ldmia r1!, {r5,r6} /* Read first set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write first set of RBAR/RLAR registers. */ + movs r4, #5 /* r4 = 5. */ + str r4, [r2] /* Program RNR = 5. */ + ldmia r1!, {r5,r6} /* Read second set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write second set of RBAR/RLAR registers. */ + movs r4, #6 /* r4 = 6. */ + str r4, [r2] /* Program RNR = 6. */ + ldmia r1!, {r5,r6} /* Read third set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write third set of RBAR/RLAR registers. */ + movs r4, #7 /* r4 = 7. */ + str r4, [r2] /* Program RNR = 7. */ + ldmia r1!, {r5,r6} /* Read fourth set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write fourth set of RBAR/RLAR registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + movs r4, #1 /* r4 = 1. */ + orrs r3, r4 /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */ + str r3, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + adds r0, r0, #28 /* Move to the high registers. */ + ldmia r0!, {r4-r7} /* Restore the high registers that are not automatically restored. */ + mov r8, r4 /* r8 = r4. */ + mov r9, r5 /* r9 = r5. */ + mov r10, r6 /* r10 = r6. */ + mov r11, r7 /* r11 = r7. */ + msr psp, r0 /* Remember the new top of stack for the task. */ + subs r0, r0, #44 /* Move to the starting of the saved context. */ + ldmia r0!, {r1-r7} /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r7 restored. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r2 /* Restore the CONTROL register value for the task. */ + bx r3 +#else /* configENABLE_MPU */ + adds r0, r0, #24 /* Move to the high registers. */ + ldmia r0!, {r4-r7} /* Restore the high registers that are not automatically restored. */ + mov r8, r4 /* r8 = r4. */ + mov r9, r5 /* r9 = r5. */ + mov r10, r6 /* r10 = r6. */ + mov r11, r7 /* r11 = r7. */ + msr psp, r0 /* Remember the new top of stack for the task. */ + subs r0, r0, #40 /* Move to the starting of the saved context. */ + ldmia r0!, {r2-r7} /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r7 restored. */ + msr psplim, r2 /* Restore the PSPLIM register value for the task. */ + bx r3 +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +SVC_Handler: + movs r0, #4 + mov r1, lr + tst r0, r1 + beq stacking_used_msp + mrs r0, psp + b vPortSVCHandler_C + stacking_used_msp: + mrs r0, msp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h new file mode 100644 index 0000000..f31bd3f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h @@ -0,0 +1,78 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M23" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s new file mode 100644 index 0000000..2f0fb7e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s @@ -0,0 +1,353 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN xSecureContext + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + EXTERN SecureContext_SaveContext + EXTERN SecureContext_LoadContext + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vPortAllocateSecureContext + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler + PUBLIC vPortFreeSecureContext +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vPortAllocateSecureContext: + svc 0 /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r3, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r3] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r3, #4 /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + ldr r4, [r3] /* r4 = *r3 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r2] /* Program RNR = 4. */ + adds r3, #4 /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r3!, {r4-r11} /* Read 4 set of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r4} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + ldr r5, =xSecureContext + str r1, [r5] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + msr control, r3 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r4 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r3} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + ldr r4, =xSecureContext + str r1, [r4] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r3 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + bic r0, r0, #1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, basepri /* r0 = basepri. Return original basepri value. */ + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr basepri, r0 /* basepri = ulMask. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +PendSV_Handler: + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + ldr r0, [r3] /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + mrs r2, psp /* Read PSP in r2. */ + + cbz r0, save_ns_context /* No secure context to save. */ + push {r0-r2, r14} + bl SecureContext_SaveContext /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r0-r3} /* LR is now in r3. */ + mov lr, r3 /* LR = r3. */ + lsls r1, r3, #25 /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl save_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ +#if ( configENABLE_MPU == 1 ) + subs r2, r2, #16 /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ +#else /* configENABLE_MPU */ + subs r2, r2, #12 /* Make space for xSecureContext, PSPLIM and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ +#endif /* configENABLE_MPU */ + b select_next_task + + save_ns_context: + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vstmdbeq r2!, {s16-s31} /* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + subs r2, r2, #48 /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #16 /* r2 = r2 + 16. */ + stm r2, {r4-r11} /* Store the registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + subs r2, r2, #16 /* r2 = r2 - 16. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + subs r2, r2, #44 /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #12 /* r2 = r2 + 12. */ + stm r2, {r4-r11} /* Store the registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + subs r2, r2, #12 /* r2 = r2 - 12. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + + select_next_task: + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bl vTaskSwitchContext + mov r0, #0 /* r0 = 0. */ + msr basepri, r0 /* Enable interrupts. */ + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + ldr r2, [r1] /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + + #if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r3] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r3, =0xe000edc0 /* r3 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r3] /* Program MAIR0. */ + ldr r3, =0xe000ed98 /* r3 = 0xe000ed98 [Location of RNR]. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r3] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r3!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r3] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + + #if ( configENABLE_MPU == 1 ) + ldmia r2!, {r0, r1, r3, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r3 /* Restore the CONTROL register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #else /* configENABLE_MPU */ + ldmia r2!, {r0, r1, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #endif /* configENABLE_MPU */ + + restore_ns_context: + ldmia r2!, {r4-r11} /* Restore the registers that are not automatically restored. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vldmiaeq r2!, {s16-s31} /* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr +/*-----------------------------------------------------------*/ + +SVC_Handler: + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + +vPortFreeSecureContext: + /* r0 = uint32_t *pulTCB. */ + ldr r2, [r0] /* The first item in the TCB is the top of the stack. */ + ldr r1, [r2] /* The first item on the stack is the task's xSecureContext. */ + cmp r1, #0 /* Raise svc if task's xSecureContext is not NULL. */ + it ne + svcne 1 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h new file mode 100644 index 0000000..3575c1f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h @@ -0,0 +1,78 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M33" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s new file mode 100644 index 0000000..4d02a43 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s @@ -0,0 +1,262 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r3, [r1] /* r3 = *r1 i.e. r3 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r3, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r3, #4 /* r3 = 4. */ + str r3, [r2] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r3} /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + msr control, r2 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r3 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r2} /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r2 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + bic r0, r0, #1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, basepri /* r0 = basepri. Return original basepri value. */ + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr basepri, r0 /* basepri = ulMask. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +PendSV_Handler: + mrs r0, psp /* Read PSP in r0. */ +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vstmdbeq r0!, {s16-s31} /* Store the additional FP context registers which are not saved automatically. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ +#if ( configENABLE_MPU == 1 ) + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r2, control /* r2 = CONTROL. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmdb r0!, {r1-r11} /* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */ +#else /* configENABLE_MPU */ + mrs r2, psplim /* r2 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmdb r0!, {r2-r11} /* Store on the stack - PSPLIM, LR and registers that are not automatically. */ +#endif /* configENABLE_MPU */ + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + str r0, [r1] /* Save the new top of stack in TCB. */ + + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bl vTaskSwitchContext + mov r0, #0 /* r0 = 0. */ + msr basepri, r0 /* Enable interrupts. */ + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r3, [r1] /* r3 = *r1 i.e. r3 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r3, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r3, #4 /* r3 = 4. */ + str r3, [r2] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldmia r0!, {r1-r11} /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */ +#else /* configENABLE_MPU */ + ldmia r0!, {r2-r11} /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */ +#endif /* configENABLE_MPU */ + +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst r3, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vldmiaeq r0!, {s16-s31} /* Restore the additional FP context registers which are not restored automatically. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ + + #if ( configENABLE_MPU == 1 ) + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r2 /* Restore the CONTROL register value for the task. */ +#else /* configENABLE_MPU */ + msr psplim, r2 /* Restore the PSPLIM register value for the task. */ +#endif /* configENABLE_MPU */ + msr psp, r0 /* Remember the new top of stack for the task. */ + bx r3 +/*-----------------------------------------------------------*/ + +SVC_Handler: + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h new file mode 100644 index 0000000..3575c1f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h @@ -0,0 +1,78 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M33" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h new file mode 100644 index 0000000..5384062 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h @@ -0,0 +1,83 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M55" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h new file mode 100644 index 0000000..c1e5550 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h @@ -0,0 +1,83 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M85" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/ReadMe.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/ReadMe.txt new file mode 100644 index 0000000..ed40fb6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/ReadMe.txt @@ -0,0 +1,11 @@ +This directory tree contains the master copy of the FreeRTOS Armv8-M and +Armv8.1-M ports. +Do not use the files located here! These file are copied into separate +FreeRTOS/Source/portable/[compiler]/ARM_CM[23|33|55|85]_NNN directories prior to +each FreeRTOS release. + +If your Armv8-M/Armv8.1-M application uses TrustZone then use the files from the +FreeRTOS/Source/portable/[compiler]/ARM_CM[23|33|55|85] directories. + +If your Armv8-M/Armv8.1-M application does not use TrustZone then use the files from +the FreeRTOS/Source/portable/[compiler]/ARM_CM[23|33|55|85]_NTZ directories. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c new file mode 100644 index 0000000..3331fc3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c @@ -0,0 +1,99 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, load_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " ldmia r0!, {r1, r2} \n" /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r1!, {r3} \n" /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + " msr control, r3 \n" /* CONTROL = r3. */ + #endif /* configENABLE_MPU */ + " \n" + " msr psplim, r2 \n" /* PSPLIM = r2. */ + " msr psp, r1 \n" /* PSP = r1. */ + " \n" + " load_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::: "r0", "r1", "r2" + ); +} +/*-----------------------------------------------------------*/ + +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, save_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " mrs r1, psp \n" /* r1 = PSP. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " mrs r2, control \n" /* r2 = CONTROL. */ + " subs r1, r1, #4 \n" /* Make space for the CONTROL value on the stack. */ + " str r1, [r0] \n" /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + " stmia r1!, {r2} \n" /* Store CONTROL value on the stack. */ + #else /* configENABLE_MPU */ + " str r1, [r0] \n" /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + #endif /* configENABLE_MPU */ + " \n" + " movs r1, %0 \n" /* r1 = securecontextNO_STACK. */ + " msr psplim, r1 \n" /* PSPLIM = securecontextNO_STACK. */ + " msr psp, r1 \n" /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + " \n" + " save_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::"i" ( securecontextNO_STACK ) : "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c new file mode 100644 index 0000000..952db8a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c @@ -0,0 +1,97 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, load_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " ldmia r0!, {r1, r2} \n" /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r1!, {r3} \n" /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + " msr control, r3 \n" /* CONTROL = r3. */ + #endif /* configENABLE_MPU */ + " \n" + " msr psplim, r2 \n" /* PSPLIM = r2. */ + " msr psp, r1 \n" /* PSP = r1. */ + " \n" + " load_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::: "r0", "r1", "r2" + ); +} +/*-----------------------------------------------------------*/ + +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, save_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " mrs r1, psp \n" /* r1 = PSP. */ + " \n" + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " vstmdb r1!, {s0} \n" /* Trigger the deferred stacking of FPU registers. */ + " vldmia r1!, {s0} \n" /* Nullify the effect of the previous statement. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " \n" + #if ( configENABLE_MPU == 1 ) + " mrs r2, control \n" /* r2 = CONTROL. */ + " stmdb r1!, {r2} \n" /* Store CONTROL value on the stack. */ + #endif /* configENABLE_MPU */ + " \n" + " str r1, [r0] \n" /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + " movs r1, %0 \n" /* r1 = securecontextNO_STACK. */ + " msr psplim, r1 \n" /* PSPLIM = securecontextNO_STACK. */ + " msr psp, r1 \n" /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + " \n" + " save_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::"i" ( securecontextNO_STACK ) : "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s new file mode 100644 index 0000000..aee841a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s @@ -0,0 +1,88 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + SECTION .text:CODE:NOROOT(2) + THUMB + +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + PUBLIC SecureContext_LoadContextAsm + PUBLIC SecureContext_SaveContextAsm + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif +/*-----------------------------------------------------------*/ + +SecureContext_LoadContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, load_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + ldmia r0!, {r1, r2} /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + +#if ( configENABLE_MPU == 1 ) + ldmia r1!, {r3} /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + msr control, r3 /* CONTROL = r3. */ +#endif /* configENABLE_MPU */ + + msr psplim, r2 /* PSPLIM = r2. */ + msr psp, r1 /* PSP = r1. */ + + load_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + +SecureContext_SaveContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, save_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + mrs r1, psp /* r1 = PSP. */ + +#if ( configENABLE_MPU == 1 ) + mrs r2, control /* r2 = CONTROL. */ + subs r1, r1, #4 /* Make space for the CONTROL value on the stack. */ + str r1, [r0] /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + stmia r1!, {r2} /* Store CONTROL value on the stack. */ +#else /* configENABLE_MPU */ + str r1, [r0] /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ +#endif /* configENABLE_MPU */ + + movs r1, #0 /* r1 = securecontextNO_STACK. */ + msr psplim, r1 /* PSPLIM = securecontextNO_STACK. */ + msr psp, r1 /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + + save_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s new file mode 100644 index 0000000..4e26cf9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s @@ -0,0 +1,86 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + SECTION .text:CODE:NOROOT(2) + THUMB + +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + PUBLIC SecureContext_LoadContextAsm + PUBLIC SecureContext_SaveContextAsm +/*-----------------------------------------------------------*/ + +SecureContext_LoadContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, load_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + ldmia r0!, {r1, r2} /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + +#if ( configENABLE_MPU == 1 ) + ldmia r1!, {r3} /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + msr control, r3 /* CONTROL = r3. */ +#endif /* configENABLE_MPU */ + + msr psplim, r2 /* PSPLIM = r2. */ + msr psp, r1 /* PSP = r1. */ + + load_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + +SecureContext_SaveContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, save_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + mrs r1, psp /* r1 = PSP. */ + +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + vstmdb r1!, {s0} /* Trigger the deferred stacking of FPU registers. */ + vldmia r1!, {s0} /* Nullify the effect of the previous statement. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ + +#if ( configENABLE_MPU == 1 ) + mrs r2, control /* r2 = CONTROL. */ + stmdb r1!, {r2} /* Store CONTROL value on the stack. */ +#endif /* configENABLE_MPU */ + + str r1, [r0] /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + movs r1, #0 /* r1 = securecontextNO_STACK. */ + msr psplim, r1 /* PSPLIM = securecontextNO_STACK. */ + msr psp, r1 /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + + save_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.c new file mode 100644 index 0000000..1996693 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.c @@ -0,0 +1,351 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 + +/** + * @brief Size of stack seal values in bytes. + */ +#define securecontextSTACK_SEAL_SIZE 8 + +/** + * @brief Stack seal value as recommended by ARM. + */ +#define securecontextSTACK_SEAL_VALUE 0xFEF5EDA5 + +/** + * @brief Maximum number of secure contexts. + */ +#ifndef secureconfigMAX_SECURE_CONTEXTS + #define secureconfigMAX_SECURE_CONTEXTS 8UL +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Pre-allocated array of secure contexts. + */ +SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ]; +/*-----------------------------------------------------------*/ + +/** + * @brief Get a free secure context for a task from the secure context pool (xSecureContexts). + * + * This function ensures that only one secure context is allocated for a task. + * + * @param[in] pvTaskHandle The task handle for which the secure context is allocated. + * + * @return Index of a free secure context in the xSecureContexts array. + */ +static uint32_t ulGetSecureContext( void * pvTaskHandle ); + +/** + * @brief Return the secure context to the secure context pool (xSecureContexts). + * + * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array. + */ +static void vReturnSecureContext( uint32_t ulSecureContextIndex ); + +/* These are implemented in assembly. */ +extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ); +extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ); +/*-----------------------------------------------------------*/ + +static uint32_t ulGetSecureContext( void * pvTaskHandle ) +{ + /* Start with invalid index. */ + uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) && + ( xSecureContexts[ i ].pucStackLimit == NULL ) && + ( xSecureContexts[ i ].pucStackStart == NULL ) && + ( xSecureContexts[ i ].pvTaskHandle == NULL ) && + ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = i; + } + else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle ) + { + /* A task can only have one secure context. Do not allocate a second + * context for the same task. */ + ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + break; + } + } + + return ulSecureContextIndex; +} +/*-----------------------------------------------------------*/ + +static void vReturnSecureContext( uint32_t ulSecureContextIndex ) +{ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL; + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR, i; + static uint32_t ulSecureContextsInitialized = 0; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) ) + { + /* Ensure to initialize secure contexts only once. */ + ulSecureContextsInitialized = 1; + + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + /* Initialize all secure contexts. */ + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + xSecureContexts[ i ].pucCurrentStackPointer = NULL; + xSecureContexts[ i ].pucStackLimit = NULL; + xSecureContexts[ i ].pucStackStart = NULL; + xSecureContexts[ i ].pvTaskHandle = NULL; + } + + #if ( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ) +#endif /* configENABLE_MPU */ +{ + uint8_t * pucStackMemory = NULL; + uint8_t * pucStackLimit; + uint32_t ulIPSR, ulSecureContextIndex; + SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID; + + #if ( configENABLE_MPU == 1 ) + uint32_t * pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit + * Register (PSPLIM) value. */ + secureportREAD_IPSR( ulIPSR ); + secureportREAD_PSPLIM( pucStackLimit ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. + * Also do nothing, if a secure context us already loaded. PSPLIM is set to + * securecontextNO_STACK when no secure context is loaded. */ + if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) ) + { + /* Ontain a free secure context. */ + ulSecureContextIndex = ulGetSecureContext( pvTaskHandle ); + + /* Were we able to get a free context? */ + if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte for stack (excluding the space for seal values) + * because the hardware decrements the stack pointer before + * writing i.e. if stack pointer is 0x2, a push operation will + * decrement the stack pointer to 0x1 and then write at 0x1. */ + xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize; + + /* Seal the created secure process stack. */ + *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE; + *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory; + + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle; + + #if ( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart; + pulCurrentStackPointer--; + + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart; + } + #endif /* configENABLE_MPU */ + + /* Ensure to never return 0 as a valid context handle. */ + xSecureContextHandle = ulSecureContextIndex + 1UL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint32_t ulIPSR, ulSecureContextIndex; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Only free if a valid context handle is passed. */ + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + /* Ensure that the secure context being deleted is associated with + * the task. */ + if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) + { + /* Free the stack space. */ + vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit ); + + /* Return the secure context back to the free secure contexts pool. */ + vReturnSecureContext( ulSecureContextIndex ); + } + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that no secure context is loaded and the task is loading it's + * own context. */ + if( ( pucStackLimit == securecontextNO_STACK ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that task's context is loaded and the task is saving it's own + * context. */ + if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.h new file mode 100644 index 0000000..de33d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no secure context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Invalid context ID. + */ +#define securecontextINVALID_CONTEXT_ID 0UL +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent a secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first address of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t * pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t * pucStackStart; /**< First location of the stack memory. */ + void * pvTaskHandle; /**< Task handle of the task this context is associated with. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Opaque handle for a secure context. + */ +typedef uint32_t SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if ( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.c new file mode 100644 index 0000000..b3bf007 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.c @@ -0,0 +1,454 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#ifndef secureconfigTOTAL_HEAP_SIZE + #define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) +#endif + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */ + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.h new file mode 100644 index 0000000..e469f2c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void * pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void * pv ); + +/** + * @brief Get the free heap size. + * + * @return Free heap size. + */ +size_t xPortGetFreeHeapSize( void ); + +/** + * @brief Get the minimum ever free heap size. + * + * @return Minimum ever free heap size. + */ +size_t xPortGetMinimumEverFreeHeapSize( void ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.c new file mode 100644 index 0000000..f6570d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.c @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.h new file mode 100644 index 0000000..e89af71 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/macros/secure_port_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/macros/secure_port_macros.h new file mode 100644 index 0000000..2fb7c59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/macros/secure_port_macros.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) ) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Read the PSPLIM value in the given variable. + */ +#define secureportREAD_PSPLIM( pucOutStackLimit ) \ + __asm volatile ( "mrs %0, psplim" : "=r" ( pucOutStackLimit ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ; ; ) {; } \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/port.c new file mode 100644 index 0000000..cb87e26 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/port.c @@ -0,0 +1,245 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V1.00: + + + Call to taskYIELD() from within tick ISR has been replaced by the more + efficient portSWITCH_CONTEXT(). + + ISR function definitions renamed to include the prv prefix. + +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Flashlite 186 + * port. + *----------------------------------------------------------*/ + +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_EOI_TYPE ( 8 ) +#define portRESET_PIC() portOUTPUT_WORD( ( uint16_t ) 0xff22, portTIMER_EOI_TYPE ) +#define portTIMER_INT_NUMBER 0x12 + +#define portTIMER_1_CONTROL_REGISTER ( ( uint16_t ) 0xff5e ) +#define portTIMER_0_CONTROL_REGISTER ( ( uint16_t ) 0xff56 ) +#define portTIMER_INTERRUPT_ENABLE ( ( uint16_t ) 0x2000 ) + +/* Setup the hardware to generate the required tick frequency. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Set the hardware back to the state as per before the scheduler started. */ +static void prvExitFunction( void ); + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static BaseType_t xSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual +context switches. This is then used to restore the original routine during +prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + #if( configUSE_PREEMPTION == 1 ) + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + xSchedulerRunning = pdFALSE; + } + else + { + xSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return xSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + portRESET_PIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + portRESET_PIC(); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +const uint16_t usTimerDisable = 0x0000; +uint16_t usTimer0Control; + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( xSchedulerRunning == pdTRUE ) + { + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + } + + /* Disable the timer used for the tick to ensure the scheduler is + not called before restoring interrupts. There was previously nothing + on this timer so there is no old ISR to restore. */ + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerDisable ); + + /* Restart the DOS tick. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control |= portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); + + + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usMaxCountRegister = 0xff5a; +const uint16_t usTimerPriorityRegister = 0xff32; +const uint16_t usTimerEnable = 0xC000; +const uint16_t usRetrigger = 0x0001; +const uint16_t usTimerHighPriority = 0x0000; +uint16_t usTimer0Control; + +/* ( CPU frequency / 4 ) / clock 2 max count [inpw( 0xff62 ) = 7] */ + +const uint32_t ulClockFrequency = ( uint32_t ) 0x7f31a0UL; + +uint32_t ulTimerCount = ulClockFrequency / ulTickRateHz; + + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerEnable | portTIMER_INTERRUPT_ENABLE | usRetrigger ); + portOUTPUT_WORD( usMaxCountRegister, ( uint16_t ) ulTimerCount ); + portOUTPUT_WORD( usTimerPriorityRegister, usTimerHighPriority ); + + /* Stop the DOS tick - don't do this if you want to maintain a TOD clock. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control &= ~portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); +} + + +/*lint +e950 */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/prtmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/prtmacro.h new file mode 100644 index 0000000..a914c37 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/prtmacro.h @@ -0,0 +1,98 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE portSHORT + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portINPUT_WORD( xAddr ) inpw( xAddr ) +#define portOUTPUT_WORD( xAddr, usValue ) outpw( xAddr, usValue ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/port.c new file mode 100644 index 0000000..c7a4fbf --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/port.c @@ -0,0 +1,289 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. + +Changes from V4.0.1 + + + Add function prvSetTickFrequencyDefault() to set the DOS tick back to + its proper value when the scheduler exits. +*/ + +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the industrial + * PC port. + *----------------------------------------------------------*/ + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_INT_NUMBER 0x08 + +/* Setup hardware for required tick interrupt rate. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Restore hardware to as it was prior to starting the scheduler. */ +static void prvExitFunction( void ); + +/* Either chain to the DOS tick (which itself clears the PIC) or clear the PIC +directly. We chain to the DOS tick as close as possible to the standard DOS +tick rate. */ +static void prvPortResetPIC( void ); + +/* The ISR used depends on whether the preemptive or cooperative +scheduler is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/* Set the tick frequency back so the floppy drive works correctly when the +scheduler exits. */ +static void prvSetTickFrequencyDefault( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Used to signal when to chain to the DOS tick, and when to just clear the PIC ourselves. */ +static int16_t sDOSTickCounter; + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static BaseType_t xSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual context switches. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Points to the original routine installed on the vector we use to chain to the DOS tick. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISRPlus1 )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ +pxISR pxOriginalTickISR; + + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + pxOriginalTickISR = _dos_getvect( portTIMER_INT_NUMBER ); + pxOldSwitchISRPlus1 = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + /* Put the old tick on a different interrupt number so we can + call it when we want. */ + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOriginalTickISR ); + + /* The ISR used depends on whether the preemptive or cooperative + scheduler is being used. */ + #if( configUSE_PREEMPTION == 1 ) + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + /* Setup a counter that is used to call the DOS interrupt as close + to it's original frequency as can be achieved given our chosen tick + frequency. */ + sDOSTickCounter = portTICKS_PER_DOS_TICK; + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + xSchedulerRunning = pdFALSE; + } + else + { + xSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return xSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative +scheduler is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + prvPortResetPIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + prvPortResetPIC(); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +static void prvPortResetPIC( void ) +{ + /* We are going to call the DOS tick interrupt at as close a + frequency to the normal DOS tick as possible. */ + + /* WE SHOULD NOT DO THIS IF YIELD WAS CALLED. */ + --sDOSTickCounter; + if( sDOSTickCounter <= 0 ) + { + sDOSTickCounter = ( int16_t ) portTICKS_PER_DOS_TICK; + __asm{ int portSWITCH_INT_NUMBER + 1 }; + } + else + { + /* Reset the PIC as the DOS tick is not being called to + do it. */ + __asm + { + mov al, 20H + out 20H, al + }; + } +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +void ( __interrupt __far *pxOriginalTickISR )(); + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( xSchedulerRunning == pdTRUE ) + { + /* Set the DOS tick back onto the timer ticker. */ + pxOriginalTickISR = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + _dos_setvect( portTIMER_INT_NUMBER, pxOriginalTickISR ); + prvSetTickFrequencyDefault(); + + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOldSwitchISRPlus1 ); + } + /* The tick timer is back how DOS wants it. We can re-enable + interrupts without the scheduler being called. */ + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint32_t ulPIT_CONST = ( uint32_t ) 1193180UL; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; +uint32_t ulOutput; + + /* Setup the 8245 to tick at the wanted frequency. */ + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + ulOutput = ulPIT_CONST / ulTickRateHz; + portOUTPUT_BYTE( usPIT0, ( uint16_t )( ulOutput & ( uint32_t ) 0xff ) ); + ulOutput >>= 8; + portOUTPUT_BYTE( usPIT0, ( uint16_t ) ( ulOutput & ( uint32_t ) 0xff ) ); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequencyDefault( void ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; + + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + portOUTPUT_BYTE( usPIT0,0 ); + portOUTPUT_BYTE( usPIT0,0 ); +} + + +/*lint +e950 */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/prtmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/prtmacro.h new file mode 100644 index 0000000..81e4e4e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/prtmacro.h @@ -0,0 +1,98 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT long +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE portSHORT + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portDOS_TICK_RATE ( 18.20648 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portTICKS_PER_DOS_TICK ( ( uint16_t ) ( ( ( portDOUBLE ) configTICK_RATE_HZ / portDOS_TICK_RATE ) + 0.5 ) ) +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +#define portBYTE_ALIGNMENT ( 2 ) +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portasm.h new file mode 100644 index 0000000..0363421 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portasm.h @@ -0,0 +1,88 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORT_ASM_H +#define PORT_ASM_H + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/* + * Saves the stack pointer for one task into its TCB, calls + * vTaskSwitchContext() to update the TCB being used, then restores the stack + * from the new TCB read to run the task. + */ +void portSWITCH_CONTEXT( void ); + +/* + * Load the stack pointer from the TCB of the task which is going to be first + * to execute. Then force an IRET so the registers and IP are popped off the + * stack. + */ +void portFIRST_CONTEXT( void ); + +/* There are slightly different versions depending on whether you are building +to include debugger information. If debugger information is used then there +are a couple of extra bytes left of the ISR stack (presumably for use by the +debugger). The true stack pointer is then stored in the bp register. We add +2 to the stack pointer to remove the extra bytes before we restore our context. */ + +#define portSWITCH_CONTEXT() \ + asm { mov ax, seg pxCurrentTCB } \ + asm { mov ds, ax } \ + asm { les bx, pxCurrentTCB } /* Save the stack pointer into the TCB. */ \ + asm { mov es:0x2[ bx ], ss } \ + asm { mov es:[ bx ], sp } \ + asm { call far ptr vTaskSwitchContext } /* Perform the switch. */ \ + asm { mov ax, seg pxCurrentTCB } /* Restore the stack pointer from the TCB. */ \ + asm { mov ds, ax } \ + asm { les bx, dword ptr pxCurrentTCB } \ + asm { mov ss, es:[ bx + 2 ] } \ + asm { mov sp, es:[ bx ] } + +#define portFIRST_CONTEXT() \ + __asm { mov ax, seg pxCurrentTCB } \ + __asm { mov ds, ax } \ + __asm { les bx, dword ptr pxCurrentTCB } \ + __asm { mov ss, es:[ bx + 2 ] } \ + __asm { mov sp, es:[ bx ] } \ + __asm { pop bp } \ + __asm { pop di } \ + __asm { pop si } \ + __asm { pop ds } \ + __asm { pop es } \ + __asm { pop dx } \ + __asm { pop cx } \ + __asm { pop bx } \ + __asm { pop ax } \ + __asm { iret } + + +#endif + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portcomn.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portcomn.c new file mode 100644 index 0000000..e7e3854 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portcomn.c @@ -0,0 +1,121 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V1.00: + + + pxPortInitialiseStack() now initialises the stack of new tasks to the + same format used by the compiler. This allows the compiler generated + interrupt mechanism to be used for context switches. + +Changes from V2.6.1 + + + Move usPortCheckFreeStackSpace() to tasks.c. +*/ + + +#include +#include +#include "FreeRTOS.h" + +/*-----------------------------------------------------------*/ + +/* See header file for description. */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t DS_Reg = 0; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + *pxTopOfStack = 0x4444; + pxTopOfStack--; + *pxTopOfStack = 0x5555; + pxTopOfStack--; + + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* We are going to start the scheduler using a return from interrupt + instruction to load the program counter, so first there would be the + function call with parameters preamble. */ + + *pxTopOfStack = FP_SEG( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* Next the status register and interrupt return address. */ + *pxTopOfStack = portINITIAL_SW; + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* The remaining registers would be pushed on the stack by our context + switch function. These are loaded with values simply to make debugging + easier. */ + *pxTopOfStack = ( StackType_t ) 0xAAAA; /* AX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xCCCC; /* CX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xEEEE; /* ES */ + pxTopOfStack--; + + /* We need the true data segment. */ + __asm{ MOV DS_Reg, DS }; + + *pxTopOfStack = DS_Reg; /* DS */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0123; /* SI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BP */ + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/port.c new file mode 100644 index 0000000..851b203 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/port.c @@ -0,0 +1,663 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM3 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY + * setting. */ +const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY; + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + #pragma WEAK( vPortSuppressTicksAndSleep ) + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm( " cpsid i"); + __asm( " dsb"); + __asm( " isb"); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm( " cpsie i"); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm( " dsb"); + __asm( " wfi"); + __asm( " isb"); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm( " cpsie i"); + __asm( " dsb"); + __asm( " isb"); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm( " cpsid i"); + __asm( " dsb"); + __asm( " isb"); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm( " cpsie i"); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +#pragma WEAK( vPortSetupTimerInterrupt ) +void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + extern uint32_t ulPortGetIPSR( void ); + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + ulCurrentInterrupt = ulPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portasm.asm b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portasm.asm new file mode 100644 index 0000000..9113e65 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portasm.asm @@ -0,0 +1,145 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + .thumb + + .ref pxCurrentTCB + .ref vTaskSwitchContext + .ref ulMaxSyscallInterruptPriority + + .def xPortPendSVHandler + .def ulPortGetIPSR + .def vPortSVCHandler + .def vPortStartFirstTask + +NVICOffsetConst: .word 0xE000ED08 +CPACRConst: .word 0xE000ED88 +pxCurrentTCBConst: .word pxCurrentTCB +ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority + +; ----------------------------------------------------------- + + .align 4 +ulPortGetIPSR: .asmfunc + mrs r0, ipsr + bx r14 + .endasmfunc + ; ----------------------------------------------------------- + + .align 4 +vPortSetInterruptMask: .asmfunc + push {r0} + ldr r0, ulMaxSyscallInterruptPriorityConst + msr basepri, r0 + pop {r0} + bx r14 + .endasmfunc +; ----------------------------------------------------------- + + .align 4 +xPortPendSVHandler: .asmfunc + mrs r0, psp + isb + + ;/* Get the location of the current TCB. */ + ldr r3, pxCurrentTCBConst + ldr r2, [r3] + + ;/* Save the core registers. */ + stmdb r0!, {r4-r11} + + ;/* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r3, r14} + ldr r0, ulMaxSyscallInterruptPriorityConst + ldr r1, [r0] + msr basepri, r1 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3, r14} + + ;/* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + ;/* Pop the core registers. */ + ldmia r0!, {r4-r11} + + msr psp, r0 + isb + bx r14 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortSVCHandler: .asmfunc + ;/* Get the location of the current TCB. */ + ldr r3, pxCurrentTCBConst + ldr r1, [r3] + ldr r0, [r1] + ;/* Pop the core registers. */ + ldmia r0!, {r4-r11} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + orr r14, #0xd + bx r14 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortStartFirstTask: .asmfunc + ;/* Use the NVIC offset register to locate the stack. */ + ldr r0, NVICOffsetConst + ldr r0, [r0] + ldr r0, [r0] + ;/* Set the msp back to the start of the stack. */ + msr msp, r0 + ;/* Clear the bit that indicates the FPU is in use in case the FPU was used + ;before the scheduler was started - which would otherwise result in the + ;unnecessary leaving of space in the SVC stack for lazy saving of FPU + ;registers. */ + mov r0, #0 + msr control, r0 + ;/* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc #0 + .endasmfunc + +; ----------------------------------------------------------- + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portmacro.h new file mode 100644 index 0000000..15a8b6b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portmacro.h @@ -0,0 +1,171 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Compiler directives. */ + #define portWEAK_SYMBOL __attribute__( ( weak ) ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __asm( " dsb"); \ + __asm( " isb"); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() \ + { \ + _set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __asm( " dsb"); \ + __asm( " isb"); \ + } + + #define portENABLE_INTERRUPTS() _set_interrupt_priority( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() _set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); __asm( " dsb" ); __asm( " isb") + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) _set_interrupt_priority( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/port.c new file mode 100644 index 0000000..4a53aa9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/port.c @@ -0,0 +1,688 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TI_VFP_SUPPORT__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Required to allow portasm.asm access the configMAX_SYSCALL_INTERRUPT_PRIORITY + * setting. */ +const uint32_t ulMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY; + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + #pragma WEAK( vPortSuppressTicksAndSleep ) + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm( " cpsid i"); + __asm( " dsb"); + __asm( " isb"); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm( " cpsie i"); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm( " dsb"); + __asm( " wfi"); + __asm( " isb"); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm( " cpsie i"); + __asm( " dsb"); + __asm( " isb"); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm( " cpsid i"); + __asm( " dsb"); + __asm( " isb"); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm( " cpsie i"); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +#pragma WEAK( vPortSetupTimerInterrupt ) +void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + extern uint32_t ulPortGetIPSR( void ); + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + ulCurrentInterrupt = ulPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portasm.asm b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portasm.asm new file mode 100644 index 0000000..29f4ec4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portasm.asm @@ -0,0 +1,172 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + .thumb + + .ref pxCurrentTCB + .ref vTaskSwitchContext + .ref ulMaxSyscallInterruptPriority + + .def xPortPendSVHandler + .def ulPortGetIPSR + .def vPortSVCHandler + .def vPortStartFirstTask + .def vPortEnableVFP + +NVICOffsetConst: .word 0xE000ED08 +CPACRConst: .word 0xE000ED88 +pxCurrentTCBConst: .word pxCurrentTCB +ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority + +; ----------------------------------------------------------- + + .align 4 +ulPortGetIPSR: .asmfunc + mrs r0, ipsr + bx r14 + .endasmfunc + ; ----------------------------------------------------------- + + .align 4 +vPortSetInterruptMask: .asmfunc + push {r0} + ldr r0, ulMaxSyscallInterruptPriorityConst + msr basepri, r0 + pop {r0} + bx r14 + .endasmfunc +; ----------------------------------------------------------- + + .align 4 +xPortPendSVHandler: .asmfunc + mrs r0, psp + isb + + ;/* Get the location of the current TCB. */ + ldr r3, pxCurrentTCBConst + ldr r2, [r3] + + ;/* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + ;/* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + ;/* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r0, r3} + ldr r0, ulMaxSyscallInterruptPriorityConst + ldr r1, [r0] + msr basepri, r1 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + ;/* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + ;/* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + ;/* Is the task using the FPU context? If so, pop the high vfp registers + ;too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + bx r14 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortSVCHandler: .asmfunc + ;/* Get the location of the current TCB. */ + ldr r3, pxCurrentTCBConst + ldr r1, [r3] + ldr r0, [r1] + ;/* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortStartFirstTask: .asmfunc + ;/* Use the NVIC offset register to locate the stack. */ + ldr r0, NVICOffsetConst + ldr r0, [r0] + ldr r0, [r0] + ;/* Set the msp back to the start of the stack. */ + msr msp, r0 + ;/* Clear the bit that indicates the FPU is in use in case the FPU was used + ;before the scheduler was started - which would otherwise result in the + ;unnecessary leaving of space in the SVC stack for lazy saving of FPU + ;registers. */ + mov r0, #0 + msr control, r0 + ;/* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc #0 + .endasmfunc + +; ----------------------------------------------------------- + + .align 4 +vPortEnableVFP: .asmfunc + ;/* The FPU enable bits are in the CPACR. */ + ldr.w r0, CPACRConst + ldr r1, [r0] + + ;/* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + .endasmfunc + + .end + +; ----------------------------------------------------------- + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..8e3fb6b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portmacro.h @@ -0,0 +1,165 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __asm( " dsb"); \ + __asm( " isb"); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() \ + { \ + _set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __asm( " dsb"); \ + __asm( " isb"); \ + } + + #define portENABLE_INTERRUPTS() _set_interrupt_priority( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() _set_interrupt_priority( configMAX_SYSCALL_INTERRUPT_PRIORITY ); __asm( " dsb" ); __asm( " isb") + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) _set_interrupt_priority( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/port.c new file mode 100644 index 0000000..63730e4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/port.c @@ -0,0 +1,313 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*-----------------------------------------------------------*/ + +/* Count of the critical section nesting depth. */ +uint32_t ulCriticalNesting = 9999; + +/*-----------------------------------------------------------*/ + +/* Registers required to configure the RTI. */ +#define portRTI_GCTRL_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC00 ) ) +#define portRTI_TBCTRL_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC04 ) ) +#define portRTI_COMPCTRL_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC0C ) ) +#define portRTI_CNT0_FRC0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC10 ) ) +#define portRTI_CNT0_UC0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC14 ) ) +#define portRTI_CNT0_CPUC0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC18 ) ) +#define portRTI_CNT0_COMP0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC50 ) ) +#define portRTI_CNT0_UDCP0_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC54 ) ) +#define portRTI_SETINTENA_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC80 ) ) +#define portRTI_CLEARINTENA_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC84 ) ) +#define portRTI_INTFLAG_REG ( * ( ( volatile uint32_t * ) 0xFFFFFC88 ) ) + + +/* Constants required to set up the initial stack of each task. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1F ) +#define portINITIAL_FPSCR ( ( StackType_t ) 0x00 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 0x04 ) +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) + +/* The number of words on the stack frame between the saved Top Of Stack and +R0 (in which the parameters are passed. */ +#define portSPACE_BETWEEN_TOS_AND_PARAMETERS ( 12 ) + +/*-----------------------------------------------------------*/ + +/* vPortStartFirstSTask() is defined in portASM.asm */ +extern void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* Saved as part of the task context. Set to pdFALSE if the task does not +require an FPU context. */ +uint32_t ulTaskHasFPUContext = 0; + +/*-----------------------------------------------------------*/ + + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + #if __TI_VFP_SUPPORT__ + { + /* Ensure the stack is correctly aligned on exit. */ + pxTopOfStack--; + } + #endif + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which is the start of the as + the task has not executed yet. The offset is added to make the return + address appear as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x00000000; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + + #ifdef portPRELOAD_TASK_REGISTERS + { + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + } + #else + { + pxTopOfStack -= portSPACE_BETWEEN_TOS_AND_PARAMETERS; + } + #endif + + /* Function parameters are passed in R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* Set the status register for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) ( ( _get_CPSR() & ~0xFF ) | portINITIAL_SPSR ); + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00 ) + { + /* The task will start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + #ifdef __TI_VFP_SUPPORT__ + { + pxTopOfStack--; + + /* The last thing on the stack is the tasks ulUsingFPU value, which by + default is set to indicate that the stack frame does not include FPU + registers. */ + *pxTopOfStack = pdFALSE; + } + #endif + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt(void) +{ + /* Disable timer 0. */ + portRTI_GCTRL_REG &= 0xFFFFFFFEUL; + + /* Use the internal counter. */ + portRTI_TBCTRL_REG = 0x00000000U; + + /* COMPSEL0 will use the RTIFRC0 counter. */ + portRTI_COMPCTRL_REG = 0x00000000U; + + /* Initialise the counter and the prescale counter registers. */ + portRTI_CNT0_UC0_REG = 0x00000000U; + portRTI_CNT0_FRC0_REG = 0x00000000U; + + /* Set Prescalar for RTI clock. */ + portRTI_CNT0_CPUC0_REG = 0x00000001U; + portRTI_CNT0_COMP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ; + portRTI_CNT0_UDCP0_REG = ( configCPU_CLOCK_HZ / 2 ) / configTICK_RATE_HZ; + + /* Clear interrupts. */ + portRTI_INTFLAG_REG = 0x0007000FU; + portRTI_CLEARINTENA_REG = 0x00070F0FU; + + /* Enable the compare 0 interrupt. */ + portRTI_SETINTENA_REG = 0x00000001U; + portRTI_GCTRL_REG |= 0x00000001U; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler(void) +{ + /* Start the timer that generates the tick ISR. */ + prvSetupTimerInterrupt(); + + /* Reset the critical section nesting count read to execute the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. This is done from portASM.asm as ARM mode must be + used. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +void vPortEndScheduler(void) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + * simply increment the system tick. */ + __interrupt void vPortNonPreemptiveTick( void ) + { + /* clear clock interrupt flag */ + portRTI_INTFLAG_REG = 0x00000001; + + /* Increment the tick count - this may make a delaying task ready + to run - but a context switch is not performed. */ + xTaskIncrementTick(); + } + + #else + + /* + ************************************************************************** + * The preemptive scheduler ISR is written in assembler and can be found + * in the portASM.asm file. This will only get used if portUSE_PREEMPTION + * is set to 1 in portmacro.h + ************************************************************************** + */ + void vPortPreemptiveTick( void ); + +#endif +/*-----------------------------------------------------------*/ + + +/* + * Disable interrupts, and keep a count of the nesting depth. + */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +/* + * Decrement the critical nesting count, and if it has reached zero, re-enable + * interrupts. + */ +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > 0 ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == 0 ) + { + /* Enable interrupts as per portENABLE_INTERRUPTS(). */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +#if __TI_VFP_SUPPORT__ + + void vPortTaskUsesFPU( void ) + { + extern void vPortInitialiseFPSCR( void ); + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (saved as part of the task context. */ + ulTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + vPortInitialiseFPSCR(); + } + +#endif /* __TI_VFP_SUPPORT__ */ + +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portASM.asm b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portASM.asm new file mode 100644 index 0000000..f4d19aa --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portASM.asm @@ -0,0 +1,230 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + .text + .arm + .ref vTaskSwitchContext + .ref xTaskIncrementTick + .ref ulTaskHasFPUContext + .ref pxCurrentTCB + +;/*-----------------------------------------------------------*/ +; +; Save Task Context +; +portSAVE_CONTEXT .macro + DSB + + ; Push R0 as we are going to use it + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP,{SP}^ + SUB SP, SP, #4 + LDMIA SP!,{R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now LR has been saved, it can be used instead of R0. + MOV LR, R0 + + ; Pop R0 so it can be saved onto the task stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR,{R0-LR}^ + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + .if (__TI_VFP_SUPPORT__) + ;Determine if the task maintains an FPU context. + LDR R0, ulFPUContextConst + LDR R0, [R0] + + ; Test the flag + CMP R0, #0 + + ; If the task is not using a floating point context then skip the + ; saving of the FPU registers. + BEQ $+16 + FSTMDBD LR!, {D0-D15} + FMRX R1, FPSCR + STMFD LR!, {R1} + + ; Save the flag + STMDB LR!, {R0} + .endif + + ; Store the new top of stack for the task. + LDR R0, pxCurrentTCBConst + LDR R0, [R0] + STR LR, [R0] + + .endm + +;/*-----------------------------------------------------------*/ +; +; Restore Task Context +; +portRESTORE_CONTEXT .macro + LDR R0, pxCurrentTCBConst + LDR R0, [R0] + LDR LR, [R0] + + .if (__TI_VFP_SUPPORT__) + ; The floating point context flag is the first thing on the stack. + LDR R0, ulFPUContextConst + LDMFD LR!, {R1} + STR R1, [R0] + + ; Test the flag + CMP R1, #0 + + ; If the task is not using a floating point context then skip the + ; VFP register loads. + BEQ $+16 + + ; Restore the floating point context. + LDMFD LR!, {R0} + FLDMIAD LR!, {D0-D15} + FMXR FPSCR, R0 + .endif + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_CSXF, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + .endm + +;/*-----------------------------------------------------------*/ +; Start the first task by restoring its context. + + .def vPortStartFirstTask + +vPortStartFirstTask: + portRESTORE_CONTEXT + +;/*-----------------------------------------------------------*/ +; Yield to another task. + + .def vPortYieldProcessor + +vPortYieldProcessor: + ; Within an IRQ ISR the link register has an offset from the true return + ; address. SWI doesn't do this. Add the offset manually so the ISR + ; return code can be used. + ADD LR, LR, #4 + + ; First save the context of the current task. + portSAVE_CONTEXT + + ; Select the next task to execute. */ + BL vTaskSwitchContext + + ; Restore the context of the task selected to execute. + portRESTORE_CONTEXT + +;/*-----------------------------------------------------------*/ +; Yield to another task from within the FreeRTOS API + + .def vPortYeildWithinAPI + +vPortYeildWithinAPI: + ; Save the context of the current task. + + portSAVE_CONTEXT + ; Clear SSI flag. + MOVW R0, #0xFFF4 + MOVT R0, #0xFFFF + LDR R0, [R0] + + ; Select the next task to execute. */ + BL vTaskSwitchContext + + ; Restore the context of the task selected to execute. + portRESTORE_CONTEXT + +;/*-----------------------------------------------------------*/ +; Preemptive Tick + + .def vPortPreemptiveTick + +vPortPreemptiveTick: + + ; Save the context of the current task. + portSAVE_CONTEXT + + ; Clear interrupt flag + MOVW R0, #0xFC88 + MOVT R0, #0xFFFF + MOV R1, #1 + STR R1, [R0] + + ; Increment the tick count, making any adjustments to the blocked lists + ; that may be necessary. + BL xTaskIncrementTick + + ; Select the next task to execute. + CMP R0, #0 + BLNE vTaskSwitchContext + + ; Restore the context of the task selected to execute. + portRESTORE_CONTEXT + +;------------------------------------------------------------------------------- + + .if (__TI_VFP_SUPPORT__) + + .def vPortInitialiseFPSCR + +vPortInitialiseFPSCR: + + MOV R0, #0 + FMXR FPSCR, R0 + BX LR + + .endif ;__TI_VFP_SUPPORT__ + + +pxCurrentTCBConst .word pxCurrentTCB +ulFPUContextConst .word ulTaskHasFPUContext +;------------------------------------------------------------------------------- + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portmacro.h new file mode 100644 index 0000000..0ab99b3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portmacro.h @@ -0,0 +1,118 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORTMACRO_H__ +#define __PORTMACRO_H__ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if (configUSE_16_BIT_TICKS == 1) + typedef uint16_t TickType_t; + #define portMAX_DELAY (TickType_t) 0xFFFF +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY (TickType_t) 0xFFFFFFFFF + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif + + +/* Architecture specifics. */ +#define portSTACK_GROWTH (-1) +#define portTICK_PERIOD_MS ((TickType_t) 1000 / configTICK_RATE_HZ) +#define portBYTE_ALIGNMENT 8 + +/* Critical section handling. */ +extern void vPortEnterCritical(void); +extern void vPortExitCritical(void); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portDISABLE_INTERRUPTS() asm( " CPSID I" ) +#define portENABLE_INTERRUPTS() asm( " CPSIE I" ) + +/* Scheduler utilities. */ +#pragma SWI_ALIAS( vPortYield, 0 ) +extern void vPortYield( void ); +#define portYIELD() vPortYield() +#define portSYS_SSIR1_REG ( * ( ( volatile uint32_t * ) 0xFFFFFFB0 ) ) +#define portSYS_SSIR1_SSKEY ( 0x7500UL ) +#define portYIELD_WITHIN_API() { portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY; asm( " DSB " ); asm( " ISB " ); } +#define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) { portSYS_SSIR1_REG = portSYS_SSIR1_SSKEY; ( void ) portSYS_SSIR1_REG; } } while( 0 ) + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +/* Architecture specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION(vFunction, pvParameters) void vFunction(void *pvParameters) +#define portTASK_FUNCTION_PROTO(vFunction, pvParameters) void vFunction(void *pvParameters) + +#endif /* __PORTMACRO_H__ */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/data_model.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/data_model.h new file mode 100644 index 0000000..d5c126c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/data_model.h @@ -0,0 +1,54 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + .if $DEFINED( __LARGE_DATA_MODEL__ ) + .define "pushm.a", pushm_x + .define "popm.a", popm_x + .define "push.a", push_x + .define "pop.a", pop_x + .define "mov.a", mov_x + .else + .define "pushm.w", pushm_x + .define "popm.w", popm_x + .define "push.w", push_x + .define "pop.w", pop_x + .define "mov.w", mov_x + .endif + + .if $DEFINED( __LARGE_CODE_MODEL__ ) + .define "calla", call_x + .define "reta", ret_x + .else + .define "call", call_x + .define "ret", ret_x + .endif + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/port.c new file mode 100644 index 0000000..d86fb90 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/port.c @@ -0,0 +1,188 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430X port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void vPortSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t *pusTopOfStack; +uint32_t *pulTopOfStack, ulTemp; + + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* Data types are need either 16 bits or 32 bits depending on the data + and code model used. */ + if( sizeof( pxCode ) == sizeof( uint16_t ) ) + { + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + ulTemp = ( uint32_t ) pxCode; + *pusTopOfStack = ( uint16_t ) ulTemp; + } + else + { + /* Make room for a 20 bit value stored as a 32 bit value. */ + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + pusTopOfStack--; + pulTopOfStack = ( uint32_t * ) pusTopOfStack; + *pulTopOfStack = ( uint32_t ) pxCode; + } + + pusTopOfStack--; + *pusTopOfStack = portFLAGS_INT_ENABLED; + pusTopOfStack -= ( sizeof( StackType_t ) / 2 ); + + /* From here on the size of stacked items depends on the memory model. */ + pxTopOfStack = ( StackType_t * ) pusTopOfStack; + + /* Next the general purpose registers. */ + #ifdef PRELOAD_REGISTER_VALUES + *pxTopOfStack = ( StackType_t ) 0xffff; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + #else + pxTopOfStack -= 3; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack -= 9; + #endif + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +void vPortSetupTimerInterrupt( void ) +{ + vApplicationSetupTimerInterrupt(); +} +/*-----------------------------------------------------------*/ + +#pragma vector=configTICK_VECTOR +interrupt void vTickISREntry( void ) +{ +extern void vPortTickISR( void ); + + __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); + #if configUSE_PREEMPTION == 1 + extern void vPortPreemptiveTickISR( void ); + vPortPreemptiveTickISR(); + #else + extern void vPortCooperativeTickISR( void ); + vPortCooperativeTickISR(); + #endif +} + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portext.asm b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portext.asm new file mode 100644 index 0000000..63886ac --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portext.asm @@ -0,0 +1,160 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + +; * The definition of the "register test" tasks, as described at the top of +; * main.c + + .include data_model.h + + .global xTaskIncrementTick + .global vTaskSwitchContext + .global vPortSetupTimerInterrupt + .global pxCurrentTCB + .global usCriticalNesting + + .def vPortPreemptiveTickISR + .def vPortCooperativeTickISR + .def vPortYield + .def xPortStartScheduler + +;----------------------------------------------------------- + +portSAVE_CONTEXT .macro + + ;Save the remaining registers. + pushm_x #12, r15 + mov.w &usCriticalNesting, r14 + push_x r14 + mov_x &pxCurrentTCB, r12 + mov_x sp, 0( r12 ) + .endm +;----------------------------------------------------------- + +portRESTORE_CONTEXT .macro + + mov_x &pxCurrentTCB, r12 + mov_x @r12, sp + pop_x r15 + mov.w r15, &usCriticalNesting + popm_x #12, r15 + nop + pop.w sr + nop + ret_x + .endm +;----------------------------------------------------------- + +;* +;* The RTOS tick ISR. +;* +;* If the cooperative scheduler is in use this simply increments the tick +;* count. +;* +;* If the preemptive scheduler is in use a context switch can also occur. +;*/ + + .text + .align 2 + +vPortPreemptiveTickISR: .asmfunc + + ; The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs + ;to save it manually before it gets modified (interrupts get disabled). + push.w sr + portSAVE_CONTEXT + + call_x #xTaskIncrementTick + call_x #vTaskSwitchContext + + portRESTORE_CONTEXT + .endasmfunc +;----------------------------------------------------------- + + .align 2 + +vPortCooperativeTickISR: .asmfunc + + ; The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs + ;to save it manually before it gets modified (interrupts get disabled). + push.w sr + portSAVE_CONTEXT + + call_x #xTaskIncrementTick + + portRESTORE_CONTEXT + + .endasmfunc +;----------------------------------------------------------- + +; +; Manual context switch called by the portYIELD() macro. +; + + .align 2 + +vPortYield: .asmfunc + + ; The sr needs saving before it is modified. + push.w sr + + ; Now the SR is stacked we can disable interrupts. + dint + nop + + ; Save the context of the current task. + portSAVE_CONTEXT + + ; Select the next task to run. + call_x #vTaskSwitchContext + + ; Restore the context of the new task. + portRESTORE_CONTEXT + .endasmfunc +;----------------------------------------------------------- + + +; +; Start off the scheduler by initialising the RTOS tick timer, then restoring +; the context of the first task. +; + + .align 2 + +xPortStartScheduler: .asmfunc + + ; Setup the hardware to generate the tick. Interrupts are disabled + ; when this function is called. + call_x #vPortSetupTimerInterrupt + + ; Restore the context of the first task that is going to run. + portRESTORE_CONTEXT + .endasmfunc +;----------------------------------------------------------- + + .end + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portmacro.h new file mode 100644 index 0000000..c143d30 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portmacro.h @@ -0,0 +1,144 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Hardware includes. */ +#include "msp430.h" + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portBASE_TYPE portSHORT + +/* The stack type changes depending on the data model. */ +#ifdef __LARGE_DATA_MODEL__ + #define portSTACK_TYPE uint32_t +#else + #define portSTACK_TYPE uint16_t + #define portPOINTER_SIZE_TYPE uint16_t +#endif + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _disable_interrupt(); _nop() +#define portENABLE_INTERRUPTS() _enable_interrupt(); _nop() +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) do { if( x ) vPortYield(); } while( 0 ) + +void vApplicationSetupTimerInterrupt( void ); + +/* sizeof( int ) != sizeof( long ) so a full printf() library is required if +run time stats information is to be displayed. */ +#define portLU_PRINTF_SPECIFIER_REQUIRED + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CMakeLists.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CMakeLists.txt new file mode 100644 index 0000000..ea54ec4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CMakeLists.txt @@ -0,0 +1,994 @@ +# FreeRTOS internal cmake file. Do not use it in user top-level project + +add_library(freertos_kernel_port STATIC + # 16-Bit DOS ports for BCC + $<$: + BCC/16BitDOS/common/portcomn.c + BCC/16BitDOS/Flsh186/port.c> + + $<$: + BCC/16BitDOS/common/portcomn.c + BCC/16BitDOS/PC/port.c> + + # ARMv7-M port for Texas Instruments Code Composer Studio + $<$: + CCS/ARM_CM3/port.c + CCS/ARM_CM3/portasm.asm> + + # ARMv7E-M port for Texas Instruments Code Composer Studio + $<$: + CCS/ARM_CM4F/port.c + CCS/ARM_CM4F/portasm.asm> + + # ARMv7-R port for Texas Instruments Code Composer Studio + $<$: + CCS/ARM_Cortex-R4/port.c + CCS/ARM_Cortex-R4/portASM.asm> + + # Texas Instruments MSP430 port for Texas Instruments Code Composer Studio + $<$: + CCS/MSP430X/port.c + CCS/MSP430X/portext.asm> + + # NXP (formerly Motorola, Freescale) Cold Fire and 68HCS12 ports for Code Warrior + $<$: + CodeWarrior/ColdFire_V1/port.c + CodeWarrior/ColdFire_V1/portasm.S> + + $<$: + CodeWarrior/ColdFire_V2/port.c + CodeWarrior/ColdFire_V2/portasm.S> + + $<$: + CodeWarrior/HCS12/port.c> + + # ARMv7-A port for GCC + $<$: + GCC/ARM_CA9/port.c + GCC/ARM_CA9/portASM.S> + + # ARMv8-A ports for GCC + $<$: + GCC/ARM_CA53_64_BIT/port.c + GCC/ARM_CA53_64_BIT/portASM.S> + + $<$: + GCC/ARM_CA53_64_BIT_SRE/port.c + GCC/ARM_CA53_64_BIT_SRE/portASM.S> + + # ARMv6-M port for GCC + $<$: + GCC/ARM_CM0/port.c> + + # ARMv6-M / Cortex-M0 Raspberry PI RP2040 port for GCC + $<$: + ThirdParty/GCC/RP2040/idle_task_static_memory.c + ThirdParty/GCC/RP2040/port.c> + + # ARMv7-M ports for GCC + $<$: + GCC/ARM_CM3/port.c> + + $<$: + GCC/ARM_CM3_MPU/port.c> + + # ARMv7E-M ports for GCC + $<$: + GCC/ARM_CM4_MPU/port.c> + + $<$: + GCC/ARM_CM4F/port.c> + + $<$: + GCC/ARM_CM7/r0p1/port.c> + + # ARMv8-M ports for GCC + $<$: + GCC/ARM_CM23/non_secure/port.c + GCC/ARM_CM23/non_secure/portasm.c> + + $<$: + GCC/ARM_CM23/secure/secure_context_port.c + GCC/ARM_CM23/secure/secure_context.c + GCC/ARM_CM23/secure/secure_heap.c + GCC/ARM_CM23/secure/secure_init.c> + + $<$: + GCC/ARM_CM23_NTZ/non_secure/port.c + GCC/ARM_CM23_NTZ/non_secure/portasm.c> + + $<$: + GCC/ARM_CM33/non_secure/port.c + GCC/ARM_CM33/non_secure/portasm.c> + + $<$: + GCC/ARM_CM33/secure/secure_context_port.c + GCC/ARM_CM33/secure/secure_context.c + GCC/ARM_CM33/secure/secure_heap.c + GCC/ARM_CM33/secure/secure_init.c> + + $<$: + GCC/ARM_CM33_NTZ/non_secure/port.c + GCC/ARM_CM33_NTZ/non_secure/portasm.c> + + $<$: + GCC/ARM_CM33_NTZ/non_secure/port.c + GCC/ARM_CM33_NTZ/non_secure/portasm.c + ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c> + + # ARMv8.1-M ports for GCC + $<$: + GCC/ARM_CM55/non_secure/port.c + GCC/ARM_CM55/non_secure/portasm.c> + + $<$: + GCC/ARM_CM55/secure/secure_context_port.c + GCC/ARM_CM55/secure/secure_context.c + GCC/ARM_CM55/secure/secure_heap.c + GCC/ARM_CM55/secure/secure_init.c> + + $<$: + GCC/ARM_CM55_NTZ/non_secure/port.c + GCC/ARM_CM55_NTZ/non_secure/portasm.c> + + $<$: + GCC/ARM_CM55_NTZ/non_secure/port.c + GCC/ARM_CM55_NTZ/non_secure/portasm.c + ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c> + + $<$: + GCC/ARM_CM85/non_secure/port.c + GCC/ARM_CM85/non_secure/portasm.c> + + $<$: + GCC/ARM_CM85/secure/secure_context_port.c + GCC/ARM_CM85/secure/secure_context.c + GCC/ARM_CM85/secure/secure_heap.c + GCC/ARM_CM85/secure/secure_init.c> + + $<$: + GCC/ARM_CM85_NTZ/non_secure/port.c + GCC/ARM_CM85_NTZ/non_secure/portasm.c> + + $<$: + GCC/ARM_CM85_NTZ/non_secure/port.c + GCC/ARM_CM85_NTZ/non_secure/portasm.c + ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c> + + # ARMv7-R ports for GCC + $<$: + GCC/ARM_CR5/port.c + GCC/ARM_CR5/portASM.S> + + $<$: + GCC/ARM_CRx_No_GIC/port.c + GCC/ARM_CRx_No_GIC/portASM.S> + + # ARMv4T ARM7TDMI ports for GCC + $<$: + GCC/ARM7_AT91FR40008/port.c + GCC/ARM7_AT91FR40008/portISR.c> + + $<$: + GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c + GCC/ARM7_AT91SAM7S/port.c + GCC/ARM7_AT91SAM7S/portISR.c> + + $<$: + GCC/ARM7_LPC2000/port.c + GCC/ARM7_LPC2000/portISR.c> + + $<$: + GCC/ARM7_LPC23xx/port.c + GCC/ARM7_LPC23xx/portISR.c> + + $<$: + GCC/STR75x/port.c + GCC/STR75x/portISR.c> + + # Microchip (formerly Ateml) AVR8 ports for GCC + $<$: + GCC/ATMega323/port.c> + + $<$: + ThirdParty/GCC/ATmega/port.c> + + $<$: + ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c> + + $<$: + ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c> + + # Microchip (formerly Ateml) AVR32 port for GCC + $<$: + GCC/AVR32_UC3/exception.S + GCC/AVR32_UC3/port.c> + + # NXP (formerly Motorola, Freescale) Cold Fire and 68HCS12 ports for GCC + $<$: + GCC/ColdFire_V2/port.c + GCC/ColdFire_V2/portasm.S> + + $<$: + GCC/HCS12/port.c> + + # Cortus APS3 soft core port for GCC + $<$: + GCC/CORTUS_APS3/port.c> + + # Renesas (formerly Hitach) H8S port for GCC + $<$: + GCC/H8S2329/port.c> + + # x86 / IA32 flat memory model port for GCC + $<$: + GCC/IA32_flat/port.c + GCC/IA32_flat/portASM.S> + + # Xilinx MicroBlaze soft core ports for GCC + $<$: + GCC/MicroBlaze/port.c + GCC/MicroBlaze/portasm.s> + + $<$: + GCC/MicroBlazeV8/port.c + GCC/MicroBlazeV8/port_exceptions.c + GCC/MicroBlazeV8/portasm.S> + + $<$: + GCC/MicroBlazeV9/port.c + GCC/MicroBlazeV9/port_exceptions.c + GCC/MicroBlazeV9/portasm.S> + + # Xilinx PCC4XX soft core ports for GCC + $<$: + GCC/PPC405_Xilinx/port.c + GCC/PPC405_Xilinx/portasm.S> + + $<$: + GCC/PPC440_Xilinx/port.c + GCC/PPC440_Xilinx/portasm.S> + + # Texas Instruments MSP430 port for GCC + $<$: + GCC/MSP430F449/port.c> + + # Intel (formerly Altera) NIOS II soft core port for GCC + $<$: + GCC/NiosII/port.c + GCC/NiosII/port_asm.S> + + # RISC-V architecture ports for GCC + $<$: + GCC/RISC-V/port.c + GCC/RISC-V/portASM.S> + + $<$: + GCC/RISC-V/port.c + GCC/RISC-V/portASM.S> + + # Renesas RL78 port for GCC + $<$: + GCC/RL78/port.c + GCC/RL78/portasm.S> + + # Renesas RX architecture ports for GCC + $<$: + GCC/RX100/port.c> + + $<$: + GCC/RX200/port.c> + + $<$: + GCC/RX600/port.c> + + $<$: + GCC/RX600v2/port.c> + + $<$: + GCC/RX700v3_DPFPU/port.c> + + # Infineon TriCore 1782 port for GCC + $<$: + GCC/TriCore_1782/port.c + GCC/TriCore_1782/porttrap.c> + + # Synopsys ARC architecture ports for GCC + $<$: + ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c + ThirdParty/GCC/ARC_EM_HS/arc_support.s + ThirdParty/GCC/ARC_EM_HS/freertos_tls.c + ThirdParty/GCC/ARC_EM_HS/port.c> + + $<$: + ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c + ThirdParty/GCC/ARC_v1/arc_support.s + ThirdParty/GCC/ARC_v1/port.c> + + # Posix Simulator port for GCC + $<$: + ThirdParty/GCC/Posix/port.c + ThirdParty/GCC/Posix/utils/wait_for_event.c> + + # Xtensa LX / Espressif ESP32 port for GCC + $<$: + ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c + ThirdParty/GCC/Xtensa_ESP32/port.c + ThirdParty/GCC/Xtensa_ESP32/portasm.S + ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S + ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c + ThirdParty/GCC/Xtensa_ESP32/xtensa_intr_asm.S + ThirdParty/GCC/Xtensa_ESP32/xtensa_intr.c + ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S + ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c + ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S + ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S> + + # Renesas (formerly NEC) 78K port for IAR EW78K + $<$: + IAR/78K0R/port.c + IAR/78K0R/portasm.s26> + + # ARMv7-A ports for IAR EWARM + $<$: + IAR/ARM_CA5_No_GIC/port.c + IAR/ARM_CA5_No_GIC/portASM.s> + + $<$: + IAR/ARM_CA9/port.c + IAR/ARM_CA9/portASM.s> + + # ARMv6-M port for IAR EWARM + $<$: + IAR/ARM_CM0/port.c + IAR/ARM_CM0/portasm.s> + + # ARMv7-M port for IAR EWARM + $<$: + IAR/ARM_CM3/port.c + IAR/ARM_CM3/portasm.s> + + # ARMv7E-M ports for IAR EWARM + $<$: + IAR/ARM_CM4F/port.c + IAR/ARM_CM4F/portasm.s> + + $<$: + IAR/ARM_CM4F_MPU/port.c + IAR/ARM_CM4F_MPU/portasm.s> + + $<$: + IAR/ARM_CM7/r0p1/port.c + IAR/ARM_CM7/r0p1/portasm.s> + + # ARMv8-M Ports for IAR EWARM + $<$: + IAR/ARM_CM23/non_secure/port.c + IAR/ARM_CM23/non_secure/portasm.s> + + $<$: + IAR/ARM_CM23/secure/secure_context_port_asm.s + IAR/ARM_CM23/secure/secure_context.c + IAR/ARM_CM23/secure/secure_heap.c + IAR/ARM_CM23/secure/secure_init.c> + + $<$: + IAR/ARM_CM23_NTZ/non_secure/port.c + IAR/ARM_CM23_NTZ/non_secure/portasm.s> + + $<$: + IAR/ARM_CM33/non_secure/port.c + IAR/ARM_CM33/non_secure/portasm.s> + + $<$: + IAR/ARM_CM33/secure/secure_context_port_asm.s + IAR/ARM_CM33/secure/secure_context.c + IAR/ARM_CM33/secure/secure_heap.c + IAR/ARM_CM33/secure/secure_init.c> + + $<$: + IAR/ARM_CM33_NTZ/non_secure/port.c + IAR/ARM_CM33_NTZ/non_secure/portasm.s> + + # ARMv8.1-M ports for IAR EWARM + $<$: + IAR/ARM_CM55/non_secure/port.c + IAR/ARM_CM55/non_secure/portasm.s> + + $<$: + IAR/ARM_CM55/secure/secure_context_port_asm.s + IAR/ARM_CM55/secure/secure_context.c + IAR/ARM_CM55/secure/secure_heap.c + IAR/ARM_CM55/secure/secure_init.c> + + $<$: + IAR/ARM_CM55_NTZ/non_secure/port.c + IAR/ARM_CM55_NTZ/non_secure/portasm.s> + + $<$: + IAR/ARM_CM85/non_secure/port.c + IAR/ARM_CM85/non_secure/portasm.s> + + $<$: + IAR/ARM_CM85/secure/secure_context_port_asm.s + IAR/ARM_CM85/secure/secure_context.c + IAR/ARM_CM85/secure/secure_heap.c + IAR/ARM_CM85/secure/secure_init.c> + + $<$: + IAR/ARM_CM85_NTZ/non_secure/port.c + IAR/ARM_CM85_NTZ/non_secure/portasm.s> + + # ARMv7-R Ports for IAR EWARM + $<$: + IAR/ARM_CRx_No_GIC/port.c + IAR/ARM_CRx_No_GIC/portASM.s> + + # Microchip (formerly Atmel) AVR8 ports for IAR EWAVR + $<$: + IAR/ATMega323/port.c + IAR/ATMega323/portmacro.s90> + + $<$: + IAR/AVR_AVRDx/port.c + IAR/AVR_AVRDx/portmacro.s90> + + $<$: + IAR/AVR_Mega0/port.c + IAR/AVR_Mega0/portmacro.s90> + + # Microchip (formerly Atmel) AVR32 port for IAR Embedded Workbench for AVR32 + $<$: + IAR/AVR32_UC3/exception.s82 + IAR/AVR32_UC3/port.c + IAR/AVR32_UC3/read.c + IAR/AVR32_UC3/write.c> + + # Texas Instruments MSP430 ports for IAR Embedded Workbench for MSP430 + $<$: + IAR/MSP430/port.c + IAR/MSP430/portext.s43> + + $<$: + IAR/MSP430X/port.c + IAR/MSP430X/portext.s43> + + # RISC-V architecture port for IAR Embedded Workbench for RISC-V + $<$: + IAR/RISC-V/port.c + IAR/RISC-V/portASM.s> + + # Renesas RL78 port for IAR EWRL78 + $<$: + IAR/RL78/port.c + IAR/RL78/portasm.s87> + + # Renesas RX architecture ports for IAR EWRX + $<$: + IAR/RX100/port.c + IAR/RX100/port_asm.s> + + $<$: + IAR/RX600/port.c + IAR/RX600/port_asm.s> + + $<$: + IAR/RX700v3_DPFPU/port.c> + + $<$: + IAR/RXv2/port.c + IAR/RXv2/port_asm.s> + + # Renesas (formerly NEC) V850ES port for IAR EWV850 + $<$: + IAR/V850ES/port.c + IAR/V850ES/portasm_Fx3.s85> + + $<$: + IAR/V850ES/port.c + IAR/V850ES/portasm_Hx2.s85> + + # ARMv4T ARM7TDMI ports for IAR Embedded Workbench for ARM + $<$: + IAR/STR71x/port.c + IAR/STR71x/portasm.s79> + + $<$: + IAR/STR75x/port.c + IAR/STR75x/portasm.s79> + + $<$: + IAR/LPC2000/port.c + IAR/LPC2000/portasm.s79> + + $<$: + IAR/AtmelSAM7S64/port.c + IAR/AtmelSAM7S64/portasm.s79> + + # ARMv5TE ARM926 ports for IAR Embedded Workbench for ARM + $<$: + IAR/STR91x/port.c + IAR/STR91x/portasm.s79> + + $<$: + IAR/AtmelSAM9XE/port.c + IAR/AtmelSAM9XE/portasm.s79> + + # ARM Cortex-M4F port for the MikroElektronika MikroC compiler + $<$: + MikroC/ARM_CM4F/port.c> + + # Microchip PIC18 8-bit MCU port for MPLAB XC8 + $<$: + MPLAB/PIC18F/port.c> + + # Microchip PIC24 16-bit MCU port for MPLAB XC16 + $<$: + MPLAB/PIC24_dsPIC/port.c + MPLAB/PIC24_dsPIC/portasm_PIC24.S> # TODO: What to do with portasm_dsPIC.S ? + + # Microchip MIPS 32-Bit MCU ports for MPLAB XC32 + $<$: + MPLAB/PIC32MEC14xx/port.c + MPLAB/PIC32MEC14xx/port_asm.S> + + $<$: + MPLAB/PIC32MX/port.c + MPLAB/PIC32MX/port_asm.S> + + $<$: + MPLAB/PIC32MZ/port.c + MPLAB/PIC32MZ/port_asm.S> + + # Windows Simulator for Microsoft Visual C Compiler and MinGW GCC + $<$: + MSVC-MingW/port.c> + + # 16 bit DOS ports for Open Watcom + $<$: + oWatcom/16BitDOS/common/portcomn.c + oWatcom/16BitDOS/Flsh186/port.c> + + $<$: + oWatcom/16BitDOS/common/portcomn.c + oWatcom/16BitDOS/PC/port.c> + + $<$: + Paradigm/Tern_EE/large_untested/port.c> + + $<$: + Paradigm/Tern_EE/small/port.c> + + # Renesas RX mcu ports for Renesas CC-RX + $<$: + Renesas/RX100/port.c + Renesas/RX100/port_asm.src> + + $<$: + Renesas/RX200/port.c + Renesas/RX200/port_asm.src> + + $<$: + Renesas/RX600/port.c + Renesas/RX600/port_asm.src> + + $<$: + Renesas/RX600v2/port.c + Renesas/RX600v2/port_asm.src> + + $<$: + Renesas/RX700v3_DPFPU/port.c + Renesas/RX700v3_DPFPU/port_asm.src> + + # Renesas (formerly Hitach) SHA2 SuperH port for the Renesas SH C Compiler + $<$: + Renesas/SH2A_FPU/port.c + Renesas/SH2A_FPU/portasm.src> + + # Texas Instruments MSP430 port for Rowley CrossWorks + $<$: + Rowley/MSP430F449/port.c + Rowley/MSP430F449/portext.asm> + + # ARMv7-A Cortex-A9 port for ARM RVDS / armcc + $<$: + RVDS/ARM_CA9/port.c + RVDS/ARM_CA9/portASM.s> + + # ARMv6-M port for ARM RVDS / armcc + $<$: + RVDS/ARM_CM0/port.c> + + # ARMv7-M port for ARM RVDS / armcc + $<$: + RVDS/ARM_CM3/port.c> + + # ARMv7E-M ports for ARM RVDS / armcc + $<$: + RVDS/ARM_CM4_MPU/port.c> + + $<$: + RVDS/ARM_CM4F/port.c> + + $<$: + RVDS/ARM_CM7/r0p1/port.c> + + # ARMv4T / ARM7TDMI LPC21XX port for ARM RVDS / armcc + $<$: + RVDS/ARM7_LPC21xx/port.c + RVDS/ARM7_LPC21xx/portASM.s> + + # Cygnal c8051 port for SDCC (Small Device C Compiler) + $<$: + SDCC/Cygnal/port.c> + + # Infineon (formerly Fujitsu, Spansion, Cypress) MB9x ports for Softune C Compiler + $<$: + Softune/MB91460/__STD_LIB_sbrk.c + Softune/MB91460/port.c> + + $<$: + Softune/MB96340/__STD_LIB_sbrk.c + Softune/MB96340/port.c> + + # ARMv7E-M (Cortex-M4F) port for TASKING VX-toolset for ARM + $<$: + Tasking/ARM_CM4F/port.c + Tasking/ARM_CM4F/port_asm.asm> + + # Port for C-SKY T-HEAD CK802 + $<$: + ThirdParty/CDK/T-HEAD_CK802/port.c + ThirdParty/CDK/T-HEAD_CK802/portasm.S> + + # Tensilica Xtensa port for XCC + $<$: + ThirdParty/XCC/Xtensa/port.c + ThirdParty/XCC/Xtensa/portasm.S + ThirdParty/XCC/Xtensa/portclib.c + ThirdParty/XCC/Xtensa/xtensa_context.S + ThirdParty/XCC/Xtensa/xtensa_init.c + ThirdParty/XCC/Xtensa/xtensa_intr_asm.S + ThirdParty/XCC/Xtensa/xtensa_intr.c + ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c + ThirdParty/XCC/Xtensa/xtensa_vectors.S> + + # Microchip PIC18 port for WIZ-C + $<$: + WizC/PIC18/port.c + WizC/PIC18/Drivers/Tick/isrTick.c + WizC/PIC18/Drivers/Tick/Tick.c> +) + +if( FREERTOS_PORT MATCHES "GCC_ARM_CM(3|4)_MPU" OR + FREERTOS_PORT STREQUAL "IAR_ARM_CM4F_MPU" OR + FREERTOS_PORT STREQUAL "RVDS_ARM_CM4_MPU" OR + FREERTOS_PORT MATCHES "GCC_ARM_CM(23|33|55|85)_NTZ_NONSECURE" OR + FREERTOS_PORT MATCHES "GCC_ARM_CM(23|33|55|85)_NONSECURE" OR + FREERTOS_PORT MATCHES "GCC_ARM_CM(33|55|85)_TFM" OR + FREERTOS_PORT MATCHES "IAR_ARM_CM(23|33|55|85)_NTZ_NONSECURE" OR + FREERTOS_PORT MATCHES "IAR_ARM_CM(23|33|55|85)_NONSECURE" +) + target_sources(freertos_kernel_port PRIVATE Common/mpu_wrappers.c) +endif() + +target_include_directories(freertos_kernel_port PUBLIC + # 16-Bit DOS ports for BCC + $<$: + ${CMAKE_CURRENT_LIST_DIR}/BCC/16BitDOS/common + ${CMAKE_CURRENT_LIST_DIR}/BCC/16BitDOS/Flsh186> + + $<$: + ${CMAKE_CURRENT_LIST_DIR}/BCC/16BitDOS/common + ${CMAKE_CURRENT_LIST_DIR}/BCC/16BitDOS/PC> + + # ARMv7-M port for Texas Instruments Code Composer Studio + $<$:${CMAKE_CURRENT_LIST_DIR}/CCS/ARM_CM3> + + # ARMv7E-M port for Texas Instruments Code Composer Studio + $<$:${CMAKE_CURRENT_LIST_DIR}/CCS/ARM_CM4F> + + # ARMv7-R port for Texas Instruments Code Composer Studio + $<$:${CMAKE_CURRENT_LIST_DIR}/CCS/ARM_Cortex-R4> + + # Texas Instruments MSP430 port for Texas Instruments Code Composer Studio + $<$:${CMAKE_CURRENT_LIST_DIR}/CCS/MSP430X> + + # NXP (formerly Motorola, Freescale) Cold Fire and 68HCS12 ports for Code Warrior + $<$:${CMAKE_CURRENT_LIST_DIR}/CodeWarrior/ColdFire_V1> + $<$:${CMAKE_CURRENT_LIST_DIR}/CodeWarrior/ColdFire_V2> + $<$:${CMAKE_CURRENT_LIST_DIR}/CodeWarrior/HCS12> + + # ARMv7-A port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CA9> + + # ARMv8-A ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CA53_64_BIT> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CA53_64_BIT_SRE> + + # ARMv6-M port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM0> + + # ARMv6-M / Cortex-M0 Raspberry PI RP2040 port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/ThirdParty/GCC/RP2040/include> + + # ARMv7-M ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM3> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM3_MPU> + + # ARMv7E-M ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM4_MPU> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM4F> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM7/r0p1> + + # ARMv8-M ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM23/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM23/secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM23_NTZ/non_secure> + + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM33/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM33/secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM33_NTZ/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM33_NTZ/non_secure> + + # ARMv8.1-M ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM55/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM55/secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM55_NTZ/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM85_NTZ/non_secure> + + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM85/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM85/secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM85_NTZ/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CM85_NTZ/non_secure> + + # ARMv7-R ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CR5> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM_CRx_No_GIC> + + # ARMv4T ARM7TDMI ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM7_AT91FR40008> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM7_AT91SAM7S> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM7_LPC2000> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ARM7_LPC23xx> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/STR75x> + + # Microchip (formerly Ateml) AVR8 ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ATMega323> + $<$:${CMAKE_CURRENT_LIST_DIR}/ThirdParty/GCC/ATmega> + $<$:${CMAKE_CURRENT_LIST_DIR}/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx> + $<$:${CMAKE_CURRENT_LIST_DIR}/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0> + + # Microchip (formerly Ateml) AVR32 port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/AVR32_UC3> + + # NXP (formerly Motorola, Freescale) Cold Fire and 68HCS12 ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/ColdFire_V2> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/HCS12> + + # Cortus APS3 soft core port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/CORTUS_APS3> + + # Renesas (formerly Hitach) H8S port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/H8S2329> + + # x86 / IA32 flat memory model port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/IA32_flat> + + # Intel (formerly Altera) NIOS II soft core port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/NiosII> + + # Texas Instruments MSP430 port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/MSP430F449> + + # Xilinx MicroBlaze soft core ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/MicroBlaze> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/MicroBlazeV8> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/MicroBlazeV9> + + # Xilinx PCC4XX soft core ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/PPC405_Xilinx> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/PPC440_Xilinx> + + # RISC-V architecture ports for GCC + $<$: + ${CMAKE_CURRENT_LIST_DIR}/GCC/RISC-V + ${CMAKE_CURRENT_LIST_DIR}/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions> + + $<$: + ${CMAKE_CURRENT_LIST_DIR}/GCC/RISC-V + ${CMAKE_CURRENT_LIST_DIR}/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM> + + # Renesas RL78 port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/RL78> + + # Renesas RX architecture ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/RX100> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/RX200> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/RX600> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/RX600v2> + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/RX700v3_DPFPU> + + # Infineon TriCore 1782 port for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/GCC/TriCore_1782> + + # Synopsys ARC architecture ports for GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/ThirdParty/GCC/ARC_EM_HS> + $<$:${CMAKE_CURRENT_LIST_DIR}/ThirdParty/GCC/ARC_v1> + + # Posix Simulator port for GCC + $<$: + ${CMAKE_CURRENT_LIST_DIR}/ThirdParty/GCC/Posix + ${CMAKE_CURRENT_LIST_DIR}/ThirdParty/GCC/Posix/utils> + + # Xtensa LX / Espressif ESP32 port for GCC + $<$: + ${CMAKE_CURRENT_LIST_DIR}/ThirdParty/GCC/Xtensa_ESP32 + ${CMAKE_CURRENT_LIST_DIR}/ThirdParty/GCC/Xtensa_ESP32/include> + + # Renesas (formerly NEC) 78K port for IAR EW78K + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/78K0R> + + # ARMv7-A ports for IAR EWARM + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CA5_No_GIC> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CA9> + + # ARMv6-M port for IAR EWARM + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM0> + + # ARMv7-M port for IAR EWARM + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM3> + + # ARMv7E-M ports for IAR EWARM + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM4F> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM4F_MPU> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM7/r0p1> + + # ARMv8-M Ports for IAR EWARM + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM23/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM23/secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM23_NTZ/non_secure> + + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM33/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM33/secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM33_NTZ/non_secure> + + # ARMv8.1-M ports for IAR EWARM + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM55/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM55/secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM55_NTZ/non_secure> + + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM85/non_secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM85/secure> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CM85_NTZ/non_secure> + + # ARMv7-R Ports for IAR EWARM + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ARM_CRx_No_GIC> + + # ARMv4T ARM7TDMI ports for IAR Embedded Workbench for ARM + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/STR71x> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/STR75x> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/LPC2000> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/AtmelSAM7S64> + + # ARMv5TE ARM926 ports for IAR Embedded Workbench for ARM + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/STR91x> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/AtmelSAM9XE> + + # Microchip (formerly Atmel) AVR8 ports for IAR EWAVR + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/ATMega323> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/AVR_AVRDx> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/AVR_Mega0> + + # Microchip (formerly Atmel) AVR32 port for IAR Embedded Workbench for AVR32 + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/AVR32_UC3> + + # Texas Instruments MSP430 ports for IAR Embedded Workbench for MSP430 + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/MSP430> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/MSP430X> + + # RISC-V architecture port for IAR Embedded Workbench for RISC-V + $<$: + ${CMAKE_CURRENT_LIST_DIR}/IAR/RISC-V + ${CMAKE_CURRENT_LIST_DIR}/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions> + + # Renesas RL78 port for IAR EWRL78 + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/RL78> + + # Renesas RX architecture ports for IAR EWRX + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/RX100> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/RX600> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/RX700v3_DPFPU> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/RXv2> + + # Renesas (formerly NEC) V850ES port for IAR EWV850 + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/V850ES> + $<$:${CMAKE_CURRENT_LIST_DIR}/IAR/V850ES> + + # ARM Cortex-M4F port for the MikroElektronika MikroC compiler + $<$:${CMAKE_CURRENT_LIST_DIR}/MikroC/ARM_CM4F> + + # Microchip PIC18 8-bit MCU port for MPLAB XC8 + $<$:${CMAKE_CURRENT_LIST_DIR}/MPLAB/PIC18F> + + # Microchip PIC24 16-bit MCU port for MPLAB XC16 + $<$:${CMAKE_CURRENT_LIST_DIR}/MPLAB/PIC24_dsPIC> + + # Microchip MIPS 32-Bit MCU ports for MPLAB XC32 + $<$:${CMAKE_CURRENT_LIST_DIR}/MPLAB/PIC32MEC14xx> + $<$:${CMAKE_CURRENT_LIST_DIR}/MPLAB/PIC32MX> + $<$:${CMAKE_CURRENT_LIST_DIR}/MPLAB/PIC32MZ> + + # Windows Simulator for Microsoft Visual C Compiler and MinGW GCC + $<$:${CMAKE_CURRENT_LIST_DIR}/MSVC-MingW> + + # 16 bit DOS ports for Open Watcom + $<$: + ${CMAKE_CURRENT_LIST_DIR}/oWatcom/16BitDOS/common + ${CMAKE_CURRENT_LIST_DIR}/oWatcom/16BitDOS/Flsh186> + $<$: + ${CMAKE_CURRENT_LIST_DIR}/oWatcom/16BitDOS/common + ${CMAKE_CURRENT_LIST_DIR}/oWatcom/16BitDOS/PC> + + $<$:${CMAKE_CURRENT_LIST_DIR}/Paradigm/Tern_EE/large_untested> + $<$:${CMAKE_CURRENT_LIST_DIR}/Paradigm/Tern_EE/small> + + # Renesas RX mcu ports for Renesas CC-RX + $<$:${CMAKE_CURRENT_LIST_DIR}/Renesas/RX100> + $<$:${CMAKE_CURRENT_LIST_DIR}/Renesas/RX200> + $<$:${CMAKE_CURRENT_LIST_DIR}/Renesas/RX600> + $<$:${CMAKE_CURRENT_LIST_DIR}/Renesas/RX600v2> + $<$:${CMAKE_CURRENT_LIST_DIR}/Renesas/RX700v3_DPFPU> + + # Renesas (formerly Hitach) SHA2 SuperH port for the Renesas SH C Compiler + $<$:${CMAKE_CURRENT_LIST_DIR}/Renesas/SH2A_FPU> + + # Texas Instruments MSP430 port for Rowley CrossWorks + $<$:${CMAKE_CURRENT_LIST_DIR}/Rowley/MSP430F449> + + # ARMv7-A Cortex-A9 port for ARM RVDS / armcc + $<$:${CMAKE_CURRENT_LIST_DIR}/RVDS/ARM_CA9> + + # ARMv6-M port for ARM RVDS / armcc + $<$:${CMAKE_CURRENT_LIST_DIR}/RVDS/ARM_CM0> + + # ARMv7-M port for ARM RVDS / armcc + $<$:${CMAKE_CURRENT_LIST_DIR}/RVDS/ARM_CM3> + + # ARMv7E-M ports for ARM RVDS / armcc + $<$:${CMAKE_CURRENT_LIST_DIR}/RVDS/ARM_CM4_MPU> + $<$:${CMAKE_CURRENT_LIST_DIR}/RVDS/ARM_CM4F> + $<$:${CMAKE_CURRENT_LIST_DIR}/RVDS/ARM_CM7/r0p1> + + # ARMv4T / ARM7TDMI LPC21XX port for ARM RVDS / armcc + $<$:${CMAKE_CURRENT_LIST_DIR}/RVDS/ARM7_LPC21xx> + + # Cygnal c8051 port for SDCC (Small Device C Compiler) + $<$:${CMAKE_CURRENT_LIST_DIR}/SDCC/Cygnal> + + # Infineon (formerly Fujitsu, Spansion, Cypress) MB9x ports for Softune C Compiler + $<$:${CMAKE_CURRENT_LIST_DIR}/Softune/MB91460> + $<$:${CMAKE_CURRENT_LIST_DIR}/Softune/MB96340> + + # ARMv7E-M (Cortex-M4F) port for TASKING VX-toolset for ARM + $<$:${CMAKE_CURRENT_LIST_DIR}/Tasking/ARM_CM4F> + + # Port for C-SKY T-HEAD CK802 + $<$:${CMAKE_CURRENT_LIST_DIR}/ThirdParty/CDK/T-HEAD_CK802> + + # Tensilica Xtensa port for XCC + $<$:${CMAKE_CURRENT_LIST_DIR}/ThirdParty/XCC/Xtensa> + + # Microchip PIC18 port for WIZ-C + $<$:${CMAKE_CURRENT_LIST_DIR}/WizC/PIC18> +) + +target_link_libraries(freertos_kernel_port + PUBLIC + $<$:pico_base_headers> + $<$:idf::esp32> + PRIVATE + freertos_kernel + "$<$:hardware_clocks;hardware_exception>" + $<$:winmm> # Windows library which implements timers +) diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/port.c new file mode 100644 index 0000000..d1114bb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/port.c @@ -0,0 +1,184 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +#define portINITIAL_FORMAT_VECTOR ( ( StackType_t ) 0x4000 ) + +/* Supervisor mode set. */ +#define portINITIAL_STATUS_REGISTER ( ( StackType_t ) 0x2000) + +/* The clock prescale into the timer peripheral. */ +#define portPRESCALE_VALUE ( ( uint8_t ) 10 ) + +/* The clock frequency into the RTC. */ +#define portRTC_CLOCK_HZ ( ( uint32_t ) 1000 ) + +asm void interrupt VectorNumber_VL1swi vPortYieldISR( void ); +static void prvSetupTimerInterrupt( void ); + +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This +will be set to 0 prior to the first task being started. */ +static uint32_t ulCriticalNesting = 0x9999UL; + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + +uint32_t ulOriginalA5; + + __asm{ MOVE.L A5, ulOriginalA5 }; + + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + /* Exception stack frame starts with the return address. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x0; /*FP*/ + pxTopOfStack -= 14; /* A5 to D0. */ + + /* Parameter in A0. */ + *( pxTopOfStack + 8 ) = ( StackType_t ) pvParameters; + + /* A5 must be maintained as it is resurved by the compiler. */ + *( pxTopOfStack + 13 ) = ulOriginalA5; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + ulCriticalNesting = 0UL; + + /* Configure a timer to generate the tick interrupt. */ + prvSetupTimerInterrupt(); + + /* Start the first task executing. */ + vPortStartFirstTask(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Prescale by 1 - ie no prescale. */ + RTCSC |= 8; + + /* Compare match value. */ + RTCMOD = portRTC_CLOCK_HZ / configTICK_RATE_HZ; + + /* Enable the RTC to generate interrupts - interrupts are already disabled + when this code executes. */ + RTCSC_RTIE = 1; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0UL ) + { + /* Guard against context switches being pended simultaneously with a + critical section being entered. */ + do + { + portDISABLE_INTERRUPTS(); + if( INTC_FRC == 0UL ) + { + break; + } + + portENABLE_INTERRUPTS(); + + } while( 1 ); + } + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void vPortYieldHandler( void ) +{ +uint32_t ulSavedInterruptMask; + + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Note this will clear all forced interrupts - this is done for speed. */ + INTC_CFRC = 0x3E; + vTaskSwitchContext(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} +/*-----------------------------------------------------------*/ + +void interrupt VectorNumber_Vrtc vPortTickISR( void ) +{ +uint32_t ulSavedInterruptMask; + + /* Clear the interrupt. */ + RTCSC |= RTCSC_RTIF_MASK; + + /* Increment the RTOS tick. */ + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portasm.S new file mode 100644 index 0000000..8173ec6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portasm.S @@ -0,0 +1,131 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Purpose: Lowest level routines for all ColdFire processors. + * + * Notes: + * + * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale + * supplied source files. + */ + + .global ulPortSetIPL + .global _ulPortSetIPL + .global mcf5xxx_wr_cacrx + .global _mcf5xxx_wr_cacrx + .global vPortYieldISR + .global _vPortYieldISR + .global vPortStartFirstTask + .global _vPortStartFirstTask + .extern _pxCurrentTCB + .extern _vPortYieldHandler + + .text + +.macro portSAVE_CONTEXT + + lea.l (-60, sp), sp + movem.l d0-a6, (sp) + move.l _pxCurrentTCB, a0 + move.l sp, (a0) + + .endm + +.macro portRESTORE_CONTEXT + + move.l _pxCurrentTCB, a0 + move.l (a0), sp + movem.l (sp), d0-a6 + lea.l (60, sp), sp + rte + + .endm + +/********************************************************************/ +/* + * This routines changes the IPL to the value passed into the routine. + * It also returns the old IPL value back. + * Calling convention from C: + * old_ipl = asm_set_ipl(new_ipl); + * For the Diab Data C compiler, it passes return value thru D0. + * Note that only the least significant three bits of the passed + * value are used. + */ + +ulPortSetIPL: +_ulPortSetIPL: + link A6,#-8 + movem.l D6-D7,(SP) + + move.w SR,D7 /* current sr */ + + move.l D7,D6 /* prepare return value */ + andi.l #0x0700,D6 /* mask out IPL */ + lsr.l #8,D6 /* IPL */ + + andi.l #0x07,D0 /* least significant three bits */ + lsl.l #8,D0 /* move over to make mask */ + + andi.l #0x0000F8FF,D7 /* zero out current IPL */ + or.l D0,D7 /* place new IPL in sr */ + move.w D7,SR + + move.l D6, D0 /* Return value in D0. */ + movem.l (SP),D6-D7 + lea 8(SP),SP + unlk A6 + rts +/********************************************************************/ + +mcf5xxx_wr_cacrx: +_mcf5xxx_wr_cacrx: + move.l 4(sp),d0 + .long 0x4e7b0002 /* movec d0,cacr */ + nop + rts + +/********************************************************************/ + +/* Yield interrupt. */ +_vPortYieldISR: +vPortYieldISR: + portSAVE_CONTEXT + jsr _vPortYieldHandler + portRESTORE_CONTEXT + +/********************************************************************/ + + +vPortStartFirstTask: +_vPortStartFirstTask: + portRESTORE_CONTEXT + + .end + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portmacro.h new file mode 100644 index 0000000..69c8de8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portmacro.h @@ -0,0 +1,113 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetIPL( uint32_t ); +#define portDISABLE_INTERRUPTS() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portENABLE_INTERRUPTS() ulPortSetIPL( 0 ) + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR( void ); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) ulPortSetIPL( uxSavedStatusRegister ) + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portNOP() asm volatile ( "nop" ) + +/* Context switches are requested using the force register. */ +#define portYIELD() INTC_SFRC = 0x3E; portNOP(); portNOP(); portNOP(); portNOP(); portNOP() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) { portYIELD(); } } while( 0 ) + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/port.c new file mode 100644 index 0000000..eea9c0b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/port.c @@ -0,0 +1,148 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +#define portINITIAL_FORMAT_VECTOR ( ( StackType_t ) 0x4000 ) + +/* Supervisor mode set. */ +#define portINITIAL_STATUS_REGISTER ( ( StackType_t ) 0x2000) + +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This +will be set to 0 prior to the first task being started. */ +static uint32_t ulCriticalNesting = 0x9999UL; + + +#define portSAVE_CONTEXT() \ + lea.l (-60, %sp), %sp; \ + movem.l %d0-%fp, (%sp); \ + move.l pxCurrentTCB, %a0; \ + move.l %sp, (%a0); + +#define portRESTORE_CONTEXT() \ + move.l pxCurrentTCB, %a0; \ + move.l (%a0), %sp; \ + movem.l (%sp), %d0-%fp; \ + lea.l %sp@(60), %sp; \ + rte + + + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + /* Exception stack frame starts with the return address. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x0; /*FP*/ + pxTopOfStack -= 14; /* A5 to D0. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + ulCriticalNesting = 0UL; + + /* Configure the interrupts used by this port. */ + vApplicationSetupInterrupts(); + + /* Start the first task executing. */ + vPortStartFirstTask(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0UL ) + { + /* Guard against context switches being pended simultaneously with a + critical section being entered. */ + do + { + portDISABLE_INTERRUPTS(); + if( MCF_INTC0_INTFRCH == 0UL ) + { + break; + } + + portENABLE_INTERRUPTS(); + + } while( 1 ); + } + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void vPortYieldHandler( void ) +{ +uint32_t ulSavedInterruptMask; + + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + /* Note this will clear all forced interrupts - this is done for speed. */ + MCF_INTC0_INTFRCL = 0; + vTaskSwitchContext(); + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portasm.S new file mode 100644 index 0000000..bc0c44e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portasm.S @@ -0,0 +1,131 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Purpose: Lowest level routines for all ColdFire processors. + * + * Notes: + * + * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale + * supplied source files. + */ + + .global ulPortSetIPL + .global _ulPortSetIPL + .global mcf5xxx_wr_cacrx + .global _mcf5xxx_wr_cacrx + .global vPortYieldISR + .global _vPortYieldISR + .global vPortStartFirstTask + .global _vPortStartFirstTask + .extern _pxCurrentTCB + .extern _vPortYieldHandler + + .text + +.macro portSAVE_CONTEXT + + lea.l (-60, sp), sp + movem.l d0-a6, (sp) + move.l _pxCurrentTCB, a0 + move.l sp, (a0) + + .endm + +.macro portRESTORE_CONTEXT + + move.l _pxCurrentTCB, a0 + move.l (a0), sp + movem.l (sp), d0-a6 + lea.l (60, sp), sp + rte + + .endm + +/********************************************************************/ +/* + * This routines changes the IPL to the value passed into the routine. + * It also returns the old IPL value back. + * Calling convention from C: + * old_ipl = asm_set_ipl(new_ipl); + * For the Diab Data C compiler, it passes return value thru D0. + * Note that only the least significant three bits of the passed + * value are used. + */ + +ulPortSetIPL: +_ulPortSetIPL: + link A6,#-8 + movem.l D6-D7,(SP) + + move.w SR,D7 /* current sr */ + + move.l D7,D0 /* prepare return value */ + andi.l #0x0700,D0 /* mask out IPL */ + lsr.l #8,D0 /* IPL */ + + move.l 8(A6),D6 /* get argument */ + andi.l #0x07,D6 /* least significant three bits */ + lsl.l #8,D6 /* move over to make mask */ + + andi.l #0x0000F8FF,D7 /* zero out current IPL */ + or.l D6,D7 /* place new IPL in sr */ + move.w D7,SR + + movem.l (SP),D6-D7 + lea 8(SP),SP + unlk A6 + rts +/********************************************************************/ + +mcf5xxx_wr_cacrx: +_mcf5xxx_wr_cacrx: + move.l 4(sp),d0 + .long 0x4e7b0002 /* movec d0,cacr */ + nop + rts + +/********************************************************************/ + +/* Yield interrupt. */ +_vPortYieldISR: +vPortYieldISR: + portSAVE_CONTEXT + jsr _vPortYieldHandler + portRESTORE_CONTEXT + +/********************************************************************/ + + +vPortStartFirstTask: +_vPortStartFirstTask: + portRESTORE_CONTEXT + + .end + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portmacro.h new file mode 100644 index 0000000..1d71080 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portmacro.h @@ -0,0 +1,112 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ +uint32_t ulPortSetIPL( uint32_t ); +#define portDISABLE_INTERRUPTS() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portENABLE_INTERRUPTS() ulPortSetIPL( 0 ) + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR( void ); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) ulPortSetIPL( uxSavedStatusRegister ) + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portNOP() asm volatile ( "nop" ) + +/* Note this will overwrite all other bits in the force register, it is done this way for speed. */ +#define portYIELD() MCF_INTC0_INTFRCL = ( 1UL << configYIELD_INTERRUPT_VECTOR ); portNOP(); portNOP() /* -32 as we are using the high word of the 64bit mask. */ + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) { portYIELD(); } } while( 0 ) + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/port.c new file mode 100644 index 0000000..6277334 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/port.c @@ -0,0 +1,238 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the HCS12 port. + *----------------------------------------------------------*/ + + +/* + * Configure a timer to generate the RTOS tick at the frequency specified + * within FreeRTOSConfig.h. + */ +static void prvSetupTimerInterrupt( void ); + +/* Interrupt service routines have to be in non-banked memory - as does the +scheduler startup function. */ +#pragma CODE_SEG __NEAR_SEG NON_BANKED + + /* Manual context switch function. This is the SWI ISR. */ + void interrupt vPortYield( void ); + + /* Tick context switch function. This is the timer ISR. */ + void interrupt vPortTickInterrupt( void ); + + /* Simply called by xPortStartScheduler(). xPortStartScheduler() does not + start the scheduler directly because the header file containing the + xPortStartScheduler() prototype is part of the common kernel code, and + therefore cannot use the CODE_SEG pragma. */ + static BaseType_t xBankedStartScheduler( void ); + +#pragma CODE_SEG DEFAULT + +/* Calls to portENTER_CRITICAL() can be nested. When they are nested the +critical section should not be left (i.e. interrupts should not be re-enabled) +until the nesting depth reaches 0. This variable simply tracks the nesting +depth. Each task maintains it's own critical nesting depth variable so +uxCriticalNesting is saved and restored from the task stack during a context +switch. */ +volatile UBaseType_t uxCriticalNesting = 0xff; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This can be uncommented to provide useful stack markers when debugging. + + *pxTopOfStack = ( StackType_t ) 0x11; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x33; + pxTopOfStack--; + */ + + + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. In this case the stack as + expected by the HCS12 RTI instruction. */ + + + /* The address of the task function is placed in the stack byte at a time. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 1 ); + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 0 ); + pxTopOfStack--; + + /* Next are all the registers that form part of the task context. */ + + /* Y register */ + *pxTopOfStack = ( StackType_t ) 0xff; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xee; + pxTopOfStack--; + + /* X register */ + *pxTopOfStack = ( StackType_t ) 0xdd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcc; + pxTopOfStack--; + + /* A register contains parameter high byte. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 0 ); + pxTopOfStack--; + + /* B register contains parameter low byte. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 1 ); + pxTopOfStack--; + + /* CCR: Note that when the task starts interrupts will be enabled since + "I" bit of CCR is cleared */ + *pxTopOfStack = ( StackType_t ) 0x00; + pxTopOfStack--; + + #ifdef BANKED_MODEL + /* The page of the task. */ + *pxTopOfStack = ( StackType_t ) ( ( int ) pxCode ); + pxTopOfStack--; + #endif + + /* Finally the critical nesting depth is initialised with 0 (not within + a critical section). */ + *pxTopOfStack = ( StackType_t ) 0x00; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the HCS12 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + TickTimer_SetFreqHz( configTICK_RATE_HZ ); + TickTimer_Enable(); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* xPortStartScheduler() does not start the scheduler directly because + the header file containing the xPortStartScheduler() prototype is part + of the common kernel code, and therefore cannot use the CODE_SEG pragma. + Instead it simply calls the locally defined xBankedStartScheduler() - + which does use the CODE_SEG pragma. */ + + return xBankedStartScheduler(); +} +/*-----------------------------------------------------------*/ + +#pragma CODE_SEG __NEAR_SEG NON_BANKED + +static BaseType_t xBankedStartScheduler( void ) +{ + /* Configure the timer that will generate the RTOS tick. Interrupts are + disabled when this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task. */ + portRESTORE_CONTEXT(); + + /* Simulate the end of an interrupt to start the scheduler off. */ + __asm( "rti" ); + + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +/* + * Context switch functions. These are both interrupt service routines. + */ + +/* + * Manual context switch forced by calling portYIELD(). This is the SWI + * handler. + */ +void interrupt vPortYield( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * RTOS tick interrupt service routine. If the cooperative scheduler is + * being used then this simply increments the tick count. If the + * preemptive scheduler is being used a context switch can occur. + */ +void interrupt vPortTickInterrupt( void ) +{ + #if configUSE_PREEMPTION == 1 + { + /* A context switch might happen so save the context. */ + portSAVE_CONTEXT(); + + /* Increment the tick ... */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + TFLG1 = 1; + + /* Restore the context of a task - which may be a different task + to that interrupted. */ + portRESTORE_CONTEXT(); + } + #else + { + xTaskIncrementTick(); + TFLG1 = 1; + } + #endif +} + +#pragma CODE_SEG DEFAULT + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/portmacro.h new file mode 100644 index 0000000..fe1c425 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/portmacro.h @@ -0,0 +1,203 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 1 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portYIELD() __asm( "swi" ); +#define portNOP() __asm( "nop" ); +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENABLE_INTERRUPTS() __asm( "cli" ) +#define portDISABLE_INTERRUPTS() __asm( "sei" ) + +/* + * Disable interrupts before incrementing the count of critical section nesting. + * The nesting count is maintained so we know when interrupts should be + * re-enabled. Once interrupts are disabled the nesting count can be accessed + * directly. Each task maintains its own nesting count. + */ +#define portENTER_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + uxCriticalNesting++; \ +} + +/* + * Interrupts are disabled so we can access the nesting count directly. If the + * nesting is found to be 0 (no nesting) then we are leaving the critical + * section and interrupts can be re-enabled. + */ +#define portEXIT_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * These macros are very simple as the processor automatically saves and + * restores its registers as interrupts are entered and exited. In + * addition to the (automatically stacked) registers we also stack the + * critical nesting count. Each task maintains its own critical nesting + * count as it is legitimate for a task to yield from within a critical + * section. If the banked memory model is being used then the PPAGE + * register is also stored as part of the tasks context. + */ + +#ifdef BANKED_MODEL + /* + * Load the stack pointer for the task, then pull the critical nesting + * count and PPAGE register from the stack. The remains of the + * context are restored by the RTI instruction. + */ + #define portRESTORE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "lds 0, x" ); \ + __asm( "pula" ); \ + __asm( "staa uxCriticalNesting" ); \ + __asm( "pula" ); \ + __asm( "staa 0x30" ); /* 0x30 = PPAGE */ \ + } + + /* + * By the time this macro is called the processor has already stacked the + * registers. Simply stack the nesting count and PPAGE value, then save + * the task stack pointer. + */ + #define portSAVE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldaa 0x30" ); /* 0x30 = PPAGE */ \ + __asm( "psha" ); \ + __asm( "ldaa uxCriticalNesting" ); \ + __asm( "psha" ); \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "sts 0, x" ); \ + } +#else + + /* + * These macros are as per the BANKED versions above, but without saving + * and restoring the PPAGE register. + */ + + #define portRESTORE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "lds 0, x" ); \ + __asm( "pula" ); \ + __asm( "staa uxCriticalNesting" ); \ + } + + #define portSAVE_CONTEXT() \ + { \ + extern volatile void * pxCurrentTCB; \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + __asm( "ldaa uxCriticalNesting" ); \ + __asm( "psha" ); \ + __asm( "ldx pxCurrentTCB" ); \ + __asm( "sts 0, x" ); \ + } +#endif + +/* + * Utility macro to call macros above in correct order in order to perform a + * task switch from within a standard ISR. This macro can only be used if + * the ISR does not use any local (stack) variables. If the ISR uses stack + * variables portYIELD() should be used in it's place. + */ +#define portTASK_SWITCH_FROM_ISR() \ + portSAVE_CONTEXT(); \ + vTaskSwitchContext(); \ + portRESTORE_CONTEXT(); + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Common/mpu_wrappers.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Common/mpu_wrappers.c new file mode 100644 index 0000000..9a45ba8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Common/mpu_wrappers.c @@ -0,0 +1,2541 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Implementation of the wrapper functions used to raise the processor privilege + * before calling a standard FreeRTOS API function. + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" +#include "event_groups.h" +#include "stream_buffer.h" +#include "mpu_prototypes.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + BaseType_t MPU_xTaskCreate( TaskFunction_t pvTaskCode, + const char * const pcName, + uint16_t usStackDepth, + void * pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * pxCreatedTask ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxPriority = uxPriority & ~( portPRIVILEGE_BIT ); + portMEMORY_BARRIER(); + + xReturn = xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ); + } + + return xReturn; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + TaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxPriority = uxPriority & ~( portPRIVILEGE_BIT ); + portMEMORY_BARRIER(); + + xReturn = xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer ); + } + + return xReturn; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskDelete == 1 ) + void MPU_vTaskDelete( TaskHandle_t pxTaskToDelete ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskDelete( pxTaskToDelete ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskDelete( pxTaskToDelete ); + } + } + #endif /* if ( INCLUDE_vTaskDelete == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskDelayUntil == 1 ) + BaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + TickType_t xTimeIncrement ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskDelayUntil == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskAbortDelay( xTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskAbortDelay( xTask ); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskAbortDelay == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskDelay == 1 ) + void MPU_vTaskDelay( TickType_t xTicksToDelay ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskDelay( xTicksToDelay ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskDelay( xTicksToDelay ); + } + } + #endif /* if ( INCLUDE_vTaskDelay == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_uxTaskPriorityGet == 1 ) + UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t pxTask ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskPriorityGet( pxTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskPriorityGet( pxTask ); + } + + return uxReturn; + } + #endif /* if ( INCLUDE_uxTaskPriorityGet == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskPrioritySet == 1 ) + void MPU_vTaskPrioritySet( TaskHandle_t pxTask, + UBaseType_t uxNewPriority ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskPrioritySet( pxTask, uxNewPriority ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskPrioritySet( pxTask, uxNewPriority ); + } + } + #endif /* if ( INCLUDE_vTaskPrioritySet == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_eTaskGetState == 1 ) + eTaskState MPU_eTaskGetState( TaskHandle_t pxTask ) /* FREERTOS_SYSTEM_CALL */ + { + eTaskState eReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + eReturn = eTaskGetState( pxTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + eReturn = eTaskGetState( pxTask ); + } + + return eReturn; + } + #endif /* if ( INCLUDE_eTaskGetState == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + void MPU_vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState ); + } + } + #endif /* if ( configUSE_TRACE_FACILITY == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + xReturn = xTaskGetIdleTaskHandle(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetIdleTaskHandle(); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskSuspend( TaskHandle_t pxTaskToSuspend ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSuspend( pxTaskToSuspend ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSuspend( pxTaskToSuspend ); + } + } + #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskResume( TaskHandle_t pxTaskToResume ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskResume( pxTaskToResume ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskResume( pxTaskToResume ); + } + } + #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */ +/*-----------------------------------------------------------*/ + + void MPU_vTaskSuspendAll( void ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSuspendAll(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSuspendAll(); + } + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xTaskResumeAll( void ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskResumeAll(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskResumeAll(); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + TickType_t MPU_xTaskGetTickCount( void ) /* FREERTOS_SYSTEM_CALL */ + { + TickType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGetTickCount(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetTickCount(); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskGetNumberOfTasks(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskGetNumberOfTasks(); + } + + return uxReturn; + } +/*-----------------------------------------------------------*/ + + char * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) /* FREERTOS_SYSTEM_CALL */ + { + char * pcReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + pcReturn = pcTaskGetName( xTaskToQuery ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + pcReturn = pcTaskGetName( xTaskToQuery ); + } + + return pcReturn; + } +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskGetHandle == 1 ) + TaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGetHandle( pcNameToQuery ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetHandle( pcNameToQuery ); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskGetHandle == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + void MPU_vTaskList( char * pcWriteBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskList( pcWriteBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskList( pcWriteBuffer ); + } + } + #endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + void MPU_vTaskGetRunTimeStats( char * pcWriteBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskGetRunTimeStats( pcWriteBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskGetRunTimeStats( pcWriteBuffer ); + } + } + #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) /* FREERTOS_SYSTEM_CALL */ + { + configRUN_TIME_COUNTER_TYPE xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = ulTaskGetIdleRunTimePercent(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = ulTaskGetIdleRunTimePercent(); + } + + return xReturn; + } + #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) /* FREERTOS_SYSTEM_CALL */ + { + configRUN_TIME_COUNTER_TYPE xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = ulTaskGetIdleRunTimeCounter(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = ulTaskGetIdleRunTimeCounter(); + } + + return xReturn; + } + #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxTagValue ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSetApplicationTaskTag( xTask, pxTagValue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSetApplicationTaskTag( xTask, pxTagValue ); + } + } + #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHookFunction_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGetApplicationTaskTag( xTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetApplicationTaskTag( xTask ); + } + + return xReturn; + } + #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue ); + } + } + #endif /* if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) */ +/*-----------------------------------------------------------*/ + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) /* FREERTOS_SYSTEM_CALL */ + { + void * pvReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + pvReturn = pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + pvReturn = pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex ); + } + + return pvReturn; + } + #endif /* if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + BaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskCallApplicationTaskHook( xTask, pvParameter ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCallApplicationTaskHook( xTask, pvParameter ); + } + + return xReturn; + } + #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * pxTaskStatusArray, + UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * pulTotalRunTime ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime ); + } + + return uxReturn; + } + #endif /* if ( configUSE_TRACE_FACILITY == 1 ) */ +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskCatchUpTicks( xTicksToCatchUp ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCatchUpTicks( xTicksToCatchUp ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskGetStackHighWaterMark( xTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskGetStackHighWaterMark( xTask ); + } + + return uxReturn; + } + #endif /* if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) + configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) /* FREERTOS_SYSTEM_CALL */ + { + configSTACK_DEPTH_TYPE uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTaskGetStackHighWaterMark2( xTask ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTaskGetStackHighWaterMark2( xTask ); + } + + return uxReturn; + } + #endif /* if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + xReturn = xTaskGetCurrentTaskHandle(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetCurrentTaskHandle(); + } + + return xReturn; + } + #endif /* if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTaskGetSchedulerState == 1 ) + BaseType_t MPU_xTaskGetSchedulerState( void ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGetSchedulerState(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGetSchedulerState(); + } + + return xReturn; + } + #endif /* if ( INCLUDE_xTaskGetSchedulerState == 1 ) */ +/*-----------------------------------------------------------*/ + + void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTaskSetTimeOutState( pxTimeOut ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTaskSetTimeOutState( pxTimeOut ); + } + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGenericNotify( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGenericNotify( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue ); + } + + return xReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ); + } + + return xReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + uint32_t ulReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + ulReturn = ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + ulReturn = ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ); + } + + return ulReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTaskGenericNotifyStateClear( xTask, uxIndexToClear ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTaskGenericNotifyStateClear( xTask, uxIndexToClear ); + } + + return xReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) /* FREERTOS_SYSTEM_CALL */ + { + uint32_t ulReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + ulReturn = ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + ulReturn = ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear ); + } + + return ulReturn; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + QueueHandle_t MPU_xQueueGenericCreate( UBaseType_t uxQueueLength, + UBaseType_t uxItemSize, + uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType ); + } + + return xReturn; + } + #endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + QueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType ); + } + + return xReturn; + } + #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueueGenericReset( QueueHandle_t pxQueue, + BaseType_t xNewQueue ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGenericReset( pxQueue, xNewQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGenericReset( pxQueue, xNewQueue ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + BaseType_t xCopyPosition ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t pxQueue ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxQueueMessagesWaiting( pxQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxQueueMessagesWaiting( pxQueue ); + } + + return uxReturn; + } +/*-----------------------------------------------------------*/ + + UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */ + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxQueueSpacesAvailable( xQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxQueueSpacesAvailable( xQueue ); + } + + return uxReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueueReceive( QueueHandle_t pxQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueReceive( pxQueue, pvBuffer, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueReceive( pxQueue, pvBuffer, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueuePeek( xQueue, pvBuffer, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueuePeek( xQueue, pvBuffer, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueSemaphoreTake( xQueue, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueSemaphoreTake( xQueue, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) /* FREERTOS_SYSTEM_CALL */ + { + void * xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGetMutexHolder( xSemaphore ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGetMutexHolder( xSemaphore ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateMutex( ucQueueType ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateMutex( ucQueueType ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateMutexStatic( ucQueueType, pxStaticQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateMutexStatic( ucQueueType, pxStaticQueue ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueHandle_t MPU_xQueueCreateCountingSemaphore( UBaseType_t uxCountValue, + UBaseType_t uxInitialCount ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateCountingSemaphore( uxCountValue, uxInitialCount ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateCountingSemaphore( uxCountValue, uxInitialCount ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) /* FREERTOS_SYSTEM_CALL */ + { + QueueHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_RECURSIVE_MUTEXES == 1 ) + BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xBlockTime ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueTakeMutexRecursive( xMutex, xBlockTime ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueTakeMutexRecursive( xMutex, xBlockTime ); + } + + return xReturn; + } + #endif /* if ( configUSE_RECURSIVE_MUTEXES == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_RECURSIVE_MUTEXES == 1 ) + BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t xMutex ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueGiveMutexRecursive( xMutex ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueGiveMutexRecursive( xMutex ); + } + + return xReturn; + } + #endif /* if ( configUSE_RECURSIVE_MUTEXES == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + QueueSetHandle_t MPU_xQueueCreateSet( UBaseType_t uxEventQueueLength ) /* FREERTOS_SYSTEM_CALL */ + { + QueueSetHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueCreateSet( uxEventQueueLength ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueCreateSet( uxEventQueueLength ); + } + + return xReturn; + } + #endif /* if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_QUEUE_SETS == 1 ) + QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + TickType_t xBlockTimeTicks ) /* FREERTOS_SYSTEM_CALL */ + { + QueueSetMemberHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueSelectFromSet( xQueueSet, xBlockTimeTicks ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueSelectFromSet( xQueueSet, xBlockTimeTicks ); + } + + return xReturn; + } + #endif /* if ( configUSE_QUEUE_SETS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueAddToSet( xQueueOrSemaphore, xQueueSet ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueAddToSet( xQueueOrSemaphore, xQueueSet ); + } + + return xReturn; + } + #endif /* if ( configUSE_QUEUE_SETS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_QUEUE_SETS == 1 ) + BaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet ); + } + + return xReturn; + } + #endif /* if ( configUSE_QUEUE_SETS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if configQUEUE_REGISTRY_SIZE > 0 + void MPU_vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcName ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vQueueAddToRegistry( xQueue, pcName ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vQueueAddToRegistry( xQueue, pcName ); + } + } + #endif /* if configQUEUE_REGISTRY_SIZE > 0 */ +/*-----------------------------------------------------------*/ + + #if configQUEUE_REGISTRY_SIZE > 0 + void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vQueueUnregisterQueue( xQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vQueueUnregisterQueue( xQueue ); + } + } + #endif /* if configQUEUE_REGISTRY_SIZE > 0 */ +/*-----------------------------------------------------------*/ + + #if configQUEUE_REGISTRY_SIZE > 0 + const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */ + { + const char * pcReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + pcReturn = pcQueueGetName( xQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + pcReturn = pcQueueGetName( xQueue ); + } + + return pcReturn; + } + #endif /* if configQUEUE_REGISTRY_SIZE > 0 */ +/*-----------------------------------------------------------*/ + + void MPU_vQueueDelete( QueueHandle_t xQueue ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vQueueDelete( xQueue ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vQueueDelete( xQueue ); + } + } +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + void * pvReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + pvReturn = pvTimerGetTimerID( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + pvReturn = pvTimerGetTimerID( xTimer ); + } + + return pvReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + void MPU_vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTimerSetTimerID( xTimer, pvNewID ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTimerSetTimerID( xTimer, pvNewID ); + } + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerIsTimerActive( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerIsTimerActive( xTimer ); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) /* FREERTOS_SYSTEM_CALL */ + { + TaskHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerGetTimerDaemonTaskHandle(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerGetTimerDaemonTaskHandle(); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + void MPU_vTimerSetReloadMode( TimerHandle_t xTimer, + const UBaseType_t uxAutoReload ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vTimerSetReloadMode( xTimer, uxAutoReload ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vTimerSetReloadMode( xTimer, uxAutoReload ); + } + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) + { + UBaseType_t uxReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + uxReturn = uxTimerGetReloadMode( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + uxReturn = uxTimerGetReloadMode( xTimer ); + } + + return uxReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + const char * pcReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + pcReturn = pcTimerGetName( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + pcReturn = pcTimerGetName( xTimer ); + } + + return pcReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + TickType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerGetPeriod( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerGetPeriod( xTimer ); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) /* FREERTOS_SYSTEM_CALL */ + { + TickType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerGetExpiryTime( xTimer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerGetExpiryTime( xTimer ); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TIMERS == 1 ) + BaseType_t MPU_xTimerGenericCommand( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xTimerGenericCommand( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xTimerGenericCommand( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ); + } + + return xReturn; + } + #endif /* if ( configUSE_TIMERS == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + EventGroupHandle_t MPU_xEventGroupCreate( void ) /* FREERTOS_SYSTEM_CALL */ + { + EventGroupHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupCreate(); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupCreate(); + } + + return xReturn; + } + #endif /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + EventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + EventGroupHandle_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupCreateStatic( pxEventGroupBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupCreateStatic( pxEventGroupBuffer ); + } + + return xReturn; + } + #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + + EventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToWaitFor, + const BaseType_t xClearOnExit, + const BaseType_t xWaitForAllBits, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + EventBits_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToClear ) /* FREERTOS_SYSTEM_CALL */ + { + EventBits_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupClearBits( xEventGroup, uxBitsToClear ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupClearBits( xEventGroup, uxBitsToClear ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet ) /* FREERTOS_SYSTEM_CALL */ + { + EventBits_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupSetBits( xEventGroup, uxBitsToSet ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupSetBits( xEventGroup, uxBitsToSet ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup, + const EventBits_t uxBitsToSet, + const EventBits_t uxBitsToWaitFor, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + EventBits_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + void MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vEventGroupDelete( xEventGroup ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vEventGroupDelete( xEventGroup ); + } + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferSend( xStreamBuffer, pvTxData, xDataLengthBytes, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferSend( xStreamBuffer, pvTxData, xDataLengthBytes, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferNextMessageLengthBytes( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferNextMessageLengthBytes( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferReceive( xStreamBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferReceive( xStreamBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + void MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + vStreamBufferDelete( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + vStreamBufferDelete( xStreamBuffer ); + } + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferIsFull( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferIsFull( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferIsEmpty( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferIsEmpty( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferReset( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferReset( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + xReturn = xStreamBufferSpacesAvailable( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferSpacesAvailable( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) /* FREERTOS_SYSTEM_CALL */ + { + size_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferBytesAvailable( xStreamBuffer ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferBytesAvailable( xStreamBuffer ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) /* FREERTOS_SYSTEM_CALL */ + { + BaseType_t xReturn; + + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel ); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + StreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) /* FREERTOS_SYSTEM_CALL */ + { + StreamBufferHandle_t xReturn; + + /** + * Streambuffer application level callback functionality is disabled for MPU + * enabled ports. + */ + configASSERT( ( pxSendCompletedCallback == NULL ) && + ( pxReceiveCompletedCallback == NULL ) ); + + if( ( pxSendCompletedCallback == NULL ) && + ( pxReceiveCompletedCallback == NULL ) ) + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferGenericCreate( xBufferSizeBytes, + xTriggerLevelBytes, + xIsMessageBuffer, + NULL, + NULL ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferGenericCreate( xBufferSizeBytes, + xTriggerLevelBytes, + xIsMessageBuffer, + NULL, + NULL ); + } + } + else + { + traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ); + xReturn = NULL; + } + + return xReturn; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + StreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) /* FREERTOS_SYSTEM_CALL */ + { + StreamBufferHandle_t xReturn; + + /** + * Streambuffer application level callback functionality is disabled for MPU + * enabled ports. + */ + configASSERT( ( pxSendCompletedCallback == NULL ) && + ( pxReceiveCompletedCallback == NULL ) ); + + if( ( pxSendCompletedCallback == NULL ) && + ( pxReceiveCompletedCallback == NULL ) ) + { + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + xReturn = xStreamBufferGenericCreateStatic( xBufferSizeBytes, + xTriggerLevelBytes, + xIsMessageBuffer, + pucStreamBufferStorageArea, + pxStaticStreamBuffer, + NULL, + NULL ); + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + xReturn = xStreamBufferGenericCreateStatic( xBufferSizeBytes, + xTriggerLevelBytes, + xIsMessageBuffer, + pucStreamBufferStorageArea, + pxStaticStreamBuffer, + NULL, + NULL ); + } + } + else + { + traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ); + xReturn = NULL; + } + + return xReturn; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + +/* Functions that the application writer wants to execute in privileged mode + * can be defined in application_defined_privileged_functions.h. The functions + * must take the same format as those above whereby the privilege state on exit + * equals the privilege state on entry. For example: + * + * void MPU_FunctionName( [parameters ] ) FREERTOS_SYSTEM_CALL; + * void MPU_FunctionName( [parameters ] ) + * { + * if( portIS_PRIVILEGED() == pdFALSE ) + * { + * portRAISE_PRIVILEGE(); + * portMEMORY_BARRIER(); + * + * FunctionName( [parameters ] ); + * portMEMORY_BARRIER(); + * + * portRESET_PRIVILEGE(); + * portMEMORY_BARRIER(); + * } + * else + * { + * FunctionName( [parameters ] ); + * } + * } + */ + + #if configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS == 1 + #include "application_defined_privileged_functions.h" + #endif +/*-----------------------------------------------------------*/ + +#endif /* portUSING_MPU_WRAPPERS == 1 */ +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/port.c new file mode 100644 index 0000000..489da74 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/port.c @@ -0,0 +1,239 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Atmel AT91R40008 + * port. + * + * Components that can be compiled to either ARM or THUMB mode are + * contained in this file. The ISR routines, which can only be compiled + * to ARM mode are contained in portISR.c. + *----------------------------------------------------------*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware specific definitions. */ +#include "AT91R40008.h" +#include "pio.h" +#include "aic.h" +#include "tc.h" + +/* Constants required to setup the task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) +#define portTICK_PRIORITY_6 ( 6 ) +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortISRStartFirstSTask() is defined in portISR.c. + */ +extern void vPortISRStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + #ifdef THUMB_INTERWORK + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + #endif + + pxTopOfStack--; + + /* Some optimisation levels use the stack differently to others. This + means the interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the tick timer to generate the tick interrupts at the required frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ +volatile uint32_t ulDummy; + + /* Enable clock to the tick timer... */ + AT91C_BASE_PS->PS_PCER = portTIMER_CLK_ENABLE_BIT; + + /* Stop the tick timer... */ + portTIMER_REG_BASE_PTR->TC_CCR = TC_CLKDIS; + + /* Start with tick timer interrupts disabled... */ + portTIMER_REG_BASE_PTR->TC_IDR = 0xFFFFFFFF; + + /* Clear any pending tick timer interrupts... */ + ulDummy = portTIMER_REG_BASE_PTR->TC_SR; + + /* Store interrupt handler function address in tick timer vector register... + The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + #if configUSE_PREEMPTION == 1 + { + extern void ( vPreemptiveTick )( void ); + AT91C_BASE_AIC->AIC_SVR[portTIMER_AIC_CHANNEL] = ( uint32_t ) vPreemptiveTick; + } + #else // else use cooperative scheduler + { + extern void ( vNonPreemptiveTick )( void ); + AT91C_BASE_AIC->AIC_SVR[portTIMER_AIC_CHANNEL] = ( uint32_t ) vNonPreemptiveTick; + } + #endif + + /* Tick timer interrupt level-sensitive, priority 6... */ + AT91C_BASE_AIC->AIC_SMR[ portTIMER_AIC_CHANNEL ] = AIC_SRCTYPE_INT_LEVEL_SENSITIVE | portTICK_PRIORITY_6; + + /* Enable the tick timer interrupt... + + First at timer level */ + portTIMER_REG_BASE_PTR->TC_IER = TC_CPCS; + + /* Then at the AIC level. */ + AT91C_BASE_AIC->AIC_IECR = (1 << portTIMER_AIC_CHANNEL); + + /* Calculate timer compare value to achieve the desired tick rate... */ + if( (configCPU_CLOCK_HZ / (configTICK_RATE_HZ * 2) ) <= 0xFFFF ) + { + /* The tick rate is fast enough for us to use the faster timer input + clock (main clock / 2). */ + portTIMER_REG_BASE_PTR->TC_CMR = TC_WAVE | TC_CLKS_MCK2 | TC_BURST_NONE | TC_CPCTRG; + portTIMER_REG_BASE_PTR->TC_RC = configCPU_CLOCK_HZ / (configTICK_RATE_HZ * 2); + } + else + { + /* We must use a slower timer input clock (main clock / 8) because the + tick rate is too slow for the faster input clock. */ + portTIMER_REG_BASE_PTR->TC_CMR = TC_WAVE | TC_CLKS_MCK8 | TC_BURST_NONE | TC_CPCTRG; + portTIMER_REG_BASE_PTR->TC_RC = configCPU_CLOCK_HZ / (configTICK_RATE_HZ * 8); + } + + /* Start tick timer... */ + portTIMER_REG_BASE_PTR->TC_CCR = TC_SWTRG | TC_CLKEN; +} +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portISR.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portISR.c new file mode 100644 index 0000000..4a6dde8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portISR.c @@ -0,0 +1,234 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* + Changes from V3.2.4 + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. +*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to handle interrupts. */ +#define portCLEAR_AIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* ISR to handle manual context switches (from a call to taskYIELD()). */ +void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"), naked)); + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Called by portYIELD() or taskYIELD() to manually force a context switch. + * + * When a context switch is performed from the task level the saved task + * context is made to look as if it occurred from within the tick ISR. This + * way the same restore context function can be used when restoring the context + * saved from the ISR or that saved from a call to vPortYieldProcessor. + */ +void vPortYieldProcessor( void ) +{ + /* Within an IRQ ISR the link register has an offset from the true return + address, but an SWI ISR does not. Add the offset manually so the same + ISR return code can be used in both cases. */ + asm volatile ( "ADD LR, LR, #4" ); + + /* Perform the context switch. First save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Find the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + void vNonPreemptiveTick( void ) __attribute__ ((interrupt ("IRQ"))); + void vNonPreemptiveTick( void ) + { + static volatile uint32_t ulDummy; + + /* Clear tick timer interrupt indication. */ + ulDummy = portTIMER_REG_BASE_PTR->TC_SR; + + xTaskIncrementTick(); + + /* Acknowledge the interrupt at AIC level... */ + AT91C_BASE_AIC->AIC_EOICR = portCLEAR_AIC_INTERRUPT; + } + +#else /* else preemption is turned on */ + + /* The preemptive scheduler is defined as "naked" as the full context is + saved on entry as part of the context switch. */ + void vPreemptiveTick( void ) __attribute__((naked)); + void vPreemptiveTick( void ) + { + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* WARNING - Do not use local (stack) variables here. Use globals + if you must! */ + static volatile uint32_t ulDummy; + + /* Clear tick timer interrupt indication. */ + ulDummy = portTIMER_REG_BASE_PTR->TC_SR; + + /* Increment the RTOS tick count, then look for the highest priority + task that is ready to run. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Acknowledge the interrupt at AIC level... */ + AT91C_BASE_AIC->AIC_EOICR = portCLEAR_AIC_INTERRUPT; + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + } + +#endif +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +#ifdef THUMB_INTERWORK + + void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + void vPortDisableInterruptsFromThumb( void ) + { + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + + void vPortEnableInterruptsFromThumb( void ) + { + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + +#endif /* THUMB_INTERWORK */ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portmacro.h new file mode 100644 index 0000000..8637ebd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portmacro.h @@ -0,0 +1,256 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + Changes from V3.2.3 + + + Modified portENTER_SWITCHING_ISR() to allow use with GCC V4.0.1. + + Changes from V3.2.4 + + + Removed the use of the %0 parameter within the assembler macros and + replaced them with hard coded registers. This will ensure the + assembler does not select the link register as the temp register as + was occasionally happening previously. + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. + + Changes from V4.5.0 + + + Removed the portENTER_SWITCHING_ISR() and portEXIT_SWITCHING_ISR() macros + and replaced them with portYIELD_FROM_ISR() macro. Application code + should now make use of the portSAVE_CONTEXT() and portRESTORE_CONTEXT() + macros as per the V4.5.1 demo code. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm volatile ( "SWI 0" ) +#define portNOP() asm volatile ( "NOP" ) + +/* + * These define the timer to use for generating the tick interrupt. + * They are put in this file so they can be shared between "port.c" + * and "portisr.c". + */ +#define portTIMER_REG_BASE_PTR AT91C_BASE_TC0 +#define portTIMER_CLK_ENABLE_BIT AT91C_PS_TC0 +#define portTIMER_AIC_CHANNEL ( ( uint32_t ) 4 ) +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * portRESTORE_CONTEXT, portRESTORE_CONTEXT, portENTER_SWITCHING_ISR + * and portEXIT_SWITCHING_ISR can only be called from ARM mode, but + * are included here for efficiency. An attempt to call one from + * THUMB mode code will result in a compile time error. + */ + +#define portRESTORE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Set the LR to the task stack. */ \ + asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} +/*-----------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Push R0 as we are going to use the register. */ \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" \ + \ + /* Set R0 to point to the task stack pointer. */ \ + "STMDB SP,{SP}^ \n\t" \ + "NOP \n\t" \ + "SUB SP, SP, #4 \n\t" \ + "LDMIA SP!,{R0} \n\t" \ + \ + /* Push the return address onto the stack. */ \ + "STMDB R0!, {LR} \n\t" \ + \ + /* Now we have saved LR we can use it instead of R0. */ \ + "MOV LR, R0 \n\t" \ + \ + /* Pop R0 so we can save it onto the system mode stack. */ \ + "LDMIA SP!, {R0} \n\t" \ + \ + /* Push all the system mode registers onto the task stack. */ \ + "STMDB LR,{R0-LR}^ \n\t" \ + "NOP \n\t" \ + "SUB LR, LR, #60 \n\t" \ + \ + /* Push the SPSR onto the task stack. */ \ + "MRS R0, SPSR \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDR R0, [R0] \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + /* Store the new top of stack for the task. */ \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "STR LR, [R0] \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} + +#define portYIELD_FROM_ISR() vTaskSwitchContext() + +/* Critical section handling. */ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h new file mode 100644 index 0000000..21b9b08 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h @@ -0,0 +1,2731 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X256.h +// Object : AT91SAM7X256 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +// +// CVS Reference : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +#ifndef AT91SAM7X256_H +#define AT91SAM7X256_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYS { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG PIOA_PER; // PIO Enable Register + AT91_REG PIOA_PDR; // PIO Disable Register + AT91_REG PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG PIOA_OER; // Output Enable Register + AT91_REG PIOA_ODR; // Output Disable Registerr + AT91_REG PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG PIOA_IFER; // Input Filter Enable Register + AT91_REG PIOA_IFDR; // Input Filter Disable Register + AT91_REG PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG PIOA_SODR; // Set Output Data Register + AT91_REG PIOA_CODR; // Clear Output Data Register + AT91_REG PIOA_ODSR; // Output Data Status Register + AT91_REG PIOA_PDSR; // Pin Data Status Register + AT91_REG PIOA_IER; // Interrupt Enable Register + AT91_REG PIOA_IDR; // Interrupt Disable Register + AT91_REG PIOA_IMR; // Interrupt Mask Register + AT91_REG PIOA_ISR; // Interrupt Status Register + AT91_REG PIOA_MDER; // Multi-driver Enable Register + AT91_REG PIOA_MDDR; // Multi-driver Disable Register + AT91_REG PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG PIOA_PPUDR; // Pull-up Disable Register + AT91_REG PIOA_PPUER; // Pull-up Enable Register + AT91_REG PIOA_PPUSR; // Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG PIOA_ASR; // Select A Register + AT91_REG PIOA_BSR; // Select B Register + AT91_REG PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG PIOA_OWER; // Output Write Enable Register + AT91_REG PIOA_OWDR; // Output Write Disable Register + AT91_REG PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[85]; // + AT91_REG PIOB_PER; // PIO Enable Register + AT91_REG PIOB_PDR; // PIO Disable Register + AT91_REG PIOB_PSR; // PIO Status Register + AT91_REG Reserved13[1]; // + AT91_REG PIOB_OER; // Output Enable Register + AT91_REG PIOB_ODR; // Output Disable Registerr + AT91_REG PIOB_OSR; // Output Status Register + AT91_REG Reserved14[1]; // + AT91_REG PIOB_IFER; // Input Filter Enable Register + AT91_REG PIOB_IFDR; // Input Filter Disable Register + AT91_REG PIOB_IFSR; // Input Filter Status Register + AT91_REG Reserved15[1]; // + AT91_REG PIOB_SODR; // Set Output Data Register + AT91_REG PIOB_CODR; // Clear Output Data Register + AT91_REG PIOB_ODSR; // Output Data Status Register + AT91_REG PIOB_PDSR; // Pin Data Status Register + AT91_REG PIOB_IER; // Interrupt Enable Register + AT91_REG PIOB_IDR; // Interrupt Disable Register + AT91_REG PIOB_IMR; // Interrupt Mask Register + AT91_REG PIOB_ISR; // Interrupt Status Register + AT91_REG PIOB_MDER; // Multi-driver Enable Register + AT91_REG PIOB_MDDR; // Multi-driver Disable Register + AT91_REG PIOB_MDSR; // Multi-driver Status Register + AT91_REG Reserved16[1]; // + AT91_REG PIOB_PPUDR; // Pull-up Disable Register + AT91_REG PIOB_PPUER; // Pull-up Enable Register + AT91_REG PIOB_PPUSR; // Pull-up Status Register + AT91_REG Reserved17[1]; // + AT91_REG PIOB_ASR; // Select A Register + AT91_REG PIOB_BSR; // Select B Register + AT91_REG PIOB_ABSR; // AB Select Status Register + AT91_REG Reserved18[9]; // + AT91_REG PIOB_OWER; // Output Write Enable Register + AT91_REG PIOB_OWDR; // Output Write Disable Register + AT91_REG PIOB_OWSR; // Output Write Status Register + AT91_REG Reserved19[341]; // + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved20[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved21[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved22[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved23[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved24[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved25[36]; // + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register + AT91_REG Reserved26[5]; // + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved27[5]; // + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_SYS, *AT91PS_SYS; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL ((unsigned int) 0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved4[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP ((unsigned int) 0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +typedef struct _AT91S_VREG { + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_VREG, *AT91PS_VREG; + +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY ((unsigned int) 0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG Reserved1[1]; // + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved2[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG Reserved2[2]; // + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved3[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG Reserved0[1]; // + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved1[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register + AT91_REG Reserved3[2]; // + AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register + AT91_REG Reserved4[3]; // + AT91_REG UDP_TXVC; // Transceiver Control Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR ((unsigned int) 0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS ((unsigned int) 0x1 << 8) // (UDP) +#define AT91C_UDP_PUON ((unsigned int) 0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +typedef struct _AT91S_CAN_MB { + AT91_REG CAN_MB_MMR; // MailBox Mode Register + AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register + AT91_REG CAN_MB_MID; // MailBox ID Register + AT91_REG CAN_MB_MFID; // MailBox Family ID Register + AT91_REG CAN_MB_MSR; // MailBox Status Register + AT91_REG CAN_MB_MDL; // MailBox Data Low Register + AT91_REG CAN_MB_MDH; // MailBox Data High Register + AT91_REG CAN_MB_MCR; // MailBox Control Register +} AT91S_CAN_MB, *AT91PS_CAN_MB; + +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK ((unsigned int) 0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS ((unsigned int) 0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX ((unsigned int) 0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE ((unsigned int) 0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX ((unsigned int) 0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER ((unsigned int) 0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER ((unsigned int) 0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB ((unsigned int) 0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP ((unsigned int) 0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +typedef struct _AT91S_CAN { + AT91_REG CAN_MR; // Mode Register + AT91_REG CAN_IER; // Interrupt Enable Register + AT91_REG CAN_IDR; // Interrupt Disable Register + AT91_REG CAN_IMR; // Interrupt Mask Register + AT91_REG CAN_SR; // Status Register + AT91_REG CAN_BR; // Baudrate Register + AT91_REG CAN_TIM; // Timer Register + AT91_REG CAN_TIMESTP; // Time Stamp Register + AT91_REG CAN_ECR; // Error Counter Register + AT91_REG CAN_TCR; // Transfer Command Register + AT91_REG CAN_ACR; // Abort Command Register + AT91_REG Reserved0[52]; // + AT91_REG CAN_VR; // Version Register + AT91_REG Reserved1[64]; // + AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 + AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 + AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 + AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 + AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 + AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 + AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 + AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 + AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 + AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 + AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 + AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 + AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 + AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 + AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 + AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 +} AT91S_CAN, *AT91PS_CAN; + +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN ((unsigned int) 0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM ((unsigned int) 0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM ((unsigned int) 0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL ((unsigned int) 0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF ((unsigned int) 0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM ((unsigned int) 0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ ((unsigned int) 0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT ((unsigned int) 0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 ((unsigned int) 0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 ((unsigned int) 0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 ((unsigned int) 0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 ((unsigned int) 0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 ((unsigned int) 0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 ((unsigned int) 0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 ((unsigned int) 0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 ((unsigned int) 0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 ((unsigned int) 0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 ((unsigned int) 0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR ((unsigned int) 0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR ((unsigned int) 0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR ((unsigned int) 0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY ((unsigned int) 0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 ((unsigned int) 0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 ((unsigned int) 0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG ((unsigned int) 0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP ((unsigned int) 0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER ((unsigned int) 0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC ((unsigned int) 0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +typedef struct _AT91S_EMAC { + AT91_REG EMAC_NCR; // Network Control Register + AT91_REG EMAC_NCFGR; // Network Configuration Register + AT91_REG EMAC_NSR; // Network Status Register + AT91_REG Reserved0[2]; // + AT91_REG EMAC_TSR; // Transmit Status Register + AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer + AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer + AT91_REG EMAC_RSR; // Receive Status Register + AT91_REG EMAC_ISR; // Interrupt Status Register + AT91_REG EMAC_IER; // Interrupt Enable Register + AT91_REG EMAC_IDR; // Interrupt Disable Register + AT91_REG EMAC_IMR; // Interrupt Mask Register + AT91_REG EMAC_MAN; // PHY Maintenance Register + AT91_REG EMAC_PTR; // Pause Time Register + AT91_REG EMAC_PFR; // Pause Frames received Register + AT91_REG EMAC_FTO; // Frames Transmitted OK Register + AT91_REG EMAC_SCF; // Single Collision Frame Register + AT91_REG EMAC_MCF; // Multiple Collision Frame Register + AT91_REG EMAC_FRO; // Frames Received OK Register + AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register + AT91_REG EMAC_ALE; // Alignment Error Register + AT91_REG EMAC_DTF; // Deferred Transmission Frame Register + AT91_REG EMAC_LCOL; // Late Collision Register + AT91_REG EMAC_ECOL; // Excessive Collision Register + AT91_REG EMAC_TUND; // Transmit Underrun Error Register + AT91_REG EMAC_CSE; // Carrier Sense Error Register + AT91_REG EMAC_RRE; // Receive Ressource Error Register + AT91_REG EMAC_ROV; // Receive Overrun Errors Register + AT91_REG EMAC_RSE; // Receive Symbol Errors Register + AT91_REG EMAC_ELE; // Excessive Length Errors Register + AT91_REG EMAC_RJA; // Receive Jabbers Register + AT91_REG EMAC_USF; // Undersize Frames Register + AT91_REG EMAC_STE; // SQE Test Error Register + AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register + AT91_REG EMAC_TPF; // Transmitted Pause Frames Register + AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] + AT91_REG EMAC_HRT; // Hash Address Top[63:32] + AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes + AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes + AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes + AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes + AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes + AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes + AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes + AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes + AT91_REG EMAC_TID; // Type ID Checking Register + AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register + AT91_REG EMAC_USRIO; // USER Input/Output Register + AT91_REG EMAC_WOL; // Wake On LAN Register + AT91_REG Reserved1[13]; // + AT91_REG EMAC_REV; // Revision Register +} AT91S_EMAC, *AT91PS_EMAC; + +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB ((unsigned int) 0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB ((unsigned int) 0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE ((unsigned int) 0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE ((unsigned int) 0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE ((unsigned int) 0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT ((unsigned int) 0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT ((unsigned int) 0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT ((unsigned int) 0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP ((unsigned int) 0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART ((unsigned int) 0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD ((unsigned int) 0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD ((unsigned int) 0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME ((unsigned int) 0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF ((unsigned int) 0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC ((unsigned int) 0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI ((unsigned int) 0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI ((unsigned int) 0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG ((unsigned int) 0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE ((unsigned int) 0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK ((unsigned int) 0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE ((unsigned int) 0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF ((unsigned int) 0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD ((unsigned int) 0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO ((unsigned int) 0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX ((unsigned int) 0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND ((unsigned int) 0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR ((unsigned int) 0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR ((unsigned int) 0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR ((unsigned int) 0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP ((unsigned int) 0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK ((unsigned int) 0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR ((unsigned int) 0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP ((unsigned int) 0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ ((unsigned int) 0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE ((unsigned int) 0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA ((unsigned int) 0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA ((unsigned int) 0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW ((unsigned int) 0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF ((unsigned int) 0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII ((unsigned int) 0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP ((unsigned int) 0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF ((unsigned int) 0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_AES { + AT91_REG AES_CR; // Control Register + AT91_REG AES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG AES_IER; // Interrupt Enable Register + AT91_REG AES_IDR; // Interrupt Disable Register + AT91_REG AES_IMR; // Interrupt Mask Register + AT91_REG AES_ISR; // Interrupt Status Register + AT91_REG AES_KEYWxR[4]; // Key Word x Register + AT91_REG Reserved1[4]; // + AT91_REG AES_IDATAxR[4]; // Input Data x Register + AT91_REG AES_ODATAxR[4]; // Output Data x Register + AT91_REG AES_IVxR[4]; // Initialization Vector x Register + AT91_REG Reserved2[35]; // + AT91_REG AES_VR; // AES Version Register + AT91_REG AES_RPR; // Receive Pointer Register + AT91_REG AES_RCR; // Receive Counter Register + AT91_REG AES_TPR; // Transmit Pointer Register + AT91_REG AES_TCR; // Transmit Counter Register + AT91_REG AES_RNPR; // Receive Next Pointer Register + AT91_REG AES_RNCR; // Receive Next Counter Register + AT91_REG AES_TNPR; // Transmit Next Pointer Register + AT91_REG AES_TNCR; // Transmit Next Counter Register + AT91_REG AES_PTCR; // PDC Transfer Control Register + AT91_REG AES_PTSR; // PDC Transfer Status Register +} AT91S_AES, *AT91PS_AES; + +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START ((unsigned int) 0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST ((unsigned int) 0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER ((unsigned int) 0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY ((unsigned int) 0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD ((unsigned int) 0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC ((unsigned int) 0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD ((unsigned int) 0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT ((unsigned int) 0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT ((unsigned int) 0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT ((unsigned int) 0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT ((unsigned int) 0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT ((unsigned int) 0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY ((unsigned int) 0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY ((unsigned int) 0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX ((unsigned int) 0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX ((unsigned int) 0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF ((unsigned int) 0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE ((unsigned int) 0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD ((unsigned int) 0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ ((unsigned int) 0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_TDES { + AT91_REG TDES_CR; // Control Register + AT91_REG TDES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG TDES_IER; // Interrupt Enable Register + AT91_REG TDES_IDR; // Interrupt Disable Register + AT91_REG TDES_IMR; // Interrupt Mask Register + AT91_REG TDES_ISR; // Interrupt Status Register + AT91_REG TDES_KEY1WxR[2]; // Key 1 Word x Register + AT91_REG TDES_KEY2WxR[2]; // Key 2 Word x Register + AT91_REG TDES_KEY3WxR[2]; // Key 3 Word x Register + AT91_REG Reserved1[2]; // + AT91_REG TDES_IDATAxR[2]; // Input Data x Register + AT91_REG Reserved2[2]; // + AT91_REG TDES_ODATAxR[2]; // Output Data x Register + AT91_REG Reserved3[2]; // + AT91_REG TDES_IVxR[2]; // Initialization Vector x Register + AT91_REG Reserved4[37]; // + AT91_REG TDES_VR; // TDES Version Register + AT91_REG TDES_RPR; // Receive Pointer Register + AT91_REG TDES_RCR; // Receive Counter Register + AT91_REG TDES_TPR; // Transmit Pointer Register + AT91_REG TDES_TCR; // Transmit Counter Register + AT91_REG TDES_RNPR; // Receive Next Pointer Register + AT91_REG TDES_RNCR; // Receive Next Counter Register + AT91_REG TDES_TNPR; // Transmit Next Pointer Register + AT91_REG TDES_TNCR; // Transmit Next Counter Register + AT91_REG TDES_PTCR; // PDC Transfer Control Register + AT91_REG TDES_PTSR; // PDC Transfer Status Register +} AT91S_TDES, *AT91PS_TDES; + +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START ((unsigned int) 0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST ((unsigned int) 0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER ((unsigned int) 0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD ((unsigned int) 0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD ((unsigned int) 0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD ((unsigned int) 0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC ((unsigned int) 0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD ((unsigned int) 0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT ((unsigned int) 0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT ((unsigned int) 0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT ((unsigned int) 0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT ((unsigned int) 0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY ((unsigned int) 0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX ((unsigned int) 0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX ((unsigned int) 0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF ((unsigned int) 0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE ((unsigned int) 0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD ((unsigned int) 0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR ((AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER ((AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR ((AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR ((AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR ((AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR ((AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR ((AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER ((AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR ((AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER ((AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR ((AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR ((AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR ((AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR ((AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR ((AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR ((AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR ((AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR ((AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER ((AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR ((AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR ((AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR ((AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR ((AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR ((AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER ((AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR ((AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR ((AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER ((AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER ((AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR ((AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR ((AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR ((AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR ((AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR ((AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR ((AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR ((AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR ((AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR ((AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR ((AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR ((AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR ((AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER ((AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR ((AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR ((AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR ((AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR ((AT91_REG *) 0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR ((AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR ((AT91_REG *) 0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR ((AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER ((AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR ((AT91_REG *) 0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR ((AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR ((AT91_REG *) 0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR ((AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR ((AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR ((AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR ((AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR ((AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC ((AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL ((AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM ((AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR ((AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID ((AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR ((AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID ((AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH ((AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR ((AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL ((AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID ((AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR ((AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR ((AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM ((AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH ((AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR ((AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID ((AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR ((AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH ((AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID ((AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL ((AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR ((AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM ((AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID ((AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR ((AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID ((AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM ((AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID ((AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR ((AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR ((AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR ((AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL ((AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH ((AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID ((AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR ((AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH ((AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID ((AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR ((AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR ((AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL ((AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM ((AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR ((AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR ((AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID ((AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH ((AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID ((AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR ((AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL ((AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM ((AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID ((AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID ((AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM ((AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR ((AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL ((AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR ((AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH ((AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR ((AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR ((AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH ((AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID ((AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL ((AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID ((AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR ((AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM ((AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR ((AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR ((AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR ((AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER ((AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR ((AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP ((AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR ((AT91_REG *) 0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR ((AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR ((AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM ((AT91_REG *) 0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR ((AT91_REG *) 0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR ((AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR ((AT91_REG *) 0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR ((AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H ((AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L ((AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE ((AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL ((AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE ((AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL ((AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF ((AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND ((AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR ((AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L ((AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR ((AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L ((AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR ((AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR ((AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE ((AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL ((AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID ((AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB ((AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP ((AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO ((AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR ((AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H ((AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV ((AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE ((AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA ((AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP ((AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF ((AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR ((AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT ((AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF ((AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE ((AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ ((AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN ((AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO ((AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV ((AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR ((AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF ((AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR ((AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF ((AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR ((AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L ((AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO ((AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER ((AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H ((AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE ((AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H ((AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE ((AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE ((AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR ((AT91_REG *) 0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR ((AT91_REG *) 0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR ((AT91_REG *) 0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR ((AT91_REG *) 0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR ((AT91_REG *) 0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR ((AT91_REG *) 0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR ((AT91_REG *) 0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR ((AT91_REG *) 0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR ((AT91_REG *) 0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR ((AT91_REG *) 0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR ((AT91_REG *) 0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR ((AT91_REG *) 0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR ((AT91_REG *) 0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR ((AT91_REG *) 0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR ((AT91_REG *) 0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR ((AT91_REG *) 0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR ((AT91_REG *) 0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR ((AT91_REG *) 0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER ((AT91_REG *) 0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR ((AT91_REG *) 0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR ((AT91_REG *) 0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR ((AT91_REG *) 0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR ((AT91_REG *) 0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR ((AT91_REG *) 0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR ((AT91_REG *) 0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR ((AT91_REG *) 0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR ((AT91_REG *) 0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR ((AT91_REG *) 0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR ((AT91_REG *) 0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR ((AT91_REG *) 0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR ((AT91_REG *) 0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR ((AT91_REG *) 0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR ((AT91_REG *) 0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR ((AT91_REG *) 0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR ((AT91_REG *) 0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR ((AT91_REG *) 0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR ((AT91_REG *) 0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR ((AT91_REG *) 0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR ((AT91_REG *) 0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR ((AT91_REG *) 0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER ((AT91_REG *) 0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR ((AT91_REG *) 0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR ((AT91_REG *) 0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR ((AT91_REG *) 0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 ((unsigned int) AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 ((unsigned int) AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD ((unsigned int) AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK ((unsigned int) AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 ((unsigned int) AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 ((unsigned int) AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 ((unsigned int) AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 ((unsigned int) AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 ((unsigned int) AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 ((unsigned int) AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 ((unsigned int) AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 ((unsigned int) AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 ((unsigned int) AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX ((unsigned int) AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 ((unsigned int) AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX ((unsigned int) AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF ((unsigned int) AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 ((unsigned int) AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK ((unsigned int) AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 ((unsigned int) AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD ((unsigned int) AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 ((unsigned int) AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD ((unsigned int) AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 ((unsigned int) AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK ((unsigned int) AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 ((unsigned int) AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF ((unsigned int) AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 ((unsigned int) AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD ((unsigned int) AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 ((unsigned int) AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD ((unsigned int) AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ ((unsigned int) AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 ((unsigned int) AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 ((unsigned int) AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 ((unsigned int) AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 ((unsigned int) AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 ((unsigned int) AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 ((unsigned int) AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 ((unsigned int) AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 ((unsigned int) AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 ((unsigned int) AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 ((unsigned int) AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 ((unsigned int) AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 ((unsigned int) AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 ((unsigned int) AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 ((unsigned int) AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 ((unsigned int) 1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 ((unsigned int) AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 ((unsigned int) 1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN ((unsigned int) AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 ((unsigned int) 1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 ((unsigned int) AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 ((unsigned int) AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 ((unsigned int) 1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 ((unsigned int) AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 ((unsigned int) AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 ((unsigned int) 1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER ((unsigned int) AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 ((unsigned int) AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 ((unsigned int) 1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 ((unsigned int) AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 ((unsigned int) AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 ((unsigned int) 1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 ((unsigned int) AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 ((unsigned int) AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 ((unsigned int) 1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV ((unsigned int) AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 ((unsigned int) 1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL ((unsigned int) AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 ((unsigned int) AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 ((unsigned int) 1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK ((unsigned int) AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 ((unsigned int) AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 ((unsigned int) 1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 ((unsigned int) AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG ((unsigned int) AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 ((unsigned int) 1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 ((unsigned int) AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 ((unsigned int) AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 ((unsigned int) 1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 ((unsigned int) AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 ((unsigned int) 1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 ((unsigned int) AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 ((unsigned int) AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 ((unsigned int) 1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 ((unsigned int) AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 ((unsigned int) AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 ((unsigned int) 1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 ((unsigned int) AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 ((unsigned int) AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 ((unsigned int) 1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 ((unsigned int) AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 ((unsigned int) AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 ((unsigned int) 1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 ((unsigned int) AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 ((unsigned int) AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 ((unsigned int) 1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 ((unsigned int) AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 ((unsigned int) AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 ((unsigned int) 1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 ((unsigned int) AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 ((unsigned int) AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 ((unsigned int) 1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 ((unsigned int) AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 ((unsigned int) AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 ((unsigned int) 1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 ((unsigned int) AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 ((unsigned int) AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 ((unsigned int) 1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 ((unsigned int) AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 ((unsigned int) AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 ((unsigned int) 1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 ((unsigned int) AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 ((unsigned int) 1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 ((unsigned int) AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 ((unsigned int) AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 ((unsigned int) 1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 ((unsigned int) 1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 ((unsigned int) AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 ((unsigned int) 1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 ((unsigned int) AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 ((unsigned int) 1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER ((unsigned int) AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 ((unsigned int) 1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC ((unsigned int) AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 ((unsigned int) 1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO ((unsigned int) AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ((unsigned int) 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ((unsigned int) 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ((unsigned int) 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_CAN ((unsigned int) 15) // Control Area Network Controller +#define AT91C_ID_EMAC ((unsigned int) 16) // Ethernet MAC +#define AT91C_ID_ADC ((unsigned int) 17) // Analog-to-Digital Converter +#define AT91C_ID_AES ((unsigned int) 18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES ((unsigned int) 19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB ((AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG ((AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 ((AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 ((AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 ((AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 ((AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 ((AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 ((AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 ((AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 ((AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 ((AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 ((AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 ((AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN ((AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC ((AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES ((AT91PS_PDC) 0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES ((AT91PS_AES) 0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES ((AT91PS_PDC) 0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES ((AT91PS_TDES) 0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00010000) // Internal SRAM size in byte (64 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00040000) // Internal ROM size in byte (256 Kbyte) + +#define AT91F_AIC_ConfigureIt( irq_id, priority, src_type, newHandler ) \ +{ \ + unsigned int mask ; \ + \ + mask = 0x1 << irq_id; \ + /* Disable the interrupt on the interrupt controller */ \ + AT91C_BASE_AIC->AIC_IDCR = mask ; \ + /* Save the interrupt handler routine pointer and the interrupt priority */ \ + AT91C_BASE_AIC->AIC_SVR[irq_id] = (unsigned int) newHandler ; \ + /* Store the Source Mode Register */ \ + AT91C_BASE_AIC->AIC_SMR[irq_id] = src_type | priority ; \ + /* Clear the interrupt on the interrupt controller */ \ + AT91C_BASE_AIC->AIC_ICCR = mask ; \ +} + + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h new file mode 100644 index 0000000..567ae74 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h @@ -0,0 +1,4698 @@ +// - ---------------------------------------------------------------------------- +// - ATMEL Microcontroller Software Support - ROUSSET - +// - ---------------------------------------------------------------------------- +// - DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// - DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +// - ---------------------------------------------------------------------------- +// - File Name : AT91SAM7X256.h +// - Object : AT91SAM7X256 definitions +// - Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +// - +// - CVS Reference : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005// +// - CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// - CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// - CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// - CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// - CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// - CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// - CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// - CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// - CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// - CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// - CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// - CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// - CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// - CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// - CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// - CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// - CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// - CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// - CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// - CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// - CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// - CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// - CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// - CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// - ---------------------------------------------------------------------------- + +#ifndef AT91SAM7X256_H +#define AT91SAM7X256_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYS { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG PIOA_PER; // PIO Enable Register + AT91_REG PIOA_PDR; // PIO Disable Register + AT91_REG PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG PIOA_OER; // Output Enable Register + AT91_REG PIOA_ODR; // Output Disable Registerr + AT91_REG PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG PIOA_IFER; // Input Filter Enable Register + AT91_REG PIOA_IFDR; // Input Filter Disable Register + AT91_REG PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG PIOA_SODR; // Set Output Data Register + AT91_REG PIOA_CODR; // Clear Output Data Register + AT91_REG PIOA_ODSR; // Output Data Status Register + AT91_REG PIOA_PDSR; // Pin Data Status Register + AT91_REG PIOA_IER; // Interrupt Enable Register + AT91_REG PIOA_IDR; // Interrupt Disable Register + AT91_REG PIOA_IMR; // Interrupt Mask Register + AT91_REG PIOA_ISR; // Interrupt Status Register + AT91_REG PIOA_MDER; // Multi-driver Enable Register + AT91_REG PIOA_MDDR; // Multi-driver Disable Register + AT91_REG PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG PIOA_PPUDR; // Pull-up Disable Register + AT91_REG PIOA_PPUER; // Pull-up Enable Register + AT91_REG PIOA_PPUSR; // Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG PIOA_ASR; // Select A Register + AT91_REG PIOA_BSR; // Select B Register + AT91_REG PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG PIOA_OWER; // Output Write Enable Register + AT91_REG PIOA_OWDR; // Output Write Disable Register + AT91_REG PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[85]; // + AT91_REG PIOB_PER; // PIO Enable Register + AT91_REG PIOB_PDR; // PIO Disable Register + AT91_REG PIOB_PSR; // PIO Status Register + AT91_REG Reserved13[1]; // + AT91_REG PIOB_OER; // Output Enable Register + AT91_REG PIOB_ODR; // Output Disable Registerr + AT91_REG PIOB_OSR; // Output Status Register + AT91_REG Reserved14[1]; // + AT91_REG PIOB_IFER; // Input Filter Enable Register + AT91_REG PIOB_IFDR; // Input Filter Disable Register + AT91_REG PIOB_IFSR; // Input Filter Status Register + AT91_REG Reserved15[1]; // + AT91_REG PIOB_SODR; // Set Output Data Register + AT91_REG PIOB_CODR; // Clear Output Data Register + AT91_REG PIOB_ODSR; // Output Data Status Register + AT91_REG PIOB_PDSR; // Pin Data Status Register + AT91_REG PIOB_IER; // Interrupt Enable Register + AT91_REG PIOB_IDR; // Interrupt Disable Register + AT91_REG PIOB_IMR; // Interrupt Mask Register + AT91_REG PIOB_ISR; // Interrupt Status Register + AT91_REG PIOB_MDER; // Multi-driver Enable Register + AT91_REG PIOB_MDDR; // Multi-driver Disable Register + AT91_REG PIOB_MDSR; // Multi-driver Status Register + AT91_REG Reserved16[1]; // + AT91_REG PIOB_PPUDR; // Pull-up Disable Register + AT91_REG PIOB_PPUER; // Pull-up Enable Register + AT91_REG PIOB_PPUSR; // Pull-up Status Register + AT91_REG Reserved17[1]; // + AT91_REG PIOB_ASR; // Select A Register + AT91_REG PIOB_BSR; // Select B Register + AT91_REG PIOB_ABSR; // AB Select Status Register + AT91_REG Reserved18[9]; // + AT91_REG PIOB_OWER; // Output Write Enable Register + AT91_REG PIOB_OWDR; // Output Write Disable Register + AT91_REG PIOB_OWSR; // Output Write Status Register + AT91_REG Reserved19[341]; // + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved20[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved21[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved22[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved23[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved24[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved25[36]; // + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register + AT91_REG Reserved26[5]; // + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved27[5]; // + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_SYS, *AT91PS_SYS; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL ((unsigned int) 0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved4[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP ((unsigned int) 0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +typedef struct _AT91S_VREG { + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_VREG, *AT91PS_VREG; + +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY ((unsigned int) 0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG Reserved1[1]; // + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved2[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG Reserved2[2]; // + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved3[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG Reserved0[1]; // + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved1[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register + AT91_REG Reserved3[2]; // + AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register + AT91_REG Reserved4[3]; // + AT91_REG UDP_TXVC; // Transceiver Control Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR ((unsigned int) 0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS ((unsigned int) 0x1 << 8) // (UDP) +#define AT91C_UDP_PUON ((unsigned int) 0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +typedef struct _AT91S_CAN_MB { + AT91_REG CAN_MB_MMR; // MailBox Mode Register + AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register + AT91_REG CAN_MB_MID; // MailBox ID Register + AT91_REG CAN_MB_MFID; // MailBox Family ID Register + AT91_REG CAN_MB_MSR; // MailBox Status Register + AT91_REG CAN_MB_MDL; // MailBox Data Low Register + AT91_REG CAN_MB_MDH; // MailBox Data High Register + AT91_REG CAN_MB_MCR; // MailBox Control Register +} AT91S_CAN_MB, *AT91PS_CAN_MB; + +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK ((unsigned int) 0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS ((unsigned int) 0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX ((unsigned int) 0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE ((unsigned int) 0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX ((unsigned int) 0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER ((unsigned int) 0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER ((unsigned int) 0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB ((unsigned int) 0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP ((unsigned int) 0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +typedef struct _AT91S_CAN { + AT91_REG CAN_MR; // Mode Register + AT91_REG CAN_IER; // Interrupt Enable Register + AT91_REG CAN_IDR; // Interrupt Disable Register + AT91_REG CAN_IMR; // Interrupt Mask Register + AT91_REG CAN_SR; // Status Register + AT91_REG CAN_BR; // Baudrate Register + AT91_REG CAN_TIM; // Timer Register + AT91_REG CAN_TIMESTP; // Time Stamp Register + AT91_REG CAN_ECR; // Error Counter Register + AT91_REG CAN_TCR; // Transfer Command Register + AT91_REG CAN_ACR; // Abort Command Register + AT91_REG Reserved0[52]; // + AT91_REG CAN_VR; // Version Register + AT91_REG Reserved1[64]; // + AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 + AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 + AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 + AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 + AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 + AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 + AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 + AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 + AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 + AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 + AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 + AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 + AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 + AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 + AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 + AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 +} AT91S_CAN, *AT91PS_CAN; + +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN ((unsigned int) 0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM ((unsigned int) 0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM ((unsigned int) 0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL ((unsigned int) 0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF ((unsigned int) 0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM ((unsigned int) 0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ ((unsigned int) 0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT ((unsigned int) 0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 ((unsigned int) 0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 ((unsigned int) 0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 ((unsigned int) 0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 ((unsigned int) 0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 ((unsigned int) 0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 ((unsigned int) 0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 ((unsigned int) 0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 ((unsigned int) 0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 ((unsigned int) 0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 ((unsigned int) 0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR ((unsigned int) 0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR ((unsigned int) 0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR ((unsigned int) 0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY ((unsigned int) 0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 ((unsigned int) 0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 ((unsigned int) 0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG ((unsigned int) 0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP ((unsigned int) 0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER ((unsigned int) 0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC ((unsigned int) 0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +typedef struct _AT91S_EMAC { + AT91_REG EMAC_NCR; // Network Control Register + AT91_REG EMAC_NCFGR; // Network Configuration Register + AT91_REG EMAC_NSR; // Network Status Register + AT91_REG Reserved0[2]; // + AT91_REG EMAC_TSR; // Transmit Status Register + AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer + AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer + AT91_REG EMAC_RSR; // Receive Status Register + AT91_REG EMAC_ISR; // Interrupt Status Register + AT91_REG EMAC_IER; // Interrupt Enable Register + AT91_REG EMAC_IDR; // Interrupt Disable Register + AT91_REG EMAC_IMR; // Interrupt Mask Register + AT91_REG EMAC_MAN; // PHY Maintenance Register + AT91_REG EMAC_PTR; // Pause Time Register + AT91_REG EMAC_PFR; // Pause Frames received Register + AT91_REG EMAC_FTO; // Frames Transmitted OK Register + AT91_REG EMAC_SCF; // Single Collision Frame Register + AT91_REG EMAC_MCF; // Multiple Collision Frame Register + AT91_REG EMAC_FRO; // Frames Received OK Register + AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register + AT91_REG EMAC_ALE; // Alignment Error Register + AT91_REG EMAC_DTF; // Deferred Transmission Frame Register + AT91_REG EMAC_LCOL; // Late Collision Register + AT91_REG EMAC_ECOL; // Excessive Collision Register + AT91_REG EMAC_TUND; // Transmit Underrun Error Register + AT91_REG EMAC_CSE; // Carrier Sense Error Register + AT91_REG EMAC_RRE; // Receive Ressource Error Register + AT91_REG EMAC_ROV; // Receive Overrun Errors Register + AT91_REG EMAC_RSE; // Receive Symbol Errors Register + AT91_REG EMAC_ELE; // Excessive Length Errors Register + AT91_REG EMAC_RJA; // Receive Jabbers Register + AT91_REG EMAC_USF; // Undersize Frames Register + AT91_REG EMAC_STE; // SQE Test Error Register + AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register + AT91_REG EMAC_TPF; // Transmitted Pause Frames Register + AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] + AT91_REG EMAC_HRT; // Hash Address Top[63:32] + AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes + AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes + AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes + AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes + AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes + AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes + AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes + AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes + AT91_REG EMAC_TID; // Type ID Checking Register + AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register + AT91_REG EMAC_USRIO; // USER Input/Output Register + AT91_REG EMAC_WOL; // Wake On LAN Register + AT91_REG Reserved1[13]; // + AT91_REG EMAC_REV; // Revision Register +} AT91S_EMAC, *AT91PS_EMAC; + +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB ((unsigned int) 0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB ((unsigned int) 0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE ((unsigned int) 0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE ((unsigned int) 0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE ((unsigned int) 0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT ((unsigned int) 0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT ((unsigned int) 0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT ((unsigned int) 0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP ((unsigned int) 0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART ((unsigned int) 0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD ((unsigned int) 0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD ((unsigned int) 0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME ((unsigned int) 0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF ((unsigned int) 0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC ((unsigned int) 0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI ((unsigned int) 0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI ((unsigned int) 0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG ((unsigned int) 0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE ((unsigned int) 0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK ((unsigned int) 0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE ((unsigned int) 0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF ((unsigned int) 0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD ((unsigned int) 0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO ((unsigned int) 0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX ((unsigned int) 0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND ((unsigned int) 0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR ((unsigned int) 0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR ((unsigned int) 0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR ((unsigned int) 0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP ((unsigned int) 0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK ((unsigned int) 0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR ((unsigned int) 0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP ((unsigned int) 0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ ((unsigned int) 0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE ((unsigned int) 0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA ((unsigned int) 0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA ((unsigned int) 0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW ((unsigned int) 0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF ((unsigned int) 0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII ((unsigned int) 0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP ((unsigned int) 0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF ((unsigned int) 0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_AES { + AT91_REG AES_CR; // Control Register + AT91_REG AES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG AES_IER; // Interrupt Enable Register + AT91_REG AES_IDR; // Interrupt Disable Register + AT91_REG AES_IMR; // Interrupt Mask Register + AT91_REG AES_ISR; // Interrupt Status Register + AT91_REG AES_KEYWxR[4]; // Key Word x Register + AT91_REG Reserved1[4]; // + AT91_REG AES_IDATAxR[4]; // Input Data x Register + AT91_REG AES_ODATAxR[4]; // Output Data x Register + AT91_REG AES_IVxR[4]; // Initialization Vector x Register + AT91_REG Reserved2[35]; // + AT91_REG AES_VR; // AES Version Register + AT91_REG AES_RPR; // Receive Pointer Register + AT91_REG AES_RCR; // Receive Counter Register + AT91_REG AES_TPR; // Transmit Pointer Register + AT91_REG AES_TCR; // Transmit Counter Register + AT91_REG AES_RNPR; // Receive Next Pointer Register + AT91_REG AES_RNCR; // Receive Next Counter Register + AT91_REG AES_TNPR; // Transmit Next Pointer Register + AT91_REG AES_TNCR; // Transmit Next Counter Register + AT91_REG AES_PTCR; // PDC Transfer Control Register + AT91_REG AES_PTSR; // PDC Transfer Status Register +} AT91S_AES, *AT91PS_AES; + +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START ((unsigned int) 0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST ((unsigned int) 0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER ((unsigned int) 0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY ((unsigned int) 0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD ((unsigned int) 0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC ((unsigned int) 0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD ((unsigned int) 0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT ((unsigned int) 0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT ((unsigned int) 0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT ((unsigned int) 0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT ((unsigned int) 0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT ((unsigned int) 0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY ((unsigned int) 0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY ((unsigned int) 0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX ((unsigned int) 0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX ((unsigned int) 0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF ((unsigned int) 0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE ((unsigned int) 0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD ((unsigned int) 0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ ((unsigned int) 0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_TDES { + AT91_REG TDES_CR; // Control Register + AT91_REG TDES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG TDES_IER; // Interrupt Enable Register + AT91_REG TDES_IDR; // Interrupt Disable Register + AT91_REG TDES_IMR; // Interrupt Mask Register + AT91_REG TDES_ISR; // Interrupt Status Register + AT91_REG TDES_KEY1WxR[2]; // Key 1 Word x Register + AT91_REG TDES_KEY2WxR[2]; // Key 2 Word x Register + AT91_REG TDES_KEY3WxR[2]; // Key 3 Word x Register + AT91_REG Reserved1[2]; // + AT91_REG TDES_IDATAxR[2]; // Input Data x Register + AT91_REG Reserved2[2]; // + AT91_REG TDES_ODATAxR[2]; // Output Data x Register + AT91_REG Reserved3[2]; // + AT91_REG TDES_IVxR[2]; // Initialization Vector x Register + AT91_REG Reserved4[37]; // + AT91_REG TDES_VR; // TDES Version Register + AT91_REG TDES_RPR; // Receive Pointer Register + AT91_REG TDES_RCR; // Receive Counter Register + AT91_REG TDES_TPR; // Transmit Pointer Register + AT91_REG TDES_TCR; // Transmit Counter Register + AT91_REG TDES_RNPR; // Receive Next Pointer Register + AT91_REG TDES_RNCR; // Receive Next Counter Register + AT91_REG TDES_TNPR; // Transmit Next Pointer Register + AT91_REG TDES_TNCR; // Transmit Next Counter Register + AT91_REG TDES_PTCR; // PDC Transfer Control Register + AT91_REG TDES_PTSR; // PDC Transfer Status Register +} AT91S_TDES, *AT91PS_TDES; + +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START ((unsigned int) 0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST ((unsigned int) 0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER ((unsigned int) 0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD ((unsigned int) 0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD ((unsigned int) 0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD ((unsigned int) 0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC ((unsigned int) 0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD ((unsigned int) 0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT ((unsigned int) 0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT ((unsigned int) 0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT ((unsigned int) 0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT ((unsigned int) 0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY ((unsigned int) 0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX ((unsigned int) 0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX ((unsigned int) 0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF ((unsigned int) 0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE ((unsigned int) 0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD ((unsigned int) 0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR ((AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER ((AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR ((AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR ((AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR ((AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR ((AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR ((AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER ((AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR ((AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER ((AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR ((AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR ((AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR ((AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR ((AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR ((AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR ((AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR ((AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR ((AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER ((AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR ((AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR ((AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR ((AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR ((AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR ((AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER ((AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR ((AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR ((AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER ((AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER ((AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR ((AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR ((AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR ((AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR ((AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR ((AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR ((AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR ((AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR ((AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR ((AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR ((AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR ((AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR ((AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER ((AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR ((AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR ((AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR ((AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR ((AT91_REG *) 0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR ((AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR ((AT91_REG *) 0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR ((AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER ((AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR ((AT91_REG *) 0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR ((AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR ((AT91_REG *) 0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR ((AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR ((AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR ((AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR ((AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR ((AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC ((AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL ((AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM ((AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR ((AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID ((AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR ((AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID ((AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH ((AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR ((AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL ((AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID ((AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR ((AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR ((AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM ((AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH ((AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR ((AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID ((AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR ((AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH ((AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID ((AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL ((AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR ((AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM ((AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID ((AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR ((AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID ((AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM ((AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID ((AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR ((AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR ((AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR ((AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL ((AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH ((AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID ((AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR ((AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH ((AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID ((AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR ((AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR ((AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL ((AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM ((AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR ((AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR ((AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID ((AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH ((AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID ((AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR ((AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL ((AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM ((AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID ((AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID ((AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM ((AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR ((AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL ((AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR ((AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH ((AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR ((AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR ((AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH ((AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID ((AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL ((AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID ((AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR ((AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM ((AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR ((AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR ((AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR ((AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER ((AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR ((AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP ((AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR ((AT91_REG *) 0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR ((AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR ((AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM ((AT91_REG *) 0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR ((AT91_REG *) 0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR ((AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR ((AT91_REG *) 0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR ((AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H ((AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L ((AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE ((AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL ((AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE ((AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL ((AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF ((AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND ((AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR ((AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L ((AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR ((AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L ((AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR ((AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR ((AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE ((AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL ((AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID ((AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB ((AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP ((AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO ((AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR ((AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H ((AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV ((AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE ((AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA ((AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP ((AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF ((AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR ((AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT ((AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF ((AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE ((AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ ((AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN ((AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO ((AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV ((AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR ((AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF ((AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR ((AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF ((AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR ((AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L ((AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO ((AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER ((AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H ((AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE ((AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H ((AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE ((AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE ((AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR ((AT91_REG *) 0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR ((AT91_REG *) 0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR ((AT91_REG *) 0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR ((AT91_REG *) 0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR ((AT91_REG *) 0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR ((AT91_REG *) 0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR ((AT91_REG *) 0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR ((AT91_REG *) 0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR ((AT91_REG *) 0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR ((AT91_REG *) 0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR ((AT91_REG *) 0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR ((AT91_REG *) 0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR ((AT91_REG *) 0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR ((AT91_REG *) 0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR ((AT91_REG *) 0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR ((AT91_REG *) 0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR ((AT91_REG *) 0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR ((AT91_REG *) 0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER ((AT91_REG *) 0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR ((AT91_REG *) 0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR ((AT91_REG *) 0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR ((AT91_REG *) 0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR ((AT91_REG *) 0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR ((AT91_REG *) 0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR ((AT91_REG *) 0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR ((AT91_REG *) 0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR ((AT91_REG *) 0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR ((AT91_REG *) 0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR ((AT91_REG *) 0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR ((AT91_REG *) 0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR ((AT91_REG *) 0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR ((AT91_REG *) 0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR ((AT91_REG *) 0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR ((AT91_REG *) 0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR ((AT91_REG *) 0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR ((AT91_REG *) 0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR ((AT91_REG *) 0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR ((AT91_REG *) 0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR ((AT91_REG *) 0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR ((AT91_REG *) 0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER ((AT91_REG *) 0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR ((AT91_REG *) 0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR ((AT91_REG *) 0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR ((AT91_REG *) 0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 ((unsigned int) AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 ((unsigned int) AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD ((unsigned int) AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK ((unsigned int) AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 ((unsigned int) AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 ((unsigned int) AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 ((unsigned int) AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 ((unsigned int) AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 ((unsigned int) AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 ((unsigned int) AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 ((unsigned int) AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 ((unsigned int) AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 ((unsigned int) AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX ((unsigned int) AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 ((unsigned int) AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX ((unsigned int) AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF ((unsigned int) AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 ((unsigned int) AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK ((unsigned int) AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 ((unsigned int) AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD ((unsigned int) AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 ((unsigned int) AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD ((unsigned int) AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 ((unsigned int) AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK ((unsigned int) AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 ((unsigned int) AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF ((unsigned int) AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 ((unsigned int) AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD ((unsigned int) AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 ((unsigned int) AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD ((unsigned int) AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ ((unsigned int) AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 ((unsigned int) AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 ((unsigned int) AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 ((unsigned int) AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 ((unsigned int) AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 ((unsigned int) AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 ((unsigned int) AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 ((unsigned int) AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 ((unsigned int) AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 ((unsigned int) AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 ((unsigned int) AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 ((unsigned int) AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 ((unsigned int) AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 ((unsigned int) AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 ((unsigned int) AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 ((unsigned int) 1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 ((unsigned int) AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 ((unsigned int) 1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN ((unsigned int) AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 ((unsigned int) 1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 ((unsigned int) AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 ((unsigned int) AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 ((unsigned int) 1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 ((unsigned int) AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 ((unsigned int) AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 ((unsigned int) 1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER ((unsigned int) AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 ((unsigned int) AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 ((unsigned int) 1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 ((unsigned int) AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 ((unsigned int) AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 ((unsigned int) 1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 ((unsigned int) AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 ((unsigned int) AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 ((unsigned int) 1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV ((unsigned int) AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 ((unsigned int) 1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL ((unsigned int) AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 ((unsigned int) AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 ((unsigned int) 1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK ((unsigned int) AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 ((unsigned int) AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 ((unsigned int) 1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 ((unsigned int) AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG ((unsigned int) AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 ((unsigned int) 1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 ((unsigned int) AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 ((unsigned int) AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 ((unsigned int) 1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 ((unsigned int) AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 ((unsigned int) 1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 ((unsigned int) AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 ((unsigned int) AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 ((unsigned int) 1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 ((unsigned int) AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 ((unsigned int) AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 ((unsigned int) 1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 ((unsigned int) AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 ((unsigned int) AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 ((unsigned int) 1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 ((unsigned int) AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 ((unsigned int) AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 ((unsigned int) 1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 ((unsigned int) AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 ((unsigned int) AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 ((unsigned int) 1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 ((unsigned int) AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 ((unsigned int) AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 ((unsigned int) 1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 ((unsigned int) AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 ((unsigned int) AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 ((unsigned int) 1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 ((unsigned int) AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 ((unsigned int) AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 ((unsigned int) 1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 ((unsigned int) AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 ((unsigned int) AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 ((unsigned int) 1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 ((unsigned int) AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 ((unsigned int) AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 ((unsigned int) 1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 ((unsigned int) AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 ((unsigned int) 1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 ((unsigned int) AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 ((unsigned int) AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 ((unsigned int) 1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 ((unsigned int) 1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 ((unsigned int) AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 ((unsigned int) 1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 ((unsigned int) AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 ((unsigned int) 1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER ((unsigned int) AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 ((unsigned int) 1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC ((unsigned int) AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 ((unsigned int) 1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO ((unsigned int) AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ((unsigned int) 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ((unsigned int) 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ((unsigned int) 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_CAN ((unsigned int) 15) // Control Area Network Controller +#define AT91C_ID_EMAC ((unsigned int) 16) // Ethernet MAC +#define AT91C_ID_ADC ((unsigned int) 17) // Analog-to-Digital Converter +#define AT91C_ID_AES ((unsigned int) 18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES ((unsigned int) 19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB ((AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG ((AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 ((AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 ((AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 ((AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 ((AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 ((AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 ((AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 ((AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 ((AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 ((AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 ((AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 ((AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN ((AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC ((AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES ((AT91PS_PDC) 0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES ((AT91PS_AES) 0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES ((AT91PS_PDC) 0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES ((AT91PS_TDES) 0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00010000) // Internal SRAM size in byte (64 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00040000) // Internal ROM size in byte (256 Kbyte) + + + +// - Hardware register definition + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR System Peripherals +// - ***************************************************************************** + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// - ***************************************************************************** +// - -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#if 0 /*_RB_*/ +AT91C_AIC_PRIOR EQU (0x7 << 0) ;- (AIC) Priority Level +AT91C_AIC_PRIOR_LOWEST EQU (0x0) ;- (AIC) Lowest priority level +AT91C_AIC_PRIOR_HIGHEST EQU (0x7) ;- (AIC) Highest priority level +AT91C_AIC_SRCTYPE EQU (0x3 << 5) ;- (AIC) Interrupt Source Type +AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL EQU (0x0 << 5) ;- (AIC) Internal Sources Code Label High-level Sensitive +AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL EQU (0x0 << 5) ;- (AIC) External Sources Code Label Low-level Sensitive +AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE EQU (0x1 << 5) ;- (AIC) Internal Sources Code Label Positive Edge triggered +AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE EQU (0x1 << 5) ;- (AIC) External Sources Code Label Negative Edge triggered +AT91C_AIC_SRCTYPE_HIGH_LEVEL EQU (0x2 << 5) ;- (AIC) Internal Or External Sources Code Label High-level Sensitive +AT91C_AIC_SRCTYPE_POSITIVE_EDGE EQU (0x3 << 5) ;- (AIC) Internal Or External Sources Code Label Positive Edge triggered +// - -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +AT91C_AIC_NFIQ EQU (0x1 << 0) ;- (AIC) NFIQ Status +AT91C_AIC_NIRQ EQU (0x1 << 1) ;- (AIC) NIRQ Status +// - -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +AT91C_AIC_DCR_PROT EQU (0x1 << 0) ;- (AIC) Protection Mode +AT91C_AIC_DCR_GMSK EQU (0x1 << 1) ;- (AIC) General Mask +#endif +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// - ***************************************************************************** +// - -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +AT91C_PDC_RXTEN EQU (0x1 << 0) ;- (PDC) Receiver Transfer Enable +AT91C_PDC_RXTDIS EQU (0x1 << 1) ;- (PDC) Receiver Transfer Disable +AT91C_PDC_TXTEN EQU (0x1 << 8) ;- (PDC) Transmitter Transfer Enable +AT91C_PDC_TXTDIS EQU (0x1 << 9) ;- (PDC) Transmitter Transfer Disable +// - -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Debug Unit +// - ***************************************************************************** +// - -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +AT91C_US_RSTRX EQU (0x1 << 2) ;- (DBGU) Reset Receiver +AT91C_US_RSTTX EQU (0x1 << 3) ;- (DBGU) Reset Transmitter +AT91C_US_RXEN EQU (0x1 << 4) ;- (DBGU) Receiver Enable +AT91C_US_RXDIS EQU (0x1 << 5) ;- (DBGU) Receiver Disable +AT91C_US_TXEN EQU (0x1 << 6) ;- (DBGU) Transmitter Enable +AT91C_US_TXDIS EQU (0x1 << 7) ;- (DBGU) Transmitter Disable +AT91C_US_RSTSTA EQU (0x1 << 8) ;- (DBGU) Reset Status Bits +// - -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +AT91C_US_PAR EQU (0x7 << 9) ;- (DBGU) Parity type +AT91C_US_PAR_EVEN EQU (0x0 << 9) ;- (DBGU) Even Parity +AT91C_US_PAR_ODD EQU (0x1 << 9) ;- (DBGU) Odd Parity +AT91C_US_PAR_SPACE EQU (0x2 << 9) ;- (DBGU) Parity forced to 0 (Space) +AT91C_US_PAR_MARK EQU (0x3 << 9) ;- (DBGU) Parity forced to 1 (Mark) +AT91C_US_PAR_NONE EQU (0x4 << 9) ;- (DBGU) No Parity +AT91C_US_PAR_MULTI_DROP EQU (0x6 << 9) ;- (DBGU) Multi-drop mode +AT91C_US_CHMODE EQU (0x3 << 14) ;- (DBGU) Channel Mode +AT91C_US_CHMODE_NORMAL EQU (0x0 << 14) ;- (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +AT91C_US_CHMODE_AUTO EQU (0x1 << 14) ;- (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +AT91C_US_CHMODE_LOCAL EQU (0x2 << 14) ;- (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +AT91C_US_CHMODE_REMOTE EQU (0x3 << 14) ;- (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// - -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +AT91C_US_RXRDY EQU (0x1 << 0) ;- (DBGU) RXRDY Interrupt +AT91C_US_TXRDY EQU (0x1 << 1) ;- (DBGU) TXRDY Interrupt +AT91C_US_ENDRX EQU (0x1 << 3) ;- (DBGU) End of Receive Transfer Interrupt +AT91C_US_ENDTX EQU (0x1 << 4) ;- (DBGU) End of Transmit Interrupt +AT91C_US_OVRE EQU (0x1 << 5) ;- (DBGU) Overrun Interrupt +AT91C_US_FRAME EQU (0x1 << 6) ;- (DBGU) Framing Error Interrupt +AT91C_US_PARE EQU (0x1 << 7) ;- (DBGU) Parity Error Interrupt +AT91C_US_TXEMPTY EQU (0x1 << 9) ;- (DBGU) TXEMPTY Interrupt +AT91C_US_TXBUFE EQU (0x1 << 11) ;- (DBGU) TXBUFE Interrupt +AT91C_US_RXBUFF EQU (0x1 << 12) ;- (DBGU) RXBUFF Interrupt +AT91C_US_COMM_TX EQU (0x1 << 30) ;- (DBGU) COMM_TX Interrupt +AT91C_US_COMM_RX EQU (0x1 << 31) ;- (DBGU) COMM_RX Interrupt +// - -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// - -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// - -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// - -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +AT91C_US_FORCE_NTRST EQU (0x1 << 0) ;- (DBGU) Force NTRST in JTAG + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// - ***************************************************************************** + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Clock Generator Controler +// - ***************************************************************************** +// - -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +AT91C_CKGR_MOSCEN EQU (0x1 << 0) ;- (CKGR) Main Oscillator Enable +AT91C_CKGR_OSCBYPASS EQU (0x1 << 1) ;- (CKGR) Main Oscillator Bypass +AT91C_CKGR_OSCOUNT EQU (0xFF << 8) ;- (CKGR) Main Oscillator Start-up Time +// - -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +AT91C_CKGR_MAINF EQU (0xFFFF << 0) ;- (CKGR) Main Clock Frequency +AT91C_CKGR_MAINRDY EQU (0x1 << 16) ;- (CKGR) Main Clock Ready +// - -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +AT91C_CKGR_DIV EQU (0xFF << 0) ;- (CKGR) Divider Selected +AT91C_CKGR_DIV_0 EQU (0x0) ;- (CKGR) Divider output is 0 +AT91C_CKGR_DIV_BYPASS EQU (0x1) ;- (CKGR) Divider is bypassed +AT91C_CKGR_PLLCOUNT EQU (0x3F << 8) ;- (CKGR) PLL Counter +AT91C_CKGR_OUT EQU (0x3 << 14) ;- (CKGR) PLL Output Frequency Range +AT91C_CKGR_OUT_0 EQU (0x0 << 14) ;- (CKGR) Please refer to the PLL datasheet +AT91C_CKGR_OUT_1 EQU (0x1 << 14) ;- (CKGR) Please refer to the PLL datasheet +AT91C_CKGR_OUT_2 EQU (0x2 << 14) ;- (CKGR) Please refer to the PLL datasheet +AT91C_CKGR_OUT_3 EQU (0x3 << 14) ;- (CKGR) Please refer to the PLL datasheet +AT91C_CKGR_MUL EQU (0x7FF << 16) ;- (CKGR) PLL Multiplier +AT91C_CKGR_USBDIV EQU (0x3 << 28) ;- (CKGR) Divider for USB Clocks +AT91C_CKGR_USBDIV_0 EQU (0x0 << 28) ;- (CKGR) Divider output is PLL clock output +AT91C_CKGR_USBDIV_1 EQU (0x1 << 28) ;- (CKGR) Divider output is PLL clock output divided by 2 +AT91C_CKGR_USBDIV_2 EQU (0x2 << 28) ;- (CKGR) Divider output is PLL clock output divided by 4 + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Power Management Controler +// - ***************************************************************************** +// - -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +AT91C_PMC_PCK EQU (0x1 << 0) ;- (PMC) Processor Clock +AT91C_PMC_UDP EQU (0x1 << 7) ;- (PMC) USB Device Port Clock +AT91C_PMC_PCK0 EQU (0x1 << 8) ;- (PMC) Programmable Clock Output +AT91C_PMC_PCK1 EQU (0x1 << 9) ;- (PMC) Programmable Clock Output +AT91C_PMC_PCK2 EQU (0x1 << 10) ;- (PMC) Programmable Clock Output +AT91C_PMC_PCK3 EQU (0x1 << 11) ;- (PMC) Programmable Clock Output +// - -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// - -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// - -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// - -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// - -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// - -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +AT91C_PMC_CSS EQU (0x3 << 0) ;- (PMC) Programmable Clock Selection +AT91C_PMC_CSS_SLOW_CLK EQU (0x0) ;- (PMC) Slow Clock is selected +AT91C_PMC_CSS_MAIN_CLK EQU (0x1) ;- (PMC) Main Clock is selected +AT91C_PMC_CSS_PLL_CLK EQU (0x3) ;- (PMC) Clock from PLL is selected +AT91C_PMC_PRES EQU (0x7 << 2) ;- (PMC) Programmable Clock Prescaler +AT91C_PMC_PRES_CLK EQU (0x0 << 2) ;- (PMC) Selected clock +AT91C_PMC_PRES_CLK_2 EQU (0x1 << 2) ;- (PMC) Selected clock divided by 2 +AT91C_PMC_PRES_CLK_4 EQU (0x2 << 2) ;- (PMC) Selected clock divided by 4 +AT91C_PMC_PRES_CLK_8 EQU (0x3 << 2) ;- (PMC) Selected clock divided by 8 +AT91C_PMC_PRES_CLK_16 EQU (0x4 << 2) ;- (PMC) Selected clock divided by 16 +AT91C_PMC_PRES_CLK_32 EQU (0x5 << 2) ;- (PMC) Selected clock divided by 32 +AT91C_PMC_PRES_CLK_64 EQU (0x6 << 2) ;- (PMC) Selected clock divided by 64 +// - -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// - -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +AT91C_PMC_MOSCS EQU (0x1 << 0) ;- (PMC) MOSC Status/Enable/Disable/Mask +AT91C_PMC_LOCK EQU (0x1 << 2) ;- (PMC) PLL Status/Enable/Disable/Mask +AT91C_PMC_MCKRDY EQU (0x1 << 3) ;- (PMC) MCK_RDY Status/Enable/Disable/Mask +AT91C_PMC_PCK0RDY EQU (0x1 << 8) ;- (PMC) PCK0_RDY Status/Enable/Disable/Mask +AT91C_PMC_PCK1RDY EQU (0x1 << 9) ;- (PMC) PCK1_RDY Status/Enable/Disable/Mask +AT91C_PMC_PCK2RDY EQU (0x1 << 10) ;- (PMC) PCK2_RDY Status/Enable/Disable/Mask +AT91C_PMC_PCK3RDY EQU (0x1 << 11) ;- (PMC) PCK3_RDY Status/Enable/Disable/Mask +// - -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// - -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// - -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Reset Controller Interface +// - ***************************************************************************** +// - -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +AT91C_RSTC_PROCRST EQU (0x1 << 0) ;- (RSTC) Processor Reset +AT91C_RSTC_PERRST EQU (0x1 << 2) ;- (RSTC) Peripheral Reset +AT91C_RSTC_EXTRST EQU (0x1 << 3) ;- (RSTC) External Reset +AT91C_RSTC_KEY EQU (0xFF << 24) ;- (RSTC) Password +// - -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +AT91C_RSTC_URSTS EQU (0x1 << 0) ;- (RSTC) User Reset Status +AT91C_RSTC_BODSTS EQU (0x1 << 1) ;- (RSTC) Brownout Detection Status +AT91C_RSTC_RSTTYP EQU (0x7 << 8) ;- (RSTC) Reset Type +AT91C_RSTC_RSTTYP_POWERUP EQU (0x0 << 8) ;- (RSTC) Power-up Reset. VDDCORE rising. +AT91C_RSTC_RSTTYP_WAKEUP EQU (0x1 << 8) ;- (RSTC) WakeUp Reset. VDDCORE rising. +AT91C_RSTC_RSTTYP_WATCHDOG EQU (0x2 << 8) ;- (RSTC) Watchdog Reset. Watchdog overflow occured. +AT91C_RSTC_RSTTYP_SOFTWARE EQU (0x3 << 8) ;- (RSTC) Software Reset. Processor reset required by the software. +AT91C_RSTC_RSTTYP_USER EQU (0x4 << 8) ;- (RSTC) User Reset. NRST pin detected low. +AT91C_RSTC_RSTTYP_BROWNOUT EQU (0x5 << 8) ;- (RSTC) Brownout Reset occured. +AT91C_RSTC_NRSTL EQU (0x1 << 16) ;- (RSTC) NRST pin level +AT91C_RSTC_SRCMP EQU (0x1 << 17) ;- (RSTC) Software Reset Command in Progress. +// - -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +AT91C_RSTC_URSTEN EQU (0x1 << 0) ;- (RSTC) User Reset Enable +AT91C_RSTC_URSTIEN EQU (0x1 << 4) ;- (RSTC) User Reset Interrupt Enable +AT91C_RSTC_ERSTL EQU (0xF << 8) ;- (RSTC) User Reset Enable +AT91C_RSTC_BODIEN EQU (0x1 << 16) ;- (RSTC) Brownout Detection Interrupt Enable + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// - ***************************************************************************** +// - -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +AT91C_RTTC_RTPRES EQU (0xFFFF << 0) ;- (RTTC) Real-time Timer Prescaler Value +AT91C_RTTC_ALMIEN EQU (0x1 << 16) ;- (RTTC) Alarm Interrupt Enable +AT91C_RTTC_RTTINCIEN EQU (0x1 << 17) ;- (RTTC) Real Time Timer Increment Interrupt Enable +AT91C_RTTC_RTTRST EQU (0x1 << 18) ;- (RTTC) Real Time Timer Restart +// - -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +AT91C_RTTC_ALMV EQU (0x0 << 0) ;- (RTTC) Alarm Value +// - -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +AT91C_RTTC_CRTV EQU (0x0 << 0) ;- (RTTC) Current Real-time Value +// - -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +AT91C_RTTC_ALMS EQU (0x1 << 0) ;- (RTTC) Real-time Alarm Status +AT91C_RTTC_RTTINC EQU (0x1 << 1) ;- (RTTC) Real-time Timer Increment + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// - ***************************************************************************** +// - -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +AT91C_PITC_PIV EQU (0xFFFFF << 0) ;- (PITC) Periodic Interval Value +AT91C_PITC_PITEN EQU (0x1 << 24) ;- (PITC) Periodic Interval Timer Enabled +AT91C_PITC_PITIEN EQU (0x1 << 25) ;- (PITC) Periodic Interval Timer Interrupt Enable +// - -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +AT91C_PITC_PITS EQU (0x1 << 0) ;- (PITC) Periodic Interval Timer Status +// - -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +AT91C_PITC_CPIV EQU (0xFFFFF << 0) ;- (PITC) Current Periodic Interval Value +AT91C_PITC_PICNT EQU (0xFFF << 20) ;- (PITC) Periodic Interval Counter +// - -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// - ***************************************************************************** +// - -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +AT91C_WDTC_WDRSTT EQU (0x1 << 0) ;- (WDTC) Watchdog Restart +AT91C_WDTC_KEY EQU (0xFF << 24) ;- (WDTC) Watchdog KEY Password +// - -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +AT91C_WDTC_WDV EQU (0xFFF << 0) ;- (WDTC) Watchdog Timer Restart +AT91C_WDTC_WDFIEN EQU (0x1 << 12) ;- (WDTC) Watchdog Fault Interrupt Enable +AT91C_WDTC_WDRSTEN EQU (0x1 << 13) ;- (WDTC) Watchdog Reset Enable +AT91C_WDTC_WDRPROC EQU (0x1 << 14) ;- (WDTC) Watchdog Timer Restart +AT91C_WDTC_WDDIS EQU (0x1 << 15) ;- (WDTC) Watchdog Disable +AT91C_WDTC_WDD EQU (0xFFF << 16) ;- (WDTC) Watchdog Delta Value +AT91C_WDTC_WDDBGHLT EQU (0x1 << 28) ;- (WDTC) Watchdog Debug Halt +AT91C_WDTC_WDIDLEHLT EQU (0x1 << 29) ;- (WDTC) Watchdog Idle Halt +// - -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +AT91C_WDTC_WDUNF EQU (0x1 << 0) ;- (WDTC) Watchdog Underflow +AT91C_WDTC_WDERR EQU (0x1 << 1) ;- (WDTC) Watchdog Error + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// - ***************************************************************************** +// - -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +AT91C_VREG_PSTDBY EQU (0x1 << 0) ;- (VREG) Voltage Regulator Power Standby Mode + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Memory Controller Interface +// - ***************************************************************************** +// - -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +AT91C_MC_RCB EQU (0x1 << 0) ;- (MC) Remap Command Bit +// - -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +AT91C_MC_UNDADD EQU (0x1 << 0) ;- (MC) Undefined Addess Abort Status +AT91C_MC_MISADD EQU (0x1 << 1) ;- (MC) Misaligned Addess Abort Status +AT91C_MC_ABTSZ EQU (0x3 << 8) ;- (MC) Abort Size Status +AT91C_MC_ABTSZ_BYTE EQU (0x0 << 8) ;- (MC) Byte +AT91C_MC_ABTSZ_HWORD EQU (0x1 << 8) ;- (MC) Half-word +AT91C_MC_ABTSZ_WORD EQU (0x2 << 8) ;- (MC) Word +AT91C_MC_ABTTYP EQU (0x3 << 10) ;- (MC) Abort Type Status +AT91C_MC_ABTTYP_DATAR EQU (0x0 << 10) ;- (MC) Data Read +AT91C_MC_ABTTYP_DATAW EQU (0x1 << 10) ;- (MC) Data Write +AT91C_MC_ABTTYP_FETCH EQU (0x2 << 10) ;- (MC) Code Fetch +AT91C_MC_MST0 EQU (0x1 << 16) ;- (MC) Master 0 Abort Source +AT91C_MC_MST1 EQU (0x1 << 17) ;- (MC) Master 1 Abort Source +AT91C_MC_SVMST0 EQU (0x1 << 24) ;- (MC) Saved Master 0 Abort Source +AT91C_MC_SVMST1 EQU (0x1 << 25) ;- (MC) Saved Master 1 Abort Source +// - -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +AT91C_MC_FRDY EQU (0x1 << 0) ;- (MC) Flash Ready +AT91C_MC_LOCKE EQU (0x1 << 2) ;- (MC) Lock Error +AT91C_MC_PROGE EQU (0x1 << 3) ;- (MC) Programming Error +AT91C_MC_NEBP EQU (0x1 << 7) ;- (MC) No Erase Before Programming +AT91C_MC_FWS EQU (0x3 << 8) ;- (MC) Flash Wait State +AT91C_MC_FWS_0FWS EQU (0x0 << 8) ;- (MC) 1 cycle for Read, 2 for Write operations +AT91C_MC_FWS_1FWS EQU (0x1 << 8) ;- (MC) 2 cycles for Read, 3 for Write operations +AT91C_MC_FWS_2FWS EQU (0x2 << 8) ;- (MC) 3 cycles for Read, 4 for Write operations +AT91C_MC_FWS_3FWS EQU (0x3 << 8) ;- (MC) 4 cycles for Read, 4 for Write operations +AT91C_MC_FMCN EQU (0xFF << 16) ;- (MC) Flash Microsecond Cycle Number +// - -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +AT91C_MC_FCMD EQU (0xF << 0) ;- (MC) Flash Command +AT91C_MC_FCMD_START_PROG EQU (0x1) ;- (MC) Starts the programming of th epage specified by PAGEN. +AT91C_MC_FCMD_LOCK EQU (0x2) ;- (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +AT91C_MC_FCMD_PROG_AND_LOCK EQU (0x3) ;- (MC) The lock sequence automatically happens after the programming sequence is completed. +AT91C_MC_FCMD_UNLOCK EQU (0x4) ;- (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +AT91C_MC_FCMD_ERASE_ALL EQU (0x8) ;- (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +AT91C_MC_FCMD_SET_GP_NVM EQU (0xB) ;- (MC) Set General Purpose NVM bits. +AT91C_MC_FCMD_CLR_GP_NVM EQU (0xD) ;- (MC) Clear General Purpose NVM bits. +AT91C_MC_FCMD_SET_SECURITY EQU (0xF) ;- (MC) Set Security Bit. +AT91C_MC_PAGEN EQU (0x3FF << 8) ;- (MC) Page Number +AT91C_MC_KEY EQU (0xFF << 24) ;- (MC) Writing Protect Key +// - -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +AT91C_MC_SECURITY EQU (0x1 << 4) ;- (MC) Security Bit Status +AT91C_MC_GPNVM0 EQU (0x1 << 8) ;- (MC) Sector 0 Lock Status +AT91C_MC_GPNVM1 EQU (0x1 << 9) ;- (MC) Sector 1 Lock Status +AT91C_MC_GPNVM2 EQU (0x1 << 10) ;- (MC) Sector 2 Lock Status +AT91C_MC_GPNVM3 EQU (0x1 << 11) ;- (MC) Sector 3 Lock Status +AT91C_MC_GPNVM4 EQU (0x1 << 12) ;- (MC) Sector 4 Lock Status +AT91C_MC_GPNVM5 EQU (0x1 << 13) ;- (MC) Sector 5 Lock Status +AT91C_MC_GPNVM6 EQU (0x1 << 14) ;- (MC) Sector 6 Lock Status +AT91C_MC_GPNVM7 EQU (0x1 << 15) ;- (MC) Sector 7 Lock Status +AT91C_MC_LOCKS0 EQU (0x1 << 16) ;- (MC) Sector 0 Lock Status +AT91C_MC_LOCKS1 EQU (0x1 << 17) ;- (MC) Sector 1 Lock Status +AT91C_MC_LOCKS2 EQU (0x1 << 18) ;- (MC) Sector 2 Lock Status +AT91C_MC_LOCKS3 EQU (0x1 << 19) ;- (MC) Sector 3 Lock Status +AT91C_MC_LOCKS4 EQU (0x1 << 20) ;- (MC) Sector 4 Lock Status +AT91C_MC_LOCKS5 EQU (0x1 << 21) ;- (MC) Sector 5 Lock Status +AT91C_MC_LOCKS6 EQU (0x1 << 22) ;- (MC) Sector 6 Lock Status +AT91C_MC_LOCKS7 EQU (0x1 << 23) ;- (MC) Sector 7 Lock Status +AT91C_MC_LOCKS8 EQU (0x1 << 24) ;- (MC) Sector 8 Lock Status +AT91C_MC_LOCKS9 EQU (0x1 << 25) ;- (MC) Sector 9 Lock Status +AT91C_MC_LOCKS10 EQU (0x1 << 26) ;- (MC) Sector 10 Lock Status +AT91C_MC_LOCKS11 EQU (0x1 << 27) ;- (MC) Sector 11 Lock Status +AT91C_MC_LOCKS12 EQU (0x1 << 28) ;- (MC) Sector 12 Lock Status +AT91C_MC_LOCKS13 EQU (0x1 << 29) ;- (MC) Sector 13 Lock Status +AT91C_MC_LOCKS14 EQU (0x1 << 30) ;- (MC) Sector 14 Lock Status +AT91C_MC_LOCKS15 EQU (0x1 << 31) ;- (MC) Sector 15 Lock Status + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Serial Parallel Interface +// - ***************************************************************************** +// - -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +AT91C_SPI_SPIEN EQU (0x1 << 0) ;- (SPI) SPI Enable +AT91C_SPI_SPIDIS EQU (0x1 << 1) ;- (SPI) SPI Disable +AT91C_SPI_SWRST EQU (0x1 << 7) ;- (SPI) SPI Software reset +AT91C_SPI_LASTXFER EQU (0x1 << 24) ;- (SPI) SPI Last Transfer +// - -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +AT91C_SPI_MSTR EQU (0x1 << 0) ;- (SPI) Master/Slave Mode +AT91C_SPI_PS EQU (0x1 << 1) ;- (SPI) Peripheral Select +AT91C_SPI_PS_FIXED EQU (0x0 << 1) ;- (SPI) Fixed Peripheral Select +AT91C_SPI_PS_VARIABLE EQU (0x1 << 1) ;- (SPI) Variable Peripheral Select +AT91C_SPI_PCSDEC EQU (0x1 << 2) ;- (SPI) Chip Select Decode +AT91C_SPI_FDIV EQU (0x1 << 3) ;- (SPI) Clock Selection +AT91C_SPI_MODFDIS EQU (0x1 << 4) ;- (SPI) Mode Fault Detection +AT91C_SPI_LLB EQU (0x1 << 7) ;- (SPI) Clock Selection +AT91C_SPI_PCS EQU (0xF << 16) ;- (SPI) Peripheral Chip Select +AT91C_SPI_DLYBCS EQU (0xFF << 24) ;- (SPI) Delay Between Chip Selects +// - -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +AT91C_SPI_RD EQU (0xFFFF << 0) ;- (SPI) Receive Data +AT91C_SPI_RPCS EQU (0xF << 16) ;- (SPI) Peripheral Chip Select Status +// - -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +AT91C_SPI_TD EQU (0xFFFF << 0) ;- (SPI) Transmit Data +AT91C_SPI_TPCS EQU (0xF << 16) ;- (SPI) Peripheral Chip Select Status +// - -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +AT91C_SPI_RDRF EQU (0x1 << 0) ;- (SPI) Receive Data Register Full +AT91C_SPI_TDRE EQU (0x1 << 1) ;- (SPI) Transmit Data Register Empty +AT91C_SPI_MODF EQU (0x1 << 2) ;- (SPI) Mode Fault Error +AT91C_SPI_OVRES EQU (0x1 << 3) ;- (SPI) Overrun Error Status +AT91C_SPI_ENDRX EQU (0x1 << 4) ;- (SPI) End of Receiver Transfer +AT91C_SPI_ENDTX EQU (0x1 << 5) ;- (SPI) End of Receiver Transfer +AT91C_SPI_RXBUFF EQU (0x1 << 6) ;- (SPI) RXBUFF Interrupt +AT91C_SPI_TXBUFE EQU (0x1 << 7) ;- (SPI) TXBUFE Interrupt +AT91C_SPI_NSSR EQU (0x1 << 8) ;- (SPI) NSSR Interrupt +AT91C_SPI_TXEMPTY EQU (0x1 << 9) ;- (SPI) TXEMPTY Interrupt +AT91C_SPI_SPIENS EQU (0x1 << 16) ;- (SPI) Enable Status +// - -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// - -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// - -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// - -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +AT91C_SPI_CPOL EQU (0x1 << 0) ;- (SPI) Clock Polarity +AT91C_SPI_NCPHA EQU (0x1 << 1) ;- (SPI) Clock Phase +AT91C_SPI_CSAAT EQU (0x1 << 3) ;- (SPI) Chip Select Active After Transfer +AT91C_SPI_BITS EQU (0xF << 4) ;- (SPI) Bits Per Transfer +AT91C_SPI_BITS_8 EQU (0x0 << 4) ;- (SPI) 8 Bits Per transfer +AT91C_SPI_BITS_9 EQU (0x1 << 4) ;- (SPI) 9 Bits Per transfer +AT91C_SPI_BITS_10 EQU (0x2 << 4) ;- (SPI) 10 Bits Per transfer +AT91C_SPI_BITS_11 EQU (0x3 << 4) ;- (SPI) 11 Bits Per transfer +AT91C_SPI_BITS_12 EQU (0x4 << 4) ;- (SPI) 12 Bits Per transfer +AT91C_SPI_BITS_13 EQU (0x5 << 4) ;- (SPI) 13 Bits Per transfer +AT91C_SPI_BITS_14 EQU (0x6 << 4) ;- (SPI) 14 Bits Per transfer +AT91C_SPI_BITS_15 EQU (0x7 << 4) ;- (SPI) 15 Bits Per transfer +AT91C_SPI_BITS_16 EQU (0x8 << 4) ;- (SPI) 16 Bits Per transfer +AT91C_SPI_SCBR EQU (0xFF << 8) ;- (SPI) Serial Clock Baud Rate +AT91C_SPI_DLYBS EQU (0xFF << 16) ;- (SPI) Delay Before SPCK +AT91C_SPI_DLYBCT EQU (0xFF << 24) ;- (SPI) Delay Between Consecutive Transfers + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Usart +// - ***************************************************************************** +// - -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +AT91C_US_STTBRK EQU (0x1 << 9) ;- (USART) Start Break +AT91C_US_STPBRK EQU (0x1 << 10) ;- (USART) Stop Break +AT91C_US_STTTO EQU (0x1 << 11) ;- (USART) Start Time-out +AT91C_US_SENDA EQU (0x1 << 12) ;- (USART) Send Address +AT91C_US_RSTIT EQU (0x1 << 13) ;- (USART) Reset Iterations +AT91C_US_RSTNACK EQU (0x1 << 14) ;- (USART) Reset Non Acknowledge +AT91C_US_RETTO EQU (0x1 << 15) ;- (USART) Rearm Time-out +AT91C_US_DTREN EQU (0x1 << 16) ;- (USART) Data Terminal ready Enable +AT91C_US_DTRDIS EQU (0x1 << 17) ;- (USART) Data Terminal ready Disable +AT91C_US_RTSEN EQU (0x1 << 18) ;- (USART) Request to Send enable +AT91C_US_RTSDIS EQU (0x1 << 19) ;- (USART) Request to Send Disable +// - -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +AT91C_US_USMODE EQU (0xF << 0) ;- (USART) Usart mode +AT91C_US_USMODE_NORMAL EQU (0x0) ;- (USART) Normal +AT91C_US_USMODE_RS485 EQU (0x1) ;- (USART) RS485 +AT91C_US_USMODE_HWHSH EQU (0x2) ;- (USART) Hardware Handshaking +AT91C_US_USMODE_MODEM EQU (0x3) ;- (USART) Modem +AT91C_US_USMODE_ISO7816_0 EQU (0x4) ;- (USART) ISO7816 protocol: T = 0 +AT91C_US_USMODE_ISO7816_1 EQU (0x6) ;- (USART) ISO7816 protocol: T = 1 +AT91C_US_USMODE_IRDA EQU (0x8) ;- (USART) IrDA +AT91C_US_USMODE_SWHSH EQU (0xC) ;- (USART) Software Handshaking +AT91C_US_CLKS EQU (0x3 << 4) ;- (USART) Clock Selection (Baud Rate generator Input Clock +AT91C_US_CLKS_CLOCK EQU (0x0 << 4) ;- (USART) Clock +AT91C_US_CLKS_FDIV1 EQU (0x1 << 4) ;- (USART) fdiv1 +AT91C_US_CLKS_SLOW EQU (0x2 << 4) ;- (USART) slow_clock (ARM) +AT91C_US_CLKS_EXT EQU (0x3 << 4) ;- (USART) External (SCK) +AT91C_US_CHRL EQU (0x3 << 6) ;- (USART) Clock Selection (Baud Rate generator Input Clock +AT91C_US_CHRL_5_BITS EQU (0x0 << 6) ;- (USART) Character Length: 5 bits +AT91C_US_CHRL_6_BITS EQU (0x1 << 6) ;- (USART) Character Length: 6 bits +AT91C_US_CHRL_7_BITS EQU (0x2 << 6) ;- (USART) Character Length: 7 bits +AT91C_US_CHRL_8_BITS EQU (0x3 << 6) ;- (USART) Character Length: 8 bits +AT91C_US_SYNC EQU (0x1 << 8) ;- (USART) Synchronous Mode Select +AT91C_US_NBSTOP EQU (0x3 << 12) ;- (USART) Number of Stop bits +AT91C_US_NBSTOP_1_BIT EQU (0x0 << 12) ;- (USART) 1 stop bit +AT91C_US_NBSTOP_15_BIT EQU (0x1 << 12) ;- (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +AT91C_US_NBSTOP_2_BIT EQU (0x2 << 12) ;- (USART) 2 stop bits +AT91C_US_MSBF EQU (0x1 << 16) ;- (USART) Bit Order +AT91C_US_MODE9 EQU (0x1 << 17) ;- (USART) 9-bit Character length +AT91C_US_CKLO EQU (0x1 << 18) ;- (USART) Clock Output Select +AT91C_US_OVER EQU (0x1 << 19) ;- (USART) Over Sampling Mode +AT91C_US_INACK EQU (0x1 << 20) ;- (USART) Inhibit Non Acknowledge +AT91C_US_DSNACK EQU (0x1 << 21) ;- (USART) Disable Successive NACK +AT91C_US_MAX_ITER EQU (0x1 << 24) ;- (USART) Number of Repetitions +AT91C_US_FILTER EQU (0x1 << 28) ;- (USART) Receive Line Filter +// - -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +AT91C_US_RXBRK EQU (0x1 << 2) ;- (USART) Break Received/End of Break +AT91C_US_TIMEOUT EQU (0x1 << 8) ;- (USART) Receiver Time-out +AT91C_US_ITERATION EQU (0x1 << 10) ;- (USART) Max number of Repetitions Reached +AT91C_US_NACK EQU (0x1 << 13) ;- (USART) Non Acknowledge +AT91C_US_RIIC EQU (0x1 << 16) ;- (USART) Ring INdicator Input Change Flag +AT91C_US_DSRIC EQU (0x1 << 17) ;- (USART) Data Set Ready Input Change Flag +AT91C_US_DCDIC EQU (0x1 << 18) ;- (USART) Data Carrier Flag +AT91C_US_CTSIC EQU (0x1 << 19) ;- (USART) Clear To Send Input Change Flag +// - -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// - -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// - -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +AT91C_US_RI EQU (0x1 << 20) ;- (USART) Image of RI Input +AT91C_US_DSR EQU (0x1 << 21) ;- (USART) Image of DSR Input +AT91C_US_DCD EQU (0x1 << 22) ;- (USART) Image of DCD Input +AT91C_US_CTS EQU (0x1 << 23) ;- (USART) Image of CTS Input + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// - ***************************************************************************** +// - -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +AT91C_SSC_RXEN EQU (0x1 << 0) ;- (SSC) Receive Enable +AT91C_SSC_RXDIS EQU (0x1 << 1) ;- (SSC) Receive Disable +AT91C_SSC_TXEN EQU (0x1 << 8) ;- (SSC) Transmit Enable +AT91C_SSC_TXDIS EQU (0x1 << 9) ;- (SSC) Transmit Disable +AT91C_SSC_SWRST EQU (0x1 << 15) ;- (SSC) Software Reset +// - -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +AT91C_SSC_CKS EQU (0x3 << 0) ;- (SSC) Receive/Transmit Clock Selection +AT91C_SSC_CKS_DIV EQU (0x0) ;- (SSC) Divided Clock +AT91C_SSC_CKS_TK EQU (0x1) ;- (SSC) TK Clock signal +AT91C_SSC_CKS_RK EQU (0x2) ;- (SSC) RK pin +AT91C_SSC_CKO EQU (0x7 << 2) ;- (SSC) Receive/Transmit Clock Output Mode Selection +AT91C_SSC_CKO_NONE EQU (0x0 << 2) ;- (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +AT91C_SSC_CKO_CONTINOUS EQU (0x1 << 2) ;- (SSC) Continuous Receive/Transmit Clock RK pin: Output +AT91C_SSC_CKO_DATA_TX EQU (0x2 << 2) ;- (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +AT91C_SSC_CKI EQU (0x1 << 5) ;- (SSC) Receive/Transmit Clock Inversion +AT91C_SSC_START EQU (0xF << 8) ;- (SSC) Receive/Transmit Start Selection +AT91C_SSC_START_CONTINOUS EQU (0x0 << 8) ;- (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +AT91C_SSC_START_TX EQU (0x1 << 8) ;- (SSC) Transmit/Receive start +AT91C_SSC_START_LOW_RF EQU (0x2 << 8) ;- (SSC) Detection of a low level on RF input +AT91C_SSC_START_HIGH_RF EQU (0x3 << 8) ;- (SSC) Detection of a high level on RF input +AT91C_SSC_START_FALL_RF EQU (0x4 << 8) ;- (SSC) Detection of a falling edge on RF input +AT91C_SSC_START_RISE_RF EQU (0x5 << 8) ;- (SSC) Detection of a rising edge on RF input +AT91C_SSC_START_LEVEL_RF EQU (0x6 << 8) ;- (SSC) Detection of any level change on RF input +AT91C_SSC_START_EDGE_RF EQU (0x7 << 8) ;- (SSC) Detection of any edge on RF input +AT91C_SSC_START_0 EQU (0x8 << 8) ;- (SSC) Compare 0 +AT91C_SSC_STTDLY EQU (0xFF << 16) ;- (SSC) Receive/Transmit Start Delay +AT91C_SSC_PERIOD EQU (0xFF << 24) ;- (SSC) Receive/Transmit Period Divider Selection +// - -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +AT91C_SSC_DATLEN EQU (0x1F << 0) ;- (SSC) Data Length +AT91C_SSC_LOOP EQU (0x1 << 5) ;- (SSC) Loop Mode +AT91C_SSC_MSBF EQU (0x1 << 7) ;- (SSC) Most Significant Bit First +AT91C_SSC_DATNB EQU (0xF << 8) ;- (SSC) Data Number per Frame +AT91C_SSC_FSLEN EQU (0xF << 16) ;- (SSC) Receive/Transmit Frame Sync length +AT91C_SSC_FSOS EQU (0x7 << 20) ;- (SSC) Receive/Transmit Frame Sync Output Selection +AT91C_SSC_FSOS_NONE EQU (0x0 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +AT91C_SSC_FSOS_NEGATIVE EQU (0x1 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +AT91C_SSC_FSOS_POSITIVE EQU (0x2 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +AT91C_SSC_FSOS_LOW EQU (0x3 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +AT91C_SSC_FSOS_HIGH EQU (0x4 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +AT91C_SSC_FSOS_TOGGLE EQU (0x5 << 20) ;- (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +AT91C_SSC_FSEDGE EQU (0x1 << 24) ;- (SSC) Frame Sync Edge Detection +// - -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// - -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +AT91C_SSC_DATDEF EQU (0x1 << 5) ;- (SSC) Data Default Value +AT91C_SSC_FSDEN EQU (0x1 << 23) ;- (SSC) Frame Sync Data Enable +// - -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +AT91C_SSC_TXRDY EQU (0x1 << 0) ;- (SSC) Transmit Ready +AT91C_SSC_TXEMPTY EQU (0x1 << 1) ;- (SSC) Transmit Empty +AT91C_SSC_ENDTX EQU (0x1 << 2) ;- (SSC) End Of Transmission +AT91C_SSC_TXBUFE EQU (0x1 << 3) ;- (SSC) Transmit Buffer Empty +AT91C_SSC_RXRDY EQU (0x1 << 4) ;- (SSC) Receive Ready +AT91C_SSC_OVRUN EQU (0x1 << 5) ;- (SSC) Receive Overrun +AT91C_SSC_ENDRX EQU (0x1 << 6) ;- (SSC) End of Reception +AT91C_SSC_RXBUFF EQU (0x1 << 7) ;- (SSC) Receive Buffer Full +AT91C_SSC_TXSYN EQU (0x1 << 10) ;- (SSC) Transmit Sync +AT91C_SSC_RXSYN EQU (0x1 << 11) ;- (SSC) Receive Sync +AT91C_SSC_TXENA EQU (0x1 << 16) ;- (SSC) Transmit Enable +AT91C_SSC_RXENA EQU (0x1 << 17) ;- (SSC) Receive Enable +// - -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// - -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// - -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Two-wire Interface +// - ***************************************************************************** +// - -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +AT91C_TWI_START EQU (0x1 << 0) ;- (TWI) Send a START Condition +AT91C_TWI_STOP EQU (0x1 << 1) ;- (TWI) Send a STOP Condition +AT91C_TWI_MSEN EQU (0x1 << 2) ;- (TWI) TWI Master Transfer Enabled +AT91C_TWI_MSDIS EQU (0x1 << 3) ;- (TWI) TWI Master Transfer Disabled +AT91C_TWI_SWRST EQU (0x1 << 7) ;- (TWI) Software Reset +// - -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +AT91C_TWI_IADRSZ EQU (0x3 << 8) ;- (TWI) Internal Device Address Size +AT91C_TWI_IADRSZ_NO EQU (0x0 << 8) ;- (TWI) No internal device address +AT91C_TWI_IADRSZ_1_BYTE EQU (0x1 << 8) ;- (TWI) One-byte internal device address +AT91C_TWI_IADRSZ_2_BYTE EQU (0x2 << 8) ;- (TWI) Two-byte internal device address +AT91C_TWI_IADRSZ_3_BYTE EQU (0x3 << 8) ;- (TWI) Three-byte internal device address +AT91C_TWI_MREAD EQU (0x1 << 12) ;- (TWI) Master Read Direction +AT91C_TWI_DADR EQU (0x7F << 16) ;- (TWI) Device Address +// - -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +AT91C_TWI_CLDIV EQU (0xFF << 0) ;- (TWI) Clock Low Divider +AT91C_TWI_CHDIV EQU (0xFF << 8) ;- (TWI) Clock High Divider +AT91C_TWI_CKDIV EQU (0x7 << 16) ;- (TWI) Clock Divider +// - -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +AT91C_TWI_TXCOMP EQU (0x1 << 0) ;- (TWI) Transmission Completed +AT91C_TWI_RXRDY EQU (0x1 << 1) ;- (TWI) Receive holding register ReaDY +AT91C_TWI_TXRDY EQU (0x1 << 2) ;- (TWI) Transmit holding register ReaDY +AT91C_TWI_OVRE EQU (0x1 << 6) ;- (TWI) Overrun Error +AT91C_TWI_UNRE EQU (0x1 << 7) ;- (TWI) Underrun Error +AT91C_TWI_NACK EQU (0x1 << 8) ;- (TWI) Not Acknowledged +// - -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// - -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// - -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR PWMC Channel Interface +// - ***************************************************************************** +// - -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +AT91C_PWMC_CPRE EQU (0xF << 0) ;- (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +AT91C_PWMC_CPRE_MCK EQU (0x0) ;- (PWMC_CH) +AT91C_PWMC_CPRE_MCKA EQU (0xB) ;- (PWMC_CH) +AT91C_PWMC_CPRE_MCKB EQU (0xC) ;- (PWMC_CH) +AT91C_PWMC_CALG EQU (0x1 << 8) ;- (PWMC_CH) Channel Alignment +AT91C_PWMC_CPOL EQU (0x1 << 9) ;- (PWMC_CH) Channel Polarity +AT91C_PWMC_CPD EQU (0x1 << 10) ;- (PWMC_CH) Channel Update Period +// - -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +AT91C_PWMC_CDTY EQU (0x0 << 0) ;- (PWMC_CH) Channel Duty Cycle +// - -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +AT91C_PWMC_CPRD EQU (0x0 << 0) ;- (PWMC_CH) Channel Period +// - -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +AT91C_PWMC_CCNT EQU (0x0 << 0) ;- (PWMC_CH) Channel Counter +// - -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +AT91C_PWMC_CUPD EQU (0x0 << 0) ;- (PWMC_CH) Channel Update + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// - ***************************************************************************** +// - -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +AT91C_PWMC_DIVA EQU (0xFF << 0) ;- (PWMC) CLKA divide factor. +AT91C_PWMC_PREA EQU (0xF << 8) ;- (PWMC) Divider Input Clock Prescaler A +AT91C_PWMC_PREA_MCK EQU (0x0 << 8) ;- (PWMC) +AT91C_PWMC_DIVB EQU (0xFF << 16) ;- (PWMC) CLKB divide factor. +AT91C_PWMC_PREB EQU (0xF << 24) ;- (PWMC) Divider Input Clock Prescaler B +AT91C_PWMC_PREB_MCK EQU (0x0 << 24) ;- (PWMC) +// - -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +AT91C_PWMC_CHID0 EQU (0x1 << 0) ;- (PWMC) Channel ID 0 +AT91C_PWMC_CHID1 EQU (0x1 << 1) ;- (PWMC) Channel ID 1 +AT91C_PWMC_CHID2 EQU (0x1 << 2) ;- (PWMC) Channel ID 2 +AT91C_PWMC_CHID3 EQU (0x1 << 3) ;- (PWMC) Channel ID 3 +// - -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// - -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// - -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// - -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// - -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// - -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR USB Device Interface +// - ***************************************************************************** +// - -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +AT91C_UDP_FRM_NUM EQU (0x7FF << 0) ;- (UDP) Frame Number as Defined in the Packet Field Formats +AT91C_UDP_FRM_ERR EQU (0x1 << 16) ;- (UDP) Frame Error +AT91C_UDP_FRM_OK EQU (0x1 << 17) ;- (UDP) Frame OK +// - -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +AT91C_UDP_FADDEN EQU (0x1 << 0) ;- (UDP) Function Address Enable +AT91C_UDP_CONFG EQU (0x1 << 1) ;- (UDP) Configured +AT91C_UDP_ESR EQU (0x1 << 2) ;- (UDP) Enable Send Resume +AT91C_UDP_RSMINPR EQU (0x1 << 3) ;- (UDP) A Resume Has Been Sent to the Host +AT91C_UDP_RMWUPE EQU (0x1 << 4) ;- (UDP) Remote Wake Up Enable +// - -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +AT91C_UDP_FADD EQU (0xFF << 0) ;- (UDP) Function Address Value +AT91C_UDP_FEN EQU (0x1 << 8) ;- (UDP) Function Enable +// - -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +AT91C_UDP_EPINT0 EQU (0x1 << 0) ;- (UDP) Endpoint 0 Interrupt +AT91C_UDP_EPINT1 EQU (0x1 << 1) ;- (UDP) Endpoint 0 Interrupt +AT91C_UDP_EPINT2 EQU (0x1 << 2) ;- (UDP) Endpoint 2 Interrupt +AT91C_UDP_EPINT3 EQU (0x1 << 3) ;- (UDP) Endpoint 3 Interrupt +AT91C_UDP_EPINT4 EQU (0x1 << 4) ;- (UDP) Endpoint 4 Interrupt +AT91C_UDP_EPINT5 EQU (0x1 << 5) ;- (UDP) Endpoint 5 Interrupt +AT91C_UDP_RXSUSP EQU (0x1 << 8) ;- (UDP) USB Suspend Interrupt +AT91C_UDP_RXRSM EQU (0x1 << 9) ;- (UDP) USB Resume Interrupt +AT91C_UDP_EXTRSM EQU (0x1 << 10) ;- (UDP) USB External Resume Interrupt +AT91C_UDP_SOFINT EQU (0x1 << 11) ;- (UDP) USB Start Of frame Interrupt +AT91C_UDP_WAKEUP EQU (0x1 << 13) ;- (UDP) USB Resume Interrupt +// - -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// - -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// - -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +AT91C_UDP_ENDBUSRES EQU (0x1 << 12) ;- (UDP) USB End Of Bus Reset Interrupt +// - -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// - -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +AT91C_UDP_EP0 EQU (0x1 << 0) ;- (UDP) Reset Endpoint 0 +AT91C_UDP_EP1 EQU (0x1 << 1) ;- (UDP) Reset Endpoint 1 +AT91C_UDP_EP2 EQU (0x1 << 2) ;- (UDP) Reset Endpoint 2 +AT91C_UDP_EP3 EQU (0x1 << 3) ;- (UDP) Reset Endpoint 3 +AT91C_UDP_EP4 EQU (0x1 << 4) ;- (UDP) Reset Endpoint 4 +AT91C_UDP_EP5 EQU (0x1 << 5) ;- (UDP) Reset Endpoint 5 +// - -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +AT91C_UDP_TXCOMP EQU (0x1 << 0) ;- (UDP) Generates an IN packet with data previously written in the DPR +AT91C_UDP_RX_DATA_BK0 EQU (0x1 << 1) ;- (UDP) Receive Data Bank 0 +AT91C_UDP_RXSETUP EQU (0x1 << 2) ;- (UDP) Sends STALL to the Host (Control endpoints) +AT91C_UDP_ISOERROR EQU (0x1 << 3) ;- (UDP) Isochronous error (Isochronous endpoints) +AT91C_UDP_TXPKTRDY EQU (0x1 << 4) ;- (UDP) Transmit Packet Ready +AT91C_UDP_FORCESTALL EQU (0x1 << 5) ;- (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +AT91C_UDP_RX_DATA_BK1 EQU (0x1 << 6) ;- (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +AT91C_UDP_DIR EQU (0x1 << 7) ;- (UDP) Transfer Direction +AT91C_UDP_EPTYPE EQU (0x7 << 8) ;- (UDP) Endpoint type +AT91C_UDP_EPTYPE_CTRL EQU (0x0 << 8) ;- (UDP) Control +AT91C_UDP_EPTYPE_ISO_OUT EQU (0x1 << 8) ;- (UDP) Isochronous OUT +AT91C_UDP_EPTYPE_BULK_OUT EQU (0x2 << 8) ;- (UDP) Bulk OUT +AT91C_UDP_EPTYPE_INT_OUT EQU (0x3 << 8) ;- (UDP) Interrupt OUT +AT91C_UDP_EPTYPE_ISO_IN EQU (0x5 << 8) ;- (UDP) Isochronous IN +AT91C_UDP_EPTYPE_BULK_IN EQU (0x6 << 8) ;- (UDP) Bulk IN +AT91C_UDP_EPTYPE_INT_IN EQU (0x7 << 8) ;- (UDP) Interrupt IN +AT91C_UDP_DTGLE EQU (0x1 << 11) ;- (UDP) Data Toggle +AT91C_UDP_EPEDS EQU (0x1 << 15) ;- (UDP) Endpoint Enable Disable +AT91C_UDP_RXBYTECNT EQU (0x7FF << 16) ;- (UDP) Number Of Bytes Available in the FIFO +// - -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +AT91C_UDP_TXVDIS EQU (0x1 << 8) ;- (UDP) +AT91C_UDP_PUON EQU (0x1 << 9) ;- (UDP) Pull-up ON + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// - ***************************************************************************** +// - -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +AT91C_TC_CLKEN EQU (0x1 << 0) ;- (TC) Counter Clock Enable Command +AT91C_TC_CLKDIS EQU (0x1 << 1) ;- (TC) Counter Clock Disable Command +AT91C_TC_SWTRG EQU (0x1 << 2) ;- (TC) Software Trigger Command +// - -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +AT91C_TC_CLKS EQU (0x7 << 0) ;- (TC) Clock Selection +AT91C_TC_CLKS_TIMER_DIV1_CLOCK EQU (0x0) ;- (TC) Clock selected: TIMER_DIV1_CLOCK +AT91C_TC_CLKS_TIMER_DIV2_CLOCK EQU (0x1) ;- (TC) Clock selected: TIMER_DIV2_CLOCK +AT91C_TC_CLKS_TIMER_DIV3_CLOCK EQU (0x2) ;- (TC) Clock selected: TIMER_DIV3_CLOCK +AT91C_TC_CLKS_TIMER_DIV4_CLOCK EQU (0x3) ;- (TC) Clock selected: TIMER_DIV4_CLOCK +AT91C_TC_CLKS_TIMER_DIV5_CLOCK EQU (0x4) ;- (TC) Clock selected: TIMER_DIV5_CLOCK +AT91C_TC_CLKS_XC0 EQU (0x5) ;- (TC) Clock selected: XC0 +AT91C_TC_CLKS_XC1 EQU (0x6) ;- (TC) Clock selected: XC1 +AT91C_TC_CLKS_XC2 EQU (0x7) ;- (TC) Clock selected: XC2 +AT91C_TC_CLKI EQU (0x1 << 3) ;- (TC) Clock Invert +AT91C_TC_BURST EQU (0x3 << 4) ;- (TC) Burst Signal Selection +AT91C_TC_BURST_NONE EQU (0x0 << 4) ;- (TC) The clock is not gated by an external signal +AT91C_TC_BURST_XC0 EQU (0x1 << 4) ;- (TC) XC0 is ANDed with the selected clock +AT91C_TC_BURST_XC1 EQU (0x2 << 4) ;- (TC) XC1 is ANDed with the selected clock +AT91C_TC_BURST_XC2 EQU (0x3 << 4) ;- (TC) XC2 is ANDed with the selected clock +AT91C_TC_CPCSTOP EQU (0x1 << 6) ;- (TC) Counter Clock Stopped with RC Compare +AT91C_TC_LDBSTOP EQU (0x1 << 6) ;- (TC) Counter Clock Stopped with RB Loading +AT91C_TC_CPCDIS EQU (0x1 << 7) ;- (TC) Counter Clock Disable with RC Compare +AT91C_TC_LDBDIS EQU (0x1 << 7) ;- (TC) Counter Clock Disabled with RB Loading +AT91C_TC_ETRGEDG EQU (0x3 << 8) ;- (TC) External Trigger Edge Selection +AT91C_TC_ETRGEDG_NONE EQU (0x0 << 8) ;- (TC) Edge: None +AT91C_TC_ETRGEDG_RISING EQU (0x1 << 8) ;- (TC) Edge: rising edge +AT91C_TC_ETRGEDG_FALLING EQU (0x2 << 8) ;- (TC) Edge: falling edge +AT91C_TC_ETRGEDG_BOTH EQU (0x3 << 8) ;- (TC) Edge: each edge +AT91C_TC_EEVTEDG EQU (0x3 << 8) ;- (TC) External Event Edge Selection +AT91C_TC_EEVTEDG_NONE EQU (0x0 << 8) ;- (TC) Edge: None +AT91C_TC_EEVTEDG_RISING EQU (0x1 << 8) ;- (TC) Edge: rising edge +AT91C_TC_EEVTEDG_FALLING EQU (0x2 << 8) ;- (TC) Edge: falling edge +AT91C_TC_EEVTEDG_BOTH EQU (0x3 << 8) ;- (TC) Edge: each edge +AT91C_TC_EEVT EQU (0x3 << 10) ;- (TC) External Event Selection +AT91C_TC_EEVT_TIOB EQU (0x0 << 10) ;- (TC) Signal selected as external event: TIOB TIOB direction: input +AT91C_TC_EEVT_XC0 EQU (0x1 << 10) ;- (TC) Signal selected as external event: XC0 TIOB direction: output +AT91C_TC_EEVT_XC1 EQU (0x2 << 10) ;- (TC) Signal selected as external event: XC1 TIOB direction: output +AT91C_TC_EEVT_XC2 EQU (0x3 << 10) ;- (TC) Signal selected as external event: XC2 TIOB direction: output +AT91C_TC_ABETRG EQU (0x1 << 10) ;- (TC) TIOA or TIOB External Trigger Selection +AT91C_TC_ENETRG EQU (0x1 << 12) ;- (TC) External Event Trigger enable +AT91C_TC_WAVESEL EQU (0x3 << 13) ;- (TC) Waveform Selection +AT91C_TC_WAVESEL_UP EQU (0x0 << 13) ;- (TC) UP mode without atomatic trigger on RC Compare +AT91C_TC_WAVESEL_UPDOWN EQU (0x1 << 13) ;- (TC) UPDOWN mode without automatic trigger on RC Compare +AT91C_TC_WAVESEL_UP_AUTO EQU (0x2 << 13) ;- (TC) UP mode with automatic trigger on RC Compare +AT91C_TC_WAVESEL_UPDOWN_AUTO EQU (0x3 << 13) ;- (TC) UPDOWN mode with automatic trigger on RC Compare +AT91C_TC_CPCTRG EQU (0x1 << 14) ;- (TC) RC Compare Trigger Enable +AT91C_TC_WAVE EQU (0x1 << 15) ;- (TC) +AT91C_TC_ACPA EQU (0x3 << 16) ;- (TC) RA Compare Effect on TIOA +AT91C_TC_ACPA_NONE EQU (0x0 << 16) ;- (TC) Effect: none +AT91C_TC_ACPA_SET EQU (0x1 << 16) ;- (TC) Effect: set +AT91C_TC_ACPA_CLEAR EQU (0x2 << 16) ;- (TC) Effect: clear +AT91C_TC_ACPA_TOGGLE EQU (0x3 << 16) ;- (TC) Effect: toggle +AT91C_TC_LDRA EQU (0x3 << 16) ;- (TC) RA Loading Selection +AT91C_TC_LDRA_NONE EQU (0x0 << 16) ;- (TC) Edge: None +AT91C_TC_LDRA_RISING EQU (0x1 << 16) ;- (TC) Edge: rising edge of TIOA +AT91C_TC_LDRA_FALLING EQU (0x2 << 16) ;- (TC) Edge: falling edge of TIOA +AT91C_TC_LDRA_BOTH EQU (0x3 << 16) ;- (TC) Edge: each edge of TIOA +AT91C_TC_ACPC EQU (0x3 << 18) ;- (TC) RC Compare Effect on TIOA +AT91C_TC_ACPC_NONE EQU (0x0 << 18) ;- (TC) Effect: none +AT91C_TC_ACPC_SET EQU (0x1 << 18) ;- (TC) Effect: set +AT91C_TC_ACPC_CLEAR EQU (0x2 << 18) ;- (TC) Effect: clear +AT91C_TC_ACPC_TOGGLE EQU (0x3 << 18) ;- (TC) Effect: toggle +AT91C_TC_LDRB EQU (0x3 << 18) ;- (TC) RB Loading Selection +AT91C_TC_LDRB_NONE EQU (0x0 << 18) ;- (TC) Edge: None +AT91C_TC_LDRB_RISING EQU (0x1 << 18) ;- (TC) Edge: rising edge of TIOA +AT91C_TC_LDRB_FALLING EQU (0x2 << 18) ;- (TC) Edge: falling edge of TIOA +AT91C_TC_LDRB_BOTH EQU (0x3 << 18) ;- (TC) Edge: each edge of TIOA +AT91C_TC_AEEVT EQU (0x3 << 20) ;- (TC) External Event Effect on TIOA +AT91C_TC_AEEVT_NONE EQU (0x0 << 20) ;- (TC) Effect: none +AT91C_TC_AEEVT_SET EQU (0x1 << 20) ;- (TC) Effect: set +AT91C_TC_AEEVT_CLEAR EQU (0x2 << 20) ;- (TC) Effect: clear +AT91C_TC_AEEVT_TOGGLE EQU (0x3 << 20) ;- (TC) Effect: toggle +AT91C_TC_ASWTRG EQU (0x3 << 22) ;- (TC) Software Trigger Effect on TIOA +AT91C_TC_ASWTRG_NONE EQU (0x0 << 22) ;- (TC) Effect: none +AT91C_TC_ASWTRG_SET EQU (0x1 << 22) ;- (TC) Effect: set +AT91C_TC_ASWTRG_CLEAR EQU (0x2 << 22) ;- (TC) Effect: clear +AT91C_TC_ASWTRG_TOGGLE EQU (0x3 << 22) ;- (TC) Effect: toggle +AT91C_TC_BCPB EQU (0x3 << 24) ;- (TC) RB Compare Effect on TIOB +AT91C_TC_BCPB_NONE EQU (0x0 << 24) ;- (TC) Effect: none +AT91C_TC_BCPB_SET EQU (0x1 << 24) ;- (TC) Effect: set +AT91C_TC_BCPB_CLEAR EQU (0x2 << 24) ;- (TC) Effect: clear +AT91C_TC_BCPB_TOGGLE EQU (0x3 << 24) ;- (TC) Effect: toggle +AT91C_TC_BCPC EQU (0x3 << 26) ;- (TC) RC Compare Effect on TIOB +AT91C_TC_BCPC_NONE EQU (0x0 << 26) ;- (TC) Effect: none +AT91C_TC_BCPC_SET EQU (0x1 << 26) ;- (TC) Effect: set +AT91C_TC_BCPC_CLEAR EQU (0x2 << 26) ;- (TC) Effect: clear +AT91C_TC_BCPC_TOGGLE EQU (0x3 << 26) ;- (TC) Effect: toggle +AT91C_TC_BEEVT EQU (0x3 << 28) ;- (TC) External Event Effect on TIOB +AT91C_TC_BEEVT_NONE EQU (0x0 << 28) ;- (TC) Effect: none +AT91C_TC_BEEVT_SET EQU (0x1 << 28) ;- (TC) Effect: set +AT91C_TC_BEEVT_CLEAR EQU (0x2 << 28) ;- (TC) Effect: clear +AT91C_TC_BEEVT_TOGGLE EQU (0x3 << 28) ;- (TC) Effect: toggle +AT91C_TC_BSWTRG EQU (0x3 << 30) ;- (TC) Software Trigger Effect on TIOB +AT91C_TC_BSWTRG_NONE EQU (0x0 << 30) ;- (TC) Effect: none +AT91C_TC_BSWTRG_SET EQU (0x1 << 30) ;- (TC) Effect: set +AT91C_TC_BSWTRG_CLEAR EQU (0x2 << 30) ;- (TC) Effect: clear +AT91C_TC_BSWTRG_TOGGLE EQU (0x3 << 30) ;- (TC) Effect: toggle +// - -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +AT91C_TC_COVFS EQU (0x1 << 0) ;- (TC) Counter Overflow +AT91C_TC_LOVRS EQU (0x1 << 1) ;- (TC) Load Overrun +AT91C_TC_CPAS EQU (0x1 << 2) ;- (TC) RA Compare +AT91C_TC_CPBS EQU (0x1 << 3) ;- (TC) RB Compare +AT91C_TC_CPCS EQU (0x1 << 4) ;- (TC) RC Compare +AT91C_TC_LDRAS EQU (0x1 << 5) ;- (TC) RA Loading +AT91C_TC_LDRBS EQU (0x1 << 6) ;- (TC) RB Loading +AT91C_TC_ETRGS EQU (0x1 << 7) ;- (TC) External Trigger +AT91C_TC_CLKSTA EQU (0x1 << 16) ;- (TC) Clock Enabling +AT91C_TC_MTIOA EQU (0x1 << 17) ;- (TC) TIOA Mirror +AT91C_TC_MTIOB EQU (0x1 << 18) ;- (TC) TIOA Mirror +// - -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// - -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// - -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Timer Counter Interface +// - ***************************************************************************** +// - -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +AT91C_TCB_SYNC EQU (0x1 << 0) ;- (TCB) Synchro Command +// - -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +AT91C_TCB_TC0XC0S EQU (0x3 << 0) ;- (TCB) External Clock Signal 0 Selection +AT91C_TCB_TC0XC0S_TCLK0 EQU (0x0) ;- (TCB) TCLK0 connected to XC0 +AT91C_TCB_TC0XC0S_NONE EQU (0x1) ;- (TCB) None signal connected to XC0 +AT91C_TCB_TC0XC0S_TIOA1 EQU (0x2) ;- (TCB) TIOA1 connected to XC0 +AT91C_TCB_TC0XC0S_TIOA2 EQU (0x3) ;- (TCB) TIOA2 connected to XC0 +AT91C_TCB_TC1XC1S EQU (0x3 << 2) ;- (TCB) External Clock Signal 1 Selection +AT91C_TCB_TC1XC1S_TCLK1 EQU (0x0 << 2) ;- (TCB) TCLK1 connected to XC1 +AT91C_TCB_TC1XC1S_NONE EQU (0x1 << 2) ;- (TCB) None signal connected to XC1 +AT91C_TCB_TC1XC1S_TIOA0 EQU (0x2 << 2) ;- (TCB) TIOA0 connected to XC1 +AT91C_TCB_TC1XC1S_TIOA2 EQU (0x3 << 2) ;- (TCB) TIOA2 connected to XC1 +AT91C_TCB_TC2XC2S EQU (0x3 << 4) ;- (TCB) External Clock Signal 2 Selection +AT91C_TCB_TC2XC2S_TCLK2 EQU (0x0 << 4) ;- (TCB) TCLK2 connected to XC2 +AT91C_TCB_TC2XC2S_NONE EQU (0x1 << 4) ;- (TCB) None signal connected to XC2 +AT91C_TCB_TC2XC2S_TIOA0 EQU (0x2 << 4) ;- (TCB) TIOA0 connected to XC2 +AT91C_TCB_TC2XC2S_TIOA1 EQU (0x3 << 4) ;- (TCB) TIOA2 connected to XC2 + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// - ***************************************************************************** +// - -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +AT91C_CAN_MTIMEMARK EQU (0xFFFF << 0) ;- (CAN_MB) Mailbox Timemark +AT91C_CAN_PRIOR EQU (0xF << 16) ;- (CAN_MB) Mailbox Priority +AT91C_CAN_MOT EQU (0x7 << 24) ;- (CAN_MB) Mailbox Object Type +AT91C_CAN_MOT_DIS EQU (0x0 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_RX EQU (0x1 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_RXOVERWRITE EQU (0x2 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_TX EQU (0x3 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_CONSUMER EQU (0x4 << 24) ;- (CAN_MB) +AT91C_CAN_MOT_PRODUCER EQU (0x5 << 24) ;- (CAN_MB) +// - -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +AT91C_CAN_MIDvB EQU (0x3FFFF << 0) ;- (CAN_MB) Complementary bits for identifier in extended mode +AT91C_CAN_MIDvA EQU (0x7FF << 18) ;- (CAN_MB) Identifier for standard frame mode +AT91C_CAN_MIDE EQU (0x1 << 29) ;- (CAN_MB) Identifier Version +// - -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// - -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// - -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +AT91C_CAN_MTIMESTAMP EQU (0xFFFF << 0) ;- (CAN_MB) Timer Value +AT91C_CAN_MDLC EQU (0xF << 16) ;- (CAN_MB) Mailbox Data Length Code +AT91C_CAN_MRTR EQU (0x1 << 20) ;- (CAN_MB) Mailbox Remote Transmission Request +AT91C_CAN_MABT EQU (0x1 << 22) ;- (CAN_MB) Mailbox Message Abort +AT91C_CAN_MRDY EQU (0x1 << 23) ;- (CAN_MB) Mailbox Ready +AT91C_CAN_MMI EQU (0x1 << 24) ;- (CAN_MB) Mailbox Message Ignored +// - -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// - -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// - -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +AT91C_CAN_MACR EQU (0x1 << 22) ;- (CAN_MB) Abort Request for Mailbox +AT91C_CAN_MTCR EQU (0x1 << 23) ;- (CAN_MB) Mailbox Transfer Command + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Control Area Network Interface +// - ***************************************************************************** +// - -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +AT91C_CAN_CANEN EQU (0x1 << 0) ;- (CAN) CAN Controller Enable +AT91C_CAN_LPM EQU (0x1 << 1) ;- (CAN) Disable/Enable Low Power Mode +AT91C_CAN_ABM EQU (0x1 << 2) ;- (CAN) Disable/Enable Autobaud/Listen Mode +AT91C_CAN_OVL EQU (0x1 << 3) ;- (CAN) Disable/Enable Overload Frame +AT91C_CAN_TEOF EQU (0x1 << 4) ;- (CAN) Time Stamp messages at each end of Frame +AT91C_CAN_TTM EQU (0x1 << 5) ;- (CAN) Disable/Enable Time Trigger Mode +AT91C_CAN_TIMFRZ EQU (0x1 << 6) ;- (CAN) Enable Timer Freeze +AT91C_CAN_DRPT EQU (0x1 << 7) ;- (CAN) Disable Repeat +// - -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +AT91C_CAN_MB0 EQU (0x1 << 0) ;- (CAN) Mailbox 0 Flag +AT91C_CAN_MB1 EQU (0x1 << 1) ;- (CAN) Mailbox 1 Flag +AT91C_CAN_MB2 EQU (0x1 << 2) ;- (CAN) Mailbox 2 Flag +AT91C_CAN_MB3 EQU (0x1 << 3) ;- (CAN) Mailbox 3 Flag +AT91C_CAN_MB4 EQU (0x1 << 4) ;- (CAN) Mailbox 4 Flag +AT91C_CAN_MB5 EQU (0x1 << 5) ;- (CAN) Mailbox 5 Flag +AT91C_CAN_MB6 EQU (0x1 << 6) ;- (CAN) Mailbox 6 Flag +AT91C_CAN_MB7 EQU (0x1 << 7) ;- (CAN) Mailbox 7 Flag +AT91C_CAN_MB8 EQU (0x1 << 8) ;- (CAN) Mailbox 8 Flag +AT91C_CAN_MB9 EQU (0x1 << 9) ;- (CAN) Mailbox 9 Flag +AT91C_CAN_MB10 EQU (0x1 << 10) ;- (CAN) Mailbox 10 Flag +AT91C_CAN_MB11 EQU (0x1 << 11) ;- (CAN) Mailbox 11 Flag +AT91C_CAN_MB12 EQU (0x1 << 12) ;- (CAN) Mailbox 12 Flag +AT91C_CAN_MB13 EQU (0x1 << 13) ;- (CAN) Mailbox 13 Flag +AT91C_CAN_MB14 EQU (0x1 << 14) ;- (CAN) Mailbox 14 Flag +AT91C_CAN_MB15 EQU (0x1 << 15) ;- (CAN) Mailbox 15 Flag +AT91C_CAN_ERRA EQU (0x1 << 16) ;- (CAN) Error Active Mode Flag +AT91C_CAN_WARN EQU (0x1 << 17) ;- (CAN) Warning Limit Flag +AT91C_CAN_ERRP EQU (0x1 << 18) ;- (CAN) Error Passive Mode Flag +AT91C_CAN_BOFF EQU (0x1 << 19) ;- (CAN) Bus Off Mode Flag +AT91C_CAN_SLEEP EQU (0x1 << 20) ;- (CAN) Sleep Flag +AT91C_CAN_WAKEUP EQU (0x1 << 21) ;- (CAN) Wakeup Flag +AT91C_CAN_TOVF EQU (0x1 << 22) ;- (CAN) Timer Overflow Flag +AT91C_CAN_TSTP EQU (0x1 << 23) ;- (CAN) Timestamp Flag +AT91C_CAN_CERR EQU (0x1 << 24) ;- (CAN) CRC Error +AT91C_CAN_SERR EQU (0x1 << 25) ;- (CAN) Stuffing Error +AT91C_CAN_AERR EQU (0x1 << 26) ;- (CAN) Acknowledgment Error +AT91C_CAN_FERR EQU (0x1 << 27) ;- (CAN) Form Error +AT91C_CAN_BERR EQU (0x1 << 28) ;- (CAN) Bit Error +// - -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// - -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// - -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +AT91C_CAN_RBSY EQU (0x1 << 29) ;- (CAN) Receiver Busy +AT91C_CAN_TBSY EQU (0x1 << 30) ;- (CAN) Transmitter Busy +AT91C_CAN_OVLY EQU (0x1 << 31) ;- (CAN) Overload Busy +// - -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +AT91C_CAN_PHASE2 EQU (0x7 << 0) ;- (CAN) Phase 2 segment +AT91C_CAN_PHASE1 EQU (0x7 << 4) ;- (CAN) Phase 1 segment +AT91C_CAN_PROPAG EQU (0x7 << 8) ;- (CAN) Programmation time segment +AT91C_CAN_SYNC EQU (0x3 << 12) ;- (CAN) Re-synchronization jump width segment +AT91C_CAN_BRP EQU (0x7F << 16) ;- (CAN) Baudrate Prescaler +AT91C_CAN_SMP EQU (0x1 << 24) ;- (CAN) Sampling mode +// - -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +AT91C_CAN_TIMER EQU (0xFFFF << 0) ;- (CAN) Timer field +// - -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// - -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +AT91C_CAN_REC EQU (0xFF << 0) ;- (CAN) Receive Error Counter +AT91C_CAN_TEC EQU (0xFF << 16) ;- (CAN) Transmit Error Counter +// - -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +AT91C_CAN_TIMRST EQU (0x1 << 31) ;- (CAN) Timer Reset Field +// - -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// - ***************************************************************************** +// - -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +AT91C_EMAC_LB EQU (0x1 << 0) ;- (EMAC) Loopback. Optional. When set, loopback signal is at high level. +AT91C_EMAC_LLB EQU (0x1 << 1) ;- (EMAC) Loopback local. +AT91C_EMAC_RE EQU (0x1 << 2) ;- (EMAC) Receive enable. +AT91C_EMAC_TE EQU (0x1 << 3) ;- (EMAC) Transmit enable. +AT91C_EMAC_MPE EQU (0x1 << 4) ;- (EMAC) Management port enable. +AT91C_EMAC_CLRSTAT EQU (0x1 << 5) ;- (EMAC) Clear statistics registers. +AT91C_EMAC_INCSTAT EQU (0x1 << 6) ;- (EMAC) Increment statistics registers. +AT91C_EMAC_WESTAT EQU (0x1 << 7) ;- (EMAC) Write enable for statistics registers. +AT91C_EMAC_BP EQU (0x1 << 8) ;- (EMAC) Back pressure. +AT91C_EMAC_TSTART EQU (0x1 << 9) ;- (EMAC) Start Transmission. +AT91C_EMAC_THALT EQU (0x1 << 10) ;- (EMAC) Transmission Halt. +AT91C_EMAC_TPFR EQU (0x1 << 11) ;- (EMAC) Transmit pause frame +AT91C_EMAC_TZQ EQU (0x1 << 12) ;- (EMAC) Transmit zero quantum pause frame +// - -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +AT91C_EMAC_SPD EQU (0x1 << 0) ;- (EMAC) Speed. +AT91C_EMAC_FD EQU (0x1 << 1) ;- (EMAC) Full duplex. +AT91C_EMAC_JFRAME EQU (0x1 << 3) ;- (EMAC) Jumbo Frames. +AT91C_EMAC_CAF EQU (0x1 << 4) ;- (EMAC) Copy all frames. +AT91C_EMAC_NBC EQU (0x1 << 5) ;- (EMAC) No broadcast. +AT91C_EMAC_MTI EQU (0x1 << 6) ;- (EMAC) Multicast hash event enable +AT91C_EMAC_UNI EQU (0x1 << 7) ;- (EMAC) Unicast hash enable. +AT91C_EMAC_BIG EQU (0x1 << 8) ;- (EMAC) Receive 1522 bytes. +AT91C_EMAC_EAE EQU (0x1 << 9) ;- (EMAC) External address match enable. +AT91C_EMAC_CLK EQU (0x3 << 10) ;- (EMAC) +AT91C_EMAC_CLK_HCLK_8 EQU (0x0 << 10) ;- (EMAC) HCLK divided by 8 +AT91C_EMAC_CLK_HCLK_16 EQU (0x1 << 10) ;- (EMAC) HCLK divided by 16 +AT91C_EMAC_CLK_HCLK_32 EQU (0x2 << 10) ;- (EMAC) HCLK divided by 32 +AT91C_EMAC_CLK_HCLK_64 EQU (0x3 << 10) ;- (EMAC) HCLK divided by 64 +AT91C_EMAC_RTY EQU (0x1 << 12) ;- (EMAC) +AT91C_EMAC_PAE EQU (0x1 << 13) ;- (EMAC) +AT91C_EMAC_RBOF EQU (0x3 << 14) ;- (EMAC) +AT91C_EMAC_RBOF_OFFSET_0 EQU (0x0 << 14) ;- (EMAC) no offset from start of receive buffer +AT91C_EMAC_RBOF_OFFSET_1 EQU (0x1 << 14) ;- (EMAC) one byte offset from start of receive buffer +AT91C_EMAC_RBOF_OFFSET_2 EQU (0x2 << 14) ;- (EMAC) two bytes offset from start of receive buffer +AT91C_EMAC_RBOF_OFFSET_3 EQU (0x3 << 14) ;- (EMAC) three bytes offset from start of receive buffer +AT91C_EMAC_RLCE EQU (0x1 << 16) ;- (EMAC) Receive Length field Checking Enable +AT91C_EMAC_DRFCS EQU (0x1 << 17) ;- (EMAC) Discard Receive FCS +AT91C_EMAC_EFRHD EQU (0x1 << 18) ;- (EMAC) +AT91C_EMAC_IRXFCS EQU (0x1 << 19) ;- (EMAC) Ignore RX FCS +// - -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +AT91C_EMAC_LINKR EQU (0x1 << 0) ;- (EMAC) +AT91C_EMAC_MDIO EQU (0x1 << 1) ;- (EMAC) +AT91C_EMAC_IDLE EQU (0x1 << 2) ;- (EMAC) +// - -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +AT91C_EMAC_UBR EQU (0x1 << 0) ;- (EMAC) +AT91C_EMAC_COL EQU (0x1 << 1) ;- (EMAC) +AT91C_EMAC_RLES EQU (0x1 << 2) ;- (EMAC) +AT91C_EMAC_TGO EQU (0x1 << 3) ;- (EMAC) Transmit Go +AT91C_EMAC_BEX EQU (0x1 << 4) ;- (EMAC) Buffers exhausted mid frame +AT91C_EMAC_COMP EQU (0x1 << 5) ;- (EMAC) +AT91C_EMAC_UND EQU (0x1 << 6) ;- (EMAC) +// - -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +AT91C_EMAC_BNA EQU (0x1 << 0) ;- (EMAC) +AT91C_EMAC_REC EQU (0x1 << 1) ;- (EMAC) +AT91C_EMAC_OVR EQU (0x1 << 2) ;- (EMAC) +// - -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +AT91C_EMAC_MFD EQU (0x1 << 0) ;- (EMAC) +AT91C_EMAC_RCOMP EQU (0x1 << 1) ;- (EMAC) +AT91C_EMAC_RXUBR EQU (0x1 << 2) ;- (EMAC) +AT91C_EMAC_TXUBR EQU (0x1 << 3) ;- (EMAC) +AT91C_EMAC_TUNDR EQU (0x1 << 4) ;- (EMAC) +AT91C_EMAC_RLEX EQU (0x1 << 5) ;- (EMAC) +AT91C_EMAC_TXERR EQU (0x1 << 6) ;- (EMAC) +AT91C_EMAC_TCOMP EQU (0x1 << 7) ;- (EMAC) +AT91C_EMAC_LINK EQU (0x1 << 9) ;- (EMAC) +AT91C_EMAC_ROVR EQU (0x1 << 10) ;- (EMAC) +AT91C_EMAC_HRESP EQU (0x1 << 11) ;- (EMAC) +AT91C_EMAC_PFRE EQU (0x1 << 12) ;- (EMAC) +AT91C_EMAC_PTZ EQU (0x1 << 13) ;- (EMAC) +// - -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// - -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// - -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// - -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +AT91C_EMAC_DATA EQU (0xFFFF << 0) ;- (EMAC) +AT91C_EMAC_CODE EQU (0x3 << 16) ;- (EMAC) +AT91C_EMAC_REGA EQU (0x1F << 18) ;- (EMAC) +AT91C_EMAC_PHYA EQU (0x1F << 23) ;- (EMAC) +AT91C_EMAC_RW EQU (0x3 << 28) ;- (EMAC) +AT91C_EMAC_SOF EQU (0x3 << 30) ;- (EMAC) +// - -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +AT91C_EMAC_RMII EQU (0x1 << 0) ;- (EMAC) Reduce MII +// - -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +AT91C_EMAC_IP EQU (0xFFFF << 0) ;- (EMAC) ARP request IP address +AT91C_EMAC_MAG EQU (0x1 << 16) ;- (EMAC) Magic packet event enable +AT91C_EMAC_ARP EQU (0x1 << 17) ;- (EMAC) ARP request event enable +AT91C_EMAC_SA1 EQU (0x1 << 18) ;- (EMAC) Specific address register 1 event enable +// - -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +AT91C_EMAC_REVREF EQU (0xFFFF << 0) ;- (EMAC) +AT91C_EMAC_PARTREF EQU (0xFFFF << 16) ;- (EMAC) + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// - ***************************************************************************** +// - -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +AT91C_ADC_SWRST EQU (0x1 << 0) ;- (ADC) Software Reset +AT91C_ADC_START EQU (0x1 << 1) ;- (ADC) Start Conversion +// - -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +AT91C_ADC_TRGEN EQU (0x1 << 0) ;- (ADC) Trigger Enable +AT91C_ADC_TRGEN_DIS EQU (0x0) ;- (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +AT91C_ADC_TRGEN_EN EQU (0x1) ;- (ADC) Hardware trigger selected by TRGSEL field is enabled. +AT91C_ADC_TRGSEL EQU (0x7 << 1) ;- (ADC) Trigger Selection +AT91C_ADC_TRGSEL_TIOA0 EQU (0x0 << 1) ;- (ADC) Selected TRGSEL = TIAO0 +AT91C_ADC_TRGSEL_TIOA1 EQU (0x1 << 1) ;- (ADC) Selected TRGSEL = TIAO1 +AT91C_ADC_TRGSEL_TIOA2 EQU (0x2 << 1) ;- (ADC) Selected TRGSEL = TIAO2 +AT91C_ADC_TRGSEL_TIOA3 EQU (0x3 << 1) ;- (ADC) Selected TRGSEL = TIAO3 +AT91C_ADC_TRGSEL_TIOA4 EQU (0x4 << 1) ;- (ADC) Selected TRGSEL = TIAO4 +AT91C_ADC_TRGSEL_TIOA5 EQU (0x5 << 1) ;- (ADC) Selected TRGSEL = TIAO5 +AT91C_ADC_TRGSEL_EXT EQU (0x6 << 1) ;- (ADC) Selected TRGSEL = External Trigger +AT91C_ADC_LOWRES EQU (0x1 << 4) ;- (ADC) Resolution. +AT91C_ADC_LOWRES_10_BIT EQU (0x0 << 4) ;- (ADC) 10-bit resolution +AT91C_ADC_LOWRES_8_BIT EQU (0x1 << 4) ;- (ADC) 8-bit resolution +AT91C_ADC_SLEEP EQU (0x1 << 5) ;- (ADC) Sleep Mode +AT91C_ADC_SLEEP_NORMAL_MODE EQU (0x0 << 5) ;- (ADC) Normal Mode +AT91C_ADC_SLEEP_MODE EQU (0x1 << 5) ;- (ADC) Sleep Mode +AT91C_ADC_PRESCAL EQU (0x3F << 8) ;- (ADC) Prescaler rate selection +AT91C_ADC_STARTUP EQU (0x1F << 16) ;- (ADC) Startup Time +AT91C_ADC_SHTIM EQU (0xF << 24) ;- (ADC) Sample & Hold Time +// - -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +AT91C_ADC_CH0 EQU (0x1 << 0) ;- (ADC) Channel 0 +AT91C_ADC_CH1 EQU (0x1 << 1) ;- (ADC) Channel 1 +AT91C_ADC_CH2 EQU (0x1 << 2) ;- (ADC) Channel 2 +AT91C_ADC_CH3 EQU (0x1 << 3) ;- (ADC) Channel 3 +AT91C_ADC_CH4 EQU (0x1 << 4) ;- (ADC) Channel 4 +AT91C_ADC_CH5 EQU (0x1 << 5) ;- (ADC) Channel 5 +AT91C_ADC_CH6 EQU (0x1 << 6) ;- (ADC) Channel 6 +AT91C_ADC_CH7 EQU (0x1 << 7) ;- (ADC) Channel 7 +// - -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// - -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// - -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +AT91C_ADC_EOC0 EQU (0x1 << 0) ;- (ADC) End of Conversion +AT91C_ADC_EOC1 EQU (0x1 << 1) ;- (ADC) End of Conversion +AT91C_ADC_EOC2 EQU (0x1 << 2) ;- (ADC) End of Conversion +AT91C_ADC_EOC3 EQU (0x1 << 3) ;- (ADC) End of Conversion +AT91C_ADC_EOC4 EQU (0x1 << 4) ;- (ADC) End of Conversion +AT91C_ADC_EOC5 EQU (0x1 << 5) ;- (ADC) End of Conversion +AT91C_ADC_EOC6 EQU (0x1 << 6) ;- (ADC) End of Conversion +AT91C_ADC_EOC7 EQU (0x1 << 7) ;- (ADC) End of Conversion +AT91C_ADC_OVRE0 EQU (0x1 << 8) ;- (ADC) Overrun Error +AT91C_ADC_OVRE1 EQU (0x1 << 9) ;- (ADC) Overrun Error +AT91C_ADC_OVRE2 EQU (0x1 << 10) ;- (ADC) Overrun Error +AT91C_ADC_OVRE3 EQU (0x1 << 11) ;- (ADC) Overrun Error +AT91C_ADC_OVRE4 EQU (0x1 << 12) ;- (ADC) Overrun Error +AT91C_ADC_OVRE5 EQU (0x1 << 13) ;- (ADC) Overrun Error +AT91C_ADC_OVRE6 EQU (0x1 << 14) ;- (ADC) Overrun Error +AT91C_ADC_OVRE7 EQU (0x1 << 15) ;- (ADC) Overrun Error +AT91C_ADC_DRDY EQU (0x1 << 16) ;- (ADC) Data Ready +AT91C_ADC_GOVRE EQU (0x1 << 17) ;- (ADC) General Overrun +AT91C_ADC_ENDRX EQU (0x1 << 18) ;- (ADC) End of Receiver Transfer +AT91C_ADC_RXBUFF EQU (0x1 << 19) ;- (ADC) RXBUFF Interrupt +// - -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +AT91C_ADC_LDATA EQU (0x3FF << 0) ;- (ADC) Last Data Converted +// - -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// - -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// - -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// - -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +AT91C_ADC_DATA EQU (0x3FF << 0) ;- (ADC) Converted Data +// - -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// - -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// - -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// - -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// - -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// - -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// - -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// - ***************************************************************************** +// - -------- AES_CR : (AES Offset: 0x0) Control Register -------- +AT91C_AES_START EQU (0x1 << 0) ;- (AES) Starts Processing +AT91C_AES_SWRST EQU (0x1 << 8) ;- (AES) Software Reset +AT91C_AES_LOADSEED EQU (0x1 << 16) ;- (AES) Random Number Generator Seed Loading +// - -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +AT91C_AES_CIPHER EQU (0x1 << 0) ;- (AES) Processing Mode +AT91C_AES_PROCDLY EQU (0xF << 4) ;- (AES) Processing Delay +AT91C_AES_SMOD EQU (0x3 << 8) ;- (AES) Start Mode +AT91C_AES_SMOD_MANUAL EQU (0x0 << 8) ;- (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +AT91C_AES_SMOD_AUTO EQU (0x1 << 8) ;- (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +AT91C_AES_SMOD_PDC EQU (0x2 << 8) ;- (AES) PDC Mode (cf datasheet). +AT91C_AES_OPMOD EQU (0x7 << 12) ;- (AES) Operation Mode +AT91C_AES_OPMOD_ECB EQU (0x0 << 12) ;- (AES) ECB Electronic CodeBook mode. +AT91C_AES_OPMOD_CBC EQU (0x1 << 12) ;- (AES) CBC Cipher Block Chaining mode. +AT91C_AES_OPMOD_OFB EQU (0x2 << 12) ;- (AES) OFB Output Feedback mode. +AT91C_AES_OPMOD_CFB EQU (0x3 << 12) ;- (AES) CFB Cipher Feedback mode. +AT91C_AES_OPMOD_CTR EQU (0x4 << 12) ;- (AES) CTR Counter mode. +AT91C_AES_LOD EQU (0x1 << 15) ;- (AES) Last Output Data Mode +AT91C_AES_CFBS EQU (0x7 << 16) ;- (AES) Cipher Feedback Data Size +AT91C_AES_CFBS_128_BIT EQU (0x0 << 16) ;- (AES) 128-bit. +AT91C_AES_CFBS_64_BIT EQU (0x1 << 16) ;- (AES) 64-bit. +AT91C_AES_CFBS_32_BIT EQU (0x2 << 16) ;- (AES) 32-bit. +AT91C_AES_CFBS_16_BIT EQU (0x3 << 16) ;- (AES) 16-bit. +AT91C_AES_CFBS_8_BIT EQU (0x4 << 16) ;- (AES) 8-bit. +AT91C_AES_CKEY EQU (0xF << 20) ;- (AES) Countermeasure Key +AT91C_AES_CTYPE EQU (0x1F << 24) ;- (AES) Countermeasure Type +AT91C_AES_CTYPE_TYPE1_EN EQU (0x1 << 24) ;- (AES) Countermeasure type 1 is enabled. +AT91C_AES_CTYPE_TYPE2_EN EQU (0x2 << 24) ;- (AES) Countermeasure type 2 is enabled. +AT91C_AES_CTYPE_TYPE3_EN EQU (0x4 << 24) ;- (AES) Countermeasure type 3 is enabled. +AT91C_AES_CTYPE_TYPE4_EN EQU (0x8 << 24) ;- (AES) Countermeasure type 4 is enabled. +AT91C_AES_CTYPE_TYPE5_EN EQU (0x10 << 24) ;- (AES) Countermeasure type 5 is enabled. +// - -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +AT91C_AES_DATRDY EQU (0x1 << 0) ;- (AES) DATRDY +AT91C_AES_ENDRX EQU (0x1 << 1) ;- (AES) PDC Read Buffer End +AT91C_AES_ENDTX EQU (0x1 << 2) ;- (AES) PDC Write Buffer End +AT91C_AES_RXBUFF EQU (0x1 << 3) ;- (AES) PDC Read Buffer Full +AT91C_AES_TXBUFE EQU (0x1 << 4) ;- (AES) PDC Write Buffer Empty +AT91C_AES_URAD EQU (0x1 << 8) ;- (AES) Unspecified Register Access Detection +// - -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// - -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// - -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +AT91C_AES_URAT EQU (0x7 << 12) ;- (AES) Unspecified Register Access Type Status +AT91C_AES_URAT_IN_DAT_WRITE_DATPROC EQU (0x0 << 12) ;- (AES) Input data register written during the data processing in PDC mode. +AT91C_AES_URAT_OUT_DAT_READ_DATPROC EQU (0x1 << 12) ;- (AES) Output data register read during the data processing. +AT91C_AES_URAT_MODEREG_WRITE_DATPROC EQU (0x2 << 12) ;- (AES) Mode register written during the data processing. +AT91C_AES_URAT_OUT_DAT_READ_SUBKEY EQU (0x3 << 12) ;- (AES) Output data register read during the sub-keys generation. +AT91C_AES_URAT_MODEREG_WRITE_SUBKEY EQU (0x4 << 12) ;- (AES) Mode register written during the sub-keys generation. +AT91C_AES_URAT_WO_REG_READ EQU (0x5 << 12) ;- (AES) Write-only register read access. + +// - ***************************************************************************** +// - SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// - ***************************************************************************** +// - -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +AT91C_TDES_START EQU (0x1 << 0) ;- (TDES) Starts Processing +AT91C_TDES_SWRST EQU (0x1 << 8) ;- (TDES) Software Reset +// - -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +AT91C_TDES_CIPHER EQU (0x1 << 0) ;- (TDES) Processing Mode +AT91C_TDES_TDESMOD EQU (0x1 << 1) ;- (TDES) Single or Triple DES Mode +AT91C_TDES_KEYMOD EQU (0x1 << 4) ;- (TDES) Key Mode +AT91C_TDES_SMOD EQU (0x3 << 8) ;- (TDES) Start Mode +AT91C_TDES_SMOD_MANUAL EQU (0x0 << 8) ;- (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +AT91C_TDES_SMOD_AUTO EQU (0x1 << 8) ;- (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +AT91C_TDES_SMOD_PDC EQU (0x2 << 8) ;- (TDES) PDC Mode (cf datasheet). +AT91C_TDES_OPMOD EQU (0x3 << 12) ;- (TDES) Operation Mode +AT91C_TDES_OPMOD_ECB EQU (0x0 << 12) ;- (TDES) ECB Electronic CodeBook mode. +AT91C_TDES_OPMOD_CBC EQU (0x1 << 12) ;- (TDES) CBC Cipher Block Chaining mode. +AT91C_TDES_OPMOD_OFB EQU (0x2 << 12) ;- (TDES) OFB Output Feedback mode. +AT91C_TDES_OPMOD_CFB EQU (0x3 << 12) ;- (TDES) CFB Cipher Feedback mode. +AT91C_TDES_LOD EQU (0x1 << 15) ;- (TDES) Last Output Data Mode +AT91C_TDES_CFBS EQU (0x3 << 16) ;- (TDES) Cipher Feedback Data Size +AT91C_TDES_CFBS_64_BIT EQU (0x0 << 16) ;- (TDES) 64-bit. +AT91C_TDES_CFBS_32_BIT EQU (0x1 << 16) ;- (TDES) 32-bit. +AT91C_TDES_CFBS_16_BIT EQU (0x2 << 16) ;- (TDES) 16-bit. +AT91C_TDES_CFBS_8_BIT EQU (0x3 << 16) ;- (TDES) 8-bit. +// - -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +AT91C_TDES_DATRDY EQU (0x1 << 0) ;- (TDES) DATRDY +AT91C_TDES_ENDRX EQU (0x1 << 1) ;- (TDES) PDC Read Buffer End +AT91C_TDES_ENDTX EQU (0x1 << 2) ;- (TDES) PDC Write Buffer End +AT91C_TDES_RXBUFF EQU (0x1 << 3) ;- (TDES) PDC Read Buffer Full +AT91C_TDES_TXBUFE EQU (0x1 << 4) ;- (TDES) PDC Write Buffer Empty +AT91C_TDES_URAD EQU (0x1 << 8) ;- (TDES) Unspecified Register Access Detection +// - -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// - -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// - -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +AT91C_TDES_URAT EQU (0x3 << 12) ;- (TDES) Unspecified Register Access Type Status +AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC EQU (0x0 << 12) ;- (TDES) Input data register written during the data processing in PDC mode. +AT91C_TDES_URAT_OUT_DAT_READ_DATPROC EQU (0x1 << 12) ;- (TDES) Output data register read during the data processing. +AT91C_TDES_URAT_MODEREG_WRITE_DATPROC EQU (0x2 << 12) ;- (TDES) Mode register written during the data processing. +AT91C_TDES_URAT_WO_REG_READ EQU (0x3 << 12) ;- (TDES) Write-only register read access. + +// - ***************************************************************************** +// - REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// - ***************************************************************************** +// - ========== Register definition for SYS peripheral ========== +// - ========== Register definition for AIC peripheral ========== +AT91C_AIC_IVR EQU (0xFFFFF100) ;- (AIC) IRQ Vector Register +AT91C_AIC_SMR EQU (0xFFFFF000) ;- (AIC) Source Mode Register +AT91C_AIC_FVR EQU (0xFFFFF104) ;- (AIC) FIQ Vector Register +AT91C_AIC_DCR EQU (0xFFFFF138) ;- (AIC) Debug Control Register (Protect) +AT91C_AIC_EOICR EQU (0xFFFFF130) ;- (AIC) End of Interrupt Command Register +AT91C_AIC_SVR EQU (0xFFFFF080) ;- (AIC) Source Vector Register +AT91C_AIC_FFSR EQU (0xFFFFF148) ;- (AIC) Fast Forcing Status Register +AT91C_AIC_ICCR EQU (0xFFFFF128) ;- (AIC) Interrupt Clear Command Register +AT91C_AIC_ISR EQU (0xFFFFF108) ;- (AIC) Interrupt Status Register +AT91C_AIC_IMR EQU (0xFFFFF110) ;- (AIC) Interrupt Mask Register +AT91C_AIC_IPR EQU (0xFFFFF10C) ;- (AIC) Interrupt Pending Register +AT91C_AIC_FFER EQU (0xFFFFF140) ;- (AIC) Fast Forcing Enable Register +AT91C_AIC_IECR EQU (0xFFFFF120) ;- (AIC) Interrupt Enable Command Register +AT91C_AIC_ISCR EQU (0xFFFFF12C) ;- (AIC) Interrupt Set Command Register +AT91C_AIC_FFDR EQU (0xFFFFF144) ;- (AIC) Fast Forcing Disable Register +AT91C_AIC_CISR EQU (0xFFFFF114) ;- (AIC) Core Interrupt Status Register +AT91C_AIC_IDCR EQU (0xFFFFF124) ;- (AIC) Interrupt Disable Command Register +AT91C_AIC_SPU EQU (0xFFFFF134) ;- (AIC) Spurious Vector Register +// - ========== Register definition for PDC_DBGU peripheral ========== +AT91C_DBGU_TCR EQU (0xFFFFF30C) ;- (PDC_DBGU) Transmit Counter Register +AT91C_DBGU_RNPR EQU (0xFFFFF310) ;- (PDC_DBGU) Receive Next Pointer Register +AT91C_DBGU_TNPR EQU (0xFFFFF318) ;- (PDC_DBGU) Transmit Next Pointer Register +AT91C_DBGU_TPR EQU (0xFFFFF308) ;- (PDC_DBGU) Transmit Pointer Register +AT91C_DBGU_RPR EQU (0xFFFFF300) ;- (PDC_DBGU) Receive Pointer Register +AT91C_DBGU_RCR EQU (0xFFFFF304) ;- (PDC_DBGU) Receive Counter Register +AT91C_DBGU_RNCR EQU (0xFFFFF314) ;- (PDC_DBGU) Receive Next Counter Register +AT91C_DBGU_PTCR EQU (0xFFFFF320) ;- (PDC_DBGU) PDC Transfer Control Register +AT91C_DBGU_PTSR EQU (0xFFFFF324) ;- (PDC_DBGU) PDC Transfer Status Register +AT91C_DBGU_TNCR EQU (0xFFFFF31C) ;- (PDC_DBGU) Transmit Next Counter Register +// - ========== Register definition for DBGU peripheral ========== +AT91C_DBGU_EXID EQU (0xFFFFF244) ;- (DBGU) Chip ID Extension Register +AT91C_DBGU_BRGR EQU (0xFFFFF220) ;- (DBGU) Baud Rate Generator Register +AT91C_DBGU_IDR EQU (0xFFFFF20C) ;- (DBGU) Interrupt Disable Register +AT91C_DBGU_CSR EQU (0xFFFFF214) ;- (DBGU) Channel Status Register +AT91C_DBGU_CIDR EQU (0xFFFFF240) ;- (DBGU) Chip ID Register +AT91C_DBGU_MR EQU (0xFFFFF204) ;- (DBGU) Mode Register +AT91C_DBGU_IMR EQU (0xFFFFF210) ;- (DBGU) Interrupt Mask Register +AT91C_DBGU_CR EQU (0xFFFFF200) ;- (DBGU) Control Register +AT91C_DBGU_FNTR EQU (0xFFFFF248) ;- (DBGU) Force NTRST Register +AT91C_DBGU_THR EQU (0xFFFFF21C) ;- (DBGU) Transmitter Holding Register +AT91C_DBGU_RHR EQU (0xFFFFF218) ;- (DBGU) Receiver Holding Register +AT91C_DBGU_IER EQU (0xFFFFF208) ;- (DBGU) Interrupt Enable Register +// - ========== Register definition for PIOA peripheral ========== +AT91C_PIOA_ODR EQU (0xFFFFF414) ;- (PIOA) Output Disable Registerr +AT91C_PIOA_SODR EQU (0xFFFFF430) ;- (PIOA) Set Output Data Register +AT91C_PIOA_ISR EQU (0xFFFFF44C) ;- (PIOA) Interrupt Status Register +AT91C_PIOA_ABSR EQU (0xFFFFF478) ;- (PIOA) AB Select Status Register +AT91C_PIOA_IER EQU (0xFFFFF440) ;- (PIOA) Interrupt Enable Register +AT91C_PIOA_PPUDR EQU (0xFFFFF460) ;- (PIOA) Pull-up Disable Register +AT91C_PIOA_IMR EQU (0xFFFFF448) ;- (PIOA) Interrupt Mask Register +AT91C_PIOA_PER EQU (0xFFFFF400) ;- (PIOA) PIO Enable Register +AT91C_PIOA_IFDR EQU (0xFFFFF424) ;- (PIOA) Input Filter Disable Register +AT91C_PIOA_OWDR EQU (0xFFFFF4A4) ;- (PIOA) Output Write Disable Register +AT91C_PIOA_MDSR EQU (0xFFFFF458) ;- (PIOA) Multi-driver Status Register +AT91C_PIOA_IDR EQU (0xFFFFF444) ;- (PIOA) Interrupt Disable Register +AT91C_PIOA_ODSR EQU (0xFFFFF438) ;- (PIOA) Output Data Status Register +AT91C_PIOA_PPUSR EQU (0xFFFFF468) ;- (PIOA) Pull-up Status Register +AT91C_PIOA_OWSR EQU (0xFFFFF4A8) ;- (PIOA) Output Write Status Register +AT91C_PIOA_BSR EQU (0xFFFFF474) ;- (PIOA) Select B Register +AT91C_PIOA_OWER EQU (0xFFFFF4A0) ;- (PIOA) Output Write Enable Register +AT91C_PIOA_IFER EQU (0xFFFFF420) ;- (PIOA) Input Filter Enable Register +AT91C_PIOA_PDSR EQU (0xFFFFF43C) ;- (PIOA) Pin Data Status Register +AT91C_PIOA_PPUER EQU (0xFFFFF464) ;- (PIOA) Pull-up Enable Register +AT91C_PIOA_OSR EQU (0xFFFFF418) ;- (PIOA) Output Status Register +AT91C_PIOA_ASR EQU (0xFFFFF470) ;- (PIOA) Select A Register +AT91C_PIOA_MDDR EQU (0xFFFFF454) ;- (PIOA) Multi-driver Disable Register +AT91C_PIOA_CODR EQU (0xFFFFF434) ;- (PIOA) Clear Output Data Register +AT91C_PIOA_MDER EQU (0xFFFFF450) ;- (PIOA) Multi-driver Enable Register +AT91C_PIOA_PDR EQU (0xFFFFF404) ;- (PIOA) PIO Disable Register +AT91C_PIOA_IFSR EQU (0xFFFFF428) ;- (PIOA) Input Filter Status Register +AT91C_PIOA_OER EQU (0xFFFFF410) ;- (PIOA) Output Enable Register +AT91C_PIOA_PSR EQU (0xFFFFF408) ;- (PIOA) PIO Status Register +// - ========== Register definition for PIOB peripheral ========== +AT91C_PIOB_OWDR EQU (0xFFFFF6A4) ;- (PIOB) Output Write Disable Register +AT91C_PIOB_MDER EQU (0xFFFFF650) ;- (PIOB) Multi-driver Enable Register +AT91C_PIOB_PPUSR EQU (0xFFFFF668) ;- (PIOB) Pull-up Status Register +AT91C_PIOB_IMR EQU (0xFFFFF648) ;- (PIOB) Interrupt Mask Register +AT91C_PIOB_ASR EQU (0xFFFFF670) ;- (PIOB) Select A Register +AT91C_PIOB_PPUDR EQU (0xFFFFF660) ;- (PIOB) Pull-up Disable Register +AT91C_PIOB_PSR EQU (0xFFFFF608) ;- (PIOB) PIO Status Register +AT91C_PIOB_IER EQU (0xFFFFF640) ;- (PIOB) Interrupt Enable Register +AT91C_PIOB_CODR EQU (0xFFFFF634) ;- (PIOB) Clear Output Data Register +AT91C_PIOB_OWER EQU (0xFFFFF6A0) ;- (PIOB) Output Write Enable Register +AT91C_PIOB_ABSR EQU (0xFFFFF678) ;- (PIOB) AB Select Status Register +AT91C_PIOB_IFDR EQU (0xFFFFF624) ;- (PIOB) Input Filter Disable Register +AT91C_PIOB_PDSR EQU (0xFFFFF63C) ;- (PIOB) Pin Data Status Register +AT91C_PIOB_IDR EQU (0xFFFFF644) ;- (PIOB) Interrupt Disable Register +AT91C_PIOB_OWSR EQU (0xFFFFF6A8) ;- (PIOB) Output Write Status Register +AT91C_PIOB_PDR EQU (0xFFFFF604) ;- (PIOB) PIO Disable Register +AT91C_PIOB_ODR EQU (0xFFFFF614) ;- (PIOB) Output Disable Registerr +AT91C_PIOB_IFSR EQU (0xFFFFF628) ;- (PIOB) Input Filter Status Register +AT91C_PIOB_PPUER EQU (0xFFFFF664) ;- (PIOB) Pull-up Enable Register +AT91C_PIOB_SODR EQU (0xFFFFF630) ;- (PIOB) Set Output Data Register +AT91C_PIOB_ISR EQU (0xFFFFF64C) ;- (PIOB) Interrupt Status Register +AT91C_PIOB_ODSR EQU (0xFFFFF638) ;- (PIOB) Output Data Status Register +AT91C_PIOB_OSR EQU (0xFFFFF618) ;- (PIOB) Output Status Register +AT91C_PIOB_MDSR EQU (0xFFFFF658) ;- (PIOB) Multi-driver Status Register +AT91C_PIOB_IFER EQU (0xFFFFF620) ;- (PIOB) Input Filter Enable Register +AT91C_PIOB_BSR EQU (0xFFFFF674) ;- (PIOB) Select B Register +AT91C_PIOB_MDDR EQU (0xFFFFF654) ;- (PIOB) Multi-driver Disable Register +AT91C_PIOB_OER EQU (0xFFFFF610) ;- (PIOB) Output Enable Register +AT91C_PIOB_PER EQU (0xFFFFF600) ;- (PIOB) PIO Enable Register +// - ========== Register definition for CKGR peripheral ========== +AT91C_CKGR_MOR EQU (0xFFFFFC20) ;- (CKGR) Main Oscillator Register +AT91C_CKGR_PLLR EQU (0xFFFFFC2C) ;- (CKGR) PLL Register +AT91C_CKGR_MCFR EQU (0xFFFFFC24) ;- (CKGR) Main Clock Frequency Register +// - ========== Register definition for PMC peripheral ========== +AT91C_PMC_IDR EQU (0xFFFFFC64) ;- (PMC) Interrupt Disable Register +AT91C_PMC_MOR EQU (0xFFFFFC20) ;- (PMC) Main Oscillator Register +AT91C_PMC_PLLR EQU (0xFFFFFC2C) ;- (PMC) PLL Register +AT91C_PMC_PCER EQU (0xFFFFFC10) ;- (PMC) Peripheral Clock Enable Register +AT91C_PMC_PCKR EQU (0xFFFFFC40) ;- (PMC) Programmable Clock Register +AT91C_PMC_MCKR EQU (0xFFFFFC30) ;- (PMC) Master Clock Register +AT91C_PMC_SCDR EQU (0xFFFFFC04) ;- (PMC) System Clock Disable Register +AT91C_PMC_PCDR EQU (0xFFFFFC14) ;- (PMC) Peripheral Clock Disable Register +AT91C_PMC_SCSR EQU (0xFFFFFC08) ;- (PMC) System Clock Status Register +AT91C_PMC_PCSR EQU (0xFFFFFC18) ;- (PMC) Peripheral Clock Status Register +AT91C_PMC_MCFR EQU (0xFFFFFC24) ;- (PMC) Main Clock Frequency Register +AT91C_PMC_SCER EQU (0xFFFFFC00) ;- (PMC) System Clock Enable Register +AT91C_PMC_IMR EQU (0xFFFFFC6C) ;- (PMC) Interrupt Mask Register +AT91C_PMC_IER EQU (0xFFFFFC60) ;- (PMC) Interrupt Enable Register +AT91C_PMC_SR EQU (0xFFFFFC68) ;- (PMC) Status Register +// - ========== Register definition for RSTC peripheral ========== +AT91C_RSTC_RCR EQU (0xFFFFFD00) ;- (RSTC) Reset Control Register +AT91C_RSTC_RMR EQU (0xFFFFFD08) ;- (RSTC) Reset Mode Register +AT91C_RSTC_RSR EQU (0xFFFFFD04) ;- (RSTC) Reset Status Register +// - ========== Register definition for RTTC peripheral ========== +AT91C_RTTC_RTSR EQU (0xFFFFFD2C) ;- (RTTC) Real-time Status Register +AT91C_RTTC_RTMR EQU (0xFFFFFD20) ;- (RTTC) Real-time Mode Register +AT91C_RTTC_RTVR EQU (0xFFFFFD28) ;- (RTTC) Real-time Value Register +AT91C_RTTC_RTAR EQU (0xFFFFFD24) ;- (RTTC) Real-time Alarm Register +// - ========== Register definition for PITC peripheral ========== +AT91C_PITC_PIVR EQU (0xFFFFFD38) ;- (PITC) Period Interval Value Register +AT91C_PITC_PISR EQU (0xFFFFFD34) ;- (PITC) Period Interval Status Register +AT91C_PITC_PIIR EQU (0xFFFFFD3C) ;- (PITC) Period Interval Image Register +AT91C_PITC_PIMR EQU (0xFFFFFD30) ;- (PITC) Period Interval Mode Register +// - ========== Register definition for WDTC peripheral ========== +AT91C_WDTC_WDCR EQU (0xFFFFFD40) ;- (WDTC) Watchdog Control Register +AT91C_WDTC_WDSR EQU (0xFFFFFD48) ;- (WDTC) Watchdog Status Register +AT91C_WDTC_WDMR EQU (0xFFFFFD44) ;- (WDTC) Watchdog Mode Register +// - ========== Register definition for VREG peripheral ========== +AT91C_VREG_MR EQU (0xFFFFFD60) ;- (VREG) Voltage Regulator Mode Register +// - ========== Register definition for MC peripheral ========== +AT91C_MC_ASR EQU (0xFFFFFF04) ;- (MC) MC Abort Status Register +AT91C_MC_RCR EQU (0xFFFFFF00) ;- (MC) MC Remap Control Register +AT91C_MC_FCR EQU (0xFFFFFF64) ;- (MC) MC Flash Command Register +AT91C_MC_AASR EQU (0xFFFFFF08) ;- (MC) MC Abort Address Status Register +AT91C_MC_FSR EQU (0xFFFFFF68) ;- (MC) MC Flash Status Register +AT91C_MC_FMR EQU (0xFFFFFF60) ;- (MC) MC Flash Mode Register +// - ========== Register definition for PDC_SPI1 peripheral ========== +AT91C_SPI1_PTCR EQU (0xFFFE4120) ;- (PDC_SPI1) PDC Transfer Control Register +AT91C_SPI1_RPR EQU (0xFFFE4100) ;- (PDC_SPI1) Receive Pointer Register +AT91C_SPI1_TNCR EQU (0xFFFE411C) ;- (PDC_SPI1) Transmit Next Counter Register +AT91C_SPI1_TPR EQU (0xFFFE4108) ;- (PDC_SPI1) Transmit Pointer Register +AT91C_SPI1_TNPR EQU (0xFFFE4118) ;- (PDC_SPI1) Transmit Next Pointer Register +AT91C_SPI1_TCR EQU (0xFFFE410C) ;- (PDC_SPI1) Transmit Counter Register +AT91C_SPI1_RCR EQU (0xFFFE4104) ;- (PDC_SPI1) Receive Counter Register +AT91C_SPI1_RNPR EQU (0xFFFE4110) ;- (PDC_SPI1) Receive Next Pointer Register +AT91C_SPI1_RNCR EQU (0xFFFE4114) ;- (PDC_SPI1) Receive Next Counter Register +AT91C_SPI1_PTSR EQU (0xFFFE4124) ;- (PDC_SPI1) PDC Transfer Status Register +// - ========== Register definition for SPI1 peripheral ========== +AT91C_SPI1_IMR EQU (0xFFFE401C) ;- (SPI1) Interrupt Mask Register +AT91C_SPI1_IER EQU (0xFFFE4014) ;- (SPI1) Interrupt Enable Register +AT91C_SPI1_MR EQU (0xFFFE4004) ;- (SPI1) Mode Register +AT91C_SPI1_RDR EQU (0xFFFE4008) ;- (SPI1) Receive Data Register +AT91C_SPI1_IDR EQU (0xFFFE4018) ;- (SPI1) Interrupt Disable Register +AT91C_SPI1_SR EQU (0xFFFE4010) ;- (SPI1) Status Register +AT91C_SPI1_TDR EQU (0xFFFE400C) ;- (SPI1) Transmit Data Register +AT91C_SPI1_CR EQU (0xFFFE4000) ;- (SPI1) Control Register +AT91C_SPI1_CSR EQU (0xFFFE4030) ;- (SPI1) Chip Select Register +// - ========== Register definition for PDC_SPI0 peripheral ========== +AT91C_SPI0_PTCR EQU (0xFFFE0120) ;- (PDC_SPI0) PDC Transfer Control Register +AT91C_SPI0_TPR EQU (0xFFFE0108) ;- (PDC_SPI0) Transmit Pointer Register +AT91C_SPI0_TCR EQU (0xFFFE010C) ;- (PDC_SPI0) Transmit Counter Register +AT91C_SPI0_RCR EQU (0xFFFE0104) ;- (PDC_SPI0) Receive Counter Register +AT91C_SPI0_PTSR EQU (0xFFFE0124) ;- (PDC_SPI0) PDC Transfer Status Register +AT91C_SPI0_RNPR EQU (0xFFFE0110) ;- (PDC_SPI0) Receive Next Pointer Register +AT91C_SPI0_RPR EQU (0xFFFE0100) ;- (PDC_SPI0) Receive Pointer Register +AT91C_SPI0_TNCR EQU (0xFFFE011C) ;- (PDC_SPI0) Transmit Next Counter Register +AT91C_SPI0_RNCR EQU (0xFFFE0114) ;- (PDC_SPI0) Receive Next Counter Register +AT91C_SPI0_TNPR EQU (0xFFFE0118) ;- (PDC_SPI0) Transmit Next Pointer Register +// - ========== Register definition for SPI0 peripheral ========== +AT91C_SPI0_IER EQU (0xFFFE0014) ;- (SPI0) Interrupt Enable Register +AT91C_SPI0_SR EQU (0xFFFE0010) ;- (SPI0) Status Register +AT91C_SPI0_IDR EQU (0xFFFE0018) ;- (SPI0) Interrupt Disable Register +AT91C_SPI0_CR EQU (0xFFFE0000) ;- (SPI0) Control Register +AT91C_SPI0_MR EQU (0xFFFE0004) ;- (SPI0) Mode Register +AT91C_SPI0_IMR EQU (0xFFFE001C) ;- (SPI0) Interrupt Mask Register +AT91C_SPI0_TDR EQU (0xFFFE000C) ;- (SPI0) Transmit Data Register +AT91C_SPI0_RDR EQU (0xFFFE0008) ;- (SPI0) Receive Data Register +AT91C_SPI0_CSR EQU (0xFFFE0030) ;- (SPI0) Chip Select Register +// - ========== Register definition for PDC_US1 peripheral ========== +AT91C_US1_RNCR EQU (0xFFFC4114) ;- (PDC_US1) Receive Next Counter Register +AT91C_US1_PTCR EQU (0xFFFC4120) ;- (PDC_US1) PDC Transfer Control Register +AT91C_US1_TCR EQU (0xFFFC410C) ;- (PDC_US1) Transmit Counter Register +AT91C_US1_PTSR EQU (0xFFFC4124) ;- (PDC_US1) PDC Transfer Status Register +AT91C_US1_TNPR EQU (0xFFFC4118) ;- (PDC_US1) Transmit Next Pointer Register +AT91C_US1_RCR EQU (0xFFFC4104) ;- (PDC_US1) Receive Counter Register +AT91C_US1_RNPR EQU (0xFFFC4110) ;- (PDC_US1) Receive Next Pointer Register +AT91C_US1_RPR EQU (0xFFFC4100) ;- (PDC_US1) Receive Pointer Register +AT91C_US1_TNCR EQU (0xFFFC411C) ;- (PDC_US1) Transmit Next Counter Register +AT91C_US1_TPR EQU (0xFFFC4108) ;- (PDC_US1) Transmit Pointer Register +// - ========== Register definition for US1 peripheral ========== +AT91C_US1_IF EQU (0xFFFC404C) ;- (US1) IRDA_FILTER Register +AT91C_US1_NER EQU (0xFFFC4044) ;- (US1) Nb Errors Register +AT91C_US1_RTOR EQU (0xFFFC4024) ;- (US1) Receiver Time-out Register +AT91C_US1_CSR EQU (0xFFFC4014) ;- (US1) Channel Status Register +AT91C_US1_IDR EQU (0xFFFC400C) ;- (US1) Interrupt Disable Register +AT91C_US1_IER EQU (0xFFFC4008) ;- (US1) Interrupt Enable Register +AT91C_US1_THR EQU (0xFFFC401C) ;- (US1) Transmitter Holding Register +AT91C_US1_TTGR EQU (0xFFFC4028) ;- (US1) Transmitter Time-guard Register +AT91C_US1_RHR EQU (0xFFFC4018) ;- (US1) Receiver Holding Register +AT91C_US1_BRGR EQU (0xFFFC4020) ;- (US1) Baud Rate Generator Register +AT91C_US1_IMR EQU (0xFFFC4010) ;- (US1) Interrupt Mask Register +AT91C_US1_FIDI EQU (0xFFFC4040) ;- (US1) FI_DI_Ratio Register +AT91C_US1_CR EQU (0xFFFC4000) ;- (US1) Control Register +AT91C_US1_MR EQU (0xFFFC4004) ;- (US1) Mode Register +// - ========== Register definition for PDC_US0 peripheral ========== +AT91C_US0_TNPR EQU (0xFFFC0118) ;- (PDC_US0) Transmit Next Pointer Register +AT91C_US0_RNPR EQU (0xFFFC0110) ;- (PDC_US0) Receive Next Pointer Register +AT91C_US0_TCR EQU (0xFFFC010C) ;- (PDC_US0) Transmit Counter Register +AT91C_US0_PTCR EQU (0xFFFC0120) ;- (PDC_US0) PDC Transfer Control Register +AT91C_US0_PTSR EQU (0xFFFC0124) ;- (PDC_US0) PDC Transfer Status Register +AT91C_US0_TNCR EQU (0xFFFC011C) ;- (PDC_US0) Transmit Next Counter Register +AT91C_US0_TPR EQU (0xFFFC0108) ;- (PDC_US0) Transmit Pointer Register +AT91C_US0_RCR EQU (0xFFFC0104) ;- (PDC_US0) Receive Counter Register +AT91C_US0_RPR EQU (0xFFFC0100) ;- (PDC_US0) Receive Pointer Register +AT91C_US0_RNCR EQU (0xFFFC0114) ;- (PDC_US0) Receive Next Counter Register +// - ========== Register definition for US0 peripheral ========== +AT91C_US0_BRGR EQU (0xFFFC0020) ;- (US0) Baud Rate Generator Register +AT91C_US0_NER EQU (0xFFFC0044) ;- (US0) Nb Errors Register +AT91C_US0_CR EQU (0xFFFC0000) ;- (US0) Control Register +AT91C_US0_IMR EQU (0xFFFC0010) ;- (US0) Interrupt Mask Register +AT91C_US0_FIDI EQU (0xFFFC0040) ;- (US0) FI_DI_Ratio Register +AT91C_US0_TTGR EQU (0xFFFC0028) ;- (US0) Transmitter Time-guard Register +AT91C_US0_MR EQU (0xFFFC0004) ;- (US0) Mode Register +AT91C_US0_RTOR EQU (0xFFFC0024) ;- (US0) Receiver Time-out Register +AT91C_US0_CSR EQU (0xFFFC0014) ;- (US0) Channel Status Register +AT91C_US0_RHR EQU (0xFFFC0018) ;- (US0) Receiver Holding Register +AT91C_US0_IDR EQU (0xFFFC000C) ;- (US0) Interrupt Disable Register +AT91C_US0_THR EQU (0xFFFC001C) ;- (US0) Transmitter Holding Register +AT91C_US0_IF EQU (0xFFFC004C) ;- (US0) IRDA_FILTER Register +AT91C_US0_IER EQU (0xFFFC0008) ;- (US0) Interrupt Enable Register +// - ========== Register definition for PDC_SSC peripheral ========== +AT91C_SSC_TNCR EQU (0xFFFD411C) ;- (PDC_SSC) Transmit Next Counter Register +AT91C_SSC_RPR EQU (0xFFFD4100) ;- (PDC_SSC) Receive Pointer Register +AT91C_SSC_RNCR EQU (0xFFFD4114) ;- (PDC_SSC) Receive Next Counter Register +AT91C_SSC_TPR EQU (0xFFFD4108) ;- (PDC_SSC) Transmit Pointer Register +AT91C_SSC_PTCR EQU (0xFFFD4120) ;- (PDC_SSC) PDC Transfer Control Register +AT91C_SSC_TCR EQU (0xFFFD410C) ;- (PDC_SSC) Transmit Counter Register +AT91C_SSC_RCR EQU (0xFFFD4104) ;- (PDC_SSC) Receive Counter Register +AT91C_SSC_RNPR EQU (0xFFFD4110) ;- (PDC_SSC) Receive Next Pointer Register +AT91C_SSC_TNPR EQU (0xFFFD4118) ;- (PDC_SSC) Transmit Next Pointer Register +AT91C_SSC_PTSR EQU (0xFFFD4124) ;- (PDC_SSC) PDC Transfer Status Register +// - ========== Register definition for SSC peripheral ========== +AT91C_SSC_RHR EQU (0xFFFD4020) ;- (SSC) Receive Holding Register +AT91C_SSC_RSHR EQU (0xFFFD4030) ;- (SSC) Receive Sync Holding Register +AT91C_SSC_TFMR EQU (0xFFFD401C) ;- (SSC) Transmit Frame Mode Register +AT91C_SSC_IDR EQU (0xFFFD4048) ;- (SSC) Interrupt Disable Register +AT91C_SSC_THR EQU (0xFFFD4024) ;- (SSC) Transmit Holding Register +AT91C_SSC_RCMR EQU (0xFFFD4010) ;- (SSC) Receive Clock ModeRegister +AT91C_SSC_IER EQU (0xFFFD4044) ;- (SSC) Interrupt Enable Register +AT91C_SSC_TSHR EQU (0xFFFD4034) ;- (SSC) Transmit Sync Holding Register +AT91C_SSC_SR EQU (0xFFFD4040) ;- (SSC) Status Register +AT91C_SSC_CMR EQU (0xFFFD4004) ;- (SSC) Clock Mode Register +AT91C_SSC_TCMR EQU (0xFFFD4018) ;- (SSC) Transmit Clock Mode Register +AT91C_SSC_CR EQU (0xFFFD4000) ;- (SSC) Control Register +AT91C_SSC_IMR EQU (0xFFFD404C) ;- (SSC) Interrupt Mask Register +AT91C_SSC_RFMR EQU (0xFFFD4014) ;- (SSC) Receive Frame Mode Register +// - ========== Register definition for TWI peripheral ========== +AT91C_TWI_IER EQU (0xFFFB8024) ;- (TWI) Interrupt Enable Register +AT91C_TWI_CR EQU (0xFFFB8000) ;- (TWI) Control Register +AT91C_TWI_SR EQU (0xFFFB8020) ;- (TWI) Status Register +AT91C_TWI_IMR EQU (0xFFFB802C) ;- (TWI) Interrupt Mask Register +AT91C_TWI_THR EQU (0xFFFB8034) ;- (TWI) Transmit Holding Register +AT91C_TWI_IDR EQU (0xFFFB8028) ;- (TWI) Interrupt Disable Register +AT91C_TWI_IADR EQU (0xFFFB800C) ;- (TWI) Internal Address Register +AT91C_TWI_MMR EQU (0xFFFB8004) ;- (TWI) Master Mode Register +AT91C_TWI_CWGR EQU (0xFFFB8010) ;- (TWI) Clock Waveform Generator Register +AT91C_TWI_RHR EQU (0xFFFB8030) ;- (TWI) Receive Holding Register +// - ========== Register definition for PWMC_CH3 peripheral ========== +AT91C_PWMC_CH3_CUPDR EQU (0xFFFCC270) ;- (PWMC_CH3) Channel Update Register +AT91C_PWMC_CH3_Reserved EQU (0xFFFCC274) ;- (PWMC_CH3) Reserved +AT91C_PWMC_CH3_CPRDR EQU (0xFFFCC268) ;- (PWMC_CH3) Channel Period Register +AT91C_PWMC_CH3_CDTYR EQU (0xFFFCC264) ;- (PWMC_CH3) Channel Duty Cycle Register +AT91C_PWMC_CH3_CCNTR EQU (0xFFFCC26C) ;- (PWMC_CH3) Channel Counter Register +AT91C_PWMC_CH3_CMR EQU (0xFFFCC260) ;- (PWMC_CH3) Channel Mode Register +// - ========== Register definition for PWMC_CH2 peripheral ========== +AT91C_PWMC_CH2_Reserved EQU (0xFFFCC254) ;- (PWMC_CH2) Reserved +AT91C_PWMC_CH2_CMR EQU (0xFFFCC240) ;- (PWMC_CH2) Channel Mode Register +AT91C_PWMC_CH2_CCNTR EQU (0xFFFCC24C) ;- (PWMC_CH2) Channel Counter Register +AT91C_PWMC_CH2_CPRDR EQU (0xFFFCC248) ;- (PWMC_CH2) Channel Period Register +AT91C_PWMC_CH2_CUPDR EQU (0xFFFCC250) ;- (PWMC_CH2) Channel Update Register +AT91C_PWMC_CH2_CDTYR EQU (0xFFFCC244) ;- (PWMC_CH2) Channel Duty Cycle Register +// - ========== Register definition for PWMC_CH1 peripheral ========== +AT91C_PWMC_CH1_Reserved EQU (0xFFFCC234) ;- (PWMC_CH1) Reserved +AT91C_PWMC_CH1_CUPDR EQU (0xFFFCC230) ;- (PWMC_CH1) Channel Update Register +AT91C_PWMC_CH1_CPRDR EQU (0xFFFCC228) ;- (PWMC_CH1) Channel Period Register +AT91C_PWMC_CH1_CCNTR EQU (0xFFFCC22C) ;- (PWMC_CH1) Channel Counter Register +AT91C_PWMC_CH1_CDTYR EQU (0xFFFCC224) ;- (PWMC_CH1) Channel Duty Cycle Register +AT91C_PWMC_CH1_CMR EQU (0xFFFCC220) ;- (PWMC_CH1) Channel Mode Register +// - ========== Register definition for PWMC_CH0 peripheral ========== +AT91C_PWMC_CH0_Reserved EQU (0xFFFCC214) ;- (PWMC_CH0) Reserved +AT91C_PWMC_CH0_CPRDR EQU (0xFFFCC208) ;- (PWMC_CH0) Channel Period Register +AT91C_PWMC_CH0_CDTYR EQU (0xFFFCC204) ;- (PWMC_CH0) Channel Duty Cycle Register +AT91C_PWMC_CH0_CMR EQU (0xFFFCC200) ;- (PWMC_CH0) Channel Mode Register +AT91C_PWMC_CH0_CUPDR EQU (0xFFFCC210) ;- (PWMC_CH0) Channel Update Register +AT91C_PWMC_CH0_CCNTR EQU (0xFFFCC20C) ;- (PWMC_CH0) Channel Counter Register +// - ========== Register definition for PWMC peripheral ========== +AT91C_PWMC_IDR EQU (0xFFFCC014) ;- (PWMC) PWMC Interrupt Disable Register +AT91C_PWMC_DIS EQU (0xFFFCC008) ;- (PWMC) PWMC Disable Register +AT91C_PWMC_IER EQU (0xFFFCC010) ;- (PWMC) PWMC Interrupt Enable Register +AT91C_PWMC_VR EQU (0xFFFCC0FC) ;- (PWMC) PWMC Version Register +AT91C_PWMC_ISR EQU (0xFFFCC01C) ;- (PWMC) PWMC Interrupt Status Register +AT91C_PWMC_SR EQU (0xFFFCC00C) ;- (PWMC) PWMC Status Register +AT91C_PWMC_IMR EQU (0xFFFCC018) ;- (PWMC) PWMC Interrupt Mask Register +AT91C_PWMC_MR EQU (0xFFFCC000) ;- (PWMC) PWMC Mode Register +AT91C_PWMC_ENA EQU (0xFFFCC004) ;- (PWMC) PWMC Enable Register +// - ========== Register definition for UDP peripheral ========== +AT91C_UDP_IMR EQU (0xFFFB0018) ;- (UDP) Interrupt Mask Register +AT91C_UDP_FADDR EQU (0xFFFB0008) ;- (UDP) Function Address Register +AT91C_UDP_NUM EQU (0xFFFB0000) ;- (UDP) Frame Number Register +AT91C_UDP_FDR EQU (0xFFFB0050) ;- (UDP) Endpoint FIFO Data Register +AT91C_UDP_ISR EQU (0xFFFB001C) ;- (UDP) Interrupt Status Register +AT91C_UDP_CSR EQU (0xFFFB0030) ;- (UDP) Endpoint Control and Status Register +AT91C_UDP_IDR EQU (0xFFFB0014) ;- (UDP) Interrupt Disable Register +AT91C_UDP_ICR EQU (0xFFFB0020) ;- (UDP) Interrupt Clear Register +AT91C_UDP_RSTEP EQU (0xFFFB0028) ;- (UDP) Reset Endpoint Register +AT91C_UDP_TXVC EQU (0xFFFB0074) ;- (UDP) Transceiver Control Register +AT91C_UDP_GLBSTATE EQU (0xFFFB0004) ;- (UDP) Global State Register +AT91C_UDP_IER EQU (0xFFFB0010) ;- (UDP) Interrupt Enable Register +// - ========== Register definition for TC0 peripheral ========== +AT91C_TC0_SR EQU (0xFFFA0020) ;- (TC0) Status Register +AT91C_TC0_RC EQU (0xFFFA001C) ;- (TC0) Register C +AT91C_TC0_RB EQU (0xFFFA0018) ;- (TC0) Register B +AT91C_TC0_CCR EQU (0xFFFA0000) ;- (TC0) Channel Control Register +AT91C_TC0_CMR EQU (0xFFFA0004) ;- (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +AT91C_TC0_IER EQU (0xFFFA0024) ;- (TC0) Interrupt Enable Register +AT91C_TC0_RA EQU (0xFFFA0014) ;- (TC0) Register A +AT91C_TC0_IDR EQU (0xFFFA0028) ;- (TC0) Interrupt Disable Register +AT91C_TC0_CV EQU (0xFFFA0010) ;- (TC0) Counter Value +AT91C_TC0_IMR EQU (0xFFFA002C) ;- (TC0) Interrupt Mask Register +// - ========== Register definition for TC1 peripheral ========== +AT91C_TC1_RB EQU (0xFFFA0058) ;- (TC1) Register B +AT91C_TC1_CCR EQU (0xFFFA0040) ;- (TC1) Channel Control Register +AT91C_TC1_IER EQU (0xFFFA0064) ;- (TC1) Interrupt Enable Register +AT91C_TC1_IDR EQU (0xFFFA0068) ;- (TC1) Interrupt Disable Register +AT91C_TC1_SR EQU (0xFFFA0060) ;- (TC1) Status Register +AT91C_TC1_CMR EQU (0xFFFA0044) ;- (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +AT91C_TC1_RA EQU (0xFFFA0054) ;- (TC1) Register A +AT91C_TC1_RC EQU (0xFFFA005C) ;- (TC1) Register C +AT91C_TC1_IMR EQU (0xFFFA006C) ;- (TC1) Interrupt Mask Register +AT91C_TC1_CV EQU (0xFFFA0050) ;- (TC1) Counter Value +// - ========== Register definition for TC2 peripheral ========== +AT91C_TC2_CMR EQU (0xFFFA0084) ;- (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +AT91C_TC2_CCR EQU (0xFFFA0080) ;- (TC2) Channel Control Register +AT91C_TC2_CV EQU (0xFFFA0090) ;- (TC2) Counter Value +AT91C_TC2_RA EQU (0xFFFA0094) ;- (TC2) Register A +AT91C_TC2_RB EQU (0xFFFA0098) ;- (TC2) Register B +AT91C_TC2_IDR EQU (0xFFFA00A8) ;- (TC2) Interrupt Disable Register +AT91C_TC2_IMR EQU (0xFFFA00AC) ;- (TC2) Interrupt Mask Register +AT91C_TC2_RC EQU (0xFFFA009C) ;- (TC2) Register C +AT91C_TC2_IER EQU (0xFFFA00A4) ;- (TC2) Interrupt Enable Register +AT91C_TC2_SR EQU (0xFFFA00A0) ;- (TC2) Status Register +// - ========== Register definition for TCB peripheral ========== +AT91C_TCB_BMR EQU (0xFFFA00C4) ;- (TCB) TC Block Mode Register +AT91C_TCB_BCR EQU (0xFFFA00C0) ;- (TCB) TC Block Control Register +// - ========== Register definition for CAN_MB0 peripheral ========== +AT91C_CAN_MB0_MDL EQU (0xFFFD0214) ;- (CAN_MB0) MailBox Data Low Register +AT91C_CAN_MB0_MAM EQU (0xFFFD0204) ;- (CAN_MB0) MailBox Acceptance Mask Register +AT91C_CAN_MB0_MCR EQU (0xFFFD021C) ;- (CAN_MB0) MailBox Control Register +AT91C_CAN_MB0_MID EQU (0xFFFD0208) ;- (CAN_MB0) MailBox ID Register +AT91C_CAN_MB0_MSR EQU (0xFFFD0210) ;- (CAN_MB0) MailBox Status Register +AT91C_CAN_MB0_MFID EQU (0xFFFD020C) ;- (CAN_MB0) MailBox Family ID Register +AT91C_CAN_MB0_MDH EQU (0xFFFD0218) ;- (CAN_MB0) MailBox Data High Register +AT91C_CAN_MB0_MMR EQU (0xFFFD0200) ;- (CAN_MB0) MailBox Mode Register +// - ========== Register definition for CAN_MB1 peripheral ========== +AT91C_CAN_MB1_MDL EQU (0xFFFD0234) ;- (CAN_MB1) MailBox Data Low Register +AT91C_CAN_MB1_MID EQU (0xFFFD0228) ;- (CAN_MB1) MailBox ID Register +AT91C_CAN_MB1_MMR EQU (0xFFFD0220) ;- (CAN_MB1) MailBox Mode Register +AT91C_CAN_MB1_MSR EQU (0xFFFD0230) ;- (CAN_MB1) MailBox Status Register +AT91C_CAN_MB1_MAM EQU (0xFFFD0224) ;- (CAN_MB1) MailBox Acceptance Mask Register +AT91C_CAN_MB1_MDH EQU (0xFFFD0238) ;- (CAN_MB1) MailBox Data High Register +AT91C_CAN_MB1_MCR EQU (0xFFFD023C) ;- (CAN_MB1) MailBox Control Register +AT91C_CAN_MB1_MFID EQU (0xFFFD022C) ;- (CAN_MB1) MailBox Family ID Register +// - ========== Register definition for CAN_MB2 peripheral ========== +AT91C_CAN_MB2_MCR EQU (0xFFFD025C) ;- (CAN_MB2) MailBox Control Register +AT91C_CAN_MB2_MDH EQU (0xFFFD0258) ;- (CAN_MB2) MailBox Data High Register +AT91C_CAN_MB2_MID EQU (0xFFFD0248) ;- (CAN_MB2) MailBox ID Register +AT91C_CAN_MB2_MDL EQU (0xFFFD0254) ;- (CAN_MB2) MailBox Data Low Register +AT91C_CAN_MB2_MMR EQU (0xFFFD0240) ;- (CAN_MB2) MailBox Mode Register +AT91C_CAN_MB2_MAM EQU (0xFFFD0244) ;- (CAN_MB2) MailBox Acceptance Mask Register +AT91C_CAN_MB2_MFID EQU (0xFFFD024C) ;- (CAN_MB2) MailBox Family ID Register +AT91C_CAN_MB2_MSR EQU (0xFFFD0250) ;- (CAN_MB2) MailBox Status Register +// - ========== Register definition for CAN_MB3 peripheral ========== +AT91C_CAN_MB3_MFID EQU (0xFFFD026C) ;- (CAN_MB3) MailBox Family ID Register +AT91C_CAN_MB3_MAM EQU (0xFFFD0264) ;- (CAN_MB3) MailBox Acceptance Mask Register +AT91C_CAN_MB3_MID EQU (0xFFFD0268) ;- (CAN_MB3) MailBox ID Register +AT91C_CAN_MB3_MCR EQU (0xFFFD027C) ;- (CAN_MB3) MailBox Control Register +AT91C_CAN_MB3_MMR EQU (0xFFFD0260) ;- (CAN_MB3) MailBox Mode Register +AT91C_CAN_MB3_MSR EQU (0xFFFD0270) ;- (CAN_MB3) MailBox Status Register +AT91C_CAN_MB3_MDL EQU (0xFFFD0274) ;- (CAN_MB3) MailBox Data Low Register +AT91C_CAN_MB3_MDH EQU (0xFFFD0278) ;- (CAN_MB3) MailBox Data High Register +// - ========== Register definition for CAN_MB4 peripheral ========== +AT91C_CAN_MB4_MID EQU (0xFFFD0288) ;- (CAN_MB4) MailBox ID Register +AT91C_CAN_MB4_MMR EQU (0xFFFD0280) ;- (CAN_MB4) MailBox Mode Register +AT91C_CAN_MB4_MDH EQU (0xFFFD0298) ;- (CAN_MB4) MailBox Data High Register +AT91C_CAN_MB4_MFID EQU (0xFFFD028C) ;- (CAN_MB4) MailBox Family ID Register +AT91C_CAN_MB4_MSR EQU (0xFFFD0290) ;- (CAN_MB4) MailBox Status Register +AT91C_CAN_MB4_MCR EQU (0xFFFD029C) ;- (CAN_MB4) MailBox Control Register +AT91C_CAN_MB4_MDL EQU (0xFFFD0294) ;- (CAN_MB4) MailBox Data Low Register +AT91C_CAN_MB4_MAM EQU (0xFFFD0284) ;- (CAN_MB4) MailBox Acceptance Mask Register +// - ========== Register definition for CAN_MB5 peripheral ========== +AT91C_CAN_MB5_MSR EQU (0xFFFD02B0) ;- (CAN_MB5) MailBox Status Register +AT91C_CAN_MB5_MCR EQU (0xFFFD02BC) ;- (CAN_MB5) MailBox Control Register +AT91C_CAN_MB5_MFID EQU (0xFFFD02AC) ;- (CAN_MB5) MailBox Family ID Register +AT91C_CAN_MB5_MDH EQU (0xFFFD02B8) ;- (CAN_MB5) MailBox Data High Register +AT91C_CAN_MB5_MID EQU (0xFFFD02A8) ;- (CAN_MB5) MailBox ID Register +AT91C_CAN_MB5_MMR EQU (0xFFFD02A0) ;- (CAN_MB5) MailBox Mode Register +AT91C_CAN_MB5_MDL EQU (0xFFFD02B4) ;- (CAN_MB5) MailBox Data Low Register +AT91C_CAN_MB5_MAM EQU (0xFFFD02A4) ;- (CAN_MB5) MailBox Acceptance Mask Register +// - ========== Register definition for CAN_MB6 peripheral ========== +AT91C_CAN_MB6_MFID EQU (0xFFFD02CC) ;- (CAN_MB6) MailBox Family ID Register +AT91C_CAN_MB6_MID EQU (0xFFFD02C8) ;- (CAN_MB6) MailBox ID Register +AT91C_CAN_MB6_MAM EQU (0xFFFD02C4) ;- (CAN_MB6) MailBox Acceptance Mask Register +AT91C_CAN_MB6_MSR EQU (0xFFFD02D0) ;- (CAN_MB6) MailBox Status Register +AT91C_CAN_MB6_MDL EQU (0xFFFD02D4) ;- (CAN_MB6) MailBox Data Low Register +AT91C_CAN_MB6_MCR EQU (0xFFFD02DC) ;- (CAN_MB6) MailBox Control Register +AT91C_CAN_MB6_MDH EQU (0xFFFD02D8) ;- (CAN_MB6) MailBox Data High Register +AT91C_CAN_MB6_MMR EQU (0xFFFD02C0) ;- (CAN_MB6) MailBox Mode Register +// - ========== Register definition for CAN_MB7 peripheral ========== +AT91C_CAN_MB7_MCR EQU (0xFFFD02FC) ;- (CAN_MB7) MailBox Control Register +AT91C_CAN_MB7_MDH EQU (0xFFFD02F8) ;- (CAN_MB7) MailBox Data High Register +AT91C_CAN_MB7_MFID EQU (0xFFFD02EC) ;- (CAN_MB7) MailBox Family ID Register +AT91C_CAN_MB7_MDL EQU (0xFFFD02F4) ;- (CAN_MB7) MailBox Data Low Register +AT91C_CAN_MB7_MID EQU (0xFFFD02E8) ;- (CAN_MB7) MailBox ID Register +AT91C_CAN_MB7_MMR EQU (0xFFFD02E0) ;- (CAN_MB7) MailBox Mode Register +AT91C_CAN_MB7_MAM EQU (0xFFFD02E4) ;- (CAN_MB7) MailBox Acceptance Mask Register +AT91C_CAN_MB7_MSR EQU (0xFFFD02F0) ;- (CAN_MB7) MailBox Status Register +// - ========== Register definition for CAN peripheral ========== +AT91C_CAN_TCR EQU (0xFFFD0024) ;- (CAN) Transfer Command Register +AT91C_CAN_IMR EQU (0xFFFD000C) ;- (CAN) Interrupt Mask Register +AT91C_CAN_IER EQU (0xFFFD0004) ;- (CAN) Interrupt Enable Register +AT91C_CAN_ECR EQU (0xFFFD0020) ;- (CAN) Error Counter Register +AT91C_CAN_TIMESTP EQU (0xFFFD001C) ;- (CAN) Time Stamp Register +AT91C_CAN_MR EQU (0xFFFD0000) ;- (CAN) Mode Register +AT91C_CAN_IDR EQU (0xFFFD0008) ;- (CAN) Interrupt Disable Register +AT91C_CAN_ACR EQU (0xFFFD0028) ;- (CAN) Abort Command Register +AT91C_CAN_TIM EQU (0xFFFD0018) ;- (CAN) Timer Register +AT91C_CAN_SR EQU (0xFFFD0010) ;- (CAN) Status Register +AT91C_CAN_BR EQU (0xFFFD0014) ;- (CAN) Baudrate Register +AT91C_CAN_VR EQU (0xFFFD00FC) ;- (CAN) Version Register +// - ========== Register definition for EMAC peripheral ========== +AT91C_EMAC_ISR EQU (0xFFFDC024) ;- (EMAC) Interrupt Status Register +AT91C_EMAC_SA4H EQU (0xFFFDC0B4) ;- (EMAC) Specific Address 4 Top, Last 2 bytes +AT91C_EMAC_SA1L EQU (0xFFFDC098) ;- (EMAC) Specific Address 1 Bottom, First 4 bytes +AT91C_EMAC_ELE EQU (0xFFFDC078) ;- (EMAC) Excessive Length Errors Register +AT91C_EMAC_LCOL EQU (0xFFFDC05C) ;- (EMAC) Late Collision Register +AT91C_EMAC_RLE EQU (0xFFFDC088) ;- (EMAC) Receive Length Field Mismatch Register +AT91C_EMAC_WOL EQU (0xFFFDC0C4) ;- (EMAC) Wake On LAN Register +AT91C_EMAC_DTF EQU (0xFFFDC058) ;- (EMAC) Deferred Transmission Frame Register +AT91C_EMAC_TUND EQU (0xFFFDC064) ;- (EMAC) Transmit Underrun Error Register +AT91C_EMAC_NCR EQU (0xFFFDC000) ;- (EMAC) Network Control Register +AT91C_EMAC_SA4L EQU (0xFFFDC0B0) ;- (EMAC) Specific Address 4 Bottom, First 4 bytes +AT91C_EMAC_RSR EQU (0xFFFDC020) ;- (EMAC) Receive Status Register +AT91C_EMAC_SA3L EQU (0xFFFDC0A8) ;- (EMAC) Specific Address 3 Bottom, First 4 bytes +AT91C_EMAC_TSR EQU (0xFFFDC014) ;- (EMAC) Transmit Status Register +AT91C_EMAC_IDR EQU (0xFFFDC02C) ;- (EMAC) Interrupt Disable Register +AT91C_EMAC_RSE EQU (0xFFFDC074) ;- (EMAC) Receive Symbol Errors Register +AT91C_EMAC_ECOL EQU (0xFFFDC060) ;- (EMAC) Excessive Collision Register +AT91C_EMAC_TID EQU (0xFFFDC0B8) ;- (EMAC) Type ID Checking Register +AT91C_EMAC_HRB EQU (0xFFFDC090) ;- (EMAC) Hash Address Bottom[31:0] +AT91C_EMAC_TBQP EQU (0xFFFDC01C) ;- (EMAC) Transmit Buffer Queue Pointer +AT91C_EMAC_USRIO EQU (0xFFFDC0C0) ;- (EMAC) USER Input/Output Register +AT91C_EMAC_PTR EQU (0xFFFDC038) ;- (EMAC) Pause Time Register +AT91C_EMAC_SA2H EQU (0xFFFDC0A4) ;- (EMAC) Specific Address 2 Top, Last 2 bytes +AT91C_EMAC_ROV EQU (0xFFFDC070) ;- (EMAC) Receive Overrun Errors Register +AT91C_EMAC_ALE EQU (0xFFFDC054) ;- (EMAC) Alignment Error Register +AT91C_EMAC_RJA EQU (0xFFFDC07C) ;- (EMAC) Receive Jabbers Register +AT91C_EMAC_RBQP EQU (0xFFFDC018) ;- (EMAC) Receive Buffer Queue Pointer +AT91C_EMAC_TPF EQU (0xFFFDC08C) ;- (EMAC) Transmitted Pause Frames Register +AT91C_EMAC_NCFGR EQU (0xFFFDC004) ;- (EMAC) Network Configuration Register +AT91C_EMAC_HRT EQU (0xFFFDC094) ;- (EMAC) Hash Address Top[63:32] +AT91C_EMAC_USF EQU (0xFFFDC080) ;- (EMAC) Undersize Frames Register +AT91C_EMAC_FCSE EQU (0xFFFDC050) ;- (EMAC) Frame Check Sequence Error Register +AT91C_EMAC_TPQ EQU (0xFFFDC0BC) ;- (EMAC) Transmit Pause Quantum Register +AT91C_EMAC_MAN EQU (0xFFFDC034) ;- (EMAC) PHY Maintenance Register +AT91C_EMAC_FTO EQU (0xFFFDC040) ;- (EMAC) Frames Transmitted OK Register +AT91C_EMAC_REV EQU (0xFFFDC0FC) ;- (EMAC) Revision Register +AT91C_EMAC_IMR EQU (0xFFFDC030) ;- (EMAC) Interrupt Mask Register +AT91C_EMAC_SCF EQU (0xFFFDC044) ;- (EMAC) Single Collision Frame Register +AT91C_EMAC_PFR EQU (0xFFFDC03C) ;- (EMAC) Pause Frames received Register +AT91C_EMAC_MCF EQU (0xFFFDC048) ;- (EMAC) Multiple Collision Frame Register +AT91C_EMAC_NSR EQU (0xFFFDC008) ;- (EMAC) Network Status Register +AT91C_EMAC_SA2L EQU (0xFFFDC0A0) ;- (EMAC) Specific Address 2 Bottom, First 4 bytes +AT91C_EMAC_FRO EQU (0xFFFDC04C) ;- (EMAC) Frames Received OK Register +AT91C_EMAC_IER EQU (0xFFFDC028) ;- (EMAC) Interrupt Enable Register +AT91C_EMAC_SA1H EQU (0xFFFDC09C) ;- (EMAC) Specific Address 1 Top, Last 2 bytes +AT91C_EMAC_CSE EQU (0xFFFDC068) ;- (EMAC) Carrier Sense Error Register +AT91C_EMAC_SA3H EQU (0xFFFDC0AC) ;- (EMAC) Specific Address 3 Top, Last 2 bytes +AT91C_EMAC_RRE EQU (0xFFFDC06C) ;- (EMAC) Receive Ressource Error Register +AT91C_EMAC_STE EQU (0xFFFDC084) ;- (EMAC) SQE Test Error Register +// - ========== Register definition for PDC_ADC peripheral ========== +AT91C_ADC_PTSR EQU (0xFFFD8124) ;- (PDC_ADC) PDC Transfer Status Register +AT91C_ADC_PTCR EQU (0xFFFD8120) ;- (PDC_ADC) PDC Transfer Control Register +AT91C_ADC_TNPR EQU (0xFFFD8118) ;- (PDC_ADC) Transmit Next Pointer Register +AT91C_ADC_TNCR EQU (0xFFFD811C) ;- (PDC_ADC) Transmit Next Counter Register +AT91C_ADC_RNPR EQU (0xFFFD8110) ;- (PDC_ADC) Receive Next Pointer Register +AT91C_ADC_RNCR EQU (0xFFFD8114) ;- (PDC_ADC) Receive Next Counter Register +AT91C_ADC_RPR EQU (0xFFFD8100) ;- (PDC_ADC) Receive Pointer Register +AT91C_ADC_TCR EQU (0xFFFD810C) ;- (PDC_ADC) Transmit Counter Register +AT91C_ADC_TPR EQU (0xFFFD8108) ;- (PDC_ADC) Transmit Pointer Register +AT91C_ADC_RCR EQU (0xFFFD8104) ;- (PDC_ADC) Receive Counter Register +// - ========== Register definition for ADC peripheral ========== +AT91C_ADC_CDR2 EQU (0xFFFD8038) ;- (ADC) ADC Channel Data Register 2 +AT91C_ADC_CDR3 EQU (0xFFFD803C) ;- (ADC) ADC Channel Data Register 3 +AT91C_ADC_CDR0 EQU (0xFFFD8030) ;- (ADC) ADC Channel Data Register 0 +AT91C_ADC_CDR5 EQU (0xFFFD8044) ;- (ADC) ADC Channel Data Register 5 +AT91C_ADC_CHDR EQU (0xFFFD8014) ;- (ADC) ADC Channel Disable Register +AT91C_ADC_SR EQU (0xFFFD801C) ;- (ADC) ADC Status Register +AT91C_ADC_CDR4 EQU (0xFFFD8040) ;- (ADC) ADC Channel Data Register 4 +AT91C_ADC_CDR1 EQU (0xFFFD8034) ;- (ADC) ADC Channel Data Register 1 +AT91C_ADC_LCDR EQU (0xFFFD8020) ;- (ADC) ADC Last Converted Data Register +AT91C_ADC_IDR EQU (0xFFFD8028) ;- (ADC) ADC Interrupt Disable Register +AT91C_ADC_CR EQU (0xFFFD8000) ;- (ADC) ADC Control Register +AT91C_ADC_CDR7 EQU (0xFFFD804C) ;- (ADC) ADC Channel Data Register 7 +AT91C_ADC_CDR6 EQU (0xFFFD8048) ;- (ADC) ADC Channel Data Register 6 +AT91C_ADC_IER EQU (0xFFFD8024) ;- (ADC) ADC Interrupt Enable Register +AT91C_ADC_CHER EQU (0xFFFD8010) ;- (ADC) ADC Channel Enable Register +AT91C_ADC_CHSR EQU (0xFFFD8018) ;- (ADC) ADC Channel Status Register +AT91C_ADC_MR EQU (0xFFFD8004) ;- (ADC) ADC Mode Register +AT91C_ADC_IMR EQU (0xFFFD802C) ;- (ADC) ADC Interrupt Mask Register +// - ========== Register definition for PDC_AES peripheral ========== +AT91C_AES_TPR EQU (0xFFFA4108) ;- (PDC_AES) Transmit Pointer Register +AT91C_AES_PTCR EQU (0xFFFA4120) ;- (PDC_AES) PDC Transfer Control Register +AT91C_AES_RNPR EQU (0xFFFA4110) ;- (PDC_AES) Receive Next Pointer Register +AT91C_AES_TNCR EQU (0xFFFA411C) ;- (PDC_AES) Transmit Next Counter Register +AT91C_AES_TCR EQU (0xFFFA410C) ;- (PDC_AES) Transmit Counter Register +AT91C_AES_RCR EQU (0xFFFA4104) ;- (PDC_AES) Receive Counter Register +AT91C_AES_RNCR EQU (0xFFFA4114) ;- (PDC_AES) Receive Next Counter Register +AT91C_AES_TNPR EQU (0xFFFA4118) ;- (PDC_AES) Transmit Next Pointer Register +AT91C_AES_RPR EQU (0xFFFA4100) ;- (PDC_AES) Receive Pointer Register +AT91C_AES_PTSR EQU (0xFFFA4124) ;- (PDC_AES) PDC Transfer Status Register +// - ========== Register definition for AES peripheral ========== +AT91C_AES_IVxR EQU (0xFFFA4060) ;- (AES) Initialization Vector x Register +AT91C_AES_MR EQU (0xFFFA4004) ;- (AES) Mode Register +AT91C_AES_VR EQU (0xFFFA40FC) ;- (AES) AES Version Register +AT91C_AES_ODATAxR EQU (0xFFFA4050) ;- (AES) Output Data x Register +AT91C_AES_IDATAxR EQU (0xFFFA4040) ;- (AES) Input Data x Register +AT91C_AES_CR EQU (0xFFFA4000) ;- (AES) Control Register +AT91C_AES_IDR EQU (0xFFFA4014) ;- (AES) Interrupt Disable Register +AT91C_AES_IMR EQU (0xFFFA4018) ;- (AES) Interrupt Mask Register +AT91C_AES_IER EQU (0xFFFA4010) ;- (AES) Interrupt Enable Register +AT91C_AES_KEYWxR EQU (0xFFFA4020) ;- (AES) Key Word x Register +AT91C_AES_ISR EQU (0xFFFA401C) ;- (AES) Interrupt Status Register +// - ========== Register definition for PDC_TDES peripheral ========== +AT91C_TDES_RNCR EQU (0xFFFA8114) ;- (PDC_TDES) Receive Next Counter Register +AT91C_TDES_TCR EQU (0xFFFA810C) ;- (PDC_TDES) Transmit Counter Register +AT91C_TDES_RCR EQU (0xFFFA8104) ;- (PDC_TDES) Receive Counter Register +AT91C_TDES_TNPR EQU (0xFFFA8118) ;- (PDC_TDES) Transmit Next Pointer Register +AT91C_TDES_RNPR EQU (0xFFFA8110) ;- (PDC_TDES) Receive Next Pointer Register +AT91C_TDES_RPR EQU (0xFFFA8100) ;- (PDC_TDES) Receive Pointer Register +AT91C_TDES_TNCR EQU (0xFFFA811C) ;- (PDC_TDES) Transmit Next Counter Register +AT91C_TDES_TPR EQU (0xFFFA8108) ;- (PDC_TDES) Transmit Pointer Register +AT91C_TDES_PTSR EQU (0xFFFA8124) ;- (PDC_TDES) PDC Transfer Status Register +AT91C_TDES_PTCR EQU (0xFFFA8120) ;- (PDC_TDES) PDC Transfer Control Register +// - ========== Register definition for TDES peripheral ========== +AT91C_TDES_KEY2WxR EQU (0xFFFA8028) ;- (TDES) Key 2 Word x Register +AT91C_TDES_KEY3WxR EQU (0xFFFA8030) ;- (TDES) Key 3 Word x Register +AT91C_TDES_IDR EQU (0xFFFA8014) ;- (TDES) Interrupt Disable Register +AT91C_TDES_VR EQU (0xFFFA80FC) ;- (TDES) TDES Version Register +AT91C_TDES_IVxR EQU (0xFFFA8060) ;- (TDES) Initialization Vector x Register +AT91C_TDES_ODATAxR EQU (0xFFFA8050) ;- (TDES) Output Data x Register +AT91C_TDES_IMR EQU (0xFFFA8018) ;- (TDES) Interrupt Mask Register +AT91C_TDES_MR EQU (0xFFFA8004) ;- (TDES) Mode Register +AT91C_TDES_CR EQU (0xFFFA8000) ;- (TDES) Control Register +AT91C_TDES_IER EQU (0xFFFA8010) ;- (TDES) Interrupt Enable Register +AT91C_TDES_ISR EQU (0xFFFA801C) ;- (TDES) Interrupt Status Register +AT91C_TDES_IDATAxR EQU (0xFFFA8040) ;- (TDES) Input Data x Register +AT91C_TDES_KEY1WxR EQU (0xFFFA8020) ;- (TDES) Key 1 Word x Register + +// - ***************************************************************************** +// - PIO DEFINITIONS FOR AT91SAM7X256 +// - ***************************************************************************** +AT91C_PIO_PA0 EQU (1 << 0) ;- Pin Controlled by PA0 +AT91C_PA0_RXD0 EQU (AT91C_PIO_PA0) ;- USART 0 Receive Data +AT91C_PIO_PA1 EQU (1 << 1) ;- Pin Controlled by PA1 +AT91C_PA1_TXD0 EQU (AT91C_PIO_PA1) ;- USART 0 Transmit Data +AT91C_PIO_PA10 EQU (1 << 10) ;- Pin Controlled by PA10 +AT91C_PA10_TWD EQU (AT91C_PIO_PA10) ;- TWI Two-wire Serial Data +AT91C_PIO_PA11 EQU (1 << 11) ;- Pin Controlled by PA11 +AT91C_PA11_TWCK EQU (AT91C_PIO_PA11) ;- TWI Two-wire Serial Clock +AT91C_PIO_PA12 EQU (1 << 12) ;- Pin Controlled by PA12 +AT91C_PA12_NPCS00 EQU (AT91C_PIO_PA12) ;- SPI 0 Peripheral Chip Select 0 +AT91C_PIO_PA13 EQU (1 << 13) ;- Pin Controlled by PA13 +AT91C_PA13_NPCS01 EQU (AT91C_PIO_PA13) ;- SPI 0 Peripheral Chip Select 1 +AT91C_PA13_PCK1 EQU (AT91C_PIO_PA13) ;- PMC Programmable Clock Output 1 +AT91C_PIO_PA14 EQU (1 << 14) ;- Pin Controlled by PA14 +AT91C_PA14_NPCS02 EQU (AT91C_PIO_PA14) ;- SPI 0 Peripheral Chip Select 2 +AT91C_PA14_IRQ1 EQU (AT91C_PIO_PA14) ;- External Interrupt 1 +AT91C_PIO_PA15 EQU (1 << 15) ;- Pin Controlled by PA15 +AT91C_PA15_NPCS03 EQU (AT91C_PIO_PA15) ;- SPI 0 Peripheral Chip Select 3 +AT91C_PA15_TCLK2 EQU (AT91C_PIO_PA15) ;- Timer Counter 2 external clock input +AT91C_PIO_PA16 EQU (1 << 16) ;- Pin Controlled by PA16 +AT91C_PA16_MISO0 EQU (AT91C_PIO_PA16) ;- SPI 0 Master In Slave +AT91C_PIO_PA17 EQU (1 << 17) ;- Pin Controlled by PA17 +AT91C_PA17_MOSI0 EQU (AT91C_PIO_PA17) ;- SPI 0 Master Out Slave +AT91C_PIO_PA18 EQU (1 << 18) ;- Pin Controlled by PA18 +AT91C_PA18_SPCK0 EQU (AT91C_PIO_PA18) ;- SPI 0 Serial Clock +AT91C_PIO_PA19 EQU (1 << 19) ;- Pin Controlled by PA19 +AT91C_PA19_CANRX EQU (AT91C_PIO_PA19) ;- CAN Receive +AT91C_PIO_PA2 EQU (1 << 2) ;- Pin Controlled by PA2 +AT91C_PA2_SCK0 EQU (AT91C_PIO_PA2) ;- USART 0 Serial Clock +AT91C_PA2_NPCS11 EQU (AT91C_PIO_PA2) ;- SPI 1 Peripheral Chip Select 1 +AT91C_PIO_PA20 EQU (1 << 20) ;- Pin Controlled by PA20 +AT91C_PA20_CANTX EQU (AT91C_PIO_PA20) ;- CAN Transmit +AT91C_PIO_PA21 EQU (1 << 21) ;- Pin Controlled by PA21 +AT91C_PA21_TF EQU (AT91C_PIO_PA21) ;- SSC Transmit Frame Sync +AT91C_PA21_NPCS10 EQU (AT91C_PIO_PA21) ;- SPI 1 Peripheral Chip Select 0 +AT91C_PIO_PA22 EQU (1 << 22) ;- Pin Controlled by PA22 +AT91C_PA22_TK EQU (AT91C_PIO_PA22) ;- SSC Transmit Clock +AT91C_PA22_SPCK1 EQU (AT91C_PIO_PA22) ;- SPI 1 Serial Clock +AT91C_PIO_PA23 EQU (1 << 23) ;- Pin Controlled by PA23 +AT91C_PA23_TD EQU (AT91C_PIO_PA23) ;- SSC Transmit data +AT91C_PA23_MOSI1 EQU (AT91C_PIO_PA23) ;- SPI 1 Master Out Slave +AT91C_PIO_PA24 EQU (1 << 24) ;- Pin Controlled by PA24 +AT91C_PA24_RD EQU (AT91C_PIO_PA24) ;- SSC Receive Data +AT91C_PA24_MISO1 EQU (AT91C_PIO_PA24) ;- SPI 1 Master In Slave +AT91C_PIO_PA25 EQU (1 << 25) ;- Pin Controlled by PA25 +AT91C_PA25_RK EQU (AT91C_PIO_PA25) ;- SSC Receive Clock +AT91C_PA25_NPCS11 EQU (AT91C_PIO_PA25) ;- SPI 1 Peripheral Chip Select 1 +AT91C_PIO_PA26 EQU (1 << 26) ;- Pin Controlled by PA26 +AT91C_PA26_RF EQU (AT91C_PIO_PA26) ;- SSC Receive Frame Sync +AT91C_PA26_NPCS12 EQU (AT91C_PIO_PA26) ;- SPI 1 Peripheral Chip Select 2 +AT91C_PIO_PA27 EQU (1 << 27) ;- Pin Controlled by PA27 +AT91C_PA27_DRXD EQU (AT91C_PIO_PA27) ;- DBGU Debug Receive Data +AT91C_PA27_PCK3 EQU (AT91C_PIO_PA27) ;- PMC Programmable Clock Output 3 +AT91C_PIO_PA28 EQU (1 << 28) ;- Pin Controlled by PA28 +AT91C_PA28_DTXD EQU (AT91C_PIO_PA28) ;- DBGU Debug Transmit Data +AT91C_PIO_PA29 EQU (1 << 29) ;- Pin Controlled by PA29 +AT91C_PA29_FIQ EQU (AT91C_PIO_PA29) ;- AIC Fast Interrupt Input +AT91C_PA29_NPCS13 EQU (AT91C_PIO_PA29) ;- SPI 1 Peripheral Chip Select 3 +AT91C_PIO_PA3 EQU (1 << 3) ;- Pin Controlled by PA3 +AT91C_PA3_RTS0 EQU (AT91C_PIO_PA3) ;- USART 0 Ready To Send +AT91C_PA3_NPCS12 EQU (AT91C_PIO_PA3) ;- SPI 1 Peripheral Chip Select 2 +AT91C_PIO_PA30 EQU (1 << 30) ;- Pin Controlled by PA30 +AT91C_PA30_IRQ0 EQU (AT91C_PIO_PA30) ;- External Interrupt 0 +AT91C_PA30_PCK2 EQU (AT91C_PIO_PA30) ;- PMC Programmable Clock Output 2 +AT91C_PIO_PA4 EQU (1 << 4) ;- Pin Controlled by PA4 +AT91C_PA4_CTS0 EQU (AT91C_PIO_PA4) ;- USART 0 Clear To Send +AT91C_PA4_NPCS13 EQU (AT91C_PIO_PA4) ;- SPI 1 Peripheral Chip Select 3 +AT91C_PIO_PA5 EQU (1 << 5) ;- Pin Controlled by PA5 +AT91C_PA5_RXD1 EQU (AT91C_PIO_PA5) ;- USART 1 Receive Data +AT91C_PIO_PA6 EQU (1 << 6) ;- Pin Controlled by PA6 +AT91C_PA6_TXD1 EQU (AT91C_PIO_PA6) ;- USART 1 Transmit Data +AT91C_PIO_PA7 EQU (1 << 7) ;- Pin Controlled by PA7 +AT91C_PA7_SCK1 EQU (AT91C_PIO_PA7) ;- USART 1 Serial Clock +AT91C_PA7_NPCS01 EQU (AT91C_PIO_PA7) ;- SPI 0 Peripheral Chip Select 1 +AT91C_PIO_PA8 EQU (1 << 8) ;- Pin Controlled by PA8 +AT91C_PA8_RTS1 EQU (AT91C_PIO_PA8) ;- USART 1 Ready To Send +AT91C_PA8_NPCS02 EQU (AT91C_PIO_PA8) ;- SPI 0 Peripheral Chip Select 2 +AT91C_PIO_PA9 EQU (1 << 9) ;- Pin Controlled by PA9 +AT91C_PA9_CTS1 EQU (AT91C_PIO_PA9) ;- USART 1 Clear To Send +AT91C_PA9_NPCS03 EQU (AT91C_PIO_PA9) ;- SPI 0 Peripheral Chip Select 3 +AT91C_PIO_PB0 EQU (1 << 0) ;- Pin Controlled by PB0 +AT91C_PB0_ETXCK_EREFCK EQU (AT91C_PIO_PB0) ;- Ethernet MAC Transmit Clock/Reference Clock +AT91C_PB0_PCK0 EQU (AT91C_PIO_PB0) ;- PMC Programmable Clock Output 0 +AT91C_PIO_PB1 EQU (1 << 1) ;- Pin Controlled by PB1 +AT91C_PB1_ETXEN EQU (AT91C_PIO_PB1) ;- Ethernet MAC Transmit Enable +AT91C_PIO_PB10 EQU (1 << 10) ;- Pin Controlled by PB10 +AT91C_PB10_ETX2 EQU (AT91C_PIO_PB10) ;- Ethernet MAC Transmit Data 2 +AT91C_PB10_NPCS11 EQU (AT91C_PIO_PB10) ;- SPI 1 Peripheral Chip Select 1 +AT91C_PIO_PB11 EQU (1 << 11) ;- Pin Controlled by PB11 +AT91C_PB11_ETX3 EQU (AT91C_PIO_PB11) ;- Ethernet MAC Transmit Data 3 +AT91C_PB11_NPCS12 EQU (AT91C_PIO_PB11) ;- SPI 1 Peripheral Chip Select 2 +AT91C_PIO_PB12 EQU (1 << 12) ;- Pin Controlled by PB12 +AT91C_PB12_ETXER EQU (AT91C_PIO_PB12) ;- Ethernet MAC Transmikt Coding Error +AT91C_PB12_TCLK0 EQU (AT91C_PIO_PB12) ;- Timer Counter 0 external clock input +AT91C_PIO_PB13 EQU (1 << 13) ;- Pin Controlled by PB13 +AT91C_PB13_ERX2 EQU (AT91C_PIO_PB13) ;- Ethernet MAC Receive Data 2 +AT91C_PB13_NPCS01 EQU (AT91C_PIO_PB13) ;- SPI 0 Peripheral Chip Select 1 +AT91C_PIO_PB14 EQU (1 << 14) ;- Pin Controlled by PB14 +AT91C_PB14_ERX3 EQU (AT91C_PIO_PB14) ;- Ethernet MAC Receive Data 3 +AT91C_PB14_NPCS02 EQU (AT91C_PIO_PB14) ;- SPI 0 Peripheral Chip Select 2 +AT91C_PIO_PB15 EQU (1 << 15) ;- Pin Controlled by PB15 +AT91C_PB15_ERXDV EQU (AT91C_PIO_PB15) ;- Ethernet MAC Receive Data Valid +AT91C_PIO_PB16 EQU (1 << 16) ;- Pin Controlled by PB16 +AT91C_PB16_ECOL EQU (AT91C_PIO_PB16) ;- Ethernet MAC Collision Detected +AT91C_PB16_NPCS13 EQU (AT91C_PIO_PB16) ;- SPI 1 Peripheral Chip Select 3 +AT91C_PIO_PB17 EQU (1 << 17) ;- Pin Controlled by PB17 +AT91C_PB17_ERXCK EQU (AT91C_PIO_PB17) ;- Ethernet MAC Receive Clock +AT91C_PB17_NPCS03 EQU (AT91C_PIO_PB17) ;- SPI 0 Peripheral Chip Select 3 +AT91C_PIO_PB18 EQU (1 << 18) ;- Pin Controlled by PB18 +AT91C_PB18_EF100 EQU (AT91C_PIO_PB18) ;- Ethernet MAC Force 100 Mbits/sec +AT91C_PB18_ADTRG EQU (AT91C_PIO_PB18) ;- ADC External Trigger +AT91C_PIO_PB19 EQU (1 << 19) ;- Pin Controlled by PB19 +AT91C_PB19_PWM0 EQU (AT91C_PIO_PB19) ;- PWM Channel 0 +AT91C_PB19_TCLK1 EQU (AT91C_PIO_PB19) ;- Timer Counter 1 external clock input +AT91C_PIO_PB2 EQU (1 << 2) ;- Pin Controlled by PB2 +AT91C_PB2_ETX0 EQU (AT91C_PIO_PB2) ;- Ethernet MAC Transmit Data 0 +AT91C_PIO_PB20 EQU (1 << 20) ;- Pin Controlled by PB20 +AT91C_PB20_PWM1 EQU (AT91C_PIO_PB20) ;- PWM Channel 1 +AT91C_PB20_PCK0 EQU (AT91C_PIO_PB20) ;- PMC Programmable Clock Output 0 +AT91C_PIO_PB21 EQU (1 << 21) ;- Pin Controlled by PB21 +AT91C_PB21_PWM2 EQU (AT91C_PIO_PB21) ;- PWM Channel 2 +AT91C_PB21_PCK1 EQU (AT91C_PIO_PB21) ;- PMC Programmable Clock Output 1 +AT91C_PIO_PB22 EQU (1 << 22) ;- Pin Controlled by PB22 +AT91C_PB22_PWM3 EQU (AT91C_PIO_PB22) ;- PWM Channel 3 +AT91C_PB22_PCK2 EQU (AT91C_PIO_PB22) ;- PMC Programmable Clock Output 2 +AT91C_PIO_PB23 EQU (1 << 23) ;- Pin Controlled by PB23 +AT91C_PB23_TIOA0 EQU (AT91C_PIO_PB23) ;- Timer Counter 0 Multipurpose Timer I/O Pin A +AT91C_PB23_DCD1 EQU (AT91C_PIO_PB23) ;- USART 1 Data Carrier Detect +AT91C_PIO_PB24 EQU (1 << 24) ;- Pin Controlled by PB24 +AT91C_PB24_TIOB0 EQU (AT91C_PIO_PB24) ;- Timer Counter 0 Multipurpose Timer I/O Pin B +AT91C_PB24_DSR1 EQU (AT91C_PIO_PB24) ;- USART 1 Data Set ready +AT91C_PIO_PB25 EQU (1 << 25) ;- Pin Controlled by PB25 +AT91C_PB25_TIOA1 EQU (AT91C_PIO_PB25) ;- Timer Counter 1 Multipurpose Timer I/O Pin A +AT91C_PB25_DTR1 EQU (AT91C_PIO_PB25) ;- USART 1 Data Terminal ready +AT91C_PIO_PB26 EQU (1 << 26) ;- Pin Controlled by PB26 +AT91C_PB26_TIOB1 EQU (AT91C_PIO_PB26) ;- Timer Counter 1 Multipurpose Timer I/O Pin B +AT91C_PB26_RI1 EQU (AT91C_PIO_PB26) ;- USART 1 Ring Indicator +AT91C_PIO_PB27 EQU (1 << 27) ;- Pin Controlled by PB27 +AT91C_PB27_TIOA2 EQU (AT91C_PIO_PB27) ;- Timer Counter 2 Multipurpose Timer I/O Pin A +AT91C_PB27_PWM0 EQU (AT91C_PIO_PB27) ;- PWM Channel 0 +AT91C_PIO_PB28 EQU (1 << 28) ;- Pin Controlled by PB28 +AT91C_PB28_TIOB2 EQU (AT91C_PIO_PB28) ;- Timer Counter 2 Multipurpose Timer I/O Pin B +AT91C_PB28_PWM1 EQU (AT91C_PIO_PB28) ;- PWM Channel 1 +AT91C_PIO_PB29 EQU (1 << 29) ;- Pin Controlled by PB29 +AT91C_PB29_PCK1 EQU (AT91C_PIO_PB29) ;- PMC Programmable Clock Output 1 +AT91C_PB29_PWM2 EQU (AT91C_PIO_PB29) ;- PWM Channel 2 +AT91C_PIO_PB3 EQU (1 << 3) ;- Pin Controlled by PB3 +AT91C_PB3_ETX1 EQU (AT91C_PIO_PB3) ;- Ethernet MAC Transmit Data 1 +AT91C_PIO_PB30 EQU (1 << 30) ;- Pin Controlled by PB30 +AT91C_PB30_PCK2 EQU (AT91C_PIO_PB30) ;- PMC Programmable Clock Output 2 +AT91C_PB30_PWM3 EQU (AT91C_PIO_PB30) ;- PWM Channel 3 +AT91C_PIO_PB4 EQU (1 << 4) ;- Pin Controlled by PB4 +AT91C_PB4_ECRS_ECRSDV EQU (AT91C_PIO_PB4) ;- Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +AT91C_PIO_PB5 EQU (1 << 5) ;- Pin Controlled by PB5 +AT91C_PB5_ERX0 EQU (AT91C_PIO_PB5) ;- Ethernet MAC Receive Data 0 +AT91C_PIO_PB6 EQU (1 << 6) ;- Pin Controlled by PB6 +AT91C_PB6_ERX1 EQU (AT91C_PIO_PB6) ;- Ethernet MAC Receive Data 1 +AT91C_PIO_PB7 EQU (1 << 7) ;- Pin Controlled by PB7 +AT91C_PB7_ERXER EQU (AT91C_PIO_PB7) ;- Ethernet MAC Receive Error +AT91C_PIO_PB8 EQU (1 << 8) ;- Pin Controlled by PB8 +AT91C_PB8_EMDC EQU (AT91C_PIO_PB8) ;- Ethernet MAC Management Data Clock +AT91C_PIO_PB9 EQU (1 << 9) ;- Pin Controlled by PB9 +AT91C_PB9_EMDIO EQU (AT91C_PIO_PB9) ;- Ethernet MAC Management Data Input/Output + +// - ***************************************************************************** +// - PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// - ***************************************************************************** +AT91C_ID_FIQ EQU ( 0) ;- Advanced Interrupt Controller (FIQ) +AT91C_ID_SYS EQU ( 1) ;- System Peripheral +AT91C_ID_PIOA EQU ( 2) ;- Parallel IO Controller A +AT91C_ID_PIOB EQU ( 3) ;- Parallel IO Controller B +AT91C_ID_SPI0 EQU ( 4) ;- Serial Peripheral Interface 0 +AT91C_ID_SPI1 EQU ( 5) ;- Serial Peripheral Interface 1 +AT91C_ID_US0 EQU ( 6) ;- USART 0 +AT91C_ID_US1 EQU ( 7) ;- USART 1 +AT91C_ID_SSC EQU ( 8) ;- Serial Synchronous Controller +AT91C_ID_TWI EQU ( 9) ;- Two-Wire Interface +AT91C_ID_PWMC EQU (10) ;- PWM Controller +AT91C_ID_UDP EQU (11) ;- USB Device Port +AT91C_ID_TC0 EQU (12) ;- Timer Counter 0 +AT91C_ID_TC1 EQU (13) ;- Timer Counter 1 +AT91C_ID_TC2 EQU (14) ;- Timer Counter 2 +AT91C_ID_CAN EQU (15) ;- Control Area Network Controller +AT91C_ID_EMAC EQU (16) ;- Ethernet MAC +AT91C_ID_ADC EQU (17) ;- Analog-to-Digital Converter +AT91C_ID_AES EQU (18) ;- Advanced Encryption Standard 128-bit +AT91C_ID_TDES EQU (19) ;- Triple Data Encryption Standard +AT91C_ID_20_Reserved EQU (20) ;- Reserved +AT91C_ID_21_Reserved EQU (21) ;- Reserved +AT91C_ID_22_Reserved EQU (22) ;- Reserved +AT91C_ID_23_Reserved EQU (23) ;- Reserved +AT91C_ID_24_Reserved EQU (24) ;- Reserved +AT91C_ID_25_Reserved EQU (25) ;- Reserved +AT91C_ID_26_Reserved EQU (26) ;- Reserved +AT91C_ID_27_Reserved EQU (27) ;- Reserved +AT91C_ID_28_Reserved EQU (28) ;- Reserved +AT91C_ID_29_Reserved EQU (29) ;- Reserved +AT91C_ID_IRQ0 EQU (30) ;- Advanced Interrupt Controller (IRQ0) +AT91C_ID_IRQ1 EQU (31) ;- Advanced Interrupt Controller (IRQ1) + +// - ***************************************************************************** +// - BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// - ***************************************************************************** +AT91C_BASE_SYS EQU (0xFFFFF000) ;- (SYS) Base Address +AT91C_BASE_AIC EQU (0xFFFFF000) ;- (AIC) Base Address +AT91C_BASE_PDC_DBGU EQU (0xFFFFF300) ;- (PDC_DBGU) Base Address +AT91C_BASE_DBGU EQU (0xFFFFF200) ;- (DBGU) Base Address +AT91C_BASE_PIOA EQU (0xFFFFF400) ;- (PIOA) Base Address +AT91C_BASE_PIOB EQU (0xFFFFF600) ;- (PIOB) Base Address +AT91C_BASE_CKGR EQU (0xFFFFFC20) ;- (CKGR) Base Address +AT91C_BASE_PMC EQU (0xFFFFFC00) ;- (PMC) Base Address +AT91C_BASE_RSTC EQU (0xFFFFFD00) ;- (RSTC) Base Address +AT91C_BASE_RTTC EQU (0xFFFFFD20) ;- (RTTC) Base Address +AT91C_BASE_PITC EQU (0xFFFFFD30) ;- (PITC) Base Address +AT91C_BASE_WDTC EQU (0xFFFFFD40) ;- (WDTC) Base Address +AT91C_BASE_VREG EQU (0xFFFFFD60) ;- (VREG) Base Address +AT91C_BASE_MC EQU (0xFFFFFF00) ;- (MC) Base Address +AT91C_BASE_PDC_SPI1 EQU (0xFFFE4100) ;- (PDC_SPI1) Base Address +AT91C_BASE_SPI1 EQU (0xFFFE4000) ;- (SPI1) Base Address +AT91C_BASE_PDC_SPI0 EQU (0xFFFE0100) ;- (PDC_SPI0) Base Address +AT91C_BASE_SPI0 EQU (0xFFFE0000) ;- (SPI0) Base Address +AT91C_BASE_PDC_US1 EQU (0xFFFC4100) ;- (PDC_US1) Base Address +AT91C_BASE_US1 EQU (0xFFFC4000) ;- (US1) Base Address +AT91C_BASE_PDC_US0 EQU (0xFFFC0100) ;- (PDC_US0) Base Address +AT91C_BASE_US0 EQU (0xFFFC0000) ;- (US0) Base Address +AT91C_BASE_PDC_SSC EQU (0xFFFD4100) ;- (PDC_SSC) Base Address +AT91C_BASE_SSC EQU (0xFFFD4000) ;- (SSC) Base Address +AT91C_BASE_TWI EQU (0xFFFB8000) ;- (TWI) Base Address +AT91C_BASE_PWMC_CH3 EQU (0xFFFCC260) ;- (PWMC_CH3) Base Address +AT91C_BASE_PWMC_CH2 EQU (0xFFFCC240) ;- (PWMC_CH2) Base Address +AT91C_BASE_PWMC_CH1 EQU (0xFFFCC220) ;- (PWMC_CH1) Base Address +AT91C_BASE_PWMC_CH0 EQU (0xFFFCC200) ;- (PWMC_CH0) Base Address +AT91C_BASE_PWMC EQU (0xFFFCC000) ;- (PWMC) Base Address +AT91C_BASE_UDP EQU (0xFFFB0000) ;- (UDP) Base Address +AT91C_BASE_TC0 EQU (0xFFFA0000) ;- (TC0) Base Address +AT91C_BASE_TC1 EQU (0xFFFA0040) ;- (TC1) Base Address +AT91C_BASE_TC2 EQU (0xFFFA0080) ;- (TC2) Base Address +AT91C_BASE_TCB EQU (0xFFFA0000) ;- (TCB) Base Address +AT91C_BASE_CAN_MB0 EQU (0xFFFD0200) ;- (CAN_MB0) Base Address +AT91C_BASE_CAN_MB1 EQU (0xFFFD0220) ;- (CAN_MB1) Base Address +AT91C_BASE_CAN_MB2 EQU (0xFFFD0240) ;- (CAN_MB2) Base Address +AT91C_BASE_CAN_MB3 EQU (0xFFFD0260) ;- (CAN_MB3) Base Address +AT91C_BASE_CAN_MB4 EQU (0xFFFD0280) ;- (CAN_MB4) Base Address +AT91C_BASE_CAN_MB5 EQU (0xFFFD02A0) ;- (CAN_MB5) Base Address +AT91C_BASE_CAN_MB6 EQU (0xFFFD02C0) ;- (CAN_MB6) Base Address +AT91C_BASE_CAN_MB7 EQU (0xFFFD02E0) ;- (CAN_MB7) Base Address +AT91C_BASE_CAN EQU (0xFFFD0000) ;- (CAN) Base Address +AT91C_BASE_EMAC EQU (0xFFFDC000) ;- (EMAC) Base Address +AT91C_BASE_PDC_ADC EQU (0xFFFD8100) ;- (PDC_ADC) Base Address +AT91C_BASE_ADC EQU (0xFFFD8000) ;- (ADC) Base Address +AT91C_BASE_PDC_AES EQU (0xFFFA4100) ;- (PDC_AES) Base Address +AT91C_BASE_AES EQU (0xFFFA4000) ;- (AES) Base Address +AT91C_BASE_PDC_TDES EQU (0xFFFA8100) ;- (PDC_TDES) Base Address +AT91C_BASE_TDES EQU (0xFFFA8000) ;- (TDES) Base Address + +// - ***************************************************************************** +// - MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// - ***************************************************************************** +AT91C_ISRAM EQU (0x00200000) ;- Internal SRAM base address +AT91C_ISRAM_SIZE EQU (0x00010000) ;- Internal SRAM size in byte (64 Kbyte) +AT91C_IFLASH EQU (0x00100000) ;- Internal ROM base address +AT91C_IFLASH_SIZE EQU (0x00040000) ;- Internal ROM size in byte (256 Kbyte) + + + +#endif /* AT91SAM7X256_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c new file mode 100644 index 0000000..bb2ad9b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c @@ -0,0 +1,51 @@ +//* ---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//* ---------------------------------------------------------------------------- +//* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +//* DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +//* ---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7X256.h +//* Object : AT91SAM7X256 inlined functions +//* Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +//* +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_pmc_SAM7X.h/1.1/Tue Feb 1 08:32:10 2005// +//* CVS Reference : /lib_VREG_6085B.h/1.1/Tue Feb 1 16:20:47 2005// +//* CVS Reference : /lib_rstc_6098A.h/1.1/Wed Oct 6 10:39:20 2004// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_wdtc_6080A.h/1.1/Wed Oct 6 10:38:30 2004// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003// +//* CVS Reference : /lib_pitc_6079A.h/1.2/Tue Nov 9 14:43:56 2004// +//* CVS Reference : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005// +//* CVS Reference : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005// +//* CVS Reference : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003// +//* CVS Reference : /lib_rttc_6081A.h/1.1/Wed Oct 6 10:39:38 2004// +//* CVS Reference : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005// +//* CVS Reference : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_pdc.h/1.2/Tue Jul 2 13:29:40 2002// +//* ---------------------------------------------------------------------------- + + +#include "AT91SAM7X256.h" + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h new file mode 100644 index 0000000..5720bad --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h @@ -0,0 +1,4558 @@ +//* ---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//* ---------------------------------------------------------------------------- +//* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +//* DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +//* ---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7X256.h +//* Object : AT91SAM7X256 inlined functions +//* Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +//* +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_pmc_SAM7X.h/1.1/Tue Feb 1 08:32:10 2005// +//* CVS Reference : /lib_VREG_6085B.h/1.1/Tue Feb 1 16:20:47 2005// +//* CVS Reference : /lib_rstc_6098A.h/1.1/Wed Oct 6 10:39:20 2004// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_wdtc_6080A.h/1.1/Wed Oct 6 10:38:30 2004// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003// +//* CVS Reference : /lib_pitc_6079A.h/1.2/Tue Nov 9 14:43:56 2004// +//* CVS Reference : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005// +//* CVS Reference : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005// +//* CVS Reference : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003// +//* CVS Reference : /lib_rttc_6081A.h/1.1/Wed Oct 6 10:39:38 2004// +//* CVS Reference : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005// +//* CVS Reference : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_pdc.h/1.2/Tue Jul 2 13:29:40 2002// +//* ---------------------------------------------------------------------------- + +#ifndef lib_AT91SAM7X256_H +#define lib_AT91SAM7X256_H + +/* ***************************************************************************** + SOFTWARE API FOR AIC + ***************************************************************************** */ +#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20] + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_ConfigureIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id, // \arg interrupt number to initialize + unsigned int priority, // \arg priority to give to the interrupt + unsigned int src_type, // \arg activation and sense of activation + void (*newHandler) (void) ) // \arg address of the interrupt handler +{ + unsigned int oldHandler; + unsigned int mask ; + + oldHandler = pAic->AIC_SVR[irq_id]; + + mask = 0x1 << irq_id ; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Save the interrupt handler routine pointer and the interrupt priority + pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; + //* Store the Source Mode Register + pAic->AIC_SMR[irq_id] = src_type | priority ; + //* Clear the interrupt on the interrupt controller + pAic->AIC_ICCR = mask ; + + return oldHandler; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_EnableIt +//* \brief Enable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_EnableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + //* Enable the interrupt on the interrupt controller + pAic->AIC_IECR = 0x1 << irq_id ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_DisableIt +//* \brief Disable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_DisableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + unsigned int mask = 0x1 << irq_id; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = mask ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ClearIt +//* \brief Clear corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_ClearIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number to initialize +{ + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = (0x1 << irq_id); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_AcknowledgeIt +//* \brief Acknowledge corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_AcknowledgeIt ( + AT91PS_AIC pAic) // \arg pointer to the AIC registers +{ + pAic->AIC_EOICR = pAic->AIC_EOICR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_SetExceptionVector +//* \brief Configure vector handler +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_SetExceptionVector ( + unsigned int *pVector, // \arg pointer to the AIC registers + void (*Handler) () ) // \arg Interrupt Handler +{ + unsigned int oldVector = *pVector; + + if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) + *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; + else + *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000; + + return oldVector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Trig +//* \brief Trig an IT +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Trig ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number +{ + pAic->AIC_ISCR = (0x1 << irq_id) ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsActive +//* \brief Test if an IT is active +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsActive ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_ISR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsPending +//* \brief Test if an IT is pending +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsPending ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_IPR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Open +//* \brief Set exception vectors and AIC registers to default values +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Open( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + void (*IrqHandler) (), // \arg Default IRQ vector exception + void (*FiqHandler) (), // \arg Default FIQ vector exception + void (*DefaultHandler) (), // \arg Default Handler set in ISR + void (*SpuriousHandler) (), // \arg Default Spurious Handler + unsigned int protectMode) // \arg Debug Control Register +{ + int i; + + // Disable all interrupts and set IVR to the default handler + for (i = 0; i < 32; ++i) { + AT91F_AIC_DisableIt(pAic, i); + AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler); + } + + // Set the IRQ exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler); + // Set the Fast Interrupt exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler); + + pAic->AIC_SPU = (unsigned int) SpuriousHandler; + pAic->AIC_DCR = protectMode; +} +/* ***************************************************************************** + SOFTWARE API FOR PDC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextRx +//* \brief Set the next receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RNPR = (unsigned int) address; + pPDC->PDC_RNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextTx +//* \brief Set the next transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TNPR = (unsigned int) address; + pPDC->PDC_TNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetRx +//* \brief Set the receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RPR = (unsigned int) address; + pPDC->PDC_RCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetTx +//* \brief Set the transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TPR = (unsigned int) address; + pPDC->PDC_TCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableTx +//* \brief Enable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableRx +//* \brief Enable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableTx +//* \brief Disable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableRx +//* \brief Disable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsTxEmpty +//* \brief Test if the current transfer descriptor has been sent +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextTxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsRxEmpty +//* \brief Test if the current transfer descriptor has been filled +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextRxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Open +//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Open ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + + //* Enable the RX and TX PDC transfer requests + AT91F_PDC_EnableRx(pPDC); + AT91F_PDC_EnableTx(pPDC); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Close +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Close ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SendFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_SendFrame( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsTxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextTxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_ReceiveFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_ReceiveFrame ( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsRxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} +/* ***************************************************************************** + SOFTWARE API FOR DBGU + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptEnable +//* \brief Enable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptEnable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be enabled +{ + pDbgu->DBGU_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptDisable +//* \brief Disable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptDisable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be disabled +{ + pDbgu->DBGU_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_GetInterruptMaskStatus +//* \brief Return DBGU Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status + AT91PS_DBGU pDbgu) // \arg pointer to a DBGU controller +{ + return pDbgu->DBGU_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_IsInterruptMasked +//* \brief Test if DBGU Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_DBGU_IsInterruptMasked( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PIO + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPeriph +//* \brief Enable pins to be drived by peripheral +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPeriph( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int periphAEnable, // \arg PERIPH A to enable + unsigned int periphBEnable) // \arg PERIPH B to enable + +{ + pPio->PIO_ASR = periphAEnable; + pPio->PIO_BSR = periphBEnable; + pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOutput +//* \brief Enable PIO in output mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pioEnable) // \arg PIO to be enabled +{ + pPio->PIO_PER = pioEnable; // Set in PIO mode + pPio->PIO_OER = pioEnable; // Configure in Output +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInput +//* \brief Enable PIO in input mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputEnable) // \arg PIO to be enabled +{ + // Disable output + pPio->PIO_ODR = inputEnable; + pPio->PIO_PER = inputEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOpendrain +//* \brief Configure PIO in open drain +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOpendrain( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int multiDrvEnable) // \arg pio to be configured in open drain +{ + // Configure the multi-drive option + pPio->PIO_MDDR = ~multiDrvEnable; + pPio->PIO_MDER = multiDrvEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPullup +//* \brief Enable pullup on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPullup( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pullupEnable) // \arg enable pullup on PIO +{ + // Connect or not Pullup + pPio->PIO_PPUDR = ~pullupEnable; + pPio->PIO_PPUER = pullupEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgDirectDrive +//* \brief Enable direct drive on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgDirectDrive( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int directDrive) // \arg PIO to be configured with direct drive + +{ + // Configure the Direct Drive + pPio->PIO_OWDR = ~directDrive; + pPio->PIO_OWER = directDrive; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInputFilter +//* \brief Enable input filter on input PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInputFilter( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputFilter) // \arg PIO to be configured with input filter + +{ + // Configure the Direct Drive + pPio->PIO_IFDR = ~inputFilter; + pPio->PIO_IFER = inputFilter; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInput +//* \brief Return PIO input value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInput( // \return PIO input + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputSet +//* \brief Test if PIO is input flag is active +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInput(pPio) & flag); +} + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_SetOutput +//* \brief Set to 1 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_SetOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be set +{ + pPio->PIO_SODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ClearOutput +//* \brief Set to 0 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ClearOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be cleared +{ + pPio->PIO_CODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ForceOutput +//* \brief Force output when Direct drive option is enabled +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ForceOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be forced +{ + pPio->PIO_ODSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Enable +//* \brief Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Enable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_PER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Disable +//* \brief Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Disable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_PDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetStatus +//* \brief Return PIO Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsSet +//* \brief Test if PIO is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputEnable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be enabled +{ + pPio->PIO_OER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputDisable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be disabled +{ + pPio->PIO_ODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputStatus +//* \brief Return PIO Output Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOuputSet +//* \brief Test if PIO Output is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterEnable +//* \brief Input Filter Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be enabled +{ + pPio->PIO_IFER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterDisable +//* \brief Input Filter Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be disabled +{ + pPio->PIO_IFDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInputFilterStatus +//* \brief Return PIO Input Filter Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IFSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputFilterSet +//* \brief Test if PIO Input filter is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputFilterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInputFilterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputDataStatus +//* \brief Return PIO Output Data Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ODSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptEnable +//* \brief Enable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be enabled +{ + pPio->PIO_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptDisable +//* \brief Disable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be disabled +{ + pPio->PIO_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptMaskStatus +//* \brief Return PIO Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptMasked +//* \brief Test if PIO Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptMasked( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptSet +//* \brief Test if PIO Interrupt is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverEnable +//* \brief Multi Driver Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_MDER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverDisable +//* \brief Multi Driver Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_MDDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetMultiDriverStatus +//* \brief Return PIO Multi Driver Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_MDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsMultiDriverSet +//* \brief Test if PIO MultiDriver is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsMultiDriverSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_A_RegisterSelection +//* \brief PIO A Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_A_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio A register selection +{ + pPio->PIO_ASR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_B_RegisterSelection +//* \brief PIO B Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_B_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio B register selection +{ + pPio->PIO_BSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Get_AB_RegisterStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ABSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsAB_RegisterSet +//* \brief Test if PIO AB Register is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsAB_RegisterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteEnable +//* \brief Output Write Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be enabled +{ + pPio->PIO_OWER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteDisable +//* \brief Output Write Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be disabled +{ + pPio->PIO_OWDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputWriteStatus +//* \brief Return PIO Output Write Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OWSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputWriteSet +//* \brief Test if PIO OutputWrite is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputWriteSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetCfgPullup +//* \brief Return PIO Configuration Pullup +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PPUSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputDataStatusSet +//* \brief Test if PIO Output Data Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputDataStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputDataStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsCfgPullupStatusSet +//* \brief Test if PIO Configuration Pullup Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsCfgPullupStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (~AT91F_PIO_GetCfgPullup(pPio) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkEnableReg +//* \brief Configure the System Clock Enable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkEnableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCER register + pPMC->PMC_SCER = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkDisableReg +//* \brief Configure the System Clock Disable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkDisableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCDR register + pPMC->PMC_SCDR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetSysClkStatusReg +//* \brief Return the System Clock Status Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetSysClkStatusReg ( + AT91PS_PMC pPMC // pointer to a CAN controller + ) +{ + return pPMC->PMC_SCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePeriphClock +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCER = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePeriphClock +//* \brief Disable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCDR = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetPeriphClock +//* \brief Get peripheral clock status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetPeriphClock ( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_PCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscillatorReg ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int mode) +{ + pCKGR->CKGR_MOR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainOscillatorReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MOR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_EnableMainOscillator +//* \brief Enable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_EnableMainOscillator( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_DisableMainOscillator +//* \brief Disable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_DisableMainOscillator ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscStartUpTime +//* \brief Cfg MOR Register according to the main osc startup time +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscStartUpTime ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int startup_time, // \arg main osc startup time in microsecond (us) + unsigned int slowClock) // \arg slowClock in Hz +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT; + pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClockFreqReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClockFreqReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MCFR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClock +//* \brief Return Main clock in Hz +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClock ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + return ((pCKGR->CKGR_MCFR & AT91C_CKGR_MAINF) * slowClock) >> 4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgMCKReg +//* \brief Cfg Master Clock Register +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgMCKReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + pPMC->PMC_MCKR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetMCKReg +//* \brief Return Master Clock Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetMCKReg( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_MCKR; +} + +//*------------------------------------------------------------------------------ +//* \fn AT91F_PMC_GetMasterClock +//* \brief Return master clock in Hz which correponds to processor clock for ARM7 +//*------------------------------------------------------------------------------ +__inline unsigned int AT91F_PMC_GetMasterClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + unsigned int reg = pPMC->PMC_MCKR; + unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2)); + unsigned int pllDivider, pllMultiplier; + + switch (reg & AT91C_PMC_CSS) { + case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected + return slowClock / prescaler; + case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler; + case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected + reg = pCKGR->CKGR_PLLR; + pllDivider = (reg & AT91C_CKGR_DIV); + pllMultiplier = ((reg & AT91C_CKGR_MUL) >> 16) + 1; + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler; + } + return 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck, // \arg Peripheral clock identifier 0 .. 7 + unsigned int mode) +{ + pPMC->PMC_PCKR[pck] = mode; + pPMC->PMC_SCER = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck) // \arg Peripheral clock identifier 0 .. 7 +{ + pPMC->PMC_SCDR = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnableIt +//* \brief Enable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pPMC->PMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisableIt +//* \brief Disable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pPMC->PMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetStatus +//* \brief Return PMC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetInterruptMaskStatus +//* \brief Return PMC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsInterruptMasked +//* \brief Test if PMC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsInterruptMasked( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsStatusSet +//* \brief Test if PMC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsStatusSet( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetStatus(pPMC) & flag); +}/* ***************************************************************************** + SOFTWARE API FOR RSTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSoftReset +//* \brief Start Software Reset +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSoftReset( + AT91PS_RSTC pRSTC, + unsigned int reset) +{ + pRSTC->RSTC_RCR = (0xA5000000 | reset); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSetMode +//* \brief Set Reset Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSetMode( + AT91PS_RSTC pRSTC, + unsigned int mode) +{ + pRSTC->RSTC_RMR = (0xA5000000 | mode); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetMode +//* \brief Get Reset Mode +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetMode( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetStatus +//* \brief Get Reset Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetStatus( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RSR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTIsSoftRstActive +//* \brief Return !=0 if software reset is still not completed +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTIsSoftRstActive( + AT91PS_RSTC pRSTC) +{ + return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP); +} +/* ***************************************************************************** + SOFTWARE API FOR RTTC + ***************************************************************************** */ +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_SetRTT_TimeBase() +//* \brief Set the RTT prescaler according to the TimeBase in ms +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetTimeBase( + AT91PS_RTTC pRTTC, + unsigned int ms) +{ + if (ms > 2000) + return 1; // AT91C_TIME_OUT_OF_RANGE + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF); + return 0; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTSetPrescaler() +//* \brief Set the new prescaler value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetPrescaler( + AT91PS_RTTC pRTTC, + unsigned int rtpres) +{ + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF); + return (pRTTC->RTTC_RTMR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTRestart() +//* \brief Restart the RTT prescaler +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTRestart( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST; +} + + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmINT() +//* \brief Enable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearAlarmINT() +//* \brief Disable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetRttIncINT() +//* \brief Enable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearRttIncINT() +//* \brief Disable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmValue() +//* \brief Set RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmValue( + AT91PS_RTTC pRTTC, unsigned int alarm) +{ + pRTTC->RTTC_RTAR = alarm; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_GetAlarmValue() +//* \brief Get RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetAlarmValue( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTAR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTGetStatus() +//* \brief Read the RTT status +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetStatus( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTSR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ReadValue() +//* \brief Read the RTT value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTReadValue( + AT91PS_RTTC pRTTC) +{ + register volatile unsigned int val1,val2; + do + { + val1 = pRTTC->RTTC_RTVR; + val2 = pRTTC->RTTC_RTVR; + } + while(val1 != val2); + return(val1); +} +/* ***************************************************************************** + SOFTWARE API FOR PITC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITInit +//* \brief System timer init : period in µsecond, system clock freq in MHz +//*---------------------------------------------------------------------------- +__inline void AT91F_PITInit( + AT91PS_PITC pPITC, + unsigned int period, + unsigned int pit_frequency) +{ + pPITC->PITC_PIMR = period? (period * pit_frequency + 8) >> 4 : 0; // +8 to avoid %10 and /10 + pPITC->PITC_PIMR |= AT91C_PITC_PITEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITSetPIV +//* \brief Set the PIT Periodic Interval Value +//*---------------------------------------------------------------------------- +__inline void AT91F_PITSetPIV( + AT91PS_PITC pPITC, + unsigned int piv) +{ + pPITC->PITC_PIMR = piv | (pPITC->PITC_PIMR & (AT91C_PITC_PITEN | AT91C_PITC_PITIEN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITEnableInt +//* \brief Enable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITEnableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR |= AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITDisableInt +//* \brief Disable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITDisableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetMode +//* \brief Read PIT mode register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetMode( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetStatus +//* \brief Read PIT status register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetStatus( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PISR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIIR +//* \brief Read PIT CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIIR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIIR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIVR +//* \brief Read System timer CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIVR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIVR); +} +/* ***************************************************************************** + SOFTWARE API FOR WDTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSetMode +//* \brief Set Watchdog Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTSetMode( + AT91PS_WDTC pWDTC, + unsigned int Mode) +{ + pWDTC->WDTC_WDMR = Mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTRestart +//* \brief Restart Watchdog +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTRestart( + AT91PS_WDTC pWDTC) +{ + pWDTC->WDTC_WDCR = 0xA5000001; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSGettatus +//* \brief Get Watchdog Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTSGettatus( + AT91PS_WDTC pWDTC) +{ + return(pWDTC->WDTC_WDSR & 0x3); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTGetPeriod +//* \brief Translate ms into Watchdog Compatible value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTGetPeriod(unsigned int ms) +{ + if ((ms < 4) || (ms > 16000)) + return 0; + return((ms << 8) / 1000); +} +/* ***************************************************************************** + SOFTWARE API FOR VREG + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Enable_LowPowerMode +//* \brief Enable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Enable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR |= AT91C_VREG_PSTDBY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Disable_LowPowerMode +//* \brief Disable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Disable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR &= ~AT91C_VREG_PSTDBY; +}/* ***************************************************************************** + SOFTWARE API FOR MC + ***************************************************************************** */ + +#define AT91C_MC_CORRECT_KEY ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_Remap +//* \brief Make Remap +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_Remap (void) // +{ + AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC; + + pMC->MC_RCR = AT91C_MC_RCB; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_CfgModeReg +//* \brief Configure the EFC Mode Register of the MC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_CfgModeReg ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int mode) // mode register +{ + // Write to the FMR register + pMC->MC_FMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetModeReg +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetModeReg( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_ComputeFMCN +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_ComputeFMCN( + int master_clock) // master clock in Hz +{ + return (master_clock/1000000 +2); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_PerformCmd +//* \brief Perform EFC Command +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_PerformCmd ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int transfer_cmd) +{ + pMC->MC_FCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetStatus +//* \brief Return MC EFC Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetStatus( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptMasked +//* \brief Test if EFC MC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptMasked( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetModeReg(pMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptSet +//* \brief Test if EFC MC Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptSet( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetStatus(pMC) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SPI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Open +//* \brief Open a SPI Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgCs +//* \brief Configure SPI chip select register +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgCs ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int cs, // SPI cs number (0 to 3) + int val) // chip select register +{ + //* Write to the CSR register + *(pSPI->SPI_CSR + cs) = val; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_EnableIt +//* \brief Enable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_EnableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pSPI->SPI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_DisableIt +//* \brief Disable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_DisableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pSPI->SPI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Reset +//* \brief Reset the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Reset ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Enable +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Enable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Disable +//* \brief Disable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Disable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgMode +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgMode ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int mode) // mode register +{ + //* Write to the MR register + pSPI->SPI_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPCS +//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPCS ( + AT91PS_SPI pSPI, // pointer to a SPI controller + char PCS_Device) // PCS of the Device +{ + //* Write to the MR register + pSPI->SPI_MR &= 0xFFF0FFFF; + pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_ReceiveFrame ( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_SendFrame( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Close +//* \brief Close SPI: disable IT disable transfert, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Close ( + AT91PS_SPI pSPI) // \arg pointer to a SPI controller +{ + //* Reset all the Chip Select register + pSPI->SPI_CSR[0] = 0 ; + pSPI->SPI_CSR[1] = 0 ; + pSPI->SPI_CSR[2] = 0 ; + pSPI->SPI_CSR[3] = 0 ; + + //* Reset the SPI mode + pSPI->SPI_MR = 0 ; + + //* Disable all interrupts + pSPI->SPI_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_PutChar ( + AT91PS_SPI pSPI, + unsigned int character, + unsigned int cs_number ) +{ + unsigned int value_for_cs; + value_for_cs = (~(1 << cs_number)) & 0xF; //Place a zero among a 4 ONEs number + pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_GetChar ( + const AT91PS_SPI pSPI) +{ + return((pSPI->SPI_RDR) & 0xFFFF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetInterruptMaskStatus +//* \brief Return SPI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status + AT91PS_SPI pSpi) // \arg pointer to a SPI controller +{ + return pSpi->SPI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_IsInterruptMasked +//* \brief Test if SPI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_IsInterruptMasked( + AT91PS_SPI pSpi, // \arg pointer to a SPI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR USART + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Calculate the baudrate +//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_EXT ) + +//* Standard Synchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \ + AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* SCK used Label +#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT) + +//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity +#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \ + AT91C_US_CLKS_CLOCK +\ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_EVEN + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CKLO +\ + AT91C_US_OVER) + +//* Standard IRDA mode +#define AT91C_US_ASYNC_IRDA_MODE ( AT91C_US_USMODE_IRDA + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Caluculate baud_value according to the main clock and the baud rate +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Baudrate ( + const unsigned int main_clock, // \arg peripheral clock + const unsigned int baud_rate) // \arg UART baudrate +{ + unsigned int baud_value = ((main_clock*10)/(baud_rate * 16)); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + return baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetBaudrate ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg UART baudrate +{ + //* Define the baud rate divisor register + pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetTimeguard +//* \brief Set USART timeguard +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetTimeguard ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int timeguard) // \arg timeguard value +{ + //* Write the Timeguard Register + pUSART->US_TTGR = timeguard ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableIt +//* \brief Enable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUSART->US_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableIt +//* \brief Disable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IER register + pUSART->US_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Configure +//* \brief Configure USART +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Configure ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int mode , // \arg mode Register to be programmed + unsigned int baudRate , // \arg baudrate to be programmed + unsigned int timeguard ) // \arg timeguard to be programmed +{ + //* Disable interrupts + pUSART->US_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; + + //* Define the baud rate divisor register + AT91F_US_SetBaudrate(pUSART, mainClock, baudRate); + + //* Write the Timeguard Register + AT91F_US_SetTimeguard(pUSART, timeguard); + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Define the USART mode + pUSART->US_MR = mode ; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableRx +//* \brief Enable receiving characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableTx +//* \brief Enable sending characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetRx +//* \brief Reset Receiver and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset receiver + pUSART->US_CR = AT91C_US_RSTRX; + //* Re-Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetTx +//* \brief Reset Transmitter and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset transmitter + pUSART->US_CR = AT91C_US_RSTTX; + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableRx +//* \brief Disable Receiver +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable receiver + pUSART->US_CR = AT91C_US_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableTx +//* \brief Disable Transmitter +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable transmitter + pUSART->US_CR = AT91C_US_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Close +//* \brief Close USART: disable IT disable receiver and transmitter, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Close ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset the baud rate divisor register + pUSART->US_BRGR = 0 ; + + //* Reset the USART mode + pUSART->US_MR = 0 ; + + //* Reset the Timeguard Register + pUSART->US_TTGR = 0; + + //* Disable all interrupts + pUSART->US_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_TxReady +//* \brief Return 1 if a character can be written in US_THR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_TxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_TXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_RxReady +//* \brief Return 1 if a character can be read in US_RHR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_RxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_RXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Error +//* \brief Return the error flag +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Error ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & + (AT91C_US_OVRE | // Overrun error + AT91C_US_FRAME | // Framing error + AT91C_US_PARE)); // Parity error +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_US_PutChar ( + AT91PS_USART pUSART, + int character ) +{ + pUSART->US_THR = (character & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_US_GetChar ( + const AT91PS_USART pUSART) +{ + return((pUSART->US_RHR) & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_SendFrame( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_ReceiveFrame ( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetIrdaFilter +//* \brief Set the value of IrDa filter tregister +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetIrdaFilter ( + AT91PS_USART pUSART, + unsigned char value +) +{ + pUSART->US_IF = value; +} + +/* ***************************************************************************** + SOFTWARE API FOR SSC + ***************************************************************************** */ +//* Define the standard I2S mode configuration + +//* Configuration to set in the SSC Transmit Clock Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + AT91C_SSC_CKS_DIV +\ + AT91C_SSC_CKO_CONTINOUS +\ + AT91C_SSC_CKG_NONE +\ + AT91C_SSC_START_FALL_RF +\ + AT91C_SSC_STTOUT +\ + ((1<<16) & AT91C_SSC_STTDLY) +\ + ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24)) + + +//* Configuration to set in the SSC Transmit Frame Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + (nb_bit_by_slot-1) +\ + AT91C_SSC_MSBF +\ + (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB) +\ + (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\ + AT91C_SSC_FSOS_NEGATIVE) + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_SetBaudrate ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg SSC baudrate +{ + unsigned int baud_value; + //* Define the baud rate divisor register + if (speed == 0) + baud_value = 0; + else + { + baud_value = (unsigned int) (mainClock * 10)/(2*speed); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + } + + pSSC->SSC_CMR = baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_Configure +//* \brief Configure SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_Configure ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int syst_clock, // \arg System Clock Frequency + unsigned int baud_rate, // \arg Expected Baud Rate Frequency + unsigned int clock_rx, // \arg Receiver Clock Parameters + unsigned int mode_rx, // \arg mode Register to be programmed + unsigned int clock_tx, // \arg Transmitter Clock Parameters + unsigned int mode_tx) // \arg mode Register to be programmed +{ + //* Disable interrupts + pSSC->SSC_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; + + //* Define the Clock Mode Register + AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate); + + //* Write the Receive Clock Mode Register + pSSC->SSC_RCMR = clock_rx; + + //* Write the Transmit Clock Mode Register + pSSC->SSC_TCMR = clock_tx; + + //* Write the Receive Frame Mode Register + pSSC->SSC_RFMR = mode_rx; + + //* Write the Transmit Frame Mode Register + pSSC->SSC_TFMR = mode_tx; + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR)); + + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableRx +//* \brief Enable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable receiver + pSSC->SSC_CR = AT91C_SSC_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableRx +//* \brief Disable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable receiver + pSSC->SSC_CR = AT91C_SSC_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableTx +//* \brief Enable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable transmitter + pSSC->SSC_CR = AT91C_SSC_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableTx +//* \brief Disable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable transmitter + pSSC->SSC_CR = AT91C_SSC_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableIt +//* \brief Enable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pSSC->SSC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableIt +//* \brief Disable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pSSC->SSC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_ReceiveFrame ( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_SendFrame( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_GetInterruptMaskStatus +//* \brief Return SSC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status + AT91PS_SSC pSsc) // \arg pointer to a SSC controller +{ + return pSsc->SSC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_IsInterruptMasked +//* \brief Test if SSC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SSC_IsInterruptMasked( + AT91PS_SSC pSsc, // \arg pointer to a SSC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TWI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_EnableIt +//* \brief Enable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_EnableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pTWI->TWI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_DisableIt +//* \brief Disable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_DisableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pTWI->TWI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_Configure +//* \brief Configure TWI in master mode +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller +{ + //* Disable interrupts + pTWI->TWI_IDR = (unsigned int) -1; + + //* Reset peripheral + pTWI->TWI_CR = AT91C_TWI_SWRST; + + //* Set Master mode + pTWI->TWI_CR = AT91C_TWI_MSEN; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_GetInterruptMaskStatus +//* \brief Return TWI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status + AT91PS_TWI pTwi) // \arg pointer to a TWI controller +{ + return pTwi->TWI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_IsInterruptMasked +//* \brief Test if TWI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TWI_IsInterruptMasked( + AT91PS_TWI pTwi, // \arg pointer to a TWI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PWMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetStatus +//* \brief Return PWM Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status + AT91PS_PWMC pPWM) // pointer to a PWM controller +{ + return pPWM->PWMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptEnable +//* \brief Enable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptEnable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be enabled +{ + pPwm->PWMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptDisable +//* \brief Disable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptDisable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be disabled +{ + pPwm->PWMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetInterruptMaskStatus +//* \brief Return PWM Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status + AT91PS_PWMC pPwm) // \arg pointer to a PWM controller +{ + return pPwm->PWMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsInterruptMasked +//* \brief Test if PWM Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsInterruptMasked( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsStatusSet +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsStatusSet( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_CfgChannel +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int mode, // \arg PWM mode + unsigned int period, // \arg PWM period + unsigned int duty) // \arg PWM duty cycle +{ + pPWM->PWMC_CH[channelId].PWMC_CMR = mode; + pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty; + pPWM->PWMC_CH[channelId].PWMC_CPRDR = period; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StartChannel +//* \brief Enable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StartChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_ENA = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StopChannel +//* \brief Disable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StopChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_DIS = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_UpdateChannel +//* \brief Update Period or Duty Cycle +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_UpdateChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int update) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_CH[channelId].PWMC_CUPDR = update; +} + +/* ***************************************************************************** + SOFTWARE API FOR UDP + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableIt +//* \brief Enable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUDP->UDP_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableIt +//* \brief Disable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pUDP->UDP_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetAddress +//* \brief Set UDP functional address +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetAddress ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char address) // \arg new UDP address +{ + pUDP->UDP_FADDR = (AT91C_UDP_FEN | address); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] &= ~AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetState +//* \brief Set UDP Device state +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetState ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg new UDP address +{ + pUDP->UDP_GLBSTATE &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG); + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetState +//* \brief return UDP Device state +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state + AT91PS_UDP pUDP) // \arg pointer to a UDP controller +{ + return (pUDP->UDP_GLBSTATE & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_ResetEp +//* \brief Reset UDP endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_ResetEp ( // \return the UDP device state + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg Endpoints to be reset +{ + pUDP->UDP_RSTEP = flag; + pUDP->UDP_RSTEP = 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStall +//* \brief Endpoint will STALL requests +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpStall( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpWrite +//* \brief Write value in the DPR +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpWrite( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned char value) // \arg value to be written in the DPR +{ + pUDP->UDP_FDR[endpoint] = value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpRead +//* \brief Return value from the DPR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpRead( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_FDR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpEndOfWr +//* \brief Notify the UDP that values in DPR are ready to be sent +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpEndOfWr( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpClear +//* \brief Clear flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpClear( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpSet +//* \brief Set flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpSet( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStatus +//* \brief Return the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpStatus( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_CSR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetInterruptMaskStatus +//* \brief Return UDP Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status + AT91PS_UDP pUdp) // \arg pointer to a UDP controller +{ + return pUdp->UDP_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_IsInterruptMasked +//* \brief Test if UDP Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_UDP_IsInterruptMasked( + AT91PS_UDP pUdp, // \arg pointer to a UDP controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptEnable +//* \brief Enable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptEnable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be enabled +{ + pTc->TC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptDisable +//* \brief Disable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptDisable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be disabled +{ + pTc->TC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_GetInterruptMaskStatus +//* \brief Return TC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status + AT91PS_TC pTc) // \arg pointer to a TC controller +{ + return pTc->TC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_IsInterruptMasked +//* \brief Test if TC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TC_IsInterruptMasked( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR CAN + ***************************************************************************** */ +#define STANDARD_FORMAT 0 +#define EXTENDED_FORMAT 1 + +//*---------------------------------------------------------------------------- +//* \fn AT91F_InitMailboxRegisters() +//* \brief Configure the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_InitMailboxRegisters(AT91PS_CAN_MB CAN_Mailbox, + int mode_reg, + int acceptance_mask_reg, + int id_reg, + int data_low_reg, + int data_high_reg, + int control_reg) +{ + CAN_Mailbox->CAN_MB_MCR = 0x0; + CAN_Mailbox->CAN_MB_MMR = mode_reg; + CAN_Mailbox->CAN_MB_MAM = acceptance_mask_reg; + CAN_Mailbox->CAN_MB_MID = id_reg; + CAN_Mailbox->CAN_MB_MDL = data_low_reg; + CAN_Mailbox->CAN_MB_MDH = data_high_reg; + CAN_Mailbox->CAN_MB_MCR = control_reg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EnableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_EnableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR |= AT91C_CAN_CANEN; + + // Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver + while( (pCAN->CAN_SR & AT91C_CAN_WAKEUP) != AT91C_CAN_WAKEUP ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DisableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_DisableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR &= ~AT91C_CAN_CANEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_EnableIt +//* \brief Enable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_EnableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pCAN->CAN_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_DisableIt +//* \brief Disable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_DisableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pCAN->CAN_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetStatus +//* \brief Return CAN Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetStatus( // \return CAN Interrupt Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInterruptMaskStatus +//* \brief Return CAN Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInterruptMaskStatus( // \return CAN Interrupt Mask Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsInterruptMasked +//* \brief Test if CAN Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsInterruptMasked( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetInterruptMaskStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsStatusSet +//* \brief Test if CAN Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsStatusSet( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgModeReg +//* \brief Configure the Mode Register of the CAN controller +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgModeReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pCAN->CAN_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetModeReg +//* \brief Return the Mode Register of the CAN controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetModeReg ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgBaudrateReg +//* \brief Configure the Baudrate of the CAN controller for the network +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgBaudrateReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int baudrate_cfg) +{ + //* Write to the BR register + pCAN->CAN_BR = baudrate_cfg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetBaudrate +//* \brief Return the Baudrate of the CAN controller for the network value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetBaudrate ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_BR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInternalCounter +//* \brief Return CAN Timer Regsiter Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInternalCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetTimestamp +//* \brief Return CAN Timestamp Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetTimestamp ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIMESTP; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetErrorCounter +//* \brief Return CAN Error Counter Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetErrorCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_ECR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitTransferRequest +//* \brief Request for a transfer on the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitTransferRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int transfer_cmd) +{ + pCAN->CAN_TCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitAbortRequest +//* \brief Abort the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitAbortRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int abort_cmd) +{ + pCAN->CAN_ACR = abort_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageModeReg +//* \brief Program the Message Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mode) +{ + CAN_Mailbox->CAN_MB_MMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageModeReg +//* \brief Return the Message Mode Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageIDReg +//* \brief Program the Message ID Register +//* \brief Version == 0 for Standard messsage, Version == 1 for Extended +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int id, + unsigned char version) +{ + if(version==0) // IDvA Standard Format + CAN_Mailbox->CAN_MB_MID = id<<18; + else // IDvB Extended Format + CAN_Mailbox->CAN_MB_MID = id | (1<<29); // set MIDE bit +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageIDReg +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageAcceptanceMaskReg +//* \brief Program the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mask) +{ + CAN_Mailbox->CAN_MB_MAM = mask; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageAcceptanceMaskReg +//* \brief Return the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MAM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetFamilyID +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetFamilyID ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MFID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageCtrl +//* \brief Request and config for a transfer on the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageCtrlReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int message_ctrl_cmd) +{ + CAN_Mailbox->CAN_MB_MCR = message_ctrl_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageStatus +//* \brief Return CAN Mailbox Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageStatus ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataLow +//* \brief Program data low value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDL = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataLow +//* \brief Return data low value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataHigh +//* \brief Program data high value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDH = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataHigh +//* \brief Return data high value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDH; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_Open +//* \brief Open a CAN Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} +/* ***************************************************************************** + SOFTWARE API FOR ADC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableIt +//* \brief Enable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pADC->ADC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableIt +//* \brief Disable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pADC->ADC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetStatus +//* \brief Return ADC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetInterruptMaskStatus +//* \brief Return ADC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsInterruptMasked +//* \brief Test if ADC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsInterruptMasked( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsStatusSet +//* \brief Test if ADC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsStatusSet( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgModeReg +//* \brief Configure the Mode Register of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgModeReg ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pADC->ADC_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetModeReg +//* \brief Return the Mode Register of the ADC controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetModeReg ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgTimings +//* \brief Configure the different necessary timings of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgTimings ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mck_clock, // in MHz + unsigned int adc_clock, // in MHz + unsigned int startup_time, // in us + unsigned int sample_and_hold_time) // in ns +{ + unsigned int prescal,startup,shtim; + + prescal = mck_clock/(2*adc_clock) - 1; + startup = adc_clock*startup_time/8 - 1; + shtim = adc_clock*sample_and_hold_time/1000 - 1; + + //* Write to the MR register + pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHER register + pADC->ADC_CHER = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHDR register + pADC->ADC_CHDR = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetChannelStatus +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetChannelStatus ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CHSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_StartConversion +//* \brief Software request for a analog to digital conversion +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_StartConversion ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_SoftReset +//* \brief Software reset +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_SoftReset ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetLastConvertedData +//* \brief Return the Last Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetLastConvertedData ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_LCDR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH0 +//* \brief Return the Channel 0 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH0 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH1 +//* \brief Return the Channel 1 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH1 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR1; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH2 +//* \brief Return the Channel 2 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH2 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR2; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH3 +//* \brief Return the Channel 3 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH3 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR3; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH4 +//* \brief Return the Channel 4 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH4 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH5 +//* \brief Return the Channel 5 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH5 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR5; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH6 +//* \brief Return the Channel 6 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH6 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR6; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH7 +//* \brief Return the Channel 7 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH7 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR7; +} + +/* ***************************************************************************** + SOFTWARE API FOR AES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_EnableIt +//* \brief Enable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_EnableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pAES->AES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_DisableIt +//* \brief Disable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_DisableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pAES->AES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetStatus +//* \brief Return AES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetStatus( // \return AES Interrupt Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetInterruptMaskStatus +//* \brief Return AES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetInterruptMaskStatus( // \return AES Interrupt Mask Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsInterruptMasked +//* \brief Test if AES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsInterruptMasked( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetInterruptMaskStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsStatusSet +//* \brief Test if AES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsStatusSet( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgModeReg +//* \brief Configure the Mode Register of the AES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgModeReg ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pAES->AES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetModeReg +//* \brief Return the Mode Register of the AES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetModeReg ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + return pAES->AES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_StartProcessing ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SoftReset +//* \brief Reset AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SoftReset ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_LoadNewSeed +//* \brief Load New Seed in the random number generator +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_LoadNewSeed ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_LOADSEED; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetCryptoKey +//* \brief Set Cryptographic Key x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetCryptoKey ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int keyword + ) +{ + pAES->AES_KEYWxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_InputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int indata + ) +{ + pAES->AES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetOutputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index + ) +{ + return pAES->AES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetInitializationVector +//* \brief Set Initialization Vector (or Counter) x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetInitializationVector ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int initvector + ) +{ + pAES->AES_IVxR[index] = initvector; +} + +/* ***************************************************************************** + SOFTWARE API FOR TDES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_EnableIt +//* \brief Enable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_EnableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pTDES->TDES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_DisableIt +//* \brief Disable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_DisableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pTDES->TDES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetStatus +//* \brief Return TDES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetStatus( // \return TDES Interrupt Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetInterruptMaskStatus +//* \brief Return TDES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetInterruptMaskStatus( // \return TDES Interrupt Mask Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsInterruptMasked +//* \brief Test if TDES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsInterruptMasked( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetInterruptMaskStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsStatusSet +//* \brief Test if TDES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsStatusSet( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgModeReg +//* \brief Configure the Mode Register of the TDES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgModeReg ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pTDES->TDES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetModeReg +//* \brief Return the Mode Register of the TDES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetModeReg ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + return pTDES->TDES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_StartProcessing ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SoftReset +//* \brief Reset TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SoftReset ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey1 +//* \brief Set Cryptographic Key 1 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey1 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY1WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey2 +//* \brief Set Cryptographic Key 2 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey2 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY2WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey3 +//* \brief Set Cryptographic Key 3 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey3 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY3WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_InputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int indata + ) +{ + pTDES->TDES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetOutputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index + ) +{ + return pTDES->TDES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetInitializationVector +//* \brief Set Initialization Vector x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetInitializationVector ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int initvector + ) +{ + pTDES->TDES_IVxR[index] = initvector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPMC +//* \brief Enable Peripheral clock in PMC for DBGU +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPIO +//* \brief Configure PIO controllers to drive DBGU signals +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA27_DRXD ) | + ((unsigned int) AT91C_PA28_DTXD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPIO +//* \brief Configure PIO controllers to drive PMC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB30_PCK2 ) | + ((unsigned int) AT91C_PB29_PCK1 ), // Peripheral A + ((unsigned int) AT91C_PB20_PCK0 ) | + ((unsigned int) AT91C_PB0_PCK0 ) | + ((unsigned int) AT91C_PB22_PCK2 ) | + ((unsigned int) AT91C_PB21_PCK1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA30_PCK2 ) | + ((unsigned int) AT91C_PA13_PCK1 ) | + ((unsigned int) AT91C_PA27_PCK3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_CfgPMC +//* \brief Enable Peripheral clock in PMC for VREG +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RSTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPMC +//* \brief Enable Peripheral clock in PMC for SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SSC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPIO +//* \brief Configure PIO controllers to drive SSC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA25_RK ) | + ((unsigned int) AT91C_PA22_TK ) | + ((unsigned int) AT91C_PA21_TF ) | + ((unsigned int) AT91C_PA24_RD ) | + ((unsigned int) AT91C_PA26_RF ) | + ((unsigned int) AT91C_PA23_TD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for WDTC +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPMC +//* \brief Enable Peripheral clock in PMC for US1 +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPIO +//* \brief Configure PIO controllers to drive US1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB26_RI1 ) | + ((unsigned int) AT91C_PB24_DSR1 ) | + ((unsigned int) AT91C_PB23_DCD1 ) | + ((unsigned int) AT91C_PB25_DTR1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA7_SCK1 ) | + ((unsigned int) AT91C_PA8_RTS1 ) | + ((unsigned int) AT91C_PA6_TXD1 ) | + ((unsigned int) AT91C_PA5_RXD1 ) | + ((unsigned int) AT91C_PA9_CTS1 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPMC +//* \brief Enable Peripheral clock in PMC for US0 +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPIO +//* \brief Configure PIO controllers to drive US0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA0_RXD0 ) | + ((unsigned int) AT91C_PA4_CTS0 ) | + ((unsigned int) AT91C_PA3_RTS0 ) | + ((unsigned int) AT91C_PA2_SCK0 ) | + ((unsigned int) AT91C_PA1_TXD0 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI1 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPIO +//* \brief Configure PIO controllers to drive SPI1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB16_NPCS13 ) | + ((unsigned int) AT91C_PB10_NPCS11 ) | + ((unsigned int) AT91C_PB11_NPCS12 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA4_NPCS13 ) | + ((unsigned int) AT91C_PA29_NPCS13 ) | + ((unsigned int) AT91C_PA21_NPCS10 ) | + ((unsigned int) AT91C_PA22_SPCK1 ) | + ((unsigned int) AT91C_PA25_NPCS11 ) | + ((unsigned int) AT91C_PA2_NPCS11 ) | + ((unsigned int) AT91C_PA24_MISO1 ) | + ((unsigned int) AT91C_PA3_NPCS12 ) | + ((unsigned int) AT91C_PA26_NPCS12 ) | + ((unsigned int) AT91C_PA23_MOSI1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI0 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPIO +//* \brief Configure PIO controllers to drive SPI0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB13_NPCS01 ) | + ((unsigned int) AT91C_PB17_NPCS03 ) | + ((unsigned int) AT91C_PB14_NPCS02 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA16_MISO0 ) | + ((unsigned int) AT91C_PA13_NPCS01 ) | + ((unsigned int) AT91C_PA15_NPCS03 ) | + ((unsigned int) AT91C_PA17_MOSI0 ) | + ((unsigned int) AT91C_PA18_SPCK0 ) | + ((unsigned int) AT91C_PA14_NPCS02 ) | + ((unsigned int) AT91C_PA12_NPCS00 ), // Peripheral A + ((unsigned int) AT91C_PA7_NPCS01 ) | + ((unsigned int) AT91C_PA9_NPCS03 ) | + ((unsigned int) AT91C_PA8_NPCS02 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PITC +//*---------------------------------------------------------------------------- +__inline void AT91F_PITC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPMC +//* \brief Enable Peripheral clock in PMC for AIC +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_FIQ) | + ((unsigned int) 1 << AT91C_ID_IRQ0) | + ((unsigned int) 1 << AT91C_ID_IRQ1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPIO +//* \brief Configure PIO controllers to drive AIC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA30_IRQ0 ) | + ((unsigned int) AT91C_PA29_FIQ ), // Peripheral A + ((unsigned int) AT91C_PA14_IRQ1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgPMC +//* \brief Enable Peripheral clock in PMC for AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_AES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPMC +//* \brief Enable Peripheral clock in PMC for TWI +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TWI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPIO +//* \brief Configure PIO controllers to drive TWI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA11_TWCK ) | + ((unsigned int) AT91C_PA10_TWD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPMC +//* \brief Enable Peripheral clock in PMC for ADC +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_ADC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPIO +//* \brief Configure PIO controllers to drive ADC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB18_ADTRG )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH3_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH3 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH3_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB22_PWM3 ), // Peripheral A + ((unsigned int) AT91C_PB30_PWM3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH2_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB21_PWM2 ), // Peripheral A + ((unsigned int) AT91C_PB29_PWM2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH1_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB20_PWM1 ), // Peripheral A + ((unsigned int) AT91C_PB28_PWM1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH0_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB19_PWM0 ), // Peripheral A + ((unsigned int) AT91C_PB27_PWM0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RTTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RTTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RTTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_CfgPMC +//* \brief Enable Peripheral clock in PMC for UDP +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_UDP)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgPMC +//* \brief Enable Peripheral clock in PMC for TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TDES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPMC +//* \brief Enable Peripheral clock in PMC for EMAC +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_EMAC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPIO +//* \brief Configure PIO controllers to drive EMAC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB2_ETX0 ) | + ((unsigned int) AT91C_PB12_ETXER ) | + ((unsigned int) AT91C_PB16_ECOL ) | + ((unsigned int) AT91C_PB11_ETX3 ) | + ((unsigned int) AT91C_PB6_ERX1 ) | + ((unsigned int) AT91C_PB15_ERXDV ) | + ((unsigned int) AT91C_PB13_ERX2 ) | + ((unsigned int) AT91C_PB3_ETX1 ) | + ((unsigned int) AT91C_PB8_EMDC ) | + ((unsigned int) AT91C_PB5_ERX0 ) | + //((unsigned int) AT91C_PB18_EF100 ) | + ((unsigned int) AT91C_PB14_ERX3 ) | + ((unsigned int) AT91C_PB4_ECRS_ECRSDV) | + ((unsigned int) AT91C_PB1_ETXEN ) | + ((unsigned int) AT91C_PB10_ETX2 ) | + ((unsigned int) AT91C_PB0_ETXCK_EREFCK) | + ((unsigned int) AT91C_PB9_EMDIO ) | + ((unsigned int) AT91C_PB7_ERXER ) | + ((unsigned int) AT91C_PB17_ERXCK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC0 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPIO +//* \brief Configure PIO controllers to drive TC0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB23_TIOA0 ) | + ((unsigned int) AT91C_PB24_TIOB0 ), // Peripheral A + ((unsigned int) AT91C_PB12_TCLK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC1 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPIO +//* \brief Configure PIO controllers to drive TC1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB25_TIOA1 ) | + ((unsigned int) AT91C_PB26_TIOB1 ), // Peripheral A + ((unsigned int) AT91C_PB19_TCLK1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC2 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC2)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPIO +//* \brief Configure PIO controllers to drive TC2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB28_TIOB2 ) | + ((unsigned int) AT91C_PB27_TIOA2 ), // Peripheral A + 0); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA15_TCLK2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_CfgPMC +//* \brief Enable Peripheral clock in PMC for MC +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOA_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOA +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOA_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOA)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOB_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOB +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOB_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOB)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPMC +//* \brief Enable Peripheral clock in PMC for CAN +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_CAN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPIO +//* \brief Configure PIO controllers to drive CAN signals +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA20_CANTX ) | + ((unsigned int) AT91C_PA19_CANRX ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PWMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PWMC)); +} + +#endif // lib_AT91SAM7X256_H diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/port.c new file mode 100644 index 0000000..2a85f5c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/port.c @@ -0,0 +1,214 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM7 port. + * + * Components that can be compiled to either ARM or THUMB mode are + * contained in this file. The ISR routines, which can only be compiled + * to ARM mode are contained in portISR.c. + *----------------------------------------------------------*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Processor constants. */ +#include "AT91SAM7X256.h" + +/* Constants required to setup the task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the PIT. */ +#define portPIT_CLOCK_DIVISOR ( ( uint32_t ) 16 ) +#define portPIT_COUNTER_VALUE ( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS ) + +#define portINT_LEVEL_SENSITIVE 0 +#define portPIT_ENABLE ( ( uint16_t ) 0x1 << 24 ) +#define portPIT_INT_ENABLE ( ( uint16_t ) 0x1 << 25 ) +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortISRStartFirstSTask() is defined in portISR.c. + */ +extern void vPortISRStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x00000000; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + #ifdef THUMB_INTERWORK + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + #endif + + pxTopOfStack--; + + /* Some optimisation levels use the stack differently to others. This + means the interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the timer 0 to generate the tick interrupts at the required frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ +AT91PS_PITC pxPIT = AT91C_BASE_PITC; + + /* Setup the AIC for PIT interrupts. The interrupt routine chosen depends + on whether the preemptive or cooperative scheduler is being used. */ + #if configUSE_PREEMPTION == 0 + + extern void ( vNonPreemptiveTick ) ( void ); + AT91F_AIC_ConfigureIt( AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vNonPreemptiveTick ); + + #else + + extern void ( vPreemptiveTick )( void ); + AT91F_AIC_ConfigureIt( AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPreemptiveTick ); + + #endif + + /* Configure the PIT period. */ + pxPIT->PITC_PIMR = portPIT_ENABLE | portPIT_INT_ENABLE | portPIT_COUNTER_VALUE; + + /* Enable the interrupt. Global interrupts are disables at this point so + this is safe. */ + AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_SYS; +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portISR.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portISR.c new file mode 100644 index 0000000..bdba06d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portISR.c @@ -0,0 +1,228 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* + Changes from V3.2.4 + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#include "AT91SAM7X256.h" + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* ISR to handle manual context switches (from a call to taskYIELD()). */ +void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"), naked)); + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Called by portYIELD() or taskYIELD() to manually force a context switch. + * + * When a context switch is performed from the task level the saved task + * context is made to look as if it occurred from within the tick ISR. This + * way the same restore context function can be used when restoring the context + * saved from the ISR or that saved from a call to vPortYieldProcessor. + */ +void vPortYieldProcessor( void ) +{ + /* Within an IRQ ISR the link register has an offset from the true return + address, but an SWI ISR does not. Add the offset manually so the same + ISR return code can be used in both cases. */ + __asm volatile ( "ADD LR, LR, #4" ); + + /* Perform the context switch. First save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Find the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + void vNonPreemptiveTick( void ) __attribute__ ((interrupt ("IRQ"))); + void vNonPreemptiveTick( void ) + { + uint32_t ulDummy; + + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + xTaskIncrementTick(); + + /* Clear the PIT interrupt. */ + ulDummy = AT91C_BASE_PITC->PITC_PIVR; + + /* End the interrupt in the AIC. */ + AT91C_BASE_AIC->AIC_EOICR = ulDummy; + } + +#else + + /* The preemptive scheduler is defined as "naked" as the full context is + saved on entry as part of the context switch. */ + void vPreemptiveTick( void ) __attribute__((naked)); + void vPreemptiveTick( void ) + { + /* Save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Increment the tick count - this may wake a task. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Find the highest priority task that is ready to run. */ + vTaskSwitchContext(); + } + + /* End the interrupt in the AIC. */ + AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_PITC->PITC_PIVR; + + portRESTORE_CONTEXT(); + } + +#endif +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); +void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + +void vPortDisableInterruptsFromThumb( void ) +{ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ +} + +void vPortEnableInterruptsFromThumb( void ) +{ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ +} + + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portmacro.h new file mode 100644 index 0000000..5be37f2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portmacro.h @@ -0,0 +1,250 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + Changes from V3.2.3 + + + Modified portENTER_SWITCHING_ISR() to allow use with GCC V4.0.1. + + Changes from V3.2.4 + + + Removed the use of the %0 parameter within the assembler macros and + replaced them with hard coded registers. This will ensure the + assembler does not select the link register as the temp register as + was occasionally happening previously. + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. + + Changes from V4.5.0 + + + Removed the portENTER_SWITCHING_ISR() and portEXIT_SWITCHING_ISR() macros + and replaced them with portYIELD_FROM_ISR() macro. Application code + should now make use of the portSAVE_CONTEXT() and portRESTORE_CONTEXT() + macros as per the V4.5.1 demo code. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE portLONG + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portNOP() __asm volatile ( "NOP" ); +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + +/* + * portRESTORE_CONTEXT, portRESTORE_CONTEXT, portENTER_SWITCHING_ISR + * and portEXIT_SWITCHING_ISR can only be called from ARM mode, but + * are included here for efficiency. An attempt to call one from + * THUMB mode code will result in a compile time error. + */ + +#define portRESTORE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Set the LR to the task stack. */ \ + __asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} +/*-----------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Push R0 as we are going to use the register. */ \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" \ + \ + /* Set R0 to point to the task stack pointer. */ \ + "STMDB SP,{SP}^ \n\t" \ + "NOP \n\t" \ + "SUB SP, SP, #4 \n\t" \ + "LDMIA SP!,{R0} \n\t" \ + \ + /* Push the return address onto the stack. */ \ + "STMDB R0!, {LR} \n\t" \ + \ + /* Now we have saved LR we can use it instead of R0. */ \ + "MOV LR, R0 \n\t" \ + \ + /* Pop R0 so we can save it onto the system mode stack. */ \ + "LDMIA SP!, {R0} \n\t" \ + \ + /* Push all the system mode registers onto the task stack. */ \ + "STMDB LR,{R0-LR}^ \n\t" \ + "NOP \n\t" \ + "SUB LR, LR, #60 \n\t" \ + \ + /* Push the SPSR onto the task stack. */ \ + "MRS R0, SPSR \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDR R0, [R0] \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + /* Store the new top of stack for the task. */ \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "STR LR, [R0] \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} + + +#define portYIELD_FROM_ISR() vTaskSwitchContext() +#define portYIELD() __asm volatile ( "SWI 0" ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/port.c new file mode 100644 index 0000000..6a73511 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/port.c @@ -0,0 +1,222 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM7 port. + * + * Components that can be compiled to either ARM or THUMB mode are + * contained in this file. The ISR routines, which can only be compiled + * to ARM mode are contained in portISR.c. + *----------------------------------------------------------*/ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the VIC for the tick ISR. */ +#define portTIMER_VIC_CHANNEL ( ( uint32_t ) 0x0004 ) +#define portTIMER_VIC_CHANNEL_BIT ( ( uint32_t ) 0x0010 ) +#define portTIMER_VIC_ENABLE ( ( uint32_t ) 0x0020 ) + +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortISRStartFirstSTask() is defined in portISR.c. + */ +extern void vPortISRStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00 ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Some optimisation levels use the stack differently to others. This + means the interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the timer 0 to generate the tick interrupts at the required frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; +extern void ( vTickISR )( void ); + + /* A 1ms tick does not require the use of the timer prescale. This is + defaulted to zero but can be used if necessary. */ + T0_PR = portPRESCALE_VALUE; + + /* Calculate the match value required for our wanted tick rate. */ + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* Protect against divide by zero. Using an if() statement still results + in a warning - hence the #if. */ + #if portPRESCALE_VALUE != 0 + { + ulCompareMatch /= ( portPRESCALE_VALUE + 1 ); + } + #endif + T0_MR0 = ulCompareMatch; + + /* Generate tick with timer 0 compare match. */ + T0_MCR = portRESET_COUNT_ON_MATCH | portINTERRUPT_ON_MATCH; + + /* Setup the VIC for the timer. */ + VICIntSelect &= ~( portTIMER_VIC_CHANNEL_BIT ); + VICIntEnable |= portTIMER_VIC_CHANNEL_BIT; + + /* The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + + VICVectAddr0 = ( int32_t ) vTickISR; + VICVectCntl0 = portTIMER_VIC_CHANNEL | portTIMER_VIC_ENABLE; + + /* Start the timer - interrupts are disabled when this function is called + so it is okay to do this here. */ + T0_TCR = portENABLE_TIMER; +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portISR.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portISR.c new file mode 100644 index 0000000..f3dcc3d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portISR.c @@ -0,0 +1,216 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* + Changes from V2.5.2 + + + The critical section management functions have been changed. These no + longer modify the stack and are safe to use at all optimisation levels. + The functions are now also the same for both ARM and THUMB modes. + + Changes from V2.6.0 + + + Removed the 'static' from the definition of vNonPreemptiveTick() to + allow the demo to link when using the cooperative scheduler. + + Changes from V3.2.4 + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. +*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* ISR to handle manual context switches (from a call to taskYIELD()). */ +void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"), naked)); + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Called by portYIELD() or taskYIELD() to manually force a context switch. + * + * When a context switch is performed from the task level the saved task + * context is made to look as if it occurred from within the tick ISR. This + * way the same restore context function can be used when restoring the context + * saved from the ISR or that saved from a call to vPortYieldProcessor. + */ +void vPortYieldProcessor( void ) +{ + /* Within an IRQ ISR the link register has an offset from the true return + address, but an SWI ISR does not. Add the offset manually so the same + ISR return code can be used in both cases. */ + __asm volatile ( "ADD LR, LR, #4" ); + + /* Perform the context switch. First save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Find the highest priority task that is ready to run. */ + __asm volatile ( "bl vTaskSwitchContext" ); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The ISR used for the scheduler tick. + */ +void vTickISR( void ) __attribute__((naked)); +void vTickISR( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Increment the RTOS tick count, then look for the highest priority + task that is ready to run. */ + __asm volatile + ( + " bl xTaskIncrementTick \t\n" \ + " cmp r0, #0 \t\n" \ + " beq SkipContextSwitch \t\n" \ + " bl vTaskSwitchContext \t\n" \ + "SkipContextSwitch: \t\n" + ); + + /* Ready for the next interrupt. */ + T0_IR = portTIMER_MATCH_ISR_BIT; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +#ifdef THUMB_INTERWORK + + void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + void vPortDisableInterruptsFromThumb( void ) + { + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + + void vPortEnableInterruptsFromThumb( void ) + { + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + +#endif /* THUMB_INTERWORK */ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portmacro.h new file mode 100644 index 0000000..e8ebfa5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portmacro.h @@ -0,0 +1,227 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE portLONG + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portNOP() __asm volatile ( "NOP" ); +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + +/* + * portRESTORE_CONTEXT, portRESTORE_CONTEXT, portENTER_SWITCHING_ISR + * and portEXIT_SWITCHING_ISR can only be called from ARM mode, but + * are included here for efficiency. An attempt to call one from + * THUMB mode code will result in a compile time error. + */ + +#define portRESTORE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Set the LR to the task stack. */ \ + __asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} +/*-----------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Push R0 as we are going to use the register. */ \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" \ + \ + /* Set R0 to point to the task stack pointer. */ \ + "STMDB SP,{SP}^ \n\t" \ + "NOP \n\t" \ + "SUB SP, SP, #4 \n\t" \ + "LDMIA SP!,{R0} \n\t" \ + \ + /* Push the return address onto the stack. */ \ + "STMDB R0!, {LR} \n\t" \ + \ + /* Now we have saved LR we can use it instead of R0. */ \ + "MOV LR, R0 \n\t" \ + \ + /* Pop R0 so we can save it onto the system mode stack. */ \ + "LDMIA SP!, {R0} \n\t" \ + \ + /* Push all the system mode registers onto the task stack. */ \ + "STMDB LR,{R0-LR}^ \n\t" \ + "NOP \n\t" \ + "SUB LR, LR, #60 \n\t" \ + \ + /* Push the SPSR onto the task stack. */ \ + "MRS R0, SPSR \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDR R0, [R0] \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + /* Store the new top of stack for the task. */ \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "STR LR, [R0] \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR() vTaskSwitchContext() +#define portYIELD() __asm volatile ( "SWI 0" ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/port.c new file mode 100644 index 0000000..b54ea56 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/port.c @@ -0,0 +1,234 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM7 port. + * + * Components that can be compiled to either ARM or THUMB mode are + * contained in this file. The ISR routines, which can only be compiled + * to ARM mode are contained in portISR.c. + *----------------------------------------------------------*/ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the VIC for the tick ISR. */ +#define portTIMER_VIC_CHANNEL ( ( uint32_t ) 0x0004 ) +#define portTIMER_VIC_CHANNEL_BIT ( ( uint32_t ) 0x0010 ) +#define portTIMER_VIC_ENABLE ( ( uint32_t ) 0x0020 ) + +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortISRStartFirstSTask() is defined in portISR.c. + */ +extern void vPortISRStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x00000000; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00 ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Some optimisation levels use the stack differently to others. This + means the interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the timer 0 to generate the tick interrupts at the required frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; + + PCLKSEL0 = (PCLKSEL0 & (~(0x3<<2))) | (0x01 << 2); + T0TCR = 2; /* Stop and reset the timer */ + T0CTCR = 0; /* Timer mode */ + + /* A 1ms tick does not require the use of the timer prescale. This is + defaulted to zero but can be used if necessary. */ + T0PR = portPRESCALE_VALUE; + + /* Calculate the match value required for our wanted tick rate. */ + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* Protect against divide by zero. Using an if() statement still results + in a warning - hence the #if. */ + #if portPRESCALE_VALUE != 0 + { + ulCompareMatch /= ( portPRESCALE_VALUE + 1 ); + } + #endif + T0MR1 = ulCompareMatch; + + /* Generate tick with timer 0 compare match. */ + T0MCR = (3 << 3); /* Reset timer on match and generate interrupt */ + + /* Setup the VIC for the timer. */ + VICIntEnable = 0x00000010; + + /* The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + #if configUSE_PREEMPTION == 1 + { + extern void ( vPreemptiveTick )( void ); + VICVectAddr4 = ( int32_t ) vPreemptiveTick; + } + #else + { + extern void ( vNonPreemptiveTick )( void ); + VICVectAddr4 = ( int32_t ) vNonPreemptiveTick; + } + #endif + + VICVectCntl4 = 1; + + /* Start the timer - interrupts are disabled when this function is called + so it is okay to do this here. */ + T0TCR = portENABLE_TIMER; +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portISR.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portISR.c new file mode 100644 index 0000000..db7e3dd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portISR.c @@ -0,0 +1,219 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* ISR to handle manual context switches (from a call to taskYIELD()). */ +void vPortYieldProcessor( void ) __attribute__((interrupt("SWI"), naked)); + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Called by portYIELD() or taskYIELD() to manually force a context switch. + * + * When a context switch is performed from the task level the saved task + * context is made to look as if it occurred from within the tick ISR. This + * way the same restore context function can be used when restoring the context + * saved from the ISR or that saved from a call to vPortYieldProcessor. + */ +void vPortYieldProcessor( void ) +{ + /* Within an IRQ ISR the link register has an offset from the true return + address, but an SWI ISR does not. Add the offset manually so the same + ISR return code can be used in both cases. */ + __asm volatile ( "ADD LR, LR, #4" ); + + /* Perform the context switch. First save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Find the highest priority task that is ready to run. */ + __asm volatile( "bl vTaskSwitchContext" ); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ + + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + void vNonPreemptiveTick( void ) __attribute__ ((interrupt ("IRQ"))); + void vNonPreemptiveTick( void ) + { + xTaskIncrementTick(); + T0IR = 2; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + } + +#else + + /* The preemptive scheduler is defined as "naked" as the full context is + saved on entry as part of the context switch. */ + void vPreemptiveTick( void ) __attribute__((naked)); + void vPreemptiveTick( void ) + { + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Increment the RTOS tick count, then look for the highest priority + task that is ready to run. */ + __asm volatile + ( + " bl xTaskIncrementTick \t\n" \ + " cmp r0, #0 \t\n" \ + " beq SkipContextSwitch \t\n" \ + " bl vTaskSwitchContext \t\n" \ + "SkipContextSwitch: \t\n" + ); + + /* Ready for the next interrupt. */ + T0IR = 2; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + } + +#endif +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +#ifdef THUMB_INTERWORK + + void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + void vPortDisableInterruptsFromThumb( void ) + { + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + + void vPortEnableInterruptsFromThumb( void ) + { + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + +#endif /* THUMB_INTERWORK */ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + __asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portmacro.h new file mode 100644 index 0000000..40059c3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portmacro.h @@ -0,0 +1,250 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + Changes from V3.2.3 + + + Modified portENTER_SWITCHING_ISR() to allow use with GCC V4.0.1. + + Changes from V3.2.4 + + + Removed the use of the %0 parameter within the assembler macros and + replaced them with hard coded registers. This will ensure the + assembler does not select the link register as the temp register as + was occasionally happening previously. + + + The assembler statements are now included in a single asm block rather + than each line having its own asm block. + + Changes from V4.5.0 + + + Removed the portENTER_SWITCHING_ISR() and portEXIT_SWITCHING_ISR() macros + and replaced them with portYIELD_FROM_ISR() macro. Application code + should now make use of the portSAVE_CONTEXT() and portRESTORE_CONTEXT() + macros as per the V4.5.1 demo code. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE portLONG + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portNOP() __asm volatile ( "NOP" ); +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + +/* + * portRESTORE_CONTEXT, portRESTORE_CONTEXT, portENTER_SWITCHING_ISR + * and portEXIT_SWITCHING_ISR can only be called from ARM mode, but + * are included here for efficiency. An attempt to call one from + * THUMB mode code will result in a compile time error. + */ + +#define portRESTORE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Set the LR to the task stack. */ \ + __asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} +/*-----------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ +{ \ +extern volatile void * volatile pxCurrentTCB; \ +extern volatile uint32_t ulCriticalNesting; \ + \ + /* Push R0 as we are going to use the register. */ \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" \ + \ + /* Set R0 to point to the task stack pointer. */ \ + "STMDB SP,{SP}^ \n\t" \ + "NOP \n\t" \ + "SUB SP, SP, #4 \n\t" \ + "LDMIA SP!,{R0} \n\t" \ + \ + /* Push the return address onto the stack. */ \ + "STMDB R0!, {LR} \n\t" \ + \ + /* Now we have saved LR we can use it instead of R0. */ \ + "MOV LR, R0 \n\t" \ + \ + /* Pop R0 so we can save it onto the system mode stack. */ \ + "LDMIA SP!, {R0} \n\t" \ + \ + /* Push all the system mode registers onto the task stack. */ \ + "STMDB LR,{R0-LR}^ \n\t" \ + "NOP \n\t" \ + "SUB LR, LR, #60 \n\t" \ + \ + /* Push the SPSR onto the task stack. */ \ + "MRS R0, SPSR \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDR R0, [R0] \n\t" \ + "STMDB LR!, {R0} \n\t" \ + \ + /* Store the new top of stack for the task. */ \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "STR LR, [R0] \n\t" \ + ); \ + ( void ) ulCriticalNesting; \ + ( void ) pxCurrentTCB; \ +} + + +#define portYIELD_FROM_ISR() vTaskSwitchContext() +#define portYIELD() __asm volatile ( "SWI 0" ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + __asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/port.c new file mode 100644 index 0000000..75e0066 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/port.c @@ -0,0 +1,519 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +/* Some vendor specific files default configCLEAR_TICK_INTERRUPT() in +portmacro.h. */ +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( size_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portSP_ELx ( ( StackType_t ) 0x01 ) +#define portSP_EL0 ( ( StackType_t ) 0x00 ) + +#if defined( GUEST ) + #define portEL1 ( ( StackType_t ) 0x04 ) + #define portINITIAL_PSTATE ( portEL1 | portSP_EL0 ) +#else + #define portEL3 ( ( StackType_t ) 0x0c ) + /* At the time of writing, the BSP only supports EL3. */ + #define portINITIAL_PSTATE ( portEL3 | portSP_EL0 ) +#endif + + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary +point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x0C ) + +/* The I bit in the DAIF bits. */ +#define portDAIF_I ( 0x80 ) + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + portDISABLE_INTERRUPTS(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm volatile ( "DSB SY \n" \ + "ISB SY \n" ); \ + portENABLE_INTERRUPTS(); \ +} + +/* Hardware specifics used when sanity checking the configuration. */ +#define portINTERRUPT_PRIORITY_REGISTER_OFFSET 0x400UL +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portBIT_0_SET ( ( uint8_t ) 0x01 ) + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint64_t ullCriticalNesting = 9999ULL; + +/* Saved as part of the task context. If ullPortTaskHasFPUContext is non-zero +then floating point context must be saved and restored for the task. */ +uint64_t ullPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint64_t ullPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint64_t ullPortInterruptNesting = 0; + +/* Used in the ASM code. */ +__attribute__(( used )) const uint64_t ullICCEOIR = portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS; +__attribute__(( used )) const uint64_t ullICCIAR = portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS; +__attribute__(( used )) const uint64_t ullICCPMR = portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS; +__attribute__(( used )) const uint64_t ullMaxAPIPriorityMask = ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First all the general purpose registers. */ + pxTopOfStack--; + *pxTopOfStack = 0x0101010101010101ULL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = 0x0303030303030303ULL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = 0x0202020202020202ULL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = 0x0505050505050505ULL; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = 0x0404040404040404ULL; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = 0x0707070707070707ULL; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = 0x0606060606060606ULL; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = 0x0909090909090909ULL; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = 0x0808080808080808ULL; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = 0x1111111111111111ULL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = 0x1010101010101010ULL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = 0x1313131313131313ULL; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = 0x1212121212121212ULL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = 0x1515151515151515ULL; /* R15 */ + pxTopOfStack--; + *pxTopOfStack = 0x1414141414141414ULL; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = 0x1717171717171717ULL; /* R17 */ + pxTopOfStack--; + *pxTopOfStack = 0x1616161616161616ULL; /* R16 */ + pxTopOfStack--; + *pxTopOfStack = 0x1919191919191919ULL; /* R19 */ + pxTopOfStack--; + *pxTopOfStack = 0x1818181818181818ULL; /* R18 */ + pxTopOfStack--; + *pxTopOfStack = 0x2121212121212121ULL; /* R21 */ + pxTopOfStack--; + *pxTopOfStack = 0x2020202020202020ULL; /* R20 */ + pxTopOfStack--; + *pxTopOfStack = 0x2323232323232323ULL; /* R23 */ + pxTopOfStack--; + *pxTopOfStack = 0x2222222222222222ULL; /* R22 */ + pxTopOfStack--; + *pxTopOfStack = 0x2525252525252525ULL; /* R25 */ + pxTopOfStack--; + *pxTopOfStack = 0x2424242424242424ULL; /* R24 */ + pxTopOfStack--; + *pxTopOfStack = 0x2727272727272727ULL; /* R27 */ + pxTopOfStack--; + *pxTopOfStack = 0x2626262626262626ULL; /* R26 */ + pxTopOfStack--; + *pxTopOfStack = 0x2929292929292929ULL; /* R29 */ + pxTopOfStack--; + *pxTopOfStack = 0x2828282828282828ULL; /* R28 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00; /* XZR - has no effect, used so there are an even number of registers. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00; /* R30 - procedure call link register. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_PSTATE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) pxCode; /* Exception return address. */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + portINTERRUPT_PRIORITY_REGISTER_OFFSET ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine how many priority bits are implemented in the GIC. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to + all possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Shift to the least significant bits. */ + while( ( ucMaxPriorityValue & portBIT_0_SET ) != portBIT_0_SET ) + { + ucMaxPriorityValue >>= ( uint8_t ) 0x01; + } + + /* Sanity check configUNIQUE_INTERRUPT_PRIORITIES matches the read + value. */ + + configASSERT( ucMaxPriorityValue >= portLOWEST_INTERRUPT_PRIORITY ); + + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + + /* At the time of writing, the BSP only supports EL3. */ + __asm volatile ( "MRS %0, CurrentEL" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + +#if defined( GUEST ) + #warning Building for execution as a guest under XEN. THIS IS NOT A FULLY TESTED PATH. + configASSERT( ulAPSR == portEL1 ); + if( ulAPSR == portEL1 ) +#else + configASSERT( ulAPSR == portEL3 ); + if( ulAPSR == portEL3 ) +#endif + { + /* Only continue if the binary point value is set to its lowest possible + setting. See the comments in vPortValidateInterruptPriority() below for + more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Interrupts are turned off in the CPU itself to ensure a tick does + not execute while the scheduler is being started. Interrupts are + automatically turned back on in the CPU when the first task starts + executing. */ + portDISABLE_INTERRUPTS(); + + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + } + + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ullCriticalNesting == 1000ULL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Mask interrupts up to the max syscall interrupt priority. */ + uxPortSetInterruptMask(); + + /* Now interrupts are disabled ullCriticalNesting can be accessed + directly. Increment ullCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ullCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ullCriticalNesting == 1ULL ) + { + configASSERT( ullPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ullCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ullCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ullCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Must be the lowest possible priority. */ + #if !defined( QEMU ) + { + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER == ( uint32_t ) ( portLOWEST_USABLE_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + } + #endif + + /* Interrupts should not be enabled before this point. */ + #if( configASSERT_DEFINED == 1 ) + { + uint32_t ulMaskBits; + + __asm volatile( "mrs %0, daif" : "=r"( ulMaskBits ) :: "memory" ); + configASSERT( ( ulMaskBits & portDAIF_I ) != 0 ); + } + #endif /* configASSERT_DEFINED */ + + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. It is + necessary to turn off interrupts in the CPU itself while the ICCPMR is being + updated. */ + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb sy \n" + "isb sy \n" ::: "memory" ); + + /* Ok to enable interrupts after the interrupt source has been cleared. */ + configCLEAR_TICK_INTERRUPT(); + portENABLE_INTERRUPTS(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ullPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ullPortTaskHasFPUContext = pdTRUE; + + /* Consider initialising the FPSR here - but probably not necessary in + AArch64. */ +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( UBaseType_t uxNewMaskValue ) +{ + if( uxNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxPortSetInterruptMask( void ) +{ +uint32_t ulReturn; + + /* Interrupt in the CPU must be turned off while the ICCPMR is being + updated. */ + portDISABLE_INTERRUPTS(); + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb sy \n" + "isb sy \n" ::: "memory" ); + } + portENABLE_INTERRUPTS(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. */ + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + The priority grouping is configured by the GIC's binary point register + (ICCBPR). Writting 0 to ICCBPR will ensure it is set to its lowest + possible value (which may be above 0). */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portASM.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portASM.S new file mode 100644 index 0000000..8978089 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portASM.S @@ -0,0 +1,432 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + .text + + /* Variables and functions. */ + .extern ullMaxAPIPriorityMask + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vApplicationIRQHandler + .extern ullPortInterruptNesting + .extern ullPortTaskHasFPUContext + .extern ullCriticalNesting + .extern ullPortYieldRequired + .extern ullICCEOIR + .extern ullICCIAR + .extern _freertos_vector_table + + .global FreeRTOS_IRQ_Handler + .global FreeRTOS_SWI_Handler + .global vPortRestoreTaskContext + + +.macro portSAVE_CONTEXT + + /* Switch to use the EL0 stack pointer. */ + MSR SPSEL, #0 + + /* Save the entire context. */ + STP X0, X1, [SP, #-0x10]! + STP X2, X3, [SP, #-0x10]! + STP X4, X5, [SP, #-0x10]! + STP X6, X7, [SP, #-0x10]! + STP X8, X9, [SP, #-0x10]! + STP X10, X11, [SP, #-0x10]! + STP X12, X13, [SP, #-0x10]! + STP X14, X15, [SP, #-0x10]! + STP X16, X17, [SP, #-0x10]! + STP X18, X19, [SP, #-0x10]! + STP X20, X21, [SP, #-0x10]! + STP X22, X23, [SP, #-0x10]! + STP X24, X25, [SP, #-0x10]! + STP X26, X27, [SP, #-0x10]! + STP X28, X29, [SP, #-0x10]! + STP X30, XZR, [SP, #-0x10]! + + /* Save the SPSR. */ +#if defined( GUEST ) + MRS X3, SPSR_EL1 + MRS X2, ELR_EL1 +#else + MRS X3, SPSR_EL3 + /* Save the ELR. */ + MRS X2, ELR_EL3 +#endif + + STP X2, X3, [SP, #-0x10]! + + /* Save the critical section nesting depth. */ + LDR X0, ullCriticalNestingConst + LDR X3, [X0] + + /* Save the FPU context indicator. */ + LDR X0, ullPortTaskHasFPUContextConst + LDR X2, [X0] + + /* Save the FPU context, if any (32 128-bit registers). */ + CMP X2, #0 + B.EQ 1f + STP Q0, Q1, [SP,#-0x20]! + STP Q2, Q3, [SP,#-0x20]! + STP Q4, Q5, [SP,#-0x20]! + STP Q6, Q7, [SP,#-0x20]! + STP Q8, Q9, [SP,#-0x20]! + STP Q10, Q11, [SP,#-0x20]! + STP Q12, Q13, [SP,#-0x20]! + STP Q14, Q15, [SP,#-0x20]! + STP Q16, Q17, [SP,#-0x20]! + STP Q18, Q19, [SP,#-0x20]! + STP Q20, Q21, [SP,#-0x20]! + STP Q22, Q23, [SP,#-0x20]! + STP Q24, Q25, [SP,#-0x20]! + STP Q26, Q27, [SP,#-0x20]! + STP Q28, Q29, [SP,#-0x20]! + STP Q30, Q31, [SP,#-0x20]! + +1: + /* Store the critical nesting count and FPU context indicator. */ + STP X2, X3, [SP, #-0x10]! + + LDR X0, pxCurrentTCBConst + LDR X1, [X0] + MOV X0, SP /* Move SP into X0 for saving. */ + STR X0, [X1] + + /* Switch to use the ELx stack pointer. */ + MSR SPSEL, #1 + + .endm + +; /**********************************************************************/ + +.macro portRESTORE_CONTEXT + + /* Switch to use the EL0 stack pointer. */ + MSR SPSEL, #0 + + /* Set the SP to point to the stack of the task being restored. */ + LDR X0, pxCurrentTCBConst + LDR X1, [X0] + LDR X0, [X1] + MOV SP, X0 + + LDP X2, X3, [SP], #0x10 /* Critical nesting and FPU context. */ + + /* Set the PMR register to be correct for the current critical nesting + depth. */ + LDR X0, ullCriticalNestingConst /* X0 holds the address of ullCriticalNesting. */ + MOV X1, #255 /* X1 holds the unmask value. */ + LDR X4, ullICCPMRConst /* X4 holds the address of the ICCPMR constant. */ + CMP X3, #0 + LDR X5, [X4] /* X5 holds the address of the ICCPMR register. */ + B.EQ 1f + LDR X6, ullMaxAPIPriorityMaskConst + LDR X1, [X6] /* X1 holds the mask value. */ +1: + STR W1, [X5] /* Write the mask value to ICCPMR. */ + DSB SY /* _RB_Barriers probably not required here. */ + ISB SY + STR X3, [X0] /* Restore the task's critical nesting count. */ + + /* Restore the FPU context indicator. */ + LDR X0, ullPortTaskHasFPUContextConst + STR X2, [X0] + + /* Restore the FPU context, if any. */ + CMP X2, #0 + B.EQ 1f + LDP Q30, Q31, [SP], #0x20 + LDP Q28, Q29, [SP], #0x20 + LDP Q26, Q27, [SP], #0x20 + LDP Q24, Q25, [SP], #0x20 + LDP Q22, Q23, [SP], #0x20 + LDP Q20, Q21, [SP], #0x20 + LDP Q18, Q19, [SP], #0x20 + LDP Q16, Q17, [SP], #0x20 + LDP Q14, Q15, [SP], #0x20 + LDP Q12, Q13, [SP], #0x20 + LDP Q10, Q11, [SP], #0x20 + LDP Q8, Q9, [SP], #0x20 + LDP Q6, Q7, [SP], #0x20 + LDP Q4, Q5, [SP], #0x20 + LDP Q2, Q3, [SP], #0x20 + LDP Q0, Q1, [SP], #0x20 +1: + LDP X2, X3, [SP], #0x10 /* SPSR and ELR. */ + +#if defined( GUEST ) + /* Restore the SPSR. */ + MSR SPSR_EL1, X3 + /* Restore the ELR. */ + MSR ELR_EL1, X2 +#else + /* Restore the SPSR. */ + MSR SPSR_EL3, X3 /*_RB_ Assumes started in EL3. */ + /* Restore the ELR. */ + MSR ELR_EL3, X2 +#endif + + LDP X30, XZR, [SP], #0x10 + LDP X28, X29, [SP], #0x10 + LDP X26, X27, [SP], #0x10 + LDP X24, X25, [SP], #0x10 + LDP X22, X23, [SP], #0x10 + LDP X20, X21, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + /* Switch to use the ELx stack pointer. _RB_ Might not be required. */ + MSR SPSEL, #1 + + ERET + + .endm + + +/****************************************************************************** + * FreeRTOS_SWI_Handler handler is used to perform a context switch. + *****************************************************************************/ +.align 8 +.type FreeRTOS_SWI_Handler, %function +FreeRTOS_SWI_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT +#if defined( GUEST ) + MRS X0, ESR_EL1 +#else + MRS X0, ESR_EL3 +#endif + + LSR X1, X0, #26 + +#if defined( GUEST ) + CMP X1, #0x15 /* 0x15 = SVC instruction. */ +#else + CMP X1, #0x17 /* 0x17 = SMC instruction. */ +#endif + B.NE FreeRTOS_Abort + BL vTaskSwitchContext + + portRESTORE_CONTEXT + +FreeRTOS_Abort: + /* Full ESR is in X0, exception class code is in X1. */ + B . + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +.align 8 +.type vPortRestoreTaskContext, %function +vPortRestoreTaskContext: +.set freertos_vector_base, _freertos_vector_table + + /* Install the FreeRTOS interrupt handlers. */ + LDR X1, =freertos_vector_base +#if defined( GUEST ) + MSR VBAR_EL1, X1 +#else + MSR VBAR_EL3, X1 +#endif + DSB SY + ISB SY + + /* Start the first task. */ + portRESTORE_CONTEXT + + +/****************************************************************************** + * FreeRTOS_IRQ_Handler handles IRQ entry and exit. + *****************************************************************************/ +.align 8 +.type FreeRTOS_IRQ_Handler, %function +FreeRTOS_IRQ_Handler: + /* Save volatile registers. */ + STP X0, X1, [SP, #-0x10]! + STP X2, X3, [SP, #-0x10]! + STP X4, X5, [SP, #-0x10]! + STP X6, X7, [SP, #-0x10]! + STP X8, X9, [SP, #-0x10]! + STP X10, X11, [SP, #-0x10]! + STP X12, X13, [SP, #-0x10]! + STP X14, X15, [SP, #-0x10]! + STP X16, X17, [SP, #-0x10]! + STP X18, X19, [SP, #-0x10]! + STP X29, X30, [SP, #-0x10]! + + /* Save the SPSR and ELR. */ +#if defined( GUEST ) + MRS X3, SPSR_EL1 + MRS X2, ELR_EL1 +#else + MRS X3, SPSR_EL3 + MRS X2, ELR_EL3 +#endif + STP X2, X3, [SP, #-0x10]! + + /* Increment the interrupt nesting counter. */ + LDR X5, ullPortInterruptNestingConst + LDR X1, [X5] /* Old nesting count in X1. */ + ADD X6, X1, #1 + STR X6, [X5] /* Address of nesting count variable in X5. */ + + /* Maintain the interrupt nesting information across the function call. */ + STP X1, X5, [SP, #-0x10]! + + /* Read value from the interrupt acknowledge register, which is stored in W0 + for future parameter and interrupt clearing use. */ + LDR X2, ullICCIARConst + LDR X3, [X2] + LDR W0, [X3] /* ICCIAR in W0 as parameter. */ + + /* Maintain the ICCIAR value across the function call. */ + STP X0, X1, [SP, #-0x10]! + + /* Call the C handler. */ + BL vApplicationIRQHandler + + /* Disable interrupts. */ + MSR DAIFSET, #2 + DSB SY + ISB SY + + /* Restore the ICCIAR value. */ + LDP X0, X1, [SP], #0x10 + + /* End IRQ processing by writing ICCIAR to the EOI register. */ + LDR X4, ullICCEOIRConst + LDR X4, [X4] + STR W0, [X4] + + /* Restore the critical nesting count. */ + LDP X1, X5, [SP], #0x10 + STR X1, [X5] + + /* Has interrupt nesting unwound? */ + CMP X1, #0 + B.NE Exit_IRQ_No_Context_Switch + + /* Is a context switch required? */ + LDR X0, ullPortYieldRequiredConst + LDR X1, [X0] + CMP X1, #0 + B.EQ Exit_IRQ_No_Context_Switch + + /* Reset ullPortYieldRequired to 0. */ + MOV X2, #0 + STR X2, [X0] + + /* Restore volatile registers. */ + LDP X4, X5, [SP], #0x10 /* SPSR and ELR. */ +#if defined( GUEST ) + MSR SPSR_EL1, X5 + MSR ELR_EL1, X4 +#else + MSR SPSR_EL3, X5 /*_RB_ Assumes started in EL3. */ + MSR ELR_EL3, X4 +#endif + DSB SY + ISB SY + + LDP X29, X30, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + BL vTaskSwitchContext + portRESTORE_CONTEXT + +Exit_IRQ_No_Context_Switch: + /* Restore volatile registers. */ + LDP X4, X5, [SP], #0x10 /* SPSR and ELR. */ +#if defined( GUEST ) + MSR SPSR_EL1, X5 + MSR ELR_EL1, X4 +#else + MSR SPSR_EL3, X5 /*_RB_ Assumes started in EL3. */ + MSR ELR_EL3, X4 +#endif + DSB SY + ISB SY + + LDP X29, X30, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + ERET + + + + +.align 8 +pxCurrentTCBConst: .dword pxCurrentTCB +ullCriticalNestingConst: .dword ullCriticalNesting +ullPortTaskHasFPUContextConst: .dword ullPortTaskHasFPUContext + +ullICCPMRConst: .dword ullICCPMR +ullMaxAPIPriorityMaskConst: .dword ullMaxAPIPriorityMask +ullPortInterruptNestingConst: .dword ullPortInterruptNesting +ullPortYieldRequiredConst: .dword ullPortYieldRequired +ullICCIARConst: .dword ullICCIAR +ullICCEOIRConst: .dword ullICCEOIR +vApplicationIRQHandlerConst: .word vApplicationIRQHandler + + + +.end + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portmacro.h new file mode 100644 index 0000000..5228377 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portmacro.h @@ -0,0 +1,212 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE size_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef portBASE_TYPE BaseType_t; +typedef uint64_t UBaseType_t; + +typedef uint64_t TickType_t; +#define portMAX_DELAY ( ( TickType_t ) 0xffffffffffffffff ) + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 16 +#define portPOINTER_SIZE_TYPE uint64_t + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern uint64_t ullPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ullPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#if defined( GUEST ) + #define portYIELD() __asm volatile ( "SVC 0" ::: "memory" ) +#else + #define portYIELD() __asm volatile ( "SMC 0" ::: "memory" ) +#endif +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern UBaseType_t uxPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( UBaseType_t uxNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +#define portDISABLE_INTERRUPTS() \ + __asm volatile ( "MSR DAIFSET, #2" ::: "memory" ); \ + __asm volatile ( "DSB SY" ); \ + __asm volatile ( "ISB SY" ); + +#define portENABLE_INTERRUPTS() \ + __asm volatile ( "MSR DAIFCLR, #2" ::: "memory" ); \ + __asm volatile ( "DSB SY" ); \ + __asm volatile ( "ISB SY" ); + + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif /* configASSERT */ + +#define portNOP() __asm volatile( "NOP" ) +#define portINLINE __inline + +#ifdef __cplusplus + } /* extern C */ +#endif + + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +/* Interrupt controller access addresses. */ +#define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) +#define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) +#define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) +#define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) + +#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) +#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) +#define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) +#define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + +#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/port.c new file mode 100644 index 0000000..f003478 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/port.c @@ -0,0 +1,459 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +/* Some vendor specific files default configCLEAR_TICK_INTERRUPT() in +portmacro.h. */ +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( size_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portSP_ELx ( ( StackType_t ) 0x01 ) +#define portSP_EL0 ( ( StackType_t ) 0x00 ) + +#if defined( GUEST ) + #define portEL1 ( ( StackType_t ) 0x04 ) + #define portINITIAL_PSTATE ( portEL1 | portSP_EL0 ) +#else + #define portEL3 ( ( StackType_t ) 0x0c ) + /* At the time of writing, the BSP only supports EL3. */ + #define portINITIAL_PSTATE ( portEL3 | portSP_EL0 ) +#endif + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x0C ) + +/* The I bit in the DAIF bits. */ +#define portDAIF_I ( 0x80 ) + +/* Macro to unmask all interrupt priorities. */ +/* s3_0_c4_c6_0 is ICC_PMR_EL1. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + __asm volatile ( "MSR DAIFSET, #2 \n" \ + "DSB SY \n" \ + "ISB SY \n" \ + "MSR s3_0_c4_c6_0, %0 \n" \ + "DSB SY \n" \ + "ISB SY \n" \ + "MSR DAIFCLR, #2 \n" \ + "DSB SY \n" \ + "ISB SY \n" \ + ::"r"( portUNMASK_VALUE ) ); \ +} + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint64_t ullCriticalNesting = 9999ULL; + +/* Saved as part of the task context. If ullPortTaskHasFPUContext is non-zero +then floating point context must be saved and restored for the task. */ +uint64_t ullPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint64_t ullPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint64_t ullPortInterruptNesting = 0; + +/* Used in the ASM code. */ +__attribute__(( used )) const uint64_t ullMaxAPIPriorityMask = ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First all the general purpose registers. */ + pxTopOfStack--; + *pxTopOfStack = 0x0101010101010101ULL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = 0x0303030303030303ULL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = 0x0202020202020202ULL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = 0x0505050505050505ULL; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = 0x0404040404040404ULL; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = 0x0707070707070707ULL; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = 0x0606060606060606ULL; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = 0x0909090909090909ULL; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = 0x0808080808080808ULL; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = 0x1111111111111111ULL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = 0x1010101010101010ULL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = 0x1313131313131313ULL; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = 0x1212121212121212ULL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = 0x1515151515151515ULL; /* R15 */ + pxTopOfStack--; + *pxTopOfStack = 0x1414141414141414ULL; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = 0x1717171717171717ULL; /* R17 */ + pxTopOfStack--; + *pxTopOfStack = 0x1616161616161616ULL; /* R16 */ + pxTopOfStack--; + *pxTopOfStack = 0x1919191919191919ULL; /* R19 */ + pxTopOfStack--; + *pxTopOfStack = 0x1818181818181818ULL; /* R18 */ + pxTopOfStack--; + *pxTopOfStack = 0x2121212121212121ULL; /* R21 */ + pxTopOfStack--; + *pxTopOfStack = 0x2020202020202020ULL; /* R20 */ + pxTopOfStack--; + *pxTopOfStack = 0x2323232323232323ULL; /* R23 */ + pxTopOfStack--; + *pxTopOfStack = 0x2222222222222222ULL; /* R22 */ + pxTopOfStack--; + *pxTopOfStack = 0x2525252525252525ULL; /* R25 */ + pxTopOfStack--; + *pxTopOfStack = 0x2424242424242424ULL; /* R24 */ + pxTopOfStack--; + *pxTopOfStack = 0x2727272727272727ULL; /* R27 */ + pxTopOfStack--; + *pxTopOfStack = 0x2626262626262626ULL; /* R26 */ + pxTopOfStack--; + *pxTopOfStack = 0x2929292929292929ULL; /* R29 */ + pxTopOfStack--; + *pxTopOfStack = 0x2828282828282828ULL; /* R28 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00; /* XZR - has no effect, used so there are an even number of registers. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00; /* R30 - procedure call link register. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_PSTATE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) pxCode; /* Exception return address. */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + __asm volatile ( "MRS %0, CurrentEL" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + +#if defined( GUEST ) + configASSERT( ulAPSR == portEL1 ); + if( ulAPSR == portEL1 ) +#else + configASSERT( ulAPSR == portEL3 ); + if( ulAPSR == portEL3 ) +#endif + { + /* Interrupts are turned off in the CPU itself to ensure a tick does + not execute while the scheduler is being started. Interrupts are + automatically turned back on in the CPU when the first task starts + executing. */ + portDISABLE_INTERRUPTS(); + + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ullCriticalNesting == 1000ULL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Mask interrupts up to the max syscall interrupt priority. */ + uxPortSetInterruptMask(); + + /* Now interrupts are disabled ullCriticalNesting can be accessed + directly. Increment ullCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ullCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ullCriticalNesting == 1ULL ) + { + configASSERT( ullPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ullCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ullCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ullCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Must be the lowest possible priority. */ + #if !defined( QEMU ) + { + uint64_t ullRunningInterruptPriority; + /* s3_0_c12_c11_3 is ICC_RPR_EL1. */ + __asm volatile ( "MRS %0, s3_0_c12_c11_3" : "=r" ( ullRunningInterruptPriority ) ); + configASSERT( ullRunningInterruptPriority == ( portLOWEST_USABLE_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + } + #endif + + /* Interrupts should not be enabled before this point. */ + #if( configASSERT_DEFINED == 1 ) + { + uint32_t ulMaskBits; + + __asm volatile( "MRS %0, DAIF" : "=r"( ulMaskBits ) :: "memory" ); + configASSERT( ( ulMaskBits & portDAIF_I ) != 0 ); + } + #endif /* configASSERT_DEFINED */ + + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. It is + necessary to turn off interrupts in the CPU itself while the ICCPMR is being + updated. */ + /* s3_0_c4_c6_0 is ICC_PMR_EL1. */ + __asm volatile ( "MSR s3_0_c4_c6_0, %0 \n" + "DSB SY \n" + "ISB SY \n" + :: "r" ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) : "memory" ); + + /* Ok to enable interrupts after the interrupt source has been cleared. */ + configCLEAR_TICK_INTERRUPT(); + portENABLE_INTERRUPTS(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ullPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ullPortTaskHasFPUContext = pdTRUE; + + /* Consider initialising the FPSR here - but probably not necessary in + AArch64. */ +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( UBaseType_t uxNewMaskValue ) +{ + if( uxNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxPortSetInterruptMask( void ) +{ +uint32_t ulReturn; +uint64_t ullPMRValue; + + /* Interrupt in the CPU must be turned off while the ICCPMR is being + updated. */ + portDISABLE_INTERRUPTS(); + /* s3_0_c4_c6_0 is ICC_PMR_EL1. */ + __asm volatile ( "MRS %0, s3_0_c4_c6_0" : "=r" ( ullPMRValue ) ); + if( ullPMRValue == ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + /* s3_0_c4_c6_0 is ICC_PMR_EL1. */ + __asm volatile ( "MSR s3_0_c4_c6_0, %0 \n" + "DSB SY \n" + "ISB SY \n" + :: "r" ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) : "memory" ); + } + + portENABLE_INTERRUPTS(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. */ + uint64_t ullRunningInterruptPriority; + /* s3_0_c12_c11_3 is ICC_RPR_EL1. */ + __asm volatile ( "MRS %0, s3_0_c12_c11_3" : "=r" ( ullRunningInterruptPriority ) ); + configASSERT( ullRunningInterruptPriority >= ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S new file mode 100644 index 0000000..67fdcc9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S @@ -0,0 +1,421 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + .text + + /* Variables and functions. */ + .extern ullMaxAPIPriorityMask + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vApplicationIRQHandler + .extern ullPortInterruptNesting + .extern ullPortTaskHasFPUContext + .extern ullCriticalNesting + .extern ullPortYieldRequired + .extern _freertos_vector_table + + .global FreeRTOS_IRQ_Handler + .global FreeRTOS_SWI_Handler + .global vPortRestoreTaskContext + + +.macro portSAVE_CONTEXT + + /* Switch to use the EL0 stack pointer. */ + MSR SPSEL, #0 + + /* Save the entire context. */ + STP X0, X1, [SP, #-0x10]! + STP X2, X3, [SP, #-0x10]! + STP X4, X5, [SP, #-0x10]! + STP X6, X7, [SP, #-0x10]! + STP X8, X9, [SP, #-0x10]! + STP X10, X11, [SP, #-0x10]! + STP X12, X13, [SP, #-0x10]! + STP X14, X15, [SP, #-0x10]! + STP X16, X17, [SP, #-0x10]! + STP X18, X19, [SP, #-0x10]! + STP X20, X21, [SP, #-0x10]! + STP X22, X23, [SP, #-0x10]! + STP X24, X25, [SP, #-0x10]! + STP X26, X27, [SP, #-0x10]! + STP X28, X29, [SP, #-0x10]! + STP X30, XZR, [SP, #-0x10]! + + /* Save the SPSR. */ +#if defined( GUEST ) + MRS X3, SPSR_EL1 + MRS X2, ELR_EL1 +#else + MRS X3, SPSR_EL3 + /* Save the ELR. */ + MRS X2, ELR_EL3 +#endif + + STP X2, X3, [SP, #-0x10]! + + /* Save the critical section nesting depth. */ + LDR X0, ullCriticalNestingConst + LDR X3, [X0] + + /* Save the FPU context indicator. */ + LDR X0, ullPortTaskHasFPUContextConst + LDR X2, [X0] + + /* Save the FPU context, if any (32 128-bit registers). */ + CMP X2, #0 + B.EQ 1f + STP Q0, Q1, [SP,#-0x20]! + STP Q2, Q3, [SP,#-0x20]! + STP Q4, Q5, [SP,#-0x20]! + STP Q6, Q7, [SP,#-0x20]! + STP Q8, Q9, [SP,#-0x20]! + STP Q10, Q11, [SP,#-0x20]! + STP Q12, Q13, [SP,#-0x20]! + STP Q14, Q15, [SP,#-0x20]! + STP Q16, Q17, [SP,#-0x20]! + STP Q18, Q19, [SP,#-0x20]! + STP Q20, Q21, [SP,#-0x20]! + STP Q22, Q23, [SP,#-0x20]! + STP Q24, Q25, [SP,#-0x20]! + STP Q26, Q27, [SP,#-0x20]! + STP Q28, Q29, [SP,#-0x20]! + STP Q30, Q31, [SP,#-0x20]! + +1: + /* Store the critical nesting count and FPU context indicator. */ + STP X2, X3, [SP, #-0x10]! + + LDR X0, pxCurrentTCBConst + LDR X1, [X0] + MOV X0, SP /* Move SP into X0 for saving. */ + STR X0, [X1] + + /* Switch to use the ELx stack pointer. */ + MSR SPSEL, #1 + + .endm + +; /**********************************************************************/ + +.macro portRESTORE_CONTEXT + + /* Switch to use the EL0 stack pointer. */ + MSR SPSEL, #0 + + /* Set the SP to point to the stack of the task being restored. */ + LDR X0, pxCurrentTCBConst + LDR X1, [X0] + LDR X0, [X1] + MOV SP, X0 + + LDP X2, X3, [SP], #0x10 /* Critical nesting and FPU context. */ + + /* Set the PMR register to be correct for the current critical nesting + depth. */ + LDR X0, ullCriticalNestingConst /* X0 holds the address of ullCriticalNesting. */ + MOV X1, #255 /* X1 holds the unmask value. */ + CMP X3, #0 + B.EQ 1f + LDR X6, ullMaxAPIPriorityMaskConst + LDR X1, [X6] /* X1 holds the mask value. */ +1: + MSR s3_0_c4_c6_0, X1 /* Write the mask value to ICCPMR. s3_0_c4_c6_0 is ICC_PMR_EL1. */ + DSB SY /* _RB_Barriers probably not required here. */ + ISB SY + STR X3, [X0] /* Restore the task's critical nesting count. */ + + /* Restore the FPU context indicator. */ + LDR X0, ullPortTaskHasFPUContextConst + STR X2, [X0] + + /* Restore the FPU context, if any. */ + CMP X2, #0 + B.EQ 1f + LDP Q30, Q31, [SP], #0x20 + LDP Q28, Q29, [SP], #0x20 + LDP Q26, Q27, [SP], #0x20 + LDP Q24, Q25, [SP], #0x20 + LDP Q22, Q23, [SP], #0x20 + LDP Q20, Q21, [SP], #0x20 + LDP Q18, Q19, [SP], #0x20 + LDP Q16, Q17, [SP], #0x20 + LDP Q14, Q15, [SP], #0x20 + LDP Q12, Q13, [SP], #0x20 + LDP Q10, Q11, [SP], #0x20 + LDP Q8, Q9, [SP], #0x20 + LDP Q6, Q7, [SP], #0x20 + LDP Q4, Q5, [SP], #0x20 + LDP Q2, Q3, [SP], #0x20 + LDP Q0, Q1, [SP], #0x20 +1: + LDP X2, X3, [SP], #0x10 /* SPSR and ELR. */ + +#if defined( GUEST ) + /* Restore the SPSR. */ + MSR SPSR_EL1, X3 + /* Restore the ELR. */ + MSR ELR_EL1, X2 +#else + /* Restore the SPSR. */ + MSR SPSR_EL3, X3 /*_RB_ Assumes started in EL3. */ + /* Restore the ELR. */ + MSR ELR_EL3, X2 +#endif + + LDP X30, XZR, [SP], #0x10 + LDP X28, X29, [SP], #0x10 + LDP X26, X27, [SP], #0x10 + LDP X24, X25, [SP], #0x10 + LDP X22, X23, [SP], #0x10 + LDP X20, X21, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + /* Switch to use the ELx stack pointer. _RB_ Might not be required. */ + MSR SPSEL, #1 + + ERET + + .endm + + +/****************************************************************************** + * FreeRTOS_SWI_Handler handler is used to perform a context switch. + *****************************************************************************/ +.align 8 +.type FreeRTOS_SWI_Handler, %function +FreeRTOS_SWI_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT +#if defined( GUEST ) + MRS X0, ESR_EL1 +#else + MRS X0, ESR_EL3 +#endif + + LSR X1, X0, #26 + +#if defined( GUEST ) + CMP X1, #0x15 /* 0x15 = SVC instruction. */ +#else + CMP X1, #0x17 /* 0x17 = SMC instruction. */ +#endif + B.NE FreeRTOS_Abort + BL vTaskSwitchContext + + portRESTORE_CONTEXT + +FreeRTOS_Abort: + /* Full ESR is in X0, exception class code is in X1. */ + B . + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +.align 8 +.type vPortRestoreTaskContext, %function +vPortRestoreTaskContext: +.set freertos_vector_base, _freertos_vector_table + + /* Install the FreeRTOS interrupt handlers. */ + LDR X1, =freertos_vector_base +#if defined( GUEST ) + MSR VBAR_EL1, X1 +#else + MSR VBAR_EL3, X1 +#endif + DSB SY + ISB SY + + /* Start the first task. */ + portRESTORE_CONTEXT + + +/****************************************************************************** + * FreeRTOS_IRQ_Handler handles IRQ entry and exit. + + * This handler is supposed to be used only for IRQs and never for FIQs. Per ARM + * GIC documentation [1], Group 0 interrupts are always signaled as FIQs. Since + * this handler is only for IRQs, We can safely assume Group 1 while accessing + * Interrupt Acknowledge and End Of Interrupt registers and therefore, use + * ICC_IAR1_EL1 and ICC_EOIR1_EL1. + * + * [1] https://developer.arm.com/documentation/198123/0300/Arm-CoreLink-GIC-fundamentals + *****************************************************************************/ +.align 8 +.type FreeRTOS_IRQ_Handler, %function +FreeRTOS_IRQ_Handler: + /* Save volatile registers. */ + STP X0, X1, [SP, #-0x10]! + STP X2, X3, [SP, #-0x10]! + STP X4, X5, [SP, #-0x10]! + STP X6, X7, [SP, #-0x10]! + STP X8, X9, [SP, #-0x10]! + STP X10, X11, [SP, #-0x10]! + STP X12, X13, [SP, #-0x10]! + STP X14, X15, [SP, #-0x10]! + STP X16, X17, [SP, #-0x10]! + STP X18, X19, [SP, #-0x10]! + STP X29, X30, [SP, #-0x10]! + + /* Save the SPSR and ELR. */ +#if defined( GUEST ) + MRS X3, SPSR_EL1 + MRS X2, ELR_EL1 +#else + MRS X3, SPSR_EL3 + MRS X2, ELR_EL3 +#endif + STP X2, X3, [SP, #-0x10]! + + /* Increment the interrupt nesting counter. */ + LDR X5, ullPortInterruptNestingConst + LDR X1, [X5] /* Old nesting count in X1. */ + ADD X6, X1, #1 + STR X6, [X5] /* Address of nesting count variable in X5. */ + + /* Maintain the interrupt nesting information across the function call. */ + STP X1, X5, [SP, #-0x10]! + + /* Read interrupt ID from the interrupt acknowledge register and store it + in X0 for future parameter and interrupt clearing use. */ + MRS X0, S3_0_C12_C12_0 /* S3_0_C12_C12_0 is ICC_IAR1_EL1. */ + + /* Maintain the interrupt ID value across the function call. */ + STP X0, X1, [SP, #-0x10]! + + /* Call the C handler. */ + BL vApplicationIRQHandler + + /* Disable interrupts. */ + MSR DAIFSET, #2 + DSB SY + ISB SY + + /* Restore the interrupt ID value. */ + LDP X0, X1, [SP], #0x10 + + /* End IRQ processing by writing interrupt ID value to the EOI register. */ + MSR S3_0_C12_C12_1, X0 /* S3_0_C12_C12_1 is ICC_EOIR1_EL1. */ + + /* Restore the critical nesting count. */ + LDP X1, X5, [SP], #0x10 + STR X1, [X5] + + /* Has interrupt nesting unwound? */ + CMP X1, #0 + B.NE Exit_IRQ_No_Context_Switch + + /* Is a context switch required? */ + LDR X0, ullPortYieldRequiredConst + LDR X1, [X0] + CMP X1, #0 + B.EQ Exit_IRQ_No_Context_Switch + + /* Reset ullPortYieldRequired to 0. */ + MOV X2, #0 + STR X2, [X0] + + /* Restore volatile registers. */ + LDP X4, X5, [SP], #0x10 /* SPSR and ELR. */ +#if defined( GUEST ) + MSR SPSR_EL1, X5 + MSR ELR_EL1, X4 +#else + MSR SPSR_EL3, X5 /*_RB_ Assumes started in EL3. */ + MSR ELR_EL3, X4 +#endif + DSB SY + ISB SY + + LDP X29, X30, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + BL vTaskSwitchContext + portRESTORE_CONTEXT + +Exit_IRQ_No_Context_Switch: + /* Restore volatile registers. */ + LDP X4, X5, [SP], #0x10 /* SPSR and ELR. */ +#if defined( GUEST ) + MSR SPSR_EL1, X5 + MSR ELR_EL1, X4 +#else + MSR SPSR_EL3, X5 /*_RB_ Assumes started in EL3. */ + MSR ELR_EL3, X4 +#endif + DSB SY + ISB SY + + LDP X29, X30, [SP], #0x10 + LDP X18, X19, [SP], #0x10 + LDP X16, X17, [SP], #0x10 + LDP X14, X15, [SP], #0x10 + LDP X12, X13, [SP], #0x10 + LDP X10, X11, [SP], #0x10 + LDP X8, X9, [SP], #0x10 + LDP X6, X7, [SP], #0x10 + LDP X4, X5, [SP], #0x10 + LDP X2, X3, [SP], #0x10 + LDP X0, X1, [SP], #0x10 + + ERET + + + + +.align 8 +pxCurrentTCBConst: .dword pxCurrentTCB +ullCriticalNestingConst: .dword ullCriticalNesting +ullPortTaskHasFPUContextConst: .dword ullPortTaskHasFPUContext + +ullMaxAPIPriorityMaskConst: .dword ullMaxAPIPriorityMask +ullPortInterruptNestingConst: .dword ullPortInterruptNesting +ullPortYieldRequiredConst: .dword ullPortYieldRequired + +.end diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h new file mode 100644 index 0000000..c94fe9d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h @@ -0,0 +1,197 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE size_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef portBASE_TYPE BaseType_t; +typedef uint64_t UBaseType_t; + +typedef uint64_t TickType_t; +#define portMAX_DELAY ( ( TickType_t ) 0xffffffffffffffff ) + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 16 +#define portPOINTER_SIZE_TYPE uint64_t + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern uint64_t ullPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ullPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#if defined( GUEST ) + #define portYIELD() __asm volatile ( "SVC 0" ::: "memory" ) +#else + #define portYIELD() __asm volatile ( "SMC 0" ::: "memory" ) +#endif +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern UBaseType_t uxPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( UBaseType_t uxNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +#define portDISABLE_INTERRUPTS() \ + __asm volatile ( "MSR DAIFSET, #2" ::: "memory" ); \ + __asm volatile ( "DSB SY" ); \ + __asm volatile ( "ISB SY" ); + +#define portENABLE_INTERRUPTS() \ + __asm volatile ( "MSR DAIFCLR, #2" ::: "memory" ); \ + __asm volatile ( "DSB SY" ); \ + __asm volatile ( "ISB SY" ); + + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif /* configASSERT */ + +#define portNOP() __asm volatile( "NOP" ) +#define portINLINE __inline + +#ifdef __cplusplus + } /* extern C */ +#endif + + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/port.c new file mode 100644 index 0000000..cc1e3fc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/port.c @@ -0,0 +1,570 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +/* Some vendor specific files default configCLEAR_TICK_INTERRUPT() in +portmacro.h. */ +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINTERRUPT_ENABLE_BIT ( 0x80UL ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary +point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* The critical section macros only mask interrupts up to an application +determined priority level. Sometimes it is necessary to turn interrupt off in +the CPU itself before modifying certain hardware registers. */ +#define portCPU_IRQ_DISABLE() \ + __asm volatile ( "CPSID i" ::: "memory" ); \ + __asm volatile ( "DSB" ); \ + __asm volatile ( "ISB" ); + +#define portCPU_IRQ_ENABLE() \ + __asm volatile ( "CPSIE i" ::: "memory" ); \ + __asm volatile ( "DSB" ); \ + __asm volatile ( "ISB" ); + + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + portCPU_IRQ_DISABLE(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm volatile ( "DSB \n" \ + "ISB \n" ); \ + portCPU_IRQ_ENABLE(); \ +} + +#define portINTERRUPT_PRIORITY_REGISTER_OFFSET 0x400UL +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portBIT_0_SET ( ( uint8_t ) 0x01 ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* The space on the stack required to hold the FPU registers. This is 32 64-bit +registers, plus a 32-bit status register. */ +#define portFPU_REGISTER_WORDS ( ( 32 * 2 ) + 1 ) + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/* + * If the application provides an implementation of vApplicationIRQHandler(), + * then it will get called directly without saving the FPU registers on + * interrupt entry, and this weak implementation of + * vApplicationFPUSafeIRQHandler() is just provided to remove linkage errors - + * it should never actually get called so its implementation contains a + * call to configASSERT() that will always fail. + * + * If the application provides its own implementation of + * vApplicationFPUSafeIRQHandler() then the implementation of + * vApplicationIRQHandler() provided in portASM.S will save the FPU registers + * before calling it. + * + * Therefore, if the application writer wants FPU registers to be saved on + * interrupt entry their IRQ handler must be called + * vApplicationFPUSafeIRQHandler(), and if the application writer does not want + * FPU registers to be saved on interrupt entry their IRQ handler must be + * called vApplicationIRQHandler(). + */ +void vApplicationFPUSafeIRQHandler( uint32_t ulICCIAR ) __attribute__((weak) ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then +a floating point context must be saved and restored for the task. */ +volatile uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +volatile uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +volatile uint32_t ulPortInterruptNesting = 0UL; + +/* Used in the asm file. */ +__attribute__(( used )) const uint32_t ulICCIAR = portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS; +__attribute__(( used )) const uint32_t ulICCEOIR = portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS; +__attribute__(( used )) const uint32_t ulICCPMR = portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS; +__attribute__(( used )) const uint32_t ulMaxAPIPriorityMask = ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + #if( configUSE_TASK_FPU_SUPPORT == 1 ) + { + /* The task will start without a floating point context. A task that + uses the floating point hardware must call vPortTaskUsesFPU() before + executing any floating point instructions. */ + pxTopOfStack--; + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + } + #elif( configUSE_TASK_FPU_SUPPORT == 2 ) + { + /* The task will start with a floating point context. Leave enough + space for the registers - and ensure they are initialised to 0. */ + pxTopOfStack -= portFPU_REGISTER_WORDS; + memset( pxTopOfStack, 0x00, portFPU_REGISTER_WORDS * sizeof( StackType_t ) ); + + pxTopOfStack--; + *pxTopOfStack = pdTRUE; + ulPortTaskHasFPUContext = pdTRUE; + } + #else + { + #error Invalid configUSE_TASK_FPU_SUPPORT setting - configUSE_TASK_FPU_SUPPORT must be set to 1, 2, or left undefined. + } + #endif + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + #if( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + portINTERRUPT_PRIORITY_REGISTER_OFFSET ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine how many priority bits are implemented in the GIC. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to + all possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Shift to the least significant bits. */ + while( ( ucMaxPriorityValue & portBIT_0_SET ) != portBIT_0_SET ) + { + ucMaxPriorityValue >>= ( uint8_t ) 0x01; + } + + /* Sanity check configUNIQUE_INTERRUPT_PRIORITIES matches the read + value. */ + configASSERT( ucMaxPriorityValue == portLOWEST_INTERRUPT_PRIORITY ); + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) :: "memory" ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Only continue if the binary point value is set to its lowest possible + setting. See the comments in vPortValidateInterruptPriority() below for + more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Interrupts are turned off in the CPU itself to ensure tick does + not execute while the scheduler is being started. Interrupts are + automatically turned back on in the CPU when the first task starts + executing. */ + portCPU_IRQ_DISABLE(); + + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. prvTaskExitError() is referenced to prevent a compiler + warning about it being defined but not referenced in the case that the user + defines their own exit address. */ + ( void ) prvTaskExitError; + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Mask interrupts up to the max syscall interrupt priority. */ + ulPortSetInterruptMask(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. It is + necessary to turn off interrupts in the CPU itself while the ICCPMR is being + updated. */ + portCPU_IRQ_DISABLE(); + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb \n" + "isb \n" ::: "memory" ); + portCPU_IRQ_ENABLE(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_FPU_SUPPORT != 2 ) + + void vPortTaskUsesFPU( void ) + { + uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm volatile ( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) : "memory" ); + } + +#endif /* configUSE_TASK_FPU_SUPPORT */ +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + if( ulNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ +uint32_t ulReturn; + + /* Interrupt in the CPU must be turned off while the ICCPMR is being + updated. */ + portCPU_IRQ_DISABLE(); + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb \n" + "isb \n" ::: "memory" ); + } + portCPU_IRQ_ENABLE(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. */ + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + The priority grouping is configured by the GIC's binary point register + (ICCBPR). Writting 0 to ICCBPR will ensure it is set to its lowest + possible value (which may be above 0). */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + +void vApplicationFPUSafeIRQHandler( uint32_t ulICCIAR ) +{ + ( void ) ulICCIAR; + configASSERT( ( volatile void * ) NULL ); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portASM.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portASM.S new file mode 100644 index 0000000..87bad47 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portASM.S @@ -0,0 +1,324 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + .eabi_attribute Tag_ABI_align_preserved, 1 + .text + .arm + + .set SYS_MODE, 0x1f + .set SVC_MODE, 0x13 + .set IRQ_MODE, 0x12 + + /* Hardware registers. */ + .extern ulICCIAR + .extern ulICCEOIR + .extern ulICCPMR + + /* Variables and functions. */ + .extern ulMaxAPIPriorityMask + .extern _freertos_vector_table + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vApplicationIRQHandler + .extern ulPortInterruptNesting + .extern ulPortTaskHasFPUContext + + .global FreeRTOS_IRQ_Handler + .global FreeRTOS_SWI_Handler + .global vPortRestoreTaskContext + + + + +.macro portSAVE_CONTEXT + + /* Save the LR and SPSR onto the system mode stack before switching to + system mode to save the remaining system mode registers. */ + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + /* Push the critical nesting count. */ + LDR R2, ulCriticalNestingConst + LDR R1, [R2] + PUSH {R1} + + /* Does the task have a floating point context that needs saving? If + ulPortTaskHasFPUContext is 0 then no. */ + LDR R2, ulPortTaskHasFPUContextConst + LDR R3, [R2] + CMP R3, #0 + + /* Save the floating point context, if any. */ + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} + VPUSHNE {D16-D31} + PUSHNE {R1} + + /* Save ulPortTaskHasFPUContext itself. */ + PUSH {R3} + + /* Save the stack pointer in the TCB. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + STR SP, [R1] + + .endm + +; /**********************************************************************/ + +.macro portRESTORE_CONTEXT + + /* Set the SP to point to the stack of the task being restored. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + LDR SP, [R1] + + /* Is there a floating point context to restore? If the restored + ulPortTaskHasFPUContext is zero then no. */ + LDR R0, ulPortTaskHasFPUContextConst + POP {R1} + STR R1, [R0] + CMP R1, #0 + + /* Restore the floating point context, if any. */ + POPNE {R0} + VPOPNE {D16-D31} + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + /* Restore the critical section nesting depth. */ + LDR R0, ulCriticalNestingConst + POP {R1} + STR R1, [R0] + + /* Ensure the priority mask is correct for the critical nesting depth. */ + LDR R2, ulICCPMRConst + LDR R2, [R2] + CMP R1, #0 + MOVEQ R4, #255 + LDRNE R4, ulMaxAPIPriorityMaskConst + LDRNE R4, [R4] + STR R4, [R2] + + /* Restore all system mode registers other than the SP (which is already + being used). */ + POP {R0-R12, R14} + + /* Return to the task code, loading CPSR on the way. */ + RFEIA sp! + + .endm + + + + +/****************************************************************************** + * SVC handler is used to start the scheduler. + *****************************************************************************/ +.align 4 +.type FreeRTOS_SWI_Handler, %function +FreeRTOS_SWI_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + LDR R0, vTaskSwitchContextConst + BLX R0 + portRESTORE_CONTEXT + + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +.type vPortRestoreTaskContext, %function +vPortRestoreTaskContext: + /* Switch to system mode. */ + CPS #SYS_MODE + portRESTORE_CONTEXT + +.align 4 +.type FreeRTOS_IRQ_Handler, %function +FreeRTOS_IRQ_Handler: + /* Return to the interrupted instruction. */ + SUB lr, lr, #4 + + /* Push the return address and SPSR. */ + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + /* Change to supervisor mode to allow reentry. */ + CPS #SVC_MODE + + /* Push used registers. */ + PUSH {r0-r4, r12} + + /* Increment nesting count. r3 holds the address of ulPortInterruptNesting + for future use. r1 holds the original ulPortInterruptNesting value for + future use. */ + LDR r3, ulPortInterruptNestingConst + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + /* Read value from the interrupt acknowledge register, which is stored in r0 + for future parameter and interrupt clearing use. */ + LDR r2, ulICCIARConst + LDR r2, [r2] + LDR r0, [r2] + + /* Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + future use. _RB_ Does this ever actually need to be done provided the start + of the stack is 8-byte aligned? */ + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + /* Call the interrupt handler. r4 pushed to maintain alignment. */ + PUSH {r0-r4, lr} + LDR r1, vApplicationIRQHandlerConst + BLX r1 + POP {r0-r4, lr} + ADD sp, sp, r2 + + CPSID i + DSB + ISB + + /* Write the value read from ICCIAR to ICCEOIR. */ + LDR r4, ulICCEOIRConst + LDR r4, [r4] + STR r0, [r4] + + /* Restore the old nesting count. */ + STR r1, [r3] + + /* A context switch is never performed if the nesting count is not 0. */ + CMP r1, #0 + BNE exit_without_switch + + /* Did the interrupt request a context switch? r1 holds the address of + ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + use. */ + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch: + /* No context switch. Restore used registers, LR_irq and SPSR before + returning. */ + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit: + /* A context swtich is to be performed. Clear the context switch pending + flag. */ + MOV r0, #0 + STR r0, [r1] + + /* Restore used registers, LR-irq and SPSR before saving the context + to the task stack. */ + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + /* Call the function that selects the new task to execute. + vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + instructions, or 8 byte aligned stack allocated data. LR does not need + saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */ + LDR R0, vTaskSwitchContextConst + BLX R0 + + /* Restore the context of, and branch to, the task selected to execute + next. */ + portRESTORE_CONTEXT + + +/****************************************************************************** + * If the application provides an implementation of vApplicationIRQHandler(), + * then it will get called directly without saving the FPU registers on + * interrupt entry, and this weak implementation of + * vApplicationIRQHandler() will not get called. + * + * If the application provides its own implementation of + * vApplicationFPUSafeIRQHandler() then this implementation of + * vApplicationIRQHandler() will be called, save the FPU registers, and then + * call vApplicationFPUSafeIRQHandler(). + * + * Therefore, if the application writer wants FPU registers to be saved on + * interrupt entry their IRQ handler must be called + * vApplicationFPUSafeIRQHandler(), and if the application writer does not want + * FPU registers to be saved on interrupt entry their IRQ handler must be + * called vApplicationIRQHandler(). + *****************************************************************************/ + +.align 4 +.weak vApplicationIRQHandler +.type vApplicationIRQHandler, %function +vApplicationIRQHandler: + PUSH {LR} + FMRX R1, FPSCR + VPUSH {D0-D15} + VPUSH {D16-D31} + PUSH {R1} + + LDR r1, vApplicationFPUSafeIRQHandlerConst + BLX r1 + + POP {R0} + VPOP {D16-D31} + VPOP {D0-D15} + VMSR FPSCR, R0 + + POP {PC} + + +ulICCIARConst: .word ulICCIAR +ulICCEOIRConst: .word ulICCEOIR +ulICCPMRConst: .word ulICCPMR +pxCurrentTCBConst: .word pxCurrentTCB +ulCriticalNestingConst: .word ulCriticalNesting +ulPortTaskHasFPUContextConst: .word ulPortTaskHasFPUContext +ulMaxAPIPriorityMaskConst: .word ulMaxAPIPriorityMask +vTaskSwitchContextConst: .word vTaskSwitchContext +vApplicationIRQHandlerConst: .word vApplicationIRQHandler +ulPortInterruptNestingConst: .word ulPortInterruptNesting +vApplicationFPUSafeIRQHandlerConst: .word vApplicationFPUSafeIRQHandler + +.end + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portmacro.h new file mode 100644 index 0000000..30d3034 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portmacro.h @@ -0,0 +1,209 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef uint32_t TickType_t; +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm volatile ( "SWI 0" ::: "memory" ); + + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* If configUSE_TASK_FPU_SUPPORT is set to 1 (or left undefined) then tasks are +created without an FPU context and must call vPortTaskUsesFPU() to give +themselves an FPU context before using any FPU instructions. If +configUSE_TASK_FPU_SUPPORT is set to 2 then all tasks will have an FPU context +by default. */ +#if( configUSE_TASK_FPU_SUPPORT != 2 ) + void vPortTaskUsesFPU( void ); +#else + /* Each task has an FPU context already, so define this function away to + nothing to prevent it being called accidentally. */ + #define vPortTaskUsesFPU() +#endif +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif /* configASSERT */ + +#define portNOP() __asm volatile( "NOP" ) +#define portINLINE __inline + +#ifdef __cplusplus + } /* extern C */ +#endif + + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +/* Interrupt controller access addresses. */ +#define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) +#define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) +#define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) +#define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) + +#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) +#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) +#define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) +#define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + +#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/port.c new file mode 100644 index 0000000..3a93cea --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/port.c @@ -0,0 +1,633 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM0 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#ifndef portMISSED_COUNTS_FACTOR + #define portMISSED_COUNTS_FACTOR ( 94UL ) +#endif + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void vPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being defined + * but never called. ulDummy is used purely to quieten other warnings + * about code appearing after this function is called - making ulDummy + * volatile makes the compiler think the function could return and + * therefore not output an 'unreachable code' warning for code that appears + * after it. */ + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* This function is no longer used, but retained for backward + * compatibility. */ +} +/*-----------------------------------------------------------*/ + +void vPortStartFirstTask( void ) +{ + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + * table offset register that can be used to locate the initial stack value. + * Not all M0 parts have the application vector table at address 0. */ + __asm volatile ( + " .syntax unified \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Obtain location of pxCurrentTCB. */ + " ldr r3, [r2] \n" + " ldr r0, [r3] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " movs r0, #2 \n"/* Switch to the psp stack. */ + " msr CONTROL, r0 \n" + " isb \n" + " pop {r0-r5} \n"/* Pop the registers that are saved automatically. */ + " mov lr, r5 \n"/* lr is now in r5. */ + " pop {r3} \n"/* Return address is now in r3. */ + " pop {r2} \n"/* Pop and discard XPSR. */ + " cpsie i \n"/* The first task has its context and interrupts can be enabled. */ + " bx r3 \n"/* Finally, jump to the user defined task code. */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB " + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + * within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMaskFromISR( void ) +{ + __asm volatile ( + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr " + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMaskFromISR( __attribute__( ( unused ) ) uint32_t ulMask ) +{ + __asm volatile ( + " msr PRIMASK, r0 \n" + " bx lr " + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " .syntax unified \n" + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " subs r0, r0, #32 \n"/* Make space for the remaining low registers. */ + " str r0, [r2] \n"/* Save the new top of stack. */ + " stmia r0!, {r4-r7} \n"/* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n"/* Store the high registers. */ + " mov r5, r9 \n" + " mov r6, r10 \n" + " mov r7, r11 \n" + " stmia r0!, {r4-r7} \n" + " \n" + " push {r3, r14} \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " pop {r2, r3} \n"/* lr goes in r3. r2 now holds tcb pointer. */ + " \n" + " ldr r1, [r2] \n" + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, r0, #16 \n"/* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n"/* Pop the high registers. */ + " mov r8, r4 \n" + " mov r9, r5 \n" + " mov r10, r6 \n" + " mov r11, r7 \n" + " \n" + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " \n" + " subs r0, r0, #32 \n"/* Go back for the low registers that are not automatically restored. */ + " ldmia r0!, {r4-r7} \n"/* Pop low registers. */ + " \n" + " bx r3 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB " + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/portmacro.h new file mode 100644 index 0000000..c56d47e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/portmacro.h @@ -0,0 +1,125 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + extern void vPortYield( void ); + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portYIELD() vPortYield() + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulSetInterruptMaskFromISR( void ) __attribute__( ( naked ) ); + extern void vClearInterruptMaskFromISR( uint32_t ulMask ) __attribute__( ( naked ) ); + + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMaskFromISR( x ) + #define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) + #define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + + #define portNOP() + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.c new file mode 100644 index 0000000..c3a9782 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.c @@ -0,0 +1,478 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r3, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r3] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r5, #1 \n"/* r5 = 1. */ + " bics r4, r5 \n"/* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + " ldr r4, [r3] \n"/* r4 = *r3 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + " movs r5, #4 \n"/* r5 = 4. */ + " str r5, [r2] \n"/* Program RNR = 4. */ + " ldmia r3!, {r6,r7} \n"/* Read first set of RBAR/RLAR from TCB. */ + " ldr r4, xRBARConst2 \n"/* r4 = 0xe000ed9c [Location of RBAR]. */ + " stmia r4!, {r6,r7} \n"/* Write first set of RBAR/RLAR registers. */ + " movs r5, #5 \n"/* r5 = 5. */ + " str r5, [r2] \n"/* Program RNR = 5. */ + " ldmia r3!, {r6,r7} \n"/* Read second set of RBAR/RLAR from TCB. */ + " ldr r4, xRBARConst2 \n"/* r4 = 0xe000ed9c [Location of RBAR]. */ + " stmia r4!, {r6,r7} \n"/* Write second set of RBAR/RLAR registers. */ + " movs r5, #6 \n"/* r5 = 6. */ + " str r5, [r2] \n"/* Program RNR = 6. */ + " ldmia r3!, {r6,r7} \n"/* Read third set of RBAR/RLAR from TCB. */ + " ldr r4, xRBARConst2 \n"/* r4 = 0xe000ed9c [Location of RBAR]. */ + " stmia r4!, {r6,r7} \n"/* Write third set of RBAR/RLAR registers. */ + " movs r5, #7 \n"/* r5 = 7. */ + " str r5, [r2] \n"/* Program RNR = 7. */ + " ldmia r3!, {r6,r7} \n"/* Read fourth set of RBAR/RLAR from TCB. */ + " ldr r4, xRBARConst2 \n"/* r4 = 0xe000ed9c [Location of RBAR]. */ + " stmia r4!, {r6,r7} \n"/* Write fourth set of RBAR/RLAR registers. */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r5, #1 \n"/* r5 = 1. */ + " orrs r4, r5 \n"/* r4 = r4 | r5 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r4} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + " ldr r5, xSecureContextConst2 \n" + " str r1, [r5] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " msr control, r3 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r4 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + " ldr r4, xSecureContextConst2 \n" + " str r1, [r4] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + "xSecureContextConst2: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " movs r1, #1 \n"/* r1 = 1. */ + " tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */ + " beq running_privileged \n"/* If the result of previous AND operation was 0, branch. */ + " movs r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " bx lr \n"/* Return. */ + " running_privileged: \n" + " movs r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " movs r1, #1 \n"/* r1 = 1. */ + " bics r0, r1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " movs r1, #1 \n"/* r1 = 1. */ + " orrs r0, r1 \n"/* r0 = r0 | r1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr \n" + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr PRIMASK, r0 \n" + " bx lr \n" + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " .extern SecureContext_SaveContext \n" + " .extern SecureContext_LoadContext \n" + " \n" + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " ldr r0, [r3] \n"/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later.*/ + " mrs r2, psp \n"/* Read PSP in r2. */ + " \n" + " cbz r0, save_ns_context \n"/* No secure context to save. */ + " push {r0-r2, r14} \n" + " bl SecureContext_SaveContext \n"/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r0-r3} \n"/* LR is now in r3. */ + " mov lr, r3 \n"/* LR = r3. */ + " lsls r1, r3, #25 \n"/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl save_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #16 \n"/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #12 \n"/* Make space for xSecureContext, PSPLIM and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " b select_next_task \n" + " \n" + " save_ns_context: \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #48 \n"/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #16 \n"/* r2 = r2 + 16. */ + " stmia r2!, {r4-r7} \n"/* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n"/* r4 = r8. */ + " mov r5, r9 \n"/* r5 = r9. */ + " mov r6, r10 \n"/* r6 = r10. */ + " mov r7, r11 \n"/* r7 = r11. */ + " stmia r2!, {r4-r7} \n"/* Store the high registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " subs r2, r2, #48 \n"/* r2 = r2 - 48. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #44 \n"/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3-r7} \n"/* Store xSecureContext, PSPLIM, LR and the low registers that are not saved automatically. */ + " mov r4, r8 \n"/* r4 = r8. */ + " mov r5, r9 \n"/* r5 = r9. */ + " mov r6, r10 \n"/* r6 = r10. */ + " mov r7, r11 \n"/* r7 = r11. */ + " stmia r2!, {r4-r7} \n"/* Store the high registers that are not saved automatically. */ + #endif /* configENABLE_MPU */ + " \n" + " select_next_task: \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " ldr r2, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " movs r5, #1 \n"/* r5 = 1. */ + " bics r4, r5 \n"/* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */ + " str r4, [r3] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r3, xMAIR0Const \n"/* r3 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r3] \n"/* Program MAIR0. */ + " ldr r4, xRNRConst \n"/* r4 = 0xe000ed98 [Location of RNR]. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " movs r5, #4 \n"/* r5 = 4. */ + " str r5, [r4] \n"/* Program RNR = 4. */ + " ldmia r1!, {r6,r7} \n"/* Read first set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r6,r7} \n"/* Write first set of RBAR/RLAR registers. */ + " movs r5, #5 \n"/* r5 = 5. */ + " str r5, [r4] \n"/* Program RNR = 5. */ + " ldmia r1!, {r6,r7} \n"/* Read second set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r6,r7} \n"/* Write second set of RBAR/RLAR registers. */ + " movs r5, #6 \n"/* r5 = 6. */ + " str r5, [r4] \n"/* Program RNR = 6. */ + " ldmia r1!, {r6,r7} \n"/* Read third set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r6,r7} \n"/* Write third set of RBAR/RLAR registers. */ + " movs r5, #7 \n"/* r5 = 7. */ + " str r5, [r4] \n"/* Program RNR = 7. */ + " ldmia r1!, {r6,r7} \n"/* Read fourth set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r6,r7} \n"/* Write fourth set of RBAR/RLAR registers. */ + " \n" + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " movs r5, #1 \n"/* r5 = 1. */ + " orrs r4, r5 \n"/* r4 = r4 | r5 i.e. Set the bit 0 in r4. */ + " str r4, [r3] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r2!, {r0, r1, r3, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r3 \n"/* Restore the CONTROL register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #else /* configENABLE_MPU */ + " ldmia r2!, {r0, r1, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #endif /* configENABLE_MPU */ + " \n" + " restore_ns_context: \n" + " adds r2, r2, #16 \n"/* Move to the high registers. */ + " ldmia r2!, {r4-r7} \n"/* Restore the high registers that are not automatically restored. */ + " mov r8, r4 \n"/* r8 = r4. */ + " mov r9, r5 \n"/* r9 = r5. */ + " mov r10, r6 \n"/* r10 = r6. */ + " mov r11, r7 \n"/* r11 = r7. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " subs r2, r2, #32 \n"/* Go back to the low registers. */ + " ldmia r2!, {r4-r7} \n"/* Restore the low registers that are not automatically restored. */ + " bx lr \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + "xSecureContextConst: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " movs r0, #4 \n" + " mov r1, lr \n" + " tst r0, r1 \n" + " beq stacking_used_msp \n" + " mrs r0, psp \n" + " ldr r2, svchandler_address_const \n" + " bx r2 \n" + " stacking_used_msp: \n" + " mrs r0, msp \n" + " ldr r2, svchandler_address_const \n" + " bx r2 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " svc %0 \n"/* Secure context is allocated in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */ + " ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */ + " cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */ + " bne free_secure_context \n"/* Branch if r1 != 0. */ + " bx lr \n"/* There is no secure context (xSecureContext is NULL). */ + " free_secure_context: \n" + " svc %0 \n"/* Secure context is freed in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_FREE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacro.h new file mode 100644 index 0000000..6852153 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M23" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.c new file mode 100644 index 0000000..1996693 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.c @@ -0,0 +1,351 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 + +/** + * @brief Size of stack seal values in bytes. + */ +#define securecontextSTACK_SEAL_SIZE 8 + +/** + * @brief Stack seal value as recommended by ARM. + */ +#define securecontextSTACK_SEAL_VALUE 0xFEF5EDA5 + +/** + * @brief Maximum number of secure contexts. + */ +#ifndef secureconfigMAX_SECURE_CONTEXTS + #define secureconfigMAX_SECURE_CONTEXTS 8UL +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Pre-allocated array of secure contexts. + */ +SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ]; +/*-----------------------------------------------------------*/ + +/** + * @brief Get a free secure context for a task from the secure context pool (xSecureContexts). + * + * This function ensures that only one secure context is allocated for a task. + * + * @param[in] pvTaskHandle The task handle for which the secure context is allocated. + * + * @return Index of a free secure context in the xSecureContexts array. + */ +static uint32_t ulGetSecureContext( void * pvTaskHandle ); + +/** + * @brief Return the secure context to the secure context pool (xSecureContexts). + * + * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array. + */ +static void vReturnSecureContext( uint32_t ulSecureContextIndex ); + +/* These are implemented in assembly. */ +extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ); +extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ); +/*-----------------------------------------------------------*/ + +static uint32_t ulGetSecureContext( void * pvTaskHandle ) +{ + /* Start with invalid index. */ + uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) && + ( xSecureContexts[ i ].pucStackLimit == NULL ) && + ( xSecureContexts[ i ].pucStackStart == NULL ) && + ( xSecureContexts[ i ].pvTaskHandle == NULL ) && + ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = i; + } + else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle ) + { + /* A task can only have one secure context. Do not allocate a second + * context for the same task. */ + ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + break; + } + } + + return ulSecureContextIndex; +} +/*-----------------------------------------------------------*/ + +static void vReturnSecureContext( uint32_t ulSecureContextIndex ) +{ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL; + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR, i; + static uint32_t ulSecureContextsInitialized = 0; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) ) + { + /* Ensure to initialize secure contexts only once. */ + ulSecureContextsInitialized = 1; + + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + /* Initialize all secure contexts. */ + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + xSecureContexts[ i ].pucCurrentStackPointer = NULL; + xSecureContexts[ i ].pucStackLimit = NULL; + xSecureContexts[ i ].pucStackStart = NULL; + xSecureContexts[ i ].pvTaskHandle = NULL; + } + + #if ( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ) +#endif /* configENABLE_MPU */ +{ + uint8_t * pucStackMemory = NULL; + uint8_t * pucStackLimit; + uint32_t ulIPSR, ulSecureContextIndex; + SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID; + + #if ( configENABLE_MPU == 1 ) + uint32_t * pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit + * Register (PSPLIM) value. */ + secureportREAD_IPSR( ulIPSR ); + secureportREAD_PSPLIM( pucStackLimit ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. + * Also do nothing, if a secure context us already loaded. PSPLIM is set to + * securecontextNO_STACK when no secure context is loaded. */ + if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) ) + { + /* Ontain a free secure context. */ + ulSecureContextIndex = ulGetSecureContext( pvTaskHandle ); + + /* Were we able to get a free context? */ + if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte for stack (excluding the space for seal values) + * because the hardware decrements the stack pointer before + * writing i.e. if stack pointer is 0x2, a push operation will + * decrement the stack pointer to 0x1 and then write at 0x1. */ + xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize; + + /* Seal the created secure process stack. */ + *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE; + *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory; + + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle; + + #if ( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart; + pulCurrentStackPointer--; + + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart; + } + #endif /* configENABLE_MPU */ + + /* Ensure to never return 0 as a valid context handle. */ + xSecureContextHandle = ulSecureContextIndex + 1UL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint32_t ulIPSR, ulSecureContextIndex; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Only free if a valid context handle is passed. */ + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + /* Ensure that the secure context being deleted is associated with + * the task. */ + if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) + { + /* Free the stack space. */ + vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit ); + + /* Return the secure context back to the free secure contexts pool. */ + vReturnSecureContext( ulSecureContextIndex ); + } + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that no secure context is loaded and the task is loading it's + * own context. */ + if( ( pucStackLimit == securecontextNO_STACK ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that task's context is loaded and the task is saving it's own + * context. */ + if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.h new file mode 100644 index 0000000..de33d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no secure context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Invalid context ID. + */ +#define securecontextINVALID_CONTEXT_ID 0UL +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent a secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first address of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t * pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t * pucStackStart; /**< First location of the stack memory. */ + void * pvTaskHandle; /**< Task handle of the task this context is associated with. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Opaque handle for a secure context. + */ +typedef uint32_t SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if ( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context_port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context_port.c new file mode 100644 index 0000000..3331fc3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context_port.c @@ -0,0 +1,99 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, load_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " ldmia r0!, {r1, r2} \n" /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r1!, {r3} \n" /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + " msr control, r3 \n" /* CONTROL = r3. */ + #endif /* configENABLE_MPU */ + " \n" + " msr psplim, r2 \n" /* PSPLIM = r2. */ + " msr psp, r1 \n" /* PSP = r1. */ + " \n" + " load_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::: "r0", "r1", "r2" + ); +} +/*-----------------------------------------------------------*/ + +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, save_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " mrs r1, psp \n" /* r1 = PSP. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " mrs r2, control \n" /* r2 = CONTROL. */ + " subs r1, r1, #4 \n" /* Make space for the CONTROL value on the stack. */ + " str r1, [r0] \n" /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + " stmia r1!, {r2} \n" /* Store CONTROL value on the stack. */ + #else /* configENABLE_MPU */ + " str r1, [r0] \n" /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + #endif /* configENABLE_MPU */ + " \n" + " movs r1, %0 \n" /* r1 = securecontextNO_STACK. */ + " msr psplim, r1 \n" /* PSPLIM = securecontextNO_STACK. */ + " msr psp, r1 \n" /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + " \n" + " save_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::"i" ( securecontextNO_STACK ) : "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.c new file mode 100644 index 0000000..b3bf007 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.c @@ -0,0 +1,454 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#ifndef secureconfigTOTAL_HEAP_SIZE + #define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) +#endif + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */ + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.h new file mode 100644 index 0000000..e469f2c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void * pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void * pv ); + +/** + * @brief Get the free heap size. + * + * @return Free heap size. + */ +size_t xPortGetFreeHeapSize( void ); + +/** + * @brief Get the minimum ever free heap size. + * + * @return Minimum ever free heap size. + */ +size_t xPortGetMinimumEverFreeHeapSize( void ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.c new file mode 100644 index 0000000..f6570d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.c @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.h new file mode 100644 index 0000000..e89af71 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_port_macros.h new file mode 100644 index 0000000..2fb7c59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_port_macros.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) ) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Read the PSPLIM value in the given variable. + */ +#define secureportREAD_PSPLIM( pucOutStackLimit ) \ + __asm volatile ( "mrs %0, psplim" : "=r" ( pucOutStackLimit ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ; ; ) {; } \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c new file mode 100644 index 0000000..b668d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c @@ -0,0 +1,381 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r4, #1 \n"/* r4 = 1. */ + " bics r3, r4 \n"/* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r2] \n"/* Program RNR = 4. */ + " ldmia r1!, {r5,r6} \n"/* Read first set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst2 \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write first set of RBAR/RLAR registers. */ + " movs r4, #5 \n"/* r4 = 5. */ + " str r4, [r2] \n"/* Program RNR = 5. */ + " ldmia r1!, {r5,r6} \n"/* Read second set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst2 \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write second set of RBAR/RLAR registers. */ + " movs r4, #6 \n"/* r4 = 6. */ + " str r4, [r2] \n"/* Program RNR = 6. */ + " ldmia r1!, {r5,r6} \n"/* Read third set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst2 \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write third set of RBAR/RLAR registers. */ + " movs r4, #7 \n"/* r4 = 7. */ + " str r4, [r2] \n"/* Program RNR = 7. */ + " ldmia r1!, {r5,r6} \n"/* Read fourth set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst2 \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write fourth set of RBAR/RLAR registers. */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r4, #1 \n"/* r4 = 1. */ + " orrs r3, r4 \n"/* r3 = r3 | r4 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " msr control, r2 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r2} \n"/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " bx r2 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " movs r1, #1 \n"/* r1 = 1. */ + " tst r0, r1 \n"/* Perform r0 & r1 (bitwise AND) and update the conditions flag. */ + " beq running_privileged \n"/* If the result of previous AND operation was 0, branch. */ + " movs r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " bx lr \n"/* Return. */ + " running_privileged: \n" + " movs r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " movs r1, #1 \n"/* r1 = 1. */ + " bics r0, r1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " movs r1, #1 \n"/* r1 = 1. */ + " orrs r0, r1 \n"/* r0 = r0 | r1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr \n" + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr PRIMASK, r0 \n" + " bx lr \n" + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, psp \n"/* Read PSP in r0. */ + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + #if ( configENABLE_MPU == 1 ) + " subs r0, r0, #44 \n"/* Make space for PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + " str r0, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r2, control \n"/* r2 = CONTROL. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r0!, {r1-r7} \n"/* Store on the stack - PSPLIM, CONTROL, LR and low registers that are not automatically saved. */ + " mov r4, r8 \n"/* r4 = r8. */ + " mov r5, r9 \n"/* r5 = r9. */ + " mov r6, r10 \n"/* r6 = r10. */ + " mov r7, r11 \n"/* r7 = r11. */ + " stmia r0!, {r4-r7} \n"/* Store the high registers that are not saved automatically. */ + #else /* configENABLE_MPU */ + " subs r0, r0, #40 \n"/* Make space for PSPLIM, LR and the remaining registers on the stack. */ + " str r0, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r2, psplim \n"/* r2 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r0!, {r2-r7} \n"/* Store on the stack - PSPLIM, LR and low registers that are not automatically saved. */ + " mov r4, r8 \n"/* r4 = r8. */ + " mov r5, r9 \n"/* r5 = r9. */ + " mov r6, r10 \n"/* r6 = r10. */ + " mov r7, r11 \n"/* r7 = r11. */ + " stmia r0!, {r4-r7} \n"/* Store the high registers that are not saved automatically. */ + #endif /* configENABLE_MPU */ + " \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r4, #1 \n"/* r4 = 1. */ + " bics r3, r4 \n"/* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r2] \n"/* Program RNR = 4. */ + " ldmia r1!, {r5,r6} \n"/* Read first set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write first set of RBAR/RLAR registers. */ + " movs r4, #5 \n"/* r4 = 5. */ + " str r4, [r2] \n"/* Program RNR = 5. */ + " ldmia r1!, {r5,r6} \n"/* Read second set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write second set of RBAR/RLAR registers. */ + " movs r4, #6 \n"/* r4 = 6. */ + " str r4, [r2] \n"/* Program RNR = 6. */ + " ldmia r1!, {r5,r6} \n"/* Read third set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write third set of RBAR/RLAR registers. */ + " movs r4, #7 \n"/* r4 = 7. */ + " str r4, [r2] \n"/* Program RNR = 7. */ + " ldmia r1!, {r5,r6} \n"/* Read fourth set of RBAR/RLAR from TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " stmia r3!, {r5,r6} \n"/* Write fourth set of RBAR/RLAR registers. */ + " \n" + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " movs r4, #1 \n"/* r4 = 1. */ + " orrs r3, r4 \n"/* r3 = r3 | r4 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " adds r0, r0, #28 \n"/* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n"/* Restore the high registers that are not automatically restored. */ + " mov r8, r4 \n"/* r8 = r4. */ + " mov r9, r5 \n"/* r9 = r5. */ + " mov r10, r6 \n"/* r10 = r6. */ + " mov r11, r7 \n"/* r11 = r7. */ + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " subs r0, r0, #44 \n"/* Move to the starting of the saved context. */ + " ldmia r0!, {r1-r7} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r7 restored. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r2 \n"/* Restore the CONTROL register value for the task. */ + " bx r3 \n" + #else /* configENABLE_MPU */ + " adds r0, r0, #24 \n"/* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n"/* Restore the high registers that are not automatically restored. */ + " mov r8, r4 \n"/* r8 = r4. */ + " mov r9, r5 \n"/* r9 = r5. */ + " mov r10, r6 \n"/* r10 = r6. */ + " mov r11, r7 \n"/* r11 = r7. */ + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " subs r0, r0, #40 \n"/* Move to the starting of the saved context. */ + " ldmia r0!, {r2-r7} \n"/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r7 restored. */ + " msr psplim, r2 \n"/* Restore the PSPLIM register value for the task. */ + " bx r3 \n" + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " movs r0, #4 \n" + " mov r1, lr \n" + " tst r0, r1 \n" + " beq stacking_used_msp \n" + " mrs r0, psp \n" + " ldr r2, svchandler_address_const \n" + " bx r2 \n" + " stacking_used_msp: \n" + " mrs r0, msp \n" + " ldr r2, svchandler_address_const \n" + " bx r2 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h new file mode 100644 index 0000000..6852153 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M23" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/port.c new file mode 100644 index 0000000..a5f4fd5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/port.c @@ -0,0 +1,761 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM3 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is + * defined. The value should also ensure backward compatibility. + * FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__( ( naked ) ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being defined + * but never called. ulDummy is used purely to quieten other warnings + * about code appearing after this function is called - making ulDummy + * volatile makes the compiler think the function could return and + * therefore not output an 'unreachable code' warning for code that appears + * after it. */ + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n"/* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n"/* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " orr r14, #0xd \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " stmdb r0!, {r4-r11} \n"/* Save the remaining registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n"/* Restore the context, including the critical nesting count. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n"/* Pop the registers. */ + " msr psp, r0 \n" + " isb \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/portmacro.h new file mode 100644 index 0000000..d9c1c1b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/portmacro.h @@ -0,0 +1,247 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n"\ + " msr basepri, %0 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n"\ + " mov %1, %2 \n"\ + " msr basepri, %1 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; + } +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) + { + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); + } +/*-----------------------------------------------------------*/ + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.c new file mode 100644 index 0000000..3424b42 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.c @@ -0,0 +1,470 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r3, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r3] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + " ldr r4, [r3] \n"/* r4 = *r3 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r2] \n"/* Program RNR = 4. */ + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #8 \n"/* r4 = 8. */ + " str r4, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #12 \n"/* r4 = 12. */ + " str r4, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r4} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + " ldr r5, xSecureContextConst2 \n" + " str r1, [r5] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " msr control, r3 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r4 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + " ldr r4, xSecureContextConst2 \n" + " str r1, [r4] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + "xSecureContextConst2: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " bic r0, #1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */ + " mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr basepri, r0 \n"/* basepri = ulMask. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " .extern SecureContext_SaveContext \n" + " .extern SecureContext_LoadContext \n" + " \n" + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " ldr r0, [r3] \n"/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + " mrs r2, psp \n"/* Read PSP in r2. */ + " \n" + " cbz r0, save_ns_context \n"/* No secure context to save. */ + " push {r0-r2, r14} \n" + " bl SecureContext_SaveContext \n"/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r0-r3} \n"/* LR is now in r3. */ + " mov lr, r3 \n"/* LR = r3. */ + " lsls r1, r3, #25 \n"/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl save_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB.*/ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #16 \n"/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #12 \n"/* Make space for xSecureContext, PSPLIM and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " b select_next_task \n" + " \n" + " save_ns_context: \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vstmdbeq r2!, {s16-s31} \n"/* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #48 \n"/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #16 \n"/* r2 = r2 + 16. */ + " stm r2, {r4-r11} \n"/* Store the registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " subs r2, r2, #16 \n"/* r2 = r2 - 16. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #44 \n"/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #12 \n"/* r2 = r2 + 12. */ + " stm r2, {r4-r11} \n"/* Store the registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " subs r2, r2, #12 \n"/* r2 = r2 - 12. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " \n" + " select_next_task: \n" + " mov r0, %0 \n"/* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */ + " msr basepri, r0 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n"/* r0 = 0. */ + " msr basepri, r0 \n"/* Enable interrupts. */ + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " ldr r2, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r3] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r3, xMAIR0Const \n"/* r3 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r3] \n"/* Program MAIR0. */ + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r3] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #8 \n"/* r4 = 8. */ + " str r4, [r3] \n"/* Program RNR = 8. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #12 \n"/* r4 = 12. */ + " str r4, [r3] \n"/* Program RNR = 12. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r3] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r2!, {r0, r1, r3, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r3 \n"/* Restore the CONTROL register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #else /* configENABLE_MPU */ + " ldmia r2!, {r0, r1, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #endif /* configENABLE_MPU */ + " \n" + " restore_ns_context: \n" + " ldmia r2!, {r4-r11} \n"/* Restore the registers that are not automatically restored. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vldmiaeq r2!, {s16-s31} \n"/* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + "xSecureContextConst: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, svchandler_address_const \n" + " bx r1 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " svc %0 \n"/* Secure context is allocated in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */ + " ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */ + " cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */ + " it ne \n" + " svcne %0 \n"/* Secure context is freed in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_FREE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacro.h new file mode 100644 index 0000000..82f937a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacro.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M33" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.c new file mode 100644 index 0000000..1996693 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.c @@ -0,0 +1,351 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 + +/** + * @brief Size of stack seal values in bytes. + */ +#define securecontextSTACK_SEAL_SIZE 8 + +/** + * @brief Stack seal value as recommended by ARM. + */ +#define securecontextSTACK_SEAL_VALUE 0xFEF5EDA5 + +/** + * @brief Maximum number of secure contexts. + */ +#ifndef secureconfigMAX_SECURE_CONTEXTS + #define secureconfigMAX_SECURE_CONTEXTS 8UL +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Pre-allocated array of secure contexts. + */ +SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ]; +/*-----------------------------------------------------------*/ + +/** + * @brief Get a free secure context for a task from the secure context pool (xSecureContexts). + * + * This function ensures that only one secure context is allocated for a task. + * + * @param[in] pvTaskHandle The task handle for which the secure context is allocated. + * + * @return Index of a free secure context in the xSecureContexts array. + */ +static uint32_t ulGetSecureContext( void * pvTaskHandle ); + +/** + * @brief Return the secure context to the secure context pool (xSecureContexts). + * + * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array. + */ +static void vReturnSecureContext( uint32_t ulSecureContextIndex ); + +/* These are implemented in assembly. */ +extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ); +extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ); +/*-----------------------------------------------------------*/ + +static uint32_t ulGetSecureContext( void * pvTaskHandle ) +{ + /* Start with invalid index. */ + uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) && + ( xSecureContexts[ i ].pucStackLimit == NULL ) && + ( xSecureContexts[ i ].pucStackStart == NULL ) && + ( xSecureContexts[ i ].pvTaskHandle == NULL ) && + ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = i; + } + else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle ) + { + /* A task can only have one secure context. Do not allocate a second + * context for the same task. */ + ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + break; + } + } + + return ulSecureContextIndex; +} +/*-----------------------------------------------------------*/ + +static void vReturnSecureContext( uint32_t ulSecureContextIndex ) +{ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL; + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR, i; + static uint32_t ulSecureContextsInitialized = 0; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) ) + { + /* Ensure to initialize secure contexts only once. */ + ulSecureContextsInitialized = 1; + + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + /* Initialize all secure contexts. */ + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + xSecureContexts[ i ].pucCurrentStackPointer = NULL; + xSecureContexts[ i ].pucStackLimit = NULL; + xSecureContexts[ i ].pucStackStart = NULL; + xSecureContexts[ i ].pvTaskHandle = NULL; + } + + #if ( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ) +#endif /* configENABLE_MPU */ +{ + uint8_t * pucStackMemory = NULL; + uint8_t * pucStackLimit; + uint32_t ulIPSR, ulSecureContextIndex; + SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID; + + #if ( configENABLE_MPU == 1 ) + uint32_t * pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit + * Register (PSPLIM) value. */ + secureportREAD_IPSR( ulIPSR ); + secureportREAD_PSPLIM( pucStackLimit ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. + * Also do nothing, if a secure context us already loaded. PSPLIM is set to + * securecontextNO_STACK when no secure context is loaded. */ + if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) ) + { + /* Ontain a free secure context. */ + ulSecureContextIndex = ulGetSecureContext( pvTaskHandle ); + + /* Were we able to get a free context? */ + if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte for stack (excluding the space for seal values) + * because the hardware decrements the stack pointer before + * writing i.e. if stack pointer is 0x2, a push operation will + * decrement the stack pointer to 0x1 and then write at 0x1. */ + xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize; + + /* Seal the created secure process stack. */ + *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE; + *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory; + + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle; + + #if ( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart; + pulCurrentStackPointer--; + + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart; + } + #endif /* configENABLE_MPU */ + + /* Ensure to never return 0 as a valid context handle. */ + xSecureContextHandle = ulSecureContextIndex + 1UL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint32_t ulIPSR, ulSecureContextIndex; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Only free if a valid context handle is passed. */ + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + /* Ensure that the secure context being deleted is associated with + * the task. */ + if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) + { + /* Free the stack space. */ + vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit ); + + /* Return the secure context back to the free secure contexts pool. */ + vReturnSecureContext( ulSecureContextIndex ); + } + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that no secure context is loaded and the task is loading it's + * own context. */ + if( ( pucStackLimit == securecontextNO_STACK ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that task's context is loaded and the task is saving it's own + * context. */ + if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.h new file mode 100644 index 0000000..de33d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no secure context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Invalid context ID. + */ +#define securecontextINVALID_CONTEXT_ID 0UL +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent a secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first address of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t * pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t * pucStackStart; /**< First location of the stack memory. */ + void * pvTaskHandle; /**< Task handle of the task this context is associated with. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Opaque handle for a secure context. + */ +typedef uint32_t SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if ( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context_port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context_port.c new file mode 100644 index 0000000..952db8a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context_port.c @@ -0,0 +1,97 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, load_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " ldmia r0!, {r1, r2} \n" /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r1!, {r3} \n" /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + " msr control, r3 \n" /* CONTROL = r3. */ + #endif /* configENABLE_MPU */ + " \n" + " msr psplim, r2 \n" /* PSPLIM = r2. */ + " msr psp, r1 \n" /* PSP = r1. */ + " \n" + " load_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::: "r0", "r1", "r2" + ); +} +/*-----------------------------------------------------------*/ + +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, save_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " mrs r1, psp \n" /* r1 = PSP. */ + " \n" + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " vstmdb r1!, {s0} \n" /* Trigger the deferred stacking of FPU registers. */ + " vldmia r1!, {s0} \n" /* Nullify the effect of the previous statement. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " \n" + #if ( configENABLE_MPU == 1 ) + " mrs r2, control \n" /* r2 = CONTROL. */ + " stmdb r1!, {r2} \n" /* Store CONTROL value on the stack. */ + #endif /* configENABLE_MPU */ + " \n" + " str r1, [r0] \n" /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + " movs r1, %0 \n" /* r1 = securecontextNO_STACK. */ + " msr psplim, r1 \n" /* PSPLIM = securecontextNO_STACK. */ + " msr psp, r1 \n" /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + " \n" + " save_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::"i" ( securecontextNO_STACK ) : "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.c new file mode 100644 index 0000000..b3bf007 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.c @@ -0,0 +1,454 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#ifndef secureconfigTOTAL_HEAP_SIZE + #define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) +#endif + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */ + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.h new file mode 100644 index 0000000..e469f2c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void * pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void * pv ); + +/** + * @brief Get the free heap size. + * + * @return Free heap size. + */ +size_t xPortGetFreeHeapSize( void ); + +/** + * @brief Get the minimum ever free heap size. + * + * @return Minimum ever free heap size. + */ +size_t xPortGetMinimumEverFreeHeapSize( void ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.c new file mode 100644 index 0000000..f6570d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.c @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.h new file mode 100644 index 0000000..e89af71 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_port_macros.h new file mode 100644 index 0000000..2fb7c59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_port_macros.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) ) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Read the PSPLIM value in the given variable. + */ +#define secureportREAD_PSPLIM( pucOutStackLimit ) \ + __asm volatile ( "mrs %0, psplim" : "=r" ( pucOutStackLimit ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ; ; ) {; } \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c new file mode 100644 index 0000000..3a97911 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c @@ -0,0 +1,365 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r3, [r1] \n"/* r3 = *r1 i.e. r3 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r3, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #4 \n"/* r3 = 4. */ + " str r3, [r2] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #8 \n"/* r3 = 8. */ + " str r3, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #12 \n"/* r3 = 12. */ + " str r3, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " msr control, r2 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r2} \n"/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r2 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " bic r0, #1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */ + " mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr basepri, r0 \n"/* basepri = ulMask. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, psp \n"/* Read PSP in r0. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n"/* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r2, control \n"/* r2 = CONTROL. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmdb r0!, {r1-r11} \n"/* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */ + #else /* configENABLE_MPU */ + " mrs r2, psplim \n"/* r2 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmdb r0!, {r2-r11} \n"/* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */ + #endif /* configENABLE_MPU */ + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " str r0, [r1] \n"/* Save the new top of stack in TCB. */ + " \n" + " mov r0, %0 \n"/* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */ + " msr basepri, r0 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n"/* r0 = 0. */ + " msr basepri, r0 \n"/* Enable interrupts. */ + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r3, [r1] \n"/* r3 = *r1 i.e. r3 = MAIR0. */ + " ldr r2, xMAIR0Const \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r3, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #4 \n"/* r3 = 4. */ + " str r3, [r2] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #8 \n"/* r3 = 8. */ + " str r3, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #12 \n"/* r3 = 12. */ + " str r3, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r0!, {r1-r11} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */ + #else /* configENABLE_MPU */ + " ldmia r0!, {r2-r11} \n"/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst r3, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n"/* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " \n" + #if ( configENABLE_MPU == 1 ) + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r2 \n"/* Restore the CONTROL register value for the task. */ + #else /* configENABLE_MPU */ + " msr psplim, r2 \n"/* Restore the PSPLIM register value for the task. */ + #endif /* configENABLE_MPU */ + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " bx r3 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, svchandler_address_const \n" + " bx r1 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h new file mode 100644 index 0000000..82f937a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M33" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/port.c new file mode 100644 index 0000000..40b38b2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/port.c @@ -0,0 +1,921 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM3 MPU port. +*----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK ( 0 ) +#endif + +#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS + #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security." + #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#endif + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SHPR2_REG ( *( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( *( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( *( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( *( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( 8UL << 8UL ) /* 8 regions, unified. */ +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) +/*-----------------------------------------------------------*/ + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) __attribute__( ( optimize( "3" ) ) ) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +static void prvSVCHandler( uint32_t * pulRegisters ) __attribute__( ( noinline ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Enter critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Exit from critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortExitCritical( void ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. Note this is not saved as part of the task context as context + * switches can only occur when uxCriticalNesting is zero. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* Assumes psp was in use. */ + __asm volatile + ( + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + #else + " mrs r0, psp \n" + #endif + " b %0 \n" + ::"i" ( prvSVCHandler ) : "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +static void prvSVCHandler( uint32_t * pulParam ) +{ + uint8_t ucSVCNumber; + uint32_t ulPC; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* #if defined( __ARMCC_VERSION ) */ + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first + * argument (r0) is pulParam[ 0 ]. */ + ulPC = pulParam[ portOFFSET_TO_PC ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER: + portNVIC_SHPR2_REG |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD: + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required + * but do ensure the code is completely + * within the specified behaviour for the + * architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); + + break; + + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the + * svc was raised from any of the + * system calls. */ + + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + } + + break; + #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + case portSVC_RAISE_PRIVILEGE: + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + break; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + default: /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvRestoreContextOfFirstTask( void ) +{ + __asm volatile + ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n"/* Move onto the second item in the TCB... */ + " \n" + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r3, #1 \n"/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " ldr r2, =0xe000ed9c \n"/* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n"/* Write 4 sets of MPU registers. */ + " \n" + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r3, #1 \n"/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + " \n" + " ldmia r0!, {r3, r4-r11} \n"/* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldr r14, =0xfffffffd \n"/* Load exec return code. */ + " bx r14 \n" + " \n" + " .ltorg \n"/* Assemble current literal pool to avoid offset-out-of-bound errors with lto. */ + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions + * to ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the same priority as the kernel, and the SVC + * handler higher priority so it can be used to exit a critical section (where + * lower priorities are masked). */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" ); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + } +#else + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +#endif +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + } +#else + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +#endif +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " mrs r1, control \n" + " stmdb r0!, {r1, r4-r11} \n"/* Save the remaining registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n"/* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n"/* Move onto the second item in the TCB... */ + " \n" + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r3, #1 \n"/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " ldr r2, =0xe000ed9c \n"/* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n"/* Write 4 sets of MPU registers. */ + " \n" + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r3, #1 \n"/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + " \n" + " ldmia r0!, {r3, r4-r11} \n"/* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " \n" + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .ltorg \n"/* Assemble current literal pool to avoid offset-out-of-bound errors with lto. */ + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __FLASH_segment_start__[]; + extern uint32_t __FLASH_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the unprivileged flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged flash for privileged only access. This is where + * the kernel code is * placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + * is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + * system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ + uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + * ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + * into the the correct bit position of the attribute register. */ + return( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) +{ + extern uint32_t __SRAM_segment_start__[]; + extern uint32_t __SRAM_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + int32_t lIndex; + uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate user configurable regions. */ + for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID ); + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that the + * stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + * xRegions into the CM3 specific MPU settings that are then + * stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( ul - 1UL ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID ); + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/portmacro.h new file mode 100644 index 0000000..23499eb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/portmacro.h @@ -0,0 +1,309 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + + #define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) + #define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) + #define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL ) + #define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) + #define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + + #define portGENERAL_PERIPHERALS_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 5UL ) + #define portPRIVILEGED_FLASH_REGION ( 6UL ) + #define portPRIVILEGED_RAM_REGION ( 7UL ) + #define portFIRST_CONFIGURABLE_REGION ( 0UL ) + #define portLAST_CONFIGURABLE_REGION ( 2UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS_IN_TCB ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + + #define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " ::: "r0", "memory" ) + + typedef struct MPU_REGION_REGISTERS + { + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; + } xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ + typedef struct MPU_SETTINGS + { + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS_IN_TCB ]; + } xMPU_SETTINGS; + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ + #define portSVC_START_SCHEDULER 0 + #define portSVC_YIELD 1 + #define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + + #define portYIELD() __asm volatile ( " SVC %0 \n"::"i" ( portSVC_YIELD ) : "memory" ) + #define portYIELD_WITHIN_API() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif +/*-----------------------------------------------------------*/ + + extern BaseType_t xIsPrivileged( void ); + extern void vResetPrivilege( void ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n"\ + " msr basepri, %0 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n"\ + " mov %1, %2 \n"\ + " msr basepri, %1 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; + } +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) + { + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); + } +/*-----------------------------------------------------------*/ + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY + #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html" + #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0 + #endif +/*-----------------------------------------------------------*/ + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/port.c new file mode 100644 index 0000000..4c9925c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/port.c @@ -0,0 +1,839 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 + * r0p1 port. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__( ( naked ) ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being defined + * but never called. ulDummy is used purely to quieten other warnings + * about code appearing after this function is called - making ulDummy + * volatile makes the compiler think the function could return and + * therefore not output an 'unreachable code' warning for code that appears + * after it. */ + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n"/* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11, r14} \n"/* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + /* Start the first task. This also clears the bit that indicates the FPU is + * in use in case the FPU was used before the scheduler was started - which + * would otherwise result in the unnecessary leaving of space in the SVC stack + * for lazy saving of FPU registers. */ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " mov r0, #0 \n"/* Clear the bit that indicates the FPU is in use, see comment above. */ + " msr control, r0 \n" + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + * the r0p1 parts. r0p1 parts should use the port from the + * /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " stmdb r0!, {r4-r11, r14} \n"/* Save the core registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r0, r3} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r0, r3} \n" + " \n" + " ldr r1, [r3] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" + " \n" + " ldmia r0!, {r4-r11, r14} \n"/* Pop the core registers. */ + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " isb \n" + " \n" + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */ + #if WORKAROUND_PMU_CM001 == 1 + " push { r14 } \n" + " pop { pc } \n" + #endif + #endif + " \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n"/* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n"/* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..b85a98b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/portmacro.h @@ -0,0 +1,245 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n"\ + " msr basepri, %0 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n"\ + " mov %1, %2 \n"\ + " msr basepri, %1 \n"\ + " isb \n"\ + " dsb \n"\ + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; + } +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) + { + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); + } +/*-----------------------------------------------------------*/ + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/port.c new file mode 100644 index 0000000..d99b8b4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/port.c @@ -0,0 +1,1044 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4 MPU port. +*----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK ( 0 ) +#endif + +#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS + #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security." + #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#endif + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SHPR2_REG ( *( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( *( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants used to detect Cortex-M7 r0p0 and r0p1 cores, and ensure + * that a work around is active for errata 837070. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( *( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( *( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34UL ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) +#define portINITIAL_EXC_RETURN ( 0xfffffffdUL ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +static void prvSVCHandler( uint32_t * pulRegisters ) __attribute__( ( noinline ) ) PRIVILEGED_FUNCTION; + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ) __attribute__( ( naked ) ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Enter critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Exit from critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortExitCritical( void ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. Note this is not saved as part of the task context as context + * switches can only occur when uxCriticalNesting is zero. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* Assumes psp was in use. */ + __asm volatile + ( + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + #else + " mrs r0, psp \n" + #endif + " b %0 \n" + ::"i" ( prvSVCHandler ) : "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +static void prvSVCHandler( uint32_t * pulParam ) +{ + uint8_t ucSVCNumber; + uint32_t ulPC; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* #if defined( __ARMCC_VERSION ) */ + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first + * argument (r0) is pulParam[ 0 ]. */ + ulPC = pulParam[ portOFFSET_TO_PC ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER: + portNVIC_SHPR2_REG |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD: + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required + * but do ensure the code is completely + * within the specified behaviour for the + * architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); + + break; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the + * svc was raised from any of the + * system calls. */ + + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + } + + break; + #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + case portSVC_RAISE_PRIVILEGE: + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + break; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + default: /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvRestoreContextOfFirstTask( void ) +{ + __asm volatile + ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n"/* Move onto the second item in the TCB... */ + " \n" + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r3, #1 \n"/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " ldr r2, =0xe000ed9c \n"/* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + #endif /* configTOTAL_MPU_REGIONS == 16. */ + " \n" + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r3, #1 \n"/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + " \n" + " ldmia r0!, {r3-r11, r14} \n"/* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .ltorg \n"/* Assemble current literal pool to avoid offset-out-of-bound errors with lto. */ + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + /* Errata 837070 workaround must only be enabled on Cortex-M7 r0p0 + * and r0p1 cores. */ + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + configASSERT( ( portCPUID == portCORTEX_M7_r0p1_ID ) || ( portCPUID == portCORTEX_M7_r0p0_ID ) ); + #else + /* When using this port on a Cortex-M7 r0p0 or r0p1 core, define + * configENABLE_ERRATA_837070_WORKAROUND to 1 in your + * FreeRTOSConfig.h. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + #endif + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the same priority as the kernel, and the SVC + * handler higher priority so it can be used to exit a critical section (where + * lower priorities are masked). */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. This also clears the bit that indicates the FPU is + * in use in case the FPU was used before the scheduler was started - which + * would otherwise result in the unnecessary leaving of space in the SVC stack + * for lazy saving of FPU registers. */ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " mov r0, #0 \n"/* Clear the bit that indicates the FPU is in use, see comment above. */ + " msr control, r0 \n" + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" ); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + } +#else + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +#endif +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + } +#else + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +#endif +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " mrs r1, control \n" + " stmdb r0!, {r1, r4-r11, r14} \n"/* Save the remaining registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r0, r3} \n" + " mov r0, %0 \n" + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + " cpsid i \n"/* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + " cpsie i \n"/* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r0, r3} \n" + " \n"/* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n"/* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n"/* Move onto the second item in the TCB... */ + " \n" + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r3, #1 \n"/* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + " str r3, [r2] \n"/* Disable MPU. */ + " \n" + " ldr r2, =0xe000ed9c \n"/* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + " stmia r2, {r4-r11} \n"/* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + #endif /* configTOTAL_MPU_REGIONS == 16. */ + " \n" + " ldr r2, =0xe000ed94 \n"/* MPU_CTRL register. */ + " ldr r3, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r3, #1 \n"/* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + " str r3, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + " \n" + " ldmia r0!, {r3-r11, r14} \n"/* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .ltorg \n"/* Assemble the current literal pool to avoid offset-out-of-bound errors with lto. */ + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE ); +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n"/* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n"/* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __FLASH_segment_start__; + extern uint32_t * __FLASH_segment_end__; + extern uint32_t * __privileged_data_start__; + extern uint32_t * __privileged_data_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __FLASH_segment_start__[]; + extern uint32_t __FLASH_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + #endif /* if defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the unprivileged flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged flash for privileged only access. This is where + * the kernel code is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + * is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + * system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ + uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + * ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + * into the the correct bit position of the attribute register. */ + return( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) +{ + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __SRAM_segment_start__; + extern uint32_t * __SRAM_segment_end__; + extern uint32_t * __privileged_data_start__; + extern uint32_t * __privileged_data_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __SRAM_segment_start__[]; + extern uint32_t __SRAM_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + #endif /* if defined( __ARMCC_VERSION ) */ + + int32_t lIndex; + uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate user configurable regions. */ + for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID ); + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that the + * stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + * xRegions into the CM4 specific MPU settings that are then + * stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( ul - 1UL ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID ); + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/portmacro.h new file mode 100644 index 0000000..0e7dd18 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/portmacro.h @@ -0,0 +1,414 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif + +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +/* Location of the TEX,S,C,B bits in the MPU Region Attribute and Size + * Register (RASR). */ +#define portMPU_RASR_TEX_S_C_B_LOCATION ( 16UL ) +#define portMPU_RASR_TEX_S_C_B_MASK ( 0x3FUL ) + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* + * The TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits define the + * memory type, and where necessary the cacheable and shareable properties + * of the memory region. + * + * The TEX, C, and B bits together indicate the memory type of the region, + * and: + * - For Normal memory, the cacheable properties of the region. + * - For Device memory, whether the region is shareable. + * + * For Normal memory regions, the S bit indicates whether the region is + * shareable. For Strongly-ordered and Device memory, the S bit is ignored. + * + * See the following two tables for setting TEX, S, C and B bits for + * unprivileged flash, privileged flash and privileged RAM regions. + * + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | TEX | C | B | Memory type | Description or Normal region cacheability | Shareable? | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 0 | Strongly-ordered | Strongly ordered | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 1 | Device | Shared device | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 0 | Normal | Outer and inner write-through; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 1 | Normal | Outer and inner write-back; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 0 | Normal | Outer and inner Non-cacheable | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 0 | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 1 | Normal | Outer and inner write-back; write and read allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 0 | Device | Non-shared device | Not shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 1 | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 011 | X | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 1BB | A | A | Normal | Cached memory, with AA and BB indicating the inner and | Reserved | + | | | | | outer cacheability rules that must be exported on the | | + | | | | | bus. See the table below for the cacheability policy | | + | | | | | encoding. memory, BB=Outer policy, AA=Inner policy. | | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | + +-----------------------------------------+----------------------------------------+ + | AA or BB subfield of {TEX,C,B} encoding | Cacheability policy | + +-----------------------------------------+----------------------------------------+ + | 00 | Non-cacheable | + +-----------------------------------------+----------------------------------------+ + | 01 | Write-back, write and read allocate | + +-----------------------------------------+----------------------------------------+ + | 10 | Write-through, no write allocate | + +-----------------------------------------+----------------------------------------+ + | 11 | Write-back, no write allocate | + +-----------------------------------------+----------------------------------------+ + */ + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for flash + * region. */ +#ifndef configTEX_S_C_B_FLASH + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_FLASH ( 0x07UL ) +#endif + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for RAM + * region. */ +#ifndef configTEX_S_C_B_SRAM + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_SRAM ( 0x07UL ) +#endif + +#define portGENERAL_PERIPHERALS_REGION ( configTOTAL_MPU_REGIONS - 5UL ) +#define portSTACK_REGION ( configTOTAL_MPU_REGIONS - 4UL ) +#define portUNPRIVILEGED_FLASH_REGION ( configTOTAL_MPU_REGIONS - 3UL ) +#define portPRIVILEGED_FLASH_REGION ( configTOTAL_MPU_REGIONS - 2UL ) +#define portPRIVILEGED_RAM_REGION ( configTOTAL_MPU_REGIONS - 1UL ) +#define portFIRST_CONFIGURABLE_REGION ( 0UL ) +#define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 6UL ) +#define portNUM_CONFIGURABLE_REGIONS ( configTOTAL_MPU_REGIONS - 5UL ) +#define portTOTAL_NUM_REGIONS_IN_TCB ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus 1 to create space for the stack region. */ + +#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " ::: "r0", "memory" ) + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS_IN_TCB ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm volatile ( " SVC %0 \n"::"i" ( portSVC_YIELD ) : "memory" ) +#define portYIELD_WITHIN_API() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) +#endif +/*-----------------------------------------------------------*/ + +extern BaseType_t xIsPrivileged( void ); +extern void vResetPrivilege( void ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +#define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + */ +#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ +#define portRESET_PRIVILEGE() vResetPrivilege() +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortRaiseBASEPRI( void ) +{ + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n" + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + " cpsid i \n"/* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + " msr basepri, %0 \n" + " isb \n" + " dsb \n" + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + " cpsie i \n"/* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) +{ + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n" + " mov %1, %2 \n" + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + " cpsid i \n"/* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + " msr basepri, %1 \n" + " isb \n" + " dsb \n" + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + " cpsie i \n"/* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; +} +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) +{ + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +#define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + +#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY + #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html" + #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0 +#endif +/*-----------------------------------------------------------*/ + +/* *INDENT-OFF* */ + #ifdef __cplusplus + } + #endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.c new file mode 100644 index 0000000..3424b42 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.c @@ -0,0 +1,470 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r3, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r3] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + " ldr r4, [r3] \n"/* r4 = *r3 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r2] \n"/* Program RNR = 4. */ + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #8 \n"/* r4 = 8. */ + " str r4, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #12 \n"/* r4 = 12. */ + " str r4, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r4} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + " ldr r5, xSecureContextConst2 \n" + " str r1, [r5] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " msr control, r3 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r4 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + " ldr r4, xSecureContextConst2 \n" + " str r1, [r4] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + "xSecureContextConst2: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " bic r0, #1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */ + " mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr basepri, r0 \n"/* basepri = ulMask. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " .extern SecureContext_SaveContext \n" + " .extern SecureContext_LoadContext \n" + " \n" + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " ldr r0, [r3] \n"/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + " mrs r2, psp \n"/* Read PSP in r2. */ + " \n" + " cbz r0, save_ns_context \n"/* No secure context to save. */ + " push {r0-r2, r14} \n" + " bl SecureContext_SaveContext \n"/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r0-r3} \n"/* LR is now in r3. */ + " mov lr, r3 \n"/* LR = r3. */ + " lsls r1, r3, #25 \n"/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl save_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB.*/ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #16 \n"/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #12 \n"/* Make space for xSecureContext, PSPLIM and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " b select_next_task \n" + " \n" + " save_ns_context: \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vstmdbeq r2!, {s16-s31} \n"/* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #48 \n"/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #16 \n"/* r2 = r2 + 16. */ + " stm r2, {r4-r11} \n"/* Store the registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " subs r2, r2, #16 \n"/* r2 = r2 - 16. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #44 \n"/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #12 \n"/* r2 = r2 + 12. */ + " stm r2, {r4-r11} \n"/* Store the registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " subs r2, r2, #12 \n"/* r2 = r2 - 12. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " \n" + " select_next_task: \n" + " mov r0, %0 \n"/* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */ + " msr basepri, r0 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n"/* r0 = 0. */ + " msr basepri, r0 \n"/* Enable interrupts. */ + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " ldr r2, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r3] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r3, xMAIR0Const \n"/* r3 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r3] \n"/* Program MAIR0. */ + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r3] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #8 \n"/* r4 = 8. */ + " str r4, [r3] \n"/* Program RNR = 8. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #12 \n"/* r4 = 12. */ + " str r4, [r3] \n"/* Program RNR = 12. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r3] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r2!, {r0, r1, r3, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r3 \n"/* Restore the CONTROL register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #else /* configENABLE_MPU */ + " ldmia r2!, {r0, r1, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #endif /* configENABLE_MPU */ + " \n" + " restore_ns_context: \n" + " ldmia r2!, {r4-r11} \n"/* Restore the registers that are not automatically restored. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vldmiaeq r2!, {s16-s31} \n"/* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + "xSecureContextConst: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, svchandler_address_const \n" + " bx r1 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " svc %0 \n"/* Secure context is allocated in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */ + " ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */ + " cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */ + " it ne \n" + " svcne %0 \n"/* Secure context is freed in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_FREE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacro.h new file mode 100644 index 0000000..33fc5f5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M55" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.c new file mode 100644 index 0000000..1996693 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.c @@ -0,0 +1,351 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 + +/** + * @brief Size of stack seal values in bytes. + */ +#define securecontextSTACK_SEAL_SIZE 8 + +/** + * @brief Stack seal value as recommended by ARM. + */ +#define securecontextSTACK_SEAL_VALUE 0xFEF5EDA5 + +/** + * @brief Maximum number of secure contexts. + */ +#ifndef secureconfigMAX_SECURE_CONTEXTS + #define secureconfigMAX_SECURE_CONTEXTS 8UL +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Pre-allocated array of secure contexts. + */ +SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ]; +/*-----------------------------------------------------------*/ + +/** + * @brief Get a free secure context for a task from the secure context pool (xSecureContexts). + * + * This function ensures that only one secure context is allocated for a task. + * + * @param[in] pvTaskHandle The task handle for which the secure context is allocated. + * + * @return Index of a free secure context in the xSecureContexts array. + */ +static uint32_t ulGetSecureContext( void * pvTaskHandle ); + +/** + * @brief Return the secure context to the secure context pool (xSecureContexts). + * + * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array. + */ +static void vReturnSecureContext( uint32_t ulSecureContextIndex ); + +/* These are implemented in assembly. */ +extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ); +extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ); +/*-----------------------------------------------------------*/ + +static uint32_t ulGetSecureContext( void * pvTaskHandle ) +{ + /* Start with invalid index. */ + uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) && + ( xSecureContexts[ i ].pucStackLimit == NULL ) && + ( xSecureContexts[ i ].pucStackStart == NULL ) && + ( xSecureContexts[ i ].pvTaskHandle == NULL ) && + ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = i; + } + else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle ) + { + /* A task can only have one secure context. Do not allocate a second + * context for the same task. */ + ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + break; + } + } + + return ulSecureContextIndex; +} +/*-----------------------------------------------------------*/ + +static void vReturnSecureContext( uint32_t ulSecureContextIndex ) +{ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL; + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR, i; + static uint32_t ulSecureContextsInitialized = 0; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) ) + { + /* Ensure to initialize secure contexts only once. */ + ulSecureContextsInitialized = 1; + + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + /* Initialize all secure contexts. */ + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + xSecureContexts[ i ].pucCurrentStackPointer = NULL; + xSecureContexts[ i ].pucStackLimit = NULL; + xSecureContexts[ i ].pucStackStart = NULL; + xSecureContexts[ i ].pvTaskHandle = NULL; + } + + #if ( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ) +#endif /* configENABLE_MPU */ +{ + uint8_t * pucStackMemory = NULL; + uint8_t * pucStackLimit; + uint32_t ulIPSR, ulSecureContextIndex; + SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID; + + #if ( configENABLE_MPU == 1 ) + uint32_t * pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit + * Register (PSPLIM) value. */ + secureportREAD_IPSR( ulIPSR ); + secureportREAD_PSPLIM( pucStackLimit ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. + * Also do nothing, if a secure context us already loaded. PSPLIM is set to + * securecontextNO_STACK when no secure context is loaded. */ + if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) ) + { + /* Ontain a free secure context. */ + ulSecureContextIndex = ulGetSecureContext( pvTaskHandle ); + + /* Were we able to get a free context? */ + if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte for stack (excluding the space for seal values) + * because the hardware decrements the stack pointer before + * writing i.e. if stack pointer is 0x2, a push operation will + * decrement the stack pointer to 0x1 and then write at 0x1. */ + xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize; + + /* Seal the created secure process stack. */ + *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE; + *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory; + + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle; + + #if ( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart; + pulCurrentStackPointer--; + + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart; + } + #endif /* configENABLE_MPU */ + + /* Ensure to never return 0 as a valid context handle. */ + xSecureContextHandle = ulSecureContextIndex + 1UL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint32_t ulIPSR, ulSecureContextIndex; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Only free if a valid context handle is passed. */ + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + /* Ensure that the secure context being deleted is associated with + * the task. */ + if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) + { + /* Free the stack space. */ + vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit ); + + /* Return the secure context back to the free secure contexts pool. */ + vReturnSecureContext( ulSecureContextIndex ); + } + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that no secure context is loaded and the task is loading it's + * own context. */ + if( ( pucStackLimit == securecontextNO_STACK ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that task's context is loaded and the task is saving it's own + * context. */ + if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.h new file mode 100644 index 0000000..de33d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no secure context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Invalid context ID. + */ +#define securecontextINVALID_CONTEXT_ID 0UL +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent a secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first address of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t * pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t * pucStackStart; /**< First location of the stack memory. */ + void * pvTaskHandle; /**< Task handle of the task this context is associated with. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Opaque handle for a secure context. + */ +typedef uint32_t SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if ( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context_port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context_port.c new file mode 100644 index 0000000..952db8a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context_port.c @@ -0,0 +1,97 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, load_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " ldmia r0!, {r1, r2} \n" /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r1!, {r3} \n" /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + " msr control, r3 \n" /* CONTROL = r3. */ + #endif /* configENABLE_MPU */ + " \n" + " msr psplim, r2 \n" /* PSPLIM = r2. */ + " msr psp, r1 \n" /* PSP = r1. */ + " \n" + " load_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::: "r0", "r1", "r2" + ); +} +/*-----------------------------------------------------------*/ + +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, save_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " mrs r1, psp \n" /* r1 = PSP. */ + " \n" + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " vstmdb r1!, {s0} \n" /* Trigger the deferred stacking of FPU registers. */ + " vldmia r1!, {s0} \n" /* Nullify the effect of the previous statement. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " \n" + #if ( configENABLE_MPU == 1 ) + " mrs r2, control \n" /* r2 = CONTROL. */ + " stmdb r1!, {r2} \n" /* Store CONTROL value on the stack. */ + #endif /* configENABLE_MPU */ + " \n" + " str r1, [r0] \n" /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + " movs r1, %0 \n" /* r1 = securecontextNO_STACK. */ + " msr psplim, r1 \n" /* PSPLIM = securecontextNO_STACK. */ + " msr psp, r1 \n" /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + " \n" + " save_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::"i" ( securecontextNO_STACK ) : "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.c new file mode 100644 index 0000000..b3bf007 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.c @@ -0,0 +1,454 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#ifndef secureconfigTOTAL_HEAP_SIZE + #define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) +#endif + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */ + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.h new file mode 100644 index 0000000..e469f2c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void * pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void * pv ); + +/** + * @brief Get the free heap size. + * + * @return Free heap size. + */ +size_t xPortGetFreeHeapSize( void ); + +/** + * @brief Get the minimum ever free heap size. + * + * @return Minimum ever free heap size. + */ +size_t xPortGetMinimumEverFreeHeapSize( void ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.c new file mode 100644 index 0000000..f6570d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.c @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.h new file mode 100644 index 0000000..e89af71 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_port_macros.h new file mode 100644 index 0000000..2fb7c59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_port_macros.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) ) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Read the PSPLIM value in the given variable. + */ +#define secureportREAD_PSPLIM( pucOutStackLimit ) \ + __asm volatile ( "mrs %0, psplim" : "=r" ( pucOutStackLimit ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ; ; ) {; } \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c new file mode 100644 index 0000000..3a97911 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c @@ -0,0 +1,365 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r3, [r1] \n"/* r3 = *r1 i.e. r3 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r3, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #4 \n"/* r3 = 4. */ + " str r3, [r2] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #8 \n"/* r3 = 8. */ + " str r3, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #12 \n"/* r3 = 12. */ + " str r3, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " msr control, r2 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r2} \n"/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r2 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " bic r0, #1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */ + " mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr basepri, r0 \n"/* basepri = ulMask. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, psp \n"/* Read PSP in r0. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n"/* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r2, control \n"/* r2 = CONTROL. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmdb r0!, {r1-r11} \n"/* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */ + #else /* configENABLE_MPU */ + " mrs r2, psplim \n"/* r2 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmdb r0!, {r2-r11} \n"/* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */ + #endif /* configENABLE_MPU */ + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " str r0, [r1] \n"/* Save the new top of stack in TCB. */ + " \n" + " mov r0, %0 \n"/* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */ + " msr basepri, r0 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n"/* r0 = 0. */ + " msr basepri, r0 \n"/* Enable interrupts. */ + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r3, [r1] \n"/* r3 = *r1 i.e. r3 = MAIR0. */ + " ldr r2, xMAIR0Const \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r3, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #4 \n"/* r3 = 4. */ + " str r3, [r2] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #8 \n"/* r3 = 8. */ + " str r3, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #12 \n"/* r3 = 12. */ + " str r3, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r0!, {r1-r11} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */ + #else /* configENABLE_MPU */ + " ldmia r0!, {r2-r11} \n"/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst r3, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n"/* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " \n" + #if ( configENABLE_MPU == 1 ) + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r2 \n"/* Restore the CONTROL register value for the task. */ + #else /* configENABLE_MPU */ + " msr psplim, r2 \n"/* Restore the PSPLIM register value for the task. */ + #endif /* configENABLE_MPU */ + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " bx r3 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, svchandler_address_const \n" + " bx r1 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h new file mode 100644 index 0000000..33fc5f5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M55" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/ReadMe.txt new file mode 100644 index 0000000..4cf25c5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/ReadMe.txt @@ -0,0 +1,18 @@ +There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers. +The best option depends on the revision of the ARM Cortex-M7 core in use. The +revision is specified by an 'r' number, and a 'p' number, so will look something +like 'r0p1'. Check the documentation for the microcontroller in use to find the +revision of the Cortex-M7 core used in that microcontroller. If in doubt, use +the FreeRTOS port provided specifically for r0p1 revisions, as that can be used +with all core revisions. + +The first option is to use the ARM Cortex-M4F port, and the second option is to +use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround. + +If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be +used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in +the /FreeRTOS/Source/portable/GCC/ARM_CM4F directory. + +If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM +Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1 +directory. \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/port.c new file mode 100644 index 0000000..bbba49e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/port.c @@ -0,0 +1,829 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM7 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__( ( naked ) ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being defined + * but never called. ulDummy is used purely to quieten other warnings + * about code appearing after this function is called - making ulDummy + * volatile makes the compiler think the function could return and + * therefore not output an 'unreachable code' warning for code that appears + * after it. */ + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n"/* Restore the context. */ + " ldr r1, [r3] \n"/* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11, r14} \n"/* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n"/* Restore the task stack pointer. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + /* Start the first task. This also clears the bit that indicates the FPU is + * in use in case the FPU was used before the scheduler was started - which + * would otherwise result in the unnecessary leaving of space in the SVC stack + * for lazy saving of FPU registers. */ + __asm volatile ( + " ldr r0, =0xE000ED08 \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n"/* Set the msp back to the start of the stack. */ + " mov r0, #0 \n"/* Clear the bit that indicates the FPU is in use, see comment above. */ + " msr control, r0 \n" + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc 0 \n"/* System call to start first task. */ + " nop \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " isb \n" + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " stmdb r0!, {r4-r11, r14} \n"/* Save the core registers. */ + " str r0, [r2] \n"/* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r0, r3} \n" + " mov r0, %0 \n" + " cpsid i \n"/* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + " msr basepri, r0 \n" + " dsb \n" + " isb \n" + " cpsie i \n"/* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r0, r3} \n" + " \n" + " ldr r1, [r3] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" + " \n" + " ldmia r0!, {r4-r11, r14} \n"/* Pop the core registers. */ + " \n" + " tst r14, #0x10 \n"/* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " isb \n" + " \n" + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */ + #if WORKAROUND_PMU_CM001 == 1 + " push { r14 } \n" + " pop { pc } \n" + #endif + #endif + " \n" + " bx r14 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n"/* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n"/* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 \n" + " .ltorg \n" + ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/portmacro.h new file mode 100644 index 0000000..c66c6d0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/portmacro.h @@ -0,0 +1,249 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm volatile ( "dsb" ::: "memory" ); \ + __asm volatile ( "isb" ); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI; + + __asm volatile + ( + " mov %0, %1 \n"\ + " cpsid i \n"\ + " msr basepri, %0 \n"\ + " isb \n"\ + " dsb \n"\ + " cpsie i \n"\ + : "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + } + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI, ulNewBASEPRI; + + __asm volatile + ( + " mrs %0, basepri \n"\ + " mov %1, %2 \n"\ + " cpsid i \n"\ + " msr basepri, %1 \n"\ + " isb \n"\ + " dsb \n"\ + " cpsie i \n"\ + : "=r" ( ulOriginalBASEPRI ), "=r" ( ulNewBASEPRI ) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); + + /* This return will not be reached but is necessary to prevent compiler + * warnings. */ + return ulOriginalBASEPRI; + } +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) + { + __asm volatile + ( + " msr basepri, %0 "::"r" ( ulNewMaskValue ) : "memory" + ); + } +/*-----------------------------------------------------------*/ + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.c new file mode 100644 index 0000000..3424b42 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.c @@ -0,0 +1,470 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r3, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r3] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + " ldr r4, [r3] \n"/* r4 = *r3 i.e. r4 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r2] \n"/* Program RNR = 4. */ + " adds r3, #4 \n"/* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #8 \n"/* r4 = 8. */ + " str r4, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #12 \n"/* r4 = 12. */ + " str r4, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r3!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r4} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + " ldr r5, xSecureContextConst2 \n" + " str r1, [r5] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " msr control, r3 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r4 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + " ldr r4, xSecureContextConst2 \n" + " str r1, [r4] \n"/* Set xSecureContext to this task's value for the same. */ + " msr psplim, r2 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + "xSecureContextConst2: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " bic r0, #1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */ + " mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr basepri, r0 \n"/* basepri = ulMask. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " .extern SecureContext_SaveContext \n" + " .extern SecureContext_LoadContext \n" + " \n" + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " ldr r0, [r3] \n"/* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + " mrs r2, psp \n"/* Read PSP in r2. */ + " \n" + " cbz r0, save_ns_context \n"/* No secure context to save. */ + " push {r0-r2, r14} \n" + " bl SecureContext_SaveContext \n"/* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r0-r3} \n"/* LR is now in r3. */ + " mov lr, r3 \n"/* LR = r3. */ + " lsls r1, r3, #25 \n"/* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl save_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB.*/ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #16 \n"/* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #12 \n"/* Make space for xSecureContext, PSPLIM and LR on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " b select_next_task \n" + " \n" + " save_ns_context: \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vstmdbeq r2!, {s16-s31} \n"/* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + " subs r2, r2, #48 \n"/* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #16 \n"/* r2 = r2 + 16. */ + " stm r2, {r4-r11} \n"/* Store the registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r3, control \n"/* r3 = CONTROL. */ + " mov r4, lr \n"/* r4 = LR/EXC_RETURN. */ + " subs r2, r2, #16 \n"/* r2 = r2 - 16. */ + " stmia r2!, {r0, r1, r3, r4} \n"/* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + " subs r2, r2, #44 \n"/* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + " str r2, [r1] \n"/* Save the new top of stack in TCB. */ + " adds r2, r2, #12 \n"/* r2 = r2 + 12. */ + " stm r2, {r4-r11} \n"/* Store the registers that are not saved automatically. */ + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " subs r2, r2, #12 \n"/* r2 = r2 - 12. */ + " stmia r2!, {r0, r1, r3} \n"/* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + " \n" + " select_next_task: \n" + " mov r0, %0 \n"/* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */ + " msr basepri, r0 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n"/* r0 = 0. */ + " msr basepri, r0 \n"/* Enable interrupts. */ + " \n" + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " ldr r2, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r3] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r4, [r1] \n"/* r4 = *r1 i.e. r4 = MAIR0. */ + " ldr r3, xMAIR0Const \n"/* r3 = 0xe000edc0 [Location of MAIR0]. */ + " str r4, [r3] \n"/* Program MAIR0. */ + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #4 \n"/* r4 = 4. */ + " str r4, [r3] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #8 \n"/* r4 = 8. */ + " str r4, [r3] \n"/* Program RNR = 8. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r3, xRNRConst \n"/* r3 = 0xe000ed98 [Location of RNR]. */ + " movs r4, #12 \n"/* r4 = 12. */ + " str r4, [r3] \n"/* Program RNR = 12. */ + " ldr r3, xRBARConst \n"/* r3 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r3!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r3, xMPUCTRLConst \n"/* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r3] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r3] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r2!, {r0, r1, r3, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r3 \n"/* Restore the CONTROL register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #else /* configENABLE_MPU */ + " ldmia r2!, {r0, r1, r4} \n"/* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " mov lr, r4 \n"/* LR = r4. */ + " ldr r3, xSecureContextConst \n"/* Read the location of xSecureContext i.e. &( xSecureContext ). */ + " str r0, [r3] \n"/* Restore the task's xSecureContext. */ + " cbz r0, restore_ns_context \n"/* If there is no secure context for the task, restore the non-secure context. */ + " ldr r3, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r3] \n"/* Read pxCurrentTCB. */ + " push {r2, r4} \n" + " bl SecureContext_LoadContext \n"/* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + " pop {r2, r4} \n" + " mov lr, r4 \n"/* LR = r4. */ + " lsls r1, r4, #25 \n"/* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + " bpl restore_ns_context \n"/* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + #endif /* configENABLE_MPU */ + " \n" + " restore_ns_context: \n" + " ldmia r2!, {r4-r11} \n"/* Restore the registers that are not automatically restored. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vldmiaeq r2!, {s16-s31} \n"/* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " msr psp, r2 \n"/* Remember the new top of stack for the task. */ + " bx lr \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + "xSecureContextConst: .word xSecureContext \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, svchandler_address_const \n" + " bx r1 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " svc %0 \n"/* Secure context is allocated in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_ALLOCATE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, [r0] \n"/* The first item in the TCB is the top of the stack. */ + " ldr r1, [r2] \n"/* The first item on the stack is the task's xSecureContext. */ + " cmp r1, #0 \n"/* Raise svc if task's xSecureContext is not NULL. */ + " it ne \n" + " svcne %0 \n"/* Secure context is freed in the supervisor call. */ + " bx lr \n"/* Return. */ + ::"i" ( portSVC_FREE_SECURE_CONTEXT ) : "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacro.h new file mode 100644 index 0000000..2375987 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M85" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.c new file mode 100644 index 0000000..1996693 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.c @@ -0,0 +1,351 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 + +/** + * @brief Size of stack seal values in bytes. + */ +#define securecontextSTACK_SEAL_SIZE 8 + +/** + * @brief Stack seal value as recommended by ARM. + */ +#define securecontextSTACK_SEAL_VALUE 0xFEF5EDA5 + +/** + * @brief Maximum number of secure contexts. + */ +#ifndef secureconfigMAX_SECURE_CONTEXTS + #define secureconfigMAX_SECURE_CONTEXTS 8UL +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Pre-allocated array of secure contexts. + */ +SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ]; +/*-----------------------------------------------------------*/ + +/** + * @brief Get a free secure context for a task from the secure context pool (xSecureContexts). + * + * This function ensures that only one secure context is allocated for a task. + * + * @param[in] pvTaskHandle The task handle for which the secure context is allocated. + * + * @return Index of a free secure context in the xSecureContexts array. + */ +static uint32_t ulGetSecureContext( void * pvTaskHandle ); + +/** + * @brief Return the secure context to the secure context pool (xSecureContexts). + * + * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array. + */ +static void vReturnSecureContext( uint32_t ulSecureContextIndex ); + +/* These are implemented in assembly. */ +extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ); +extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ); +/*-----------------------------------------------------------*/ + +static uint32_t ulGetSecureContext( void * pvTaskHandle ) +{ + /* Start with invalid index. */ + uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) && + ( xSecureContexts[ i ].pucStackLimit == NULL ) && + ( xSecureContexts[ i ].pucStackStart == NULL ) && + ( xSecureContexts[ i ].pvTaskHandle == NULL ) && + ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = i; + } + else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle ) + { + /* A task can only have one secure context. Do not allocate a second + * context for the same task. */ + ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + break; + } + } + + return ulSecureContextIndex; +} +/*-----------------------------------------------------------*/ + +static void vReturnSecureContext( uint32_t ulSecureContextIndex ) +{ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL; + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR, i; + static uint32_t ulSecureContextsInitialized = 0; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) ) + { + /* Ensure to initialize secure contexts only once. */ + ulSecureContextsInitialized = 1; + + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + /* Initialize all secure contexts. */ + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + xSecureContexts[ i ].pucCurrentStackPointer = NULL; + xSecureContexts[ i ].pucStackLimit = NULL; + xSecureContexts[ i ].pucStackStart = NULL; + xSecureContexts[ i ].pvTaskHandle = NULL; + } + + #if ( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ) +#endif /* configENABLE_MPU */ +{ + uint8_t * pucStackMemory = NULL; + uint8_t * pucStackLimit; + uint32_t ulIPSR, ulSecureContextIndex; + SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID; + + #if ( configENABLE_MPU == 1 ) + uint32_t * pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit + * Register (PSPLIM) value. */ + secureportREAD_IPSR( ulIPSR ); + secureportREAD_PSPLIM( pucStackLimit ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. + * Also do nothing, if a secure context us already loaded. PSPLIM is set to + * securecontextNO_STACK when no secure context is loaded. */ + if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) ) + { + /* Ontain a free secure context. */ + ulSecureContextIndex = ulGetSecureContext( pvTaskHandle ); + + /* Were we able to get a free context? */ + if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte for stack (excluding the space for seal values) + * because the hardware decrements the stack pointer before + * writing i.e. if stack pointer is 0x2, a push operation will + * decrement the stack pointer to 0x1 and then write at 0x1. */ + xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize; + + /* Seal the created secure process stack. */ + *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE; + *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory; + + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle; + + #if ( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart; + pulCurrentStackPointer--; + + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart; + } + #endif /* configENABLE_MPU */ + + /* Ensure to never return 0 as a valid context handle. */ + xSecureContextHandle = ulSecureContextIndex + 1UL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint32_t ulIPSR, ulSecureContextIndex; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Only free if a valid context handle is passed. */ + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + /* Ensure that the secure context being deleted is associated with + * the task. */ + if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) + { + /* Free the stack space. */ + vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit ); + + /* Return the secure context back to the free secure contexts pool. */ + vReturnSecureContext( ulSecureContextIndex ); + } + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that no secure context is loaded and the task is loading it's + * own context. */ + if( ( pucStackLimit == securecontextNO_STACK ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that task's context is loaded and the task is saving it's own + * context. */ + if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.h new file mode 100644 index 0000000..de33d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no secure context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Invalid context ID. + */ +#define securecontextINVALID_CONTEXT_ID 0UL +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent a secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first address of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t * pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t * pucStackStart; /**< First location of the stack memory. */ + void * pvTaskHandle; /**< Task handle of the task this context is associated with. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Opaque handle for a secure context. + */ +typedef uint32_t SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if ( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context_port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context_port.c new file mode 100644 index 0000000..952db8a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context_port.c @@ -0,0 +1,97 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) __attribute__( ( naked ) ); + +void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, load_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " ldmia r0!, {r1, r2} \n" /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r1!, {r3} \n" /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + " msr control, r3 \n" /* CONTROL = r3. */ + #endif /* configENABLE_MPU */ + " \n" + " msr psplim, r2 \n" /* PSPLIM = r2. */ + " msr psp, r1 \n" /* PSP = r1. */ + " \n" + " load_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::: "r0", "r1", "r2" + ); +} +/*-----------------------------------------------------------*/ + +void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ) +{ + /* pxSecureContext value is in r0. */ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r1, ipsr \n" /* r1 = IPSR. */ + " cbz r1, save_ctx_therad_mode \n" /* Do nothing if the processor is running in the Thread Mode. */ + " mrs r1, psp \n" /* r1 = PSP. */ + " \n" + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " vstmdb r1!, {s0} \n" /* Trigger the deferred stacking of FPU registers. */ + " vldmia r1!, {s0} \n" /* Nullify the effect of the previous statement. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " \n" + #if ( configENABLE_MPU == 1 ) + " mrs r2, control \n" /* r2 = CONTROL. */ + " stmdb r1!, {r2} \n" /* Store CONTROL value on the stack. */ + #endif /* configENABLE_MPU */ + " \n" + " str r1, [r0] \n" /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + " movs r1, %0 \n" /* r1 = securecontextNO_STACK. */ + " msr psplim, r1 \n" /* PSPLIM = securecontextNO_STACK. */ + " msr psp, r1 \n" /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + " \n" + " save_ctx_therad_mode: \n" + " bx lr \n" + " \n" + ::"i" ( securecontextNO_STACK ) : "r1", "memory" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.c new file mode 100644 index 0000000..b3bf007 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.c @@ -0,0 +1,454 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#ifndef secureconfigTOTAL_HEAP_SIZE + #define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) +#endif + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */ + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.h new file mode 100644 index 0000000..e469f2c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void * pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void * pv ); + +/** + * @brief Get the free heap size. + * + * @return Free heap size. + */ +size_t xPortGetFreeHeapSize( void ); + +/** + * @brief Get the minimum ever free heap size. + * + * @return Minimum ever free heap size. + */ +size_t xPortGetMinimumEverFreeHeapSize( void ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.c new file mode 100644 index 0000000..f6570d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.c @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.h new file mode 100644 index 0000000..e89af71 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_port_macros.h new file mode 100644 index 0000000..2fb7c59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_port_macros.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) ) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Read the PSPLIM value in the given variable. + */ +#define secureportREAD_PSPLIM( pucOutStackLimit ) \ + __asm volatile ( "mrs %0, psplim" : "=r" ( pucOutStackLimit ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ; ; ) {; } \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c new file mode 100644 index 0000000..3a97911 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c @@ -0,0 +1,365 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION + * is defined correctly and privileged functions are placed in correct sections. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Portasm includes. */ +#include "portasm.h" + +/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the + * header files. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r2, pxCurrentTCBConst2 \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r3, [r1] \n"/* r3 = *r1 i.e. r3 = MAIR0. */ + " ldr r2, xMAIR0Const2 \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r3, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #4 \n"/* r3 = 4. */ + " str r3, [r2] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #8 \n"/* r3 = 8. */ + " str r3, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst2 \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #12 \n"/* r3 = 12. */ + " str r3, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst2 \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 set of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst2 \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldm r0!, {r1-r3} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " msr control, r2 \n"/* Set this task's CONTROL value. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r3 \n"/* Finally, branch to EXC_RETURN. */ + #else /* configENABLE_MPU */ + " ldm r0!, {r1-r2} \n"/* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + " msr psplim, r1 \n"/* Set this task's PSPLIM value. */ + " movs r1, #2 \n"/* r1 = 2. */ + " msr CONTROL, r1 \n"/* Switch to use PSP in the thread mode. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " isb \n" + " mov r0, #0 \n" + " msr basepri, r0 \n"/* Ensure that interrupts are enabled when the first task starts. */ + " bx r2 \n"/* Finally, branch to EXC_RETURN. */ + #endif /* configENABLE_MPU */ + " \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst2: .word 0xe000ed94 \n" + "xMAIR0Const2: .word 0xe000edc0 \n" + "xRNRConst2: .word 0xe000ed98 \n" + "xRBARConst2: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " tst r0, #1 \n"/* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + " ite ne \n" + " movne r0, #0 \n"/* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + " moveq r0, #1 \n"/* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + " bx lr \n"/* Return. */ + " \n" + " .align 4 \n" + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* Read the CONTROL register. */ + " bic r0, #1 \n"/* Clear the bit 0. */ + " msr control, r0 \n"/* Write back the new CONTROL value. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vResetPrivilege( void ) /* __attribute__ (( naked )) */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, control \n"/* r0 = CONTROL. */ + " orr r0, #1 \n"/* r0 = r0 | 1. */ + " msr control, r0 \n"/* CONTROL = r0. */ + " bx lr \n"/* Return to the caller. */ + ::: "r0", "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " ldr r0, xVTORConst \n"/* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n"/* Read the VTOR register which gives the address of vector table. */ + " ldr r0, [r0] \n"/* The first entry in vector table is stack pointer. */ + " msr msp, r0 \n"/* Set the MSP back to the start of the stack. */ + " cpsie i \n"/* Globally enable interrupts. */ + " cpsie f \n" + " dsb \n" + " isb \n" + " svc %0 \n"/* System call to start the first task. */ + " nop \n" + " \n" + " .align 4 \n" + "xVTORConst: .word 0xe000ed08 \n" + ::"i" ( portSVC_START_SCHEDULER ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, basepri \n"/* r0 = basepri. Return original basepri value. */ + " mov r1, %0 \n"/* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " msr basepri, r1 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " msr basepri, r0 \n"/* basepri = ulMask. */ + " dsb \n" + " isb \n" + " bx lr \n"/* Return. */ + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " mrs r0, psp \n"/* Read PSP in r0. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst lr, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n"/* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + " mrs r1, psplim \n"/* r1 = PSPLIM. */ + " mrs r2, control \n"/* r2 = CONTROL. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmdb r0!, {r1-r11} \n"/* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */ + #else /* configENABLE_MPU */ + " mrs r2, psplim \n"/* r2 = PSPLIM. */ + " mov r3, lr \n"/* r3 = LR/EXC_RETURN. */ + " stmdb r0!, {r2-r11} \n"/* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */ + #endif /* configENABLE_MPU */ + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " str r0, [r1] \n"/* Save the new top of stack in TCB. */ + " \n" + " mov r0, %0 \n"/* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */ + " msr basepri, r0 \n"/* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + " dsb \n" + " isb \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n"/* r0 = 0. */ + " msr basepri, r0 \n"/* Enable interrupts. */ + " \n" + " ldr r2, pxCurrentTCBConst \n"/* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + " ldr r1, [r2] \n"/* Read pxCurrentTCB. */ + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + " \n" + #if ( configENABLE_MPU == 1 ) + " dmb \n"/* Complete outstanding transfers before disabling MPU. */ + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " bic r4, #1 \n"/* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + " str r4, [r2] \n"/* Disable MPU. */ + " \n" + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + " ldr r3, [r1] \n"/* r3 = *r1 i.e. r3 = MAIR0. */ + " ldr r2, xMAIR0Const \n"/* r2 = 0xe000edc0 [Location of MAIR0]. */ + " str r3, [r2] \n"/* Program MAIR0. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #4 \n"/* r3 = 4. */ + " str r3, [r2] \n"/* Program RNR = 4. */ + " adds r1, #4 \n"/* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " \n" + #if ( configTOTAL_MPU_REGIONS == 16 ) + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #8 \n"/* r3 = 8. */ + " str r3, [r2] \n"/* Program RNR = 8. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + " ldr r2, xRNRConst \n"/* r2 = 0xe000ed98 [Location of RNR]. */ + " movs r3, #12 \n"/* r3 = 12. */ + " str r3, [r2] \n"/* Program RNR = 12. */ + " ldr r2, xRBARConst \n"/* r2 = 0xe000ed9c [Location of RBAR]. */ + " ldmia r1!, {r4-r11} \n"/* Read 4 sets of RBAR/RLAR registers from TCB. */ + " stmia r2!, {r4-r11} \n"/* Write 4 set of RBAR/RLAR registers using alias registers. */ + #endif /* configTOTAL_MPU_REGIONS == 16 */ + " \n" + " ldr r2, xMPUCTRLConst \n"/* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + " ldr r4, [r2] \n"/* Read the value of MPU_CTRL. */ + " orr r4, #1 \n"/* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + " str r4, [r2] \n"/* Enable MPU. */ + " dsb \n"/* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( configENABLE_MPU == 1 ) + " ldmia r0!, {r1-r11} \n"/* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */ + #else /* configENABLE_MPU */ + " ldmia r0!, {r2-r11} \n"/* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */ + #endif /* configENABLE_MPU */ + " \n" + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + " tst r3, #0x10 \n"/* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n"/* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + " \n" + #if ( configENABLE_MPU == 1 ) + " msr psplim, r1 \n"/* Restore the PSPLIM register value for the task. */ + " msr control, r2 \n"/* Restore the CONTROL register value for the task. */ + #else /* configENABLE_MPU */ + " msr psplim, r2 \n"/* Restore the PSPLIM register value for the task. */ + #endif /* configENABLE_MPU */ + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " bx r3 \n" + " \n" + " .align 4 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + #if ( configENABLE_MPU == 1 ) + "xMPUCTRLConst: .word 0xe000ed94 \n" + "xMAIR0Const: .word 0xe000edc0 \n" + "xRNRConst: .word 0xe000ed98 \n" + "xRBARConst: .word 0xe000ed9c \n" + #endif /* configENABLE_MPU */ + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */ +{ + __asm volatile + ( + " .syntax unified \n" + " \n" + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, svchandler_address_const \n" + " bx r1 \n" + " \n" + " .align 4 \n" + "svchandler_address_const: .word vPortSVCHandler_C \n" + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h new file mode 100644 index 0000000..2375987 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h @@ -0,0 +1,71 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M85" +#define portDONT_DISCARD __attribute__( ( used ) ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/port.c new file mode 100644 index 0000000..52fb5d5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/port.c @@ -0,0 +1,596 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. Refer to Cortex-A equivalent: http: /*www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html */ +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. Refer to Cortex-A equivalent: http: /*www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html */ +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. Refer to Cortex-A equivalent: http: /*www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html */ +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. Refer to Cortex-A equivalent: http: /*www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html */ +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. Refer to Cortex-A equivalent: http: /*www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html */ +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +/* Some vendor specific files default configCLEAR_TICK_INTERRUPT() in + * portmacro.h. */ +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* A critical section is exited when the critical section nesting count reaches + * this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all + * (but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a + * floating point context after they have been created. A variable is stored as + * part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task + * does not have an FPU context, or any other value if the task does have an FPU + * context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINTERRUPT_ENABLE_BIT ( 0x80UL ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary + * point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user + * mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* The critical section macros only mask interrupts up to an application + * determined priority level. Sometimes it is necessary to turn interrupt off in + * the CPU itself before modifying certain hardware registers. */ +#define portCPU_IRQ_DISABLE() \ + __asm volatile ( "CPSID i" ::: "memory" ); \ + __asm volatile ( "DSB" ); \ + __asm volatile ( "ISB" ); + +#define portCPU_IRQ_ENABLE() \ + __asm volatile ( "CPSIE i" ::: "memory" ); \ + __asm volatile ( "DSB" ); \ + __asm volatile ( "ISB" ); + + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ + { \ + portCPU_IRQ_DISABLE(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm volatile ( "DSB \n" \ + "ISB \n"); \ + portCPU_IRQ_ENABLE(); \ + } + +#define portINTERRUPT_PRIORITY_REGISTER_OFFSET 0x400UL +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portBIT_0_SET ( ( uint8_t ) 0x01 ) + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case is messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * The space on the stack required to hold the FPU registers. + * + * The ARM Cortex R5 processor implements the VFPv3-D16 FPU + * architecture. This includes only 16 double-precision registers, + * instead of 32 as is in VFPv3. The register bank can be viewed + * either as sixteen 64-bit double-word registers (D0-D15) or + * thirty-two 32-bit single-word registers (S0-S31), in both cases + * the size of the bank remains the same. The FPU has also a 32-bit + * status register. + */ +#define portFPU_REGISTER_WORDS ( ( 16 * 2 ) + 1 ) + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/* + * If the application provides an implementation of vApplicationIRQHandler(), + * then it will get called directly without saving the FPU registers on + * interrupt entry, and this weak implementation of + * vApplicationFPUSafeIRQHandler() is just provided to remove linkage errors - + * it should never actually get called so its implementation contains a + * call to configASSERT() that will always fail. + * + * If the application provides its own implementation of + * vApplicationFPUSafeIRQHandler() then the implementation of + * vApplicationIRQHandler() provided in portASM.S will save the FPU registers + * before calling it. + * + * Therefore, if the application writer wants FPU registers to be saved on + * interrupt entry their IRQ handler must be called + * vApplicationFPUSafeIRQHandler(), and if the application writer does not want + * FPU registers to be saved on interrupt entry their IRQ handler must be + * called vApplicationIRQHandler(). + */ +void vApplicationFPUSafeIRQHandler( uint32_t ulICCIAR ) __attribute__((weak) ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This + * variable has to be stored as part of the task context and must be initialised to + * a non zero value to ensure interrupts don't inadvertently become unmasked before + * the scheduler starts. As it is stored as part of the task context it will + * automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then + * a floating point context must be saved and restored for the task. */ +uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if + * if the nesting depth is 0. */ +uint32_t ulPortInterruptNesting = 0UL; + +/* Used in asm code. */ +__attribute__( ( used ) ) const uint32_t ulICCIAR = portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS; +__attribute__( ( used ) ) const uint32_t ulICCEOIR = portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS; +__attribute__( ( used ) ) const uint32_t ulICCPMR = portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS; +__attribute__( ( used ) ) const uint32_t ulMaxAPIPriorityMask = ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + * expected by the portRESTORE_CONTEXT() macro. + * + * The fist real value on the stack is the status register, which is set for + * system mode, with interrupts enabled. A few NULLs are added first to ensure + * GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + * enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + #if( configUSE_TASK_FPU_SUPPORT == 1 ) + { + /* The task will start without a floating point context. A task that + uses the floating point hardware must call vPortTaskUsesFPU() before + executing any floating point instructions. */ + pxTopOfStack--; + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + } + #elif( configUSE_TASK_FPU_SUPPORT == 2 ) + { + /* The task will start with a floating point context. Leave enough + space for the registers - and ensure they are initialized to 0. */ + pxTopOfStack -= portFPU_REGISTER_WORDS; + memset( pxTopOfStack, 0x00, portFPU_REGISTER_WORDS * sizeof( StackType_t ) ); + + pxTopOfStack--; + *pxTopOfStack = pdTRUE; + ulPortTaskHasFPUContext = pdTRUE; + } + #else + { + #error Invalid configUSE_TASK_FPU_SUPPORT setting - configUSE_TASK_FPU_SUPPORT must be set to 1, 2, or left undefined. + } + #endif /* configUSE_TASK_FPU_SUPPORT */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +void vApplicationFPUSafeIRQHandler( uint32_t ulICCIAR ) +{ + ( void ) ulICCIAR; + configASSERT( ( volatile void * ) NULL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + uint32_t ulAPSR, ulCycles = 8; /* 8 bits per byte. */ + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + portINTERRUPT_PRIORITY_REGISTER_OFFSET ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine how many priority bits are implemented in the GIC. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to + * all possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Shift to the least significant bits. */ + while( ( ucMaxPriorityValue & portBIT_0_SET ) != portBIT_0_SET ) + { + ucMaxPriorityValue >>= ( uint8_t ) 0x01; + + /* If ulCycles reaches 0 then ucMaxPriorityValue must have been + * read as 0, indicating a misconfiguration. */ + ulCycles--; + + if( ulCycles == 0 ) + { + break; + } + } + + /* Sanity check configUNIQUE_INTERRUPT_PRIORITIES matches the read + * value. */ + configASSERT( ucMaxPriorityValue == portLOWEST_INTERRUPT_PRIORITY ); + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Only continue if the CPU is not in User mode. The CPU must be in a + * Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR )::"memory" ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Only continue if the binary point value is set to its lowest possible + * setting. See the comments in vPortValidateInterruptPriority() below for + * more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Interrupts are turned off in the CPU itself to ensure tick does + * not execute while the scheduler is being started. Interrupts are + * automatically turned back on in the CPU when the first task starts + * executing. */ + portCPU_IRQ_DISABLE(); + + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + * a non-privileged mode or the binary point register was not set to its lowest + * possible value. prvTaskExitError() is referenced to prevent a compiler + * warning about it being defined but not referenced in the case that the user + * defines their own exit address. */ + ( void ) prvTaskExitError; + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Mask interrupts up to the max syscall interrupt priority. */ + ulPortSetInterruptMask(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + * directly. Increment ulCriticalNesting to keep a count of how many times + * portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + * exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + * priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + * should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Set interrupt mask before altering scheduler structures. The tick + * handler runs at the lowest priority, so interrupts cannot already be masked, + * so there is no need to save and restore the current mask value. It is + * necessary to turn off interrupts in the CPU itself while the ICCPMR is being + * updated. */ + portCPU_IRQ_DISABLE(); + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb \n" + "isb \n"::: "memory" ); + portCPU_IRQ_ENABLE(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_TASK_FPU_SUPPORT != 2 ) + + void vPortTaskUsesFPU( void ) + { + uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + * FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm volatile ( "FMXR FPSCR, %0" ::"r" ( ulInitialFPSCR ) : "memory" ); + } + +#endif /* configUSE_TASK_FPU_SUPPORT */ +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + if( ulNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ + uint32_t ulReturn; + + /* Interrupt in the CPU must be turned off while the ICCPMR is being + * updated. */ + portCPU_IRQ_DISABLE(); + + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm volatile ( "dsb \n" + "isb \n"::: "memory" ); + } + + portCPU_IRQ_ENABLE(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. */ + + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * The priority grouping is configured by the GIC's binary point register + * (ICCBPR). Writing 0 to ICCBPR will ensure it is set to its lowest + * possible value (which may be above 0). */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portASM.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portASM.S new file mode 100644 index 0000000..2291395 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portASM.S @@ -0,0 +1,318 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + .text + .arm + + .set SYS_MODE, 0x1f + .set SVC_MODE, 0x13 + .set IRQ_MODE, 0x12 + + /* Hardware registers. */ + .extern ulICCIAR + .extern ulICCEOIR + .extern ulICCPMR + + /* Variables and functions. */ + .extern ulMaxAPIPriorityMask + .extern _freertos_vector_table + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vApplicationIRQHandler + .extern ulPortInterruptNesting + .extern ulPortTaskHasFPUContext + + .global FreeRTOS_IRQ_Handler + .global FreeRTOS_SWI_Handler + .global vPortRestoreTaskContext + +.macro portSAVE_CONTEXT + + /* Save the LR and SPSR onto the system mode stack before switching to + system mode to save the remaining system mode registers. */ + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + /* Push the critical nesting count. */ + LDR R2, ulCriticalNestingConst + LDR R1, [R2] + PUSH {R1} + + /* Does the task have a floating point context that needs saving? If + ulPortTaskHasFPUContext is 0 then no. */ + LDR R2, ulPortTaskHasFPUContextConst + LDR R3, [R2] + CMP R3, #0 + + /* Save the floating point context, if any. */ + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} + /*VPUSHNE {D16-D31}*/ + PUSHNE {R1} + + /* Save ulPortTaskHasFPUContext itself. */ + PUSH {R3} + + /* Save the stack pointer in the TCB. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + STR SP, [R1] + + .endm + +; /**********************************************************************/ + +.macro portRESTORE_CONTEXT + + /* Set the SP to point to the stack of the task being restored. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + LDR SP, [R1] + + /* Is there a floating point context to restore? If the restored + ulPortTaskHasFPUContext is zero then no. */ + LDR R0, ulPortTaskHasFPUContextConst + POP {R1} + STR R1, [R0] + CMP R1, #0 + + /* Restore the floating point context, if any. */ + POPNE {R0} + /*VPOPNE {D16-D31}*/ + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + /* Restore the critical section nesting depth. */ + LDR R0, ulCriticalNestingConst + POP {R1} + STR R1, [R0] + + /* Ensure the priority mask is correct for the critical nesting depth. */ + LDR R2, ulICCPMRConst + LDR R2, [R2] + CMP R1, #0 + MOVEQ R4, #255 + LDRNE R4, ulMaxAPIPriorityMaskConst + LDRNE R4, [R4] + STR R4, [R2] + + /* Restore all system mode registers other than the SP (which is already + being used). */ + POP {R0-R12, R14} + + /* Return to the task code, loading CPSR on the way. */ + RFEIA sp! + + .endm + + + + +/****************************************************************************** + * SVC handler is used to start the scheduler. + *****************************************************************************/ +.align 4 +.type FreeRTOS_SWI_Handler, %function +FreeRTOS_SWI_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + LDR R0, vTaskSwitchContextConst + BLX R0 + portRESTORE_CONTEXT + + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +.type vPortRestoreTaskContext, %function +vPortRestoreTaskContext: + /* Switch to system mode. */ + CPS #SYS_MODE + portRESTORE_CONTEXT + +.align 4 +.type FreeRTOS_IRQ_Handler, %function +FreeRTOS_IRQ_Handler: + + /* Return to the interrupted instruction. */ + SUB lr, lr, #4 + + /* Push the return address and SPSR. */ + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + /* Change to supervisor mode to allow reentry. */ + CPS #SVC_MODE + + /* Push used registers. */ + PUSH {r0-r4, r12} + + /* Increment nesting count. r3 holds the address of ulPortInterruptNesting + for future use. r1 holds the original ulPortInterruptNesting value for + future use. */ + LDR r3, ulPortInterruptNestingConst + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + /* Read value from the interrupt acknowledge register, which is stored in r0 + for future parameter and interrupt clearing use. */ + LDR r2, ulICCIARConst + LDR r2, [r2] + LDR r0, [r2] + + /* Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + future use. _RB_ Is this ever needed provided the start of the stack is + alligned on an 8-byte boundary? */ + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + /* Call the interrupt handler. */ + PUSH {r0-r4, lr} + LDR r1, vApplicationIRQHandlerConst + BLX r1 + POP {r0-r4, lr} + ADD sp, sp, r2 + + CPSID i + DSB + ISB + + /* Write the value read from ICCIAR to ICCEOIR. */ + LDR r4, ulICCEOIRConst + LDR r4, [r4] + STR r0, [r4] + + /* Restore the old nesting count. */ + STR r1, [r3] + + /* A context switch is never performed if the nesting count is not 0. */ + CMP r1, #0 + BNE exit_without_switch + + /* Did the interrupt request a context switch? r1 holds the address of + ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + use. */ + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch: + /* No context switch. Restore used registers, LR_irq and SPSR before + returning. */ + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit: + /* A context swtich is to be performed. Clear the context switch pending + flag. */ + MOV r0, #0 + STR r0, [r1] + + /* Restore used registers, LR-irq and SPSR before saving the context + to the task stack. */ + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + /* Call the function that selects the new task to execute. + vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + instructions, or 8 byte aligned stack allocated data. LR does not need + saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */ + LDR R0, vTaskSwitchContextConst + BLX R0 + + /* Restore the context of, and branch to, the task selected to execute + next. */ + portRESTORE_CONTEXT + +/****************************************************************************** + * If the application provides an implementation of vApplicationIRQHandler(), + * then it will get called directly without saving the FPU registers on + * interrupt entry, and this weak implementation of + * vApplicationIRQHandler() will not get called. + * + * If the application provides its own implementation of + * vApplicationFPUSafeIRQHandler() then this implementation of + * vApplicationIRQHandler() will be called, save the FPU registers, and then + * call vApplicationFPUSafeIRQHandler(). + * + * Therefore, if the application writer wants FPU registers to be saved on + * interrupt entry their IRQ handler must be called + * vApplicationFPUSafeIRQHandler(), and if the application writer does not want + * FPU registers to be saved on interrupt entry their IRQ handler must be + * called vApplicationIRQHandler(). + *****************************************************************************/ + +.align 4 +.weak vApplicationIRQHandler +.type vApplicationIRQHandler, %function +vApplicationIRQHandler: + PUSH {LR} + FMRX R1, FPSCR + VPUSH {D0-D15} + PUSH {R1} + + LDR r1, vApplicationFPUSafeIRQHandlerConst + BLX r1 + + POP {R0} + VPOP {D0-D15} + VMSR FPSCR, R0 + + POP {PC} + +ulICCIARConst: .word ulICCIAR +ulICCEOIRConst: .word ulICCEOIR +ulICCPMRConst: .word ulICCPMR +pxCurrentTCBConst: .word pxCurrentTCB +ulCriticalNestingConst: .word ulCriticalNesting +ulPortTaskHasFPUContextConst: .word ulPortTaskHasFPUContext +ulMaxAPIPriorityMaskConst: .word ulMaxAPIPriorityMask +vTaskSwitchContextConst: .word vTaskSwitchContext +vApplicationIRQHandlerConst: .word vApplicationIRQHandler +ulPortInterruptNestingConst: .word ulPortInterruptNesting +vApplicationFPUSafeIRQHandlerConst: .word vApplicationFPUSafeIRQHandler + +.end + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portmacro.h new file mode 100644 index 0000000..b03db05 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portmacro.h @@ -0,0 +1,204 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ + #define portEND_SWITCHING_ISR( xSwitchRequired ) \ + { \ + extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ + } + + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + #define portYIELD() __asm volatile ( "SWI 0" ::: "memory" ); + + +/*----------------------------------------------------------- +* Critical section control +*----------------------------------------------------------*/ + + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulPortSetInterruptMask( void ); + extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); + extern void vPortInstallFreeRTOSVectorTable( void ); + +/* These macros do not globally disable/enable interrupts. They do mask off + * interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ + #define portENTER_CRITICAL() vPortEnterCritical(); + #define portEXIT_CRITICAL() vPortExitCritical(); + #define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() + #define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortClearInterruptMask( x ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not required for this port but included in case common demo code that uses these + * macros is used. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the + * handler for whichever peripheral is used to generate the RTOS tick. */ + void FreeRTOS_Tick_Handler( void ); + +/* If configUSE_TASK_FPU_SUPPORT is set to 1 (or left undefined) then tasks are +created without an FPU context and must call vPortTaskUsesFPU() to give +themselves an FPU context before using any FPU instructions. If +configUSE_TASK_FPU_SUPPORT is set to 2 then all tasks will have an FPU context +by default. */ +#if( configUSE_TASK_FPU_SUPPORT != 2 ) + void vPortTaskUsesFPU( void ); +#else + /* Each task has an FPU context already, so define this function away to + nothing to prevent it being called accidentally. */ + #define vPortTaskUsesFPU() +#endif /* configUSE_TASK_FPU_SUPPORT */ + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + + #define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) + #define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __builtin_clz( uxReadyPriorities ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif /* configASSERT */ + + #define portNOP() __asm volatile ( "NOP" ) + + + #ifdef __cplusplus + } /* extern C */ + #endif + + +/* The number of bits to shift for an interrupt priority is dependent on the + * number of bits implemented by the interrupt controller. */ + #if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 + #elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 + #elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 + #elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 + #elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 + #else /* if configUNIQUE_INTERRUPT_PRIORITIES == 16 */ + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware + #endif /* if configUNIQUE_INTERRUPT_PRIORITIES == 16 */ + +/* Interrupt controller access addresses. */ + #define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) + #define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) + #define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) + #define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) + #define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) + + #define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) + #define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) + #define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) + #define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) + #define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) + #define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) + #define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/port.c new file mode 100644 index 0000000..a3def1e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/port.c @@ -0,0 +1,320 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt. +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt. +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then +a floating point context must be saved and restored for the task. */ +volatile uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +volatile uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +volatile uint32_t ulPortInterruptNesting = 0UL; + +/* Used in the asm file to clear an interrupt. */ +__attribute__(( used )) const uint32_t ulICCEOIR = configEOI_ADDRESS; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) :: "memory" ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Start the timer that generates the tick ISR. */ + portDISABLE_INTERRUPTS(); + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. prvTaskExitError() is referenced to prevent a compiler + warning about it being defined but not referenced in the case that the user + defines their own exit address. */ + ( void ) prvTaskExitError; + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ +uint32_t ulInterruptStatus; + + ulInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulInterruptStatus ); + + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm volatile ( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) : "memory" ); +} +/*-----------------------------------------------------------*/ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portASM.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portASM.S new file mode 100644 index 0000000..7c48c92 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portASM.S @@ -0,0 +1,265 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + .text + .arm + + .set SYS_MODE, 0x1f + .set SVC_MODE, 0x13 + .set IRQ_MODE, 0x12 + + /* Variables and functions. */ + .extern ulMaxAPIPriorityMask + .extern _freertos_vector_table + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vApplicationIRQHandler + .extern ulPortInterruptNesting + .extern ulPortTaskHasFPUContext + .extern ulICCEOIR + .extern ulPortYieldRequired + + .global FreeRTOS_IRQ_Handler + .global FreeRTOS_SVC_Handler + .global vPortRestoreTaskContext + + +.macro portSAVE_CONTEXT + + /* Save the LR and SPSR onto the system mode stack before switching to + system mode to save the remaining system mode registers. */ + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + /* Push the critical nesting count. */ + LDR R2, ulCriticalNestingConst + LDR R1, [R2] + PUSH {R1} + + /* Does the task have a floating point context that needs saving? If + ulPortTaskHasFPUContext is 0 then no. */ + LDR R2, ulPortTaskHasFPUContextConst + LDR R3, [R2] + CMP R3, #0 + + /* Save the floating point context, if any. */ + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} +#if configFPU_D32 == 1 + VPUSHNE {D16-D31} +#endif /* configFPU_D32 */ + PUSHNE {R1} + + /* Save ulPortTaskHasFPUContext itself. */ + PUSH {R3} + + /* Save the stack pointer in the TCB. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + STR SP, [R1] + + .endm + +; /**********************************************************************/ + +.macro portRESTORE_CONTEXT + + /* Set the SP to point to the stack of the task being restored. */ + LDR R0, pxCurrentTCBConst + LDR R1, [R0] + LDR SP, [R1] + + /* Is there a floating point context to restore? If the restored + ulPortTaskHasFPUContext is zero then no. */ + LDR R0, ulPortTaskHasFPUContextConst + POP {R1} + STR R1, [R0] + CMP R1, #0 + + /* Restore the floating point context, if any. */ + POPNE {R0} +#if configFPU_D32 == 1 + VPOPNE {D16-D31} +#endif /* configFPU_D32 */ + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + /* Restore the critical section nesting depth. */ + LDR R0, ulCriticalNestingConst + POP {R1} + STR R1, [R0] + + /* Restore all system mode registers other than the SP (which is already + being used). */ + POP {R0-R12, R14} + + /* Return to the task code, loading CPSR on the way. */ + RFEIA sp! + + .endm + + + + +/****************************************************************************** + * SVC handler is used to yield. + *****************************************************************************/ +.align 4 +.type FreeRTOS_SVC_Handler, %function +FreeRTOS_SVC_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + LDR R0, vTaskSwitchContextConst + BLX R0 + portRESTORE_CONTEXT + + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +.align 4 +.type vPortRestoreTaskContext, %function +vPortRestoreTaskContext: + /* Switch to system mode. */ + CPS #SYS_MODE + portRESTORE_CONTEXT + +.align 4 +.type FreeRTOS_IRQ_Handler, %function +FreeRTOS_IRQ_Handler: + /* Return to the interrupted instruction. */ + SUB lr, lr, #4 + + /* Push the return address and SPSR. */ + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + /* Change to supervisor mode to allow reentry. */ + CPS #0x13 + + /* Push used registers. */ + PUSH {r0-r3, r12} + + /* Increment nesting count. r3 holds the address of ulPortInterruptNesting + for future use. r1 holds the original ulPortInterruptNesting value for + future use. */ + LDR r3, ulPortInterruptNestingConst + LDR r1, [r3] + ADD r0, r1, #1 + STR r0, [r3] + + /* Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + future use. */ + MOV r0, sp + AND r2, r0, #4 + SUB sp, sp, r2 + + /* Call the interrupt handler. */ + PUSH {r0-r3, lr} + LDR r1, vApplicationIRQHandlerConst + BLX r1 + POP {r0-r3, lr} + ADD sp, sp, r2 + + CPSID i + DSB + ISB + + /* Write to the EOI register. */ + LDR r0, ulICCEOIRConst + LDR r2, [r0] + STR r0, [r2] + + /* Restore the old nesting count. */ + STR r1, [r3] + + /* A context switch is never performed if the nesting count is not 0. */ + CMP r1, #0 + BNE exit_without_switch + + /* Did the interrupt request a context switch? r1 holds the address of + ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + use. */ + LDR r1, ulPortYieldRequiredConst + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch: + /* No context switch. Restore used registers, LR_irq and SPSR before + returning. */ + POP {r0-r3, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit: + /* A context swtich is to be performed. Clear the context switch pending + flag. */ + MOV r0, #0 + STR r0, [r1] + + /* Restore used registers, LR-irq and SPSR before saving the context + to the task stack. */ + POP {r0-r3, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + /* Call the function that selects the new task to execute. + vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + instructions, or 8 byte aligned stack allocated data. LR does not need + saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */ + LDR R0, vTaskSwitchContextConst + BLX R0 + + /* Restore the context of, and branch to, the task selected to execute + next. */ + portRESTORE_CONTEXT + +ulICCEOIRConst: .word ulICCEOIR +pxCurrentTCBConst: .word pxCurrentTCB +ulCriticalNestingConst: .word ulCriticalNesting +ulPortTaskHasFPUContextConst: .word ulPortTaskHasFPUContext +vTaskSwitchContextConst: .word vTaskSwitchContext +vApplicationIRQHandlerConst: .word vApplicationIRQHandler +ulPortInterruptNestingConst: .word ulPortInterruptNesting +ulPortYieldRequiredConst: .word ulPortYieldRequired + +.end + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portmacro.h new file mode 100644 index 0000000..304c323 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portmacro.h @@ -0,0 +1,182 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef uint32_t TickType_t; +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern volatile uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm volatile ( "SWI 0 \n" \ + "ISB " ::: "memory" ); + + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +/* The I bit within the CPSR. */ +#define portINTERRUPT_ENABLE_BIT ( 1 << 7 ) + +/* In the absence of a priority mask register, these functions and macros +globally enable and disable interrupts. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portENABLE_INTERRUPTS() __asm volatile ( "CPSIE i \n" ::: "memory" ); +#define portDISABLE_INTERRUPTS() __asm volatile ( "CPSID i \n" \ + "DSB \n" \ + "ISB " ::: "memory" ); + +__attribute__( ( always_inline ) ) static __inline uint32_t portINLINE_SET_INTERRUPT_MASK_FROM_ISR( void ) +{ +volatile uint32_t ulCPSR; + + __asm volatile ( "MRS %0, CPSR" : "=r" (ulCPSR) :: "memory" ); + ulCPSR &= portINTERRUPT_ENABLE_BIT; + portDISABLE_INTERRUPTS(); + return ulCPSR; +} + +#define portSET_INTERRUPT_MASK_FROM_ISR() portINLINE_SET_INTERRUPT_MASK_FROM_ISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) do { if( x == 0 ) portENABLE_INTERRUPTS(); } while( 0 ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#define portNOP() __asm volatile( "NOP" ) +#define portINLINE __inline + +#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) + +#ifdef __cplusplus + } /* extern C */ +#endif + + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/port.c new file mode 100644 index 0000000..43c6dfa --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/port.c @@ -0,0 +1,427 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + +Changes from V2.6.0 + + + AVR port - Replaced the inb() and outb() functions with direct memory + access. This allows the port to be built with the 20050414 build of + WinAVR. +*/ + +#include +#include + +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the AVR port. + *----------------------------------------------------------*/ + +/* Start tasks with interrupts enables. */ +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x80 ) + +/* Hardware constants for timer 1. */ +#define portCLEAR_COUNTER_ON_MATCH ( ( uint8_t ) 0x08 ) +#define portPRESCALE_64 ( ( uint8_t ) 0x03 ) +#define portCLOCK_PRESCALER ( ( uint32_t ) 64 ) +#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE ( ( uint8_t ) 0x10 ) + +/*-----------------------------------------------------------*/ + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * Macro to save all the general purpose registers, the save the stack pointer + * into the TCB. + * + * The first thing we do is save the flags then disable interrupts. This is to + * guard our stack against having a context switch interrupt after we have already + * pushed the registers onto the stack - causing the 32 registers to be on the + * stack twice. + * + * r1 is set to zero as the compiler expects it to be thus, however some + * of the math routines make use of R1. + * + * The interrupts will have been disabled during the call to portSAVE_CONTEXT() + * so we need not worry about reading/writing to the stack pointer. + */ + +#define portSAVE_CONTEXT() \ + asm volatile ( "push r0 \n\t" \ + "in r0, __SREG__ \n\t" \ + "cli \n\t" \ + "push r0 \n\t" \ + "push r1 \n\t" \ + "clr r1 \n\t" \ + "push r2 \n\t" \ + "push r3 \n\t" \ + "push r4 \n\t" \ + "push r5 \n\t" \ + "push r6 \n\t" \ + "push r7 \n\t" \ + "push r8 \n\t" \ + "push r9 \n\t" \ + "push r10 \n\t" \ + "push r11 \n\t" \ + "push r12 \n\t" \ + "push r13 \n\t" \ + "push r14 \n\t" \ + "push r15 \n\t" \ + "push r16 \n\t" \ + "push r17 \n\t" \ + "push r18 \n\t" \ + "push r19 \n\t" \ + "push r20 \n\t" \ + "push r21 \n\t" \ + "push r22 \n\t" \ + "push r23 \n\t" \ + "push r24 \n\t" \ + "push r25 \n\t" \ + "push r26 \n\t" \ + "push r27 \n\t" \ + "push r28 \n\t" \ + "push r29 \n\t" \ + "push r30 \n\t" \ + "push r31 \n\t" \ + "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "in r0, 0x3d \n\t" \ + "st x+, r0 \n\t" \ + "in r0, 0x3e \n\t" \ + "st x+, r0 \n\t" \ + ); + +/* + * Opposite to portSAVE_CONTEXT(). Interrupts will have been disabled during + * the context save so we can write to the stack pointer. + */ + +#define portRESTORE_CONTEXT() \ + asm volatile ( "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "ld r28, x+ \n\t" \ + "out __SP_L__, r28 \n\t" \ + "ld r29, x+ \n\t" \ + "out __SP_H__, r29 \n\t" \ + "pop r31 \n\t" \ + "pop r30 \n\t" \ + "pop r29 \n\t" \ + "pop r28 \n\t" \ + "pop r27 \n\t" \ + "pop r26 \n\t" \ + "pop r25 \n\t" \ + "pop r24 \n\t" \ + "pop r23 \n\t" \ + "pop r22 \n\t" \ + "pop r21 \n\t" \ + "pop r20 \n\t" \ + "pop r19 \n\t" \ + "pop r18 \n\t" \ + "pop r17 \n\t" \ + "pop r16 \n\t" \ + "pop r15 \n\t" \ + "pop r14 \n\t" \ + "pop r13 \n\t" \ + "pop r12 \n\t" \ + "pop r11 \n\t" \ + "pop r10 \n\t" \ + "pop r9 \n\t" \ + "pop r8 \n\t" \ + "pop r7 \n\t" \ + "pop r6 \n\t" \ + "pop r5 \n\t" \ + "pop r4 \n\t" \ + "pop r3 \n\t" \ + "pop r2 \n\t" \ + "pop r1 \n\t" \ + "pop r0 \n\t" \ + "out __SREG__, r0 \n\t" \ + "pop r0 \n\t" \ + ); + +/*-----------------------------------------------------------*/ + +/* + * Perform hardware setup to enable ticks from timer 1, compare match A. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t usAddress; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + + /* Simulate how the stack would look after a call to vPortYield() generated by + the compiler. */ + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* The start of the task code will be popped off the stack last, so place + it on first. */ + usAddress = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* Next simulate the stack as if after a call to portSAVE_CONTEXT(). + portSAVE_CONTEXT places the flags on the stack immediately after r0 + to ensure the interrupts get disabled as soon as possible, and so ensuring + the stack use is minimal should a context switch interrupt occur. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + + /* Now the remaining registers. The compiler expects R1 to be 0. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R15 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16; /* R16 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17; /* R17 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18; /* R18 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R19 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x20; /* R20 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x21; /* R21 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22; /* R22 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x23; /* R23 */ + pxTopOfStack--; + + /* Place the parameter on the stack in the expected location. */ + usAddress = ( uint16_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x26; /* R26 X */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x27; /* R27 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x28; /* R28 Y */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x29; /* R29 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x30; /* R30 Z */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x031; /* R31 */ + pxTopOfStack--; + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Simulate a function call end as generated by the compiler. We will now + jump to the start of the task the context of which we have just restored. */ + asm volatile ( "ret" ); + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the AVR port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. The first thing we do is save the registers so we + * can use a naked attribute. + */ +void vPortYield( void ) __attribute__ ( ( naked ) ); +void vPortYield( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + + asm volatile ( "ret" ); +} +/*-----------------------------------------------------------*/ + +/* + * Context switch function used by the tick. This must be identical to + * vPortYield() from the call to vTaskSwitchContext() onwards. The only + * difference from vPortYield() is the tick count is incremented as the + * call comes from the tick ISR. + */ +void vPortYieldFromTick( void ) __attribute__ ( ( naked ) ); +void vPortYieldFromTick( void ) +{ + portSAVE_CONTEXT(); + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + portRESTORE_CONTEXT(); + + asm volatile ( "ret" ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup timer 1 compare match A to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; +uint8_t ucHighByte, ucLowByte; + + /* Using 16bit timer 1 to generate the tick. Correct fuses must be + selected for the configCPU_CLOCK_HZ clock. */ + + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* We only have 16 bits so have to scale to get our required tick rate. */ + ulCompareMatch /= portCLOCK_PRESCALER; + + /* Adjust for correct value. */ + ulCompareMatch -= ( uint32_t ) 1; + + /* Setup compare match value for compare match A. Interrupts are disabled + before this is called so we need not worry here. */ + ucLowByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff ); + ulCompareMatch >>= 8; + ucHighByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff ); + OCR1AH = ucHighByte; + OCR1AL = ucLowByte; + + /* Setup clock source and compare match behaviour. */ + ucLowByte = portCLEAR_COUNTER_ON_MATCH | portPRESCALE_64; + TCCR1B = ucLowByte; + + /* Enable the interrupt - this is okay as interrupt are currently globally + disabled. */ + ucLowByte = TIMSK; + ucLowByte |= portCOMPARE_MATCH_A_INTERRUPT_ENABLE; + TIMSK = ucLowByte; +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + void TIMER1_COMPA_vect( void ) __attribute__ ( ( signal, naked ) ); + void TIMER1_COMPA_vect( void ) + { + vPortYieldFromTick(); + asm volatile ( "reti" ); + } +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + void TIMER1_COMPA_vect( void ) __attribute__ ( ( signal ) ); + void TIMER1_COMPA_vect( void ) + { + xTaskIncrementTick(); + } +#endif + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/portmacro.h new file mode 100644 index 0000000..15b41c2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/portmacro.h @@ -0,0 +1,110 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V1.2.3 + + + portCPU_CLOSK_HZ definition changed to 8MHz base 10, previously it + base 16. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +#define portPOINTER_SIZE_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portENTER_CRITICAL() asm volatile ( "in __tmp_reg__, __SREG__" :: ); \ + asm volatile ( "cli" :: ); \ + asm volatile ( "push __tmp_reg__" :: ) + +#define portEXIT_CRITICAL() asm volatile ( "pop __tmp_reg__" :: ); \ + asm volatile ( "out __SREG__, __tmp_reg__" :: ) + +#define portDISABLE_INTERRUPTS() asm volatile ( "cli" :: ); +#define portENABLE_INTERRUPTS() asm volatile ( "sei" :: ); +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 1 +#define portNOP() asm volatile ( "nop" ); +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +extern void vPortYield( void ) __attribute__ ( ( naked ) ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/exception.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/exception.S new file mode 100644 index 0000000..0e63133 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/exception.S @@ -0,0 +1,327 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Exception and interrupt vectors. + * + * This file maps all events supported by an AVR32UC. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32UC devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation (Now Microchip): + * https://www.microchip.com \n + * Support and FAQ: https://www.microchip.com/support/ + * + ******************************************************************************/ + +/* + * Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * 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. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``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 EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + */ + + +#include +#include "intc.h" + + +//! @{ +//! \verbatim + + + .section .exception, "ax", @progbits + + +// Start of Exception Vector Table. + + // EVBA must be aligned with a power of two strictly greater than the EVBA- + // relative offset of the last vector. + .balign 0x200 + + // Export symbol. + .global _evba + .type _evba, @function +_evba: + + .org 0x000 + // Unrecoverable Exception. +_handle_Unrecoverable_Exception: + rjmp $ + + .org 0x004 + // TLB Multiple Hit: UNUSED IN AVR32UC. +_handle_TLB_Multiple_Hit: + rjmp $ + + .org 0x008 + // Bus Error Data Fetch. +_handle_Bus_Error_Data_Fetch: + rjmp $ + + .org 0x00C + // Bus Error Instruction Fetch. +_handle_Bus_Error_Instruction_Fetch: + rjmp $ + + .org 0x010 + // NMI. +_handle_NMI: + rjmp $ + + .org 0x014 + // Instruction Address. +_handle_Instruction_Address: + rjmp $ + + .org 0x018 + // ITLB Protection. +_handle_ITLB_Protection: + rjmp $ + + .org 0x01C + // Breakpoint. +_handle_Breakpoint: + rjmp $ + + .org 0x020 + // Illegal Opcode. +_handle_Illegal_Opcode: + rjmp $ + + .org 0x024 + // Unimplemented Instruction. +_handle_Unimplemented_Instruction: + rjmp $ + + .org 0x028 + // Privilege Violation. +_handle_Privilege_Violation: + rjmp $ + + .org 0x02C + // Floating-Point: UNUSED IN AVR32UC. +_handle_Floating_Point: + rjmp $ + + .org 0x030 + // Coprocessor Absent: UNUSED IN AVR32UC. +_handle_Coprocessor_Absent: + rjmp $ + + .org 0x034 + // Data Address (Read). +_handle_Data_Address_Read: + rjmp $ + + .org 0x038 + // Data Address (Write). +_handle_Data_Address_Write: + rjmp $ + + .org 0x03C + // DTLB Protection (Read). +_handle_DTLB_Protection_Read: + rjmp $ + + .org 0x040 + // DTLB Protection (Write). +_handle_DTLB_Protection_Write: + rjmp $ + + .org 0x044 + // DTLB Modified: UNUSED IN AVR32UC. +_handle_DTLB_Modified: + rjmp $ + + .org 0x050 + // ITLB Miss: UNUSED IN AVR32UC. +_handle_ITLB_Miss: + rjmp $ + + .org 0x060 + // DTLB Miss (Read): UNUSED IN AVR32UC. +_handle_DTLB_Miss_Read: + rjmp $ + + .org 0x070 + // DTLB Miss (Write): UNUSED IN AVR32UC. +_handle_DTLB_Miss_Write: + rjmp $ + + .org 0x100 + // Supervisor Call. +_handle_Supervisor_Call: + lda.w pc, SCALLYield + + +// Interrupt support. +// The interrupt controller must provide the offset address relative to EVBA. +// Important note: +// All interrupts call a C function named _get_interrupt_handler. +// This function will read group and interrupt line number to then return in +// R12 a pointer to a user-provided interrupt handler. + + .balign 4 + +_int0: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 0b110 + brlo _int0_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int0_normal: +#endif + mov r12, 0 // Pass the int_lev parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int1: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 0b110 + brlo _int1_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int1_normal: +#endif + mov r12, 1 // Pass the int_lev parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int2: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 0b110 + brlo _int2_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int2_normal: +#endif + mov r12, 2 // Pass the int_lev parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int3: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 0b110 + brlo _int3_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int3_normal: +#endif + mov r12, 3 // Pass the int_lev parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + + +// Constant data area. + + .balign 4 + + // Values to store in the interrupt priority registers for the various interrupt priority levels. + // The interrupt priority registers contain the interrupt priority level and + // the EVBA-relative interrupt vector offset. + .global ipr_val + .type ipr_val, @object +ipr_val: + .word (INT0 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int0 - _evba),\ + (INT1 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int1 - _evba),\ + (INT2 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int2 - _evba),\ + (INT3 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int3 - _evba) + + +//! \endverbatim +//! @} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/port.c new file mode 100644 index 0000000..486546e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/port.c @@ -0,0 +1,464 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FreeRTOS port source for AVR32 UC3. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation (Now Microchip): + * https://www.microchip.com \n + * Support and FAQ: https://www.microchip.com/support/ + * + *****************************************************************************/ + +/* + * Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * 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. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``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 EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + */ + +/* Standard includes. */ +#include +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* AVR32 UC3 includes. */ +#include +#include "gpio.h" +#if( configTICK_USE_TC==1 ) + #include "tc.h" +#endif + + +/* Constants required to setup the task context. */ +#define portINITIAL_SR ( ( StackType_t ) 0x00400000 ) /* AVR32 : [M2:M0]=001 I1M=0 I0M=0, GM=0 */ +#define portINSTRUCTION_SIZE ( ( StackType_t ) 0 ) + +/* Each task maintains its own critical nesting variable. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +#if( configTICK_USE_TC==0 ) + static void prvScheduleNextTick( void ); +#else + static void prvClearTcInt( void ); +#endif + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ + +/* + * Low-level initialization routine called during startup, before the main + * function. + * This version comes in replacement to the default one provided by Newlib. + * Newlib's _init_startup only calls init_exceptions, but Newlib's exception + * vectors are not compatible with the SCALL management in the current FreeRTOS + * port. More low-level initializations are besides added here. + */ +void _init_startup(void) +{ + /* Import the Exception Vector Base Address. */ + extern void _evba; + + #if configHEAP_INIT + extern void __heap_start__; + extern void __heap_end__; + BaseType_t *pxMem; + #endif + + /* Load the Exception Vector Base Address in the corresponding system register. */ + Set_system_register( AVR32_EVBA, ( int ) &_evba ); + + /* Enable exceptions. */ + ENABLE_ALL_EXCEPTIONS(); + + /* Initialize interrupt handling. */ + INTC_init_interrupts(); + + #if configHEAP_INIT + + /* Initialize the heap used by malloc. */ + for( pxMem = &__heap_start__; pxMem < ( BaseType_t * )&__heap_end__; ) + { + *pxMem++ = 0xA5A5A5A5; + } + + #endif + + /* Give the used CPU clock frequency to Newlib, so it can work properly. */ + set_cpu_hz( configCPU_CLOCK_HZ ); + + /* Code section present if and only if the debug trace is activated. */ + #if configDBG + { + static const gpio_map_t DBG_USART_GPIO_MAP = + { + { configDBG_USART_RX_PIN, configDBG_USART_RX_FUNCTION }, + { configDBG_USART_TX_PIN, configDBG_USART_TX_FUNCTION } + }; + + /* Initialize the USART used for the debug trace with the configured parameters. */ + set_usart_base( ( void * ) configDBG_USART ); + gpio_enable_module( DBG_USART_GPIO_MAP, + sizeof( DBG_USART_GPIO_MAP ) / sizeof( DBG_USART_GPIO_MAP[0] ) ); + usart_init( configDBG_USART_BAUDRATE ); + } + #endif +} +/*-----------------------------------------------------------*/ + +/* + * malloc, realloc and free are meant to be called through respectively + * pvPortMalloc, pvPortRealloc and vPortFree. + * The latter functions call the former ones from within sections where tasks + * are suspended, so the latter functions are task-safe. __malloc_lock and + * __malloc_unlock use the same mechanism to also keep the former functions + * task-safe as they may be called directly from Newlib's functions. + * However, all these functions are interrupt-unsafe and SHALL THEREFORE NOT BE + * CALLED FROM WITHIN AN INTERRUPT, because __malloc_lock and __malloc_unlock do + * not call portENTER_CRITICAL and portEXIT_CRITICAL in order not to disable + * interrupts during memory allocation management as this may be a very time- + * consuming process. + */ + +/* + * Lock routine called by Newlib on malloc / realloc / free entry to guarantee a + * safe section as memory allocation management uses global data. + * See the aforementioned details. + */ +void __malloc_lock(struct _reent *ptr) +{ + vTaskSuspendAll(); +} + +/* + * Unlock routine called by Newlib on malloc / realloc / free exit to guarantee + * a safe section as memory allocation management uses global data. + * See the aforementioned details. + */ +void __malloc_unlock(struct _reent *ptr) +{ + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +/* Added as there is no such function in FreeRTOS. */ +void *pvPortRealloc( void *pv, size_t xWantedSize ) +{ +void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = realloc( pv, xWantedSize ); + } + xTaskResumeAll(); + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +/* The cooperative scheduler requires a normal IRQ service routine to +simply increment the system tick. */ +/* The preemptive scheduler is defined as "naked" as the full context is saved +on entry as part of the context switch. */ +__attribute__((__naked__)) static void vTick( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT_OS_INT(); + + #if( configTICK_USE_TC==1 ) + /* Clear the interrupt flag. */ + prvClearTcInt(); + #else + /* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ) + clock cycles from now. */ + prvScheduleNextTick(); + #endif + + /* Because FreeRTOS is not supposed to run with nested interrupts, put all OS + calls in a critical section . */ + portENTER_CRITICAL(); + xTaskIncrementTick(); + portEXIT_CRITICAL(); + + /* Restore the context of the "elected task". */ + portRESTORE_CONTEXT_OS_INT(); +} +/*-----------------------------------------------------------*/ + +__attribute__((__naked__)) void SCALLYield( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT_SCALL(); + vTaskSwitchContext(); + portRESTORE_CONTEXT_SCALL(); +} +/*-----------------------------------------------------------*/ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +__attribute__((__noinline__)) void vPortEnterCritical( void ) +{ + /* Disable interrupts */ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +__attribute__((__noinline__)) void vPortExitCritical( void ) +{ + if(ulCriticalNesting > portNO_CRITICAL_NESTING) + { + ulCriticalNesting--; + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable all interrupt/exception. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* When the task starts, it will expect to find the function parameter in R12. */ + pxTopOfStack--; + *pxTopOfStack-- = ( StackType_t ) 0x08080808; /* R8 */ + *pxTopOfStack-- = ( StackType_t ) 0x09090909; /* R9 */ + *pxTopOfStack-- = ( StackType_t ) 0x0A0A0A0A; /* R10 */ + *pxTopOfStack-- = ( StackType_t ) 0x0B0B0B0B; /* R11 */ + *pxTopOfStack-- = ( StackType_t ) pvParameters; /* R12 */ + *pxTopOfStack-- = ( StackType_t ) 0xDEADBEEF; /* R14/LR */ + *pxTopOfStack-- = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; /* R15/PC */ + *pxTopOfStack-- = ( StackType_t ) portINITIAL_SR; /* SR */ + *pxTopOfStack-- = ( StackType_t ) 0xFF0000FF; /* R0 */ + *pxTopOfStack-- = ( StackType_t ) 0x01010101; /* R1 */ + *pxTopOfStack-- = ( StackType_t ) 0x02020202; /* R2 */ + *pxTopOfStack-- = ( StackType_t ) 0x03030303; /* R3 */ + *pxTopOfStack-- = ( StackType_t ) 0x04040404; /* R4 */ + *pxTopOfStack-- = ( StackType_t ) 0x05050505; /* R5 */ + *pxTopOfStack-- = ( StackType_t ) 0x06060606; /* R6 */ + *pxTopOfStack-- = ( StackType_t ) 0x07070707; /* R7 */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_NESTING; /* ulCriticalNesting */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + portRESTORE_CONTEXT(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the AVR32 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ) +clock cycles from now. */ +#if( configTICK_USE_TC==0 ) + static void prvScheduleFirstTick(void) + { + uint32_t lCycles; + + lCycles = Get_system_register(AVR32_COUNT); + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception + // generation feature does not get disabled. + if(0 == lCycles) + { + lCycles++; + } + Set_system_register(AVR32_COMPARE, lCycles); + } + + __attribute__((__noinline__)) static void prvScheduleNextTick(void) + { + uint32_t lCycles, lCount; + + lCycles = Get_system_register(AVR32_COMPARE); + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception + // generation feature does not get disabled. + if(0 == lCycles) + { + lCycles++; + } + lCount = Get_system_register(AVR32_COUNT); + if( lCycles < lCount ) + { // We missed a tick, recover for the next. + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + } + Set_system_register(AVR32_COMPARE, lCycles); + } +#else + __attribute__((__noinline__)) static void prvClearTcInt(void) + { + AVR32_TC.channel[configTICK_TC_CHANNEL].sr; + } +#endif +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt(void) +{ +#if( configTICK_USE_TC==1 ) + + volatile avr32_tc_t *tc = &AVR32_TC; + + // Options for waveform genration. + tc_waveform_opt_t waveform_opt = + { + .channel = configTICK_TC_CHANNEL, /* Channel selection. */ + + .bswtrg = TC_EVT_EFFECT_NOOP, /* Software trigger effect on TIOB. */ + .beevt = TC_EVT_EFFECT_NOOP, /* External event effect on TIOB. */ + .bcpc = TC_EVT_EFFECT_NOOP, /* RC compare effect on TIOB. */ + .bcpb = TC_EVT_EFFECT_NOOP, /* RB compare effect on TIOB. */ + + .aswtrg = TC_EVT_EFFECT_NOOP, /* Software trigger effect on TIOA. */ + .aeevt = TC_EVT_EFFECT_NOOP, /* External event effect on TIOA. */ + .acpc = TC_EVT_EFFECT_NOOP, /* RC compare effect on TIOA: toggle. */ + .acpa = TC_EVT_EFFECT_NOOP, /* RA compare effect on TIOA: toggle (other possibilities are none, set and clear). */ + + .wavsel = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,/* Waveform selection: Up mode without automatic trigger on RC compare. */ + .enetrg = FALSE, /* External event trigger enable. */ + .eevt = 0, /* External event selection. */ + .eevtedg = TC_SEL_NO_EDGE, /* External event edge selection. */ + .cpcdis = FALSE, /* Counter disable when RC compare. */ + .cpcstop = FALSE, /* Counter clock stopped with RC compare. */ + + .burst = FALSE, /* Burst signal selection. */ + .clki = FALSE, /* Clock inversion. */ + .tcclks = TC_CLOCK_SOURCE_TC2 /* Internal source clock 2. */ + }; + + tc_interrupt_t tc_interrupt = + { + .etrgs=0, + .ldrbs=0, + .ldras=0, + .cpcs =1, + .cpbs =0, + .cpas =0, + .lovrs=0, + .covfs=0, + }; + +#endif + + /* Disable all interrupt/exception. */ + portDISABLE_INTERRUPTS(); + + /* Register the compare interrupt handler to the interrupt controller and + enable the compare interrupt. */ + + #if( configTICK_USE_TC==1 ) + { + INTC_register_interrupt(&vTick, configTICK_TC_IRQ, INT0); + + /* Initialize the timer/counter. */ + tc_init_waveform(tc, &waveform_opt); + + /* Set the compare triggers. + Remember TC counter is 16-bits, so counting second is not possible! + That's why we configure it to count ms. */ + tc_write_rc( tc, configTICK_TC_CHANNEL, ( configPBA_CLOCK_HZ / 4) / configTICK_RATE_HZ ); + + tc_configure_interrupts( tc, configTICK_TC_CHANNEL, &tc_interrupt ); + + /* Start the timer/counter. */ + tc_start(tc, configTICK_TC_CHANNEL); + } + #else + { + INTC_register_interrupt(&vTick, AVR32_CORE_COMPARE_IRQ, INT0); + prvScheduleFirstTick(); + } + #endif +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/portmacro.h new file mode 100644 index 0000000..679594a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/portmacro.h @@ -0,0 +1,696 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FreeRTOS port source for AVR32 UC3. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation (Now Microchip): + * https://www.microchip.com \n + * Support and FAQ: https://www.microchip.com/support/ + * + *****************************************************************************/ + +/* + * Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * 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. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``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 EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ +#include +#include "intc.h" +#include "compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#define TASK_DELAY_MS(x) ( (x) /portTICK_PERIOD_MS ) +#define TASK_DELAY_S(x) ( (x)*1000 /portTICK_PERIOD_MS ) +#define TASK_DELAY_MIN(x) ( (x)*60*1000/portTICK_PERIOD_MS ) + +#define configTICK_TC_IRQ ATPASTE2(AVR32_TC_IRQ, configTICK_TC_CHANNEL) + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() {__asm__ __volatile__ ("nop");} +/*-----------------------------------------------------------*/ + + +/*-----------------------------------------------------------*/ + +/* INTC-specific. */ +#define DISABLE_ALL_EXCEPTIONS() Disable_global_exception() +#define ENABLE_ALL_EXCEPTIONS() Enable_global_exception() + +#define DISABLE_ALL_INTERRUPTS() Disable_global_interrupt() +#define ENABLE_ALL_INTERRUPTS() Enable_global_interrupt() + +#define DISABLE_INT_LEVEL(int_lev) Disable_interrupt_level(int_lev) +#define ENABLE_INT_LEVEL(int_lev) Enable_interrupt_level(int_lev) + + +/* + * Debug trace. + * Activated if and only if configDBG is nonzero. + * Prints a formatted string to stdout. + * The current source file name and line number are output with a colon before + * the formatted string. + * A carriage return and a linefeed are appended to the output. + * stdout is redirected to the USART configured by configDBG_USART. + * The parameters are the same as for the standard printf function. + * There is no return value. + * SHALL NOT BE CALLED FROM WITHIN AN INTERRUPT as fputs and printf use malloc, + * which is interrupt-unsafe with the current __malloc_lock and __malloc_unlock. + */ +#if configDBG +#define portDBG_TRACE(...) \ +{\ + fputs(__FILE__ ":" ASTRINGZ(__LINE__) ": ", stdout);\ + printf(__VA_ARGS__);\ + fputs("\r\n", stdout);\ +} +#else +#define portDBG_TRACE(...) +#endif + + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() DISABLE_ALL_INTERRUPTS() +#define portENABLE_INTERRUPTS() ENABLE_ALL_INTERRUPTS() + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); + + +/* Added as there is no such function in FreeRTOS. */ +extern void *pvPortRealloc( void *pv, size_t xSize ); +/*-----------------------------------------------------------*/ + + +/*=============================================================================================*/ + +/* + * Restore Context for cases other than INTi. + */ +#define portRESTORE_CONTEXT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + __asm__ __volatile__ ( \ + /* Set SP to point to new stack */ \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + /* R0-R7 should not be used below this line */ \ + /* Skip PC and SR (will do it at the end) */ \ + "sub sp, -2*4 \n\t"\ + /* Restore R8..R12 and LR */ \ + "ldm sp++, r8-r12, lr \n\t"\ + /* Restore SR */ \ + "ld.w r0, sp[-8*4]\n\t" /* R0 is modified, is restored later. */ \ + "mtsr %[SR], r0 \n\t"\ + /* Restore r0 */ \ + "ld.w r0, sp[-9*4] \n\t"\ + /* Restore PC */ \ + "ld.w pc, sp[-7*4]" /* Get PC from stack - PC is the 7th register saved */ \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [SR] "i" (AVR32_SR) \ + ); \ +} + + +/* + * portSAVE_CONTEXT_INT() and portRESTORE_CONTEXT_INT(): for INT0..3 exceptions. + * portSAVE_CONTEXT_SCALL() and portRESTORE_CONTEXT_SCALL(): for the scall exception. + * + * Had to make different versions because registers saved on the system stack + * are not the same between INT0..3 exceptions and the scall exception. + */ + +// Task context stack layout: + // R8 (*) + // R9 (*) + // R10 (*) + // R11 (*) + // R12 (*) + // R14/LR (*) + // R15/PC (*) + // SR (*) + // R0 + // R1 + // R2 + // R3 + // R4 + // R5 + // R6 + // R7 + // ulCriticalNesting +// (*) automatically done for INT0..INT3, but not for SCALL + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ +#if configUSE_PREEMPTION == 0 + +/* + * portSAVE_CONTEXT_OS_INT() for OS Tick exception. + */ +#define portSAVE_CONTEXT_OS_INT() \ +{ \ + /* Save R0..R7 */ \ + __asm__ __volatile__ ("stm --sp, r0-r7"); \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context save. */ \ +} + +/* + * portRESTORE_CONTEXT_OS_INT() for Tick exception. + */ +#define portRESTORE_CONTEXT_OS_INT() \ +{ \ + __asm__ __volatile__ ( \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7\n\t" \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context restore. */ \ + "rete" \ + ); \ +} + +#else + +/* + * portSAVE_CONTEXT_OS_INT() for OS Tick exception. + */ +#define portSAVE_CONTEXT_OS_INT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* When we come here */ \ + /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */ \ + \ + __asm__ __volatile__ ( \ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LO(%[ulCriticalNesting])\n\t" \ + "orh r8, HI(%[ulCriticalNesting])\n\t" \ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0 \n\t"\ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */ \ + "ld.w r0, sp[9*4]\n\t" /* Read SR in stack */ \ + "bfextu r0, r0, 22, 3\n\t" /* Extract the mode bits to R0. */ \ + "cp.w r0, 1\n\t" /* Compare the mode bits with supervisor mode(b'001) */ \ + "brhi LABEL_INT_SKIP_SAVE_CONTEXT_%[LINE] \n\t"\ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + /* NOTE: we don't enter a critical section here because all interrupt handlers */ \ + /* MUST perform a SAVE_CONTEXT/RESTORE_CONTEXT in the same way as */ \ + /* portSAVE_CONTEXT_OS_INT/port_RESTORE_CONTEXT_OS_INT if they call OS functions. */ \ + /* => all interrupt handlers must use portENTER_SWITCHING_ISR/portEXIT_SWITCHING_ISR. */ \ + "mov r8, LO(%[pxCurrentTCB])\n\t" \ + "orh r8, HI(%[pxCurrentTCB])\n\t" \ + "ld.w r0, r8[0]\n\t" \ + "st.w r0[0], sp\n" \ + \ + "LABEL_INT_SKIP_SAVE_CONTEXT_%[LINE]:" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [LINE] "i" (__LINE__) \ + ); \ +} + +/* + * portRESTORE_CONTEXT_OS_INT() for Tick exception. + */ +#define portRESTORE_CONTEXT_OS_INT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + __asm__ __volatile__ ( \ + "ld.w r0, sp[9*4]\n\t" /* Read SR in stack */ \ + "bfextu r0, r0, 22, 3\n\t" /* Extract the mode bits to R0. */ \ + "cp.w r0, 1\n\t" /* Compare the mode bits with supervisor mode(b'001) */ \ + "brhi LABEL_INT_SKIP_RESTORE_CONTEXT_%[LINE]" \ + : \ + : [LINE] "i" (__LINE__) \ + ); \ + \ + /* Else */ \ + /* because it is here safe, always call vTaskSwitchContext() since an OS tick occurred. */ \ + /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\ + portENTER_CRITICAL(); \ + vTaskSwitchContext(); \ + portEXIT_CRITICAL(); \ + \ + /* Restore all registers */ \ + \ + __asm__ __volatile__ ( \ + /* Set SP to point to new stack */ \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n"\ + \ + "LABEL_INT_SKIP_RESTORE_CONTEXT_%[LINE]: \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t" \ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* Now, the stack should be R8..R12, LR, PC and SR */ \ + "rete" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [LINE] "i" (__LINE__) \ + ); \ +} + +#endif + + +/* + * portSAVE_CONTEXT_SCALL() for SupervisorCALL exception. + * + * NOTE: taskYIELD()(== SCALL) MUST NOT be called in a mode > supervisor mode. + * + */ +#define portSAVE_CONTEXT_SCALL() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Warning: the stack layout after SCALL doesn't match the one after an interrupt. */ \ + /* If SR[M2:M0] == 001 */ \ + /* PC and SR are on the stack. */ \ + /* Else (other modes) */ \ + /* Nothing on the stack. */ \ + \ + /* WARNING NOTE: the else case cannot happen as it is strictly forbidden to call */ \ + /* vTaskDelay() and vTaskDelayUntil() OS functions (that result in a taskYield()) */ \ + /* in an interrupt|exception handler. */ \ + \ + __asm__ __volatile__ ( \ + /* in order to save R0-R7 */ \ + "sub sp, 6*4 \n\t"\ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* in order to save R8-R12 and LR */ \ + /* do not use SP if interrupts occurs, SP must be left at bottom of stack */ \ + "sub r7, sp,-16*4 \n\t"\ + /* Copy PC and SR in other places in the stack. */ \ + "ld.w r0, r7[-2*4] \n\t" /* Read SR */\ + "st.w r7[-8*4], r0 \n\t" /* Copy SR */\ + "ld.w r0, r7[-1*4] \n\t" /* Read PC */\ + "st.w r7[-7*4], r0 \n\t" /* Copy PC */\ + \ + /* Save R8..R12 and LR on the stack. */ \ + "stm --r7, r8-r12, lr \n\t"\ + \ + /* Arriving here we have the following stack organizations: */ \ + /* R8..R12, LR, PC, SR, R0..R7. */ \ + \ + /* Now we can finalize the save. */ \ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting) \ + ); \ + \ + /* Disable the its which may cause a context switch (i.e. cause a change of */ \ + /* pxCurrentTCB). */ \ + /* Basically, all accesses to the pxCurrentTCB structure should be put in a */ \ + /* critical section because it is a global structure. */ \ + portENTER_CRITICAL(); \ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + __asm__ __volatile__ ( \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp" \ + : \ + : [pxCurrentTCB] "i" (&pxCurrentTCB) \ + ); \ +} + +/* + * portRESTORE_CONTEXT() for SupervisorCALL exception. + */ +#define portRESTORE_CONTEXT_SCALL() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Restore all registers */ \ + \ + /* Set SP to point to new stack */ \ + __asm__ __volatile__ ( \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0]" \ + : \ + : [pxCurrentTCB] "i" (&pxCurrentTCB) \ + ); \ + \ + /* Leave pxCurrentTCB variable access critical section */ \ + portEXIT_CRITICAL(); \ + \ + __asm__ __volatile__ ( \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* skip PC and SR */ \ + /* do not use SP if interrupts occurs, SP must be left at bottom of stack */ \ + "sub r7, sp, -10*4 \n\t"\ + /* Restore r8-r12 and LR */ \ + "ldm r7++, r8-r12, lr \n\t"\ + \ + /* RETS will take care of the extra PC and SR restore. */ \ + /* So, we have to prepare the stack for this. */ \ + "ld.w r0, r7[-8*4] \n\t" /* Read SR */\ + "st.w r7[-2*4], r0 \n\t" /* Copy SR */\ + "ld.w r0, r7[-7*4] \n\t" /* Read PC */\ + "st.w r7[-1*4], r0 \n\t" /* Copy PC */\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + "sub sp, -6*4 \n\t"\ + \ + "rets" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting) \ + ); \ +} + + +/* + * The ISR used depends on whether the cooperative or + * the preemptive scheduler is being used. + */ +#if configUSE_PREEMPTION == 0 + +/* + * ISR entry and exit macros. These are only required if a task switch + * is required from the ISR. + */ +#define portENTER_SWITCHING_ISR() \ +{ \ + /* Save R0..R7 */ \ + __asm__ __volatile__ ("stm --sp, r0-r7"); \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context save. */ \ +} + +/* + * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1 + */ +#define portEXIT_SWITCHING_ISR() \ +{ \ + __asm__ __volatile__ ( \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context restore. */ \ + "rete" \ + ); \ +} + +#else + +/* + * ISR entry and exit macros. These are only required if a task switch + * is required from the ISR. + */ +#define portENTER_SWITCHING_ISR() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* When we come here */ \ + /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */ \ + \ + __asm__ __volatile__ ( \ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0 \n\t"\ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_ISR_SKIP_SAVE_CONTEXT_%[LINE] \n\t"\ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp \n"\ + \ + "LABEL_ISR_SKIP_SAVE_CONTEXT_%[LINE]:" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [LINE] "i" (__LINE__) \ + ); \ +} + +/* + * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1 + */ +#define portEXIT_SWITCHING_ISR() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + __asm__ __volatile__ ( \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case it's of no use to switch context and restore a new SP because we purposedly */ \ + /* did not previously save SP in its TCB. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_ISR_SKIP_RESTORE_CONTEXT_%[LINE] \n\t"\ + \ + /* If a switch is required then we just need to call */ \ + /* vTaskSwitchContext() as the context has already been */ \ + /* saved. */ \ + "cp.w r12, 1 \n\t" /* Check if Switch context is required. */\ + "brne LABEL_ISR_RESTORE_CONTEXT_%[LINE]" \ + : \ + : [LINE] "i" (__LINE__) \ + ); \ + \ + /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */ \ + portENTER_CRITICAL(); \ + vTaskSwitchContext(); \ + portEXIT_CRITICAL(); \ + \ + __asm__ __volatile__ ( \ + "LABEL_ISR_RESTORE_CONTEXT_%[LINE]: \n\t"\ + /* Restore the context of which ever task is now the highest */ \ + /* priority that is ready to run. */ \ + \ + /* Restore all registers */ \ + \ + /* Set SP to point to new stack */ \ + "mov r8, LO(%[pxCurrentTCB]) \n\t"\ + "orh r8, HI(%[pxCurrentTCB]) \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n"\ + \ + "LABEL_ISR_SKIP_RESTORE_CONTEXT_%[LINE]: \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LO(%[ulCriticalNesting]) \n\t"\ + "orh r8, HI(%[ulCriticalNesting]) \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* Now, the stack should be R8..R12, LR, PC and SR */ \ + "rete" \ + : \ + : [ulCriticalNesting] "i" (&ulCriticalNesting), \ + [pxCurrentTCB] "i" (&pxCurrentTCB), \ + [LINE] "i" (__LINE__) \ + ); \ +} + +#endif + + +#define portYIELD() {__asm__ __volatile__ ("scall");} + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_AVRDx/README.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_AVRDx/README.md new file mode 100644 index 0000000..af5856a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_AVRDx/README.md @@ -0,0 +1 @@ +This port has been moved to `portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx` directory. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_Mega0/README.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_Mega0/README.md new file mode 100644 index 0000000..c83311f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_Mega0/README.md @@ -0,0 +1 @@ +This port has been moved to `portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0` directory. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/port.c new file mode 100644 index 0000000..f47da4c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/port.c @@ -0,0 +1,146 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Machine includes */ +#include +#include +/*-----------------------------------------------------------*/ + +/* The initial PSR has the Previous Interrupt Enabled (PIEN) flag set. */ +#define portINITIAL_PSR ( 0x00020000 ) + +/*-----------------------------------------------------------*/ + +/* + * Perform any hardware configuration necessary to generate the tick interrupt. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Make space on the stack for the context - this leaves a couple of spaces + empty. */ + pxTopOfStack -= 20; + + /* Fill the registers with known values to assist debugging. */ + pxTopOfStack[ 16 ] = 0; + pxTopOfStack[ 15 ] = portINITIAL_PSR; + pxTopOfStack[ 14 ] = ( uint32_t ) pxCode; + pxTopOfStack[ 13 ] = 0x00000000UL; /* R15. */ + pxTopOfStack[ 12 ] = 0x00000000UL; /* R14. */ + pxTopOfStack[ 11 ] = 0x0d0d0d0dUL; + pxTopOfStack[ 10 ] = 0x0c0c0c0cUL; + pxTopOfStack[ 9 ] = 0x0b0b0b0bUL; + pxTopOfStack[ 8 ] = 0x0a0a0a0aUL; + pxTopOfStack[ 7 ] = 0x09090909UL; + pxTopOfStack[ 6 ] = 0x08080808UL; + pxTopOfStack[ 5 ] = 0x07070707UL; + pxTopOfStack[ 4 ] = 0x06060606UL; + pxTopOfStack[ 3 ] = 0x05050505UL; + pxTopOfStack[ 2 ] = 0x04040404UL; + pxTopOfStack[ 1 ] = 0x03030303UL; + pxTopOfStack[ 0 ] = ( uint32_t ) pvParameters; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Set-up the timer interrupt. */ + prvSetupTimerInterrupt(); + + /* Integrated Interrupt Controller: Enable all interrupts. */ + ic->ien = 1; + + /* Restore callee saved registers. */ + portRESTORE_CONTEXT(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Enable timer interrupts */ + counter1->reload = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1; + counter1->value = counter1->reload; + counter1->mask = 1; + + /* Set the IRQ Handler priority and enable it. */ + irq[ IRQ_COUNTER1 ].ien = 1; +} +/*-----------------------------------------------------------*/ + +/* Trap 31 handler. */ +void interrupt31_handler( void ) __attribute__((naked)); +void interrupt31_handler( void ) +{ + portSAVE_CONTEXT(); + __asm volatile ( "call vTaskSwitchContext" ); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +static void prvProcessTick( void ) __attribute__((noinline)); +static void prvProcessTick( void ) +{ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the Tick Interrupt. */ + counter1->expired = 0; +} +/*-----------------------------------------------------------*/ + +/* Timer 1 interrupt handler, used for tick interrupt. */ +void interrupt7_handler( void ) __attribute__((naked)); +void interrupt7_handler( void ) +{ + portSAVE_CONTEXT(); + prvProcessTick(); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Nothing to do. Unlikely to want to end. */ +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/portmacro.h new file mode 100644 index 0000000..038fae7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/portmacro.h @@ -0,0 +1,153 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() __asm__ volatile ( "mov r0, r0" ) +#define portCRITICAL_NESTING_IN_TCB 1 +#define portIRQ_TRAP_YIELD 31 +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +extern void vPortYield( void ); + +/*---------------------------------------------------------------------------*/ + +#define portYIELD() asm __volatile__( " trap #%0 "::"i"(portIRQ_TRAP_YIELD):"memory") +/*---------------------------------------------------------------------------*/ + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() +/*---------------------------------------------------------------------------*/ + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() cpu_int_disable() +#define portENABLE_INTERRUPTS() cpu_int_enable() + +/*---------------------------------------------------------------------------*/ + +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken != pdFALSE ) vTaskSwitchContext(); } while( 0 ) + +/*---------------------------------------------------------------------------*/ + +#define portSAVE_CONTEXT() \ + asm __volatile__ \ + ( \ + "sub r1, #68 \n" /* Make space on the stack for the context. */ \ + "std r2, [r1] + 0 \n" \ + "stq r4, [r1] + 8 \n" \ + "stq r8, [r1] + 24 \n" \ + "stq r12, [r1] + 40 \n" \ + "mov r6, rtt \n" \ + "mov r7, psr \n" \ + "std r6, [r1] + 56 \n" \ + "movhi r2, #16384 \n" /* Set the pointer to the IC. */ \ + "ldub r3, [r2] + 2 \n" /* Load the current interrupt mask. */ \ + "st r3, [r1]+ 64 \n" /* Store the interrupt mask on the stack. */ \ + "ld r2, [r0]+short(pxCurrentTCB) \n" /* Load the pointer to the TCB. */ \ + "st r1, [r2] \n" /* Save the stack pointer into the TCB. */ \ + "mov r14, r1 \n" /* Compiler expects r14 to be set to the function stack. */ \ + ); +/*---------------------------------------------------------------------------*/ + +#define portRESTORE_CONTEXT() \ + asm __volatile__( \ + "ld r2, [r0]+short(pxCurrentTCB) \n" /* Load the TCB to find the stack pointer and context. */ \ + "ld r1, [r2] \n" \ + "movhi r2, #16384 \n" /* Set the pointer to the IC. */ \ + "ld r3, [r1] + 64 \n" /* Load the previous interrupt mask. */ \ + "stb r3, [r2] + 2 \n" /* Set the current interrupt mask to be the previous. */ \ + "ldd r6, [r1] + 56 \n" /* Restore context. */ \ + "mov rtt, r6 \n" \ + "mov psr, r7 \n" \ + "ldd r2, [r1] + 0 \n" \ + "ldq r4, [r1] + 8 \n" \ + "ldq r8, [r1] + 24 \n" \ + "ldq r12, [r1] + 40 \n" \ + "add r1, #68 \n" \ + "rti \n" \ + ); + +/*---------------------------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*---------------------------------------------------------------------------*/ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/port.c new file mode 100644 index 0000000..028ad6b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/port.c @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#define portINITIAL_FORMAT_VECTOR ( ( StackType_t ) 0x4000 ) + +/* Supervisor mode set. */ +#define portINITIAL_STATUS_REGISTER ( ( StackType_t ) 0x2000) + +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This +will be set to 0 prior to the first task being started. */ +static uint32_t ulCriticalNesting = 0x9999UL; + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + /* Exception stack frame starts with the return address. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = ( portINITIAL_FORMAT_VECTOR << 16UL ) | ( portINITIAL_STATUS_REGISTER ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x0; /*FP*/ + pxTopOfStack -= 14; /* A5 to D0. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + ulCriticalNesting = 0UL; + + /* Configure the interrupts used by this port. */ + vApplicationSetupInterrupts(); + + /* Start the first task executing. */ + vPortStartFirstTask(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0UL ) + { + /* Guard against context switches being pended simultaneously with a + critical section being entered. */ + do + { + portDISABLE_INTERRUPTS(); + if( MCF_INTC0_INTFRCL == 0UL ) + { + break; + } + + portENABLE_INTERRUPTS(); + + } while( 1 ); + } + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void vPortYieldHandler( void ) +{ +uint32_t ulSavedInterruptMask; + + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + /* Note this will clear all forced interrupts - this is done for speed. */ + MCF_INTC0_INTFRCL = 0; + vTaskSwitchContext(); + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portasm.S new file mode 100644 index 0000000..d4e20e5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portasm.S @@ -0,0 +1,121 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Purpose: Lowest level routines for all ColdFire processors. + * + * Notes: + * + * ulPortSetIPL() and mcf5xxx_wr_cacr() copied with permission from FreeScale + * supplied source files. + */ + + .global ulPortSetIPL + .global mcf5xxx_wr_cacr + .global __cs3_isr_interrupt_80 + .global vPortStartFirstTask + + .text + +.macro portSAVE_CONTEXT + + lea.l (-60, %sp), %sp + movem.l %d0-%fp, (%sp) + move.l pxCurrentTCB, %a0 + move.l %sp, (%a0) + + .endm + +.macro portRESTORE_CONTEXT + + move.l pxCurrentTCB, %a0 + move.l (%a0), %sp + movem.l (%sp), %d0-%fp + lea.l %sp@(60), %sp + rte + + .endm + +/********************************************************************/ +/* + * This routines changes the IPL to the value passed into the routine. + * It also returns the old IPL value back. + * Calling convention from C: + * old_ipl = asm_set_ipl(new_ipl); + * For the Diab Data C compiler, it passes return value thru D0. + * Note that only the least significant three bits of the passed + * value are used. + */ + +ulPortSetIPL: + link A6,#-8 + movem.l D6-D7,(SP) + + move.w SR,D7 /* current sr */ + + move.l D7,D0 /* prepare return value */ + andi.l #0x0700,D0 /* mask out IPL */ + lsr.l #8,D0 /* IPL */ + + move.l 8(A6),D6 /* get argument */ + andi.l #0x07,D6 /* least significant three bits */ + lsl.l #8,D6 /* move over to make mask */ + + andi.l #0x0000F8FF,D7 /* zero out current IPL */ + or.l D6,D7 /* place new IPL in sr */ + move.w D7,SR + + movem.l (SP),D6-D7 + lea 8(SP),SP + unlk A6 + rts +/********************************************************************/ + +mcf5xxx_wr_cacr: + move.l 4(sp),d0 + .long 0x4e7b0002 /* movec d0,cacr */ + nop + rts + +/********************************************************************/ + +/* Yield interrupt. */ +__cs3_isr_interrupt_80: + portSAVE_CONTEXT + jsr vPortYieldHandler + portRESTORE_CONTEXT + +/********************************************************************/ + + +vPortStartFirstTask: + portRESTORE_CONTEXT + + .end + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portmacro.h new file mode 100644 index 0000000..c8156a9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portmacro.h @@ -0,0 +1,112 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ +uint32_t ulPortSetIPL( uint32_t ); +#define portDISABLE_INTERRUPTS() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portENABLE_INTERRUPTS() ulPortSetIPL( 0 ) + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR( void ); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetIPL( configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) ulPortSetIPL( uxSavedStatusRegister ) + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portNOP() asm volatile ( "nop" ) + +/* Note this will overwrite all other bits in the force register, it is done this way for speed. */ +#define portYIELD() MCF_INTC0_INTFRCL = ( 1UL << configYIELD_INTERRUPT_VECTOR ); portNOP(); portNOP() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) { portYIELD(); } } while( 0 ) + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/port.c new file mode 100644 index 0000000..0130f33 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/port.c @@ -0,0 +1,304 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the H8S port. + *----------------------------------------------------------*/ + + +/*-----------------------------------------------------------*/ + +/* When the task starts interrupts should be enabled. */ +#define portINITIAL_CCR ( ( StackType_t ) 0x00 ) + +/* Hardware specific constants used to generate the RTOS tick from the TPU. */ +#define portCLEAR_ON_TGRA_COMPARE_MATCH ( ( uint8_t ) 0x20 ) +#define portCLOCK_DIV_64 ( ( uint8_t ) 0x03 ) +#define portCLOCK_DIV ( ( uint32_t ) 64 ) +#define portTGRA_INTERRUPT_ENABLE ( ( uint8_t ) 0x01 ) +#define portTIMER_CHANNEL ( ( uint8_t ) 0x02 ) +#define portMSTP13 ( ( uint16_t ) 0x2000 ) + +/* + * Setup TPU channel one for the RTOS tick at the requested frequency. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The ISR used by portYIELD(). This is installed as a trap handler. + */ +void vPortYield( void ) __attribute__ ( ( saveall, interrupt_handler ) ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t ulValue; + + /* This requires an even address. */ + ulValue = ( uint32_t ) pxTopOfStack; + if( ulValue & 1UL ) + { + pxTopOfStack = pxTopOfStack - 1; + } + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + pxTopOfStack--; + *pxTopOfStack = 0xaa; + pxTopOfStack--; + *pxTopOfStack = 0xbb; + pxTopOfStack--; + *pxTopOfStack = 0xcc; + pxTopOfStack--; + *pxTopOfStack = 0xdd; + + /* The initial stack mimics an interrupt stack. First there is the program + counter (24 bits). */ + ulValue = ( uint32_t ) pxCode; + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + + /* Followed by the CCR. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_CCR; + + /* Next all the general purpose registers - with the parameters being passed + in ER0. The parameter order must match that used by the compiler when the + "saveall" function attribute is used. */ + + /* ER6 */ + pxTopOfStack--; + *pxTopOfStack = 0x66; + pxTopOfStack--; + *pxTopOfStack = 0x66; + pxTopOfStack--; + *pxTopOfStack = 0x66; + pxTopOfStack--; + *pxTopOfStack = 0x66; + + /* ER0 */ + ulValue = ( uint32_t ) pvParameters; + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + pxTopOfStack--; + ulValue >>= 8UL; + *pxTopOfStack = ( StackType_t ) ( ulValue & 0xff ); + + /* ER1 */ + pxTopOfStack--; + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x11; + + /* ER2 */ + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x22; + + /* ER3 */ + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + *pxTopOfStack = 0x33; + + /* ER4 */ + pxTopOfStack--; + *pxTopOfStack = 0x44; + pxTopOfStack--; + *pxTopOfStack = 0x44; + pxTopOfStack--; + *pxTopOfStack = 0x44; + pxTopOfStack--; + *pxTopOfStack = 0x44; + + /* ER5 */ + pxTopOfStack--; + *pxTopOfStack = 0x55; + pxTopOfStack--; + *pxTopOfStack = 0x55; + pxTopOfStack--; + *pxTopOfStack = 0x55; + pxTopOfStack--; + *pxTopOfStack = 0x55; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void * pxCurrentTCB; + + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. This + mirrors the function epilogue code generated by the compiler when the + "saveall" function attribute is used. */ + asm volatile ( + "MOV.L @_pxCurrentTCB, ER6 \n\t" + "MOV.L @ER6, ER7 \n\t" + "LDM.L @SP+, (ER4-ER5) \n\t" + "LDM.L @SP+, (ER0-ER3) \n\t" + "MOV.L @ER7+, ER6 \n\t" + "RTE \n\t" + ); + + ( void ) pxCurrentTCB; + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the h8 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. This is a trap handler. The "saveall" function + * attribute is used so the context is saved by the compiler prologue. All + * we have to do is save the stack pointer. + */ +void vPortYield( void ) +{ + portSAVE_STACK_POINTER(); + vTaskSwitchContext(); + portRESTORE_STACK_POINTER(); +} +/*-----------------------------------------------------------*/ + +/* + * The interrupt handler installed for the RTOS tick depends on whether the + * preemptive or cooperative scheduler is being used. + */ +#if( configUSE_PREEMPTION == 1 ) + + /* + * The preemptive scheduler is used so the ISR calls vTaskSwitchContext(). + * The function prologue saves the context so all we have to do is save + * the stack pointer. + */ + void vTickISR( void ) __attribute__ ( ( saveall, interrupt_handler ) ); + void vTickISR( void ) + { + portSAVE_STACK_POINTER(); + + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the interrupt. */ + TSR1 &= ~0x01; + + portRESTORE_STACK_POINTER(); + } + +#else + + /* + * The cooperative scheduler is being used so all we have to do is + * periodically increment the tick. This can just be a normal ISR and + * the "saveall" attribute is not required. + */ + void vTickISR( void ) __attribute__ ( ( interrupt_handler ) ); + void vTickISR( void ) + { + xTaskIncrementTick(); + + /* Clear the interrupt. */ + TSR1 &= ~0x01; + } + +#endif +/*-----------------------------------------------------------*/ + +/* + * Setup timer 1 compare match to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulCompareMatch = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) / portCLOCK_DIV; + + /* Turn the module on. */ + MSTPCR &= ~portMSTP13; + + /* Configure timer 1. */ + TCR1 = portCLEAR_ON_TGRA_COMPARE_MATCH | portCLOCK_DIV_64; + + /* Configure the compare match value for a tick of configTICK_RATE_HZ. */ + TGR1A = ulCompareMatch; + + /* Start the timer and enable the interrupt - we can do this here as + interrupts are globally disabled when this function is called. */ + TIER1 |= portTGRA_INTERRUPT_ENABLE; + TSTR |= portTIMER_CHANNEL; +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/portmacro.h new file mode 100644 index 0000000..fcbd7d7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/portmacro.h @@ -0,0 +1,139 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portYIELD() asm volatile( "TRAPA #0" ) +#define portNOP() asm volatile( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENABLE_INTERRUPTS() asm volatile( "ANDC #0x7F, CCR" ); +#define portDISABLE_INTERRUPTS() asm volatile( "ORC #0x80, CCR" ); + +/* Push the CCR then disable interrupts. */ +#define portENTER_CRITICAL() asm volatile( "STC CCR, @-ER7" ); \ + portDISABLE_INTERRUPTS(); + +/* Pop the CCR to set the interrupt masking back to its previous state. */ +#define portEXIT_CRITICAL() asm volatile( "LDC @ER7+, CCR" ); +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Context switch macros. These macros are very simple as the context +is saved simply by selecting the saveall attribute of the context switch +interrupt service routines. These macros save and restore the stack +pointer to the TCB. */ + +#define portSAVE_STACK_POINTER() \ +extern void* pxCurrentTCB; \ + \ + asm volatile( \ + "MOV.L @_pxCurrentTCB, ER5 \n\t" \ + "MOV.L ER7, @ER5 \n\t" \ + ); \ + ( void ) pxCurrentTCB; + + +#define portRESTORE_STACK_POINTER() \ +extern void* pxCurrentTCB; \ + \ + asm volatile( \ + "MOV.L @_pxCurrentTCB, ER5 \n\t" \ + "MOV.L @ER5, ER7 \n\t" \ + ); \ + ( void ) pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* Macros to allow a context switch from within an application ISR. */ + +#define portENTER_SWITCHING_ISR() portSAVE_STACK_POINTER(); { + +#define portEXIT_SWITCHING_ISR( x ) \ + if( x ) \ + { \ + extern void vTaskSwitchContext( void ); \ + vTaskSwitchContext(); \ + } \ + } portRESTORE_STACK_POINTER(); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/port.c new file mode 100644 index 0000000..210f059 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/port.c @@ -0,0 +1,238 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* GCC/HCS12 port by Jefferson L Smith, 2005 */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Port includes */ +#include + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the HCS12 port. + *----------------------------------------------------------*/ + + +/* + * Configure a timer to generate the RTOS tick at the frequency specified + * within FreeRTOSConfig.h. + */ +static void prvSetupTimerInterrupt( void ); + +/* NOTE: Interrupt service routines must be in non-banked memory - as does the +scheduler startup function. */ +#define ATTR_NEAR __attribute__((near)) + +/* Manual context switch function. This is the SWI ISR. */ +// __attribute__((interrupt)) +void ATTR_NEAR vPortYield( void ); + +/* Tick context switch function. This is the timer ISR. */ +// __attribute__((interrupt)) +void ATTR_NEAR vPortTickInterrupt( void ); + +/* Function in non-banked memory which actually switches to first task. */ +BaseType_t ATTR_NEAR xStartSchedulerNear( void ); + +/* Calls to portENTER_CRITICAL() can be nested. When they are nested the +critical section should not be left (i.e. interrupts should not be re-enabled) +until the nesting depth reaches 0. This variable simply tracks the nesting +depth. Each task maintains it's own critical nesting depth variable so +uxCriticalNesting is saved and restored from the task stack during a context +switch. */ +volatile UBaseType_t uxCriticalNesting = 0x80; // un-initialized + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. In this case the stack as + expected by the HCS12 RTI instruction. */ + + + /* The address of the task function is placed in the stack byte at a time. */ + *pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 1 ); + *--pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pxCode) ) + 0 ); + + /* Next are all the registers that form part of the task context. */ + + /* Y register */ + *--pxTopOfStack = ( StackType_t ) 0xff; + *--pxTopOfStack = ( StackType_t ) 0xee; + + /* X register */ + *--pxTopOfStack = ( StackType_t ) 0xdd; + *--pxTopOfStack = ( StackType_t ) 0xcc; + + /* A register contains parameter high byte. */ + *--pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 0 ); + + /* B register contains parameter low byte. */ + *--pxTopOfStack = ( StackType_t ) *( ((StackType_t *) (&pvParameters) ) + 1 ); + + /* CCR: Note that when the task starts interrupts will be enabled since + "I" bit of CCR is cleared */ + *--pxTopOfStack = ( StackType_t ) 0x80; // keeps Stop disabled (MCU default) + + /* tmp softregs used by GCC. Values right now don't matter. */ + __asm("\n\ + movw _.frame, 2,-%0 \n\ + movw _.tmp, 2,-%0 \n\ + movw _.z, 2,-%0 \n\ + movw _.xy, 2,-%0 \n\ + ;movw _.d2, 2,-%0 \n\ + ;movw _.d1, 2,-%0 \n\ + ": "=A"(pxTopOfStack) : "0"(pxTopOfStack) ); + + #ifdef BANKED_MODEL + /* The page of the task. */ + *--pxTopOfStack = 0x30; // can only directly start in PPAGE 0x30 + #endif + + /* The critical nesting depth is initialised with 0 (meaning not in + a critical section). */ + *--pxTopOfStack = ( StackType_t ) 0x00; + + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the HCS12 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Enable hardware RTI timer */ + /* Ignores configTICK_RATE_HZ */ + RTICTL = 0x50; // 16 MHz xtal: 976.56 Hz, 1024mS + CRGINT |= 0x80; // RTIE +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* xPortStartScheduler() does not start the scheduler directly because + the header file containing the xPortStartScheduler() prototype is part + of the common kernel code, and therefore cannot use the CODE_SEG pragma. + Instead it simply calls the locally defined xNearStartScheduler() - + which does use the CODE_SEG pragma. */ + + int16_t register d; + __asm ("jmp xStartSchedulerNear ; will never return": "=d"(d)); + return d; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStartSchedulerNear( void ) +{ + /* Configure the timer that will generate the RTOS tick. Interrupts are + disabled when this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task. */ + portRESTORE_CONTEXT(); + + portISR_TAIL(); + + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +/* + * Context switch functions. These are interrupt service routines. + */ + +/* + * Manual context switch forced by calling portYIELD(). This is the SWI + * handler. + */ +void vPortYield( void ) +{ + portISR_HEAD(); + /* NOTE: This is the trap routine (swi) although not defined as a trap. + It will fill the stack the same way as an ISR in order to mix preemtion + and cooperative yield. */ + + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + + portISR_TAIL(); +} +/*-----------------------------------------------------------*/ + +/* + * RTOS tick interrupt service routine. If the cooperative scheduler is + * being used then this simply increments the tick count. If the + * preemptive scheduler is being used a context switch can occur. + */ +void vPortTickInterrupt( void ) +{ + portISR_HEAD(); + + /* Clear tick timer flag */ + CRGFLG = 0x80; + + #if configUSE_PREEMPTION == 1 + { + /* A context switch might happen so save the context. */ + portSAVE_CONTEXT(); + + /* Increment the tick ... */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is necessary. */ + vTaskSwitchContext(); + } + + /* Restore the context of a task - which may be a different task + to that interrupted. */ + portRESTORE_CONTEXT(); + } + #else + { + xTaskIncrementTick(); + } + #endif + + portISR_TAIL(); +} + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/portmacro.h new file mode 100644 index 0000000..11599d0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/portmacro.h @@ -0,0 +1,247 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 1 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portYIELD() __asm( "swi" ); +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENABLE_INTERRUPTS() __asm( "cli" ) +#define portDISABLE_INTERRUPTS() __asm( "sei" ) + +/* + * Disable interrupts before incrementing the count of critical section nesting. + * The nesting count is maintained so we know when interrupts should be + * re-enabled. Once interrupts are disabled the nesting count can be accessed + * directly. Each task maintains its own nesting count. + */ +#define portENTER_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + uxCriticalNesting++; \ +} + +/* + * Interrupts are disabled so we can access the nesting count directly. If the + * nesting is found to be 0 (no nesting) then we are leaving the critical + * section and interrupts can be re-enabled. + */ +#define portEXIT_CRITICAL() \ +{ \ + extern volatile UBaseType_t uxCriticalNesting; \ + \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * These macros are very simple as the processor automatically saves and + * restores its registers as interrupts are entered and exited. In + * addition to the (automatically stacked) registers we also stack the + * critical nesting count. Each task maintains its own critical nesting + * count as it is legitimate for a task to yield from within a critical + * section. If the banked memory model is being used then the PPAGE + * register is also stored as part of the tasks context. + */ + +#ifdef BANKED_MODEL + /* + * Load the stack pointer for the task, then pull the critical nesting + * count and PPAGE register from the stack. The remains of the + * context are restored by the RTI instruction. + */ + #define portRESTORE_CONTEXT() \ + { \ + __asm( " \n\ + .globl pxCurrentTCB ; void * \n\ + .globl uxCriticalNesting ; char \n\ + \n\ + ldx pxCurrentTCB \n\ + lds 0,x ; Stack \n\ + \n\ + movb 1,sp+,uxCriticalNesting \n\ + movb 1,sp+,0x30 ; PPAGE \n\ + " ); \ + } + + /* + * By the time this macro is called the processor has already stacked the + * registers. Simply stack the nesting count and PPAGE value, then save + * the task stack pointer. + */ + #define portSAVE_CONTEXT() \ + { \ + __asm( " \n\ + .globl pxCurrentTCB ; void * \n\ + .globl uxCriticalNesting ; char \n\ + \n\ + movb 0x30, 1,-sp ; PPAGE \n\ + movb uxCriticalNesting, 1,-sp \n\ + \n\ + ldx pxCurrentTCB \n\ + sts 0,x ; Stack \n\ + " ); \ + } +#else + + /* + * These macros are as per the BANKED versions above, but without saving + * and restoring the PPAGE register. + */ + + #define portRESTORE_CONTEXT() \ + { \ + __asm( " \n\ + .globl pxCurrentTCB ; void * \n\ + .globl uxCriticalNesting ; char \n\ + \n\ + ldx pxCurrentTCB \n\ + lds 0,x ; Stack \n\ + \n\ + movb 1,sp+,uxCriticalNesting \n\ + " ); \ + } + + #define portSAVE_CONTEXT() \ + { \ + __asm( " \n\ + .globl pxCurrentTCB ; void * \n\ + .globl uxCriticalNesting ; char \n\ + \n\ + movb uxCriticalNesting, 1,-sp \n\ + \n\ + ldx pxCurrentTCB \n\ + sts 0,x ; Stack \n\ + " ); \ + } +#endif + +/* + * Utility macros to save/restore correct software registers for GCC. This is + * useful when GCC does not generate appropriate ISR head/tail code. + */ +#define portISR_HEAD() \ +{ \ + __asm(" \n\ + movw _.frame, 2,-sp \n\ + movw _.tmp, 2,-sp \n\ + movw _.z, 2,-sp \n\ + movw _.xy, 2,-sp \n\ + ;movw _.d2, 2,-sp \n\ + ;movw _.d1, 2,-sp \n\ + "); \ +} + +#define portISR_TAIL() \ +{ \ + __asm(" \n\ + movw 2,sp+, _.xy \n\ + movw 2,sp+, _.z \n\ + movw 2,sp+, _.tmp \n\ + movw 2,sp+, _.frame \n\ + ;movw 2,sp+, _.d1 \n\ + ;movw 2,sp+, _.d2 \n\ + rti \n\ + "); \ +} + +/* + * Utility macro to call macros above in correct order in order to perform a + * task switch from within a standard ISR. This macro can only be used if + * the ISR does not use any local (stack) variables. If the ISR uses stack + * variables portYIELD() should be used in it's place. + */ + +#define portTASK_SWITCH_FROM_ISR() \ + portSAVE_CONTEXT(); \ + vTaskSwitchContext(); \ + portRESTORE_CONTEXT(); + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/ISR_Support.h new file mode 100644 index 0000000..d0816e4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/ISR_Support.h @@ -0,0 +1,128 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + .extern ulTopOfSystemStack + .extern ulInterruptNesting + +/*-----------------------------------------------------------*/ + +.macro portFREERTOS_INTERRUPT_ENTRY + + /* Save general purpose registers. */ + pusha + + /* If ulInterruptNesting is zero the rest of the task context will need + saving and a stack switch might be required. */ + movl ulInterruptNesting, %eax + test %eax, %eax + jne 2f + + /* Interrupts are not nested, so save the rest of the task context. */ + .if configSUPPORT_FPU == 1 + + /* If the task has a buffer allocated to save the FPU context then + save the FPU context now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + fnsave ( %eax ) /* Save FLOP context into ucTempFPUBuffer array. */ + fwait + + 1: + /* Save the address of the FPU context, if any. */ + push pucPortTaskFPUContextBuffer + + .endif /* configSUPPORT_FPU */ + + /* Find the TCB. */ + movl pxCurrentTCB, %eax + + /* Stack location is first item in the TCB. */ + movl %esp, (%eax) + + /* Switch stacks. */ + movl ulTopOfSystemStack, %esp + movl %esp, %ebp + + 2: + /* Increment nesting count. */ + add $1, ulInterruptNesting + +.endm +/*-----------------------------------------------------------*/ + +.macro portINTERRUPT_EPILOGUE + + cli + sub $1, ulInterruptNesting + + /* If the nesting has unwound to zero. */ + movl ulInterruptNesting, %eax + test %eax, %eax + jne 2f + + /* If a yield was requested then select a new TCB now. */ + movl ulPortYieldPending, %eax + test %eax, %eax + je 1f + movl $0, ulPortYieldPending + call vTaskSwitchContext + + 1: + /* Stack location is first item in the TCB. */ + movl pxCurrentTCB, %eax + movl (%eax), %esp + + .if configSUPPORT_FPU == 1 + + /* Restore address of task's FPU context buffer. */ + pop pucPortTaskFPUContextBuffer + + /* If the task has a buffer allocated in which its FPU context is saved, + then restore it now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + frstor ( %eax ) + 1: + .endif + + 2: + popa + +.endm +/*-----------------------------------------------------------*/ + +.macro portFREERTOS_INTERRUPT_EXIT + + portINTERRUPT_EPILOGUE + /* EOI. */ + movl $0x00, (0xFEE000B0) + iret + +.endm diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/port.c new file mode 100644 index 0000000..ffaea7e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/port.c @@ -0,0 +1,687 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#if( configISR_STACK_SIZE < ( configMINIMAL_STACK_SIZE * 2 ) ) + #warning configISR_STACK_SIZE is probably too small! +#endif /* ( configISR_STACK_SIZE < configMINIMAL_STACK_SIZE * 2 ) */ + +#if( ( configMAX_API_CALL_INTERRUPT_PRIORITY > portMAX_PRIORITY ) || ( configMAX_API_CALL_INTERRUPT_PRIORITY < 2 ) ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be between 2 and 15 +#endif + +#if( ( configSUPPORT_FPU == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) ) + #error configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 to use this port with an FPU +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Only the IF bit is set so tasks start with interrupts enabled. */ +#define portINITIAL_EFLAGS ( 0x200UL ) + +/* Error interrupts are at the highest priority vectors. */ +#define portAPIC_LVT_ERROR_VECTOR ( 0xfe ) +#define portAPIC_SPURIOUS_INT_VECTOR ( 0xff ) + +/* EFLAGS bits. */ +#define portEFLAGS_IF ( 0x200UL ) + +/* FPU context size if FSAVE is used. */ +#define portFPU_CONTEXT_SIZE_BYTES 108 + +/* The expected size of each entry in the IDT. Used to check structure packing + is set correctly. */ +#define portEXPECTED_IDT_ENTRY_SIZE 8 + +/* Default flags setting for entries in the IDT. */ +#define portIDT_FLAGS ( 0x8E ) + +/* This is the lowest possible ISR vector available to application code. */ +#define portAPIC_MIN_ALLOWABLE_VECTOR ( 0x20 ) + +/* If configASSERT() is defined then the system stack is filled with this value +to allow for a crude stack overflow check. */ +#define portSTACK_WORD ( 0xecececec ) +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/* + * Complete one descriptor in the IDT. + */ +static void prvSetInterruptGate( uint8_t ucNumber, ISR_Handler_t pxHandlerFunction, uint8_t ucFlags ); + +/* + * The default handler installed in each IDT position. + */ +extern void vPortCentralInterruptWrapper( void ); + +/* + * Handler for portYIELD(). + */ +extern void vPortYieldCall( void ); + +/* + * Configure the APIC to generate the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Tick interrupt handler. + */ +extern void vPortTimerHandler( void ); + +/* + * Check an interrupt vector is not too high, too low, in use by FreeRTOS, or + * already in use by the application. + */ +static BaseType_t prvCheckValidityOfVectorNumber( uint32_t ulVectorNumber ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable must be initialised to a non zero value to ensure interrupts don't +inadvertently become unmasked before the scheduler starts. It is set to zero +before the first task starts executing. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* A structure used to map the various fields of an IDT entry into separate +structure members. */ +struct IDTEntry +{ + uint16_t usISRLow; /* Low 16 bits of handler address. */ + uint16_t usSegmentSelector; /* Flat model means this is not changed. */ + uint8_t ucZero; /* Must be set to zero. */ + uint8_t ucFlags; /* Flags for this entry. */ + uint16_t usISRHigh; /* High 16 bits of handler address. */ +} __attribute__( ( packed ) ); +typedef struct IDTEntry IDTEntry_t; + + +/* Use to pass the location of the IDT to the CPU. */ +struct IDTPointer +{ + uint16_t usTableLimit; + uint32_t ulTableBase; /* The address of the first entry in xInterruptDescriptorTable. */ +} __attribute__( ( __packed__ ) ); +typedef struct IDTPointer IDTPointer_t; + +/* The IDT itself. */ +static __attribute__ ( ( aligned( 32 ) ) ) IDTEntry_t xInterruptDescriptorTable[ portNUM_VECTORS ]; + +#if ( configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 ) + + /* A table in which application defined interrupt handlers are stored. These + are called by the central interrupt handler if a common interrupt entry + point it used. */ + static ISR_Handler_t xInterruptHandlerTable[ portNUM_VECTORS ] = { NULL }; + +#endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ + +#if ( configSUPPORT_FPU == 1 ) + + /* Saved as part of the task context. If pucPortTaskFPUContextBuffer is NULL + then the task does not have an FPU context. If pucPortTaskFPUContextBuffer is + not NULL then it points to a buffer into which the FPU context can be saved. */ + uint8_t *pucPortTaskFPUContextBuffer __attribute__((used)) = pdFALSE; + +#endif /* configSUPPORT_FPU */ + +/* The stack used by interrupt handlers. */ +static uint32_t ulSystemStack[ configISR_STACK_SIZE ] __attribute__((used)) = { 0 }; + +/* Don't use the very top of the system stack so the return address +appears as 0 if the debugger tries to unwind the stack. */ +volatile uint32_t ulTopOfSystemStack __attribute__((used)) = ( uint32_t ) &( ulSystemStack[ configISR_STACK_SIZE - 5 ] ); + +/* If a yield is requested from an interrupt or from a critical section then +the yield is not performed immediately, and ulPortYieldPending is set to pdTRUE +instead to indicate the yield should be performed at the end of the interrupt +when the critical section is exited. */ +volatile uint32_t ulPortYieldPending __attribute__((used)) = pdFALSE; + +/* Counts the interrupt nesting depth. Used to know when to switch to the +interrupt/system stack and when to save/restore a complete context. */ +volatile uint32_t ulInterruptNesting __attribute__((used)) = 0; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t ulCodeSegment; + + /* Setup the initial stack as expected by the portFREERTOS_INTERRUPT_EXIT macro. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + + /* Parameters first. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* There is nothing to return to so assert if attempting to use the return + address. */ + *pxTopOfStack = ( StackType_t ) prvTaskExitError; + pxTopOfStack--; + + /* iret used to start the task pops up to here. */ + *pxTopOfStack = portINITIAL_EFLAGS; + pxTopOfStack--; + + /* CS */ + __asm volatile( "movl %%cs, %0" : "=r" ( ulCodeSegment ) ); + *pxTopOfStack = ulCodeSegment; + pxTopOfStack--; + + /* First instruction in the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* General purpose registers as expected by a POPA instruction. */ + *pxTopOfStack = 0xEA; + pxTopOfStack--; + + *pxTopOfStack = 0xEC; + pxTopOfStack--; + + *pxTopOfStack = 0xED1; /* EDX */ + pxTopOfStack--; + + *pxTopOfStack = 0xEB1; /* EBX */ + pxTopOfStack--; + + /* Hole for ESP. */ + pxTopOfStack--; + + *pxTopOfStack = 0x00; /* EBP */ + pxTopOfStack--; + + *pxTopOfStack = 0xE5; /* ESI */ + pxTopOfStack--; + + *pxTopOfStack = 0xeeeeeeee; /* EDI */ + + #if ( configSUPPORT_FPU == 1 ) + { + pxTopOfStack--; + + /* Buffer for FPU context, which is initialised to NULL as tasks are not + created with an FPU context. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + } + #endif /* configSUPPORT_FPU */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvSetInterruptGate( uint8_t ucNumber, ISR_Handler_t pxHandlerFunction, uint8_t ucFlags ) +{ +uint16_t usCodeSegment; +uint32_t ulBase = ( uint32_t ) pxHandlerFunction; + + xInterruptDescriptorTable[ ucNumber ].usISRLow = ( uint16_t ) ( ulBase & USHRT_MAX ); + xInterruptDescriptorTable[ ucNumber ].usISRHigh = ( uint16_t ) ( ( ulBase >> 16UL ) & USHRT_MAX ); + + /* When the flat model is used the CS will never change. */ + __asm volatile( "mov %%cs, %0" : "=r" ( usCodeSegment ) ); + xInterruptDescriptorTable[ ucNumber ].usSegmentSelector = usCodeSegment; + xInterruptDescriptorTable[ ucNumber ].ucZero = 0; + xInterruptDescriptorTable[ ucNumber ].ucFlags = ucFlags; +} +/*-----------------------------------------------------------*/ + +void vPortSetupIDT( void ) +{ +uint32_t ulNum; +IDTPointer_t xIDT; + + #if ( configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 ) + { + for( ulNum = 0; ulNum < portNUM_VECTORS; ulNum++ ) + { + /* If a handler has not already been installed on this vector. */ + if( ( xInterruptDescriptorTable[ ulNum ].usISRLow == 0x00 ) && ( xInterruptDescriptorTable[ ulNum ].usISRHigh == 0x00 ) ) + { + prvSetInterruptGate( ( uint8_t ) ulNum, vPortCentralInterruptWrapper, portIDT_FLAGS ); + } + } + } + #endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ + + /* Set IDT address. */ + xIDT.ulTableBase = ( uint32_t ) xInterruptDescriptorTable; + xIDT.usTableLimit = sizeof( xInterruptDescriptorTable ) - 1; + + /* Set IDT in CPU. */ + __asm volatile( "lidt %0" :: "m" (xIDT) ); +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +extern void vPortAPICErrorHandlerWrapper( void ); +extern void vPortAPICSpuriousHandler( void ); + + /* Initialise LAPIC to a well known state. */ + portAPIC_LDR = 0xFFFFFFFF; + portAPIC_LDR = ( ( portAPIC_LDR & 0x00FFFFFF ) | 0x00000001 ); + portAPIC_LVT_TIMER = portAPIC_DISABLE; + portAPIC_LVT_PERF = portAPIC_NMI; + portAPIC_LVT_LINT0 = portAPIC_DISABLE; + portAPIC_LVT_LINT1 = portAPIC_DISABLE; + portAPIC_TASK_PRIORITY = 0; + + /* Install APIC timer ISR vector. */ + prvSetInterruptGate( ( uint8_t ) portAPIC_TIMER_INT_VECTOR, vPortTimerHandler, portIDT_FLAGS ); + + /* Install API error handler. */ + prvSetInterruptGate( ( uint8_t ) portAPIC_LVT_ERROR_VECTOR, vPortAPICErrorHandlerWrapper, portIDT_FLAGS ); + + /* Install Yield handler. */ + prvSetInterruptGate( ( uint8_t ) portAPIC_YIELD_INT_VECTOR, vPortYieldCall, portIDT_FLAGS ); + + /* Install spurious interrupt vector. */ + prvSetInterruptGate( ( uint8_t ) portAPIC_SPURIOUS_INT_VECTOR, vPortAPICSpuriousHandler, portIDT_FLAGS ); + + /* Enable the APIC, mapping the spurious interrupt at the same time. */ + portAPIC_SPURIOUS_INT = portAPIC_SPURIOUS_INT_VECTOR | portAPIC_ENABLE_BIT; + + /* Set timer error vector. */ + portAPIC_LVT_ERROR = portAPIC_LVT_ERROR_VECTOR; + + /* Set the interrupt frequency. */ + portAPIC_TMRDIV = portAPIC_DIV_16; + portAPIC_TIMER_INITIAL_COUNT = ( ( configCPU_CLOCK_HZ >> 4UL ) / configTICK_RATE_HZ ) - 1UL; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +BaseType_t xWord; + + /* Some versions of GCC require the -mno-ms-bitfields command line option + for packing to work. */ + configASSERT( sizeof( struct IDTEntry ) == portEXPECTED_IDT_ENTRY_SIZE ); + + /* Fill part of the system stack with a known value to help detect stack + overflow. A few zeros are left so GDB doesn't get confused unwinding + the stack. */ + for( xWord = 0; xWord < configISR_STACK_SIZE - 20; xWord++ ) + { + ulSystemStack[ xWord ] = portSTACK_WORD; + } + + /* Initialise Interrupt Descriptor Table (IDT). */ + vPortSetupIDT(); + + /* Initialise LAPIC and install system handlers. */ + prvSetupTimerInterrupt(); + + /* Make sure the stack used by interrupts is aligned. */ + ulTopOfSystemStack &= ~portBYTE_ALIGNMENT_MASK; + + ulCriticalNesting = 0; + + /* Enable LAPIC Counter.*/ + portAPIC_LVT_TIMER = portAPIC_TIMER_PERIODIC | portAPIC_TIMER_INT_VECTOR; + + /* Sometimes needed. */ + portAPIC_TMRDIV = portAPIC_DIV_16; + + /* Should not return from the following function as the scheduler will then + be executing the tasks. */ + vPortStartFirstTask(); + + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( ulCriticalNesting == 0 ) + { + #if( configMAX_API_CALL_INTERRUPT_PRIORITY == portMAX_PRIORITY ) + { + __asm volatile( "cli" ); + } + #else + { + portAPIC_TASK_PRIORITY = portMAX_API_CALL_PRIORITY; + configASSERT( portAPIC_TASK_PRIORITY == portMAX_API_CALL_PRIORITY ); + } + #endif + } + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + #if( configMAX_API_CALL_INTERRUPT_PRIORITY == portMAX_PRIORITY ) + { + __asm volatile( "sti" ); + } + #else + { + portAPIC_TASK_PRIORITY = 0; + } + #endif + + /* If a yield was pended from within the critical section then + perform the yield now. */ + if( ulPortYieldPending != pdFALSE ) + { + ulPortYieldPending = pdFALSE; + __asm volatile( portYIELD_INTERRUPT ); + } + } + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ +volatile uint32_t ulOriginalMask; + + /* Set mask to max syscall priority. */ + #if( configMAX_API_CALL_INTERRUPT_PRIORITY == portMAX_PRIORITY ) + { + /* Return whether interrupts were already enabled or not. Pop adjusts + the stack first. */ + __asm volatile( "pushf \t\n" + "pop %0 \t\n" + "cli " + : "=rm" (ulOriginalMask) :: "memory" ); + + ulOriginalMask &= portEFLAGS_IF; + } + #else + { + /* Return original mask. */ + ulOriginalMask = portAPIC_TASK_PRIORITY; + portAPIC_TASK_PRIORITY = portMAX_API_CALL_PRIORITY; + configASSERT( portAPIC_TASK_PRIORITY == portMAX_API_CALL_PRIORITY ); + } + #endif + + return ulOriginalMask; +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + #if( configMAX_API_CALL_INTERRUPT_PRIORITY == portMAX_PRIORITY ) + { + if( ulNewMaskValue != pdFALSE ) + { + __asm volatile( "sti" ); + } + } + #else + { + portAPIC_TASK_PRIORITY = ulNewMaskValue; + configASSERT( portAPIC_TASK_PRIORITY == ulNewMaskValue ); + } + #endif +} +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_FPU == 1 ) + + void vPortTaskUsesFPU( void ) + { + /* A task is registering the fact that it needs an FPU context. Allocate a + buffer into which the context can be saved. */ + pucPortTaskFPUContextBuffer = ( uint8_t * ) pvPortMalloc( portFPU_CONTEXT_SIZE_BYTES ); + configASSERT( pucPortTaskFPUContextBuffer ); + + /* Initialise the floating point registers. */ + __asm volatile( "fninit" ); + } + +#endif /* configSUPPORT_FPU */ +/*-----------------------------------------------------------*/ + +void vPortAPICErrorHandler( void ) +{ +/* Variable to hold the APIC error status for viewing in the debugger. */ +volatile uint32_t ulErrorStatus = 0; + + portAPIC_ERROR_STATUS = 0; + ulErrorStatus = portAPIC_ERROR_STATUS; + ( void ) ulErrorStatus; + + /* Force an assert. */ + configASSERT( ulCriticalNesting == ~0UL ); +} +/*-----------------------------------------------------------*/ + +#if( configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 ) + + void vPortCentralInterruptHandler( uint32_t ulVector ) + { + if( ulVector < portNUM_VECTORS ) + { + if( xInterruptHandlerTable[ ulVector ] != NULL ) + { + ( xInterruptHandlerTable[ ulVector ] )(); + } + } + + /* Check for a system stack overflow. */ + configASSERT( ulSystemStack[ 10 ] == portSTACK_WORD ); + configASSERT( ulSystemStack[ 12 ] == portSTACK_WORD ); + configASSERT( ulSystemStack[ 14 ] == portSTACK_WORD ); + } + +#endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 ) + + BaseType_t xPortRegisterCInterruptHandler( ISR_Handler_t pxHandler, uint32_t ulVectorNumber ) + { + BaseType_t xReturn; + + xReturn = prvCheckValidityOfVectorNumber( ulVectorNumber ); + + if( xReturn != pdFAIL ) + { + /* Save the handler passed in by the application in the vector number + passed in. The addresses are then called from the central interrupt + handler. */ + xInterruptHandlerTable[ ulVectorNumber ] = pxHandler; + } + + return xReturn; + } + +#endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( ISR_Handler_t pxHandler, uint32_t ulVectorNumber ) +{ +BaseType_t xReturn; + + xReturn = prvCheckValidityOfVectorNumber( ulVectorNumber ); + + if( xReturn != pdFAIL ) + { + taskENTER_CRITICAL(); + { + /* Update the IDT to include the application defined handler. */ + prvSetInterruptGate( ( uint8_t ) ulVectorNumber, ( ISR_Handler_t ) pxHandler, portIDT_FLAGS ); + } + taskEXIT_CRITICAL(); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvCheckValidityOfVectorNumber( uint32_t ulVectorNumber ) +{ +BaseType_t xReturn; + + /* Check validity of vector number. */ + if( ulVectorNumber >= portNUM_VECTORS ) + { + /* Too high. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber < portAPIC_MIN_ALLOWABLE_VECTOR ) + { + /* Too low. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber == portAPIC_TIMER_INT_VECTOR ) + { + /* In use by FreeRTOS. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber == portAPIC_YIELD_INT_VECTOR ) + { + /* In use by FreeRTOS. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber == portAPIC_LVT_ERROR_VECTOR ) + { + /* In use by FreeRTOS. */ + xReturn = pdFAIL; + } + else if( ulVectorNumber == portAPIC_SPURIOUS_INT_VECTOR ) + { + /* In use by FreeRTOS. */ + xReturn = pdFAIL; + } + else if( xInterruptHandlerTable[ ulVectorNumber ] != NULL ) + { + /* Already in use by the application. */ + xReturn = pdFAIL; + } + else + { + xReturn = pdPASS; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vGenerateYieldInterrupt( void ) +{ + __asm volatile( portYIELD_INTERRUPT ); +} + + + + + + + + + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portASM.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portASM.S new file mode 100644 index 0000000..d886bbe --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portASM.S @@ -0,0 +1,275 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +.file "portASM.S" +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vPortCentralInterruptHandler + .extern xTaskIncrementTick + .extern vPortAPICErrorHandler + .extern pucPortTaskFPUContextBuffer + .extern ulPortYieldPending + + .global vPortStartFirstTask + .global vPortCentralInterruptWrapper + .global vPortAPICErrorHandlerWrapper + .global vPortTimerHandler + .global vPortYieldCall + .global vPortAPICSpuriousHandler + + .text + +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortYieldCall +vPortYieldCall: + /* Save general purpose registers. */ + pusha + + .if configSUPPORT_FPU == 1 + + /* If the task has a buffer allocated to save the FPU context then save + the FPU context now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + fnsave ( %eax ) + fwait + + 1: + + /* Save the address of the FPU context, if any. */ + push pucPortTaskFPUContextBuffer + + .endif /* configSUPPORT_FPU */ + + /* Find the TCB. */ + movl pxCurrentTCB, %eax + + /* Stack location is first item in the TCB. */ + movl %esp, (%eax) + + call vTaskSwitchContext + + /* Find the location of pxCurrentTCB again - a callee saved register could + be used in place of eax to prevent this second load, but that then relies + on the compiler and other asm code. */ + movl pxCurrentTCB, %eax + movl (%eax), %esp + + .if configSUPPORT_FPU == 1 + + /* Restore address of task's FPU context buffer. */ + pop pucPortTaskFPUContextBuffer + + /* If the task has a buffer allocated in which its FPU context is saved, + then restore it now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + frstor ( %eax ) + 1: + .endif + + popa + iret + +.endfunc +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortStartFirstTask +vPortStartFirstTask: + + /* Find the TCB. */ + movl pxCurrentTCB, %eax + + /* Stack location is first item in the TCB. */ + movl (%eax), %esp + + /* Restore FPU context flag. */ + .if configSUPPORT_FPU == 1 + + pop pucPortTaskFPUContextBuffer + + .endif /* configSUPPORT_FPU */ + + /* Restore general purpose registers. */ + popa + iret +.endfunc +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortAPICErrorHandlerWrapper +vPortAPICErrorHandlerWrapper: + pusha + call vPortAPICErrorHandler + popa + /* EOI. */ + movl $0x00, (0xFEE000B0) + iret +.endfunc +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortTimerHandler +vPortTimerHandler: + + /* Save general purpose registers. */ + pusha + + /* Interrupts are not nested, so save the rest of the task context. */ + .if configSUPPORT_FPU == 1 + + /* If the task has a buffer allocated to save the FPU context then save the + FPU context now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + fnsave ( %eax ) /* Save FLOP context into ucTempFPUBuffer array. */ + fwait + + 1: + /* Save the address of the FPU context, if any. */ + push pucPortTaskFPUContextBuffer + + .endif /* configSUPPORT_FPU */ + + /* Find the TCB. */ + movl pxCurrentTCB, %eax + + /* Stack location is first item in the TCB. */ + movl %esp, (%eax) + + /* Switch stacks. */ + movl ulTopOfSystemStack, %esp + movl %esp, %ebp + + /* Increment nesting count. */ + add $1, ulInterruptNesting + + call xTaskIncrementTick + + sti + + /* Is a switch to another task required? */ + test %eax, %eax + je _skip_context_switch + cli + call vTaskSwitchContext + +_skip_context_switch: + cli + + /* Decrement the variable used to determine if a switch to a system + stack is necessary. */ + sub $1, ulInterruptNesting + + /* Stack location is first item in the TCB. */ + movl pxCurrentTCB, %eax + movl (%eax), %esp + + .if configSUPPORT_FPU == 1 + + /* Restore address of task's FPU context buffer. */ + pop pucPortTaskFPUContextBuffer + + /* If the task has a buffer allocated in which its FPU context is saved, + then restore it now. */ + movl pucPortTaskFPUContextBuffer, %eax + test %eax, %eax + je 1f + frstor ( %eax ) + 1: + .endif + + popa + + /* EOI. */ + movl $0x00, (0xFEE000B0) + iret + +.endfunc +/*-----------------------------------------------------------*/ + +.if configUSE_COMMON_INTERRUPT_ENTRY_POINT == 1 + + .align 4 + .func vPortCentralInterruptWrapper + vPortCentralInterruptWrapper: + + portFREERTOS_INTERRUPT_ENTRY + + movl $0xFEE00170, %eax /* Highest In Service Register (ISR) long word. */ + movl $8, %ecx /* Loop counter. */ + + next_isr_long_word: + test %ecx, %ecx /* Loop counter reached 0? */ + je wrapper_epilogue /* Looked at all ISR registers without finding a bit set. */ + sub $1, %ecx /* Sub 1 from loop counter. */ + movl (%eax), %ebx /* Load next ISR long word. */ + sub $0x10, %eax /* Point to next ISR long word in case no bits are set in the current long word. */ + test %ebx, %ebx /* Are there any bits set? */ + je next_isr_long_word /* Look at next ISR long word if no bits were set. */ + sti + bsr %ebx, %ebx /* A bit was set, which one? */ + movl $32, %eax /* Destination operand for following multiplication. */ + mul %ecx /* Calculate base vector for current register, 32 vectors per register. */ + add %ebx, %eax /* Add bit offset into register to get final vector number. */ + push %eax /* Vector number is function parameter. */ + call vPortCentralInterruptHandler + pop %eax /* Remove parameter. */ + + wrapper_epilogue: + portFREERTOS_INTERRUPT_EXIT + + .endfunc + +.endif /* configUSE_COMMON_INTERRUPT_ENTRY_POINT */ +/*-----------------------------------------------------------*/ + +.align 4 +.func vPortAPISpuriousHandler +vPortAPICSpuriousHandler: + iret + +.endfunc + +.end + + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portmacro.h new file mode 100644 index 0000000..32dcebc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portmacro.h @@ -0,0 +1,292 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef uint32_t TickType_t; +#define portMAX_DELAY ( ( TickType_t ) 0xffffffffUL ) + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 32 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* The interrupt priority (for vectors 16 to 255) is determined using vector/16. +The quotient is rounded to the nearest integer with 1 being the lowest priority +and 15 is the highest. Therefore the following two interrupts are at the lowest +priority. *NOTE 1* If the yield vector is changed then it must also be changed +in the portYIELD_INTERRUPT definition immediately below. */ +#define portAPIC_TIMER_INT_VECTOR ( 0x21 ) +#define portAPIC_YIELD_INT_VECTOR ( 0x20 ) + +/* Build yield interrupt instruction. */ +#define portYIELD_INTERRUPT "int $0x20" + +/* APIC register addresses. */ +#define portAPIC_EOI ( *( ( volatile uint32_t * ) 0xFEE000B0UL ) ) + +/* APIC bit definitions. */ +#define portAPIC_ENABLE_BIT ( 1UL << 8UL ) +#define portAPIC_TIMER_PERIODIC ( 1UL << 17UL ) +#define portAPIC_DISABLE ( 1UL << 16UL ) +#define portAPIC_NMI ( 4 << 8) +#define portAPIC_DIV_16 ( 0x03 ) + +/* Define local API register addresses. */ +#define portAPIC_ID_REGISTER ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x20UL ) ) ) +#define portAPIC_SPURIOUS_INT ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0xF0UL ) ) ) +#define portAPIC_LVT_TIMER ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x320UL ) ) ) +#define portAPIC_TIMER_INITIAL_COUNT ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x380UL ) ) ) +#define portAPIC_TIMER_CURRENT_COUNT ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x390UL ) ) ) +#define portAPIC_TASK_PRIORITY ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x80UL ) ) ) +#define portAPIC_LVT_ERROR ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x370UL ) ) ) +#define portAPIC_ERROR_STATUS ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x280UL ) ) ) +#define portAPIC_LDR ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0xD0UL ) ) ) +#define portAPIC_TMRDIV ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x3E0UL ) ) ) +#define portAPIC_LVT_PERF ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x340UL ) ) ) +#define portAPIC_LVT_LINT0 ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x350UL ) ) ) +#define portAPIC_LVT_LINT1 ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0x360UL ) ) ) + +/* Don't yield if inside a critical section - instead hold the yield pending +so it is performed when the critical section is exited. */ +#define portYIELD() \ +{ \ +extern volatile uint32_t ulCriticalNesting; \ +extern volatile uint32_t ulPortYieldPending; \ + if( ulCriticalNesting != 0 ) \ + { \ + ulPortYieldPending = pdTRUE; \ + } \ + else \ + { \ + __asm volatile( portYIELD_INTERRUPT ); \ + } \ +} + +/* Called at the end of an ISR that can cause a context switch - pend a yield if +xSwithcRequired is not false. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern volatile uint32_t ulPortYieldPending; \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldPending = 1; \ + } \ +} + +/* Same as portEND_SWITCHING_ISR() - take your pick which name to use. */ +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +/* Critical sections for use in interrupts. */ +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask( x ) + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portDISABLE_INTERRUPTS() __asm volatile( "cli" ) +#define portENABLE_INTERRUPTS() __asm volatile( "sti" ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Architecture specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) \ + __asm volatile( "bsr %1, %0\n\t" \ + :"=r"(uxTopPriority) : "rm"(uxReadyPriorities) : "cc" ) + + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#define portNOP() __asm volatile( "NOP" ) + +/*----------------------------------------------------------- + * Misc + *----------------------------------------------------------*/ + +#define portNUM_VECTORS 256 +#define portMAX_PRIORITY 15 +typedef void ( *ISR_Handler_t ) ( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +#ifndef configSUPPORT_FPU + #define configSUPPORT_FPU 0 +#endif + +#if configSUPPORT_FPU == 1 + void vPortTaskUsesFPU( void ); + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() +#endif + +/* See the comments under the configUSE_COMMON_INTERRUPT_ENTRY_POINT definition +below. */ +BaseType_t xPortRegisterCInterruptHandler( ISR_Handler_t pxHandler, uint32_t ulVectorNumber ); +BaseType_t xPortInstallInterruptHandler( ISR_Handler_t pxHandler, uint32_t ulVectorNumber ); + +#ifndef configAPIC_BASE + /* configAPIC_BASE_ADDRESS sets the base address of the local APIC. It can + be overridden in FreeRTOSConfig.h should it not be constant. */ + #define configAPIC_BASE 0xFEE00000UL +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + /* The FreeRTOS scheduling algorithm selects the task that will enter the + Running state. configUSE_PORT_OPTIMISED_TASK_SELECTION is used to set how + that is done. + + If configUSE_PORT_OPTIMISED_TASK_SELECTION is set to 0 then the task to + enter the Running state is selected using a portable algorithm written in + C. This is the slowest method, but the algorithm does not restrict the + maximum number of unique RTOS task priorities that are available. + + If configUSE_PORT_OPTIMISED_TASK_SELECTION is set to 1 then the task to + enter the Running state is selected using a single assembly instruction. + This is the fastest method, but restricts the maximum number of unique RTOS + task priorities to 32 (the same task priority can be assigned to any number + of RTOS tasks). */ + #warning configUSE_PORT_OPTIMISED_TASK_SELECTION was not defined in FreeRTOSConfig.h and has been defaulted to 1 + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#ifndef configUSE_COMMON_INTERRUPT_ENTRY_POINT + /* There are two ways of implementing interrupt handlers: + + 1) As standard C functions - + + This method can only be used if configUSE_COMMON_INTERRUPT_ENTRY_POINT + is set to 1. The C function is installed using + xPortRegisterCInterruptHandler(). + + This is the simplest of the two methods but incurs a slightly longer + interrupt entry time. + + 2) By using an assembly stub that wraps the handler in the FreeRTOS + portFREERTOS_INTERRUPT_ENTRY and portFREERTOS_INTERRUPT_EXIT macros. + + This method can always be used. It is slightly more complex than + method 1 but benefits from a faster interrupt entry time. */ + #warning configUSE_COMMON_INTERRUPT_ENTRY_POINT was not defined in FreeRTOSConfig.h and has been defaulted to 1. + #define configUSE_COMMON_INTERRUPT_ENTRY_POINT 1 +#endif + +#ifndef configISR_STACK_SIZE + /* Interrupt entry code will switch the stack in use to a dedicated system + stack. + + configISR_STACK_SIZE defines the number of 32-bit values that can be stored + on the system stack, and must be large enough to hold a potentially nested + interrupt stack frame. */ + + #error configISR_STACK_SIZE was not defined in FreeRTOSConfig.h. +#endif + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + /* Interrupt safe FreeRTOS functions (those that end in "FromISR" must not + be called from an interrupt that has a priority above that set by + configMAX_API_CALL_INTERRUPT_PRIORITY. */ + #warning configMAX_API_CALL_INTERRUPT_PRIORITY was not defined in FreeRTOSConfig.h and has been defaulted to 10 + #define configMAX_API_CALL_INTERRUPT_PRIORITY 10 +#endif + +#ifndef configSUPPORT_FPU + #warning configSUPPORT_FPU was not defined in FreeRTOSConfig.h and has been defaulted to 0 + #define configSUPPORT_FPU 0 +#endif + +/* The value written to the task priority register to raise the interrupt mask +to the maximum from which FreeRTOS API calls can be made. */ +#define portAPIC_PRIORITY_SHIFT ( 4UL ) +#define portAPIC_MAX_SUB_PRIORITY ( 0x0fUL ) +#define portMAX_API_CALL_PRIORITY ( ( configMAX_API_CALL_INTERRUPT_PRIORITY << portAPIC_PRIORITY_SHIFT ) | portAPIC_MAX_SUB_PRIORITY ) + +/* Asserts if interrupt safe FreeRTOS functions are called from a priority +above the max system call interrupt priority. */ +#define portAPIC_PROCESSOR_PRIORITY ( *( ( volatile uint32_t * ) ( configAPIC_BASE + 0xA0UL ) ) ) +#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( portAPIC_PROCESSOR_PRIORITY ) <= ( portMAX_API_CALL_PRIORITY ) ) + +#ifdef __cplusplus + } /* extern C */ +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MCF5235/readme.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MCF5235/readme.md new file mode 100644 index 0000000..ebf6ea6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MCF5235/readme.md @@ -0,0 +1,2 @@ +The MCF5235 port is deprecated. The last FreeRTOS version that includes this port is 10.4.3. + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/port.c new file mode 100644 index 0000000..ad6ebb6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/port.c @@ -0,0 +1,329 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + Changes from V2.5.2 + + + usCriticalNesting now has a volatile qualifier. +*/ + +/* Standard includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430 port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Most ports implement critical sections by placing the interrupt flags on +the stack before disabling interrupts. Exiting the critical section is then +simply a case of popping the flags from the stack. As mspgcc does not use +a frame pointer this cannot be done as modifying the stack will clobber all +the stack variables. Instead each task maintains a count of the critical +section nesting depth. Each time a critical section is entered the count is +incremented. Each time a critical section is left the count is decremented - +with interrupts only being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + +/* + * Macro to save a task context to the task stack. This simply pushes all the + * general purpose msp430 registers onto the stack, followed by the + * usCriticalNesting value used by the task. Finally the resultant stack + * pointer value is saved into the task control block so it can be retrieved + * the next time the task executes. + */ +#define portSAVE_CONTEXT() \ + asm volatile ( "push r4 \n\t" \ + "push r5 \n\t" \ + "push r6 \n\t" \ + "push r7 \n\t" \ + "push r8 \n\t" \ + "push r9 \n\t" \ + "push r10 \n\t" \ + "push r11 \n\t" \ + "push r12 \n\t" \ + "push r13 \n\t" \ + "push r14 \n\t" \ + "push r15 \n\t" \ + "mov.w usCriticalNesting, r14 \n\t" \ + "push r14 \n\t" \ + "mov.w pxCurrentTCB, r12 \n\t" \ + "mov.w r1, @r12 \n\t" \ + ); + +/* + * Macro to restore a task context from the task stack. This is effectively + * the reverse of portSAVE_CONTEXT(). First the stack pointer value is + * loaded from the task control block. Next the value for usCriticalNesting + * used by the task is retrieved from the stack - followed by the value of all + * the general purpose msp430 registers. + * + * The bic instruction ensures there are no low power bits set in the status + * register that is about to be popped from the stack. + */ +#define portRESTORE_CONTEXT() \ + asm volatile ( "mov.w pxCurrentTCB, r12 \n\t" \ + "mov.w @r12, r1 \n\t" \ + "pop r15 \n\t" \ + "mov.w r15, usCriticalNesting \n\t" \ + "pop r15 \n\t" \ + "pop r14 \n\t" \ + "pop r13 \n\t" \ + "pop r12 \n\t" \ + "pop r11 \n\t" \ + "pop r10 \n\t" \ + "pop r9 \n\t" \ + "pop r8 \n\t" \ + "pop r7 \n\t" \ + "pop r6 \n\t" \ + "pop r5 \n\t" \ + "pop r4 \n\t" \ + "bic #(0xf0),0(r1) \n\t" \ + "reti \n\t" \ + ); +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* The msp430 automatically pushes the PC then SR onto the stack before + executing an ISR. We want the stack to look just as if this has happened + so place a pointer to the start of the task on the stack first - followed + by the flags we want the task to use when it starts up. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next the general purpose registers. */ + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x7777; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcccc; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R15. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* The code generated by the mspgcc compiler does not maintain separate + stack and frame pointers. The portENTER_CRITICAL macro cannot therefore + use the stack as per other ports. Instead a variable is used to keep + track of the critical section nesting. This variable has to be stored + as part of the task context and is initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Should not get here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by portYIELD or taskYIELD. + * + * The first thing we do is save the registers so we can use a naked attribute. + */ +void vPortYield( void ) __attribute__ ( ( naked ) ); +void vPortYield( void ) +{ + /* We want the stack of the task being saved to look exactly as if the task + was saved during a pre-emptive RTOS tick ISR. Before calling an ISR the + msp430 places the status register onto the stack. As this is a function + call and not an ISR we have to do this manually. */ + asm volatile ( "push r2" ); + _DINT(); + + /* Save the context of the current task. */ + portSAVE_CONTEXT(); + + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses timer 0 + * but could alternatively use the watchdog timer or timer 1. + */ +static void prvSetupTimerInterrupt( void ) +{ + /* Ensure the timer is stopped. */ + TACTL = 0; + + /* Run the timer of the ACLK. */ + TACTL = TASSEL_1; + + /* Clear everything to start with. */ + TACTL |= TACLR; + + /* Set the compare match value according to the tick rate we want. */ + TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ; + + /* Enable the interrupts. */ + TACCTL0 = CCIE; + + /* Start up clean. */ + TACTL |= TACLR; + + /* Up mode. */ + TACTL |= MC_1; +} +/*-----------------------------------------------------------*/ + +/* + * The interrupt service routine used depends on whether the pre-emptive + * scheduler is being used or not. + */ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + interrupt (TIMERA0_VECTOR) prvTickISR( void ) __attribute__ ( ( naked ) ); + interrupt (TIMERA0_VECTOR) prvTickISR( void ) + { + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Increment the tick count then switch to the highest priority task + that is ready to run. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + } + +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + interrupt (TIMERA0_VECTOR) prvTickISR( void ); + interrupt (TIMERA0_VECTOR) prvTickISR( void ) + { + xTaskIncrementTick(); + } +#endif + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/portmacro.h new file mode 100644 index 0000000..889d192 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/portmacro.h @@ -0,0 +1,128 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() asm volatile ( "DINT" ); asm volatile ( "NOP" ) +#define portENABLE_INTERRUPTS() asm volatile ( "EINT" ); asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortYield( void ) __attribute__ ( ( naked ) ); +#define portYIELD() vPortYield() +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/port.c new file mode 100644 index 0000000..80ac867 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/port.c @@ -0,0 +1,330 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MicroBlaze port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Standard includes. */ +#include + +/* Hardware includes. */ +#include +#include +#include + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 to use this port. +#endif + +/* Tasks are started with interrupts enabled. */ +#define portINITIAL_MSR_STATE ( ( StackType_t ) 0x02 ) + +/* Tasks are started with a critical section nesting of 0 - however prior +to the scheduler being commenced we don't want the critical nesting level +to reach zero, so it is initialised to a high value. */ +#define portINITIAL_NESTING_VALUE ( 0xff ) + +/* Our hardware setup only uses one counter. */ +#define portCOUNTER_0 0 + +/* The stack used by the ISR is filled with a known value to assist in +debugging. */ +#define portISR_STACK_FILL_VALUE 0x55555555 + +/* Counts the nesting depth of calls to portENTER_CRITICAL(). Each task +maintains it's own count, so this variable is saved as part of the task +context. */ +volatile UBaseType_t uxCriticalNesting = portINITIAL_NESTING_VALUE; + +/* To limit the amount of stack required by each task, this port uses a +separate stack for interrupts. */ +uint32_t *pulISRStack; + +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been made. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +extern void * _SDA2_BASE_; +extern void * _SDA_BASE_; +const uint32_t ulR2 = ( uint32_t ) &_SDA2_BASE_; +const uint32_t ulR13 = ( uint32_t ) &_SDA_BASE_; + + /* Place a few bytes of known values on the bottom of the stack. + This is essential for the Microblaze port and these lines must + not be omitted. The parameter value will overwrite the + 0x22222222 value during the function prologue. */ + *pxTopOfStack = ( StackType_t ) 0x11111111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22222222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x33333333; + pxTopOfStack--; + + /* First stack an initial value for the critical section nesting. This + is initialised to zero as tasks are started with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R0. */ + + /* Place an initial value for all the general purpose registers. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ulR2; /* R2 - small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters;/* R5 contains the function call parameters. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0a; /* R10. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0b; /* R11. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0c; /* R12. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ulR13; /* R13 - small data read write area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* R14. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0f; /* R15. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R16. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R17. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R18. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13; /* R19. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R20. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R21. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16; /* R22. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17; /* R23. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18; /* R24. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R25. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1a; /* R26. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1b; /* R27. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1c; /* R28. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1d; /* R29. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1e; /* R30. */ + pxTopOfStack--; + + /* The MSR is stacked between R30 and R31. */ + *pxTopOfStack = portINITIAL_MSR_STATE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x1f; /* R31. */ + pxTopOfStack--; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void ( __FreeRTOS_interrupt_Handler )( void ); +extern void ( vStartFirstTask )( void ); + + + /* Setup the FreeRTOS interrupt handler. Code copied from crt0.s. */ + asm volatile ( "la r6, r0, __FreeRTOS_interrupt_handler \n\t" \ + "sw r6, r1, r0 \n\t" \ + "lhu r7, r1, r0 \n\t" \ + "shi r7, r0, 0x12 \n\t" \ + "shi r6, r0, 0x16 " ); + + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + prvSetupTimerInterrupt(); + + /* Allocate the stack to be used by the interrupt handler. */ + pulISRStack = ( uint32_t * ) pvPortMalloc( configMINIMAL_STACK_SIZE * sizeof( StackType_t ) ); + + /* Restore the context of the first task that is going to run. */ + if( pulISRStack != NULL ) + { + /* Fill the ISR stack with a known value to facilitate debugging. */ + memset( pulISRStack, portISR_STACK_FILL_VALUE, configMINIMAL_STACK_SIZE * sizeof( StackType_t ) ); + pulISRStack += ( configMINIMAL_STACK_SIZE - 1 ); + + /* Kick off the first task. */ + vStartFirstTask(); + } + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +void vPortYield( void ) +{ +extern void VPortYieldASM( void ); + + /* Perform the context switch in a critical section to assure it is + not interrupted by the tick ISR. It is not a problem to do this as + each task maintains it's own interrupt status. */ + portENTER_CRITICAL(); + /* Jump directly to the yield function to ensure there is no + compiler generated prologue code. */ + asm volatile ( "bralid r14, VPortYieldASM \n\t" \ + "or r0, r0, r0 \n\t" ); + portEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ) +{ +XTmrCtr xTimer; +const uint32_t ulCounterValue = configCPU_CLOCK_HZ / configTICK_RATE_HZ; +UBaseType_t uxMask; + + /* The OPB timer1 is used to generate the tick. Use the provided library + functions to enable the timer and set the tick frequency. */ + XTmrCtr_mDisable( XPAR_OPB_TIMER_1_BASEADDR, XPAR_OPB_TIMER_1_DEVICE_ID ); + XTmrCtr_Initialize( &xTimer, XPAR_OPB_TIMER_1_DEVICE_ID ); + XTmrCtr_mSetLoadReg( XPAR_OPB_TIMER_1_BASEADDR, portCOUNTER_0, ulCounterValue ); + XTmrCtr_mSetControlStatusReg( XPAR_OPB_TIMER_1_BASEADDR, portCOUNTER_0, XTC_CSR_LOAD_MASK | XTC_CSR_INT_OCCURED_MASK ); + + /* Set the timer interrupt enable bit while maintaining the other bit + states. */ + uxMask = XIntc_In32( ( XPAR_OPB_INTC_0_BASEADDR + XIN_IER_OFFSET ) ); + uxMask |= XPAR_OPB_TIMER_1_INTERRUPT_MASK; + XIntc_Out32( ( XPAR_OPB_INTC_0_BASEADDR + XIN_IER_OFFSET ), ( uxMask ) ); + + XTmrCtr_Start( &xTimer, XPAR_OPB_TIMER_1_DEVICE_ID ); + XTmrCtr_mSetControlStatusReg(XPAR_OPB_TIMER_1_BASEADDR, portCOUNTER_0, XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK | XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK | XTC_CSR_INT_OCCURED_MASK ); + XIntc_mAckIntr( XPAR_INTC_SINGLE_BASEADDR, 1 ); +} +/*-----------------------------------------------------------*/ + +/* + * The interrupt handler placed in the interrupt vector when the scheduler is + * started. The task context has already been saved when this is called. + * This handler determines the interrupt source and calls the relevant + * peripheral handler. + */ +void vTaskISRHandler( void ) +{ +static uint32_t ulPending; + + /* Which interrupts are pending? */ + ulPending = XIntc_In32( ( XPAR_INTC_SINGLE_BASEADDR + XIN_IVR_OFFSET ) ); + + if( ulPending < XPAR_INTC_MAX_NUM_INTR_INPUTS ) + { + static XIntc_VectorTableEntry *pxTablePtr; + static XIntc_Config *pxConfig; + static uint32_t ulInterruptMask; + + ulInterruptMask = ( uint32_t ) 1 << ulPending; + + /* Get the configuration data using the device ID */ + pxConfig = &XIntc_ConfigTable[ ( uint32_t ) XPAR_INTC_SINGLE_DEVICE_ID ]; + + pxTablePtr = &( pxConfig->HandlerTable[ ulPending ] ); + if( pxConfig->AckBeforeService & ( ulInterruptMask ) ) + { + XIntc_mAckIntr( pxConfig->BaseAddress, ulInterruptMask ); + pxTablePtr->Handler( pxTablePtr->CallBackRef ); + } + else + { + pxTablePtr->Handler( pxTablePtr->CallBackRef ); + XIntc_mAckIntr( pxConfig->BaseAddress, ulInterruptMask ); + } + } +} +/*-----------------------------------------------------------*/ + +/* + * Handler for the timer interrupt. + */ +void vTickISR( void *pvBaseAddress ) +{ +uint32_t ulCSR; + + /* Increment the RTOS tick - this might cause a task to unblock. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the timer interrupt */ + ulCSR = XTmrCtr_mGetControlStatusReg(XPAR_OPB_TIMER_1_BASEADDR, 0); + XTmrCtr_mSetControlStatusReg( XPAR_OPB_TIMER_1_BASEADDR, portCOUNTER_0, ulCSR ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portasm.s new file mode 100644 index 0000000..c7a7f9f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portasm.s @@ -0,0 +1,198 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + .extern pxCurrentTCB + .extern vTaskISRHandler + .extern vTaskSwitchContext + .extern uxCriticalNesting + .extern pulISRStack + + .global __FreeRTOS_interrupt_handler + .global VPortYieldASM + .global vStartFirstTask + + +.macro portSAVE_CONTEXT + /* Make room for the context on the stack. */ + addik r1, r1, -132 + /* Save r31 so it can then be used. */ + swi r31, r1, 4 + /* Copy the msr into r31 - this is stacked later. */ + mfs r31, rmsr + /* Stack general registers. */ + swi r30, r1, 12 + swi r29, r1, 16 + swi r28, r1, 20 + swi r27, r1, 24 + swi r26, r1, 28 + swi r25, r1, 32 + swi r24, r1, 36 + swi r23, r1, 40 + swi r22, r1, 44 + swi r21, r1, 48 + swi r20, r1, 52 + swi r19, r1, 56 + swi r18, r1, 60 + swi r17, r1, 64 + swi r16, r1, 68 + swi r15, r1, 72 + swi r13, r1, 80 + swi r12, r1, 84 + swi r11, r1, 88 + swi r10, r1, 92 + swi r9, r1, 96 + swi r8, r1, 100 + swi r7, r1, 104 + swi r6, r1, 108 + swi r5, r1, 112 + swi r4, r1, 116 + swi r3, r1, 120 + swi r2, r1, 124 + /* Stack the critical section nesting value. */ + lwi r3, r0, uxCriticalNesting + swi r3, r1, 128 + /* Save the top of stack value to the TCB. */ + lwi r3, r0, pxCurrentTCB + sw r1, r0, r3 + + .endm + +.macro portRESTORE_CONTEXT + /* Load the top of stack value from the TCB. */ + lwi r3, r0, pxCurrentTCB + lw r1, r0, r3 + /* Restore the general registers. */ + lwi r31, r1, 4 + lwi r30, r1, 12 + lwi r29, r1, 16 + lwi r28, r1, 20 + lwi r27, r1, 24 + lwi r26, r1, 28 + lwi r25, r1, 32 + lwi r24, r1, 36 + lwi r23, r1, 40 + lwi r22, r1, 44 + lwi r21, r1, 48 + lwi r20, r1, 52 + lwi r19, r1, 56 + lwi r18, r1, 60 + lwi r17, r1, 64 + lwi r16, r1, 68 + lwi r15, r1, 72 + lwi r14, r1, 76 + lwi r13, r1, 80 + lwi r12, r1, 84 + lwi r11, r1, 88 + lwi r10, r1, 92 + lwi r9, r1, 96 + lwi r8, r1, 100 + lwi r7, r1, 104 + lwi r6, r1, 108 + lwi r5, r1, 112 + lwi r4, r1, 116 + lwi r2, r1, 124 + + /* Load the critical nesting value. */ + lwi r3, r1, 128 + swi r3, r0, uxCriticalNesting + + /* Obtain the MSR value from the stack. */ + lwi r3, r1, 8 + + /* Are interrupts enabled in the MSR? If so return using an return from + interrupt instruction to ensure interrupts are enabled only once the task + is running again. */ + andi r3, r3, 2 + beqid r3, 36 + or r0, r0, r0 + + /* Reload the rmsr from the stack, clear the enable interrupt bit in the + value before saving back to rmsr register, then return enabling interrupts + as we return. */ + lwi r3, r1, 8 + andi r3, r3, ~2 + mts rmsr, r3 + lwi r3, r1, 120 + addik r1, r1, 132 + rtid r14, 0 + or r0, r0, r0 + + /* Reload the rmsr from the stack, place it in the rmsr register, and + return without enabling interrupts. */ + lwi r3, r1, 8 + mts rmsr, r3 + lwi r3, r1, 120 + addik r1, r1, 132 + rtsd r14, 0 + or r0, r0, r0 + + .endm + + .text + .align 2 + + +__FreeRTOS_interrupt_handler: + portSAVE_CONTEXT + /* Entered via an interrupt so interrupts must be enabled in msr. */ + ori r31, r31, 2 + /* Stack msr. */ + swi r31, r1, 8 + /* Stack the return address. As we entered via an interrupt we do + not need to modify the return address prior to stacking. */ + swi r14, r1, 76 + /* Now switch to use the ISR stack. */ + lwi r3, r0, pulISRStack + add r1, r3, r0 + bralid r15, vTaskISRHandler + or r0, r0, r0 + portRESTORE_CONTEXT + + +VPortYieldASM: + portSAVE_CONTEXT + /* Stack msr. */ + swi r31, r1, 8 + /* Modify the return address so we return to the instruction after the + exception. */ + addi r14, r14, 8 + swi r14, r1, 76 + /* Now switch to use the ISR stack. */ + lwi r3, r0, pulISRStack + add r1, r3, r0 + bralid r15, vTaskSwitchContext + or r0, r0, r0 + portRESTORE_CONTEXT + +vStartFirstTask: + portRESTORE_CONTEXT + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portmacro.h new file mode 100644 index 0000000..dbaff87 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portmacro.h @@ -0,0 +1,127 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +void microblaze_disable_interrupts( void ); +void microblaze_enable_interrupts( void ); +#define portDISABLE_INTERRUPTS() microblaze_disable_interrupts() +#define portENABLE_INTERRUPTS() microblaze_enable_interrupts() +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vPortEnterCritical( void ); +void vPortExitCritical( void ); +#define portENTER_CRITICAL() { \ + extern UBaseType_t uxCriticalNesting; \ + microblaze_disable_interrupts(); \ + uxCriticalNesting++; \ + } + +#define portEXIT_CRITICAL() { \ + extern UBaseType_t uxCriticalNesting; \ + /* Interrupts are disabled, so we can */ \ + /* access the variable directly. */ \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + /* The nesting has unwound and we \ + can enable interrupts again. */ \ + portENABLE_INTERRUPTS(); \ + } \ + } + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +void vPortYield( void ); +#define portYIELD() vPortYield() + +void vTaskSwitchContext(); +#define portYIELD_FROM_ISR() vTaskSwitchContext() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port.c new file mode 100644 index 0000000..66ae0bc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port.c @@ -0,0 +1,452 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MicroBlaze port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Standard includes. */ +#include + +/* Hardware includes. */ +#include +#include +#include + +/* Tasks are started with a critical section nesting of 0 - however, prior to +the scheduler being commenced interrupts should not be enabled, so the critical +nesting variable is initialised to a non-zero value. */ +#define portINITIAL_NESTING_VALUE ( 0xff ) + +/* The bit within the MSR register that enabled/disables interrupts and +exceptions respectively. */ +#define portMSR_IE ( 0x02U ) +#define portMSR_EE ( 0x100U ) + +/* If the floating point unit is included in the MicroBlaze build, then the +FSR register is saved as part of the task context. portINITIAL_FSR is the value +given to the FSR register when the initial context is set up for a task being +created. */ +#define portINITIAL_FSR ( 0U ) +/*-----------------------------------------------------------*/ + +/* + * Initialise the interrupt controller instance. + */ +static int32_t prvInitialiseInterruptController( void ); + +/* Ensure the interrupt controller instance variable is initialised before it is + * used, and that the initialisation only happens once. + */ +static int32_t prvEnsureInterruptControllerIsInitialised( void ); + +/*-----------------------------------------------------------*/ + +/* Counts the nesting depth of calls to portENTER_CRITICAL(). Each task +maintains its own count, so this variable is saved as part of the task +context. */ +volatile UBaseType_t uxCriticalNesting = portINITIAL_NESTING_VALUE; + +/* This port uses a separate stack for interrupts. This prevents the stack of +every task needing to be large enough to hold an entire interrupt stack on top +of the task stack. */ +uint32_t *pulISRStack; + +/* If an interrupt requests a context switch, then ulTaskSwitchRequested will +get set to 1. ulTaskSwitchRequested is inspected just before the main interrupt +handler exits. If, at that time, ulTaskSwitchRequested is set to 1, the kernel +will call vTaskSwitchContext() to ensure the task that runs immediately after +the interrupt exists is the highest priority task that is able to run. This is +an unusual mechanism, but is used for this port because a single interrupt can +cause the servicing of multiple peripherals - and it is inefficient to call +vTaskSwitchContext() multiple times as each peripheral is serviced. */ +volatile uint32_t ulTaskSwitchRequested = 0UL; + +/* The instance of the interrupt controller used by this port. This is required +by the Xilinx library API functions. */ +static XIntc xInterruptControllerInstance; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been made. + * + * See the portable.h header file. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +extern void * _SDA2_BASE_; +extern void * _SDA_BASE_; +const uint32_t ulR2 = ( uint32_t ) &_SDA2_BASE_; +const uint32_t ulR13 = ( uint32_t ) &_SDA_BASE_; + + /* Place a few bytes of known values on the bottom of the stack. + This is essential for the Microblaze port and these lines must + not be omitted. */ + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* The FSR value placed in the initial task context is just 0. */ + *pxTopOfStack = portINITIAL_FSR; + pxTopOfStack--; + #endif + + /* The MSR value placed in the initial task context should have interrupts + disabled. Each task will enable interrupts automatically when it enters + the running state for the first time. */ + *pxTopOfStack = mfmsr() & ~portMSR_IE; + + #if( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) + { + /* Ensure exceptions are enabled for the task. */ + *pxTopOfStack |= portMSR_EE; + } + #endif + + pxTopOfStack--; + + /* First stack an initial value for the critical section nesting. This + is initialised to zero. */ + *pxTopOfStack = ( StackType_t ) 0x00; + + /* R0 is always zero. */ + /* R1 is the SP. */ + + /* Place an initial value for all the general purpose registers. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ulR2; /* R2 - read only small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 - return values and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 - return values and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters;/* R5 contains the function call parameters. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 - other parameters and temporaries. Used as the return address from vPortTaskEntryPoint. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0a; /* R10 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0b; /* R11 - temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0c; /* R12 - temporaries. */ + pxTopOfStack--; + #else + pxTopOfStack-= 8; + #endif + + *pxTopOfStack = ( StackType_t ) ulR13; /* R13 - read/write small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* R14 - return address for interrupt. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; /* R15 - return address for subroutine. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R16 - return address for trap (debugger). */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R17 - return address for exceptions, if configured. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R18 - reserved for assembler and compiler temporaries. */ + pxTopOfStack--; + #else + pxTopOfStack -= 4; + #endif + + *pxTopOfStack = ( StackType_t ) 0x00; /* R19 - must be saved across function calls. Callee-save. Seems to be interpreted as the frame pointer. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R20 - reserved for storing a pointer to the Global Offset Table (GOT) in Position Independent Code (PIC). Non-volatile in non-PIC code. Must be saved across function calls. Callee-save. Not used by FreeRTOS. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R21 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16; /* R22 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17; /* R23 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18; /* R24 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R25 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1a; /* R26 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1b; /* R27 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1c; /* R28 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1d; /* R29 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1e; /* R30 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1f; /* R31 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + #else + pxTopOfStack -= 13; + #endif + + /* Return a pointer to the top of the stack that has been generated so this + can be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void ( vPortStartFirstTask )( void ); +extern uint32_t _stack[]; + + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. + + This port uses an application defined callback function to install the tick + interrupt handler because the kernel will run on lots of different + MicroBlaze and FPGA configurations - not all of which will have the same + timer peripherals defined or available. An example definition of + vApplicationSetupTimerInterrupt() is provided in the official demo + application that accompanies this port. */ + vApplicationSetupTimerInterrupt(); + + /* Reuse the stack from main() as the stack for the interrupts/exceptions. */ + pulISRStack = ( uint32_t * ) _stack; + + /* Ensure there is enough space for the functions called from the interrupt + service routines to write back into the stack frame of the caller. */ + pulISRStack -= 2; + + /* Restore the context of the first task that is going to run. From here + on, the created tasks will be executing. */ + vPortStartFirstTask(); + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +void vPortYield( void ) +{ +extern void VPortYieldASM( void ); + + /* Perform the context switch in a critical section to assure it is + not interrupted by the tick ISR. It is not a problem to do this as + each task maintains its own interrupt status. */ + portENTER_CRITICAL(); + { + /* Jump directly to the yield function to ensure there is no + compiler generated prologue code. */ + asm volatile ( "bralid r14, VPortYieldASM \n\t" \ + "or r0, r0, r0 \n\t" ); + } + portEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +void vPortEnableInterrupt( uint8_t ucInterruptID ) +{ +int32_t lReturn; + + /* An API function is provided to enable an interrupt in the interrupt + controller because the interrupt controller instance variable is private + to this file. */ + lReturn = prvEnsureInterruptControllerIsInitialised(); + if( lReturn == pdPASS ) + { + XIntc_Enable( &xInterruptControllerInstance, ucInterruptID ); + } + + configASSERT( lReturn ); +} +/*-----------------------------------------------------------*/ + +void vPortDisableInterrupt( uint8_t ucInterruptID ) +{ +int32_t lReturn; + + /* An API function is provided to disable an interrupt in the interrupt + controller because the interrupt controller instance variable is private + to this file. */ + lReturn = prvEnsureInterruptControllerIsInitialised(); + + if( lReturn == pdPASS ) + { + XIntc_Disable( &xInterruptControllerInstance, ucInterruptID ); + } + + configASSERT( lReturn ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ) +{ +int32_t lReturn; + + /* An API function is provided to install an interrupt handler because the + interrupt controller instance variable is private to this file. */ + + lReturn = prvEnsureInterruptControllerIsInitialised(); + + if( lReturn == pdPASS ) + { + lReturn = XIntc_Connect( &xInterruptControllerInstance, ucInterruptID, pxHandler, pvCallBackRef ); + } + + if( lReturn == XST_SUCCESS ) + { + lReturn = pdPASS; + } + + configASSERT( lReturn == pdPASS ); + + return lReturn; +} +/*-----------------------------------------------------------*/ + +static int32_t prvEnsureInterruptControllerIsInitialised( void ) +{ +static int32_t lInterruptControllerInitialised = pdFALSE; +int32_t lReturn; + + /* Ensure the interrupt controller instance variable is initialised before + it is used, and that the initialisation only happens once. */ + if( lInterruptControllerInitialised != pdTRUE ) + { + lReturn = prvInitialiseInterruptController(); + + if( lReturn == pdPASS ) + { + lInterruptControllerInitialised = pdTRUE; + } + } + else + { + lReturn = pdPASS; + } + + return lReturn; +} +/*-----------------------------------------------------------*/ + +/* + * Handler for the timer interrupt. This is the handler that the application + * defined callback function vApplicationSetupTimerInterrupt() should install. + */ +void vPortTickISR( void *pvUnused ) +{ +extern void vApplicationClearTimerInterrupt( void ); + + /* Ensure the unused parameter does not generate a compiler warning. */ + ( void ) pvUnused; + + /* This port uses an application defined callback function to clear the tick + interrupt because the kernel will run on lots of different MicroBlaze and + FPGA configurations - not all of which will have the same timer peripherals + defined or available. An example definition of + vApplicationClearTimerInterrupt() is provided in the official demo + application that accompanies this port. */ + vApplicationClearTimerInterrupt(); + + /* Increment the RTOS tick - this might cause a task to unblock. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Force vTaskSwitchContext() to be called as the interrupt exits. */ + ulTaskSwitchRequested = 1; + } +} +/*-----------------------------------------------------------*/ + +static int32_t prvInitialiseInterruptController( void ) +{ +int32_t lStatus; + + lStatus = XIntc_Initialize( &xInterruptControllerInstance, configINTERRUPT_CONTROLLER_TO_USE ); + + if( lStatus == XST_SUCCESS ) + { + /* Initialise the exception table. */ + Xil_ExceptionInit(); + + /* Service all pending interrupts each time the handler is entered. */ + XIntc_SetIntrSvcOption( xInterruptControllerInstance.BaseAddress, XIN_SVC_ALL_ISRS_OPTION ); + + /* Install exception handlers if the MicroBlaze is configured to handle + exceptions, and the application defined constant + configINSTALL_EXCEPTION_HANDLERS is set to 1. */ + #if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + { + vPortExceptionsInstallHandlers(); + } + #endif /* MICROBLAZE_EXCEPTIONS_ENABLED */ + + /* Start the interrupt controller. Interrupts are enabled when the + scheduler starts. */ + lStatus = XIntc_Start( &xInterruptControllerInstance, XIN_REAL_MODE ); + + if( lStatus == XST_SUCCESS ) + { + lStatus = pdPASS; + } + else + { + lStatus = pdFAIL; + } + } + + configASSERT( lStatus == pdPASS ); + + return lStatus; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port_exceptions.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port_exceptions.c new file mode 100644 index 0000000..ab0cf51 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port_exceptions.c @@ -0,0 +1,283 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware includes. */ +#include +#include + +/* The Xilinx library defined exception entry point stacks a number of +registers. These definitions are offsets from the stack pointer to the various +stacked register values. */ +#define portexR3_STACK_OFFSET 4 +#define portexR4_STACK_OFFSET 5 +#define portexR5_STACK_OFFSET 6 +#define portexR6_STACK_OFFSET 7 +#define portexR7_STACK_OFFSET 8 +#define portexR8_STACK_OFFSET 9 +#define portexR9_STACK_OFFSET 10 +#define portexR10_STACK_OFFSET 11 +#define portexR11_STACK_OFFSET 12 +#define portexR12_STACK_OFFSET 13 +#define portexR15_STACK_OFFSET 16 +#define portexR18_STACK_OFFSET 19 +#define portexMSR_STACK_OFFSET 20 +#define portexR19_STACK_OFFSET -1 + +/* This is defined to equal the size, in bytes, of the stack frame generated by +the Xilinx standard library exception entry point. It is required to determine +the stack pointer value prior to the exception being entered. */ +#define portexASM_HANDLER_STACK_FRAME_SIZE 84UL + +/* The number of bytes a MicroBlaze instruction consumes. */ +#define portexINSTRUCTION_SIZE 4 + +/* Exclude this entire file if the MicroBlaze is not configured to handle +exceptions, or the application defined configuration constant +configINSTALL_EXCEPTION_HANDLERS is not set to 1. */ +#if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + +/* This variable is set in the exception entry code, before +vPortExceptionHandler is called. */ +uint32_t *pulStackPointerOnFunctionEntry = NULL; + +/* This is the structure that is filled with the MicroBlaze context as it +existed immediately prior to the exception occurrence. A pointer to this +structure is passed into the vApplicationExceptionRegisterDump() callback +function, if one is defined. */ +static xPortRegisterDump xRegisterDump; + +/* This is the FreeRTOS exception handler that is installed for all exception +types. It is called from vPortExceptionHanlderEntry() - which is itself defined +in portasm.S. */ +void vPortExceptionHandler( void *pvExceptionID ); +extern void vPortExceptionHandlerEntry( void *pvExceptionID ); + +/*-----------------------------------------------------------*/ + +/* vApplicationExceptionRegisterDump() is a callback function that the +application can optionally define to receive a populated xPortRegisterDump +structure. If the application chooses not to define a version of +vApplicationExceptionRegisterDump() then this weekly defined default +implementation will be called instead. */ +extern void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ) __attribute__((weak)); +void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ) +{ + ( void ) xRegisterDump; + + for( ;; ) + { + portNOP(); + } +} +/*-----------------------------------------------------------*/ + +void vPortExceptionHandler( void *pvExceptionID ) +{ +extern void *pxCurrentTCB; + + /* Fill an xPortRegisterDump structure with the MicroBlaze context as it + was immediately before the exception occurrence. */ + + /* First fill in the name and handle of the task that was in the Running + state when the exception occurred. */ + xRegisterDump.xCurrentTaskHandle = pxCurrentTCB; + xRegisterDump.pcCurrentTaskName = pcTaskGetName( NULL ); + + configASSERT( pulStackPointerOnFunctionEntry ); + + /* Obtain the values of registers that were stacked prior to this function + being called, and may have changed since they were stacked. */ + xRegisterDump.ulR3 = pulStackPointerOnFunctionEntry[ portexR3_STACK_OFFSET ]; + xRegisterDump.ulR4 = pulStackPointerOnFunctionEntry[ portexR4_STACK_OFFSET ]; + xRegisterDump.ulR5 = pulStackPointerOnFunctionEntry[ portexR5_STACK_OFFSET ]; + xRegisterDump.ulR6 = pulStackPointerOnFunctionEntry[ portexR6_STACK_OFFSET ]; + xRegisterDump.ulR7 = pulStackPointerOnFunctionEntry[ portexR7_STACK_OFFSET ]; + xRegisterDump.ulR8 = pulStackPointerOnFunctionEntry[ portexR8_STACK_OFFSET ]; + xRegisterDump.ulR9 = pulStackPointerOnFunctionEntry[ portexR9_STACK_OFFSET ]; + xRegisterDump.ulR10 = pulStackPointerOnFunctionEntry[ portexR10_STACK_OFFSET ]; + xRegisterDump.ulR11 = pulStackPointerOnFunctionEntry[ portexR11_STACK_OFFSET ]; + xRegisterDump.ulR12 = pulStackPointerOnFunctionEntry[ portexR12_STACK_OFFSET ]; + xRegisterDump.ulR15_return_address_from_subroutine = pulStackPointerOnFunctionEntry[ portexR15_STACK_OFFSET ]; + xRegisterDump.ulR18 = pulStackPointerOnFunctionEntry[ portexR18_STACK_OFFSET ]; + xRegisterDump.ulR19 = pulStackPointerOnFunctionEntry[ portexR19_STACK_OFFSET ]; + xRegisterDump.ulMSR = pulStackPointerOnFunctionEntry[ portexMSR_STACK_OFFSET ]; + + /* Obtain the value of all other registers. */ + xRegisterDump.ulR2_small_data_area = mfgpr( R2 ); + xRegisterDump.ulR13_read_write_small_data_area = mfgpr( R13 ); + xRegisterDump.ulR14_return_address_from_interrupt = mfgpr( R14 ); + xRegisterDump.ulR16_return_address_from_trap = mfgpr( R16 ); + xRegisterDump.ulR17_return_address_from_exceptions = mfgpr( R17 ); + xRegisterDump.ulR20 = mfgpr( R20 ); + xRegisterDump.ulR21 = mfgpr( R21 ); + xRegisterDump.ulR22 = mfgpr( R22 ); + xRegisterDump.ulR23 = mfgpr( R23 ); + xRegisterDump.ulR24 = mfgpr( R24 ); + xRegisterDump.ulR25 = mfgpr( R25 ); + xRegisterDump.ulR26 = mfgpr( R26 ); + xRegisterDump.ulR27 = mfgpr( R27 ); + xRegisterDump.ulR28 = mfgpr( R28 ); + xRegisterDump.ulR29 = mfgpr( R29 ); + xRegisterDump.ulR30 = mfgpr( R30 ); + xRegisterDump.ulR31 = mfgpr( R31 ); + xRegisterDump.ulR1_SP = ( ( uint32_t ) pulStackPointerOnFunctionEntry ) + portexASM_HANDLER_STACK_FRAME_SIZE; + xRegisterDump.ulEAR = mfear(); + xRegisterDump.ulESR = mfesr(); + xRegisterDump.ulEDR = mfedr(); + + /* Move the saved program counter back to the instruction that was executed + when the exception occurred. This is only valid for certain types of + exception. */ + xRegisterDump.ulPC = xRegisterDump.ulR17_return_address_from_exceptions - portexINSTRUCTION_SIZE; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + { + xRegisterDump.ulFSR = mffsr(); + } + #else + { + xRegisterDump.ulFSR = 0UL; + } + #endif + + /* Also fill in a string that describes what type of exception this is. + The string uses the same ID names as defined in the MicroBlaze standard + library exception header files. */ + switch( ( uint32_t ) pvExceptionID ) + { + case XEXC_ID_FSL : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FSL"; + break; + + case XEXC_ID_UNALIGNED_ACCESS : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_UNALIGNED_ACCESS"; + break; + + case XEXC_ID_ILLEGAL_OPCODE : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_ILLEGAL_OPCODE"; + break; + + case XEXC_ID_M_AXI_I_EXCEPTION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_I_EXCEPTION or XEXC_ID_IPLB_EXCEPTION"; + break; + + case XEXC_ID_M_AXI_D_EXCEPTION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_D_EXCEPTION or XEXC_ID_DPLB_EXCEPTION"; + break; + + case XEXC_ID_DIV_BY_ZERO : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_DIV_BY_ZERO"; + break; + + case XEXC_ID_STACK_VIOLATION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_STACK_VIOLATION or XEXC_ID_MMU"; + break; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + + case XEXC_ID_FPU : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FPU see ulFSR value"; + break; + + #endif /* XPAR_MICROBLAZE_USE_FPU */ + } + + /* vApplicationExceptionRegisterDump() is a callback function that the + application can optionally define to receive the populated xPortRegisterDump + structure. If the application chooses not to define a version of + vApplicationExceptionRegisterDump() then the weekly defined default + implementation within this file will be called instead. */ + vApplicationExceptionRegisterDump( &xRegisterDump ); + + /* Must not attempt to leave this function! */ + for( ;; ) + { + portNOP(); + } +} +/*-----------------------------------------------------------*/ + +void vPortExceptionsInstallHandlers( void ) +{ +static uint32_t ulHandlersAlreadyInstalled = pdFALSE; + + if( ulHandlersAlreadyInstalled == pdFALSE ) + { + ulHandlersAlreadyInstalled = pdTRUE; + + #if XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS == 1 + microblaze_register_exception_handler( XEXC_ID_UNALIGNED_ACCESS, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_UNALIGNED_ACCESS ); + #endif /* XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS*/ + + #if XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_ILLEGAL_OPCODE, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_ILLEGAL_OPCODE ); + #endif /* XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION */ + + #if XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_M_AXI_I_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_I_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_M_AXI_D_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_D_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_IPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_IPLB_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_DPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DPLB_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_DIV_BY_ZERO, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DIV_BY_ZERO ); + #endif /* XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION */ + + #if XPAR_MICROBLAZE_FPU_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_FPU, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FPU ); + #endif /* XPAR_MICROBLAZE_FPU_EXCEPTION */ + + #if XPAR_MICROBLAZE_FSL_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_FSL, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FSL ); + #endif /* XPAR_MICROBLAZE_FSL_EXCEPTION */ + + microblaze_enable_exceptions(); + } +} + +/* Exclude the entire file if the MicroBlaze is not configured to handle +exceptions, or the application defined configuration item +configINSTALL_EXCEPTION_HANDLERS is not set to 1. */ +#endif /* ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) */ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portasm.S new file mode 100644 index 0000000..be9e616 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portasm.S @@ -0,0 +1,329 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/* Xilinx library includes. */ +#include "microblaze_exceptions_g.h" +#include "xparameters.h" + +/* The context is oversized to allow functions called from the ISR to write +back into the caller stack. */ +#if( XPAR_MICROBLAZE_USE_FPU != 0 ) + #define portCONTEXT_SIZE 136 + #define portMINUS_CONTEXT_SIZE -136 +#else + #define portCONTEXT_SIZE 132 + #define portMINUS_CONTEXT_SIZE -132 +#endif + +/* Offsets from the stack pointer at which saved registers are placed. */ +#define portR31_OFFSET 4 +#define portR30_OFFSET 8 +#define portR29_OFFSET 12 +#define portR28_OFFSET 16 +#define portR27_OFFSET 20 +#define portR26_OFFSET 24 +#define portR25_OFFSET 28 +#define portR24_OFFSET 32 +#define portR23_OFFSET 36 +#define portR22_OFFSET 40 +#define portR21_OFFSET 44 +#define portR20_OFFSET 48 +#define portR19_OFFSET 52 +#define portR18_OFFSET 56 +#define portR17_OFFSET 60 +#define portR16_OFFSET 64 +#define portR15_OFFSET 68 +#define portR14_OFFSET 72 +#define portR13_OFFSET 76 +#define portR12_OFFSET 80 +#define portR11_OFFSET 84 +#define portR10_OFFSET 88 +#define portR9_OFFSET 92 +#define portR8_OFFSET 96 +#define portR7_OFFSET 100 +#define portR6_OFFSET 104 +#define portR5_OFFSET 108 +#define portR4_OFFSET 112 +#define portR3_OFFSET 116 +#define portR2_OFFSET 120 +#define portCRITICAL_NESTING_OFFSET 124 +#define portMSR_OFFSET 128 +#define portFSR_OFFSET 132 + + .extern pxCurrentTCB + .extern XIntc_DeviceInterruptHandler + .extern vTaskSwitchContext + .extern uxCriticalNesting + .extern pulISRStack + .extern ulTaskSwitchRequested + .extern vPortExceptionHandler + .extern pulStackPointerOnFunctionEntry + + .global _interrupt_handler + .global VPortYieldASM + .global vPortStartFirstTask + .global vPortExceptionHandlerEntry + + +.macro portSAVE_CONTEXT + + /* Make room for the context on the stack. */ + addik r1, r1, portMINUS_CONTEXT_SIZE + + /* Stack general registers. */ + swi r31, r1, portR31_OFFSET + swi r30, r1, portR30_OFFSET + swi r29, r1, portR29_OFFSET + swi r28, r1, portR28_OFFSET + swi r27, r1, portR27_OFFSET + swi r26, r1, portR26_OFFSET + swi r25, r1, portR25_OFFSET + swi r24, r1, portR24_OFFSET + swi r23, r1, portR23_OFFSET + swi r22, r1, portR22_OFFSET + swi r21, r1, portR21_OFFSET + swi r20, r1, portR20_OFFSET + swi r19, r1, portR19_OFFSET + swi r18, r1, portR18_OFFSET + swi r17, r1, portR17_OFFSET + swi r16, r1, portR16_OFFSET + swi r15, r1, portR15_OFFSET + /* R14 is saved later as it needs adjustment if a yield is performed. */ + swi r13, r1, portR13_OFFSET + swi r12, r1, portR12_OFFSET + swi r11, r1, portR11_OFFSET + swi r10, r1, portR10_OFFSET + swi r9, r1, portR9_OFFSET + swi r8, r1, portR8_OFFSET + swi r7, r1, portR7_OFFSET + swi r6, r1, portR6_OFFSET + swi r5, r1, portR5_OFFSET + swi r4, r1, portR4_OFFSET + swi r3, r1, portR3_OFFSET + swi r2, r1, portR2_OFFSET + + /* Stack the critical section nesting value. */ + lwi r18, r0, uxCriticalNesting + swi r18, r1, portCRITICAL_NESTING_OFFSET + + /* Stack MSR. */ + mfs r18, rmsr + swi r18, r1, portMSR_OFFSET + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* Stack FSR. */ + mfs r18, rfsr + swi r18, r1, portFSR_OFFSET + #endif + + /* Save the top of stack value to the TCB. */ + lwi r3, r0, pxCurrentTCB + sw r1, r0, r3 + + .endm + +.macro portRESTORE_CONTEXT + + /* Load the top of stack value from the TCB. */ + lwi r18, r0, pxCurrentTCB + lw r1, r0, r18 + + /* Restore the general registers. */ + lwi r31, r1, portR31_OFFSET + lwi r30, r1, portR30_OFFSET + lwi r29, r1, portR29_OFFSET + lwi r28, r1, portR28_OFFSET + lwi r27, r1, portR27_OFFSET + lwi r26, r1, portR26_OFFSET + lwi r25, r1, portR25_OFFSET + lwi r24, r1, portR24_OFFSET + lwi r23, r1, portR23_OFFSET + lwi r22, r1, portR22_OFFSET + lwi r21, r1, portR21_OFFSET + lwi r20, r1, portR20_OFFSET + lwi r19, r1, portR19_OFFSET + lwi r17, r1, portR17_OFFSET + lwi r16, r1, portR16_OFFSET + lwi r15, r1, portR15_OFFSET + lwi r14, r1, portR14_OFFSET + lwi r13, r1, portR13_OFFSET + lwi r12, r1, portR12_OFFSET + lwi r11, r1, portR11_OFFSET + lwi r10, r1, portR10_OFFSET + lwi r9, r1, portR9_OFFSET + lwi r8, r1, portR8_OFFSET + lwi r7, r1, portR7_OFFSET + lwi r6, r1, portR6_OFFSET + lwi r5, r1, portR5_OFFSET + lwi r4, r1, portR4_OFFSET + lwi r3, r1, portR3_OFFSET + lwi r2, r1, portR2_OFFSET + + /* Reload the rmsr from the stack. */ + lwi r18, r1, portMSR_OFFSET + mts rmsr, r18 + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* Reload the FSR from the stack. */ + lwi r18, r1, portFSR_OFFSET + mts rfsr, r18 + #endif + + /* Load the critical nesting value. */ + lwi r18, r1, portCRITICAL_NESTING_OFFSET + swi r18, r0, uxCriticalNesting + + /* Test the critical nesting value. If it is non zero then the task last + exited the running state using a yield. If it is zero, then the task + last exited the running state through an interrupt. */ + xori r18, r18, 0 + bnei r18, exit_from_yield + + /* r18 was being used as a temporary. Now restore its true value from the + stack. */ + lwi r18, r1, portR18_OFFSET + + /* Remove the stack frame. */ + addik r1, r1, portCONTEXT_SIZE + + /* Return using rtid so interrupts are re-enabled as this function is + exited. */ + rtid r14, 0 + or r0, r0, r0 + + .endm + +/* This function is used to exit portRESTORE_CONTEXT() if the task being +returned to last left the Running state by calling taskYIELD() (rather than +being preempted by an interrupt). */ + .text + .align 4 +exit_from_yield: + + /* r18 was being used as a temporary. Now restore its true value from the + stack. */ + lwi r18, r1, portR18_OFFSET + + /* Remove the stack frame. */ + addik r1, r1, portCONTEXT_SIZE + + /* Return to the task. */ + rtsd r14, 0 + or r0, r0, r0 + + + .text + .align 4 +_interrupt_handler: + + portSAVE_CONTEXT + + /* Stack the return address. */ + swi r14, r1, portR14_OFFSET + + /* Switch to the ISR stack. */ + lwi r1, r0, pulISRStack + + /* The parameter to the interrupt handler. */ + ori r5, r0, configINTERRUPT_CONTROLLER_TO_USE + + /* Execute any pending interrupts. */ + bralid r15, XIntc_DeviceInterruptHandler + or r0, r0, r0 + + /* See if a new task should be selected to execute. */ + lwi r18, r0, ulTaskSwitchRequested + or r18, r18, r0 + + /* If ulTaskSwitchRequested is already zero, then jump straight to + restoring the task that is already in the Running state. */ + beqi r18, task_switch_not_requested + + /* Set ulTaskSwitchRequested back to zero as a task switch is about to be + performed. */ + swi r0, r0, ulTaskSwitchRequested + + /* ulTaskSwitchRequested was not 0 when tested. Select the next task to + execute. */ + bralid r15, vTaskSwitchContext + or r0, r0, r0 + +task_switch_not_requested: + + /* Restore the context of the next task scheduled to execute. */ + portRESTORE_CONTEXT + + + .text + .align 4 +VPortYieldASM: + + portSAVE_CONTEXT + + /* Modify the return address so a return is done to the instruction after + the call to VPortYieldASM. */ + addi r14, r14, 8 + swi r14, r1, portR14_OFFSET + + /* Switch to use the ISR stack. */ + lwi r1, r0, pulISRStack + + /* Select the next task to execute. */ + bralid r15, vTaskSwitchContext + or r0, r0, r0 + + /* Restore the context of the next task scheduled to execute. */ + portRESTORE_CONTEXT + + .text + .align 4 +vPortStartFirstTask: + + portRESTORE_CONTEXT + + + +#if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + + .text + .align 4 +vPortExceptionHandlerEntry: + + /* Take a copy of the stack pointer before vPortExecptionHandler is called, + storing its value prior to the function stack frame being created. */ + swi r1, r0, pulStackPointerOnFunctionEntry + bralid r15, vPortExceptionHandler + or r0, r0, r0 + +#endif /* ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) */ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portmacro.h new file mode 100644 index 0000000..c0a07f3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portmacro.h @@ -0,0 +1,370 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* BSP includes. */ +#include +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros and functions. */ +void microblaze_disable_interrupts( void ); +void microblaze_enable_interrupts( void ); +#define portDISABLE_INTERRUPTS() microblaze_disable_interrupts() +#define portENABLE_INTERRUPTS() microblaze_enable_interrupts() +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vPortEnterCritical( void ); +void vPortExitCritical( void ); +#define portENTER_CRITICAL() { \ + extern volatile UBaseType_t uxCriticalNesting; \ + microblaze_disable_interrupts(); \ + uxCriticalNesting++; \ + } + +#define portEXIT_CRITICAL() { \ + extern volatile UBaseType_t uxCriticalNesting; \ + /* Interrupts are disabled, so we can */ \ + /* access the variable directly. */ \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + /* The nesting has unwound and we \ + can enable interrupts again. */ \ + portENABLE_INTERRUPTS(); \ + } \ + } + +/*-----------------------------------------------------------*/ + +/* The yield macro maps directly to the vPortYield() function. */ +void vPortYield( void ); +#define portYIELD() vPortYield() + +/* portYIELD_FROM_ISR() does not directly call vTaskSwitchContext(), but instead +sets a flag to say that a yield has been requested. The interrupt exit code +then checks this flag, and calls vTaskSwitchContext() before restoring a task +context, if the flag is not false. This is done to prevent multiple calls to +vTaskSwitchContext() being made from a single interrupt, as a single interrupt +can result in multiple peripherals being serviced. */ +extern volatile uint32_t ulTaskSwitchRequested; +#define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) ulTaskSwitchRequested = 1; } while( 0 ) + +#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* The following structure is used by the FreeRTOS exception handler. It is +filled with the MicroBlaze context as it was at the time the exception occurred. +This is done as an aid to debugging exception occurrences. */ +typedef struct PORT_REGISTER_DUMP +{ + /* The following structure members hold the values of the MicroBlaze + registers at the time the exception was raised. */ + uint32_t ulR1_SP; + uint32_t ulR2_small_data_area; + uint32_t ulR3; + uint32_t ulR4; + uint32_t ulR5; + uint32_t ulR6; + uint32_t ulR7; + uint32_t ulR8; + uint32_t ulR9; + uint32_t ulR10; + uint32_t ulR11; + uint32_t ulR12; + uint32_t ulR13_read_write_small_data_area; + uint32_t ulR14_return_address_from_interrupt; + uint32_t ulR15_return_address_from_subroutine; + uint32_t ulR16_return_address_from_trap; + uint32_t ulR17_return_address_from_exceptions; /* The exception entry code will copy the BTR into R17 if the exception occurred in the delay slot of a branch instruction. */ + uint32_t ulR18; + uint32_t ulR19; + uint32_t ulR20; + uint32_t ulR21; + uint32_t ulR22; + uint32_t ulR23; + uint32_t ulR24; + uint32_t ulR25; + uint32_t ulR26; + uint32_t ulR27; + uint32_t ulR28; + uint32_t ulR29; + uint32_t ulR30; + uint32_t ulR31; + uint32_t ulPC; + uint32_t ulESR; + uint32_t ulMSR; + uint32_t ulEAR; + uint32_t ulFSR; + uint32_t ulEDR; + + /* A human readable description of the exception cause. The strings used + are the same as the #define constant names found in the + microblaze_exceptions_i.h header file */ + int8_t *pcExceptionCause; + + /* The human readable name of the task that was running at the time the + exception occurred. This is the name that was given to the task when the + task was created using the FreeRTOS xTaskCreate() API function. */ + char *pcCurrentTaskName; + + /* The handle of the task that was running a the time the exception + occurred. */ + void * xCurrentTaskHandle; + +} xPortRegisterDump; + + +/* + * Installs pxHandler as the interrupt handler for the peripheral specified by + * the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have pxHandler assigned as its interrupt + * handler. Peripheral IDs are defined in the xparameters.h header file, which + * is itself part of the BSP project. For example, in the official demo + * application for this port, xparameters.h defines the following IDs for the + * four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + * + * pxHandler: + * + * A pointer to the interrupt handler function itself. This must be a void + * function that takes a (void *) parameter. + * + * + * pvCallBackRef: + * + * The parameter passed into the handler function. In many cases this will not + * be used and can be NULL. Some times it is used to pass in a reference to + * the peripheral instance variable, so it can be accessed from inside the + * handler function. + * + * + * pdPASS is returned if the function executes successfully. Any other value + * being returned indicates that the function did not execute correctly. + */ +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ); + + +/* + * Enables the interrupt, within the interrupt controller, for the peripheral + * specified by the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have its interrupt enabled in the + * interrupt controller. Peripheral IDs are defined in the xparameters.h header + * file, which is itself part of the BSP project. For example, in the official + * demo application for this port, xparameters.h defines the following IDs for + * the four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + */ +void vPortEnableInterrupt( uint8_t ucInterruptID ); + +/* + * Disables the interrupt, within the interrupt controller, for the peripheral + * specified by the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have its interrupt disabled in the + * interrupt controller. Peripheral IDs are defined in the xparameters.h header + * file, which is itself part of the BSP project. For example, in the official + * demo application for this port, xparameters.h defines the following IDs for + * the four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + */ +void vPortDisableInterrupt( uint8_t ucInterruptID ); + +/* + * This is an application defined callback function used to install the tick + * interrupt handler. It is provided as an application callback because the + * kernel will run on lots of different MicroBlaze and FPGA configurations - not + * all of which will have the same timer peripherals defined or available. This + * example uses the AXI Timer 0. If that is available on your hardware platform + * then this example callback implementation should not require modification. + * The name of the interrupt handler that should be installed is vPortTickISR(), + * which the function below declares as an extern. + */ +void vApplicationSetupTimerInterrupt( void ); + +/* + * This is an application defined callback function used to clear whichever + * interrupt was installed by the the vApplicationSetupTimerInterrupt() callback + * function - in this case the interrupt generated by the AXI timer. It is + * provided as an application callback because the kernel will run on lots of + * different MicroBlaze and FPGA configurations - not all of which will have the + * same timer peripherals defined or available. This example uses the AXI Timer 0. + * If that is available on your hardware platform then this example callback + * implementation should not require modification provided the example definition + * of vApplicationSetupTimerInterrupt() is also not modified. + */ +void vApplicationClearTimerInterrupt( void ); + +/* + * vPortExceptionsInstallHandlers() is only available when the MicroBlaze + * is configured to include exception functionality, and + * configINSTALL_EXCEPTION_HANDLERS is set to 1 in FreeRTOSConfig.h. + * + * vPortExceptionsInstallHandlers() installs the FreeRTOS exception handler + * for every possible exception cause. + * + * vPortExceptionsInstallHandlers() can be called explicitly from application + * code. After that is done, the default FreeRTOS exception handler that will + * have been installed can be replaced for any specific exception cause by using + * the standard Xilinx library function microblaze_register_exception_handler(). + * + * If vPortExceptionsInstallHandlers() is not called explicitly by the + * application, it will be called automatically by the kernel the first time + * xPortInstallInterruptHandler() is called. At that time, any exception + * handlers that may have already been installed will be replaced. + * + * See the description of vApplicationExceptionRegisterDump() for information + * on the processing performed by the FreeRTOS exception handler. + */ +void vPortExceptionsInstallHandlers( void ); + +/* + * The FreeRTOS exception handler fills an xPortRegisterDump structure (defined + * in portmacro.h) with the MicroBlaze context, as it was at the time the + * exception occurred. The exception handler then calls + * vApplicationExceptionRegisterDump(), passing in the completed + * xPortRegisterDump structure as its parameter. + * + * The FreeRTOS kernel provides its own implementation of + * vApplicationExceptionRegisterDump(), but the kernel provided implementation + * is declared as being 'weak'. The weak definition allows the application + * writer to provide their own implementation, should they wish to use the + * register dump information. For example, an implementation could be provided + * that wrote the register dump data to a display, or a UART port. + */ +void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ); + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port.c new file mode 100644 index 0000000..92484af --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port.c @@ -0,0 +1,490 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MicroBlaze port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Standard includes. */ +#include + +/* Hardware includes. */ +#include +#include +#include + +/* Tasks are started with a critical section nesting of 0 - however, prior to +the scheduler being commenced interrupts should not be enabled, so the critical +nesting variable is initialised to a non-zero value. */ +#define portINITIAL_NESTING_VALUE ( 0xff ) + +/* The bit within the MSR register that enabled/disables interrupts and +exceptions respectively. */ +#define portMSR_IE ( 0x02U ) +#define portMSR_EE ( 0x100U ) + +/* If the floating point unit is included in the MicroBlaze build, then the +FSR register is saved as part of the task context. portINITIAL_FSR is the value +given to the FSR register when the initial context is set up for a task being +created. */ +#define portINITIAL_FSR ( 0U ) + +/*-----------------------------------------------------------*/ + +/* + * Initialise the interrupt controller instance. + */ +static int32_t prvInitialiseInterruptController( void ); + +/* Ensure the interrupt controller instance variable is initialised before it is + * used, and that the initialisation only happens once. + */ +static int32_t prvEnsureInterruptControllerIsInitialised( void ); + +/*-----------------------------------------------------------*/ + +/* Counts the nesting depth of calls to portENTER_CRITICAL(). Each task +maintains its own count, so this variable is saved as part of the task +context. */ +volatile UBaseType_t uxCriticalNesting = portINITIAL_NESTING_VALUE; + +/* This port uses a separate stack for interrupts. This prevents the stack of +every task needing to be large enough to hold an entire interrupt stack on top +of the task stack. */ +uint32_t *pulISRStack; + +/* If an interrupt requests a context switch, then ulTaskSwitchRequested will +get set to 1. ulTaskSwitchRequested is inspected just before the main interrupt +handler exits. If, at that time, ulTaskSwitchRequested is set to 1, the kernel +will call vTaskSwitchContext() to ensure the task that runs immediately after +the interrupt exists is the highest priority task that is able to run. This is +an unusual mechanism, but is used for this port because a single interrupt can +cause the servicing of multiple peripherals - and it is inefficient to call +vTaskSwitchContext() multiple times as each peripheral is serviced. */ +volatile uint32_t ulTaskSwitchRequested = 0UL; + +/* The instance of the interrupt controller used by this port. This is required +by the Xilinx library API functions. */ +static XIntc xInterruptControllerInstance; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been made. + * + * See the portable.h header file. + */ +#if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters ) +#else +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +#endif +{ +extern void * _SDA2_BASE_; +extern void * _SDA_BASE_; +const uint32_t ulR2 = ( uint32_t ) &_SDA2_BASE_; +const uint32_t ulR13 = ( uint32_t ) &_SDA_BASE_; +extern void _start1( void ); + + /* Place a few bytes of known values on the bottom of the stack. + This is essential for the Microblaze port and these lines must + not be omitted. */ + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000000; + pxTopOfStack--; + + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + /* Store the stack limits. */ + *pxTopOfStack = (StackType_t) (pxTopOfStack + 3); + pxTopOfStack--; + *pxTopOfStack = (StackType_t) pxEndOfStack; + pxTopOfStack--; + #endif + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* The FSR value placed in the initial task context is just 0. */ + *pxTopOfStack = portINITIAL_FSR; + pxTopOfStack--; + #endif + + /* The MSR value placed in the initial task context should have interrupts + disabled. Each task will enable interrupts automatically when it enters + the running state for the first time. */ + *pxTopOfStack = mfmsr() & ~portMSR_IE; + + #if( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) + { + /* Ensure exceptions are enabled for the task. */ + *pxTopOfStack |= portMSR_EE; + } + #endif + + pxTopOfStack--; + + /* First stack an initial value for the critical section nesting. This + is initialised to zero. */ + *pxTopOfStack = ( StackType_t ) 0x00; + + /* R0 is always zero. */ + /* R1 is the SP. */ + + /* Place an initial value for all the general purpose registers. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) ulR2; /* R2 - read only small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 - return values and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 - return values and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters;/* R5 contains the function call parameters. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; /* R8 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0a; /* R10 - other parameters and temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0b; /* R11 - temporaries. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0c; /* R12 - temporaries. */ + pxTopOfStack--; + #else + pxTopOfStack-= 8; + #endif + + *pxTopOfStack = ( StackType_t ) ulR13; /* R13 - read/write small data area. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* R14 - return address for interrupt. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) _start1; /* R15 - return address for subroutine. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R16 - return address for trap (debugger). */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R17 - return address for exceptions, if configured. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R18 - reserved for assembler and compiler temporaries. */ + pxTopOfStack--; + #else + pxTopOfStack -= 4; + #endif + + *pxTopOfStack = ( StackType_t ) 0x00; /* R19 - must be saved across function calls. Callee-save. Seems to be interpreted as the frame pointer. */ + + #ifdef portPRE_LOAD_STACK_FOR_DEBUGGING + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R20 - reserved for storing a pointer to the Global Offset Table (GOT) in Position Independent Code (PIC). Non-volatile in non-PIC code. Must be saved across function calls. Callee-save. Not used by FreeRTOS. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R21 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16; /* R22 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17; /* R23 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18; /* R24 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R25 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1a; /* R26 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1b; /* R27 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1c; /* R28 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1d; /* R29 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1e; /* R30 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1f; /* R31 - must be saved across function calls. Callee-save. */ + pxTopOfStack--; + #else + pxTopOfStack -= 13; + #endif + + /* Return a pointer to the top of the stack that has been generated so this + can be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void ( vPortStartFirstTask )( void ); +extern uint32_t _stack[]; + + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. + + This port uses an application defined callback function to install the tick + interrupt handler because the kernel will run on lots of different + MicroBlaze and FPGA configurations - not all of which will have the same + timer peripherals defined or available. An example definition of + vApplicationSetupTimerInterrupt() is provided in the official demo + application that accompanies this port. */ + vApplicationSetupTimerInterrupt(); + + /* Reuse the stack from main() as the stack for the interrupts/exceptions. */ + pulISRStack = ( uint32_t * ) _stack; + + /* Ensure there is enough space for the functions called from the interrupt + service routines to write back into the stack frame of the caller. */ + pulISRStack -= 2; + + /* Restore the context of the first task that is going to run. From here + on, the created tasks will be executing. */ + vPortStartFirstTask(); + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +void vPortYield( void ) +{ +extern void VPortYieldASM( void ); + + /* Perform the context switch in a critical section to assure it is + not interrupted by the tick ISR. It is not a problem to do this as + each task maintains its own interrupt status. */ + portENTER_CRITICAL(); + { + /* Jump directly to the yield function to ensure there is no + compiler generated prologue code. */ + asm volatile ( "bralid r14, VPortYieldASM \n\t" \ + "or r0, r0, r0 \n\t" ); + } + portEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +void vPortEnableInterrupt( uint8_t ucInterruptID ) +{ +int32_t lReturn; + + /* An API function is provided to enable an interrupt in the interrupt + controller because the interrupt controller instance variable is private + to this file. */ + lReturn = prvEnsureInterruptControllerIsInitialised(); + if( lReturn == pdPASS ) + { + /* Critical section protects read/modify/writer operation inside + XIntc_Enable(). */ + portENTER_CRITICAL(); + { + XIntc_Enable( &xInterruptControllerInstance, ucInterruptID ); + } + portEXIT_CRITICAL(); + } + + configASSERT( lReturn == pdPASS ); +} +/*-----------------------------------------------------------*/ + +void vPortDisableInterrupt( uint8_t ucInterruptID ) +{ +int32_t lReturn; + + /* An API function is provided to disable an interrupt in the interrupt + controller because the interrupt controller instance variable is private + to this file. */ + lReturn = prvEnsureInterruptControllerIsInitialised(); + + if( lReturn == pdPASS ) + { + XIntc_Disable( &xInterruptControllerInstance, ucInterruptID ); + } + + configASSERT( lReturn == pdPASS ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ) +{ +int32_t lReturn; + + /* An API function is provided to install an interrupt handler because the + interrupt controller instance variable is private to this file. */ + + lReturn = prvEnsureInterruptControllerIsInitialised(); + + if( lReturn == pdPASS ) + { + lReturn = XIntc_Connect( &xInterruptControllerInstance, ucInterruptID, pxHandler, pvCallBackRef ); + } + + if( lReturn == XST_SUCCESS ) + { + lReturn = pdPASS; + } + + configASSERT( lReturn == pdPASS ); + + return lReturn; +} +/*-----------------------------------------------------------*/ + +void vPortRemoveInterruptHandler( uint8_t ucInterruptID ) +{ +int32_t lReturn; + + /* An API function is provided to remove an interrupt handler because the + interrupt controller instance variable is private to this file. */ + + lReturn = prvEnsureInterruptControllerIsInitialised(); + + if( lReturn == pdPASS ) + { + XIntc_Disconnect( &xInterruptControllerInstance, ucInterruptID ); + } + + configASSERT( lReturn == pdPASS ); +} +/*-----------------------------------------------------------*/ + +static int32_t prvEnsureInterruptControllerIsInitialised( void ) +{ +static int32_t lInterruptControllerInitialised = pdFALSE; +int32_t lReturn; + + /* Ensure the interrupt controller instance variable is initialised before + it is used, and that the initialisation only happens once. */ + if( lInterruptControllerInitialised != pdTRUE ) + { + lReturn = prvInitialiseInterruptController(); + + if( lReturn == pdPASS ) + { + lInterruptControllerInitialised = pdTRUE; + } + } + else + { + lReturn = pdPASS; + } + + return lReturn; +} +/*-----------------------------------------------------------*/ + +/* + * Handler for the timer interrupt. This is the handler that the application + * defined callback function vApplicationSetupTimerInterrupt() should install. + */ +void vPortTickISR( void *pvUnused ) +{ +extern void vApplicationClearTimerInterrupt( void ); + + /* Ensure the unused parameter does not generate a compiler warning. */ + ( void ) pvUnused; + + /* This port uses an application defined callback function to clear the tick + interrupt because the kernel will run on lots of different MicroBlaze and + FPGA configurations - not all of which will have the same timer peripherals + defined or available. An example definition of + vApplicationClearTimerInterrupt() is provided in the official demo + application that accompanies this port. */ + vApplicationClearTimerInterrupt(); + + /* Increment the RTOS tick - this might cause a task to unblock. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Force vTaskSwitchContext() to be called as the interrupt exits. */ + ulTaskSwitchRequested = 1; + } +} +/*-----------------------------------------------------------*/ + +static int32_t prvInitialiseInterruptController( void ) +{ +int32_t lStatus; + + lStatus = XIntc_Initialize( &xInterruptControllerInstance, configINTERRUPT_CONTROLLER_TO_USE ); + + if( lStatus == XST_SUCCESS ) + { + /* Initialise the exception table. */ + Xil_ExceptionInit(); + + /* Service all pending interrupts each time the handler is entered. */ + XIntc_SetIntrSvcOption( xInterruptControllerInstance.BaseAddress, XIN_SVC_ALL_ISRS_OPTION ); + + /* Install exception handlers if the MicroBlaze is configured to handle + exceptions, and the application defined constant + configINSTALL_EXCEPTION_HANDLERS is set to 1. */ + #if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + { + vPortExceptionsInstallHandlers(); + } + #endif /* MICROBLAZE_EXCEPTIONS_ENABLED */ + + /* Start the interrupt controller. Interrupts are enabled when the + scheduler starts. */ + lStatus = XIntc_Start( &xInterruptControllerInstance, XIN_REAL_MODE ); + + if( lStatus == XST_SUCCESS ) + { + lStatus = pdPASS; + } + else + { + lStatus = pdFAIL; + } + } + + configASSERT( lStatus == pdPASS ); + + return lStatus; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port_exceptions.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port_exceptions.c new file mode 100644 index 0000000..ab0cf51 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port_exceptions.c @@ -0,0 +1,283 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware includes. */ +#include +#include + +/* The Xilinx library defined exception entry point stacks a number of +registers. These definitions are offsets from the stack pointer to the various +stacked register values. */ +#define portexR3_STACK_OFFSET 4 +#define portexR4_STACK_OFFSET 5 +#define portexR5_STACK_OFFSET 6 +#define portexR6_STACK_OFFSET 7 +#define portexR7_STACK_OFFSET 8 +#define portexR8_STACK_OFFSET 9 +#define portexR9_STACK_OFFSET 10 +#define portexR10_STACK_OFFSET 11 +#define portexR11_STACK_OFFSET 12 +#define portexR12_STACK_OFFSET 13 +#define portexR15_STACK_OFFSET 16 +#define portexR18_STACK_OFFSET 19 +#define portexMSR_STACK_OFFSET 20 +#define portexR19_STACK_OFFSET -1 + +/* This is defined to equal the size, in bytes, of the stack frame generated by +the Xilinx standard library exception entry point. It is required to determine +the stack pointer value prior to the exception being entered. */ +#define portexASM_HANDLER_STACK_FRAME_SIZE 84UL + +/* The number of bytes a MicroBlaze instruction consumes. */ +#define portexINSTRUCTION_SIZE 4 + +/* Exclude this entire file if the MicroBlaze is not configured to handle +exceptions, or the application defined configuration constant +configINSTALL_EXCEPTION_HANDLERS is not set to 1. */ +#if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + +/* This variable is set in the exception entry code, before +vPortExceptionHandler is called. */ +uint32_t *pulStackPointerOnFunctionEntry = NULL; + +/* This is the structure that is filled with the MicroBlaze context as it +existed immediately prior to the exception occurrence. A pointer to this +structure is passed into the vApplicationExceptionRegisterDump() callback +function, if one is defined. */ +static xPortRegisterDump xRegisterDump; + +/* This is the FreeRTOS exception handler that is installed for all exception +types. It is called from vPortExceptionHanlderEntry() - which is itself defined +in portasm.S. */ +void vPortExceptionHandler( void *pvExceptionID ); +extern void vPortExceptionHandlerEntry( void *pvExceptionID ); + +/*-----------------------------------------------------------*/ + +/* vApplicationExceptionRegisterDump() is a callback function that the +application can optionally define to receive a populated xPortRegisterDump +structure. If the application chooses not to define a version of +vApplicationExceptionRegisterDump() then this weekly defined default +implementation will be called instead. */ +extern void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ) __attribute__((weak)); +void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ) +{ + ( void ) xRegisterDump; + + for( ;; ) + { + portNOP(); + } +} +/*-----------------------------------------------------------*/ + +void vPortExceptionHandler( void *pvExceptionID ) +{ +extern void *pxCurrentTCB; + + /* Fill an xPortRegisterDump structure with the MicroBlaze context as it + was immediately before the exception occurrence. */ + + /* First fill in the name and handle of the task that was in the Running + state when the exception occurred. */ + xRegisterDump.xCurrentTaskHandle = pxCurrentTCB; + xRegisterDump.pcCurrentTaskName = pcTaskGetName( NULL ); + + configASSERT( pulStackPointerOnFunctionEntry ); + + /* Obtain the values of registers that were stacked prior to this function + being called, and may have changed since they were stacked. */ + xRegisterDump.ulR3 = pulStackPointerOnFunctionEntry[ portexR3_STACK_OFFSET ]; + xRegisterDump.ulR4 = pulStackPointerOnFunctionEntry[ portexR4_STACK_OFFSET ]; + xRegisterDump.ulR5 = pulStackPointerOnFunctionEntry[ portexR5_STACK_OFFSET ]; + xRegisterDump.ulR6 = pulStackPointerOnFunctionEntry[ portexR6_STACK_OFFSET ]; + xRegisterDump.ulR7 = pulStackPointerOnFunctionEntry[ portexR7_STACK_OFFSET ]; + xRegisterDump.ulR8 = pulStackPointerOnFunctionEntry[ portexR8_STACK_OFFSET ]; + xRegisterDump.ulR9 = pulStackPointerOnFunctionEntry[ portexR9_STACK_OFFSET ]; + xRegisterDump.ulR10 = pulStackPointerOnFunctionEntry[ portexR10_STACK_OFFSET ]; + xRegisterDump.ulR11 = pulStackPointerOnFunctionEntry[ portexR11_STACK_OFFSET ]; + xRegisterDump.ulR12 = pulStackPointerOnFunctionEntry[ portexR12_STACK_OFFSET ]; + xRegisterDump.ulR15_return_address_from_subroutine = pulStackPointerOnFunctionEntry[ portexR15_STACK_OFFSET ]; + xRegisterDump.ulR18 = pulStackPointerOnFunctionEntry[ portexR18_STACK_OFFSET ]; + xRegisterDump.ulR19 = pulStackPointerOnFunctionEntry[ portexR19_STACK_OFFSET ]; + xRegisterDump.ulMSR = pulStackPointerOnFunctionEntry[ portexMSR_STACK_OFFSET ]; + + /* Obtain the value of all other registers. */ + xRegisterDump.ulR2_small_data_area = mfgpr( R2 ); + xRegisterDump.ulR13_read_write_small_data_area = mfgpr( R13 ); + xRegisterDump.ulR14_return_address_from_interrupt = mfgpr( R14 ); + xRegisterDump.ulR16_return_address_from_trap = mfgpr( R16 ); + xRegisterDump.ulR17_return_address_from_exceptions = mfgpr( R17 ); + xRegisterDump.ulR20 = mfgpr( R20 ); + xRegisterDump.ulR21 = mfgpr( R21 ); + xRegisterDump.ulR22 = mfgpr( R22 ); + xRegisterDump.ulR23 = mfgpr( R23 ); + xRegisterDump.ulR24 = mfgpr( R24 ); + xRegisterDump.ulR25 = mfgpr( R25 ); + xRegisterDump.ulR26 = mfgpr( R26 ); + xRegisterDump.ulR27 = mfgpr( R27 ); + xRegisterDump.ulR28 = mfgpr( R28 ); + xRegisterDump.ulR29 = mfgpr( R29 ); + xRegisterDump.ulR30 = mfgpr( R30 ); + xRegisterDump.ulR31 = mfgpr( R31 ); + xRegisterDump.ulR1_SP = ( ( uint32_t ) pulStackPointerOnFunctionEntry ) + portexASM_HANDLER_STACK_FRAME_SIZE; + xRegisterDump.ulEAR = mfear(); + xRegisterDump.ulESR = mfesr(); + xRegisterDump.ulEDR = mfedr(); + + /* Move the saved program counter back to the instruction that was executed + when the exception occurred. This is only valid for certain types of + exception. */ + xRegisterDump.ulPC = xRegisterDump.ulR17_return_address_from_exceptions - portexINSTRUCTION_SIZE; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + { + xRegisterDump.ulFSR = mffsr(); + } + #else + { + xRegisterDump.ulFSR = 0UL; + } + #endif + + /* Also fill in a string that describes what type of exception this is. + The string uses the same ID names as defined in the MicroBlaze standard + library exception header files. */ + switch( ( uint32_t ) pvExceptionID ) + { + case XEXC_ID_FSL : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FSL"; + break; + + case XEXC_ID_UNALIGNED_ACCESS : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_UNALIGNED_ACCESS"; + break; + + case XEXC_ID_ILLEGAL_OPCODE : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_ILLEGAL_OPCODE"; + break; + + case XEXC_ID_M_AXI_I_EXCEPTION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_I_EXCEPTION or XEXC_ID_IPLB_EXCEPTION"; + break; + + case XEXC_ID_M_AXI_D_EXCEPTION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_D_EXCEPTION or XEXC_ID_DPLB_EXCEPTION"; + break; + + case XEXC_ID_DIV_BY_ZERO : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_DIV_BY_ZERO"; + break; + + case XEXC_ID_STACK_VIOLATION : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_STACK_VIOLATION or XEXC_ID_MMU"; + break; + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + + case XEXC_ID_FPU : + xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FPU see ulFSR value"; + break; + + #endif /* XPAR_MICROBLAZE_USE_FPU */ + } + + /* vApplicationExceptionRegisterDump() is a callback function that the + application can optionally define to receive the populated xPortRegisterDump + structure. If the application chooses not to define a version of + vApplicationExceptionRegisterDump() then the weekly defined default + implementation within this file will be called instead. */ + vApplicationExceptionRegisterDump( &xRegisterDump ); + + /* Must not attempt to leave this function! */ + for( ;; ) + { + portNOP(); + } +} +/*-----------------------------------------------------------*/ + +void vPortExceptionsInstallHandlers( void ) +{ +static uint32_t ulHandlersAlreadyInstalled = pdFALSE; + + if( ulHandlersAlreadyInstalled == pdFALSE ) + { + ulHandlersAlreadyInstalled = pdTRUE; + + #if XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS == 1 + microblaze_register_exception_handler( XEXC_ID_UNALIGNED_ACCESS, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_UNALIGNED_ACCESS ); + #endif /* XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS*/ + + #if XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_ILLEGAL_OPCODE, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_ILLEGAL_OPCODE ); + #endif /* XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION */ + + #if XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_M_AXI_I_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_I_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_M_AXI_D_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_D_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_IPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_IPLB_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_DPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DPLB_EXCEPTION ); + #endif /* XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION */ + + #if XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_DIV_BY_ZERO, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DIV_BY_ZERO ); + #endif /* XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION */ + + #if XPAR_MICROBLAZE_FPU_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_FPU, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FPU ); + #endif /* XPAR_MICROBLAZE_FPU_EXCEPTION */ + + #if XPAR_MICROBLAZE_FSL_EXCEPTION == 1 + microblaze_register_exception_handler( XEXC_ID_FSL, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FSL ); + #endif /* XPAR_MICROBLAZE_FSL_EXCEPTION */ + + microblaze_enable_exceptions(); + } +} + +/* Exclude the entire file if the MicroBlaze is not configured to handle +exceptions, or the application defined configuration item +configINSTALL_EXCEPTION_HANDLERS is not set to 1. */ +#endif /* ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) */ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portasm.S new file mode 100644 index 0000000..b420d32 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portasm.S @@ -0,0 +1,376 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/* Xilinx library includes. */ +#include "microblaze_exceptions_g.h" +#include "xparameters.h" + +/* Offsets from the stack pointer at which saved registers are placed. */ +#define portR31_OFFSET 4 +#define portR30_OFFSET 8 +#define portR29_OFFSET 12 +#define portR28_OFFSET 16 +#define portR27_OFFSET 20 +#define portR26_OFFSET 24 +#define portR25_OFFSET 28 +#define portR24_OFFSET 32 +#define portR23_OFFSET 36 +#define portR22_OFFSET 40 +#define portR21_OFFSET 44 +#define portR20_OFFSET 48 +#define portR19_OFFSET 52 +#define portR18_OFFSET 56 +#define portR17_OFFSET 60 +#define portR16_OFFSET 64 +#define portR15_OFFSET 68 +#define portR14_OFFSET 72 +#define portR13_OFFSET 76 +#define portR12_OFFSET 80 +#define portR11_OFFSET 84 +#define portR10_OFFSET 88 +#define portR9_OFFSET 92 +#define portR8_OFFSET 96 +#define portR7_OFFSET 100 +#define portR6_OFFSET 104 +#define portR5_OFFSET 108 +#define portR4_OFFSET 112 +#define portR3_OFFSET 116 +#define portR2_OFFSET 120 +#define portCRITICAL_NESTING_OFFSET 124 +#define portMSR_OFFSET 128 + +#if( XPAR_MICROBLAZE_USE_FPU != 0 ) + #define portFSR_OFFSET 132 + #if( XPAR_MICROBLAZE_USE_STACK_PROTECTION ) + #define portSLR_OFFSET 136 + #define portSHR_OFFSET 140 + + #define portCONTEXT_SIZE 144 + #define portMINUS_CONTEXT_SIZE -144 + #else + #define portCONTEXT_SIZE 136 + #define portMINUS_CONTEXT_SIZE -136 + #endif +#else + #if( XPAR_MICROBLAZE_USE_STACK_PROTECTION ) + #define portSLR_OFFSET 132 + #define portSHR_OFFSET 136 + + #define portCONTEXT_SIZE 140 + #define portMINUS_CONTEXT_SIZE -140 + #else + #define portCONTEXT_SIZE 132 + #define portMINUS_CONTEXT_SIZE -132 + #endif +#endif + + .extern pxCurrentTCB + .extern XIntc_DeviceInterruptHandler + .extern vTaskSwitchContext + .extern uxCriticalNesting + .extern pulISRStack + .extern ulTaskSwitchRequested + .extern vPortExceptionHandler + .extern pulStackPointerOnFunctionEntry + + .global _interrupt_handler + .global VPortYieldASM + .global vPortStartFirstTask + .global vPortExceptionHandlerEntry + + +.macro portSAVE_CONTEXT + + /* Make room for the context on the stack. */ + addik r1, r1, portMINUS_CONTEXT_SIZE + + /* Stack general registers. */ + swi r31, r1, portR31_OFFSET + swi r30, r1, portR30_OFFSET + swi r29, r1, portR29_OFFSET + swi r28, r1, portR28_OFFSET + swi r27, r1, portR27_OFFSET + swi r26, r1, portR26_OFFSET + swi r25, r1, portR25_OFFSET + swi r24, r1, portR24_OFFSET + swi r23, r1, portR23_OFFSET + swi r22, r1, portR22_OFFSET + swi r21, r1, portR21_OFFSET + swi r20, r1, portR20_OFFSET + swi r19, r1, portR19_OFFSET + swi r18, r1, portR18_OFFSET + swi r17, r1, portR17_OFFSET + swi r16, r1, portR16_OFFSET + swi r15, r1, portR15_OFFSET + /* R14 is saved later as it needs adjustment if a yield is performed. */ + swi r13, r1, portR13_OFFSET + swi r12, r1, portR12_OFFSET + swi r11, r1, portR11_OFFSET + swi r10, r1, portR10_OFFSET + swi r9, r1, portR9_OFFSET + swi r8, r1, portR8_OFFSET + swi r7, r1, portR7_OFFSET + swi r6, r1, portR6_OFFSET + swi r5, r1, portR5_OFFSET + swi r4, r1, portR4_OFFSET + swi r3, r1, portR3_OFFSET + swi r2, r1, portR2_OFFSET + + /* Stack the critical section nesting value. */ + lwi r18, r0, uxCriticalNesting + swi r18, r1, portCRITICAL_NESTING_OFFSET + + /* Stack MSR. */ + mfs r18, rmsr + swi r18, r1, portMSR_OFFSET + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* Stack FSR. */ + mfs r18, rfsr + swi r18, r1, portFSR_OFFSET + #endif + +#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION ) + /* Save the stack limits */ + mfs r18, rslr + swi r18, r1, portSLR_OFFSET + mfs r18, rshr + swi r18, r1, portSHR_OFFSET +#endif + + /* Save the top of stack value to the TCB. */ + lwi r3, r0, pxCurrentTCB + sw r1, r0, r3 + + .endm + +.macro portRESTORE_CONTEXT + + /* Load the top of stack value from the TCB. */ + lwi r18, r0, pxCurrentTCB + lw r1, r0, r18 + +#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION ) + /* Restore the stack limits -- must not load from r1 (Stack Pointer) + because if the address of load or store instruction is out of range, + it will trigger Stack Protection Violation exception. */ + or r18, r0, r1 + lwi r12, r18, portSLR_OFFSET + mts rslr, r12 + lwi r12, r18, portSHR_OFFSET + mts rshr, r12 +#endif + + /* Restore the general registers. */ + lwi r31, r1, portR31_OFFSET + lwi r30, r1, portR30_OFFSET + lwi r29, r1, portR29_OFFSET + lwi r28, r1, portR28_OFFSET + lwi r27, r1, portR27_OFFSET + lwi r26, r1, portR26_OFFSET + lwi r25, r1, portR25_OFFSET + lwi r24, r1, portR24_OFFSET + lwi r23, r1, portR23_OFFSET + lwi r22, r1, portR22_OFFSET + lwi r21, r1, portR21_OFFSET + lwi r20, r1, portR20_OFFSET + lwi r19, r1, portR19_OFFSET + lwi r17, r1, portR17_OFFSET + lwi r16, r1, portR16_OFFSET + lwi r15, r1, portR15_OFFSET + lwi r14, r1, portR14_OFFSET + lwi r13, r1, portR13_OFFSET + lwi r12, r1, portR12_OFFSET + lwi r11, r1, portR11_OFFSET + lwi r10, r1, portR10_OFFSET + lwi r9, r1, portR9_OFFSET + lwi r8, r1, portR8_OFFSET + lwi r7, r1, portR7_OFFSET + lwi r6, r1, portR6_OFFSET + lwi r5, r1, portR5_OFFSET + lwi r4, r1, portR4_OFFSET + lwi r3, r1, portR3_OFFSET + lwi r2, r1, portR2_OFFSET + + /* Reload the rmsr from the stack. */ + lwi r18, r1, portMSR_OFFSET + mts rmsr, r18 + + #if( XPAR_MICROBLAZE_USE_FPU != 0 ) + /* Reload the FSR from the stack. */ + lwi r18, r1, portFSR_OFFSET + mts rfsr, r18 + #endif + + /* Load the critical nesting value. */ + lwi r18, r1, portCRITICAL_NESTING_OFFSET + swi r18, r0, uxCriticalNesting + + /* Test the critical nesting value. If it is non zero then the task last + exited the running state using a yield. If it is zero, then the task + last exited the running state through an interrupt. */ + xori r18, r18, 0 + bnei r18, exit_from_yield + + /* r18 was being used as a temporary. Now restore its true value from the + stack. */ + lwi r18, r1, portR18_OFFSET + + /* Remove the stack frame. */ + addik r1, r1, portCONTEXT_SIZE + + /* Return using rtid so interrupts are re-enabled as this function is + exited. */ + rtid r14, 0 + or r0, r0, r0 + + .endm + +/* This function is used to exit portRESTORE_CONTEXT() if the task being +returned to last left the Running state by calling taskYIELD() (rather than +being preempted by an interrupt). */ + .text + .align 4 +exit_from_yield: + + /* r18 was being used as a temporary. Now restore its true value from the + stack. */ + lwi r18, r1, portR18_OFFSET + + /* Remove the stack frame. */ + addik r1, r1, portCONTEXT_SIZE + + /* Return to the task. */ + rtsd r14, 0 + or r0, r0, r0 + + + .text + .align 4 +_interrupt_handler: + + portSAVE_CONTEXT + + /* Stack the return address. */ + swi r14, r1, portR14_OFFSET + + /* Switch to the ISR stack. */ + lwi r1, r0, pulISRStack + +#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION ) + ori r18, r0, _stack_end + mts rslr, r18 + ori r18, r0, _stack + mts rshr, r18 +#endif + + /* The parameter to the interrupt handler. */ + ori r5, r0, configINTERRUPT_CONTROLLER_TO_USE + + /* Execute any pending interrupts. */ + bralid r15, XIntc_DeviceInterruptHandler + or r0, r0, r0 + + /* See if a new task should be selected to execute. */ + lwi r18, r0, ulTaskSwitchRequested + or r18, r18, r0 + + /* If ulTaskSwitchRequested is already zero, then jump straight to + restoring the task that is already in the Running state. */ + beqi r18, task_switch_not_requested + + /* Set ulTaskSwitchRequested back to zero as a task switch is about to be + performed. */ + swi r0, r0, ulTaskSwitchRequested + + /* ulTaskSwitchRequested was not 0 when tested. Select the next task to + execute. */ + bralid r15, vTaskSwitchContext + or r0, r0, r0 + +task_switch_not_requested: + + /* Restore the context of the next task scheduled to execute. */ + portRESTORE_CONTEXT + + + .text + .align 4 +VPortYieldASM: + + portSAVE_CONTEXT + + /* Modify the return address so a return is done to the instruction after + the call to VPortYieldASM. */ + addi r14, r14, 8 + swi r14, r1, portR14_OFFSET + + /* Switch to use the ISR stack. */ + lwi r1, r0, pulISRStack + +#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION ) + ori r18, r0, _stack_end + mts rslr, r18 + ori r18, r0, _stack + mts rshr, r18 +#endif + + /* Select the next task to execute. */ + bralid r15, vTaskSwitchContext + or r0, r0, r0 + + /* Restore the context of the next task scheduled to execute. */ + portRESTORE_CONTEXT + + .text + .align 4 +vPortStartFirstTask: + + portRESTORE_CONTEXT + + + +#if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) + + .text + .align 4 +vPortExceptionHandlerEntry: + + /* Take a copy of the stack pointer before vPortExecptionHandler is called, + storing its value prior to the function stack frame being created. */ + swi r1, r0, pulStackPointerOnFunctionEntry + bralid r15, vPortExceptionHandler + or r0, r0, r0 + +#endif /* ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) */ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portmacro.h new file mode 100644 index 0000000..11d6030 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portmacro.h @@ -0,0 +1,375 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* BSP includes. */ +#include +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros and functions. */ +void microblaze_disable_interrupts( void ); +void microblaze_enable_interrupts( void ); +#define portDISABLE_INTERRUPTS() microblaze_disable_interrupts() +#define portENABLE_INTERRUPTS() microblaze_enable_interrupts() +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vPortEnterCritical( void ); +void vPortExitCritical( void ); +#define portENTER_CRITICAL() { \ + extern volatile UBaseType_t uxCriticalNesting; \ + microblaze_disable_interrupts(); \ + uxCriticalNesting++; \ + } + +#define portEXIT_CRITICAL() { \ + extern volatile UBaseType_t uxCriticalNesting; \ + /* Interrupts are disabled, so we can */ \ + /* access the variable directly. */ \ + uxCriticalNesting--; \ + if( uxCriticalNesting == 0 ) \ + { \ + /* The nesting has unwound and we \ + can enable interrupts again. */ \ + portENABLE_INTERRUPTS(); \ + } \ + } + +/*-----------------------------------------------------------*/ + +/* The yield macro maps directly to the vPortYield() function. */ +void vPortYield( void ); +#define portYIELD() vPortYield() + +/* portYIELD_FROM_ISR() does not directly call vTaskSwitchContext(), but instead +sets a flag to say that a yield has been requested. The interrupt exit code +then checks this flag, and calls vTaskSwitchContext() before restoring a task +context, if the flag is not false. This is done to prevent multiple calls to +vTaskSwitchContext() being made from a single interrupt, as a single interrupt +can result in multiple peripherals being serviced. */ +extern volatile uint32_t ulTaskSwitchRequested; +#define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) ulTaskSwitchRequested = 1; } while( 0 ) + +#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION ) +#define portHAS_STACK_OVERFLOW_CHECKING 1 +#endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* The following structure is used by the FreeRTOS exception handler. It is +filled with the MicroBlaze context as it was at the time the exception occurred. +This is done as an aid to debugging exception occurrences. */ +typedef struct PORT_REGISTER_DUMP +{ + /* The following structure members hold the values of the MicroBlaze + registers at the time the exception was raised. */ + uint32_t ulR1_SP; + uint32_t ulR2_small_data_area; + uint32_t ulR3; + uint32_t ulR4; + uint32_t ulR5; + uint32_t ulR6; + uint32_t ulR7; + uint32_t ulR8; + uint32_t ulR9; + uint32_t ulR10; + uint32_t ulR11; + uint32_t ulR12; + uint32_t ulR13_read_write_small_data_area; + uint32_t ulR14_return_address_from_interrupt; + uint32_t ulR15_return_address_from_subroutine; + uint32_t ulR16_return_address_from_trap; + uint32_t ulR17_return_address_from_exceptions; /* The exception entry code will copy the BTR into R17 if the exception occurred in the delay slot of a branch instruction. */ + uint32_t ulR18; + uint32_t ulR19; + uint32_t ulR20; + uint32_t ulR21; + uint32_t ulR22; + uint32_t ulR23; + uint32_t ulR24; + uint32_t ulR25; + uint32_t ulR26; + uint32_t ulR27; + uint32_t ulR28; + uint32_t ulR29; + uint32_t ulR30; + uint32_t ulR31; + uint32_t ulPC; + uint32_t ulESR; + uint32_t ulMSR; + uint32_t ulEAR; + uint32_t ulFSR; + uint32_t ulEDR; + + /* A human readable description of the exception cause. The strings used + are the same as the #define constant names found in the + microblaze_exceptions_i.h header file */ + int8_t *pcExceptionCause; + + /* The human readable name of the task that was running at the time the + exception occurred. This is the name that was given to the task when the + task was created using the FreeRTOS xTaskCreate() API function. */ + char *pcCurrentTaskName; + + /* The handle of the task that was running a the time the exception + occurred. */ + void * xCurrentTaskHandle; + +} xPortRegisterDump; + + +/* + * Installs pxHandler as the interrupt handler for the peripheral specified by + * the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have pxHandler assigned as its interrupt + * handler. Peripheral IDs are defined in the xparameters.h header file, which + * is itself part of the BSP project. For example, in the official demo + * application for this port, xparameters.h defines the following IDs for the + * four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + * + * pxHandler: + * + * A pointer to the interrupt handler function itself. This must be a void + * function that takes a (void *) parameter. + * + * + * pvCallBackRef: + * + * The parameter passed into the handler function. In many cases this will not + * be used and can be NULL. Some times it is used to pass in a reference to + * the peripheral instance variable, so it can be accessed from inside the + * handler function. + * + * + * pdPASS is returned if the function executes successfully. Any other value + * being returned indicates that the function did not execute correctly. + */ +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ); + + +/* + * Enables the interrupt, within the interrupt controller, for the peripheral + * specified by the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have its interrupt enabled in the + * interrupt controller. Peripheral IDs are defined in the xparameters.h header + * file, which is itself part of the BSP project. For example, in the official + * demo application for this port, xparameters.h defines the following IDs for + * the four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + */ +void vPortEnableInterrupt( uint8_t ucInterruptID ); + +/* + * Disables the interrupt, within the interrupt controller, for the peripheral + * specified by the ucInterruptID parameter. + * + * ucInterruptID: + * + * The ID of the peripheral that will have its interrupt disabled in the + * interrupt controller. Peripheral IDs are defined in the xparameters.h header + * file, which is itself part of the BSP project. For example, in the official + * demo application for this port, xparameters.h defines the following IDs for + * the four possible interrupt sources: + * + * XPAR_INTC_0_UARTLITE_1_VEC_ID - for the UARTlite peripheral. + * XPAR_INTC_0_TMRCTR_0_VEC_ID - for the AXI Timer 0 peripheral. + * XPAR_INTC_0_EMACLITE_0_VEC_ID - for the Ethernet lite peripheral. + * XPAR_INTC_0_GPIO_1_VEC_ID - for the button inputs. + * + */ +void vPortDisableInterrupt( uint8_t ucInterruptID ); + +/* + * This is an application defined callback function used to install the tick + * interrupt handler. It is provided as an application callback because the + * kernel will run on lots of different MicroBlaze and FPGA configurations - not + * all of which will have the same timer peripherals defined or available. This + * example uses the AXI Timer 0. If that is available on your hardware platform + * then this example callback implementation should not require modification. + * The name of the interrupt handler that should be installed is vPortTickISR(), + * which the function below declares as an extern. + */ +void vApplicationSetupTimerInterrupt( void ); + +/* + * This is an application defined callback function used to clear whichever + * interrupt was installed by the the vApplicationSetupTimerInterrupt() callback + * function - in this case the interrupt generated by the AXI timer. It is + * provided as an application callback because the kernel will run on lots of + * different MicroBlaze and FPGA configurations - not all of which will have the + * same timer peripherals defined or available. This example uses the AXI Timer 0. + * If that is available on your hardware platform then this example callback + * implementation should not require modification provided the example definition + * of vApplicationSetupTimerInterrupt() is also not modified. + */ +void vApplicationClearTimerInterrupt( void ); + +/* + * vPortExceptionsInstallHandlers() is only available when the MicroBlaze + * is configured to include exception functionality, and + * configINSTALL_EXCEPTION_HANDLERS is set to 1 in FreeRTOSConfig.h. + * + * vPortExceptionsInstallHandlers() installs the FreeRTOS exception handler + * for every possible exception cause. + * + * vPortExceptionsInstallHandlers() can be called explicitly from application + * code. After that is done, the default FreeRTOS exception handler that will + * have been installed can be replaced for any specific exception cause by using + * the standard Xilinx library function microblaze_register_exception_handler(). + * + * If vPortExceptionsInstallHandlers() is not called explicitly by the + * application, it will be called automatically by the kernel the first time + * xPortInstallInterruptHandler() is called. At that time, any exception + * handlers that may have already been installed will be replaced. + * + * See the description of vApplicationExceptionRegisterDump() for information + * on the processing performed by the FreeRTOS exception handler. + */ +void vPortExceptionsInstallHandlers( void ); + +/* + * The FreeRTOS exception handler fills an xPortRegisterDump structure (defined + * in portmacro.h) with the MicroBlaze context, as it was at the time the + * exception occurred. The exception handler then calls + * vApplicationExceptionRegisterDump(), passing in the completed + * xPortRegisterDump structure as its parameter. + * + * The FreeRTOS kernel provides its own implementation of + * vApplicationExceptionRegisterDump(), but the kernel provided implementation + * is declared as being 'weak'. The weak definition allows the application + * writer to provide their own implementation, should they wish to use the + * register dump information. For example, an implementation could be provided + * that wrote the register dump data to a display, or a UART port. + */ +void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ); + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port.c new file mode 100644 index 0000000..1ef4569 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port.c @@ -0,0 +1,209 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the NIOS2 port. + *----------------------------------------------------------*/ + +/* Standard Includes. */ +#include +#include + +/* Altera includes. */ +#include "sys/alt_irq.h" +#include "sys/alt_exceptions.h" +#include "altera_avalon_timer_regs.h" +#include "priv/alt_irq_table.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Interrupts are enabled. */ +#define portINITIAL_ESTATUS ( StackType_t ) 0x01 + +int _alt_ic_isr_register(alt_u32 ic_id, alt_u32 irq, alt_isr_func isr, + void *isr_context, void *flags); +/*-----------------------------------------------------------*/ + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Call back for the alarm function. + */ +void vPortSysTickHandler( void * context); + +/*-----------------------------------------------------------*/ + +static void prvReadGp( uint32_t *ulValue ) +{ + asm( "stw gp, (%0)" :: "r"(ulValue) ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxFramePointer = pxTopOfStack - 1; +StackType_t xGlobalPointer; + + prvReadGp( &xGlobalPointer ); + + /* End of stack marker. */ + *pxTopOfStack = 0xdeadbeef; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) pxFramePointer; + pxTopOfStack--; + + *pxTopOfStack = xGlobalPointer; + + /* Space for R23 to R16. */ + pxTopOfStack -= 9; + + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_ESTATUS; + + /* Space for R15 to R5. */ + pxTopOfStack -= 12; + + *pxTopOfStack = ( StackType_t ) pvParameters; + + /* Space for R3 to R1, muldiv and RA. */ + pxTopOfStack -= 5; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + asm volatile ( " movia r2, restore_sp_from_pxCurrentTCB \n" + " jmp r2 " ); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the NIOS2 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Try to register the interrupt handler. */ + if ( -EINVAL == _alt_ic_isr_register( SYS_CLK_IRQ_INTERRUPT_CONTROLLER_ID, SYS_CLK_IRQ, vPortSysTickHandler, 0x0, 0x0 ) ) + { + /* Failed to install the Interrupt Handler. */ + asm( "break" ); + } + else + { + /* Configure SysTick to interrupt at the requested rate. */ + IOWR_ALTERA_AVALON_TIMER_CONTROL( SYS_CLK_BASE, ALTERA_AVALON_TIMER_CONTROL_STOP_MSK ); + IOWR_ALTERA_AVALON_TIMER_PERIODL( SYS_CLK_BASE, ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) & 0xFFFF ); + IOWR_ALTERA_AVALON_TIMER_PERIODH( SYS_CLK_BASE, ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) >> 16 ); + IOWR_ALTERA_AVALON_TIMER_CONTROL( SYS_CLK_BASE, ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | ALTERA_AVALON_TIMER_CONTROL_START_MSK | ALTERA_AVALON_TIMER_CONTROL_ITO_MSK ); + } + + /* Clear any already pending interrupts generated by the Timer. */ + IOWR_ALTERA_AVALON_TIMER_STATUS( SYS_CLK_BASE, ~ALTERA_AVALON_TIMER_STATUS_TO_MSK ); +} +/*-----------------------------------------------------------*/ + +void vPortSysTickHandler( void * context) +{ + /* Increment the kernel tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the interrupt. */ + IOWR_ALTERA_AVALON_TIMER_STATUS( SYS_CLK_BASE, ~ALTERA_AVALON_TIMER_STATUS_TO_MSK ); +} +/*-----------------------------------------------------------*/ + +/** This function is a re-implementation of the Altera provided function. + * The function is re-implemented to prevent it from enabling an interrupt + * when it is registered. Interrupts should only be enabled after the FreeRTOS.org + * kernel has its scheduler started so that contexts are saved and switched + * correctly. + */ +int _alt_ic_isr_register(alt_u32 ic_id, alt_u32 irq, alt_isr_func isr, + void *isr_context, void *flags) +{ + int rc = -EINVAL; + alt_irq_context status; + int id = irq; /* IRQ interpreted as the interrupt ID. */ + + if (id < ALT_NIRQ) + { + /* + * interrupts are disabled while the handler tables are updated to ensure + * that an interrupt doesn't occur while the tables are in an inconsistant + * state. + */ + + status = alt_irq_disable_all (); + + alt_irq[id].handler = isr; + alt_irq[id].context = isr_context; + + rc = (isr) ? alt_ic_irq_enable(ic_id, id) : alt_ic_irq_disable(ic_id, id); + + /* alt_irq_enable_all(status); This line is removed to prevent the interrupt from being immediately enabled. */ + } + + return rc; +} +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port_asm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port_asm.S new file mode 100644 index 0000000..09862f9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port_asm.S @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +.extern vTaskSwitchContext + +.set noat + +# Exported to start the first task. +.globl restore_sp_from_pxCurrentTCB + +# Entry point for exceptions. +.section .exceptions.entry.user, "xa" + +# Save the entire context of a task. +save_context: + addi sp, sp, -116 # Create space on the stack. + stw ra, 0(sp) + # Leave a gap for muldiv 0 + stw at, 8(sp) + stw r2, 12(sp) + stw r3, 16(sp) + stw r4, 20(sp) + stw r5, 24(sp) + stw r6, 28(sp) + stw r7, 32(sp) + stw r8, 36(sp) + stw r9, 40(sp) + stw r10, 44(sp) + stw r11, 48(sp) + stw r12, 52(sp) + stw r13, 56(sp) + stw r14, 60(sp) + stw r15, 64(sp) + rdctl r5, estatus # Save the eStatus + stw r5, 68(sp) + addi r15, ea, -4 # Instruction that caused exception + stw r15, 72(sp) # Save as EA + stw r16, 76(sp) # Save the remaining registers + stw r17, 80(sp) + stw r18, 84(sp) + stw r19, 88(sp) + stw r20, 92(sp) + stw r21, 96(sp) + stw r22, 100(sp) + stw r23, 104(sp) + stw gp, 108(sp) + stw fp, 112(sp) + +save_sp_to_pxCurrentTCB: + movia et, pxCurrentTCB # Load the address of the pxCurrentTCB pointer + ldw et, (et) # Load the value of the pxCurrentTCB pointer + stw sp, (et) # Store the stack pointer into the top of the TCB + + br irq_test_user # skip the section .exceptions.entry + + .section .exceptions.irqtest, "xa" +irq_test_user: + + .section .exceptions.exit.user, "xa" +restore_sp_from_pxCurrentTCB: + movia et, pxCurrentTCB # Load the address of the pxCurrentTCB pointer + ldw et, (et) # Load the value of the pxCurrentTCB pointer + ldw sp, (et) # Load the stack pointer with the top value of the TCB + +restore_context: + ldw ra, 0(sp) # Restore the registers. + # Leave a gap for muldiv 0. + ldw at, 8(sp) + ldw r2, 12(sp) + ldw r3, 16(sp) + ldw r4, 20(sp) + ldw r5, 24(sp) + ldw r6, 28(sp) + ldw r7, 32(sp) + ldw r8, 36(sp) + ldw r9, 40(sp) + ldw r10, 44(sp) + ldw r11, 48(sp) + ldw r12, 52(sp) + ldw r13, 56(sp) + ldw r14, 60(sp) + ldw r15, 64(sp) + ldw et, 68(sp) # Load the eStatus + wrctl estatus, et # Write the eStatus + ldw ea, 72(sp) # Load the Program Counter + ldw r16, 76(sp) + ldw r17, 80(sp) + ldw r18, 84(sp) + ldw r19, 88(sp) + ldw r20, 92(sp) + ldw r21, 96(sp) + ldw r22, 100(sp) + ldw r23, 104(sp) + ldw gp, 108(sp) + ldw fp, 112(sp) + addi sp, sp, 116 # Release stack space + + eret # Return to address ea, loading eStatus into Status. + + .section .exceptions.soft, "xa" +soft_exceptions: + movhi r3, 0x003b /* upper half of trap opcode */ + ori r3, r3, 0x683a /* lower half of trap opcode */ + beq r2, r3, call_scheduler + br exceptions_unknown_user # its something else + +call_scheduler: + stw ea, 72(sp) # EA is PC+4 so will skip over instruction causing exception + movia r15, vTaskSwitchContext # Pick the next context - use long call version in place of "call" + callr r15 + br restore_sp_from_pxCurrentTCB # Switch in the task context and restore. + + .section .exceptions.unknown.user +exceptions_unknown_user: + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/portmacro.h new file mode 100644 index 0000000..9872394 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/portmacro.h @@ -0,0 +1,110 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "sys/alt_irq.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() asm volatile ( "NOP" ) +#define portCRITICAL_NESTING_IN_TCB 1 +/*-----------------------------------------------------------*/ + +extern void vTaskSwitchContext( void ); +#define portYIELD() asm volatile ( "trap" ); +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) vTaskSwitchContext(); } while( 0 ) + + +/* Include the port_asm.S file where the Context saving/restoring is defined. */ +__asm__( "\n\t.globl save_context" ); + +/*-----------------------------------------------------------*/ + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); + +#define portDISABLE_INTERRUPTS() alt_irq_disable_all() +#define portENABLE_INTERRUPTS() alt_irq_enable_all( 0x01 ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/FPU_Macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/FPU_Macros.h new file mode 100644 index 0000000..cca884a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/FPU_Macros.h @@ -0,0 +1,46 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* When switching out a task, if the task tag contains a buffer address then +save the flop context into the buffer. */ +#define traceTASK_SWITCHED_OUT() \ + if( pxCurrentTCB->pxTaskTag != NULL ) \ + { \ + extern void vPortSaveFPURegisters( void * ); \ + vPortSaveFPURegisters( ( void * ) ( pxCurrentTCB->pxTaskTag ) ); \ + } + +/* When switching in a task, if the task tag contains a buffer address then +load the flop context from the buffer. */ +#define traceTASK_SWITCHED_IN() \ + if( pxCurrentTCB->pxTaskTag != NULL ) \ + { \ + extern void vPortRestoreFPURegisters( void * ); \ + vPortRestoreFPURegisters( ( void * ) ( pxCurrentTCB->pxTaskTag ) ); \ + } + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/port.c new file mode 100644 index 0000000..9d26f47 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/port.c @@ -0,0 +1,261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PPC405 port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "xtime_l.h" +#include "xintc.h" +#include "xintc_i.h" + +/*-----------------------------------------------------------*/ + +/* Definitions to set the initial MSR of each task. */ +#define portCRITICAL_INTERRUPT_ENABLE ( 1UL << 17UL ) +#define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 15UL ) +#define portMACHINE_CHECK_ENABLE ( 1UL << 12UL ) + +#if configUSE_FPU == 1 + #define portAPU_PRESENT ( 1UL << 25UL ) + #define portFCM_FPU_PRESENT ( 1UL << 13UL ) +#else + #define portAPU_PRESENT ( 0UL ) + #define portFCM_FPU_PRESENT ( 0UL ) +#endif + +#define portINITIAL_MSR ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE | portAPU_PRESENT | portFCM_FPU_PRESENT ) + + +extern const unsigned _SDA_BASE_; +extern const unsigned _SDA2_BASE_; + +/*-----------------------------------------------------------*/ + +/* + * Setup the system timer to generate the tick interrupt. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The handler for the tick interrupt - defined in portasm.s. + */ +extern void vPortTickISR( void ); + +/* + * The handler for the yield function - defined in portasm.s. + */ +extern void vPortYield( void ); + +/* + * Function to start the scheduler running by starting the highest + * priority task that has thus far been created. + */ +extern void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* Structure used to hold the state of the interrupt controller. */ +static XIntc xInterruptController; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if the task had been + * interrupted. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Place a known value at the bottom of the stack for debugging. */ + *pxTopOfStack = 0xDEADBEEF; + pxTopOfStack--; + + /* EABI stack frame. */ + pxTopOfStack -= 20; /* Previous backchain and LR, R31 to R4 inclusive. */ + + /* Parameters in R13. */ + *pxTopOfStack = ( StackType_t ) &_SDA_BASE_; /* address of the first small data area */ + pxTopOfStack -= 10; + + /* Parameters in R3. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* Parameters in R2. */ + *pxTopOfStack = ( StackType_t ) &_SDA2_BASE_; /* address of the second small data area */ + pxTopOfStack--; + + /* R1 is the stack pointer so is omitted. */ + + *pxTopOfStack = 0x10000001UL;; /* R0. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* USPRG0. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* CR. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* XER. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* CTR. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) vPortEndScheduler; /* LR. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* SRR0. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_MSR;/* SRR1. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) vPortEndScheduler;/* Next LR. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL;/* Backchain. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + prvSetupTimerInterrupt(); + XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 ); + vPortStartFirstTask(); + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL ); + + XTime_PITClearInterrupt(); + XTime_FITClearInterrupt(); + XTime_WDTClearInterrupt(); + XTime_WDTDisableInterrupt(); + XTime_FITDisableInterrupt(); + + XExc_RegisterHandler( XEXC_ID_PIT_INT, ( XExceptionHandler ) vPortTickISR, ( void * ) 0 ); + + XTime_PITEnableAutoReload(); + XTime_PITSetInterval( ulInterval ); + XTime_PITEnableInterrupt(); +} +/*-----------------------------------------------------------*/ + +void vPortISRHandler( void *pvNullDoNotUse ) +{ +uint32_t ulInterruptStatus, ulInterruptMask = 1UL; +BaseType_t xInterruptNumber; +XIntc_Config *pxInterruptController; +XIntc_VectorTableEntry *pxTable; + + /* Just to remove compiler warning. */ + ( void ) pvNullDoNotUse; + + /* Get the configuration by using the device ID - in this case it is + assumed that only one interrupt controller is being used. */ + pxInterruptController = &XIntc_ConfigTable[ XPAR_XPS_INTC_0_DEVICE_ID ]; + + /* Which interrupts are pending? */ + ulInterruptStatus = XIntc_mGetIntrStatus( pxInterruptController->BaseAddress ); + + for( xInterruptNumber = 0; xInterruptNumber < XPAR_INTC_MAX_NUM_INTR_INPUTS; xInterruptNumber++ ) + { + if( ulInterruptStatus & 0x01UL ) + { + /* Clear the pending interrupt. */ + XIntc_mAckIntr( pxInterruptController->BaseAddress, ulInterruptMask ); + + /* Call the registered handler. */ + pxTable = &( pxInterruptController->HandlerTable[ xInterruptNumber ] ); + pxTable->Handler( pxTable->CallBackRef ); + } + + /* Check the next interrupt. */ + ulInterruptMask <<= 0x01UL; + ulInterruptStatus >>= 0x01UL; + + /* Have we serviced all interrupts? */ + if( ulInterruptStatus == 0UL ) + { + break; + } + } +} +/*-----------------------------------------------------------*/ + +void vPortSetupInterruptController( void ) +{ +extern void vPortISRWrapper( void ); + + /* Perform all library calls necessary to initialise the exception table + and interrupt controller. This assumes only one interrupt controller is in + use. */ + XExc_mDisableExceptions( XEXC_NON_CRITICAL ); + XExc_Init(); + + /* The library functions save the context - we then jump to a wrapper to + save the stack into the TCB. The wrapper then calls the handler defined + above. */ + XExc_RegisterHandler( XEXC_ID_NON_CRITICAL_INT, ( XExceptionHandler ) vPortISRWrapper, NULL ); + XIntc_Initialize( &xInterruptController, XPAR_XPS_INTC_0_DEVICE_ID ); + XIntc_Start( &xInterruptController, XIN_REAL_MODE ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ) +{ +BaseType_t xReturn = pdFAIL; + + /* This function is defined here so the scope of xInterruptController can + remain within this file. */ + + if( XST_SUCCESS == XIntc_Connect( &xInterruptController, ucInterruptID, pxHandler, pvCallBackRef ) ) + { + XIntc_Enable( &xInterruptController, ucInterruptID ); + xReturn = pdPASS; + } + + return xReturn; +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portasm.S new file mode 100644 index 0000000..0c5dc1b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portasm.S @@ -0,0 +1,383 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOSConfig.h" + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern xTaskIncrementTick + .extern vPortISRHandler + + .global vPortStartFirstTask + .global vPortYield + .global vPortTickISR + .global vPortISRWrapper + .global vPortSaveFPURegisters + .global vPortRestoreFPURegisters + +.set BChainField, 0 +.set NextLRField, BChainField + 4 +.set MSRField, NextLRField + 4 +.set PCField, MSRField + 4 +.set LRField, PCField + 4 +.set CTRField, LRField + 4 +.set XERField, CTRField + 4 +.set CRField, XERField + 4 +.set USPRG0Field, CRField + 4 +.set r0Field, USPRG0Field + 4 +.set r2Field, r0Field + 4 +.set r3r31Field, r2Field + 4 +.set IFrameSize, r3r31Field + ( ( 31 - 3 ) + 1 ) * 4 + + +.macro portSAVE_STACK_POINTER_AND_LR + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis R2, R0, pxCurrentTCB@ha + lwz R2, pxCurrentTCB@l( R2 ) + + /* Store the stack pointer into the TCB */ + stw SP, 0( R2 ) + + /* Save the link register */ + stwu R1, -24( R1 ) + mflr R0 + stw R31, 20( R1 ) + stw R0, 28( R1 ) + mr R31, r1 + +.endm + +.macro portRESTORE_STACK_POINTER_AND_LR + + /* Restore the link register */ + lwz R11, 0( R1 ) + lwz R0, 4( R11 ) + mtlr R0 + lwz R31, -4( R11 ) + mr R1, R11 + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis SP, R0, pxCurrentTCB@ha + lwz SP, pxCurrentTCB@l( R1 ) + + /* Get the task stack pointer from the TCB. */ + lwz SP, 0( SP ) + +.endm + + +vPortStartFirstTask: + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis SP, R0, pxCurrentTCB@ha + lwz SP, pxCurrentTCB@l( SP ) + + /* Get the task stack pointer from the TCB. */ + lwz SP, 0( SP ) + + /* Restore MSR register to SRR1. */ + lwz R0, MSRField(R1) + mtsrr1 R0 + + /* Restore current PC location to SRR0. */ + lwz R0, PCField(R1) + mtsrr0 R0 + + /* Save USPRG0 register */ + lwz R0, USPRG0Field(R1) + mtspr 0x100,R0 + + /* Restore Condition register */ + lwz R0, CRField(R1) + mtcr R0 + + /* Restore Fixed Point Exception register */ + lwz R0, XERField(R1) + mtxer R0 + + /* Restore Counter register */ + lwz R0, CTRField(R1) + mtctr R0 + + /* Restore Link register */ + lwz R0, LRField(R1) + mtlr R0 + + /* Restore remaining GPR registers. */ + lmw R3,r3r31Field(R1) + + /* Restore r0 and r2. */ + lwz R0, r0Field(R1) + lwz R2, r2Field(R1) + + /* Remove frame from stack */ + addi R1,R1,IFrameSize + + /* Return into the first task */ + rfi + + + +vPortYield: + + portSAVE_STACK_POINTER_AND_LR + bl vTaskSwitchContext + portRESTORE_STACK_POINTER_AND_LR + blr + +vPortTickISR: + + portSAVE_STACK_POINTER_AND_LR + bl xTaskIncrementTick + + #if configUSE_PREEMPTION == 1 + bl vTaskSwitchContext + #endif + + /* Clear the interrupt */ + lis R0, 2048 + mttsr R0 + + portRESTORE_STACK_POINTER_AND_LR + blr + +vPortISRWrapper: + + portSAVE_STACK_POINTER_AND_LR + bl vPortISRHandler + portRESTORE_STACK_POINTER_AND_LR + blr + +#if configUSE_FPU == 1 + +vPortSaveFPURegisters: + + /* Enable APU and mark FPU as present. */ + mfmsr r0 + xor r30, r30, r30 + oris r30, r30, 512 + ori r30, r30, 8192 + or r0, r0, r30 + mtmsr r0 + +#ifdef USE_DP_FPU + + /* Buffer address is in r3. Save each flop register into an offset from + this buffer address. */ + stfd f0, 0(r3) + stfd f1, 8(r3) + stfd f2, 16(r3) + stfd f3, 24(r3) + stfd f4, 32(r3) + stfd f5, 40(r3) + stfd f6, 48(r3) + stfd f7, 56(r3) + stfd f8, 64(r3) + stfd f9, 72(r3) + stfd f10, 80(r3) + stfd f11, 88(r3) + stfd f12, 96(r3) + stfd f13, 104(r3) + stfd f14, 112(r3) + stfd f15, 120(r3) + stfd f16, 128(r3) + stfd f17, 136(r3) + stfd f18, 144(r3) + stfd f19, 152(r3) + stfd f20, 160(r3) + stfd f21, 168(r3) + stfd f22, 176(r3) + stfd f23, 184(r3) + stfd f24, 192(r3) + stfd f25, 200(r3) + stfd f26, 208(r3) + stfd f27, 216(r3) + stfd f28, 224(r3) + stfd f29, 232(r3) + stfd f30, 240(r3) + stfd f31, 248(r3) + + /* Also save the FPSCR. */ + mffs f31 + stfs f31, 256(r3) + +#else + + /* Buffer address is in r3. Save each flop register into an offset from + this buffer address. */ + stfs f0, 0(r3) + stfs f1, 4(r3) + stfs f2, 8(r3) + stfs f3, 12(r3) + stfs f4, 16(r3) + stfs f5, 20(r3) + stfs f6, 24(r3) + stfs f7, 28(r3) + stfs f8, 32(r3) + stfs f9, 36(r3) + stfs f10, 40(r3) + stfs f11, 44(r3) + stfs f12, 48(r3) + stfs f13, 52(r3) + stfs f14, 56(r3) + stfs f15, 60(r3) + stfs f16, 64(r3) + stfs f17, 68(r3) + stfs f18, 72(r3) + stfs f19, 76(r3) + stfs f20, 80(r3) + stfs f21, 84(r3) + stfs f22, 88(r3) + stfs f23, 92(r3) + stfs f24, 96(r3) + stfs f25, 100(r3) + stfs f26, 104(r3) + stfs f27, 108(r3) + stfs f28, 112(r3) + stfs f29, 116(r3) + stfs f30, 120(r3) + stfs f31, 124(r3) + + /* Also save the FPSCR. */ + mffs f31 + stfs f31, 128(r3) + +#endif + + blr + +#endif /* configUSE_FPU. */ + + +#if configUSE_FPU == 1 + +vPortRestoreFPURegisters: + + /* Enable APU and mark FPU as present. */ + mfmsr r0 + xor r30, r30, r30 + oris r30, r30, 512 + ori r30, r30, 8192 + or r0, r0, r30 + mtmsr r0 + +#ifdef USE_DP_FPU + + /* Buffer address is in r3. Restore each flop register from an offset + into this buffer. + + First the FPSCR. */ + lfs f31, 256(r3) + mtfsf f31, 7 + + lfd f0, 0(r3) + lfd f1, 8(r3) + lfd f2, 16(r3) + lfd f3, 24(r3) + lfd f4, 32(r3) + lfd f5, 40(r3) + lfd f6, 48(r3) + lfd f7, 56(r3) + lfd f8, 64(r3) + lfd f9, 72(r3) + lfd f10, 80(r3) + lfd f11, 88(r3) + lfd f12, 96(r3) + lfd f13, 104(r3) + lfd f14, 112(r3) + lfd f15, 120(r3) + lfd f16, 128(r3) + lfd f17, 136(r3) + lfd f18, 144(r3) + lfd f19, 152(r3) + lfd f20, 160(r3) + lfd f21, 168(r3) + lfd f22, 176(r3) + lfd f23, 184(r3) + lfd f24, 192(r3) + lfd f25, 200(r3) + lfd f26, 208(r3) + lfd f27, 216(r3) + lfd f28, 224(r3) + lfd f29, 232(r3) + lfd f30, 240(r3) + lfd f31, 248(r3) + +#else + + /* Buffer address is in r3. Restore each flop register from an offset + into this buffer. + + First the FPSCR. */ + lfs f31, 128(r3) + mtfsf f31, 7 + + lfs f0, 0(r3) + lfs f1, 4(r3) + lfs f2, 8(r3) + lfs f3, 12(r3) + lfs f4, 16(r3) + lfs f5, 20(r3) + lfs f6, 24(r3) + lfs f7, 28(r3) + lfs f8, 32(r3) + lfs f9, 36(r3) + lfs f10, 40(r3) + lfs f11, 44(r3) + lfs f12, 48(r3) + lfs f13, 52(r3) + lfs f14, 56(r3) + lfs f15, 60(r3) + lfs f16, 64(r3) + lfs f17, 68(r3) + lfs f18, 72(r3) + lfs f19, 76(r3) + lfs f20, 80(r3) + lfs f21, 84(r3) + lfs f22, 88(r3) + lfs f23, 92(r3) + lfs f24, 96(r3) + lfs f25, 100(r3) + lfs f26, 104(r3) + lfs f27, 108(r3) + lfs f28, 112(r3) + lfs f29, 116(r3) + lfs f30, 120(r3) + lfs f31, 124(r3) + +#endif + + blr + +#endif /* configUSE_FPU. */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portmacro.h new file mode 100644 index 0000000..5bd285b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portmacro.h @@ -0,0 +1,119 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include "xexception_l.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* This port uses the critical nesting count from the TCB rather than +maintaining a separate value and then saving this value in the task stack. */ +#define portCRITICAL_NESTING_IN_TCB 1 + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() XExc_mDisableExceptions( XEXC_NON_CRITICAL ); +#define portENABLE_INTERRUPTS() XExc_mEnableExceptions( XEXC_NON_CRITICAL ); + +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vTaskEnterCritical( void ); +void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +void vPortYield( void ); +#define portYIELD() asm volatile ( "SC \n\t NOP" ) +#define portYIELD_FROM_ISR() vTaskSwitchContext() + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) + +/* There are 32 * 32bit floating point regieters, plus the FPSCR to save. */ +#define portNO_FLOP_REGISTERS_TO_SAVE ( 32 + 1 ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Port specific interrupt handling functions. */ +void vPortSetupInterruptController( void ); +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ); + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/FPU_Macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/FPU_Macros.h new file mode 100644 index 0000000..cca884a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/FPU_Macros.h @@ -0,0 +1,46 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* When switching out a task, if the task tag contains a buffer address then +save the flop context into the buffer. */ +#define traceTASK_SWITCHED_OUT() \ + if( pxCurrentTCB->pxTaskTag != NULL ) \ + { \ + extern void vPortSaveFPURegisters( void * ); \ + vPortSaveFPURegisters( ( void * ) ( pxCurrentTCB->pxTaskTag ) ); \ + } + +/* When switching in a task, if the task tag contains a buffer address then +load the flop context from the buffer. */ +#define traceTASK_SWITCHED_IN() \ + if( pxCurrentTCB->pxTaskTag != NULL ) \ + { \ + extern void vPortRestoreFPURegisters( void * ); \ + vPortRestoreFPURegisters( ( void * ) ( pxCurrentTCB->pxTaskTag ) ); \ + } + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/port.c new file mode 100644 index 0000000..0f9a3fd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/port.c @@ -0,0 +1,261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PPC440 port. + *----------------------------------------------------------*/ + + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "xtime_l.h" +#include "xintc.h" +#include "xintc_i.h" + +/*-----------------------------------------------------------*/ + +/* Definitions to set the initial MSR of each task. */ +#define portCRITICAL_INTERRUPT_ENABLE ( 1UL << 17UL ) +#define portEXTERNAL_INTERRUPT_ENABLE ( 1UL << 15UL ) +#define portMACHINE_CHECK_ENABLE ( 1UL << 12UL ) + +#if configUSE_FPU == 1 + #define portAPU_PRESENT ( 1UL << 25UL ) + #define portFCM_FPU_PRESENT ( 1UL << 13UL ) +#else + #define portAPU_PRESENT ( 0UL ) + #define portFCM_FPU_PRESENT ( 0UL ) +#endif + +#define portINITIAL_MSR ( portCRITICAL_INTERRUPT_ENABLE | portEXTERNAL_INTERRUPT_ENABLE | portMACHINE_CHECK_ENABLE | portAPU_PRESENT | portFCM_FPU_PRESENT ) + + +extern const unsigned _SDA_BASE_; +extern const unsigned _SDA2_BASE_; + +/*-----------------------------------------------------------*/ + +/* + * Setup the system timer to generate the tick interrupt. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The handler for the tick interrupt - defined in portasm.s. + */ +extern void vPortTickISR( void ); + +/* + * The handler for the yield function - defined in portasm.s. + */ +extern void vPortYield( void ); + +/* + * Function to start the scheduler running by starting the highest + * priority task that has thus far been created. + */ +extern void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* Structure used to hold the state of the interrupt controller. */ +static XIntc xInterruptController; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if the task had been + * interrupted. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Place a known value at the bottom of the stack for debugging. */ + *pxTopOfStack = 0xDEADBEEF; + pxTopOfStack--; + + /* EABI stack frame. */ + pxTopOfStack -= 20; /* Previous backchain and LR, R31 to R4 inclusive. */ + + /* Parameters in R13. */ + *pxTopOfStack = ( StackType_t ) &_SDA_BASE_; /* address of the first small data area */ + pxTopOfStack -= 10; + + /* Parameters in R3. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* Parameters in R2. */ + *pxTopOfStack = ( StackType_t ) &_SDA2_BASE_; /* address of the second small data area */ + pxTopOfStack--; + + /* R1 is the stack pointer so is omitted. */ + + *pxTopOfStack = 0x10000001UL;; /* R0. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* USPRG0. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* CR. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* XER. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL; /* CTR. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) vPortEndScheduler; /* LR. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* SRR0. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_MSR;/* SRR1. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) vPortEndScheduler;/* Next LR. */ + pxTopOfStack--; + *pxTopOfStack = 0x00000000UL;/* Backchain. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + prvSetupTimerInterrupt(); + XExc_RegisterHandler( XEXC_ID_SYSTEM_CALL, ( XExceptionHandler ) vPortYield, ( void * ) 0 ); + vPortStartFirstTask(); + + /* Should not get here as the tasks are now running! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulInterval = ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL ); + + XTime_DECClearInterrupt(); + XTime_FITClearInterrupt(); + XTime_WDTClearInterrupt(); + XTime_WDTDisableInterrupt(); + XTime_FITDisableInterrupt(); + + XExc_RegisterHandler( XEXC_ID_DEC_INT, ( XExceptionHandler ) vPortTickISR, ( void * ) 0 ); + + XTime_DECEnableAutoReload(); + XTime_DECSetInterval( ulInterval ); + XTime_DECEnableInterrupt(); +} +/*-----------------------------------------------------------*/ + +void vPortISRHandler( void *pvNullDoNotUse ) +{ +uint32_t ulInterruptStatus, ulInterruptMask = 1UL; +BaseType_t xInterruptNumber; +XIntc_Config *pxInterruptController; +XIntc_VectorTableEntry *pxTable; + + /* Just to remove compiler warning. */ + ( void ) pvNullDoNotUse; + + /* Get the configuration by using the device ID - in this case it is + assumed that only one interrupt controller is being used. */ + pxInterruptController = &XIntc_ConfigTable[ XPAR_XPS_INTC_0_DEVICE_ID ]; + + /* Which interrupts are pending? */ + ulInterruptStatus = XIntc_mGetIntrStatus( pxInterruptController->BaseAddress ); + + for( xInterruptNumber = 0; xInterruptNumber < XPAR_INTC_MAX_NUM_INTR_INPUTS; xInterruptNumber++ ) + { + if( ulInterruptStatus & 0x01UL ) + { + /* Clear the pending interrupt. */ + XIntc_mAckIntr( pxInterruptController->BaseAddress, ulInterruptMask ); + + /* Call the registered handler. */ + pxTable = &( pxInterruptController->HandlerTable[ xInterruptNumber ] ); + pxTable->Handler( pxTable->CallBackRef ); + } + + /* Check the next interrupt. */ + ulInterruptMask <<= 0x01UL; + ulInterruptStatus >>= 0x01UL; + + /* Have we serviced all interrupts? */ + if( ulInterruptStatus == 0UL ) + { + break; + } + } +} +/*-----------------------------------------------------------*/ + +void vPortSetupInterruptController( void ) +{ +extern void vPortISRWrapper( void ); + + /* Perform all library calls necessary to initialise the exception table + and interrupt controller. This assumes only one interrupt controller is in + use. */ + XExc_mDisableExceptions( XEXC_NON_CRITICAL ); + XExc_Init(); + + /* The library functions save the context - we then jump to a wrapper to + save the stack into the TCB. The wrapper then calls the handler defined + above. */ + XExc_RegisterHandler( XEXC_ID_NON_CRITICAL_INT, ( XExceptionHandler ) vPortISRWrapper, NULL ); + XIntc_Initialize( &xInterruptController, XPAR_XPS_INTC_0_DEVICE_ID ); + XIntc_Start( &xInterruptController, XIN_REAL_MODE ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ) +{ +BaseType_t xReturn = pdFAIL; + + /* This function is defined here so the scope of xInterruptController can + remain within this file. */ + + if( XST_SUCCESS == XIntc_Connect( &xInterruptController, ucInterruptID, pxHandler, pvCallBackRef ) ) + { + XIntc_Enable( &xInterruptController, ucInterruptID ); + xReturn = pdPASS; + } + + return xReturn; +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portasm.S new file mode 100644 index 0000000..0c5dc1b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portasm.S @@ -0,0 +1,383 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOSConfig.h" + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern xTaskIncrementTick + .extern vPortISRHandler + + .global vPortStartFirstTask + .global vPortYield + .global vPortTickISR + .global vPortISRWrapper + .global vPortSaveFPURegisters + .global vPortRestoreFPURegisters + +.set BChainField, 0 +.set NextLRField, BChainField + 4 +.set MSRField, NextLRField + 4 +.set PCField, MSRField + 4 +.set LRField, PCField + 4 +.set CTRField, LRField + 4 +.set XERField, CTRField + 4 +.set CRField, XERField + 4 +.set USPRG0Field, CRField + 4 +.set r0Field, USPRG0Field + 4 +.set r2Field, r0Field + 4 +.set r3r31Field, r2Field + 4 +.set IFrameSize, r3r31Field + ( ( 31 - 3 ) + 1 ) * 4 + + +.macro portSAVE_STACK_POINTER_AND_LR + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis R2, R0, pxCurrentTCB@ha + lwz R2, pxCurrentTCB@l( R2 ) + + /* Store the stack pointer into the TCB */ + stw SP, 0( R2 ) + + /* Save the link register */ + stwu R1, -24( R1 ) + mflr R0 + stw R31, 20( R1 ) + stw R0, 28( R1 ) + mr R31, r1 + +.endm + +.macro portRESTORE_STACK_POINTER_AND_LR + + /* Restore the link register */ + lwz R11, 0( R1 ) + lwz R0, 4( R11 ) + mtlr R0 + lwz R31, -4( R11 ) + mr R1, R11 + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis SP, R0, pxCurrentTCB@ha + lwz SP, pxCurrentTCB@l( R1 ) + + /* Get the task stack pointer from the TCB. */ + lwz SP, 0( SP ) + +.endm + + +vPortStartFirstTask: + + /* Get the address of the TCB. */ + xor R0, R0, R0 + addis SP, R0, pxCurrentTCB@ha + lwz SP, pxCurrentTCB@l( SP ) + + /* Get the task stack pointer from the TCB. */ + lwz SP, 0( SP ) + + /* Restore MSR register to SRR1. */ + lwz R0, MSRField(R1) + mtsrr1 R0 + + /* Restore current PC location to SRR0. */ + lwz R0, PCField(R1) + mtsrr0 R0 + + /* Save USPRG0 register */ + lwz R0, USPRG0Field(R1) + mtspr 0x100,R0 + + /* Restore Condition register */ + lwz R0, CRField(R1) + mtcr R0 + + /* Restore Fixed Point Exception register */ + lwz R0, XERField(R1) + mtxer R0 + + /* Restore Counter register */ + lwz R0, CTRField(R1) + mtctr R0 + + /* Restore Link register */ + lwz R0, LRField(R1) + mtlr R0 + + /* Restore remaining GPR registers. */ + lmw R3,r3r31Field(R1) + + /* Restore r0 and r2. */ + lwz R0, r0Field(R1) + lwz R2, r2Field(R1) + + /* Remove frame from stack */ + addi R1,R1,IFrameSize + + /* Return into the first task */ + rfi + + + +vPortYield: + + portSAVE_STACK_POINTER_AND_LR + bl vTaskSwitchContext + portRESTORE_STACK_POINTER_AND_LR + blr + +vPortTickISR: + + portSAVE_STACK_POINTER_AND_LR + bl xTaskIncrementTick + + #if configUSE_PREEMPTION == 1 + bl vTaskSwitchContext + #endif + + /* Clear the interrupt */ + lis R0, 2048 + mttsr R0 + + portRESTORE_STACK_POINTER_AND_LR + blr + +vPortISRWrapper: + + portSAVE_STACK_POINTER_AND_LR + bl vPortISRHandler + portRESTORE_STACK_POINTER_AND_LR + blr + +#if configUSE_FPU == 1 + +vPortSaveFPURegisters: + + /* Enable APU and mark FPU as present. */ + mfmsr r0 + xor r30, r30, r30 + oris r30, r30, 512 + ori r30, r30, 8192 + or r0, r0, r30 + mtmsr r0 + +#ifdef USE_DP_FPU + + /* Buffer address is in r3. Save each flop register into an offset from + this buffer address. */ + stfd f0, 0(r3) + stfd f1, 8(r3) + stfd f2, 16(r3) + stfd f3, 24(r3) + stfd f4, 32(r3) + stfd f5, 40(r3) + stfd f6, 48(r3) + stfd f7, 56(r3) + stfd f8, 64(r3) + stfd f9, 72(r3) + stfd f10, 80(r3) + stfd f11, 88(r3) + stfd f12, 96(r3) + stfd f13, 104(r3) + stfd f14, 112(r3) + stfd f15, 120(r3) + stfd f16, 128(r3) + stfd f17, 136(r3) + stfd f18, 144(r3) + stfd f19, 152(r3) + stfd f20, 160(r3) + stfd f21, 168(r3) + stfd f22, 176(r3) + stfd f23, 184(r3) + stfd f24, 192(r3) + stfd f25, 200(r3) + stfd f26, 208(r3) + stfd f27, 216(r3) + stfd f28, 224(r3) + stfd f29, 232(r3) + stfd f30, 240(r3) + stfd f31, 248(r3) + + /* Also save the FPSCR. */ + mffs f31 + stfs f31, 256(r3) + +#else + + /* Buffer address is in r3. Save each flop register into an offset from + this buffer address. */ + stfs f0, 0(r3) + stfs f1, 4(r3) + stfs f2, 8(r3) + stfs f3, 12(r3) + stfs f4, 16(r3) + stfs f5, 20(r3) + stfs f6, 24(r3) + stfs f7, 28(r3) + stfs f8, 32(r3) + stfs f9, 36(r3) + stfs f10, 40(r3) + stfs f11, 44(r3) + stfs f12, 48(r3) + stfs f13, 52(r3) + stfs f14, 56(r3) + stfs f15, 60(r3) + stfs f16, 64(r3) + stfs f17, 68(r3) + stfs f18, 72(r3) + stfs f19, 76(r3) + stfs f20, 80(r3) + stfs f21, 84(r3) + stfs f22, 88(r3) + stfs f23, 92(r3) + stfs f24, 96(r3) + stfs f25, 100(r3) + stfs f26, 104(r3) + stfs f27, 108(r3) + stfs f28, 112(r3) + stfs f29, 116(r3) + stfs f30, 120(r3) + stfs f31, 124(r3) + + /* Also save the FPSCR. */ + mffs f31 + stfs f31, 128(r3) + +#endif + + blr + +#endif /* configUSE_FPU. */ + + +#if configUSE_FPU == 1 + +vPortRestoreFPURegisters: + + /* Enable APU and mark FPU as present. */ + mfmsr r0 + xor r30, r30, r30 + oris r30, r30, 512 + ori r30, r30, 8192 + or r0, r0, r30 + mtmsr r0 + +#ifdef USE_DP_FPU + + /* Buffer address is in r3. Restore each flop register from an offset + into this buffer. + + First the FPSCR. */ + lfs f31, 256(r3) + mtfsf f31, 7 + + lfd f0, 0(r3) + lfd f1, 8(r3) + lfd f2, 16(r3) + lfd f3, 24(r3) + lfd f4, 32(r3) + lfd f5, 40(r3) + lfd f6, 48(r3) + lfd f7, 56(r3) + lfd f8, 64(r3) + lfd f9, 72(r3) + lfd f10, 80(r3) + lfd f11, 88(r3) + lfd f12, 96(r3) + lfd f13, 104(r3) + lfd f14, 112(r3) + lfd f15, 120(r3) + lfd f16, 128(r3) + lfd f17, 136(r3) + lfd f18, 144(r3) + lfd f19, 152(r3) + lfd f20, 160(r3) + lfd f21, 168(r3) + lfd f22, 176(r3) + lfd f23, 184(r3) + lfd f24, 192(r3) + lfd f25, 200(r3) + lfd f26, 208(r3) + lfd f27, 216(r3) + lfd f28, 224(r3) + lfd f29, 232(r3) + lfd f30, 240(r3) + lfd f31, 248(r3) + +#else + + /* Buffer address is in r3. Restore each flop register from an offset + into this buffer. + + First the FPSCR. */ + lfs f31, 128(r3) + mtfsf f31, 7 + + lfs f0, 0(r3) + lfs f1, 4(r3) + lfs f2, 8(r3) + lfs f3, 12(r3) + lfs f4, 16(r3) + lfs f5, 20(r3) + lfs f6, 24(r3) + lfs f7, 28(r3) + lfs f8, 32(r3) + lfs f9, 36(r3) + lfs f10, 40(r3) + lfs f11, 44(r3) + lfs f12, 48(r3) + lfs f13, 52(r3) + lfs f14, 56(r3) + lfs f15, 60(r3) + lfs f16, 64(r3) + lfs f17, 68(r3) + lfs f18, 72(r3) + lfs f19, 76(r3) + lfs f20, 80(r3) + lfs f21, 84(r3) + lfs f22, 88(r3) + lfs f23, 92(r3) + lfs f24, 96(r3) + lfs f25, 100(r3) + lfs f26, 104(r3) + lfs f27, 108(r3) + lfs f28, 112(r3) + lfs f29, 116(r3) + lfs f30, 120(r3) + lfs f31, 124(r3) + +#endif + + blr + +#endif /* configUSE_FPU. */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portmacro.h new file mode 100644 index 0000000..5bd285b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portmacro.h @@ -0,0 +1,119 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include "xexception_l.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* This port uses the critical nesting count from the TCB rather than +maintaining a separate value and then saving this value in the task stack. */ +#define portCRITICAL_NESTING_IN_TCB 1 + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() XExc_mDisableExceptions( XEXC_NON_CRITICAL ); +#define portENABLE_INTERRUPTS() XExc_mEnableExceptions( XEXC_NON_CRITICAL ); + +/*-----------------------------------------------------------*/ + +/* Critical section macros. */ +void vTaskEnterCritical( void ); +void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +void vPortYield( void ); +#define portYIELD() asm volatile ( "SC \n\t NOP" ) +#define portYIELD_FROM_ISR() vTaskSwitchContext() + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() asm volatile ( "NOP" ) + +/* There are 32 * 32bit floating point regieters, plus the FPSCR to save. */ +#define portNO_FLOP_REGISTERS_TO_SAVE ( 32 + 1 ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Port specific interrupt handling functions. */ +void vPortSetupInterruptController( void ); +BaseType_t xPortInstallInterruptHandler( uint8_t ucInterruptID, XInterruptHandler pxHandler, void *pvCallBackRef ); + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/Documentation.url b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/Documentation.url new file mode 100644 index 0000000..5546f87 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/Documentation.url @@ -0,0 +1,5 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,11 +[InternetShortcut] +IDList= +URL=https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h new file mode 100644 index 0000000..5948a06 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h @@ -0,0 +1,108 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ + +/* + * This freertos_risc_v_chip_specific_extensions.h is for use with Pulpino Ri5cy + * devices, developed and tested using the Vega board RV32M1RM. + */ + +#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ +#define __FREERTOS_RISC_V_EXTENSIONS_H__ + +#define portasmHAS_MTIME 0 + +/* Constants to define the additional registers found on the Pulpino RI5KY. */ +#define lpstart0 0x7b0 +#define lpend0 0x7b1 +#define lpcount0 0x7b2 +#define lpstart1 0x7b4 +#define lpend1 0x7b5 +#define lpcount1 0x7b6 + +/* Six additional registers to save and restore, as per the #defines above. */ +#define portasmADDITIONAL_CONTEXT_SIZE 6 /* Must be even number on 32-bit cores. */ + +/* Save additional registers found on the Pulpino. */ +.macro portasmSAVE_ADDITIONAL_REGISTERS + addi sp, sp, -(portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE) /* Make room for the additional registers. */ + csrr t0, lpstart0 /* Load additional registers into accessible temporary registers. */ + csrr t1, lpend0 + csrr t2, lpcount0 + csrr t3, lpstart1 + csrr t4, lpend1 + csrr t5, lpcount1 + sw t0, 1 * portWORD_SIZE( sp ) + sw t1, 2 * portWORD_SIZE( sp ) + sw t2, 3 * portWORD_SIZE( sp ) + sw t3, 4 * portWORD_SIZE( sp ) + sw t4, 5 * portWORD_SIZE( sp ) + sw t5, 6 * portWORD_SIZE( sp ) + .endm + +/* Restore the additional registers found on the Pulpino. */ +.macro portasmRESTORE_ADDITIONAL_REGISTERS + lw t0, 1 * portWORD_SIZE( sp ) /* Load additional registers into accessible temporary registers. */ + lw t1, 2 * portWORD_SIZE( sp ) + lw t2, 3 * portWORD_SIZE( sp ) + lw t3, 4 * portWORD_SIZE( sp ) + lw t4, 5 * portWORD_SIZE( sp ) + lw t5, 6 * portWORD_SIZE( sp ) + csrw lpstart0, t0 + csrw lpend0, t1 + csrw lpcount0, t2 + csrw lpstart1, t3 + csrw lpend1, t4 + csrw lpcount1, t5 + addi sp, sp, (portasmADDITIONAL_CONTEXT_SIZE * portWORD_SIZE )/* Remove space added for additional registers. */ + .endm + +#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h new file mode 100644 index 0000000..3bf34a5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h @@ -0,0 +1,69 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V\chip_specific_extensions\RISCV_MTIME_CLINT_no_extensions + * + */ + + +#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ +#define __FREERTOS_RISC_V_EXTENSIONS_H__ + +#define portasmHAS_SIFIVE_CLINT 1 +#define portasmHAS_MTIME 1 +#define portasmADDITIONAL_CONTEXT_SIZE 0 + +.macro portasmSAVE_ADDITIONAL_REGISTERS + /* No additional registers to save, so this macro does nothing. */ + .endm + +.macro portasmRESTORE_ADDITIONAL_REGISTERS + /* No additional registers to restore, so this macro does nothing. */ + .endm + +#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h new file mode 100644 index 0000000..c1532bd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h @@ -0,0 +1,69 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V\chip_specific_extensions\RISCV_MTIME_CLINT_no_extensions + * + */ + + +#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ +#define __FREERTOS_RISC_V_EXTENSIONS_H__ + +#define portasmHAS_SIFIVE_CLINT 0 +#define portasmHAS_MTIME 0 +#define portasmADDITIONAL_CONTEXT_SIZE 0 + +.macro portasmSAVE_ADDITIONAL_REGISTERS + /* No additional registers to save, so this macro does nothing. */ + .endm + +.macro portasmRESTORE_ADDITIONAL_REGISTERS + /* No additional registers to restore, so this macro does nothing. */ + .endm + +#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h new file mode 100644 index 0000000..233fe59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h @@ -0,0 +1,69 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ + + +#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ +#define __FREERTOS_RISC_V_EXTENSIONS_H__ + +#define portasmHAS_SIFIVE_CLINT 1 +#define portasmHAS_MTIME 1 +#define portasmADDITIONAL_CONTEXT_SIZE 0 /* Must be even number on 32-bit cores. */ + +.macro portasmSAVE_ADDITIONAL_REGISTERS + /* No additional registers to save, so this macro does nothing. */ + .endm + +.macro portasmRESTORE_ADDITIONAL_REGISTERS + /* No additional registers to restore, so this macro does nothing. */ + .endm + +#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/readme.txt new file mode 100644 index 0000000..b24c0b9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/readme.txt @@ -0,0 +1,23 @@ +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/port.c new file mode 100644 index 0000000..5674530 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/port.c @@ -0,0 +1,203 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RISC-V port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "portmacro.h" + +/* Standard includes. */ +#include "string.h" + +#ifdef configCLINT_BASE_ADDRESS + #warning The configCLINT_BASE_ADDRESS constant has been deprecated. configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS are currently being derived from the (possibly 0) configCLINT_BASE_ADDRESS setting. Please update to define configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS dirctly in place of configCLINT_BASE_ADDRESS. See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html +#endif + +#ifndef configMTIME_BASE_ADDRESS + #warning configMTIME_BASE_ADDRESS must be defined in FreeRTOSConfig.h. If the target chip includes a memory-mapped mtime register then set configMTIME_BASE_ADDRESS to the mapped address. Otherwise set configMTIME_BASE_ADDRESS to 0. See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html +#endif + +#ifndef configMTIMECMP_BASE_ADDRESS + #warning configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h. If the target chip includes a memory-mapped mtimecmp register then set configMTIMECMP_BASE_ADDRESS to the mapped address. Otherwise set configMTIMECMP_BASE_ADDRESS to 0. See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html +#endif + +/* Let the user override the pre-loading of the initial RA. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS 0 +#endif + +/* The stack used by interrupt service routines. Set configISR_STACK_SIZE_WORDS + * to use a statically allocated array as the interrupt stack. Alternative leave + * configISR_STACK_SIZE_WORDS undefined and update the linker script so that a + * linker variable names __freertos_irq_stack_top has the same value as the top + * of the stack used by main. Using the linker script method will repurpose the + * stack that was used by main before the scheduler was started for use as the + * interrupt stack after the scheduler has started. */ +#ifdef configISR_STACK_SIZE_WORDS + static __attribute__ ((aligned(16))) StackType_t xISRStack[ configISR_STACK_SIZE_WORDS ] = { 0 }; + const StackType_t xISRStackTop = ( StackType_t ) &( xISRStack[ configISR_STACK_SIZE_WORDS & ~portBYTE_ALIGNMENT_MASK ] ); + + /* Don't use 0xa5 as the stack fill bytes as that is used by the kernerl for + the task stacks, and so will legitimately appear in many positions within + the ISR stack. */ + #define portISR_STACK_FILL_BYTE 0xee +#else + extern const uint32_t __freertos_irq_stack_top[]; + const StackType_t xISRStackTop = ( StackType_t ) __freertos_irq_stack_top; +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) __attribute__(( weak )); + +/*-----------------------------------------------------------*/ + +/* Used to program the machine timer compare register. */ +uint64_t ullNextTime = 0ULL; +const uint64_t *pullNextTime = &ullNextTime; +const size_t uxTimerIncrementsForOneTick = ( size_t ) ( ( configCPU_CLOCK_HZ ) / ( configTICK_RATE_HZ ) ); /* Assumes increment won't go over 32-bits. */ +uint32_t const ullMachineTimerCompareRegisterBase = configMTIMECMP_BASE_ADDRESS; +volatile uint64_t * pullMachineTimerCompareRegister = NULL; + +/* Holds the critical nesting value - deliberately non-zero at start up to + * ensure interrupts are not accidentally enabled before the scheduler starts. */ +size_t xCriticalNesting = ( size_t ) 0xaaaaaaaa; +size_t *pxCriticalNesting = &xCriticalNesting; + +/* Used to catch tasks that attempt to return from their implementing function. */ +size_t xTaskReturnAddress = ( size_t ) portTASK_RETURN_ADDRESS; + +/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task + * stack checking. A problem in the ISR stack will trigger an assert, not call + * the stack overflow hook function (because the stack overflow hook is specific + * to a task stack, not the ISR stack). */ +#if defined( configISR_STACK_SIZE_WORDS ) && ( configCHECK_FOR_STACK_OVERFLOW > 2 ) + #warning This path not tested, or even compiled yet. + + static const uint8_t ucExpectedStackBytes[] = { + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE }; \ + + #define portCHECK_ISR_STACK() configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) ) +#else + /* Define the function away. */ + #define portCHECK_ISR_STACK() +#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + +/*-----------------------------------------------------------*/ + +#if( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) + + void vPortSetupTimerInterrupt( void ) + { + uint32_t ulCurrentTimeHigh, ulCurrentTimeLow; + volatile uint32_t * const pulTimeHigh = ( volatile uint32_t * const ) ( ( configMTIME_BASE_ADDRESS ) + 4UL ); /* 8-byte type so high 32-bit word is 4 bytes up. */ + volatile uint32_t * const pulTimeLow = ( volatile uint32_t * const ) ( configMTIME_BASE_ADDRESS ); + volatile uint32_t ulHartId; + + __asm volatile( "csrr %0, mhartid" : "=r"( ulHartId ) ); + pullMachineTimerCompareRegister = ( volatile uint64_t * ) ( ullMachineTimerCompareRegisterBase + ( ulHartId * sizeof( uint64_t ) ) ); + + do + { + ulCurrentTimeHigh = *pulTimeHigh; + ulCurrentTimeLow = *pulTimeLow; + } while( ulCurrentTimeHigh != *pulTimeHigh ); + + ullNextTime = ( uint64_t ) ulCurrentTimeHigh; + ullNextTime <<= 32ULL; /* High 4-byte word is 32-bits up. */ + ullNextTime |= ( uint64_t ) ulCurrentTimeLow; + ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick; + *pullMachineTimerCompareRegister = ullNextTime; + + /* Prepare the time to use after the next tick interrupt. */ + ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick; + } + +#endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIME_BASE_ADDRESS != 0 ) */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void xPortStartFirstTask( void ); + + #if( configASSERT_DEFINED == 1 ) + { + /* Check alignment of the interrupt stack - which is the same as the + * stack that was being used by main() prior to the scheduler being + * started. */ + configASSERT( ( xISRStackTop & portBYTE_ALIGNMENT_MASK ) == 0 ); + + #ifdef configISR_STACK_SIZE_WORDS + { + memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) ); + } + #endif /* configISR_STACK_SIZE_WORDS */ + } + #endif /* configASSERT_DEFINED */ + + /* If there is a CLINT then it is ok to use the default implementation + * in this file, otherwise vPortSetupTimerInterrupt() must be implemented to + * configure whichever clock is to be used to generate the tick interrupt. */ + vPortSetupTimerInterrupt(); + + #if( ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) ) + { + /* Enable mtime and external interrupts. 1<<7 for timer interrupt, + * 1<<11 for external interrupt. _RB_ What happens here when mtime is + * not present as with pulpino? */ + __asm volatile( "csrs mie, %0" :: "r"(0x880) ); + } + #endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) */ + + xPortStartFirstTask(); + + /* Should not get here as after calling xPortStartFirstTask() only tasks + * should be executing. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portASM.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portASM.S new file mode 100644 index 0000000..4bc455c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portASM.S @@ -0,0 +1,384 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code which tailors the port to a specific RISC-V chip: + * + * + The code that is common to all RISC-V chips is implemented in + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S. There is only one + * portASM.S file because the same file is used no matter which RISC-V chip is + * in use. + * + * + The code that tailors the kernel's RISC-V port to a specific RISC-V + * chip is implemented in freertos_risc_v_chip_specific_extensions.h. There + * is one freertos_risc_v_chip_specific_extensions.h that can be used with any + * RISC-V chip that both includes a standard CLINT and does not add to the + * base set of RISC-V registers. There are additional + * freertos_risc_v_chip_specific_extensions.h files for RISC-V implementations + * that do not include a standard CLINT or do add to the base set of RISC-V + * registers. + * + * CARE MUST BE TAKEN TO INCLDUE THE CORRECT + * freertos_risc_v_chip_specific_extensions.h HEADER FILE FOR THE CHIP + * IN USE. To include the correct freertos_risc_v_chip_specific_extensions.h + * header file ensure the path to the correct header file is in the assembler's + * include path. + * + * This freertos_risc_v_chip_specific_extensions.h is for use on RISC-V chips + * that include a standard CLINT and do not add to the base set of RISC-V + * registers. + * + */ + +#include "portContext.h" + +/* Check the freertos_risc_v_chip_specific_extensions.h and/or command line +definitions. */ +#if defined( portasmHAS_CLINT ) && defined( portasmHAS_MTIME ) + #error The portasmHAS_CLINT constant has been deprecated. Please replace it with portasmHAS_MTIME. portasmHAS_CLINT and portasmHAS_MTIME cannot both be defined at once. See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html +#endif + +#ifdef portasmHAS_CLINT + #warning The portasmHAS_CLINT constant has been deprecated. Please replace it with portasmHAS_MTIME and portasmHAS_SIFIVE_CLINT. For now portasmHAS_MTIME and portasmHAS_SIFIVE_CLINT are derived from portasmHAS_CLINT. See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html + #define portasmHAS_MTIME portasmHAS_CLINT + #define portasmHAS_SIFIVE_CLINT portasmHAS_CLINT +#endif + +#ifndef portasmHAS_MTIME + #error freertos_risc_v_chip_specific_extensions.h must define portasmHAS_MTIME to either 1 (MTIME clock present) or 0 (MTIME clock not present). See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html +#endif + +#ifndef portasmHAS_SIFIVE_CLINT + #define portasmHAS_SIFIVE_CLINT 0 +#endif + +.global xPortStartFirstTask +.global pxPortInitialiseStack +.global freertos_risc_v_trap_handler +.global freertos_risc_v_exception_handler +.global freertos_risc_v_interrupt_handler +.global freertos_risc_v_mtimer_interrupt_handler + +.extern vTaskSwitchContext +.extern xTaskIncrementTick +.extern pullMachineTimerCompareRegister +.extern pullNextTime +.extern uxTimerIncrementsForOneTick /* size_t type so 32-bit on 32-bit core and 64-bits on 64-bit core. */ +.extern xTaskReturnAddress + +.weak freertos_risc_v_application_exception_handler +.weak freertos_risc_v_application_interrupt_handler +/*-----------------------------------------------------------*/ + +.macro portUPDATE_MTIMER_COMPARE_REGISTER + load_x a0, pullMachineTimerCompareRegister /* Load address of compare register into a0. */ + load_x a1, pullNextTime /* Load the address of ullNextTime into a1. */ + + #if( __riscv_xlen == 32 ) + + /* Update the 64-bit mtimer compare match value in two 32-bit writes. */ + li a4, -1 + lw a2, 0(a1) /* Load the low word of ullNextTime into a2. */ + lw a3, 4(a1) /* Load the high word of ullNextTime into a3. */ + sw a4, 0(a0) /* Low word no smaller than old value to start with - will be overwritten below. */ + sw a3, 4(a0) /* Store high word of ullNextTime into compare register. No smaller than new value. */ + sw a2, 0(a0) /* Store low word of ullNextTime into compare register. */ + lw t0, uxTimerIncrementsForOneTick /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */ + add a4, t0, a2 /* Add the low word of ullNextTime to the timer increments for one tick (assumes timer increment for one tick fits in 32-bits). */ + sltu t1, a4, a2 /* See if the sum of low words overflowed (what about the zero case?). */ + add t2, a3, t1 /* Add overflow to high word of ullNextTime. */ + sw a4, 0(a1) /* Store new low word of ullNextTime. */ + sw t2, 4(a1) /* Store new high word of ullNextTime. */ + + #endif /* __riscv_xlen == 32 */ + + #if( __riscv_xlen == 64 ) + + /* Update the 64-bit mtimer compare match value. */ + ld t2, 0(a1) /* Load ullNextTime into t2. */ + sd t2, 0(a0) /* Store ullNextTime into compare register. */ + ld t0, uxTimerIncrementsForOneTick /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */ + add t4, t0, t2 /* Add ullNextTime to the timer increments for one tick. */ + sd t4, 0(a1) /* Store ullNextTime. */ + + #endif /* __riscv_xlen == 64 */ + .endm +/*-----------------------------------------------------------*/ + +/* + * Unlike other ports pxPortInitialiseStack() is written in assembly code as it + * needs access to the portasmADDITIONAL_CONTEXT_SIZE constant. The prototype + * for the function is as per the other ports: + * StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ); + * + * As per the standard RISC-V ABI pxTopcOfStack is passed in in a0, pxCode in + * a1, and pvParameters in a2. The new top of stack is passed out in a0. + * + * RISC-V maps registers to ABI names as follows (X1 to X31 integer registers + * for the 'I' profile, X1 to X15 for the 'E' profile, currently I assumed). + * + * Register ABI Name Description Saver + * x0 zero Hard-wired zero - + * x1 ra Return address Caller + * x2 sp Stack pointer Callee + * x3 gp Global pointer - + * x4 tp Thread pointer - + * x5-7 t0-2 Temporaries Caller + * x8 s0/fp Saved register/Frame pointer Callee + * x9 s1 Saved register Callee + * x10-11 a0-1 Function Arguments/return values Caller + * x12-17 a2-7 Function arguments Caller + * x18-27 s2-11 Saved registers Callee + * x28-31 t3-6 Temporaries Caller + * + * The RISC-V context is saved t FreeRTOS tasks in the following stack frame, + * where the global and thread pointers are currently assumed to be constant so + * are not saved: + * + * mstatus + * xCriticalNesting + * x31 + * x30 + * x29 + * x28 + * x27 + * x26 + * x25 + * x24 + * x23 + * x22 + * x21 + * x20 + * x19 + * x18 + * x17 + * x16 + * x15 + * x14 + * x13 + * x12 + * x11 + * pvParameters + * x9 + * x8 + * x7 + * x6 + * x5 + * portTASK_RETURN_ADDRESS + * [chip specific registers go here] + * pxCode + */ +pxPortInitialiseStack: + csrr t0, mstatus /* Obtain current mstatus value. */ + andi t0, t0, ~0x8 /* Ensure interrupts are disabled when the stack is restored within an ISR. Required when a task is created after the schedulre has been started, otherwise interrupts would be disabled anyway. */ + addi t1, x0, 0x188 /* Generate the value 0x1880, which are the MPIE and MPP bits to set in mstatus. */ + slli t1, t1, 4 + or t0, t0, t1 /* Set MPIE and MPP bits in mstatus value. */ + + addi a0, a0, -portWORD_SIZE + store_x t0, 0(a0) /* mstatus onto the stack. */ + addi a0, a0, -portWORD_SIZE /* Space for critical nesting count. */ + store_x x0, 0(a0) /* Critical nesting count starts at 0 for every task. */ + +#ifdef __riscv_32e + addi a0, a0, -(6 * portWORD_SIZE) /* Space for registers x11-x15. */ +#else + addi a0, a0, -(22 * portWORD_SIZE) /* Space for registers x11-x31. */ +#endif + store_x a2, 0(a0) /* Task parameters (pvParameters parameter) goes into register X10/a0 on the stack. */ + addi a0, a0, -(6 * portWORD_SIZE) /* Space for registers x5-x9. */ + load_x t0, xTaskReturnAddress + store_x t0, 0(a0) /* Return address onto the stack. */ + addi t0, x0, portasmADDITIONAL_CONTEXT_SIZE /* The number of chip specific additional registers. */ +chip_specific_stack_frame: /* First add any chip specific registers to the stack frame being created. */ + beq t0, x0, 1f /* No more chip specific registers to save. */ + addi a0, a0, -portWORD_SIZE /* Make space for chip specific register. */ + store_x x0, 0(a0) /* Give the chip specific register an initial value of zero. */ + addi t0, t0, -1 /* Decrement the count of chip specific registers remaining. */ + j chip_specific_stack_frame /* Until no more chip specific registers. */ +1: + addi a0, a0, -portWORD_SIZE + store_x a1, 0(a0) /* mret value (pxCode parameter) onto the stack. */ + ret +/*-----------------------------------------------------------*/ + +xPortStartFirstTask: + load_x sp, pxCurrentTCB /* Load pxCurrentTCB. */ + load_x sp, 0( sp ) /* Read sp from first TCB member. */ + + load_x x1, 0( sp ) /* Note for starting the scheduler the exception return address is used as the function return address. */ + + portasmRESTORE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */ + + load_x x7, 4 * portWORD_SIZE( sp ) /* t2 */ + load_x x8, 5 * portWORD_SIZE( sp ) /* s0/fp */ + load_x x9, 6 * portWORD_SIZE( sp ) /* s1 */ + load_x x10, 7 * portWORD_SIZE( sp ) /* a0 */ + load_x x11, 8 * portWORD_SIZE( sp ) /* a1 */ + load_x x12, 9 * portWORD_SIZE( sp ) /* a2 */ + load_x x13, 10 * portWORD_SIZE( sp ) /* a3 */ + load_x x14, 11 * portWORD_SIZE( sp ) /* a4 */ + load_x x15, 12 * portWORD_SIZE( sp ) /* a5 */ +#ifndef __riscv_32e + load_x x16, 13 * portWORD_SIZE( sp ) /* a6 */ + load_x x17, 14 * portWORD_SIZE( sp ) /* a7 */ + load_x x18, 15 * portWORD_SIZE( sp ) /* s2 */ + load_x x19, 16 * portWORD_SIZE( sp ) /* s3 */ + load_x x20, 17 * portWORD_SIZE( sp ) /* s4 */ + load_x x21, 18 * portWORD_SIZE( sp ) /* s5 */ + load_x x22, 19 * portWORD_SIZE( sp ) /* s6 */ + load_x x23, 20 * portWORD_SIZE( sp ) /* s7 */ + load_x x24, 21 * portWORD_SIZE( sp ) /* s8 */ + load_x x25, 22 * portWORD_SIZE( sp ) /* s9 */ + load_x x26, 23 * portWORD_SIZE( sp ) /* s10 */ + load_x x27, 24 * portWORD_SIZE( sp ) /* s11 */ + load_x x28, 25 * portWORD_SIZE( sp ) /* t3 */ + load_x x29, 26 * portWORD_SIZE( sp ) /* t4 */ + load_x x30, 27 * portWORD_SIZE( sp ) /* t5 */ + load_x x31, 28 * portWORD_SIZE( sp ) /* t6 */ +#endif + + load_x x5, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp ) /* Obtain xCriticalNesting value for this task from task's stack. */ + load_x x6, pxCriticalNesting /* Load the address of xCriticalNesting into x6. */ + store_x x5, 0( x6 ) /* Restore the critical nesting value for this task. */ + + load_x x5, portMSTATUS_OFFSET * portWORD_SIZE( sp ) /* Initial mstatus into x5 (t0). */ + addi x5, x5, 0x08 /* Set MIE bit so the first task starts with interrupts enabled - required as returns with ret not eret. */ + csrrw x0, mstatus, x5 /* Interrupts enabled from here! */ + + load_x x5, 2 * portWORD_SIZE( sp ) /* Initial x5 (t0) value. */ + load_x x6, 3 * portWORD_SIZE( sp ) /* Initial x6 (t1) value. */ + + addi sp, sp, portCONTEXT_SIZE + ret +/*-----------------------------------------------------------*/ + +freertos_risc_v_application_exception_handler: + csrr t0, mcause /* For viewing in the debugger only. */ + csrr t1, mepc /* For viewing in the debugger only */ + csrr t2, mstatus /* For viewing in the debugger only */ + j . +/*-----------------------------------------------------------*/ + +freertos_risc_v_application_interrupt_handler: + csrr t0, mcause /* For viewing in the debugger only. */ + csrr t1, mepc /* For viewing in the debugger only */ + csrr t2, mstatus /* For viewing in the debugger only */ + j . +/*-----------------------------------------------------------*/ + +.section .text.freertos_risc_v_exception_handler +freertos_risc_v_exception_handler: + portcontextSAVE_EXCEPTION_CONTEXT + /* a0 now contains mcause. */ + li t0, 11 /* 11 == environment call. */ + bne a0, t0, other_exception /* Not an M environment call, so some other exception. */ + call vTaskSwitchContext + portcontextRESTORE_CONTEXT + +other_exception: + call freertos_risc_v_application_exception_handler + portcontextRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + +.section .text.freertos_risc_v_interrupt_handler +freertos_risc_v_interrupt_handler: + portcontextSAVE_INTERRUPT_CONTEXT + call freertos_risc_v_application_interrupt_handler + portcontextRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + +.section .text.freertos_risc_v_mtimer_interrupt_handler +freertos_risc_v_mtimer_interrupt_handler: + portcontextSAVE_INTERRUPT_CONTEXT + portUPDATE_MTIMER_COMPARE_REGISTER + call xTaskIncrementTick + beqz a0, exit_without_context_switch /* Don't switch context if incrementing tick didn't unblock a task. */ + call vTaskSwitchContext +exit_without_context_switch: + portcontextRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + +.section .text.freertos_risc_v_trap_handler +.align 8 +freertos_risc_v_trap_handler: + portcontextSAVE_CONTEXT_INTERNAL + + csrr a0, mcause + csrr a1, mepc + + bge a0, x0, synchronous_exception + +asynchronous_interrupt: + store_x a1, 0( sp ) /* Asynchronous interrupt so save unmodified exception return address. */ + load_x sp, xISRStackTop /* Switch to ISR stack. */ + j handle_interrupt + +synchronous_exception: + addi a1, a1, 4 /* Synchronous so update exception return address to the instruction after the instruction that generated the exeption. */ + store_x a1, 0( sp ) /* Save updated exception return address. */ + load_x sp, xISRStackTop /* Switch to ISR stack. */ + j handle_exception + +handle_interrupt: +#if( portasmHAS_MTIME != 0 ) + + test_if_mtimer: /* If there is a CLINT then the mtimer is used to generate the tick interrupt. */ + addi t0, x0, 1 + slli t0, t0, __riscv_xlen - 1 /* LSB is already set, shift into MSB. Shift 31 on 32-bit or 63 on 64-bit cores. */ + addi t1, t0, 7 /* 0x8000[]0007 == machine timer interrupt. */ + bne a0, t1, application_interrupt_handler + + portUPDATE_MTIMER_COMPARE_REGISTER + call xTaskIncrementTick + beqz a0, processed_source /* Don't switch context if incrementing tick didn't unblock a task. */ + call vTaskSwitchContext + j processed_source + +#endif /* portasmHAS_MTIME */ + +application_interrupt_handler: + call freertos_risc_v_application_interrupt_handler + j processed_source + +handle_exception: + /* a0 contains mcause. */ + li t0, 11 /* 11 == environment call. */ + bne a0, t0, application_exception_handler /* Not an M environment call, so some other exception. */ + call vTaskSwitchContext + j processed_source + +application_exception_handler: + call freertos_risc_v_application_exception_handler + j processed_source /* No other exceptions handled yet. */ + +processed_source: + portcontextRESTORE_CONTEXT +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portContext.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portContext.h new file mode 100644 index 0000000..7eebe0e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portContext.h @@ -0,0 +1,192 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTCONTEXT_H +#define PORTCONTEXT_H + +#if __riscv_xlen == 64 + #define portWORD_SIZE 8 + #define store_x sd + #define load_x ld +#elif __riscv_xlen == 32 + #define store_x sw + #define load_x lw + #define portWORD_SIZE 4 +#else + #error Assembler did not define __riscv_xlen +#endif + +#include "freertos_risc_v_chip_specific_extensions.h" + +/* Only the standard core registers are stored by default. Any additional + * registers must be saved by the portasmSAVE_ADDITIONAL_REGISTERS and + * portasmRESTORE_ADDITIONAL_REGISTERS macros - which can be defined in a chip + * specific version of freertos_risc_v_chip_specific_extensions.h. See the + * notes at the top of portASM.S file. */ +#ifdef __riscv_32e + #define portCONTEXT_SIZE ( 15 * portWORD_SIZE ) + #define portCRITICAL_NESTING_OFFSET 13 + #define portMSTATUS_OFFSET 14 +#else + #define portCONTEXT_SIZE ( 31 * portWORD_SIZE ) + #define portCRITICAL_NESTING_OFFSET 29 + #define portMSTATUS_OFFSET 30 +#endif + +/*-----------------------------------------------------------*/ + +.extern pxCurrentTCB +.extern xISRStackTop +.extern xCriticalNesting +.extern pxCriticalNesting +/*-----------------------------------------------------------*/ + +.macro portcontextSAVE_CONTEXT_INTERNAL + addi sp, sp, -portCONTEXT_SIZE + store_x x1, 1 * portWORD_SIZE( sp ) + store_x x5, 2 * portWORD_SIZE( sp ) + store_x x6, 3 * portWORD_SIZE( sp ) + store_x x7, 4 * portWORD_SIZE( sp ) + store_x x8, 5 * portWORD_SIZE( sp ) + store_x x9, 6 * portWORD_SIZE( sp ) + store_x x10, 7 * portWORD_SIZE( sp ) + store_x x11, 8 * portWORD_SIZE( sp ) + store_x x12, 9 * portWORD_SIZE( sp ) + store_x x13, 10 * portWORD_SIZE( sp ) + store_x x14, 11 * portWORD_SIZE( sp ) + store_x x15, 12 * portWORD_SIZE( sp ) +#ifndef __riscv_32e + store_x x16, 13 * portWORD_SIZE( sp ) + store_x x17, 14 * portWORD_SIZE( sp ) + store_x x18, 15 * portWORD_SIZE( sp ) + store_x x19, 16 * portWORD_SIZE( sp ) + store_x x20, 17 * portWORD_SIZE( sp ) + store_x x21, 18 * portWORD_SIZE( sp ) + store_x x22, 19 * portWORD_SIZE( sp ) + store_x x23, 20 * portWORD_SIZE( sp ) + store_x x24, 21 * portWORD_SIZE( sp ) + store_x x25, 22 * portWORD_SIZE( sp ) + store_x x26, 23 * portWORD_SIZE( sp ) + store_x x27, 24 * portWORD_SIZE( sp ) + store_x x28, 25 * portWORD_SIZE( sp ) + store_x x29, 26 * portWORD_SIZE( sp ) + store_x x30, 27 * portWORD_SIZE( sp ) + store_x x31, 28 * portWORD_SIZE( sp ) +#endif + + load_x t0, xCriticalNesting /* Load the value of xCriticalNesting into t0. */ + store_x t0, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp ) /* Store the critical nesting value to the stack. */ + + + csrr t0, mstatus /* Required for MPIE bit. */ + store_x t0, portMSTATUS_OFFSET * portWORD_SIZE( sp ) + + + portasmSAVE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to save any registers unique to the RISC-V implementation. */ + + load_x t0, pxCurrentTCB /* Load pxCurrentTCB. */ + store_x sp, 0( t0 ) /* Write sp to first TCB member. */ + + .endm +/*-----------------------------------------------------------*/ + +.macro portcontextSAVE_EXCEPTION_CONTEXT + portcontextSAVE_CONTEXT_INTERNAL + csrr a0, mcause + csrr a1, mepc + addi a1, a1, 4 /* Synchronous so update exception return address to the instruction after the instruction that generated the exception. */ + store_x a1, 0( sp ) /* Save updated exception return address. */ + load_x sp, xISRStackTop /* Switch to ISR stack. */ + .endm +/*-----------------------------------------------------------*/ + +.macro portcontextSAVE_INTERRUPT_CONTEXT + portcontextSAVE_CONTEXT_INTERNAL + csrr a0, mcause + csrr a1, mepc + store_x a1, 0( sp ) /* Asynchronous interrupt so save unmodified exception return address. */ + load_x sp, xISRStackTop /* Switch to ISR stack. */ + .endm +/*-----------------------------------------------------------*/ + +.macro portcontextRESTORE_CONTEXT + load_x t1, pxCurrentTCB /* Load pxCurrentTCB. */ + load_x sp, 0( t1 ) /* Read sp from first TCB member. */ + + /* Load mepc with the address of the instruction in the task to run next. */ + load_x t0, 0( sp ) + csrw mepc, t0 + + /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */ + portasmRESTORE_ADDITIONAL_REGISTERS + + /* Load mstatus with the interrupt enable bits used by the task. */ + load_x t0, portMSTATUS_OFFSET * portWORD_SIZE( sp ) + csrw mstatus, t0 /* Required for MPIE bit. */ + + load_x t0, portCRITICAL_NESTING_OFFSET * portWORD_SIZE( sp ) /* Obtain xCriticalNesting value for this task from task's stack. */ + load_x t1, pxCriticalNesting /* Load the address of xCriticalNesting into t1. */ + store_x t0, 0( t1 ) /* Restore the critical nesting value for this task. */ + + load_x x1, 1 * portWORD_SIZE( sp ) + load_x x5, 2 * portWORD_SIZE( sp ) + load_x x6, 3 * portWORD_SIZE( sp ) + load_x x7, 4 * portWORD_SIZE( sp ) + load_x x8, 5 * portWORD_SIZE( sp ) + load_x x9, 6 * portWORD_SIZE( sp ) + load_x x10, 7 * portWORD_SIZE( sp ) + load_x x11, 8 * portWORD_SIZE( sp ) + load_x x12, 9 * portWORD_SIZE( sp ) + load_x x13, 10 * portWORD_SIZE( sp ) + load_x x14, 11 * portWORD_SIZE( sp ) + load_x x15, 12 * portWORD_SIZE( sp ) +#ifndef __riscv_32e + load_x x16, 13 * portWORD_SIZE( sp ) + load_x x17, 14 * portWORD_SIZE( sp ) + load_x x18, 15 * portWORD_SIZE( sp ) + load_x x19, 16 * portWORD_SIZE( sp ) + load_x x20, 17 * portWORD_SIZE( sp ) + load_x x21, 18 * portWORD_SIZE( sp ) + load_x x22, 19 * portWORD_SIZE( sp ) + load_x x23, 20 * portWORD_SIZE( sp ) + load_x x24, 21 * portWORD_SIZE( sp ) + load_x x25, 22 * portWORD_SIZE( sp ) + load_x x26, 23 * portWORD_SIZE( sp ) + load_x x27, 24 * portWORD_SIZE( sp ) + load_x x28, 25 * portWORD_SIZE( sp ) + load_x x29, 26 * portWORD_SIZE( sp ) + load_x x30, 27 * portWORD_SIZE( sp ) + load_x x31, 28 * portWORD_SIZE( sp ) +#endif + addi sp, sp, portCONTEXT_SIZE + + mret + .endm +/*-----------------------------------------------------------*/ + +#endif /* PORTCONTEXT_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portmacro.h new file mode 100644 index 0000000..d52a9e6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portmacro.h @@ -0,0 +1,191 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#if __riscv_xlen == 64 + #define portSTACK_TYPE uint64_t + #define portBASE_TYPE int64_t + #define portUBASE_TYPE uint64_t + #define portMAX_DELAY ( TickType_t ) 0xffffffffffffffffUL + #define portPOINTER_SIZE_TYPE uint64_t +#elif __riscv_xlen == 32 + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE int32_t + #define portUBASE_TYPE uint32_t + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#else + #error Assembler did not define __riscv_xlen +#endif + +typedef portSTACK_TYPE StackType_t; +typedef portBASE_TYPE BaseType_t; +typedef portUBASE_TYPE UBaseType_t; +typedef portUBASE_TYPE TickType_t; + +/* Legacy type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#ifdef __riscv_32e + #define portBYTE_ALIGNMENT 8 /* RV32E uses RISC-V EABI with reduced stack alignment requirements */ +#else + #define portBYTE_ALIGNMENT 16 +#endif +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +extern void vTaskSwitchContext( void ); +#define portYIELD() __asm volatile( "ecall" ); +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) vTaskSwitchContext(); } while( 0 ) +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portCRITICAL_NESTING_IN_TCB 0 + +#define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue + +#define portDISABLE_INTERRUPTS() __asm volatile( "csrc mstatus, 8" ) +#define portENABLE_INTERRUPTS() __asm volatile( "csrs mstatus, 8" ) + +extern size_t xCriticalNesting; +#define portENTER_CRITICAL() \ +{ \ + portDISABLE_INTERRUPTS(); \ + xCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ + xCriticalNesting--; \ + if( xCriticalNesting == 0 ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ +} + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - __builtin_clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo + * files (which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/*-----------------------------------------------------------*/ + +#define portNOP() __asm volatile( " nop " ) +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + +/* configCLINT_BASE_ADDRESS is a legacy definition that was replaced by the + * configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS definitions. For + * backward compatibility derive the newer definitions from the old if the old + * definition is found. */ +#if defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS ) && ( configCLINT_BASE_ADDRESS == 0 ) + /* Legacy case where configCLINT_BASE_ADDRESS was defined as 0 to indicate + * there was no CLINT. Equivalent now is to set the MTIME and MTIMECMP + * addresses to 0. */ + #define configMTIME_BASE_ADDRESS ( 0 ) + #define configMTIMECMP_BASE_ADDRESS ( 0 ) +#elif defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS ) + /* Legacy case where configCLINT_BASE_ADDRESS was set to the base address of + * the CLINT. Equivalent now is to derive the MTIME and MTIMECMP addresses + * from the CLINT address. */ + #define configMTIME_BASE_ADDRESS ( ( configCLINT_BASE_ADDRESS ) + 0xBFF8UL ) + #define configMTIMECMP_BASE_ADDRESS ( ( configCLINT_BASE_ADDRESS ) + 0x4000UL ) +#elif !defined( configMTIME_BASE_ADDRESS ) || !defined( configMTIMECMP_BASE_ADDRESS ) + #error configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h. Set them to zero if there is no MTIME (machine time) clock. See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/readme.txt new file mode 100644 index 0000000..b24c0b9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/readme.txt @@ -0,0 +1,23 @@ +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/isr_support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/isr_support.h new file mode 100644 index 0000000..9fa3f6e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/isr_support.h @@ -0,0 +1,127 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Variables used by scheduler */ + .extern _pxCurrentTCB + .extern _usCriticalNesting + +/* + * portSAVE_CONTEXT MACRO + * Saves the context of the general purpose registers, CS and ES (only in far + * memory mode) registers the usCriticalNesting Value and the Stack Pointer + * of the active Task onto the task stack + */ + .macro portSAVE_CONTEXT + + SEL RB0 + + /* Save AX Register to stack. */ + PUSH AX + PUSH HL + /* Save CS register. */ + MOV A, CS + XCH A, X + /* Save ES register. */ + MOV A, ES + PUSH AX + /* Save the remaining general purpose registers from bank 0. */ + PUSH DE + PUSH BC + /* Save the other register banks - only necessary in the GCC port. */ + SEL RB1 + PUSH AX + PUSH BC + PUSH DE + PUSH HL + SEL RB2 + PUSH AX + PUSH BC + PUSH DE + PUSH HL + /* Registers in bank 3 are for ISR use only so don't need saving. */ + SEL RB0 + /* Save the usCriticalNesting value. */ + MOVW AX, !_usCriticalNesting + PUSH AX + /* Save the Stack pointer. */ + MOVW AX, !_pxCurrentTCB + MOVW HL, AX + MOVW AX, SP + MOVW [HL], AX + /* Switch stack pointers. */ + movw sp,#_stack /* Set stack pointer */ + + .endm + + +/* + * portRESTORE_CONTEXT MACRO + * Restores the task Stack Pointer then use this to restore usCriticalNesting, + * general purpose registers and the CS and ES (only in far memory mode) + * of the selected task from the task stack + */ +.macro portRESTORE_CONTEXT MACRO + SEL RB0 + /* Restore the Stack pointer. */ + MOVW AX, !_pxCurrentTCB + MOVW HL, AX + MOVW AX, [HL] + MOVW SP, AX + /* Restore usCriticalNesting value. */ + POP AX + MOVW !_usCriticalNesting, AX + /* Restore the alternative register banks - only necessary in the GCC + port. Register bank 3 is dedicated for interrupts use so is not saved or + restored. */ + SEL RB2 + POP HL + POP DE + POP BC + POP AX + SEL RB1 + POP HL + POP DE + POP BC + POP AX + SEL RB0 + /* Restore the necessary general purpose registers. */ + POP BC + POP DE + /* Restore the ES register. */ + POP AX + MOV ES, A + /* Restore the CS register. */ + XCH A, X + MOV CS, A + /* Restore general purpose register HL. */ + POP HL + /* Restore AX. */ + POP AX + + .endm + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/port.c new file mode 100644 index 0000000..593b1ff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/port.c @@ -0,0 +1,212 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* The critical nesting value is initialised to a non zero value to ensure +interrupts don't accidentally become enabled before the scheduler is started. */ +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) + +/* Initial PSW value allocated to a newly created task. + * 11000110 + * ||||||||-------------- Fill byte + * |||||||--------------- Carry Flag cleared + * |||||----------------- In-service priority Flags set to low level + * ||||------------------ Register bank Select 0 Flag cleared + * |||------------------- Auxiliary Carry Flag cleared + * ||-------------------- Register bank Select 1 Flag cleared + * |--------------------- Zero Flag set + * ---------------------- Global Interrupt Flag set (enabled) + */ +#define portPSW ( 0xc6UL ) + +/* Each task maintains a count of the critical section nesting depth. Each time +a critical section is entered the count is incremented. Each time a critical +section is exited the count is decremented - with interrupts only being +re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as that could cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; + +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. + */ +__attribute__((weak)) void vApplicationSetupTimerInterrupt( void ); + +/* + * Starts the scheduler by loading the context of the first task to run. + * (defined in portasm.S). + */ +extern void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t *pulLocal; + + /* Stack type and pointers to the stack type are both 2 bytes. */ + + /* Parameters are passed in on the stack, and written using a 32bit value + hence a space is left for the second two bytes. */ + pxTopOfStack--; + + /* Write in the parameter value. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* The return address, leaving space for the first two bytes of the + 32-bit value. */ + pxTopOfStack--; + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) 0; + pxTopOfStack--; + + /* The start address / PSW value is also written in as a 32bit value, + so leave a space for the second two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* An initial value for the AX register. */ + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + + /* An initial value for the HL register. */ + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + + /* CS and ES registers. */ + *pxTopOfStack = ( StackType_t ) 0x0F00; + pxTopOfStack--; + + /* The remaining general purpose registers bank 0 (DE and BC) and the other + two register banks...register bank 3 is dedicated for use by interrupts so + is not saved as part of the task context. */ + pxTopOfStack -= 10; + + /* Finally the critical section nesting count is set to zero when the task + first starts. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack that has beene generated so it + can be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + vApplicationSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + vPortStartFirstTask(); + + /* Execution should not reach here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the RL78 port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +__attribute__((weak)) void vApplicationSetupTimerInterrupt( void ) +{ +const uint16_t usClockHz = 15000UL; /* Internal clock. */ +const uint16_t usCompareMatch = ( usClockHz / configTICK_RATE_HZ ) + 1UL; + + /* Use the internal 15K clock. */ + OSMC = ( unsigned char ) 0x16; + + #ifdef RTCEN + { + /* Supply the interval timer clock. */ + RTCEN = ( unsigned char ) 1U; + + /* Disable INTIT interrupt. */ + ITMK = ( unsigned char ) 1; + + /* Disable ITMC operation. */ + ITMC = ( unsigned char ) 0x0000; + + /* Clear INIT interrupt. */ + ITIF = ( unsigned char ) 0; + + /* Set interval and enable interrupt operation. */ + ITMC = usCompareMatch | 0x8000U; + + /* Enable INTIT interrupt. */ + ITMK = ( unsigned char ) 0; + } + #endif + + #ifdef TMKAEN + { + /* Supply the interval timer clock. */ + TMKAEN = ( unsigned char ) 1U; + + /* Disable INTIT interrupt. */ + TMKAMK = ( unsigned char ) 1; + + /* Disable ITMC operation. */ + ITMC = ( unsigned char ) 0x0000; + + /* Clear INIT interrupt. */ + TMKAIF = ( unsigned char ) 0; + + /* Set interval and enable interrupt operation. */ + ITMC = usCompareMatch | 0x8000U; + + /* Enable INTIT interrupt. */ + TMKAMK = ( unsigned char ) 0; + } + #endif +} +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portasm.S new file mode 100644 index 0000000..7de426f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portasm.S @@ -0,0 +1,81 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + + .global _vPortYield + .global _vPortStartFirstTask + .global _vPortTickISR + + .extern _vTaskSwitchContext + .extern _xTaskIncrementTick + + .text + .align 2 + +/* FreeRTOS yield handler. This is installed as the BRK software interrupt +handler. */ +_vPortYield: + /* Save the context of the current task. */ + portSAVE_CONTEXT + /* Call the scheduler to select the next task. */ + call !!_vTaskSwitchContext + /* Restore the context of the next task to run. */ + portRESTORE_CONTEXT + retb + + +/* Starts the scheduler by restoring the context of the task that will execute +first. */ + .align 2 +_vPortStartFirstTask: + /* Restore the context of whichever task will execute first. */ + portRESTORE_CONTEXT + /* An interrupt stack frame is used so the task is started using RETI. */ + reti + +/* FreeRTOS tick handler. This is installed as the interval timer interrupt +handler. */ + .align 2 +_vPortTickISR: + + /* Save the context of the currently executing task. */ + portSAVE_CONTEXT + /* Call the RTOS tick function. */ + call !!_xTaskIncrementTick +#if configUSE_PREEMPTION == 1 + /* Select the next task to run. */ + call !!_vTaskSwitchContext +#endif + /* Retore the context of whichever task will run next. */ + portRESTORE_CONTEXT + reti + + .end + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portmacro.h new file mode 100644 index 0000000..cf6461a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portmacro.h @@ -0,0 +1,122 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short +#define portPOINTER_SIZE_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() __asm volatile ( "DI" ) +#define portENABLE_INTERRUPTS() __asm volatile ( "EI" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( unsigned short ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portYIELD() __asm volatile ( "BRK" ) +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 ) +#define portNOP() __asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/port.c new file mode 100644 index 0000000..270c731 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/port.c @@ -0,0 +1,701 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Standard C includes. */ +#include "limits.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + #include "platform.h" + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + #include "iodefine.h" + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/* The peripheral clock is divided by this value before being supplying the +CMT. */ +#if ( configUSE_TICKLESS_IDLE == 0 ) + /* If tickless idle is not used then the divisor can be fixed. */ + #define portCLOCK_DIVISOR 8UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 12000000 ) + #define portCLOCK_DIVISOR 512UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 6000000 ) + #define portCLOCK_DIVISOR 128UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 1000000 ) + #define portCLOCK_DIVISOR 32UL +#else + #define portCLOCK_DIVISOR 8UL +#endif + +/* These macros allow a critical section to be added around the call to +xTaskIncrementTick(), which is only ever called from interrupts at the kernel +priority - ie a known priority. Therefore these local macros are a slight +optimisation compared to calling the global SET/CLEAR_INTERRUPT_MASK macros, +which would require the old IPL to be read first and stored in a local variable. */ +#define portDISABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#define portENABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configKERNEL_INTERRUPT_PRIORITY) ) + +/* Keys required to lock and unlock access to certain system registers +respectively. */ +#define portUNLOCK_KEY 0xA50B +#define portLOCK_KEY 0xA500 + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ) __attribute__((naked)); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + R_BSP_PRAGMA_INTERRUPT( vPortSoftwareInterruptISR, VECT( ICU, SWINT ) ) + R_BSP_ATTRIB_INTERRUPT void vPortSoftwareInterruptISR( void ) __attribute__( ( naked ) ); + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + void vPortSoftwareInterruptISR( void ) __attribute__( ( naked ) ); + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + R_BSP_PRAGMA_INTERRUPT( vPortTickISR, _VECT( configTICK_VECTOR ) ) + R_BSP_ATTRIB_INTERRUPT void vPortTickISR( void ); /* Do not add __attribute__( ( interrupt ) ). */ + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + void vPortTickISR( void ) __attribute__( ( interrupt ) ); + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/* + * Sets up the periodic ISR used for the RTOS tick using the CMT. + * The application writer can define configSETUP_TICK_INTERRUPT() (in + * FreeRTOSConfig.h) such that their own tick interrupt configuration is used + * in place of prvSetupTimerInterrupt(). + */ +static void prvSetupTimerInterrupt( void ); +#ifndef configSETUP_TICK_INTERRUPT + /* The user has not provided their own tick interrupt configuration so use + the definition in this file (which uses the interval timer). */ + #define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt() +#endif /* configSETUP_TICK_INTERRUPT */ + +/* + * Called after the sleep mode registers have been configured, prvSleep() + * executes the pre and post sleep macros, and actually calls the wait + * instruction. + */ +#if configUSE_TICKLESS_IDLE == 1 + static void prvSleep( TickType_t xExpectedIdleTime ); +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* Used in the context save and restore code. */ +extern void *pxCurrentTCB; + +/* Calculate how many clock increments make up a single tick period. */ +static const uint32_t ulMatchValueForOneTick = ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + +#if configUSE_TICKLESS_IDLE == 1 + + /* Holds the maximum number of ticks that can be suppressed - which is + basically how far into the future an interrupt can be generated. Set + during initialisation. This is the maximum possible value that the + compare match register can hold divided by ulMatchValueForOneTick. */ + static const TickType_t xMaximumPossibleSuppressedTicks = USHRT_MAX / ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + + /* Flag set from the tick interrupt to allow the sleep processing to know if + sleep mode was exited because of a tick interrupt, or an interrupt + generated by something else. */ + static volatile uint32_t ulTickFlag = pdFALSE; + + /* The CMT counter is stopped temporarily each time it is re-programmed. + The following constant offsets the CMT counter match value by the number of + CMT counts that would typically be missed while the counter was stopped to + compensate for the lost time. The large difference between the divided CMT + clock and the CPU clock means it is likely ulStoppedTimerCompensation will + equal zero - and be optimised away. */ + static const uint32_t ulStoppedTimerCompensation = 100UL / ( configCPU_CLOCK_HZ / ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) ); + +#endif + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + /* Leave space for the registers that will get popped from the stack + when the task first starts executing. */ + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate + the tick interrupt. This way the application can decide which + peripheral to use. If tickless mode is used then the default + implementation defined in this file (which uses CMT0) should not be + overridden. */ + configSETUP_TICK_INTERRUPT(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Execution should not reach here as the tasks are now running! + prvSetupTimerInterrupt() is called here to prevent the compiler outputting + a warning about a statically declared function not being referenced in the + case that the application writer has provided their own tick interrupt + configuration routine (and defined configSETUP_TICK_INTERRUPT() such that + their own routine will be called in place of prvSetupTimerInterrupt()). */ + prvSetupTimerInterrupt(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvStartFirstTask( void ) +{ + __asm volatile + ( + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + "SETPSW U \n" \ + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [R15], R15 \n" \ + "MOV.L [R15], R0 \n" \ + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15 \n" \ + + /* R1 to R15 - R0 is not included as it is the SP. */ + "POPM R1-R15 \n" \ + + /* This pops the remaining registers. */ + "RTE \n" \ + "NOP \n" \ + "NOP \n" + ); +} +/*-----------------------------------------------------------*/ + +void vPortSoftwareInterruptISR( void ) +{ + __asm volatile + ( + /* Re-enable interrupts. */ + "SETPSW I \n" \ + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + "PUSH.L R15 \n" \ + + /* Read the user stack pointer. */ + "MVFC USP, R15 \n" \ + + /* Move the address down to the data being moved. */ + "SUB #12, R15 \n" \ + "MVTC R15, USP \n" \ + + /* Copy the data across, R15, then PC, then PSW. */ + "MOV.L [ R0 ], [ R15 ] \n" \ + "MOV.L 4[ R0 ], 4[ R15 ] \n" \ + "MOV.L 8[ R0 ], 8[ R15 ] \n" \ + + /* Move the interrupt stack pointer to its new correct position. */ + "ADD #12, R0 \n" \ + + /* All the rest of the registers are saved directly to the user stack. */ + "SETPSW U \n" \ + + /* Save the rest of the general registers (R15 has been saved already). */ + "PUSHM R1-R14 \n" \ + + /* Save the accumulator. */ + "MVFACHI R15 \n" \ + "PUSH.L R15 \n" \ + + /* Middle word. */ + "MVFACMI R15 \n" \ + + /* Shifted left as it is restored to the low order word. */ + "SHLL #16, R15 \n" \ + "PUSH.L R15 \n" \ + + /* Save the stack pointer to the TCB. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L R0, [ R15 ] \n" \ + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + "MVTIPL %0 \n" \ + + /* Select the next task to run. */ + "BSR.A _vTaskSwitchContext \n" \ + + /* Reset the interrupt mask as no more data structure access is required. */ + "MVTIPL %1 \n" \ + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + "MOV.L #_pxCurrentTCB,R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L [ R15 ], R0 \n" \ + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + "POP R15 \n" \ + "MVTACLO R15 \n" \ + "POP R15 \n" \ + "MVTACHI R15 \n" \ + "POPM R1-R15 \n" \ + "RTE \n" \ + "NOP \n" \ + "NOP " + :: "i"(configMAX_SYSCALL_INTERRUPT_PRIORITY), "i"(configKERNEL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void vPortTickISR( void ) +{ + /* Re-enabled interrupts. */ + __asm volatile( "SETPSW I" ); + + /* Increment the tick, and perform any processing the new tick value + necessitates. Ensure IPL is at the max syscall value first. */ + portDISABLE_INTERRUPTS_FROM_KERNEL_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portENABLE_INTERRUPTS_FROM_KERNEL_ISR(); + + #if configUSE_TICKLESS_IDLE == 1 + { + /* The CPU woke because of a tick. */ + ulTickFlag = pdTRUE; + + /* If this is the first tick since exiting tickless mode then the CMT + compare match value needs resetting. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + } + #endif +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortGetIPL( void ) +{ + __asm volatile + ( + "MVFC PSW, R1 \n" \ + "SHLR #24, R1 \n" \ + "RTS " + ); + + /* This will never get executed, but keeps the compiler from complaining. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortSetIPL( uint32_t ulNewIPL ) +{ + __asm volatile + ( + "PUSH R5 \n" \ + "MVFC PSW, R5 \n" \ + "SHLL #24, R1 \n" \ + "AND #-0F000001H, R5 \n" \ + "OR R1, R5 \n" \ + "MVTC R5, PSW \n" \ + "POP R5 \n" \ + "RTS " + ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Unlock. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Enable CMT0. */ + MSTP( CMT0 ) = 0; + + /* Lock again. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Interrupt on compare match. */ + CMT0.CMCR.BIT.CMIE = 1; + + /* Set the compare match value. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + + /* Divide the PCLK. */ + #if portCLOCK_DIVISOR == 512 + { + CMT0.CMCR.BIT.CKS = 3; + } + #elif portCLOCK_DIVISOR == 128 + { + CMT0.CMCR.BIT.CKS = 2; + } + #elif portCLOCK_DIVISOR == 32 + { + CMT0.CMCR.BIT.CKS = 1; + } + #elif portCLOCK_DIVISOR == 8 + { + CMT0.CMCR.BIT.CKS = 0; + } + #else + { + #error Invalid portCLOCK_DIVISOR setting + } + #endif + + /* Enable the interrupt... */ + _IEN( _CMT0_CMI0 ) = 1; + + /* ...and set its priority to the application defined kernel priority. */ + _IPR( _CMT0_CMI0 ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the timer. */ + CMT.CMSTR0.BIT.STR0 = 1; +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + static void prvSleep( TickType_t xExpectedIdleTime ) + { + /* Allow the application to define some pre-sleep processing. */ + configPRE_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING() + means the application defined code has already executed the WAIT + instruction. */ + if( xExpectedIdleTime > 0 ) + { + __asm volatile( "WAIT" ); + } + + /* Allow the application to define some post sleep processing. */ + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulMatchValue, ulCompleteTickPeriods, ulCurrentCount; + eSleepModeStatus eSleepAction; + + /* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* Make sure the CMT reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Calculate the reload value required to wait xExpectedIdleTime tick + periods. */ + ulMatchValue = ulMatchValueForOneTick * xExpectedIdleTime; + if( ulMatchValue > ulStoppedTimerCompensation ) + { + /* Compensate for the fact that the CMT is going to be stopped + momentarily. */ + ulMatchValue -= ulStoppedTimerCompensation; + } + + /* Stop the CMT momentarily. The time the CMT is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + /* Critical section using the global interrupt bit as the i bit is + automatically reset by the WAIT instruction. */ + __asm volatile( "CLRPSW i" ); + + /* The tick flag is set to false before sleeping. If it is true when + sleep mode is exited then sleep mode was probably exited because the + tick was suppressed for the entire xExpectedIdleTime period. */ + ulTickFlag = pdFALSE; + + /* If a context switch is pending then abandon the low power entry as + the context switch might have been pended by an external interrupt that + requires processing. */ + eSleepAction = eTaskConfirmSleepModeStatus(); + if( eSleepAction == eAbortSleep ) + { + /* Restart tick. */ + CMT.CMSTR0.BIT.STR0 = 1; + __asm volatile( "SETPSW i" ); + } + else if( eSleepAction == eNoTasksWaitingTimeout ) + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for software standby with all clocks stopped. */ + SYSTEM.SBYCR.BIT.SSBY = 1; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Restart the CMT. */ + CMT.CMSTR0.BIT.STR0 = 1; + } + else + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for deep sleep mode. */ + SYSTEM.MSTPCRC.BIT.DSLPE = 1; + SYSTEM.MSTPCRA.BIT.MSTPA28 = 1; + SYSTEM.SBYCR.BIT.SSBY = 0; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Adjust the match value to take into account that the current + time slice is already partially complete. */ + ulMatchValue -= ( uint32_t ) CMT0.CMCNT; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* Restart the CMT to count up to the new match value. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Stop CMT. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + ulCurrentCount = ( uint32_t ) CMT0.CMCNT; + + if( ulTickFlag != pdFALSE ) + { + /* The tick interrupt has already executed, although because + this function is called with the scheduler suspended the actual + tick processing will not occur until after this function has + exited. Reset the match value with whatever remains of this + tick period. */ + ulMatchValue = ulMatchValueForOneTick - ulCurrentCount; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent sleeping. The actual stepping of the tick appears + later in this function. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + How many complete tick periods passed while the processor was + sleeping? */ + ulCompleteTickPeriods = ulCurrentCount / ulMatchValueForOneTick; + + /* The match value is set to whatever fraction of a single tick + period remains. */ + ulMatchValue = ulCurrentCount - ( ulCompleteTickPeriods * ulMatchValueForOneTick ); + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + } + + /* Restart the CMT so it runs up to the match value. The match value + will get set to the value required to generate exactly one tick period + the next time the CMT interrupt executes. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Wind the tick forward by the number of tick periods that the CPU + remained in a low power state. */ + vTaskStepTick( ulCompleteTickPeriods ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/portmacro.h new file mode 100644 index 0000000..7ee7098 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/portmacro.h @@ -0,0 +1,150 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ +/* When the FIT configurator or the Smart Configurator is used, platform.h has to be + * used. */ +#ifndef configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H + #define configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H 0 +#endif + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __asm volatile( "NOP" ) + +/* Save clobbered register, set ITU SWINR (at address 0x872E0), read the value +back to ensure it is set before continuing, then restore the clobbered +register. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "MOV.L #0x872E0, r5 \n\t" \ + "MOV.B #1, [r5] \n\t" \ + "MOV.L [r5], r5 \n\t" \ + ::: "r5" \ + ) + +#define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) { portYIELD(); } } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __asm volatile ( "MVTIPL #0" ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#else + #define portDISABLE_INTERRUPTS() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +uint32_t ulPortGetIPL( void ) __attribute__((naked)); +void vPortSetIPL( uint32_t ulNewIPL ) __attribute__((naked)); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortGetIPL(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) vPortSetIPL( uxSavedInterruptStatus ) + +/* Tickless idle/low power functionality. */ +#if configUSE_TICKLESS_IDLE == 1 + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/port.c new file mode 100644 index 0000000..768b3ca --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/port.c @@ -0,0 +1,436 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + #include "platform.h" + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + #include "iodefine.h" + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/* These macros allow a critical section to be added around the call to +xTaskIncrementTick(), which is only ever called from interrupts at the kernel +priority - ie a known priority. Therefore these local macros are a slight +optimisation compared to calling the global SET/CLEAR_INTERRUPT_MASK macros, +which would require the old IPL to be read first and stored in a local variable. */ +#define portMASK_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#define portUNMASK_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configKERNEL_INTERRUPT_PRIORITY) ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ) __attribute__((naked)); + + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + R_BSP_PRAGMA_INTERRUPT( vSoftwareInterruptISR, VECT( ICU, SWINT ) ) + R_BSP_ATTRIB_INTERRUPT void vSoftwareInterruptISR( void ) __attribute__( ( naked ) ); + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + void vSoftwareInterruptISR( void ) __attribute__( ( naked ) ); + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + R_BSP_PRAGMA_INTERRUPT( vTickISR, _VECT( configTICK_VECTOR ) ) + R_BSP_ATTRIB_INTERRUPT void vTickISR( void ); /* Do not add __attribute__( ( interrupt ) ). */ + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + void vTickISR( void ) __attribute__( ( interrupt ) ); + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 1. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvStartFirstTask( void ) +{ + __asm volatile + ( + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + "SETPSW U \n" \ + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [R15], R15 \n" \ + "MOV.L [R15], R0 \n" \ + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n" \ + "POP R15 \n" \ + + /* Floating point status word. */ + "MVTC R15, FPSW \n" \ + + /* R1 to R15 - R0 is not included as it is the SP. */ + "POPM R1-R15 \n" \ + + /* This pops the remaining registers. */ + "RTE \n" \ + "NOP \n" \ + "NOP \n" + ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + __asm volatile + ( + /* Re-enable interrupts. */ + "SETPSW I \n" \ + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + "PUSH.L R15 \n" \ + + /* Read the user stack pointer. */ + "MVFC USP, R15 \n" \ + + /* Move the address down to the data being moved. */ + "SUB #12, R15 \n" \ + "MVTC R15, USP \n" \ + + /* Copy the data across, R15, then PC, then PSW. */ + "MOV.L [ R0 ], [ R15 ] \n" \ + "MOV.L 4[ R0 ], 4[ R15 ] \n" \ + "MOV.L 8[ R0 ], 8[ R15 ] \n" \ + + /* Move the interrupt stack pointer to its new correct position. */ + "ADD #12, R0 \n" \ + + /* All the rest of the registers are saved directly to the user stack. */ + "SETPSW U \n" \ + + /* Save the rest of the general registers (R15 has been saved already). */ + "PUSHM R1-R14 \n" \ + + /* Save the FPSW and accumulator. */ + "MVFC FPSW, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACGU #0, A1, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACHI #0, A1, R15 \n" \ + "PUSH.L R15 \n" \ + /* Low order word. */ + "MVFACLO #0, A1, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACGU #0, A0, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACHI #0, A0, R15 \n" \ + "PUSH.L R15 \n" \ + /* Low order word. */ + "MVFACLO #0, A0, R15 \n" \ + "PUSH.L R15 \n" \ + + /* Save the stack pointer to the TCB. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L R0, [ R15 ] \n" \ + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + "MVTIPL %0 \n" \ + + /* Select the next task to run. */ + "BSR.A _vTaskSwitchContext \n" \ + + /* Reset the interrupt mask as no more data structure access is required. */ + "MVTIPL %1 \n" \ + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + "MOV.L #_pxCurrentTCB,R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L [ R15 ], R0 \n" \ + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n" \ + "POP R15 \n" \ + "MVTC R15, FPSW \n" \ + "POPM R1-R15 \n" \ + "RTE \n" \ + "NOP \n" \ + "NOP " + :: "i"(configMAX_SYSCALL_INTERRUPT_PRIORITY), "i"(configKERNEL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void vTickISR( void ) +{ + /* Re-enabled interrupts. */ + __asm volatile( "SETPSW I" ); + + /* Increment the tick, and perform any processing the new tick value + necessitates. Ensure IPL is at the max syscall value first. */ + portMASK_INTERRUPTS_FROM_KERNEL_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portUNMASK_INTERRUPTS_FROM_KERNEL_ISR(); +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortGetIPL( void ) +{ + __asm volatile + ( + "MVFC PSW, R1 \n" \ + "SHLR #24, R1 \n" \ + "RTS " + ); + + /* This will never get executed, but keeps the compiler from complaining. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortSetIPL( uint32_t ulNewIPL ) +{ + __asm volatile + ( + "PUSH R5 \n" \ + "MVFC PSW, R5 \n" \ + "SHLL #24, R1 \n" \ + "AND #-0F000001H, R5 \n" \ + "OR R1, R5 \n" \ + "MVTC R5, PSW \n" \ + "POP R5 \n" \ + "RTS " + ); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/portmacro.h new file mode 100644 index 0000000..0028094 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/portmacro.h @@ -0,0 +1,145 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* When the FIT configurator or the Smart Configurator is used, platform.h has to be + * used. */ +#ifndef configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H + #define configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H 0 +#endif + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __asm volatile( "NOP" ) + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" +where portITU_SWINTR is the location of the software interrupt register +(0x000872E0). Don't rely on the assembler to select a register, so instead +save and restore clobbered registers manually. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n" \ + "MOV.L #0x872E0, R10 \n" \ + "MOV.B #0x1, [R10] \n" \ + "MOV.L [R10], R10 \n" \ + "POP R10 \n" \ + ) + +#define portYIELD_FROM_ISR( x ) if( x != pdFALSE ) portYIELD() + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __asm volatile ( "MVTIPL #0" ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#else + #define portDISABLE_INTERRUPTS() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +uint32_t ulPortGetIPL( void ) __attribute__((naked)); +void vPortSetIPL( uint32_t ulNewIPL ) __attribute__((naked)); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortGetIPL(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) vPortSetIPL( uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/port.c new file mode 100644 index 0000000..fffd720 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/port.c @@ -0,0 +1,389 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + #include "platform.h" + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + #include "iodefine.h" + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/* These macros allow a critical section to be added around the call to +xTaskIncrementTick(), which is only ever called from interrupts at the kernel +priority - ie a known priority. Therefore these local macros are a slight +optimisation compared to calling the global SET/CLEAR_INTERRUPT_MASK macros, +which would require the old IPL to be read first and stored in a local variable. */ +#define portDISABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#define portENABLE_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configKERNEL_INTERRUPT_PRIORITY) ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ) __attribute__((naked)); +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + R_BSP_PRAGMA_INTERRUPT( vSoftwareInterruptISR, VECT( ICU, SWINT ) ) + R_BSP_ATTRIB_INTERRUPT void vSoftwareInterruptISR( void ) __attribute__( ( naked ) ); + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + void vSoftwareInterruptISR( void ) __attribute__( ( naked ) ); + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + R_BSP_PRAGMA_INTERRUPT( vTickISR, _VECT( configTICK_VECTOR ) ) + R_BSP_ATTRIB_INTERRUPT void vTickISR( void ); /* Do not add __attribute__( ( interrupt ) ). */ + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + void vTickISR( void ) __attribute__( ( interrupt ) ); + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvStartFirstTask( void ) +{ + __asm volatile + ( + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + "SETPSW U \n" \ + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [R15], R15 \n" \ + "MOV.L [R15], R0 \n" \ + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15 \n" \ + "POP R15 \n" \ + + /* Floating point status word. */ + "MVTC R15, FPSW \n" \ + + /* R1 to R15 - R0 is not included as it is the SP. */ + "POPM R1-R15 \n" \ + + /* This pops the remaining registers. */ + "RTE \n" \ + "NOP \n" \ + "NOP \n" + ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + __asm volatile + ( + /* Re-enable interrupts. */ + "SETPSW I \n" \ + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + "PUSH.L R15 \n" \ + + /* Read the user stack pointer. */ + "MVFC USP, R15 \n" \ + + /* Move the address down to the data being moved. */ + "SUB #12, R15 \n" \ + "MVTC R15, USP \n" \ + + /* Copy the data across, R15, then PC, then PSW. */ + "MOV.L [ R0 ], [ R15 ] \n" \ + "MOV.L 4[ R0 ], 4[ R15 ] \n" \ + "MOV.L 8[ R0 ], 8[ R15 ] \n" \ + + /* Move the interrupt stack pointer to its new correct position. */ + "ADD #12, R0 \n" \ + + /* All the rest of the registers are saved directly to the user stack. */ + "SETPSW U \n" \ + + /* Save the rest of the general registers (R15 has been saved already). */ + "PUSHM R1-R14 \n" \ + + /* Save the FPSW and accumulator. */ + "MVFC FPSW, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACHI R15 \n" \ + "PUSH.L R15 \n" \ + + /* Middle word. */ + "MVFACMI R15 \n" \ + + /* Shifted left as it is restored to the low order word. */ + "SHLL #16, R15 \n" \ + "PUSH.L R15 \n" \ + + /* Save the stack pointer to the TCB. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L R0, [ R15 ] \n" \ + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + "MVTIPL %0 \n" \ + + /* Select the next task to run. */ + "BSR.A _vTaskSwitchContext \n" \ + + /* Reset the interrupt mask as no more data structure access is required. */ + "MVTIPL %1 \n" \ + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + "MOV.L #_pxCurrentTCB,R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L [ R15 ], R0 \n" \ + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + "POP R15 \n" \ + "MVTACLO R15 \n" \ + "POP R15 \n" \ + "MVTACHI R15 \n" \ + "POP R15 \n" \ + "MVTC R15, FPSW \n" \ + "POPM R1-R15 \n" \ + "RTE \n" \ + "NOP \n" \ + "NOP " + :: "i"(configMAX_SYSCALL_INTERRUPT_PRIORITY), "i"(configKERNEL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void vTickISR( void ) +{ + /* Re-enabled interrupts. */ + __asm volatile( "SETPSW I" ); + + /* Increment the tick, and perform any processing the new tick value + necessitates. Ensure IPL is at the max syscall value first. */ + portDISABLE_INTERRUPTS_FROM_KERNEL_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portENABLE_INTERRUPTS_FROM_KERNEL_ISR(); +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortGetIPL( void ) +{ + __asm volatile + ( + "MVFC PSW, R1 \n" \ + "SHLR #24, R1 \n" \ + "RTS " + ); + + /* This will never get executed, but keeps the compiler from complaining. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortSetIPL( uint32_t ulNewIPL ) +{ + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) ulNewIPL; + + __asm volatile + ( + "PUSH R5 \n" \ + "MVFC PSW, R5 \n" \ + "SHLL #24, R1 \n" \ + "AND #-0F000001H, R5 \n" \ + "OR R1, R5 \n" \ + "MVTC R5, PSW \n" \ + "POP R5 \n" \ + "RTS " + ); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/portmacro.h new file mode 100644 index 0000000..99cd13b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/portmacro.h @@ -0,0 +1,145 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* When the FIT configurator or the Smart Configurator is used, platform.h has to be + * used. */ +#ifndef configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H + #define configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H 0 +#endif + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __asm volatile( "NOP" ) + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" +where portITU_SWINTR is the location of the software interrupt register +(0x000872E0). Don't rely on the assembler to select a register, so instead +save and restore clobbered registers manually. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n" \ + "MOV.L #0x872E0, R10 \n" \ + "MOV.B #0x1, [R10] \n" \ + "MOV.L [R10], R10 \n" \ + "POP R10 \n" \ + ) + +#define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) portYIELD(); } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __asm volatile ( "MVTIPL #0" ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#else + #define portDISABLE_INTERRUPTS() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +uint32_t ulPortGetIPL( void ) __attribute__((naked)); +void vPortSetIPL( uint32_t ulNewIPL ) __attribute__((naked)); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortGetIPL(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) vPortSetIPL( uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/port.c new file mode 100644 index 0000000..ea51c5b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/port.c @@ -0,0 +1,433 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + #include "platform.h" + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + #include "iodefine.h" + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/* These macros allow a critical section to be added around the call to +xTaskIncrementTick(), which is only ever called from interrupts at the kernel +priority - ie a known priority. Therefore these local macros are a slight +optimisation compared to calling the global SET/CLEAR_INTERRUPT_MASK macros, +which would require the old IPL to be read first and stored in a local variable. */ +#define portMASK_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#define portUNMASK_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i"(configKERNEL_INTERRUPT_PRIORITY) ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ) __attribute__((naked)); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) +R_BSP_PRAGMA_INTERRUPT( vSoftwareInterruptISR, VECT( ICU, SWINT ) ) +R_BSP_ATTRIB_INTERRUPT void vSoftwareInterruptISR( void ) __attribute__( ( naked ) ); +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ +void vSoftwareInterruptISR( void ) __attribute__((naked)); +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + R_BSP_PRAGMA_INTERRUPT( vTickISR, _VECT( configTICK_VECTOR ) ) + R_BSP_ATTRIB_INTERRUPT void vTickISR( void ); /* Do not add __attribute__( ( interrupt ) ). */ + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + void vTickISR( void ) __attribute__( ( interrupt ) ); + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 1. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvStartFirstTask( void ) +{ + __asm volatile + ( + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + "SETPSW U \n" \ + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [R15], R15 \n" \ + "MOV.L [R15], R0 \n" \ + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n" \ + "POP R15 \n" \ + + /* Floating point status word. */ + "MVTC R15, FPSW \n" \ + + /* R1 to R15 - R0 is not included as it is the SP. */ + "POPM R1-R15 \n" \ + + /* This pops the remaining registers. */ + "RTE \n" \ + "NOP \n" \ + "NOP \n" + ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + __asm volatile + ( + /* Re-enable interrupts. */ + "SETPSW I \n" \ + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + "PUSH.L R15 \n" \ + + /* Read the user stack pointer. */ + "MVFC USP, R15 \n" \ + + /* Move the address down to the data being moved. */ + "SUB #12, R15 \n" \ + "MVTC R15, USP \n" \ + + /* Copy the data across, R15, then PC, then PSW. */ + "MOV.L [ R0 ], [ R15 ] \n" \ + "MOV.L 4[ R0 ], 4[ R15 ] \n" \ + "MOV.L 8[ R0 ], 8[ R15 ] \n" \ + + /* Move the interrupt stack pointer to its new correct position. */ + "ADD #12, R0 \n" \ + + /* All the rest of the registers are saved directly to the user stack. */ + "SETPSW U \n" \ + + /* Save the rest of the general registers (R15 has been saved already). */ + "PUSHM R1-R14 \n" \ + + /* Save the FPSW and accumulator. */ + "MVFC FPSW, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACGU #0, A1, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACHI #0, A1, R15 \n" \ + "PUSH.L R15 \n" \ + /* Low order word. */ + "MVFACLO #0, A1, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACGU #0, A0, R15 \n" \ + "PUSH.L R15 \n" \ + "MVFACHI #0, A0, R15 \n" \ + "PUSH.L R15 \n" \ + /* Low order word. */ + "MVFACLO #0, A0, R15 \n" \ + "PUSH.L R15 \n" \ + + /* Save the stack pointer to the TCB. */ + "MOV.L #_pxCurrentTCB, R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L R0, [ R15 ] \n" \ + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + "MVTIPL %0 \n" \ + + /* Select the next task to run. */ + "BSR.A _vTaskSwitchContext \n" \ + + /* Reset the interrupt mask as no more data structure access is required. */ + "MVTIPL %1 \n" \ + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + "MOV.L #_pxCurrentTCB,R15 \n" \ + "MOV.L [ R15 ], R15 \n" \ + "MOV.L [ R15 ], R0 \n" \ + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n" \ + "POP R15 \n" \ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n" \ + "POP R15 \n" \ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n" \ + "POP R15 \n" \ + "MVTC R15, FPSW \n" \ + "POPM R1-R15 \n" \ + "RTE \n" \ + "NOP \n" \ + "NOP " + :: "i"(configMAX_SYSCALL_INTERRUPT_PRIORITY), "i"(configKERNEL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void vTickISR( void ) +{ + /* Re-enabled interrupts. */ + __asm volatile( "SETPSW I" ); + + /* Increment the tick, and perform any processing the new tick value + necessitates. Ensure IPL is at the max syscall value first. */ + portMASK_INTERRUPTS_FROM_KERNEL_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portUNMASK_INTERRUPTS_FROM_KERNEL_ISR(); +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortGetIPL( void ) +{ + __asm volatile + ( + "MVFC PSW, R1 \n" \ + "SHLR #24, R1 \n" \ + "RTS " + ); + + /* This will never get executed, but keeps the compiler from complaining. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortSetIPL( uint32_t ulNewIPL ) +{ + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) ulNewIPL; + + __asm volatile + ( + "PUSH R5 \n" \ + "MVFC PSW, R5 \n" \ + "SHLL #24, R1 \n" \ + "AND #-0F000001H, R5 \n" \ + "OR R1, R5 \n" \ + "MVTC R5, PSW \n" \ + "POP R5 \n" \ + "RTS " + ); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/portmacro.h new file mode 100644 index 0000000..99cd13b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/portmacro.h @@ -0,0 +1,145 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* When the FIT configurator or the Smart Configurator is used, platform.h has to be + * used. */ +#ifndef configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H + #define configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H 0 +#endif + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __asm volatile( "NOP" ) + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" +where portITU_SWINTR is the location of the software interrupt register +(0x000872E0). Don't rely on the assembler to select a register, so instead +save and restore clobbered registers manually. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n" \ + "MOV.L #0x872E0, R10 \n" \ + "MOV.B #0x1, [R10] \n" \ + "MOV.L [R10], R10 \n" \ + "POP R10 \n" \ + ) + +#define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) portYIELD(); } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __asm volatile ( "MVTIPL #0" ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#else + #define portDISABLE_INTERRUPTS() __asm volatile ( "MVTIPL %0" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +uint32_t ulPortGetIPL( void ) __attribute__((naked)); +void vPortSetIPL( uint32_t ulNewIPL ) __attribute__((naked)); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortGetIPL(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) vPortSetIPL( uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/port.c new file mode 100644 index 0000000..cb1a9e1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/port.c @@ -0,0 +1,622 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the RXv3 DPFPU port. +*----------------------------------------------------------*/ + +#warning Testing for DFPU support in this port is not yet complete + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + #include "platform.h" + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + #include "iodefine.h" + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore + * PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) +#define portINITIAL_DPSW ( ( StackType_t ) 0x00000100 ) +#define portINITIAL_DCMR ( ( StackType_t ) 0x00000000 ) +#define portINITIAL_DECNT ( ( StackType_t ) 0x00000001 ) + +/* Tasks are not created with a DPFPU context, but can be given a DPFPU context + * after they have been created. A variable is stored as part of the tasks context + * that holds portNO_DPFPU_CONTEXT if the task does not have a DPFPU context, or + * any other value if the task does have a DPFPU context. */ +#define portNO_DPFPU_CONTEXT ( ( StackType_t ) 0 ) +#define portHAS_DPFPU_CONTEXT ( ( StackType_t ) 1 ) + +/* The space on the stack required to hold the DPFPU data registers. This is 16 + * 64-bit registers. */ +#define portDPFPU_DATA_REGISTER_WORDS ( 16 * 2 ) + +/* These macros allow a critical section to be added around the call to + * xTaskIncrementTick(), which is only ever called from interrupts at the kernel + * priority - ie a known priority. Therefore these local macros are a slight + * optimisation compared to calling the global SET/CLEAR_INTERRUPT_MASK macros, + * which would require the old IPL to be read first and stored in a local variable. */ +#define portMASK_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) +#define portUNMASK_INTERRUPTS_FROM_KERNEL_ISR() __asm volatile ( "MVTIPL %0" ::"i" ( configKERNEL_INTERRUPT_PRIORITY ) ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + R_BSP_PRAGMA_INTERRUPT( vSoftwareInterruptISR, VECT( ICU, SWINT ) ) + R_BSP_ATTRIB_INTERRUPT void vSoftwareInterruptISR( void ) __attribute__( ( naked ) ); + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + void vSoftwareInterruptISR( void ) __attribute__( ( naked ) ); + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + R_BSP_PRAGMA_INTERRUPT( vTickISR, _VECT( configTICK_VECTOR ) ) + R_BSP_ATTRIB_INTERRUPT void vTickISR( void ); /* Do not add __attribute__( ( interrupt ) ). */ + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + void vTickISR( void ) __attribute__( ( interrupt ) ); + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/*-----------------------------------------------------------*/ + +/* Saved as part of the task context. If ulPortTaskHasDPFPUContext is non-zero + * then a DPFPU context must be saved and restored for the task. */ +#if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + StackType_t ulPortTaskHasDPFPUContext = portNO_DPFPU_CONTEXT; + +#endif /* configUSE_TASK_DPFPU_SUPPORT */ + +/* This is accessed by the inline assembler functions so is file scope for + * convenience. */ +extern void * pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + * value. Otherwise code space can be saved by just setting the registers + * that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else /* ifdef USE_FULL_REGISTER_INITIALISATION */ + { + pxTopOfStack -= 15; + } + #endif /* ifdef USE_FULL_REGISTER_INITIALISATION */ + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 0. */ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + { + /* The task will start without a DPFPU context. A task that + * uses the DPFPU hardware must call vPortTaskUsesDPFPU() before + * executing any floating point instructions. */ + pxTopOfStack--; + *pxTopOfStack = portNO_DPFPU_CONTEXT; + } + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + { + /* The task will start with a DPFPU context. Leave enough + * space for the registers - and ensure they are initialised if desired. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1515.1515; /* DR15. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1414.1414; /* DR14. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1313.1313; /* DR13. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1212.1212; /* DR12. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1111.1111; /* DR11. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1010.1010; /* DR10. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 909.0909; /* DR9. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 808.0808; /* DR8. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 707.0707; /* DR7. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 606.0606; /* DR6. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 505.0505; /* DR5. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 404.0404; /* DR4. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 303.0303; /* DR3. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 202.0202; /* DR2. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 101.0101; /* DR1. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 9876.54321;/* DR0. */ + } + #else /* ifdef USE_FULL_REGISTER_INITIALISATION */ + { + pxTopOfStack -= portDPFPU_DATA_REGISTER_WORDS; + memset( pxTopOfStack, 0x00, portDPFPU_DATA_REGISTER_WORDS * sizeof( StackType_t ) ); + } + #endif /* ifdef USE_FULL_REGISTER_INITIALISATION */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_DECNT; /* DECNT. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_DCMR; /* DCMR. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_DPSW; /* DPSW. */ + } + #elif ( configUSE_TASK_DPFPU_SUPPORT == 0 ) + { + /* Omit DPFPU support. */ + } + #else /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + { + #error Invalid configUSE_TASK_DPFPU_SUPPORT setting - configUSE_TASK_DPFPU_SUPPORT must be set to 0, 1, 2, or left undefined. + } + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + void vPortTaskUsesDPFPU( void ) + { + /* A task is registering the fact that it needs a DPFPU context. Set the + * DPFPU flag (which is saved as part of the task context). */ + ulPortTaskHasDPFPUContext = portHAS_DPFPU_CONTEXT; + } + +#endif /* configUSE_TASK_DPFPU_SUPPORT */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + * tick interrupt. This way the application can decide which peripheral to + * use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvStartFirstTask( void ) +{ + __asm volatile + ( + + /* When starting the scheduler there is nothing that needs moving to the + * interrupt stack because the function is not called from an interrupt. + * Just ensure the current stack is the user stack. */ + "SETPSW U \n"\ + + + /* Obtain the location of the stack associated with which ever task + * pxCurrentTCB is currently pointing to. */ + "MOV.L #_pxCurrentTCB, R15 \n"\ + "MOV.L [R15], R15 \n"\ + "MOV.L [R15], R0 \n"\ + + + /* Restore the registers from the stack of the task pointed to by + * pxCurrentTCB. */ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + /* The restored ulPortTaskHasDPFPUContext is to be zero here. + * So, it is never necessary to restore the DPFPU context here. */ + "POP R15 \n"\ + "MOV.L #_ulPortTaskHasDPFPUContext, R14 \n"\ + "MOV.L R15, [R14] \n"\ + + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + + /* Restore the DPFPU context. */ + "DPOPM.L DPSW-DECNT \n"\ + "DPOPM.D DR0-DR15 \n"\ + + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + "POP R15 \n"\ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n"\ + "POP R15 \n"\ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n"\ + "POP R15 \n"\ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n"\ + "POP R15 \n"\ + + /* Floating point status word. */ + "MVTC R15, FPSW \n"\ + + /* R1 to R15 - R0 is not included as it is the SP. */ + "POPM R1-R15 \n"\ + + /* This pops the remaining registers. */ + "RTE \n"\ + "NOP \n"\ + "NOP \n" + ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + __asm volatile + ( + /* Re-enable interrupts. */ + "SETPSW I \n"\ + + + /* Move the data that was automatically pushed onto the interrupt stack when + * the interrupt occurred from the interrupt stack to the user stack. + * + * R15 is saved before it is clobbered. */ + "PUSH.L R15 \n"\ + + /* Read the user stack pointer. */ + "MVFC USP, R15 \n"\ + + /* Move the address down to the data being moved. */ + "SUB #12, R15 \n"\ + "MVTC R15, USP \n"\ + + /* Copy the data across, R15, then PC, then PSW. */ + "MOV.L [ R0 ], [ R15 ] \n"\ + "MOV.L 4[ R0 ], 4[ R15 ] \n"\ + "MOV.L 8[ R0 ], 8[ R15 ] \n"\ + + /* Move the interrupt stack pointer to its new correct position. */ + "ADD #12, R0 \n"\ + + /* All the rest of the registers are saved directly to the user stack. */ + "SETPSW U \n"\ + + /* Save the rest of the general registers (R15 has been saved already). */ + "PUSHM R1-R14 \n"\ + + /* Save the FPSW and accumulators. */ + "MVFC FPSW, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACGU #0, A1, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACHI #0, A1, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACLO #0, A1, R15 \n" /* Low order word. */ \ + "PUSH.L R15 \n"\ + "MVFACGU #0, A0, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACHI #0, A0, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACLO #0, A0, R15 \n" /* Low order word. */ \ + "PUSH.L R15 \n"\ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + /* Does the task have a DPFPU context that needs saving? If + * ulPortTaskHasDPFPUContext is 0 then no. */ + "MOV.L #_ulPortTaskHasDPFPUContext, R15 \n"\ + "MOV.L [R15], R15 \n"\ + "CMP #0, R15 \n"\ + + /* Save the DPFPU context, if any. */ + "BEQ.B ?+ \n"\ + "DPUSHM.D DR0-DR15 \n"\ + "DPUSHM.L DPSW-DECNT \n"\ + "?: \n"\ + + /* Save ulPortTaskHasDPFPUContext itself. */ + "PUSH.L R15 \n"\ + + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + + /* Save the DPFPU context, always. */ + "DPUSHM.D DR0-DR15 \n"\ + "DPUSHM.L DPSW-DECNT \n"\ + + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + + /* Save the stack pointer to the TCB. */ + "MOV.L #_pxCurrentTCB, R15 \n"\ + "MOV.L [ R15 ], R15 \n"\ + "MOV.L R0, [ R15 ] \n"\ + + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + * structures are being accessed. */ + "MVTIPL %0 \n"\ + + /* Select the next task to run. */ + "BSR.A _vTaskSwitchContext \n"\ + + /* Reset the interrupt mask as no more data structure access is required. */ + "MVTIPL %1 \n"\ + + + /* Load the stack pointer of the task that is now selected as the Running + * state task from its TCB. */ + "MOV.L #_pxCurrentTCB,R15 \n"\ + "MOV.L [ R15 ], R15 \n"\ + "MOV.L [ R15 ], R0 \n"\ + + + /* Restore the context of the new task. The PSW (Program Status Word) and + * PC will be popped by the RTE instruction. */ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + /* Is there a DPFPU context to restore? If the restored + * ulPortTaskHasDPFPUContext is zero then no. */ + "POP R15 \n"\ + "MOV.L #_ulPortTaskHasDPFPUContext, R14 \n"\ + "MOV.L R15, [R14] \n"\ + "CMP #0, R15 \n"\ + + /* Restore the DPFPU context, if any. */ + "BEQ.B ?+ \n"\ + "DPOPM.L DPSW-DECNT \n"\ + "DPOPM.D DR0-DR15 \n"\ + "?: \n"\ + + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + + /* Restore the DPFPU context, always. */ + "DPOPM.L DPSW-DECNT \n"\ + "DPOPM.D DR0-DR15 \n"\ + + #endif /* if( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + "POP R15 \n"\ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n"\ + "POP R15 \n"\ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n"\ + "POP R15 \n"\ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n"\ + "POP R15 \n"\ + "MVTC R15, FPSW \n"\ + "POPM R1-R15 \n"\ + "RTE \n"\ + "NOP \n"\ + "NOP " + ::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ), "i" ( configKERNEL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +void vTickISR( void ) +{ + /* Re-enabled interrupts. */ + __asm volatile ( "SETPSW I"); + + /* Increment the tick, and perform any processing the new tick value + * necessitates. Ensure IPL is at the max syscall value first. */ + portMASK_INTERRUPTS_FROM_KERNEL_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + portUNMASK_INTERRUPTS_FROM_KERNEL_ISR(); +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortGetIPL( void ) +{ + __asm volatile + ( + "MVFC PSW, R1 \n"\ + "SHLR #24, R1 \n"\ + "RTS " + ); + + /* This will never get executed, but keeps the compiler from complaining. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortSetIPL( uint32_t ulNewIPL ) +{ + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) ulNewIPL; + + __asm volatile + ( + "PUSH R5 \n"\ + "MVFC PSW, R5 \n"\ + "SHLL #24, R1 \n"\ + "AND #-0F000001H, R5 \n"\ + "OR R1, R5 \n"\ + "MVTC R5, PSW \n"\ + "POP R5 \n"\ + "RTS " + ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/portmacro.h new file mode 100644 index 0000000..8d64cba --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/portmacro.h @@ -0,0 +1,187 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* When the FIT configurator or the Smart Configurator is used, platform.h has to be + * used. */ + #ifndef configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H + #define configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H 0 + #endif + +/* If configUSE_TASK_DPFPU_SUPPORT is set to 1 (or undefined) then each task will + * be created without a DPFPU context, and a task must call vTaskUsesDPFPU() before + * making use of any DPFPU registers. If configUSE_TASK_DPFPU_SUPPORT is set to 2 then + * tasks are created with a DPFPU context by default, and calling vTaskUsesDPFPU() has + * no effect. If configUSE_TASK_DPFPU_SUPPORT is set to 0 then tasks never take care + * of any DPFPU context (even if DPFPU registers are used). */ + #ifndef configUSE_TASK_DPFPU_SUPPORT + #define configUSE_TASK_DPFPU_SUPPORT 1 + #endif + +/*-----------------------------------------------------------*/ + +/* Type definitions - these are a bit legacy and not really used now, other than + * portSTACK_TYPE and portBASE_TYPE. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ + #define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ + #define portSTACK_GROWTH -1 + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portNOP() __asm volatile ( "NOP" ) + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" + * where portITU_SWINTR is the location of the software interrupt register + * (0x000872E0). Don't rely on the assembler to select a register, so instead + * save and restore clobbered registers manually. */ + #define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n"\ + "MOV.L #0x872E0, R10 \n"\ + "MOV.B #0x1, [R10] \n"\ + "CMP [R10].UB, R10 \n"\ + "POP R10 \n"\ + :::"cc" \ + ) + + #define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) portYIELD(); } while( 0 ) + +/* Workaround to reduce errors/warnings caused by e2 studio CDT's INDEXER and CODAN. */ + #ifdef __CDT_PARSER__ + #ifndef __asm + #define __asm asm + #endif + #ifndef __attribute__ + #define __attribute__( ... ) + #endif + #endif + +/* These macros should not be called directly, but through the + * taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is + * performed if configASSERT() is defined to ensure an assertion handler does not + * inadvertently attempt to lower the IPL when the call to assert was triggered + * because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY + * when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API + * functions are those that end in FromISR. FreeRTOS maintains a separate + * interrupt API to ensure API function and interrupt entry is as fast and as + * simple as possible. */ + #define portENABLE_INTERRUPTS() __asm volatile ( "MVTIPL #0") + #ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( ulPortGetIPL() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( ulPortGetIPL() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __asm volatile ( "MVTIPL %0"::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #else + #define portDISABLE_INTERRUPTS() __asm volatile ( "MVTIPL %0"::"i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #endif + +/* Critical nesting counts are stored in the TCB. */ + #define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ + extern void vTaskEnterCritical( void ); + extern void vTaskExitCritical( void ); + #define portENTER_CRITICAL() vTaskEnterCritical() + #define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ + uint32_t ulPortGetIPL( void ) __attribute__( ( naked ) ); + void vPortSetIPL( uint32_t ulNewIPL ) __attribute__( ( naked ) ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortGetIPL(); portDISABLE_INTERRUPTS() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) vPortSetIPL( uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +/*-----------------------------------------------------------*/ + +/* If configUSE_TASK_DPFPU_SUPPORT is set to 1 (or left undefined) then tasks are + * created without a DPFPU context and must call vPortTaskUsesDPFPU() to give + * themselves a DPFPU context before using any DPFPU instructions. If + * configUSE_TASK_DPFPU_SUPPORT is set to 2 then all tasks will have a DPFPU context + * by default. */ + #if( configUSE_TASK_DPFPU_SUPPORT == 1 ) + void vPortTaskUsesDPFPU( void ); + #else +/* Each task has a DPFPU context already, so define this function away to + * nothing to prevent it being called accidentally. */ + #define vPortTaskUsesDPFPU() + #endif + #define portTASK_USES_DPFPU() vPortTaskUsesDPFPU() + +/* Definition to allow compatibility with existing FreeRTOS Demo using flop.c. */ + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesDPFPU() + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/port.c new file mode 100644 index 0000000..04d1c20 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/port.c @@ -0,0 +1,198 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ST STR75x ARM7 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include "75x_tb.h" +#include "75x_eic.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Prescale used on the timer clock when calculating the tick period. */ +#define portPRESCALE 20 + + +/*-----------------------------------------------------------*/ + +/* Setup the TB to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + #ifdef THUMB_INTERWORK + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + #endif + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortISRStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortISRStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +EIC_IRQInitTypeDef EIC_IRQInitStructure; +TB_InitTypeDef TB_InitStructure; + + /* Setup the EIC for the TB. */ + EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE; + EIC_IRQInitStructure.EIC_IRQChannel = TB_IRQChannel; + EIC_IRQInitStructure.EIC_IRQChannelPriority = 1; + EIC_IRQInit(&EIC_IRQInitStructure); + + /* Setup the TB for the generation of the tick interrupt. */ + TB_InitStructure.TB_Mode = TB_Mode_Timing; + TB_InitStructure.TB_CounterMode = TB_CounterMode_Down; + TB_InitStructure.TB_Prescaler = portPRESCALE - 1; + TB_InitStructure.TB_AutoReload = ( ( configCPU_CLOCK_HZ / portPRESCALE ) / configTICK_RATE_HZ ); + TB_Init(&TB_InitStructure); + + /* Enable TB Update interrupt */ + TB_ITConfig(TB_IT_Update, ENABLE); + + /* Clear TB Update interrupt pending bit */ + TB_ClearITPendingBit(TB_IT_Update); + + /* Enable TB */ + TB_Cmd(ENABLE); +} +/*-----------------------------------------------------------*/ + + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portISR.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portISR.c new file mode 100644 index 0000000..be6d463 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portISR.c @@ -0,0 +1,183 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Components that can be compiled to either ARM or THUMB mode are + * contained in port.c The ISR routines, which can only be compiled + * to ARM mode, are contained in this file. + *----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* + * The scheduler can only be started from ARM mode, hence the inclusion of this + * function here. + */ +void vPortISRStartFirstTask( void ); +/*-----------------------------------------------------------*/ + +void vPortISRStartFirstTask( void ) +{ + /* Simply start the scheduler. This is included here as it can only be + called from ARM mode. */ + asm volatile ( \ + "LDR R0, =pxCurrentTCB \n\t" \ + "LDR R0, [R0] \n\t" \ + "LDR LR, [R0] \n\t" \ + \ + /* The critical nesting depth is the first item on the stack. */ \ + /* Load it into the ulCriticalNesting variable. */ \ + "LDR R0, =ulCriticalNesting \n\t" \ + "LDMFD LR!, {R1} \n\t" \ + "STR R1, [R0] \n\t" \ + \ + /* Get the SPSR from the stack. */ \ + "LDMFD LR!, {R0} \n\t" \ + "MSR SPSR, R0 \n\t" \ + \ + /* Restore all system mode registers for the task. */ \ + "LDMFD LR, {R0-R14}^ \n\t" \ + "NOP \n\t" \ + \ + /* Restore the return address. */ \ + "LDR LR, [LR, #+60] \n\t" \ + \ + /* And return - correcting the offset in the LR to obtain the */ \ + /* correct address. */ \ + "SUBS PC, LR, #4 \n\t" \ + ); +} +/*-----------------------------------------------------------*/ + +void vPortTickISR( void ) +{ + /* Increment the RTOS tick count, then look for the highest priority + task that is ready to run. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Ready for the next interrupt. */ + TB_ClearITPendingBit( TB_IT_Update ); +} + +/*-----------------------------------------------------------*/ + +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions here to + * ensure a switch to ARM mode. When THUMB_INTERWORK is not defined then + * the utilities are defined as macros in portmacro.h - as per other ports. + */ +#ifdef THUMB_INTERWORK + + void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + void vPortDisableInterruptsFromThumb( void ) + { + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + + void vPortEnableInterruptsFromThumb( void ) + { + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0} \n\t" /* Pop R0. */ + "BX R14" ); /* Return back to thumb. */ + } + +#endif /* THUMB_INTERWORK */ +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + asm volatile ( + "STMDB SP!, {R0} \n\t" /* Push R0. */ + "MRS R0, CPSR \n\t" /* Get CPSR. */ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ + "LDMIA SP!, {R0}" ); /* Pop R0. */ + } + } +} + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portmacro.h new file mode 100644 index 0000000..5842cea --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portmacro.h @@ -0,0 +1,142 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm volatile ( "SWI 0" ) +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +/* + * The interrupt management utilities can only be called from ARM mode. When + * THUMB_INTERWORK is defined the utilities are defined as functions in + * portISR.c to ensure a switch to ARM mode. When THUMB_INTERWORK is not + * defined then the utilities are defined as macros here - as per other ports. + */ + +#ifdef THUMB_INTERWORK + + extern void vPortDisableInterruptsFromThumb( void ) __attribute__ ((naked)); + extern void vPortEnableInterruptsFromThumb( void ) __attribute__ ((naked)); + + #define portDISABLE_INTERRUPTS() vPortDisableInterruptsFromThumb() + #define portENABLE_INTERRUPTS() vPortEnableInterruptsFromThumb() + +#else + + #define portDISABLE_INTERRUPTS() \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "ORR R0, R0, #0xC0 \n\t" /* Disable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + + #define portENABLE_INTERRUPTS() \ + asm volatile ( \ + "STMDB SP!, {R0} \n\t" /* Push R0. */ \ + "MRS R0, CPSR \n\t" /* Get CPSR. */ \ + "BIC R0, R0, #0xC0 \n\t" /* Enable IRQ, FIQ. */ \ + "MSR CPSR, R0 \n\t" /* Write back modified value. */ \ + "LDMIA SP!, {R0} " ) /* Pop R0. */ + +#endif /* THUMB_INTERWORK */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/port.c new file mode 100644 index 0000000..a8b56b7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/port.c @@ -0,0 +1,542 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* TriCore specific includes. */ +#include +#include +#include +#include + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "list.h" + +#if configCHECK_FOR_STACK_OVERFLOW > 0 + #error "Stack checking cannot be used with this port, as, unlike most ports, the pxTopOfStack member of the TCB is consumed CSA. CSA starvation, loosely equivalent to stack overflow, will result in a trap exception." + /* The stack pointer is accessible using portCSA_TO_ADDRESS( portCSA_TO_ADDRESS( pxCurrentTCB->pxTopOfStack )[ 0 ] )[ 2 ]; */ +#endif /* configCHECK_FOR_STACK_OVERFLOW */ + + +/*-----------------------------------------------------------*/ + +/* System register Definitions. */ +#define portSYSTEM_PROGRAM_STATUS_WORD ( 0x000008FFUL ) /* Supervisor Mode, MPU Register Set 0 and Call Depth Counting disabled. */ +#define portINITIAL_PRIVILEGED_PROGRAM_STATUS_WORD ( 0x000014FFUL ) /* IO Level 1, MPU Register Set 1 and Call Depth Counting disabled. */ +#define portINITIAL_UNPRIVILEGED_PROGRAM_STATUS_WORD ( 0x000010FFUL ) /* IO Level 0, MPU Register Set 1 and Call Depth Counting disabled. */ +#define portINITIAL_PCXI_UPPER_CONTEXT_WORD ( 0x00C00000UL ) /* The lower 20 bits identify the CSA address. */ +#define portINITIAL_SYSCON ( 0x00000000UL ) /* MPU Disable. */ + +/* CSA manipulation macros. */ +#define portCSA_FCX_MASK ( 0x000FFFFFUL ) + +/* OS Interrupt and Trap mechanisms. */ +#define portRESTORE_PSW_MASK ( ~( 0x000000FFUL ) ) +#define portSYSCALL_TRAP ( 6 ) + +/* Each CSA contains 16 words of data. */ +#define portNUM_WORDS_IN_CSA ( 16 ) + +/* The interrupt enable bit in the PCP_SRC register. */ +#define portENABLE_CPU_INTERRUPT ( 1U << 12U ) +/*-----------------------------------------------------------*/ + +/* + * Perform any hardware configuration necessary to generate the tick interrupt. + */ +static void prvSystemTickHandler( int ) __attribute__((longcall)); +static void prvSetupTimerInterrupt( void ); + +/* + * Trap handler for yields. + */ +static void prvTrapYield( int iTrapIdentification ); + +/* + * Priority 1 interrupt handler for yields pended from an interrupt. + */ +static void prvInterruptYield( int iTrapIdentification ); + +/*-----------------------------------------------------------*/ + +/* This reference is required by the save/restore context macros. */ +extern volatile uint32_t *pxCurrentTCB; + +/* Precalculate the compare match value at compile time. */ +static const uint32_t ulCompareMatchValue = ( configPERIPHERAL_CLOCK_HZ / configTICK_RATE_HZ ); + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t *pulUpperCSA = NULL; +uint32_t *pulLowerCSA = NULL; + + /* 16 Address Registers (4 Address registers are global), 16 Data + Registers, and 3 System Registers. + + There are 3 registers that track the CSAs. + FCX points to the head of globally free set of CSAs. + PCX for the task needs to point to Lower->Upper->NULL arrangement. + LCX points to the last free CSA so that corrective action can be taken. + + Need two CSAs to store the context of a task. + The upper context contains D8-D15, A10-A15, PSW and PCXI->NULL. + The lower context contains D0-D7, A2-A7, A11 and PCXI->UpperContext. + The pxCurrentTCB->pxTopOfStack points to the Lower Context RSLCX matching the initial BISR. + The Lower Context points to the Upper Context ready for the return from the interrupt handler. + + The Real stack pointer for the task is stored in the A10 which is restored + with the upper context. */ + + /* Have to disable interrupts here because the CSAs are going to be + manipulated. */ + portENTER_CRITICAL(); + { + /* DSync to ensure that buffering is not a problem. */ + _dsync(); + + /* Consume two free CSAs. */ + pulLowerCSA = portCSA_TO_ADDRESS( __MFCR( $FCX ) ); + if( NULL != pulLowerCSA ) + { + /* The Lower Links to the Upper. */ + pulUpperCSA = portCSA_TO_ADDRESS( pulLowerCSA[ 0 ] ); + } + + /* Check that we have successfully reserved two CSAs. */ + if( ( NULL != pulLowerCSA ) && ( NULL != pulUpperCSA ) ) + { + /* Remove the two consumed CSAs from the free CSA list. */ + _disable(); + _dsync(); + _mtcr( $FCX, pulUpperCSA[ 0 ] ); + _isync(); + _enable(); + } + else + { + /* Simply trigger a context list depletion trap. */ + _svlcx(); + } + } + portEXIT_CRITICAL(); + + /* Clear the upper CSA. */ + memset( pulUpperCSA, 0, portNUM_WORDS_IN_CSA * sizeof( uint32_t ) ); + + /* Upper Context. */ + pulUpperCSA[ 2 ] = ( uint32_t )pxTopOfStack; /* A10; Stack Return aka Stack Pointer */ + pulUpperCSA[ 1 ] = portSYSTEM_PROGRAM_STATUS_WORD; /* PSW */ + + /* Clear the lower CSA. */ + memset( pulLowerCSA, 0, portNUM_WORDS_IN_CSA * sizeof( uint32_t ) ); + + /* Lower Context. */ + pulLowerCSA[ 8 ] = ( uint32_t ) pvParameters; /* A4; Address Type Parameter Register */ + pulLowerCSA[ 1 ] = ( uint32_t ) pxCode; /* A11; Return Address aka RA */ + + /* PCXI pointing to the Upper context. */ + pulLowerCSA[ 0 ] = ( portINITIAL_PCXI_UPPER_CONTEXT_WORD | ( uint32_t ) portADDRESS_TO_CSA( pulUpperCSA ) ); + + /* Save the link to the CSA in the top of stack. */ + pxTopOfStack = (uint32_t * ) portADDRESS_TO_CSA( pulLowerCSA ); + + /* DSync to ensure that buffering is not a problem. */ + _dsync(); + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +int32_t xPortStartScheduler( void ) +{ +extern void vTrapInstallHandlers( void ); +uint32_t ulMFCR = 0UL; +uint32_t *pulUpperCSA = NULL; +uint32_t *pulLowerCSA = NULL; + + /* Interrupts at or below configMAX_SYSCALL_INTERRUPT_PRIORITY are disable + when this function is called. */ + + /* Set-up the timer interrupt. */ + prvSetupTimerInterrupt(); + + /* Install the Trap Handlers. */ + vTrapInstallHandlers(); + + /* Install the Syscall Handler for yield calls. */ + if( 0 == _install_trap_handler( portSYSCALL_TRAP, prvTrapYield ) ) + { + /* Failed to install the yield handler, force an assert. */ + configASSERT( ( ( volatile void * ) NULL ) ); + } + + /* Enable then install the priority 1 interrupt for pending context + switches from an ISR. See mod_SRC in the TriCore manual. */ + CPU_SRC0.reg = ( portENABLE_CPU_INTERRUPT ) | ( configKERNEL_YIELD_PRIORITY ); + if( 0 == _install_int_handler( configKERNEL_YIELD_PRIORITY, prvInterruptYield, 0 ) ) + { + /* Failed to install the yield handler, force an assert. */ + configASSERT( ( ( volatile void * ) NULL ) ); + } + + _disable(); + + /* Load the initial SYSCON. */ + _mtcr( $SYSCON, portINITIAL_SYSCON ); + _isync(); + + /* ENDINIT has already been applied in the 'cstart.c' code. */ + + /* Clear the PSW.CDC to enable the use of an RFE without it generating an + exception because this code is not genuinely in an exception. */ + ulMFCR = __MFCR( $PSW ); + ulMFCR &= portRESTORE_PSW_MASK; + _dsync(); + _mtcr( $PSW, ulMFCR ); + _isync(); + + /* Finally, perform the equivalent of a portRESTORE_CONTEXT() */ + pulLowerCSA = portCSA_TO_ADDRESS( ( *pxCurrentTCB ) ); + pulUpperCSA = portCSA_TO_ADDRESS( pulLowerCSA[0] ); + _dsync(); + _mtcr( $PCXI, *pxCurrentTCB ); + _isync(); + _nop(); + _rslcx(); + _nop(); + + /* Return to the first task selected to execute. */ + __asm volatile( "rfe" ); + + /* Will not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Set-up the clock divider. */ + unlock_wdtcon(); + { + /* Wait until access to Endint protected register is enabled. */ + while( 0 != ( WDT_CON0.reg & 0x1UL ) ); + + /* RMC == 1 so STM Clock == FPI */ + STM_CLC.reg = ( 1UL << 8 ); + } + lock_wdtcon(); + + /* Determine how many bits are used without changing other bits in the CMCON register. */ + STM_CMCON.reg &= ~( 0x1fUL ); + STM_CMCON.reg |= ( 0x1fUL - __CLZ( configPERIPHERAL_CLOCK_HZ / configTICK_RATE_HZ ) ); + + /* Take into account the current time so a tick doesn't happen immediately. */ + STM_CMP0.reg = ulCompareMatchValue + STM_TIM0.reg; + + if( 0 != _install_int_handler( configKERNEL_INTERRUPT_PRIORITY, prvSystemTickHandler, 0 ) ) + { + /* Set-up the interrupt. */ + STM_SRC0.reg = ( configKERNEL_INTERRUPT_PRIORITY | 0x00005000UL ); + + /* Enable the Interrupt. */ + STM_ISRR.reg &= ~( 0x03UL ); + STM_ISRR.reg |= 0x1UL; + STM_ISRR.reg &= ~( 0x07UL ); + STM_ICR.reg |= 0x1UL; + } + else + { + /* Failed to install the Tick Interrupt. */ + configASSERT( ( ( volatile void * ) NULL ) ); + } +} +/*-----------------------------------------------------------*/ + +static void prvSystemTickHandler( int iArg ) +{ +uint32_t ulSavedInterruptMask; +uint32_t *pxUpperCSA = NULL; +uint32_t xUpperCSA = 0UL; +extern volatile uint32_t *pxCurrentTCB; +int32_t lYieldRequired; + + /* Just to avoid compiler warnings about unused parameters. */ + ( void ) iArg; + + /* Clear the interrupt source. */ + STM_ISRR.reg = 1UL; + + /* Reload the Compare Match register for X ticks into the future. + + If critical section or interrupt nesting budgets are exceeded, then + it is possible that the calculated next compare match value is in the + past. If this occurs (unlikely), it is possible that the resulting + time slippage will exceed a single tick period. Any adverse effect of + this is time bounded by the fact that only the first n bits of the 56 bit + STM timer are being used for a compare match, so another compare match + will occur after an overflow in just those n bits (not the entire 56 bits). + As an example, if the peripheral clock is 75MHz, and the tick rate is 1KHz, + a missed tick could result in the next tick interrupt occurring within a + time that is 1.7 times the desired period. The fact that this is greater + than a single tick period is an effect of using a timer that cannot be + automatically reset, in hardware, by the occurrence of a tick interrupt. + Changing the tick source to a timer that has an automatic reset on compare + match (such as a GPTA timer) will reduce the maximum possible additional + period to exactly 1 times the desired period. */ + STM_CMP0.reg += ulCompareMatchValue; + + /* Kernel API calls require Critical Sections. */ + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the Tick. */ + lYieldRequired = xTaskIncrementTick(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); + + if( lYieldRequired != pdFALSE ) + { + /* Save the context of a task. + The upper context is automatically saved when entering a trap or interrupt. + Need to save the lower context as well and copy the PCXI CSA ID into + pxCurrentTCB->pxTopOfStack. Only Lower Context CSA IDs may be saved to the + TCB of a task. + + Call vTaskSwitchContext to select the next task, note that this changes the + value of pxCurrentTCB so that it needs to be reloaded. + + Call vPortSetMPURegisterSetOne to change the MPU mapping for the task + that has just been switched in. + + Load the context of the task. + Need to restore the lower context by loading the CSA from + pxCurrentTCB->pxTopOfStack into PCXI (effectively changing the call stack). + In the Interrupt handler post-amble, RSLCX will restore the lower context + of the task. RFE will restore the upper context of the task, jump to the + return address and restore the previous state of interrupts being + enabled/disabled. */ + _disable(); + _dsync(); + xUpperCSA = __MFCR( $PCXI ); + pxUpperCSA = portCSA_TO_ADDRESS( xUpperCSA ); + *pxCurrentTCB = pxUpperCSA[ 0 ]; + vTaskSwitchContext(); + pxUpperCSA[ 0 ] = *pxCurrentTCB; + CPU_SRC0.bits.SETR = 0; + _isync(); + } +} +/*-----------------------------------------------------------*/ + +/* + * When a task is deleted, it is yielded permanently until the IDLE task + * has an opportunity to reclaim the memory that that task was using. + * Typically, the memory used by a task is the TCB and Stack but in the + * TriCore this includes the CSAs that were consumed as part of the Call + * Stack. These CSAs can only be returned to the Globally Free Pool when + * they are not part of the current Call Stack, hence, delaying the + * reclamation until the IDLE task is freeing the task's other resources. + * This function uses the head of the linked list of CSAs (from when the + * task yielded for the last time) and finds the tail (the very bottom of + * the call stack) and inserts this list at the head of the Free list, + * attaching the existing Free List to the tail of the reclaimed call stack. + * + * NOTE: the IDLE task needs processing time to complete this function + * and in heavily loaded systems, the Free CSAs may be consumed faster + * than they can be freed assuming that tasks are being spawned and + * deleted frequently. + */ +void vPortReclaimCSA( uint32_t *pxTCB ) +{ +uint32_t pxHeadCSA, pxTailCSA, pxFreeCSA; +uint32_t *pulNextCSA; + + /* A pointer to the first CSA in the list of CSAs consumed by the task is + stored in the first element of the tasks TCB structure (where the stack + pointer would be on a traditional stack based architecture). */ + pxHeadCSA = ( *pxTCB ) & portCSA_FCX_MASK; + + /* Mask off everything in the CSA link field other than the address. If + the address is NULL, then the CSA is not linking anywhere and there is + nothing to do. */ + pxTailCSA = pxHeadCSA; + + /* Convert the link value to contain just a raw address and store this + in a local variable. */ + pulNextCSA = portCSA_TO_ADDRESS( pxTailCSA ); + + /* Iterate over the CSAs that were consumed as part of the task. The + first field in the CSA is the pointer to then next CSA. Mask off + everything in the pointer to the next CSA, other than the link address. + If this is NULL, then the CSA currently being pointed to is the last in + the chain. */ + while( 0UL != ( pulNextCSA[ 0 ] & portCSA_FCX_MASK ) ) + { + /* Clear all bits of the pointer to the next in the chain, other + than the address bits themselves. */ + pulNextCSA[ 0 ] = pulNextCSA[ 0 ] & portCSA_FCX_MASK; + + /* Move the pointer to point to the next CSA in the list. */ + pxTailCSA = pulNextCSA[ 0 ]; + + /* Update the local pointer to the CSA. */ + pulNextCSA = portCSA_TO_ADDRESS( pxTailCSA ); + } + + _disable(); + { + /* Look up the current free CSA head. */ + _dsync(); + pxFreeCSA = __MFCR( $FCX ); + + /* Join the current Free onto the Tail of what is being reclaimed. */ + portCSA_TO_ADDRESS( pxTailCSA )[ 0 ] = pxFreeCSA; + + /* Move the head of the reclaimed into the Free. */ + _dsync(); + _mtcr( $FCX, pxHeadCSA ); + _isync(); + } + _enable(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Nothing to do. Unlikely to want to end. */ +} +/*-----------------------------------------------------------*/ + +static void prvTrapYield( int iTrapIdentification ) +{ +uint32_t *pxUpperCSA = NULL; +uint32_t xUpperCSA = 0UL; +extern volatile uint32_t *pxCurrentTCB; + + switch( iTrapIdentification ) + { + case portSYSCALL_TASK_YIELD: + /* Save the context of a task. + The upper context is automatically saved when entering a trap or interrupt. + Need to save the lower context as well and copy the PCXI CSA ID into + pxCurrentTCB->pxTopOfStack. Only Lower Context CSA IDs may be saved to the + TCB of a task. + + Call vTaskSwitchContext to select the next task, note that this changes the + value of pxCurrentTCB so that it needs to be reloaded. + + Call vPortSetMPURegisterSetOne to change the MPU mapping for the task + that has just been switched in. + + Load the context of the task. + Need to restore the lower context by loading the CSA from + pxCurrentTCB->pxTopOfStack into PCXI (effectively changing the call stack). + In the Interrupt handler post-amble, RSLCX will restore the lower context + of the task. RFE will restore the upper context of the task, jump to the + return address and restore the previous state of interrupts being + enabled/disabled. */ + _disable(); + _dsync(); + xUpperCSA = __MFCR( $PCXI ); + pxUpperCSA = portCSA_TO_ADDRESS( xUpperCSA ); + *pxCurrentTCB = pxUpperCSA[ 0 ]; + vTaskSwitchContext(); + pxUpperCSA[ 0 ] = *pxCurrentTCB; + CPU_SRC0.bits.SETR = 0; + _isync(); + break; + + default: + /* Unimplemented trap called. */ + configASSERT( ( ( volatile void * ) NULL ) ); + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvInterruptYield( int iId ) +{ +uint32_t *pxUpperCSA = NULL; +uint32_t xUpperCSA = 0UL; +extern volatile uint32_t *pxCurrentTCB; + + /* Just to remove compiler warnings. */ + ( void ) iId; + + /* Save the context of a task. + The upper context is automatically saved when entering a trap or interrupt. + Need to save the lower context as well and copy the PCXI CSA ID into + pxCurrentTCB->pxTopOfStack. Only Lower Context CSA IDs may be saved to the + TCB of a task. + + Call vTaskSwitchContext to select the next task, note that this changes the + value of pxCurrentTCB so that it needs to be reloaded. + + Call vPortSetMPURegisterSetOne to change the MPU mapping for the task + that has just been switched in. + + Load the context of the task. + Need to restore the lower context by loading the CSA from + pxCurrentTCB->pxTopOfStack into PCXI (effectively changing the call stack). + In the Interrupt handler post-amble, RSLCX will restore the lower context + of the task. RFE will restore the upper context of the task, jump to the + return address and restore the previous state of interrupts being + enabled/disabled. */ + _disable(); + _dsync(); + xUpperCSA = __MFCR( $PCXI ); + pxUpperCSA = portCSA_TO_ADDRESS( xUpperCSA ); + *pxCurrentTCB = pxUpperCSA[ 0 ]; + vTaskSwitchContext(); + pxUpperCSA[ 0 ] = *pxCurrentTCB; + CPU_SRC0.bits.SETR = 0; + _isync(); +} +/*-----------------------------------------------------------*/ + +uint32_t uxPortSetInterruptMaskFromISR( void ) +{ +uint32_t uxReturn = 0UL; + + _disable(); + uxReturn = __MFCR( $ICR ); + _mtcr( $ICR, ( ( uxReturn & ~portCCPN_MASK ) | configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + _isync(); + _enable(); + + /* Return just the interrupt mask bits. */ + return ( uxReturn & portCCPN_MASK ); +} +/*-----------------------------------------------------------*/ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/portmacro.h new file mode 100644 index 0000000..917732f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/portmacro.h @@ -0,0 +1,174 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* System Includes. */ +#include +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*---------------------------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() __asm volatile( " nop " ) +#define portCRITICAL_NESTING_IN_TCB 1 +#define portRESTORE_FIRST_TASK_PRIORITY_LEVEL 1 + + +/*---------------------------------------------------------------------------*/ + +typedef struct MPU_SETTINGS { uint32_t ulNotUsed; } xMPU_SETTINGS; + +/* Define away the instruction from the Restore Context Macro. */ +#define portPRIVILEGE_BIT 0x0UL + +#define portCCPN_MASK ( 0x000000FFUL ) + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() +/*---------------------------------------------------------------------------*/ + +/* CSA Manipulation. */ +#define portCSA_TO_ADDRESS( pCSA ) ( ( uint32_t * )( ( ( ( pCSA ) & 0x000F0000 ) << 12 ) | ( ( ( pCSA ) & 0x0000FFFF ) << 6 ) ) ) +#define portADDRESS_TO_CSA( pAddress ) ( ( uint32_t )( ( ( ( (uint32_t)( pAddress ) ) & 0xF0000000 ) >> 12 ) | ( ( ( uint32_t )( pAddress ) & 0x003FFFC0 ) >> 6 ) ) ) +/*---------------------------------------------------------------------------*/ + +#define portYIELD() _syscall( 0 ) +/* Port Restore is implicit in the platform when the function is returned from the original PSW is automatically replaced. */ +#define portSYSCALL_TASK_YIELD 0 +#define portSYSCALL_RAISE_PRIORITY 1 +/*---------------------------------------------------------------------------*/ + +/* Critical section management. */ + +/* Set ICR.CCPN to configMAX_SYSCALL_INTERRUPT_PRIORITY. */ +#define portDISABLE_INTERRUPTS() { \ + uint32_t ulICR; \ + _disable(); \ + ulICR = __MFCR( $ICR ); /* Get current ICR value. */ \ + ulICR &= ~portCCPN_MASK; /* Clear down mask bits. */ \ + ulICR |= configMAX_SYSCALL_INTERRUPT_PRIORITY; /* Set mask bits to required priority mask. */ \ + _mtcr( $ICR, ulICR ); /* Write back updated ICR. */ \ + _isync(); \ + _enable(); \ + } + +/* Clear ICR.CCPN to allow all interrupt priorities. */ +#define portENABLE_INTERRUPTS() { \ + uint32_t ulICR; \ + _disable(); \ + ulICR = __MFCR( $ICR ); /* Get current ICR value. */ \ + ulICR &= ~portCCPN_MASK; /* Clear down mask bits. */ \ + _mtcr( $ICR, ulICR ); /* Write back updated ICR. */ \ + _isync(); \ + _enable(); \ + } + +/* Set ICR.CCPN to uxSavedMaskValue. */ +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedMaskValue ) { \ + uint32_t ulICR; \ + _disable(); \ + ulICR = __MFCR( $ICR ); /* Get current ICR value. */ \ + ulICR &= ~portCCPN_MASK; /* Clear down mask bits. */ \ + ulICR |= uxSavedMaskValue; /* Set mask bits to previously saved mask value. */ \ + _mtcr( $ICR, ulICR ); /* Write back updated ICR. */ \ + _isync(); \ + _enable(); \ + } + + +/* Set ICR.CCPN to configMAX_SYSCALL_INTERRUPT_PRIORITY */ +extern uint32_t uxPortSetInterruptMaskFromISR( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMaskFromISR() + +/* Pend a priority 1 interrupt, which will take care of the context switch. */ +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken != pdFALSE ) { CPU_SRC0.bits.SETR = 1; _isync(); } } while( 0 ) + +/*---------------------------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*---------------------------------------------------------------------------*/ + +/* + * Port specific clean up macro required to free the CSAs that were consumed by + * a task that has since been deleted. + */ +void vPortReclaimCSA( uint32_t *pxTCB ); +#define portCLEAN_UP_TCB( pxTCB ) vPortReclaimCSA( ( uint32_t * ) ( pxTCB ) ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/porttrap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/porttrap.c new file mode 100644 index 0000000..4585915 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/porttrap.c @@ -0,0 +1,282 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" + +/* Machine includes */ +#include +#include +#include +/*---------------------------------------------------------------------------*/ + +/* + * This reference is required by the Save/Restore Context Macros. + */ +extern volatile uint32_t *pxCurrentTCB; +/*-----------------------------------------------------------*/ + +/* + * This file contains base definitions for all of the possible traps in the system. + * It is suggested to provide implementations for all of the traps but for + * the time being they simply trigger a DEBUG instruction so that it is easy + * to see what caused a particular trap. + * + * Trap Class 6, the SYSCALL, is used exclusively by the operating system. + */ + +/* The Trap Classes. */ +#define portMMU_TRAP 0 +#define portIPT_TRAP 1 +#define portIE_TRAP 2 +#define portCM_TRAP 3 +#define portSBP_TRAP 4 +#define portASSERT_TRAP 5 +#define portNMI_TRAP 7 + +/* MMU Trap Identifications. */ +#define portTIN_MMU_VIRTUAL_ADDRESS_FILL 0 +#define portTIN_MMU_VIRTUAL_ADDRESS_PROTECTION 1 + +/* Internal Protection Trap Identifications. */ +#define portTIN_IPT_PRIVILIGED_INSTRUCTION 1 +#define portTIN_IPT_MEMORY_PROTECTION_READ 2 +#define portTIN_IPT_MEMORY_PROTECTION_WRITE 3 +#define portTIN_IPT_MEMORY_PROTECTION_EXECUTION 4 +#define portTIN_IPT_MEMORY_PROTECTION_PERIPHERAL_ACCESS 5 +#define portTIN_IPT_MEMORY_PROTECTION_NULL_ADDRESS 6 +#define portTIN_IPT_MEMORY_PROTECTION_GLOBAL_REGISTER_WRITE_PROTECTION 7 + +/* Instruction Error Trap Identifications. */ +#define portTIN_IE_ILLEGAL_OPCODE 1 +#define portTIN_IE_UNIMPLEMENTED_OPCODE 2 +#define portTIN_IE_INVALID_OPERAND 3 +#define portTIN_IE_DATA_ADDRESS_ALIGNMENT 4 +#define portTIN_IE_INVALID_LOCAL_MEMORY_ADDRESS 5 + +/* Context Management Trap Identifications. */ +#define portTIN_CM_FREE_CONTEXT_LIST_DEPLETION 1 +#define portTIN_CM_CALL_DEPTH_OVERFLOW 2 +#define portTIN_CM_CALL_DEPTH_UNDEFLOW 3 +#define portTIN_CM_FREE_CONTEXT_LIST_UNDERFLOW 4 +#define portTIN_CM_CALL_STACK_UNDERFLOW 5 +#define portTIN_CM_CONTEXT_TYPE 6 +#define portTIN_CM_NESTING_ERROR 7 + +/* System Bus and Peripherals Trap Identifications. */ +#define portTIN_SBP_PROGRAM_FETCH_SYNCHRONOUS_ERROR 1 +#define portTIN_SBP_DATA_ACCESS_SYNCHRONOUS_ERROR 2 +#define portTIN_SBP_DATA_ACCESS_ASYNCHRONOUS_ERROR 3 +#define portTIN_SBP_COPROCESSOR_TRAP_ASYNCHRONOUS_ERROR 4 +#define portTIN_SBP_PROGRAM_MEMORY_INTEGRITY_ERROR 5 +#define portTIN_SBP_DATA_MEMORY_INTEGRITY_ERROR 6 + +/* Assertion Trap Identifications. */ +#define portTIN_ASSERT_ARITHMETIC_OVERFLOW 1 +#define portTIN_ASSERT_STICKY_ARITHMETIC_OVERFLOW 2 + +/* Non-maskable Interrupt Trap Identifications. */ +#define portTIN_NMI_NON_MASKABLE_INTERRUPT 0 +/*---------------------------------------------------------------------------*/ + +void vMMUTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vInternalProtectionTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vInstructionErrorTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vContextManagementTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vSystemBusAndPeripheralsTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vAssertionTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vNonMaskableInterruptTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +/*---------------------------------------------------------------------------*/ + +void vTrapInstallHandlers( void ) +{ + if( 0 == _install_trap_handler ( portMMU_TRAP, vMMUTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portIPT_TRAP, vInternalProtectionTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portIE_TRAP, vInstructionErrorTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portCM_TRAP, vContextManagementTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portSBP_TRAP, vSystemBusAndPeripheralsTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portASSERT_TRAP, vAssertionTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portNMI_TRAP, vNonMaskableInterruptTrap ) ) + { + _debug(); + } +} +/*-----------------------------------------------------------*/ + +void vMMUTrap( int iTrapIdentification ) +{ + switch( iTrapIdentification ) + { + case portTIN_MMU_VIRTUAL_ADDRESS_FILL: + case portTIN_MMU_VIRTUAL_ADDRESS_PROTECTION: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vInternalProtectionTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_IPT_PRIVILIGED_INSTRUCTION: + /* Instruction is not allowed at current execution level, eg DISABLE at User-0. */ + + case portTIN_IPT_MEMORY_PROTECTION_READ: + /* Load word using invalid address. */ + + case portTIN_IPT_MEMORY_PROTECTION_WRITE: + /* Store Word using invalid address. */ + + case portTIN_IPT_MEMORY_PROTECTION_EXECUTION: + /* PC jumped to an address outside of the valid range. */ + + case portTIN_IPT_MEMORY_PROTECTION_PERIPHERAL_ACCESS: + /* Access to a peripheral denied at current execution level. */ + + case portTIN_IPT_MEMORY_PROTECTION_NULL_ADDRESS: + /* NULL Pointer. */ + + case portTIN_IPT_MEMORY_PROTECTION_GLOBAL_REGISTER_WRITE_PROTECTION: + /* Tried to modify a global address pointer register. */ + + default: + + pxCurrentTCB[ 0 ] = __MFCR( $PCXI ); + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vInstructionErrorTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_IE_ILLEGAL_OPCODE: + case portTIN_IE_UNIMPLEMENTED_OPCODE: + case portTIN_IE_INVALID_OPERAND: + case portTIN_IE_DATA_ADDRESS_ALIGNMENT: + case portTIN_IE_INVALID_LOCAL_MEMORY_ADDRESS: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vContextManagementTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_CM_FREE_CONTEXT_LIST_DEPLETION: + case portTIN_CM_CALL_DEPTH_OVERFLOW: + case portTIN_CM_CALL_DEPTH_UNDEFLOW: + case portTIN_CM_FREE_CONTEXT_LIST_UNDERFLOW: + case portTIN_CM_CALL_STACK_UNDERFLOW: + case portTIN_CM_CONTEXT_TYPE: + case portTIN_CM_NESTING_ERROR: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vSystemBusAndPeripheralsTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_SBP_PROGRAM_FETCH_SYNCHRONOUS_ERROR: + case portTIN_SBP_DATA_ACCESS_SYNCHRONOUS_ERROR: + case portTIN_SBP_DATA_ACCESS_ASYNCHRONOUS_ERROR: + case portTIN_SBP_COPROCESSOR_TRAP_ASYNCHRONOUS_ERROR: + case portTIN_SBP_PROGRAM_MEMORY_INTEGRITY_ERROR: + case portTIN_SBP_DATA_MEMORY_INTEGRITY_ERROR: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vAssertionTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_ASSERT_ARITHMETIC_OVERFLOW: + case portTIN_ASSERT_STICKY_ARITHMETIC_OVERFLOW: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vNonMaskableInterruptTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_NMI_NON_MASKABLE_INTERRUPT: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/ISR_Support.h new file mode 100644 index 0000000..60e5e85 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/ISR_Support.h @@ -0,0 +1,83 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + +#include "FreeRTOSConfig.h" + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the general purpose registers, CS and ES (only in far +; memory mode) registers the usCriticalNesting Value and the Stack Pointer +; of the active Task onto the task stack +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO + + PUSH AX ; Save AX Register to stack. + PUSH HL + MOV A, CS ; Save CS register. + XCH A, X + MOV A, ES ; Save ES register. + PUSH AX + PUSH DE ; Save the remaining general purpose registers. + PUSH BC + MOVW AX, usCriticalNesting ; Save the usCriticalNesting value. + PUSH AX + MOVW AX, pxCurrentTCB ; Save the Stack pointer. + MOVW HL, AX + MOVW AX, SP + MOVW [HL], AX + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Restores the task Stack Pointer then use this to restore usCriticalNesting, +; general purpose registers and the CS and ES (only in far memory mode) +; of the selected task from the task stack +;------------------------------------------------------------------------------ +portRESTORE_CONTEXT MACRO + MOVW AX, pxCurrentTCB ; Restore the Stack pointer. + MOVW HL, AX + MOVW AX, [HL] + MOVW SP, AX + POP AX ; Restore usCriticalNesting value. + MOVW usCriticalNesting, AX + POP BC ; Restore the necessary general purpose registers. + POP DE + POP AX ; Restore the ES register. + MOV ES, A + XCH A, X ; Restore the CS register. + MOV CS, A + POP HL ; Restore general purpose register HL. + POP AX ; Restore AX. + ENDM +;------------------------------------------------------------------------------ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/port.c new file mode 100644 index 0000000..788a22c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/port.c @@ -0,0 +1,226 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* The critical nesting value is initialised to a non zero value to ensure +interrupts don't accidentally become enabled before the scheduler is started. */ +#define portINITIAL_CRITICAL_NESTING (( uint16_t ) 10) + +/* Initial PSW value allocated to a newly created task. + * 1100011000000000 + * ||||||||-------------- Fill byte + * |||||||--------------- Carry Flag cleared + * |||||----------------- In-service priority Flags set to low level + * ||||------------------ Register bank Select 0 Flag cleared + * |||------------------- Auxiliary Carry Flag cleared + * ||-------------------- Register bank Select 1 Flag cleared + * |--------------------- Zero Flag set + * ---------------------- Global Interrupt Flag set (enabled) + */ +#define portPSW (0xc6UL) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Most ports implement critical sections by placing the interrupt flags on +the stack before disabling interrupts. Exiting the critical section is then +simply a case of popping the flags from the stack. As 78K0 IAR does not use +a frame pointer this cannot be done as modifying the stack will clobber all +the stack variables. Instead each task maintains a count of the critical +section nesting depth. Each time a critical section is entered the count is +incremented. Each time a critical section is left the count is decremented - +with interrupts only being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t *pulLocal; + + #if configMEMORY_MODE == 1 + { + /* Parameters are passed in on the stack, and written using a 32bit value + hence a space is left for the second two bytes. */ + pxTopOfStack--; + + /* Write in the parameter value. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) pvParameters; + pxTopOfStack--; + + /* These values are just spacers. The return address of the function + would normally be written here. */ + *pxTopOfStack = ( StackType_t ) 0xcdcd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcdcd; + pxTopOfStack--; + + /* The start address / PSW value is also written in as a 32bit value, + so leave a space for the second two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* An initial value for the AX register. */ + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + } + #else + { + /* Task function address is written to the stack first. As it is + written as a 32bit value a space is left on the stack for the second + two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* The parameter is passed in AX. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + } + #endif + + /* An initial value for the HL register. */ + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + + /* CS and ES registers. */ + *pxTopOfStack = ( StackType_t ) 0x0F00; + pxTopOfStack--; + + /* Finally the remaining general purpose registers DE and BC */ + *pxTopOfStack = ( StackType_t ) 0xDEDE; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBCBC; + pxTopOfStack--; + + /* Finally the critical section nesting count is set to zero when the task + first starts. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + vPortStart(); + + /* Should not get here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the 78K0R port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Setup channel 5 of the TAU to generate the tick interrupt. */ + + /* First the Timer Array Unit has to be enabled. */ + TAU0EN = 1; + + /* To configure the Timer Array Unit all Channels have to first be stopped. */ + TT0 = 0xff; + + /* Interrupt of Timer Array Unit Channel 5 is disabled to set the interrupt + priority. */ + TMMK05 = 1; + + /* Clear Timer Array Unit Channel 5 interrupt flag. */ + TMIF05 = 0; + + /* Set Timer Array Unit Channel 5 interrupt priority */ + TMPR005 = 0; + TMPR105 = 0; + + /* Set Timer Array Unit Channel 5 Mode as interval timer. */ + TMR05 = 0x0000; + + /* Set the compare match value according to the tick rate we want. */ + TDR05 = ( TickType_t ) ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ); + + /* Set Timer Array Unit Channel 5 output mode */ + TOM0 &= ~0x0020; + + /* Set Timer Array Unit Channel 5 output level */ + TOL0 &= ~0x0020; + + /* Set Timer Array Unit Channel 5 output enable */ + TOE0 &= ~0x0020; + + /* Interrupt of Timer Array Unit Channel 5 enabled */ + TMMK05 = 0; + + /* Start Timer Array Unit Channel 5.*/ + TS0 |= 0x0020; +} +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portasm.s26 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portasm.s26 new file mode 100644 index 0000000..2aebe94 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portasm.s26 @@ -0,0 +1,139 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + +#include "ISR_Support.h" +;------------------------------------------------------------------------------ + +#if __CORE__ != __78K0R__ + #error "This file is only for 78K0R Devices" +#endif + +#define CS 0xFFFFC +#define ES 0xFFFFD + +; Functions implemented in this file +;------------------------------------------------------------------------------ + PUBLIC vPortYield + PUBLIC vPortStart + +; Functions used by scheduler +;------------------------------------------------------------------------------ + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + +; Tick ISR Prototype +;------------------------------------------------------------------------------ +; EXTERN ?CL78K0R_V2_L00 + + PUBWEAK `??MD_INTTM05??INTVEC 68` + PUBLIC MD_INTTM05 + +MD_INTTM05 SYMBOL "MD_INTTM05" +`??MD_INTTM05??INTVEC 68` SYMBOL "??INTVEC 68", MD_INTTM05 + + + +;------------------------------------------------------------------------------ +; Yield to another task. Implemented as a software interrupt. The return +; address and PSW will have been saved to the stack automatically before +; this code runs. +; +; Input: NONE +; +; Call: CALL vPortYield +; +; Output: NONE +; +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortYield: + portSAVE_CONTEXT ; Save the context of the current task. + call vTaskSwitchContext ; Call the scheduler to select the next task. + portRESTORE_CONTEXT ; Restore the context of the next task to run. + retb + + +;------------------------------------------------------------------------------ +; Restore the context of the first task that is going to run. +; +; Input: NONE +; +; Call: CALL vPortStart +; +; Output: NONE +; +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortStart: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + reti ; An interrupt stack frame is used so the task + ; is started using a RETI instruction. + +;------------------------------------------------------------------------------ +; Perform the necessary steps of the Tick Count Increment and Task Switch +; depending on the chosen kernel configuration +; +; Input: NONE +; +; Call: ISR +; +; Output: NONE +; +;------------------------------------------------------------------------------ + +MD_INTTM05: + + portSAVE_CONTEXT ; Save the context of the current task. + call xTaskIncrementTick ; Call the timer tick function. +#if configUSE_PREEMPTION == 1 + call vTaskSwitchContext ; Call the scheduler to select the next task. +#endif + portRESTORE_CONTEXT ; Restore the context of the next task to run. + reti + + + +; REQUIRE ?CL78K0R_V2_L00 + COMMON INTVEC:CODE:ROOT(1) ; Set ISR location to the Interrupt vector table. + ORG 68 +`??MD_INTTM05??INTVEC 68`: + DW MD_INTTM05 + + COMMON INTVEC:CODE:ROOT(1) ; Set ISR location to the Interrupt vector table. + ORG 126 +`??vPortYield??INTVEC 126`: + DW vPortYield + + ; Set value for the usCriticalNesting. + RSEG NEAR_ID:CONST:SORT:NOROOT(1) +`?`: + DW 10 + +;#endif + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portmacro.h new file mode 100644 index 0000000..bc05a87 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portmacro.h @@ -0,0 +1,146 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if (configUSE_16_BIT_TICKS==1) + typedef unsigned int TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() __asm ( "DI" ) +#define portENABLE_INTERRUPTS() __asm ( "EI" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortStart( void ); +#define portYIELD() __asm( "BRK" ) +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 ) +#define portNOP() __asm( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + + +static __interrupt void P0_isr (void); + +/* --------------------------------------------------------------------------*/ +/* Option-bytes and security ID */ +/* --------------------------------------------------------------------------*/ +#define OPT_BYTES_SIZE 4 +#define SECU_ID_SIZE 10 +#define WATCHDOG_DISABLED 0x00 +#define LVI_ENABLED 0xFE +#define LVI_DISABLED 0xFF +#define RESERVED_FF 0xFF +#define OCD_DISABLED 0x04 +#define OCD_ENABLED 0x81 +#define OCD_ENABLED_ERASE 0x80 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/port.c new file mode 100644 index 0000000..e2fef78 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/port.c @@ -0,0 +1,301 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt. A default that uses the PIT is provided in the official demo application. +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt. A default that uses the PIT is provided in the official demo application. +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero +then a floating point context must be saved and restored for the task. */ +uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint32_t ulPortInterruptNesting = 0UL; + + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + vPortRestoreTaskContext(); + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + portDISABLE_INTERRUPTS(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + portENABLE_INTERRUPTS(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) ); +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.h new file mode 100644 index 0000000..e10edac --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.h @@ -0,0 +1,114 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + EXTERN vTaskSwitchContext + EXTERN ulCriticalNesting + EXTERN pxCurrentTCB + EXTERN ulPortTaskHasFPUContext + EXTERN ulAsmAPIPriorityMask + +portSAVE_CONTEXT macro + + ; Save the LR and SPSR onto the system mode stack before switching to + ; system mode to save the remaining system mode registers + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + ; Push the critical nesting count + LDR R2, =ulCriticalNesting + LDR R1, [R2] + PUSH {R1} + + ; Does the task have a floating point context that needs saving? If + ; ulPortTaskHasFPUContext is 0 then no. + LDR R2, =ulPortTaskHasFPUContext + LDR R3, [R2] + CMP R3, #0 + + ; Save the floating point context, if any + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} +#if configFPU_D32 == 1 + VPUSHNE {D16-D31} +#endif ; configFPU_D32 + PUSHNE {R1} + + ; Save ulPortTaskHasFPUContext itself + PUSH {R3} + + ; Save the stack pointer in the TCB + LDR R0, =pxCurrentTCB + LDR R1, [R0] + STR SP, [R1] + + endm + +; /**********************************************************************/ + +portRESTORE_CONTEXT macro + + ; Set the SP to point to the stack of the task being restored. + LDR R0, =pxCurrentTCB + LDR R1, [R0] + LDR SP, [R1] + + ; Is there a floating point context to restore? If the restored + ; ulPortTaskHasFPUContext is zero then no. + LDR R0, =ulPortTaskHasFPUContext + POP {R1} + STR R1, [R0] + CMP R1, #0 + + ; Restore the floating point context, if any + POPNE {R0} +#if configFPU_D32 == 1 + VPOPNE {D16-D31} +#endif ; configFPU_D32 + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + ; Restore the critical section nesting depth + LDR R0, =ulCriticalNesting + POP {R1} + STR R1, [R0] + + ; Restore all system mode registers other than the SP (which is already + ; being used) + POP {R0-R12, R14} + + ; Return to the task code, loading CPSR on the way. CPSR has the interrupt + ; enable bit set appropriately for the task about to execute. + RFEIA sp! + + endm + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.s new file mode 100644 index 0000000..4775c63 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.s @@ -0,0 +1,177 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + INCLUDE FreeRTOSConfig.h + INCLUDE portmacro.h + + EXTERN vTaskSwitchContext + EXTERN ulPortYieldRequired + EXTERN ulPortInterruptNesting + EXTERN vApplicationIRQHandler + + PUBLIC FreeRTOS_SWI_Handler + PUBLIC FreeRTOS_IRQ_Handler + PUBLIC vPortRestoreTaskContext + +SYS_MODE EQU 0x1f +SVC_MODE EQU 0x13 +IRQ_MODE EQU 0x12 + + SECTION .text:CODE:ROOT(2) + ARM + + INCLUDE portASM.h + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; SVC handler is used to yield a task. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_SWI_Handler + + PRESERVE8 + + ; Save the context of the current task and select a new task to run. + portSAVE_CONTEXT + LDR R0, =vTaskSwitchContext + BLX R0 + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; vPortRestoreTaskContext is used to start the scheduler. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortRestoreTaskContext + + PRESERVE8 + + ; Switch to system mode + CPS #SYS_MODE + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; IRQ interrupt handler used when individual priorities cannot be masked +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_IRQ_Handler + + PRESERVE8 + + ; Return to the interrupted instruction. + SUB lr, lr, #4 + + ; Push the return address and SPSR + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + ; Change to supervisor mode to allow reentry. + CPS #SVC_MODE + + ; Push used registers. + PUSH {r0-r4, r12} + + ; Increment nesting count. r3 holds the address of ulPortInterruptNesting + ; for future use. r1 holds the original ulPortInterruptNesting value for + ; future use. + LDR r3, =ulPortInterruptNesting + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + ; Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + ; future use. + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + PUSH {r0-r4, lr} + + ; Call the port part specific handler. + LDR r0, =vApplicationIRQHandler + BLX r0 + POP {r0-r4, lr} + ADD sp, sp, r2 + + CPSID i + + ; Write to the EOI register. + LDR r4, =configEOI_ADDRESS + STR r0, [r4] + + ; Restore the old nesting count + STR r1, [r3] + + ; A context switch is never performed if the nesting count is not 0. + CMP r1, #0 + BNE exit_without_switch + + ; Did the interrupt request a context switch? r1 holds the address of + ; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + ; use. + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch + ; No context switch. Restore used registers, LR_irq and SPSR before + ; returning. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit + ; A context switch is to be performed. Clear the context switch pending + ; flag. + MOV r0, #0 + STR r0, [r1] + + ; Restore used registers, LR-irq and SPSR before saving the context + ; to the task stack. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + ; Call the function that selects the new task to execute. + ; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + ; instructions, or 8 byte aligned stack allocated data. LR does not need + ; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. + LDR r0, =vTaskSwitchContext + BLX r0 + + ; Restore the context of, and branch to, the task selected to execute next. + portRESTORE_CONTEXT + + END + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portmacro.h new file mode 100644 index 0000000..e1677cc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portmacro.h @@ -0,0 +1,163 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* IAR includes. */ +#ifdef __ICCARM__ + + #include + + #ifdef __cplusplus + extern "C" { + #endif + + /*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + + /* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + + /*-----------------------------------------------------------*/ + + /* Hardware specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + + /*-----------------------------------------------------------*/ + + /* Task utilities. */ + + /* Called at the end of an ISR that can cause a context switch. */ + #define portEND_SWITCHING_ISR( xSwitchRequired )\ + { \ + extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ + } + + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + #define portYIELD() __asm volatile ( "SWI 0" ); __ISB() + + + /*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulPortSetInterruptMask( void ); + extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); + + #define portENTER_CRITICAL() vPortEnterCritical(); + #define portEXIT_CRITICAL() vPortExitCritical(); + #define portDISABLE_INTERRUPTS() __disable_irq(); __DSB(); __ISB() /* No priority mask register so global disable is used. */ + #define portENABLE_INTERRUPTS() __enable_irq() + #define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_state(); __disable_irq() /* No priority mask register so global disable is used. */ + #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) __set_interrupt_state(x) + + /*-----------------------------------------------------------*/ + + /* Task function macros as described on the FreeRTOS.org WEB site. These are + not required for this port but included in case common demo code that uses these + macros is used. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + + /* Prototype of the FreeRTOS tick handler. This must be installed as the + handler for whichever peripheral is used to generate the RTOS tick. */ + void FreeRTOS_Tick_Handler( void ); + + /* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() + before any floating point instructions are executed. */ + void vPortTaskUsesFPU( void ); + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + + /* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( uxReadyPriorities ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + #define portNOP() __asm volatile( "NOP" ) + + + #ifdef __cplusplus + } /* extern C */ + #endif + + /* Suppress warnings that are generated by the IAR tools, but cannot be + fixed in the source code because to do so would cause other compilers to + generate warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + +#endif /* __ICCARM__ */ + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/port.c new file mode 100644 index 0000000..418c563 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/port.c @@ -0,0 +1,440 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary +point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + __disable_irq(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm( "DSB \n" \ + "ISB \n" ); \ + __enable_irq(); \ +} + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero +then a floating point context must be saved and restored for the task. */ +uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint32_t ulPortInterruptNesting = 0UL; + + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Only continue if the binary point value is set to its lowest possible + setting. See the comments in vPortValidateInterruptPriority() below for + more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + __enable_irq(); + vPortRestoreTaskContext(); + } + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + ulPortSetInterruptMask(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. */ + __disable_irq(); + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm( "DSB \n" + "ISB \n" ); + __enable_irq(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) ); +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + if( ulNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ +uint32_t ulReturn; + + __disable_irq(); + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm( "DSB \n" + "ISB \n" ); + } + __enable_irq(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + The priority grouping is configured by the GIC's binary point register + (ICCBPR). Writting 0 to ICCBPR will ensure it is set to its lowest + possible value (which may be above 0). */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.h new file mode 100644 index 0000000..563909e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.h @@ -0,0 +1,116 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + EXTERN vTaskSwitchContext + EXTERN ulCriticalNesting + EXTERN pxCurrentTCB + EXTERN ulPortTaskHasFPUContext + EXTERN ulAsmAPIPriorityMask + +portSAVE_CONTEXT macro + + ; Save the LR and SPSR onto the system mode stack before switching to + ; system mode to save the remaining system mode registers + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + ; Push the critical nesting count + LDR R2, =ulCriticalNesting + LDR R1, [R2] + PUSH {R1} + + ; Does the task have a floating point context that needs saving? If + ; ulPortTaskHasFPUContext is 0 then no. + LDR R2, =ulPortTaskHasFPUContext + LDR R3, [R2] + CMP R3, #0 + + ; Save the floating point context, if any + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} + VPUSHNE {D16-D31} + PUSHNE {R1} + + ; Save ulPortTaskHasFPUContext itself + PUSH {R3} + + ; Save the stack pointer in the TCB + LDR R0, =pxCurrentTCB + LDR R1, [R0] + STR SP, [R1] + + endm + +; /**********************************************************************/ + +portRESTORE_CONTEXT macro + + ; Set the SP to point to the stack of the task being restored. + LDR R0, =pxCurrentTCB + LDR R1, [R0] + LDR SP, [R1] + + ; Is there a floating point context to restore? If the restored + ; ulPortTaskHasFPUContext is zero then no. + LDR R0, =ulPortTaskHasFPUContext + POP {R1} + STR R1, [R0] + CMP R1, #0 + + ; Restore the floating point context, if any + POPNE {R0} + VPOPNE {D16-D31} + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + ; Restore the critical section nesting depth + LDR R0, =ulCriticalNesting + POP {R1} + STR R1, [R0] + + ; Ensure the priority mask is correct for the critical nesting depth + LDR R2, =portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS + CMP R1, #0 + MOVEQ R4, #255 + LDRNE R4, =( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) + STR R4, [r2] + + ; Restore all system mode registers other than the SP (which is already + ; being used) + POP {R0-R12, R14} + + ; Return to the task code, loading CPSR on the way. + RFEIA sp! + + endm + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.s new file mode 100644 index 0000000..2ee6da3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.s @@ -0,0 +1,178 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + INCLUDE FreeRTOSConfig.h + INCLUDE portmacro.h + + EXTERN vApplicationIRQHandler + EXTERN vTaskSwitchContext + EXTERN ulPortYieldRequired + EXTERN ulPortInterruptNesting + + PUBLIC FreeRTOS_SWI_Handler + PUBLIC FreeRTOS_IRQ_Handler + PUBLIC vPortRestoreTaskContext + +SYS_MODE EQU 0x1f +SVC_MODE EQU 0x13 +IRQ_MODE EQU 0x12 + + + SECTION .text:CODE:ROOT(2) + ARM + + INCLUDE portASM.h + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; SVC handler is used to yield a task. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_SWI_Handler + + PRESERVE8 + + ; Save the context of the current task and select a new task to run. + portSAVE_CONTEXT + LDR R0, =vTaskSwitchContext + BLX R0 + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; vPortRestoreTaskContext is used to start the scheduler. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortRestoreTaskContext + ; Switch to system mode + CPS #SYS_MODE + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; PL390 GIC interrupt handler +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_IRQ_Handler + + ; Return to the interrupted instruction. + SUB lr, lr, #4 + + ; Push the return address and SPSR + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + ; Change to supervisor mode to allow reentry. + CPS #SVC_MODE + + ; Push used registers. + PUSH {r0-r4, r12} + + ; Increment nesting count. r3 holds the address of ulPortInterruptNesting + ; for future use. r1 holds the original ulPortInterruptNesting value for + ; future use. + LDR r3, =ulPortInterruptNesting + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + ; Read value from the interrupt acknowledge register, which is stored in r0 + ; for future parameter and interrupt clearing use. + LDR r2, =portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS + LDR r0, [r2] + + ; Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + ; future use. _RB_ Is this ever necessary if start of stack is 8-byte aligned? + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + ; Call the interrupt handler. r4 is pushed to maintain alignment. + PUSH {r0-r4, lr} + LDR r1, =vApplicationIRQHandler + BLX r1 + POP {r0-r4, lr} + ADD sp, sp, r2 + + CPSID i + + ; Write the value read from ICCIAR to ICCEOIR + LDR r4, =portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS + STR r0, [r4] + + ; Restore the old nesting count + STR r1, [r3] + + ; A context switch is never performed if the nesting count is not 0 + CMP r1, #0 + BNE exit_without_switch + + ; Did the interrupt request a context switch? r1 holds the address of + ; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + ; use. + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch + ; No context switch. Restore used registers, LR_irq and SPSR before + ; returning. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit + ; A context switch is to be performed. Clear the context switch pending + ; flag. + MOV r0, #0 + STR r0, [r1] + + ; Restore used registers, LR-irq and SPSR before saving the context + ; to the task stack. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + ; Call the function that selects the new task to execute. + ; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + ; instructions, or 8 byte aligned stack allocated data. LR does not need + ; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. + LDR r0, =vTaskSwitchContext + BLX r0 + + ; Restore the context of, and branch to, the task selected to execute next. + portRESTORE_CONTEXT + + + END + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portmacro.h new file mode 100644 index 0000000..e3e69e3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portmacro.h @@ -0,0 +1,210 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* IAR includes. */ +#ifdef __ICCARM__ + + #include + + #ifdef __cplusplus + extern "C" { + #endif + + /*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + + /* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + + /*-----------------------------------------------------------*/ + + /* Hardware specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + + /*-----------------------------------------------------------*/ + + /* Task utilities. */ + + /* Called at the end of an ISR that can cause a context switch. */ + #define portEND_SWITCHING_ISR( xSwitchRequired )\ + { \ + extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ + } + + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + #define portYIELD() __asm( "SWI 0" ); + + + /*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulPortSetInterruptMask( void ); + extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); + + /* These macros do not globally disable/enable interrupts. They do mask off + interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ + #define portENTER_CRITICAL() vPortEnterCritical(); + #define portEXIT_CRITICAL() vPortExitCritical(); + #define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() + #define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + + /*-----------------------------------------------------------*/ + + /* Task function macros as described on the FreeRTOS.org WEB site. These are + not required for this port but included in case common demo code that uses these + macros is used. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + + /* Prototype of the FreeRTOS tick handler. This must be installed as the + handler for whichever peripheral is used to generate the RTOS tick. */ + void FreeRTOS_Tick_Handler( void ); + + /* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() + before any floating point instructions are executed. */ + void vPortTaskUsesFPU( void ); + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + + #define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) + #define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + + /* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( uxReadyPriorities ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif /* configASSERT */ + + #define portNOP() __asm volatile( "NOP" ) + + + #ifdef __cplusplus + } /* extern C */ + #endif + + /* Suppress warnings that are generated by the IAR tools, but cannot be + fixed in the source code because to do so would cause other compilers to + generate warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + +#endif /* __ICCARM__ */ + + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +/* Interrupt controller access addresses. */ +#define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) +#define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) +#define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) +#define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) + +#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) +#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) +#define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) +#define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/port.c new file mode 100644 index 0000000..6fed504 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/port.c @@ -0,0 +1,498 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM0 port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include "intrinsics.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is + * defined. The value 255 should also ensure backward compatibility. + * FreeRTOS.org versions prior to V4.3.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 0 +#endif + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#ifndef portMISSED_COUNTS_FACTOR + #define portMISSED_COUNTS_FACTOR ( 94UL ) +#endif + +/* The number of SysTick increments that make up one tick period. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET; + + /* Barriers are normally not required but do ensure the code is completely + * within the specified behaviour for the architecture. */ + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the __disable_interrupt() + * call above. */ + __enable_interrupt(); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the __disable_interrupt() call above. */ + __enable_interrupt(); + __DSB(); + __ISB(); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __enable_interrupt(); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portasm.s new file mode 100644 index 0000000..4e6ea5b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portasm.s @@ -0,0 +1,132 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN vPortYieldFromISR + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC vSetMSP + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC ulSetInterruptMaskFromISR + PUBLIC vClearInterruptMaskFromISR + +/*-----------------------------------------------------------*/ + +vSetMSP + msr msp, r0 + bx lr + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + subs r0, r0, #32 /* Make space for the remaining low registers. */ + str r0, [r2] /* Save the new top of stack. */ + stmia r0!, {r4-r7} /* Store the low registers that are not saved automatically. */ + mov r4, r8 /* Store the high registers. */ + mov r5, r9 + mov r6, r10 + mov r7, r11 + stmia r0!, {r4-r7} + + push {r3, r14} + cpsid i + bl vTaskSwitchContext + cpsie i + pop {r2, r3} /* lr goes in r3. r2 now holds tcb pointer. */ + + ldr r1, [r2] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, r0, #16 /* Move to the high registers. */ + ldmia r0!, {r4-r7} /* Pop the high registers. */ + mov r8, r4 + mov r9, r5 + mov r10, r6 + mov r11, r7 + + msr psp, r0 /* Remember the new top of stack for the task. */ + + subs r0, r0, #32 /* Go back for the low registers that are not automatically restored. */ + ldmia r0!, {r4-r7} /* Pop low registers. */ + + bx r3 + +/*-----------------------------------------------------------*/ + +vPortSVCHandler; + /* This function is no longer used, but retained for backward + compatibility. */ + bx lr + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + table offset register that can be used to locate the initial stack value. + Not all M0 parts have the application vector table at address 0. */ + + ldr r3, =pxCurrentTCB /* Obtain location of pxCurrentTCB. */ + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + movs r0, #2 /* Switch to the psp stack. */ + msr CONTROL, r0 + isb + pop {r0-r5} /* Pop the registers that are saved automatically. */ + mov lr, r5 /* lr is now in r5. */ + pop {r3} /* The return address is now in r3. */ + pop {r2} /* Pop and discard the XPSR. */ + cpsie i /* The first task has its context and interrupts can be enabled. */ + bx r3 /* Jump to the user defined task code. */ + +/*-----------------------------------------------------------*/ + +ulSetInterruptMaskFromISR + mrs r0, PRIMASK + cpsid i + bx lr + +/*-----------------------------------------------------------*/ + +vClearInterruptMaskFromISR + msr PRIMASK, r0 + bx lr + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portmacro.h new file mode 100644 index 0000000..d5f8f82 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portmacro.h @@ -0,0 +1,128 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + extern void vPortYield( void ); + #define portNVIC_INT_CTRL ( ( volatile uint32_t * ) 0xe000ed04 ) + #define portNVIC_PENDSVSET 0x10000000 + #define portYIELD() vPortYield() + #define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulSetInterruptMaskFromISR( void ); + extern void vClearInterruptMaskFromISR( uint32_t ulMask ); + + #define portDISABLE_INTERRUPTS() __asm volatile ( "cpsid i" ) + #define portENABLE_INTERRUPTS() __asm volatile ( "cpsie i" ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMaskFromISR( x ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + + #define portNOP() + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ + #pragma diag_suppress=Pa082 + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.s new file mode 100644 index 0000000..6e658f8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.s @@ -0,0 +1,391 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN xSecureContext + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + EXTERN SecureContext_SaveContext + EXTERN SecureContext_LoadContext + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vPortAllocateSecureContext + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler + PUBLIC vPortFreeSecureContext + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + movs r1, #1 /* r1 = 1. */ + tst r0, r1 /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */ + beq running_privileged /* If the result of previous AND operation was 0, branch. */ + movs r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + bx lr /* Return. */ + running_privileged: + movs r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + movs r1, #1 /* r1 = 1. */ + orrs r0, r1 /* r0 = r0 | r1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vPortAllocateSecureContext: + svc 0 /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r3, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r3] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + movs r5, #1 /* r5 = 1. */ + bics r4, r5 /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r3, #4 /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + ldr r4, [r3] /* r4 = *r3 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + adds r3, #4 /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + movs r5, #4 /* r5 = 4. */ + str r5, [r2] /* Program RNR = 4. */ + ldmia r3!, {r6,r7} /* Read first set of RBAR/RLAR from TCB. */ + ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */ + stmia r4!, {r6,r7} /* Write first set of RBAR/RLAR registers. */ + movs r5, #5 /* r5 = 5. */ + str r5, [r2] /* Program RNR = 5. */ + ldmia r3!, {r6,r7} /* Read second set of RBAR/RLAR from TCB. */ + ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */ + stmia r4!, {r6,r7} /* Write second set of RBAR/RLAR registers. */ + movs r5, #6 /* r5 = 6. */ + str r5, [r2] /* Program RNR = 6. */ + ldmia r3!, {r6,r7} /* Read third set of RBAR/RLAR from TCB. */ + ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */ + stmia r4!, {r6,r7} /* Write third set of RBAR/RLAR registers. */ + movs r5, #7 /* r5 = 7. */ + str r5, [r2] /* Program RNR = 7. */ + ldmia r3!, {r6,r7} /* Read fourth set of RBAR/RLAR from TCB. */ + ldr r4, =0xe000ed9c /* r4 = 0xe000ed9c [Location of RBAR]. */ + stmia r4!, {r6,r7} /* Write fourth set of RBAR/RLAR registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + movs r5, #1 /* r5 = 1. */ + orrs r4, r5 /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r4} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + ldr r5, =xSecureContext + str r1, [r5] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + msr control, r3 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + bx r4 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r3} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + ldr r4, =xSecureContext + str r1, [r4] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + bx r3 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + movs r1, #1 /* r1 = 1. */ + bics r0, r1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, PRIMASK + cpsid i + bx lr +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr PRIMASK, r0 + bx lr +/*-----------------------------------------------------------*/ + +PendSV_Handler: + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + ldr r0, [r3] /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + mrs r2, psp /* Read PSP in r2. */ + + cbz r0, save_ns_context /* No secure context to save. */ + push {r0-r2, r14} + bl SecureContext_SaveContext /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r0-r3} /* LR is now in r3. */ + mov lr, r3 /* LR = r3. */ + lsls r1, r3, #25 /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl save_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ +#if ( configENABLE_MPU == 1 ) + subs r2, r2, #16 /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ +#else /* configENABLE_MPU */ + subs r2, r2, #12 /* Make space for xSecureContext, PSPLIM and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ +#endif /* configENABLE_MPU */ + b select_next_task + + save_ns_context: + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + #if ( configENABLE_MPU == 1 ) + subs r2, r2, #48 /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #16 /* r2 = r2 + 16. */ + stmia r2!, {r4-r7} /* Store the low registers that are not saved automatically. */ + mov r4, r8 /* r4 = r8. */ + mov r5, r9 /* r5 = r9. */ + mov r6, r10 /* r6 = r10. */ + mov r7, r11 /* r7 = r11. */ + stmia r2!, {r4-r7} /* Store the high registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + subs r2, r2, #48 /* r2 = r2 - 48. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + subs r2, r2, #44 /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3-r7} /* Store xSecureContext, PSPLIM, LR and the low registers that are not saved automatically. */ + mov r4, r8 /* r4 = r8. */ + mov r5, r9 /* r5 = r9. */ + mov r6, r10 /* r6 = r10. */ + mov r7, r11 /* r7 = r11. */ + stmia r2!, {r4-r7} /* Store the high registers that are not saved automatically. */ + #endif /* configENABLE_MPU */ + + select_next_task: + cpsid i + bl vTaskSwitchContext + cpsie i + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + ldr r2, [r1] /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + + #if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + movs r5, #1 /* r5 = 1. */ + bics r4, r5 /* r4 = r4 & ~r5 i.e. Clear the bit 0 in r4. */ + str r4, [r3] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r3, =0xe000edc0 /* r3 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r3] /* Program MAIR0. */ + ldr r4, =0xe000ed98 /* r4 = 0xe000ed98 [Location of RNR]. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + movs r5, #4 /* r5 = 4. */ + str r5, [r4] /* Program RNR = 4. */ + ldmia r1!, {r6,r7} /* Read first set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r6,r7} /* Write first set of RBAR/RLAR registers. */ + movs r5, #5 /* r5 = 5. */ + str r5, [r4] /* Program RNR = 5. */ + ldmia r1!, {r6,r7} /* Read second set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r6,r7} /* Write second set of RBAR/RLAR registers. */ + movs r5, #6 /* r5 = 6. */ + str r5, [r4] /* Program RNR = 6. */ + ldmia r1!, {r6,r7} /* Read third set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r6,r7} /* Write third set of RBAR/RLAR registers. */ + movs r5, #7 /* r5 = 7. */ + str r5, [r4] /* Program RNR = 7. */ + ldmia r1!, {r6,r7} /* Read fourth set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r6,r7} /* Write fourth set of RBAR/RLAR registers. */ + + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + movs r5, #1 /* r5 = 1. */ + orrs r4, r5 /* r4 = r4 | r5 i.e. Set the bit 0 in r4. */ + str r4, [r3] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + + #if ( configENABLE_MPU == 1 ) + ldmia r2!, {r0, r1, r3, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r3 /* Restore the CONTROL register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #else /* configENABLE_MPU */ + ldmia r2!, {r0, r1, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #endif /* configENABLE_MPU */ + + restore_ns_context: + adds r2, r2, #16 /* Move to the high registers. */ + ldmia r2!, {r4-r7} /* Restore the high registers that are not automatically restored. */ + mov r8, r4 /* r8 = r4. */ + mov r9, r5 /* r9 = r5. */ + mov r10, r6 /* r10 = r6. */ + mov r11, r7 /* r11 = r7. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + subs r2, r2, #32 /* Go back to the low registers. */ + ldmia r2!, {r4-r7} /* Restore the low registers that are not automatically restored. */ + bx lr +/*-----------------------------------------------------------*/ + +SVC_Handler: + movs r0, #4 + mov r1, lr + tst r0, r1 + beq stacking_used_msp + mrs r0, psp + b vPortSVCHandler_C + stacking_used_msp: + mrs r0, msp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + +vPortFreeSecureContext: + ldr r2, [r0] /* The first item in the TCB is the top of the stack. */ + ldr r1, [r2] /* The first item on the stack is the task's xSecureContext. */ + cmp r1, #0 /* Raise svc if task's xSecureContext is not NULL. */ + bne free_secure_context /* Branch if r1 != 0. */ + bx lr /* There is no secure context (xSecureContext is NULL). */ + free_secure_context: + svc 1 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacro.h new file mode 100644 index 0000000..f31bd3f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacro.h @@ -0,0 +1,78 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M23" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.c new file mode 100644 index 0000000..1996693 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.c @@ -0,0 +1,351 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 + +/** + * @brief Size of stack seal values in bytes. + */ +#define securecontextSTACK_SEAL_SIZE 8 + +/** + * @brief Stack seal value as recommended by ARM. + */ +#define securecontextSTACK_SEAL_VALUE 0xFEF5EDA5 + +/** + * @brief Maximum number of secure contexts. + */ +#ifndef secureconfigMAX_SECURE_CONTEXTS + #define secureconfigMAX_SECURE_CONTEXTS 8UL +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Pre-allocated array of secure contexts. + */ +SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ]; +/*-----------------------------------------------------------*/ + +/** + * @brief Get a free secure context for a task from the secure context pool (xSecureContexts). + * + * This function ensures that only one secure context is allocated for a task. + * + * @param[in] pvTaskHandle The task handle for which the secure context is allocated. + * + * @return Index of a free secure context in the xSecureContexts array. + */ +static uint32_t ulGetSecureContext( void * pvTaskHandle ); + +/** + * @brief Return the secure context to the secure context pool (xSecureContexts). + * + * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array. + */ +static void vReturnSecureContext( uint32_t ulSecureContextIndex ); + +/* These are implemented in assembly. */ +extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ); +extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ); +/*-----------------------------------------------------------*/ + +static uint32_t ulGetSecureContext( void * pvTaskHandle ) +{ + /* Start with invalid index. */ + uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) && + ( xSecureContexts[ i ].pucStackLimit == NULL ) && + ( xSecureContexts[ i ].pucStackStart == NULL ) && + ( xSecureContexts[ i ].pvTaskHandle == NULL ) && + ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = i; + } + else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle ) + { + /* A task can only have one secure context. Do not allocate a second + * context for the same task. */ + ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + break; + } + } + + return ulSecureContextIndex; +} +/*-----------------------------------------------------------*/ + +static void vReturnSecureContext( uint32_t ulSecureContextIndex ) +{ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL; + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR, i; + static uint32_t ulSecureContextsInitialized = 0; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) ) + { + /* Ensure to initialize secure contexts only once. */ + ulSecureContextsInitialized = 1; + + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + /* Initialize all secure contexts. */ + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + xSecureContexts[ i ].pucCurrentStackPointer = NULL; + xSecureContexts[ i ].pucStackLimit = NULL; + xSecureContexts[ i ].pucStackStart = NULL; + xSecureContexts[ i ].pvTaskHandle = NULL; + } + + #if ( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ) +#endif /* configENABLE_MPU */ +{ + uint8_t * pucStackMemory = NULL; + uint8_t * pucStackLimit; + uint32_t ulIPSR, ulSecureContextIndex; + SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID; + + #if ( configENABLE_MPU == 1 ) + uint32_t * pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit + * Register (PSPLIM) value. */ + secureportREAD_IPSR( ulIPSR ); + secureportREAD_PSPLIM( pucStackLimit ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. + * Also do nothing, if a secure context us already loaded. PSPLIM is set to + * securecontextNO_STACK when no secure context is loaded. */ + if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) ) + { + /* Ontain a free secure context. */ + ulSecureContextIndex = ulGetSecureContext( pvTaskHandle ); + + /* Were we able to get a free context? */ + if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte for stack (excluding the space for seal values) + * because the hardware decrements the stack pointer before + * writing i.e. if stack pointer is 0x2, a push operation will + * decrement the stack pointer to 0x1 and then write at 0x1. */ + xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize; + + /* Seal the created secure process stack. */ + *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE; + *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory; + + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle; + + #if ( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart; + pulCurrentStackPointer--; + + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart; + } + #endif /* configENABLE_MPU */ + + /* Ensure to never return 0 as a valid context handle. */ + xSecureContextHandle = ulSecureContextIndex + 1UL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint32_t ulIPSR, ulSecureContextIndex; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Only free if a valid context handle is passed. */ + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + /* Ensure that the secure context being deleted is associated with + * the task. */ + if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) + { + /* Free the stack space. */ + vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit ); + + /* Return the secure context back to the free secure contexts pool. */ + vReturnSecureContext( ulSecureContextIndex ); + } + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that no secure context is loaded and the task is loading it's + * own context. */ + if( ( pucStackLimit == securecontextNO_STACK ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that task's context is loaded and the task is saving it's own + * context. */ + if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.h new file mode 100644 index 0000000..de33d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no secure context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Invalid context ID. + */ +#define securecontextINVALID_CONTEXT_ID 0UL +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent a secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first address of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t * pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t * pucStackStart; /**< First location of the stack memory. */ + void * pvTaskHandle; /**< Task handle of the task this context is associated with. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Opaque handle for a secure context. + */ +typedef uint32_t SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if ( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s new file mode 100644 index 0000000..aee841a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s @@ -0,0 +1,88 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + SECTION .text:CODE:NOROOT(2) + THUMB + +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + PUBLIC SecureContext_LoadContextAsm + PUBLIC SecureContext_SaveContextAsm + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif +/*-----------------------------------------------------------*/ + +SecureContext_LoadContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, load_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + ldmia r0!, {r1, r2} /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + +#if ( configENABLE_MPU == 1 ) + ldmia r1!, {r3} /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + msr control, r3 /* CONTROL = r3. */ +#endif /* configENABLE_MPU */ + + msr psplim, r2 /* PSPLIM = r2. */ + msr psp, r1 /* PSP = r1. */ + + load_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + +SecureContext_SaveContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, save_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + mrs r1, psp /* r1 = PSP. */ + +#if ( configENABLE_MPU == 1 ) + mrs r2, control /* r2 = CONTROL. */ + subs r1, r1, #4 /* Make space for the CONTROL value on the stack. */ + str r1, [r0] /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + stmia r1!, {r2} /* Store CONTROL value on the stack. */ +#else /* configENABLE_MPU */ + str r1, [r0] /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ +#endif /* configENABLE_MPU */ + + movs r1, #0 /* r1 = securecontextNO_STACK. */ + msr psplim, r1 /* PSPLIM = securecontextNO_STACK. */ + msr psp, r1 /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + + save_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.c new file mode 100644 index 0000000..b3bf007 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.c @@ -0,0 +1,454 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#ifndef secureconfigTOTAL_HEAP_SIZE + #define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) +#endif + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */ + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.h new file mode 100644 index 0000000..e469f2c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void * pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void * pv ); + +/** + * @brief Get the free heap size. + * + * @return Free heap size. + */ +size_t xPortGetFreeHeapSize( void ); + +/** + * @brief Get the minimum ever free heap size. + * + * @return Minimum ever free heap size. + */ +size_t xPortGetMinimumEverFreeHeapSize( void ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.c new file mode 100644 index 0000000..f6570d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.c @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.h new file mode 100644 index 0000000..e89af71 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_port_macros.h new file mode 100644 index 0000000..2fb7c59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_port_macros.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) ) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Read the PSPLIM value in the given variable. + */ +#define secureportREAD_PSPLIM( pucOutStackLimit ) \ + __asm volatile ( "mrs %0, psplim" : "=r" ( pucOutStackLimit ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ; ; ) {; } \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s new file mode 100644 index 0000000..9850588 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s @@ -0,0 +1,310 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler + +#if ( configENABLE_FPU == 1 ) + #error Cortex-M23 does not have a Floating Point Unit (FPU) and therefore configENABLE_FPU must be set to 0. +#endif +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + movs r1, #1 /* r1 = 1. */ + tst r0, r1 /* Perform r0 & r1 (bitwise AND) and update the conditions flag. */ + beq running_privileged /* If the result of previous AND operation was 0, branch. */ + movs r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + bx lr /* Return. */ + running_privileged: + movs r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + bx lr /* Return. */ + +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + movs r1, #1 /* r1 = 1. */ + orrs r0, r1 /* r0 = r0 | r1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + movs r4, #1 /* r4 = 1. */ + bics r3, r4 /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */ + str r3, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r2] /* Program RNR = 4. */ + ldmia r1!, {r5,r6} /* Read first set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write first set of RBAR/RLAR registers. */ + movs r4, #5 /* r4 = 5. */ + str r4, [r2] /* Program RNR = 5. */ + ldmia r1!, {r5,r6} /* Read second set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write second set of RBAR/RLAR registers. */ + movs r4, #6 /* r4 = 6. */ + str r4, [r2] /* Program RNR = 6. */ + ldmia r1!, {r5,r6} /* Read third set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write third set of RBAR/RLAR registers. */ + movs r4, #7 /* r4 = 7. */ + str r4, [r2] /* Program RNR = 7. */ + ldmia r1!, {r5,r6} /* Read fourth set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write fourth set of RBAR/RLAR registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + movs r4, #1 /* r4 = 1. */ + orrs r3, r4 /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */ + str r3, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r3} /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + msr control, r2 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + bx r3 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r2} /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + bx r2 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + movs r1, #1 /* r1 = 1. */ + bics r0, r1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ + nop +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, PRIMASK + cpsid i + bx lr +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr PRIMASK, r0 + bx lr +/*-----------------------------------------------------------*/ + +PendSV_Handler: + mrs r0, psp /* Read PSP in r0. */ + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ +#if ( configENABLE_MPU == 1 ) + subs r0, r0, #44 /* Make space for PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + str r0, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r2, control /* r2 = CONTROL. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r0!, {r1-r7} /* Store on the stack - PSPLIM, CONTROL, LR and low registers that are not automatically saved. */ + mov r4, r8 /* r4 = r8. */ + mov r5, r9 /* r5 = r9. */ + mov r6, r10 /* r6 = r10. */ + mov r7, r11 /* r7 = r11. */ + stmia r0!, {r4-r7} /* Store the high registers that are not saved automatically. */ +#else /* configENABLE_MPU */ + subs r0, r0, #40 /* Make space for PSPLIM, LR and the remaining registers on the stack. */ + str r0, [r1] /* Save the new top of stack in TCB. */ + mrs r2, psplim /* r2 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r0!, {r2-r7} /* Store on the stack - PSPLIM, LR and low registers that are not automatically saved. */ + mov r4, r8 /* r4 = r8. */ + mov r5, r9 /* r5 = r9. */ + mov r6, r10 /* r6 = r10. */ + mov r7, r11 /* r7 = r11. */ + stmia r0!, {r4-r7} /* Store the high registers that are not saved automatically. */ +#endif /* configENABLE_MPU */ + + cpsid i + bl vTaskSwitchContext + cpsie i + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + movs r4, #1 /* r4 = 1. */ + bics r3, r4 /* r3 = r3 & ~r4 i.e. Clear the bit 0 in r3. */ + str r3, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r2] /* Program RNR = 4. */ + ldmia r1!, {r5,r6} /* Read first set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write first set of RBAR/RLAR registers. */ + movs r4, #5 /* r4 = 5. */ + str r4, [r2] /* Program RNR = 5. */ + ldmia r1!, {r5,r6} /* Read second set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write second set of RBAR/RLAR registers. */ + movs r4, #6 /* r4 = 6. */ + str r4, [r2] /* Program RNR = 6. */ + ldmia r1!, {r5,r6} /* Read third set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write third set of RBAR/RLAR registers. */ + movs r4, #7 /* r4 = 7. */ + str r4, [r2] /* Program RNR = 7. */ + ldmia r1!, {r5,r6} /* Read fourth set of RBAR/RLAR from TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + stmia r3!, {r5,r6} /* Write fourth set of RBAR/RLAR registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + movs r4, #1 /* r4 = 1. */ + orrs r3, r4 /* r3 = r3 | r4 i.e. Set the bit 0 in r3. */ + str r3, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + adds r0, r0, #28 /* Move to the high registers. */ + ldmia r0!, {r4-r7} /* Restore the high registers that are not automatically restored. */ + mov r8, r4 /* r8 = r4. */ + mov r9, r5 /* r9 = r5. */ + mov r10, r6 /* r10 = r6. */ + mov r11, r7 /* r11 = r7. */ + msr psp, r0 /* Remember the new top of stack for the task. */ + subs r0, r0, #44 /* Move to the starting of the saved context. */ + ldmia r0!, {r1-r7} /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r7 restored. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r2 /* Restore the CONTROL register value for the task. */ + bx r3 +#else /* configENABLE_MPU */ + adds r0, r0, #24 /* Move to the high registers. */ + ldmia r0!, {r4-r7} /* Restore the high registers that are not automatically restored. */ + mov r8, r4 /* r8 = r4. */ + mov r9, r5 /* r9 = r5. */ + mov r10, r6 /* r10 = r6. */ + mov r11, r7 /* r11 = r7. */ + msr psp, r0 /* Remember the new top of stack for the task. */ + subs r0, r0, #40 /* Move to the starting of the saved context. */ + ldmia r0!, {r2-r7} /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r7 restored. */ + msr psplim, r2 /* Restore the PSPLIM register value for the task. */ + bx r3 +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +SVC_Handler: + movs r0, #4 + mov r1, lr + tst r0, r1 + beq stacking_used_msp + mrs r0, psp + b vPortSVCHandler_C + stacking_used_msp: + mrs r0, msp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h new file mode 100644 index 0000000..f31bd3f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h @@ -0,0 +1,78 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M23" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) +#define portENABLE_INTERRUPTS() __asm volatile ( " cpsie i " ::: "memory" ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/port.c new file mode 100644 index 0000000..17eaa63 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/port.c @@ -0,0 +1,664 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM3 port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is + * defined. The value 255 should also ensure backward compatibility. + * FreeRTOS.org versions prior to V4.3.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the __disable_interrupt() + * call above. */ + __enable_interrupt(); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the __disable_interrupt() call above. */ + __enable_interrupt(); + __DSB(); + __ISB(); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __enable_interrupt(); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portasm.s new file mode 100644 index 0000000..b53183e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portasm.s @@ -0,0 +1,104 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + stmdb r0!, {r4-r11} /* Save the remaining registers. */ + str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp!, {r3, r14} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3, r14} + + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0!, {r4-r11} /* Pop the registers. */ + msr psp, r0 + isb + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + orr r14, r14, #13 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Call SVC to start the first task, ensuring interrupts are enabled. */ + cpsie i + cpsie f + dsb + isb + svc 0 + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portmacro.h new file mode 100644 index 0000000..9e4ada4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portmacro.h @@ -0,0 +1,208 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* IAR includes. */ + #include + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Compiler directives. */ + #define portWEAK_SYMBOL __attribute__( ( weak ) ) + +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() \ + { \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + } + + #define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.s new file mode 100644 index 0000000..2f0fb7e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.s @@ -0,0 +1,353 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN xSecureContext + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + EXTERN SecureContext_SaveContext + EXTERN SecureContext_LoadContext + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vPortAllocateSecureContext + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler + PUBLIC vPortFreeSecureContext +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vPortAllocateSecureContext: + svc 0 /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r3, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r3] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r3, #4 /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + ldr r4, [r3] /* r4 = *r3 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r2] /* Program RNR = 4. */ + adds r3, #4 /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r3!, {r4-r11} /* Read 4 set of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r4} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + ldr r5, =xSecureContext + str r1, [r5] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + msr control, r3 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r4 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r3} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + ldr r4, =xSecureContext + str r1, [r4] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r3 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + bic r0, r0, #1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, basepri /* r0 = basepri. Return original basepri value. */ + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr basepri, r0 /* basepri = ulMask. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +PendSV_Handler: + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + ldr r0, [r3] /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + mrs r2, psp /* Read PSP in r2. */ + + cbz r0, save_ns_context /* No secure context to save. */ + push {r0-r2, r14} + bl SecureContext_SaveContext /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r0-r3} /* LR is now in r3. */ + mov lr, r3 /* LR = r3. */ + lsls r1, r3, #25 /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl save_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ +#if ( configENABLE_MPU == 1 ) + subs r2, r2, #16 /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ +#else /* configENABLE_MPU */ + subs r2, r2, #12 /* Make space for xSecureContext, PSPLIM and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ +#endif /* configENABLE_MPU */ + b select_next_task + + save_ns_context: + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vstmdbeq r2!, {s16-s31} /* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + subs r2, r2, #48 /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #16 /* r2 = r2 + 16. */ + stm r2, {r4-r11} /* Store the registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + subs r2, r2, #16 /* r2 = r2 - 16. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + subs r2, r2, #44 /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #12 /* r2 = r2 + 12. */ + stm r2, {r4-r11} /* Store the registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + subs r2, r2, #12 /* r2 = r2 - 12. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + + select_next_task: + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bl vTaskSwitchContext + mov r0, #0 /* r0 = 0. */ + msr basepri, r0 /* Enable interrupts. */ + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + ldr r2, [r1] /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + + #if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r3] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r3, =0xe000edc0 /* r3 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r3] /* Program MAIR0. */ + ldr r3, =0xe000ed98 /* r3 = 0xe000ed98 [Location of RNR]. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r3] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r3!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r3] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + + #if ( configENABLE_MPU == 1 ) + ldmia r2!, {r0, r1, r3, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r3 /* Restore the CONTROL register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #else /* configENABLE_MPU */ + ldmia r2!, {r0, r1, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #endif /* configENABLE_MPU */ + + restore_ns_context: + ldmia r2!, {r4-r11} /* Restore the registers that are not automatically restored. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vldmiaeq r2!, {s16-s31} /* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr +/*-----------------------------------------------------------*/ + +SVC_Handler: + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + +vPortFreeSecureContext: + /* r0 = uint32_t *pulTCB. */ + ldr r2, [r0] /* The first item in the TCB is the top of the stack. */ + ldr r1, [r2] /* The first item on the stack is the task's xSecureContext. */ + cmp r1, #0 /* Raise svc if task's xSecureContext is not NULL. */ + it ne + svcne 1 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacro.h new file mode 100644 index 0000000..3575c1f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacro.h @@ -0,0 +1,78 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M33" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.c new file mode 100644 index 0000000..1996693 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.c @@ -0,0 +1,351 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 + +/** + * @brief Size of stack seal values in bytes. + */ +#define securecontextSTACK_SEAL_SIZE 8 + +/** + * @brief Stack seal value as recommended by ARM. + */ +#define securecontextSTACK_SEAL_VALUE 0xFEF5EDA5 + +/** + * @brief Maximum number of secure contexts. + */ +#ifndef secureconfigMAX_SECURE_CONTEXTS + #define secureconfigMAX_SECURE_CONTEXTS 8UL +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Pre-allocated array of secure contexts. + */ +SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ]; +/*-----------------------------------------------------------*/ + +/** + * @brief Get a free secure context for a task from the secure context pool (xSecureContexts). + * + * This function ensures that only one secure context is allocated for a task. + * + * @param[in] pvTaskHandle The task handle for which the secure context is allocated. + * + * @return Index of a free secure context in the xSecureContexts array. + */ +static uint32_t ulGetSecureContext( void * pvTaskHandle ); + +/** + * @brief Return the secure context to the secure context pool (xSecureContexts). + * + * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array. + */ +static void vReturnSecureContext( uint32_t ulSecureContextIndex ); + +/* These are implemented in assembly. */ +extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ); +extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ); +/*-----------------------------------------------------------*/ + +static uint32_t ulGetSecureContext( void * pvTaskHandle ) +{ + /* Start with invalid index. */ + uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) && + ( xSecureContexts[ i ].pucStackLimit == NULL ) && + ( xSecureContexts[ i ].pucStackStart == NULL ) && + ( xSecureContexts[ i ].pvTaskHandle == NULL ) && + ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = i; + } + else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle ) + { + /* A task can only have one secure context. Do not allocate a second + * context for the same task. */ + ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + break; + } + } + + return ulSecureContextIndex; +} +/*-----------------------------------------------------------*/ + +static void vReturnSecureContext( uint32_t ulSecureContextIndex ) +{ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL; + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR, i; + static uint32_t ulSecureContextsInitialized = 0; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) ) + { + /* Ensure to initialize secure contexts only once. */ + ulSecureContextsInitialized = 1; + + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + /* Initialize all secure contexts. */ + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + xSecureContexts[ i ].pucCurrentStackPointer = NULL; + xSecureContexts[ i ].pucStackLimit = NULL; + xSecureContexts[ i ].pucStackStart = NULL; + xSecureContexts[ i ].pvTaskHandle = NULL; + } + + #if ( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ) +#endif /* configENABLE_MPU */ +{ + uint8_t * pucStackMemory = NULL; + uint8_t * pucStackLimit; + uint32_t ulIPSR, ulSecureContextIndex; + SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID; + + #if ( configENABLE_MPU == 1 ) + uint32_t * pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit + * Register (PSPLIM) value. */ + secureportREAD_IPSR( ulIPSR ); + secureportREAD_PSPLIM( pucStackLimit ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. + * Also do nothing, if a secure context us already loaded. PSPLIM is set to + * securecontextNO_STACK when no secure context is loaded. */ + if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) ) + { + /* Ontain a free secure context. */ + ulSecureContextIndex = ulGetSecureContext( pvTaskHandle ); + + /* Were we able to get a free context? */ + if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte for stack (excluding the space for seal values) + * because the hardware decrements the stack pointer before + * writing i.e. if stack pointer is 0x2, a push operation will + * decrement the stack pointer to 0x1 and then write at 0x1. */ + xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize; + + /* Seal the created secure process stack. */ + *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE; + *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory; + + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle; + + #if ( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart; + pulCurrentStackPointer--; + + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart; + } + #endif /* configENABLE_MPU */ + + /* Ensure to never return 0 as a valid context handle. */ + xSecureContextHandle = ulSecureContextIndex + 1UL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint32_t ulIPSR, ulSecureContextIndex; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Only free if a valid context handle is passed. */ + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + /* Ensure that the secure context being deleted is associated with + * the task. */ + if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) + { + /* Free the stack space. */ + vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit ); + + /* Return the secure context back to the free secure contexts pool. */ + vReturnSecureContext( ulSecureContextIndex ); + } + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that no secure context is loaded and the task is loading it's + * own context. */ + if( ( pucStackLimit == securecontextNO_STACK ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that task's context is loaded and the task is saving it's own + * context. */ + if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.h new file mode 100644 index 0000000..de33d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no secure context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Invalid context ID. + */ +#define securecontextINVALID_CONTEXT_ID 0UL +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent a secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first address of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t * pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t * pucStackStart; /**< First location of the stack memory. */ + void * pvTaskHandle; /**< Task handle of the task this context is associated with. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Opaque handle for a secure context. + */ +typedef uint32_t SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if ( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s new file mode 100644 index 0000000..4e26cf9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s @@ -0,0 +1,86 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + SECTION .text:CODE:NOROOT(2) + THUMB + +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + PUBLIC SecureContext_LoadContextAsm + PUBLIC SecureContext_SaveContextAsm +/*-----------------------------------------------------------*/ + +SecureContext_LoadContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, load_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + ldmia r0!, {r1, r2} /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + +#if ( configENABLE_MPU == 1 ) + ldmia r1!, {r3} /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + msr control, r3 /* CONTROL = r3. */ +#endif /* configENABLE_MPU */ + + msr psplim, r2 /* PSPLIM = r2. */ + msr psp, r1 /* PSP = r1. */ + + load_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + +SecureContext_SaveContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, save_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + mrs r1, psp /* r1 = PSP. */ + +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + vstmdb r1!, {s0} /* Trigger the deferred stacking of FPU registers. */ + vldmia r1!, {s0} /* Nullify the effect of the previous statement. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ + +#if ( configENABLE_MPU == 1 ) + mrs r2, control /* r2 = CONTROL. */ + stmdb r1!, {r2} /* Store CONTROL value on the stack. */ +#endif /* configENABLE_MPU */ + + str r1, [r0] /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + movs r1, #0 /* r1 = securecontextNO_STACK. */ + msr psplim, r1 /* PSPLIM = securecontextNO_STACK. */ + msr psp, r1 /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + + save_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.c new file mode 100644 index 0000000..b3bf007 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.c @@ -0,0 +1,454 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#ifndef secureconfigTOTAL_HEAP_SIZE + #define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) +#endif + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */ + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.h new file mode 100644 index 0000000..e469f2c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void * pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void * pv ); + +/** + * @brief Get the free heap size. + * + * @return Free heap size. + */ +size_t xPortGetFreeHeapSize( void ); + +/** + * @brief Get the minimum ever free heap size. + * + * @return Minimum ever free heap size. + */ +size_t xPortGetMinimumEverFreeHeapSize( void ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.c new file mode 100644 index 0000000..f6570d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.c @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.h new file mode 100644 index 0000000..e89af71 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_port_macros.h new file mode 100644 index 0000000..2fb7c59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_port_macros.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) ) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Read the PSPLIM value in the given variable. + */ +#define secureportREAD_PSPLIM( pucOutStackLimit ) \ + __asm volatile ( "mrs %0, psplim" : "=r" ( pucOutStackLimit ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ; ; ) {; } \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s new file mode 100644 index 0000000..4d02a43 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s @@ -0,0 +1,262 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r3, [r1] /* r3 = *r1 i.e. r3 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r3, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r3, #4 /* r3 = 4. */ + str r3, [r2] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r3} /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + msr control, r2 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r3 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r2} /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r2 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + bic r0, r0, #1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, basepri /* r0 = basepri. Return original basepri value. */ + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr basepri, r0 /* basepri = ulMask. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +PendSV_Handler: + mrs r0, psp /* Read PSP in r0. */ +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vstmdbeq r0!, {s16-s31} /* Store the additional FP context registers which are not saved automatically. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ +#if ( configENABLE_MPU == 1 ) + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r2, control /* r2 = CONTROL. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmdb r0!, {r1-r11} /* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */ +#else /* configENABLE_MPU */ + mrs r2, psplim /* r2 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmdb r0!, {r2-r11} /* Store on the stack - PSPLIM, LR and registers that are not automatically. */ +#endif /* configENABLE_MPU */ + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + str r0, [r1] /* Save the new top of stack in TCB. */ + + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bl vTaskSwitchContext + mov r0, #0 /* r0 = 0. */ + msr basepri, r0 /* Enable interrupts. */ + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r3, [r1] /* r3 = *r1 i.e. r3 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r3, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r3, #4 /* r3 = 4. */ + str r3, [r2] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldmia r0!, {r1-r11} /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */ +#else /* configENABLE_MPU */ + ldmia r0!, {r2-r11} /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */ +#endif /* configENABLE_MPU */ + +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst r3, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vldmiaeq r0!, {s16-s31} /* Restore the additional FP context registers which are not restored automatically. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ + + #if ( configENABLE_MPU == 1 ) + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r2 /* Restore the CONTROL register value for the task. */ +#else /* configENABLE_MPU */ + msr psplim, r2 /* Restore the PSPLIM register value for the task. */ +#endif /* configENABLE_MPU */ + msr psp, r0 /* Remember the new top of stack for the task. */ + bx r3 +/*-----------------------------------------------------------*/ + +SVC_Handler: + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h new file mode 100644 index 0000000..3575c1f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h @@ -0,0 +1,78 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M33" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/port.c new file mode 100644 index 0000000..79bdf68 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/port.c @@ -0,0 +1,701 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __ARMVFP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 + * r0p1 port. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + * the r0p1 parts. r0p1 parts should use the port from the + * /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the __disable_interrupt() + * call above. */ + __enable_interrupt(); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the __disable_interrupt() call above. */ + __enable_interrupt(); + __DSB(); + __ISB(); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __enable_interrupt(); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portasm.s new file mode 100644 index 0000000..7ac74ff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portasm.s @@ -0,0 +1,150 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC vPortEnableVFP + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r0, r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + #endif + #endif + + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Clear the bit that indicates the FPU is in use in case the FPU was used + before the scheduler was started - which would otherwise result in the + unnecessary leaving of space in the SVC stack for lazy saving of FPU + registers. */ + mov r0, #0 + msr control, r0 + /* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc 0 + +/*-----------------------------------------------------------*/ + +vPortEnableVFP: + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..07779bb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portmacro.h @@ -0,0 +1,207 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* IAR includes. */ + #include + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Compiler directives. */ + #define portWEAK_SYMBOL __attribute__( ( weak ) ) + +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() \ + { \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + } + + #define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/port.c new file mode 100644 index 0000000..f6dae02 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/port.c @@ -0,0 +1,837 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F MPU port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#ifndef __ARMVFP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#else + +/* The way the SysTick is clocked is not modified in case it is not the same + * as the core. */ + #define portNVIC_SYSTICK_CLK_BIT ( 0 ) +#endif + +#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS + #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security." + #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SHPR2_REG ( *( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( *( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( *( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( *( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect Cortex-M7 r0p0 and r0p1 cores, and ensure + * that a work around is active for errata 837070. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION; + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ) PRIVILEGED_FUNCTION; + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * The C portion of the SVC handler. + */ +void vPortSVCHandler_C( uint32_t * pulParam ); + +/* + * Called from the SVC handler used to start the scheduler. + */ +extern void vPortRestoreContextOfFirstTask( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Exit from critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortExitCritical( void ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulParam ) +{ + uint8_t ucSVCNumber; + uint32_t ulPC; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first + * argument (r0) is pulParam[ 0 ]. */ + ulPC = pulParam[ portOFFSET_TO_PC ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER: + portNVIC_SHPR2_REG |= portNVIC_SVC_PRI; + vPortRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD: + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required + * but do ensure the code is completely + * within the specified behaviour for the + * architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); + + break; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the + * svc was raised from any of the + * system calls. */ + + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + } + + break; + #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + case portSVC_RAISE_PRIVILEGE: + __asm volatile + ( + " mrs r1, control \n"/* Obtain current control value. */ + " bic r1, r1, #1 \n"/* Set privilege bit. */ + " msr control, r1 \n"/* Write back new control value. */ + ::: "r1", "memory" + ); + break; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + default: /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* Errata 837070 workaround must only be enabled on Cortex-M7 r0p0 + * and r0p1 cores. */ + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + configASSERT( ( portCPUID == portCORTEX_M7_r0p1_ID ) || ( portCPUID == portCORTEX_M7_r0p0_ID ) ); + #else + /* When using this port on a Cortex-M7 r0p0 or r0p1 core, define + * configENABLE_ERRATA_837070_WORKAROUND to 1 in your + * FreeRTOSConfig.h. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + #endif + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } + } +#else + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +#endif +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + } +#else + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +#endif +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __FLASH_segment_start__[]; + extern uint32_t __FLASH_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the unprivileged flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged flash for privileged only access. This is where + * the kernel code is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + * is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + * system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ + uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + * ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + * into the the correct bit position of the attribute register. */ + return( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) +{ + extern uint32_t __SRAM_segment_start__[]; + extern uint32_t __SRAM_segment_end__[]; + extern uint32_t __privileged_data_start__[]; + extern uint32_t __privileged_data_end__[]; + int32_t lIndex; + uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate user configurable regions. */ + for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID ); + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that the + * stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + * xRegions into the CM4 specific MPU settings that are then + * stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( ul - 1UL ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID ); + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portasm.s new file mode 100644 index 0000000..a399bf5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portasm.s @@ -0,0 +1,264 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC vPortEnableVFP + PUBLIC vPortRestoreContextOfFirstTask + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + mrs r1, control + stmdb r0!, {r1, r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r0, r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + cpsid i /* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + msr basepri, r0 + dsb + isb + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + cpsie i /* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + /* Move onto the second item in the TCB... */ + add r1, r1, #4 + + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + bic r3, r3, #1 /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + str r3, [r2] /* Disable MPU. */ + + /* Region Base Address register. */ + ldr r2, =0xe000ed9c + /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + stmia r2, {r4-r11} + + #ifdef configTOTAL_MPU_REGIONS + #if ( configTOTAL_MPU_REGIONS == 16 ) + /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + stmia r2, {r4-r11} + /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + stmia r2, {r4-r11} + #endif /* configTOTAL_MPU_REGIONS == 16. */ + #endif /* configTOTAL_MPU_REGIONS */ + + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + orr r3, r3, #1 /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + str r3, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + + /* Pop the registers that are not automatically saved on exception entry. */ + ldmia r0!, {r3-r11, r14} + msr control, r3 + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + #else + mrs r0, psp + #endif + b vPortSVCHandler_C + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask: + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Clear the bit that indicates the FPU is in use in case the FPU was used + before the scheduler was started - which would otherwise result in the + unnecessary leaving of space in the SVC stack for lazy saving of FPU + registers. */ + mov r0, #0 + msr control, r0 + /* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc 0 + +/*-----------------------------------------------------------*/ + +vPortRestoreContextOfFirstTask: + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Restore the context. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + /* The first item in the TCB is the task top of stack. */ + ldr r0, [r1] + /* Move onto the second item in the TCB... */ + add r1, r1, #4 + + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + bic r3, r3, #1 /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + str r3, [r2] /* Disable MPU. */ + + /* Region Base Address register. */ + ldr r2, =0xe000ed9c + /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + stmia r2, {r4-r11} + + #ifdef configTOTAL_MPU_REGIONS + #if ( configTOTAL_MPU_REGIONS == 16 ) + /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + stmia r2, {r4-r11} + /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + ldmia r1!, {r4-r11} + /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + stmia r2, {r4-r11} + #endif /* configTOTAL_MPU_REGIONS == 16. */ + #endif /* configTOTAL_MPU_REGIONS */ + + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [r2] /* Read the value of MPU_CTRL. */ + orr r3, r3, #1 /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + str r3, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + + /* Pop the registers that are not automatically saved on exception entry. */ + ldmia r0!, {r3-r11, r14} + msr control, r3 + /* Restore the task stack pointer. */ + msr psp, r0 + mov r0, #0 + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortEnableVFP: + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portmacro.h new file mode 100644 index 0000000..cf02898 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portmacro.h @@ -0,0 +1,369 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* IAR includes. */ +#include + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif + +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +/* Location of the TEX,S,C,B bits in the MPU Region Attribute and Size + * Register (RASR). */ +#define portMPU_RASR_TEX_S_C_B_LOCATION ( 16UL ) +#define portMPU_RASR_TEX_S_C_B_MASK ( 0x3FUL ) + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* + * The TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits define the + * memory type, and where necessary the cacheable and shareable properties + * of the memory region. + * + * The TEX, C, and B bits together indicate the memory type of the region, + * and: + * - For Normal memory, the cacheable properties of the region. + * - For Device memory, whether the region is shareable. + * + * For Normal memory regions, the S bit indicates whether the region is + * shareable. For Strongly-ordered and Device memory, the S bit is ignored. + * + * See the following two tables for setting TEX, S, C and B bits for + * unprivileged flash, privileged flash and privileged RAM regions. + * + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | TEX | C | B | Memory type | Description or Normal region cacheability | Shareable? | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 0 | Strongly-ordered | Strongly ordered | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 1 | Device | Shared device | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 0 | Normal | Outer and inner write-through; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 1 | Normal | Outer and inner write-back; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 0 | Normal | Outer and inner Non-cacheable | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 0 | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 1 | Normal | Outer and inner write-back; write and read allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 0 | Device | Non-shared device | Not shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 1 | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 011 | X | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 1BB | A | A | Normal | Cached memory, with AA and BB indicating the inner and | Reserved | + | | | | | outer cacheability rules that must be exported on the | | + | | | | | bus. See the table below for the cacheability policy | | + | | | | | encoding. memory, BB=Outer policy, AA=Inner policy. | | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | + +-----------------------------------------+----------------------------------------+ + | AA or BB subfield of {TEX,C,B} encoding | Cacheability policy | + +-----------------------------------------+----------------------------------------+ + | 00 | Non-cacheable | + +-----------------------------------------+----------------------------------------+ + | 01 | Write-back, write and read allocate | + +-----------------------------------------+----------------------------------------+ + | 10 | Write-through, no write allocate | + +-----------------------------------------+----------------------------------------+ + | 11 | Write-back, no write allocate | + +-----------------------------------------+----------------------------------------+ + */ + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for flash + * region. */ +#ifndef configTEX_S_C_B_FLASH + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_FLASH ( 0x07UL ) +#endif + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for RAM + * region. */ +#ifndef configTEX_S_C_B_SRAM + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_SRAM ( 0x07UL ) +#endif + +#define portGENERAL_PERIPHERALS_REGION ( configTOTAL_MPU_REGIONS - 5UL ) +#define portSTACK_REGION ( configTOTAL_MPU_REGIONS - 4UL ) +#define portUNPRIVILEGED_FLASH_REGION ( configTOTAL_MPU_REGIONS - 3UL ) +#define portPRIVILEGED_FLASH_REGION ( configTOTAL_MPU_REGIONS - 2UL ) +#define portPRIVILEGED_RAM_REGION ( configTOTAL_MPU_REGIONS - 1UL ) +#define portFIRST_CONFIGURABLE_REGION ( 0UL ) +#define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 6UL ) +#define portNUM_CONFIGURABLE_REGIONS ( configTOTAL_MPU_REGIONS - 5UL ) +#define portTOTAL_NUM_REGIONS_IN_TCB ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus 1 to create space for the stack region. */ + +#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, r0, #1 \n msr control, r0 " ::: "r0", "memory" ) + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS_IN_TCB ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm volatile ( " SVC %0 \n"::"i" ( portSVC_YIELD ) : "memory" ) +#define portYIELD_WITHIN_API() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ + } + +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD_WITHIN_API(); } while( 0 ) +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#if( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + #define portDISABLE_INTERRUPTS() \ + { \ + __disable_interrupt(); \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + __enable_interrupt(); \ + } +#else + #define portDISABLE_INTERRUPTS() \ + { \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + } +#endif + +#define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) +#endif + +/*-----------------------------------------------------------*/ + +portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + + +/*-----------------------------------------------------------*/ + +extern BaseType_t xIsPrivileged( void ); +extern void vResetPrivilege( void ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +#define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + */ +#define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ +#define portRESET_PRIVILEGE() vResetPrivilege() +/*-----------------------------------------------------------*/ + +#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY + #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html" + #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0 +#endif +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Pe191 +#pragma diag_suppress=Pa082 +#pragma diag_suppress=Be006 +/*-----------------------------------------------------------*/ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.s new file mode 100644 index 0000000..2f0fb7e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.s @@ -0,0 +1,353 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN xSecureContext + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + EXTERN SecureContext_SaveContext + EXTERN SecureContext_LoadContext + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vPortAllocateSecureContext + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler + PUBLIC vPortFreeSecureContext +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vPortAllocateSecureContext: + svc 0 /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r3, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r3] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r3, #4 /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + ldr r4, [r3] /* r4 = *r3 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r2] /* Program RNR = 4. */ + adds r3, #4 /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r3!, {r4-r11} /* Read 4 set of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r4} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + ldr r5, =xSecureContext + str r1, [r5] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + msr control, r3 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r4 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r3} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + ldr r4, =xSecureContext + str r1, [r4] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r3 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + bic r0, r0, #1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, basepri /* r0 = basepri. Return original basepri value. */ + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr basepri, r0 /* basepri = ulMask. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +PendSV_Handler: + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + ldr r0, [r3] /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + mrs r2, psp /* Read PSP in r2. */ + + cbz r0, save_ns_context /* No secure context to save. */ + push {r0-r2, r14} + bl SecureContext_SaveContext /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r0-r3} /* LR is now in r3. */ + mov lr, r3 /* LR = r3. */ + lsls r1, r3, #25 /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl save_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ +#if ( configENABLE_MPU == 1 ) + subs r2, r2, #16 /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ +#else /* configENABLE_MPU */ + subs r2, r2, #12 /* Make space for xSecureContext, PSPLIM and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ +#endif /* configENABLE_MPU */ + b select_next_task + + save_ns_context: + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vstmdbeq r2!, {s16-s31} /* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + subs r2, r2, #48 /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #16 /* r2 = r2 + 16. */ + stm r2, {r4-r11} /* Store the registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + subs r2, r2, #16 /* r2 = r2 - 16. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + subs r2, r2, #44 /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #12 /* r2 = r2 + 12. */ + stm r2, {r4-r11} /* Store the registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + subs r2, r2, #12 /* r2 = r2 - 12. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + + select_next_task: + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bl vTaskSwitchContext + mov r0, #0 /* r0 = 0. */ + msr basepri, r0 /* Enable interrupts. */ + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + ldr r2, [r1] /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + + #if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r3] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r3, =0xe000edc0 /* r3 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r3] /* Program MAIR0. */ + ldr r3, =0xe000ed98 /* r3 = 0xe000ed98 [Location of RNR]. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r3] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r3!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r3] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + + #if ( configENABLE_MPU == 1 ) + ldmia r2!, {r0, r1, r3, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r3 /* Restore the CONTROL register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #else /* configENABLE_MPU */ + ldmia r2!, {r0, r1, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #endif /* configENABLE_MPU */ + + restore_ns_context: + ldmia r2!, {r4-r11} /* Restore the registers that are not automatically restored. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vldmiaeq r2!, {s16-s31} /* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr +/*-----------------------------------------------------------*/ + +SVC_Handler: + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + +vPortFreeSecureContext: + /* r0 = uint32_t *pulTCB. */ + ldr r2, [r0] /* The first item in the TCB is the top of the stack. */ + ldr r1, [r2] /* The first item on the stack is the task's xSecureContext. */ + cmp r1, #0 /* Raise svc if task's xSecureContext is not NULL. */ + it ne + svcne 1 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacro.h new file mode 100644 index 0000000..5384062 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacro.h @@ -0,0 +1,83 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M55" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.c new file mode 100644 index 0000000..1996693 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.c @@ -0,0 +1,351 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 + +/** + * @brief Size of stack seal values in bytes. + */ +#define securecontextSTACK_SEAL_SIZE 8 + +/** + * @brief Stack seal value as recommended by ARM. + */ +#define securecontextSTACK_SEAL_VALUE 0xFEF5EDA5 + +/** + * @brief Maximum number of secure contexts. + */ +#ifndef secureconfigMAX_SECURE_CONTEXTS + #define secureconfigMAX_SECURE_CONTEXTS 8UL +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Pre-allocated array of secure contexts. + */ +SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ]; +/*-----------------------------------------------------------*/ + +/** + * @brief Get a free secure context for a task from the secure context pool (xSecureContexts). + * + * This function ensures that only one secure context is allocated for a task. + * + * @param[in] pvTaskHandle The task handle for which the secure context is allocated. + * + * @return Index of a free secure context in the xSecureContexts array. + */ +static uint32_t ulGetSecureContext( void * pvTaskHandle ); + +/** + * @brief Return the secure context to the secure context pool (xSecureContexts). + * + * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array. + */ +static void vReturnSecureContext( uint32_t ulSecureContextIndex ); + +/* These are implemented in assembly. */ +extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ); +extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ); +/*-----------------------------------------------------------*/ + +static uint32_t ulGetSecureContext( void * pvTaskHandle ) +{ + /* Start with invalid index. */ + uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) && + ( xSecureContexts[ i ].pucStackLimit == NULL ) && + ( xSecureContexts[ i ].pucStackStart == NULL ) && + ( xSecureContexts[ i ].pvTaskHandle == NULL ) && + ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = i; + } + else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle ) + { + /* A task can only have one secure context. Do not allocate a second + * context for the same task. */ + ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + break; + } + } + + return ulSecureContextIndex; +} +/*-----------------------------------------------------------*/ + +static void vReturnSecureContext( uint32_t ulSecureContextIndex ) +{ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL; + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR, i; + static uint32_t ulSecureContextsInitialized = 0; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) ) + { + /* Ensure to initialize secure contexts only once. */ + ulSecureContextsInitialized = 1; + + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + /* Initialize all secure contexts. */ + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + xSecureContexts[ i ].pucCurrentStackPointer = NULL; + xSecureContexts[ i ].pucStackLimit = NULL; + xSecureContexts[ i ].pucStackStart = NULL; + xSecureContexts[ i ].pvTaskHandle = NULL; + } + + #if ( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ) +#endif /* configENABLE_MPU */ +{ + uint8_t * pucStackMemory = NULL; + uint8_t * pucStackLimit; + uint32_t ulIPSR, ulSecureContextIndex; + SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID; + + #if ( configENABLE_MPU == 1 ) + uint32_t * pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit + * Register (PSPLIM) value. */ + secureportREAD_IPSR( ulIPSR ); + secureportREAD_PSPLIM( pucStackLimit ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. + * Also do nothing, if a secure context us already loaded. PSPLIM is set to + * securecontextNO_STACK when no secure context is loaded. */ + if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) ) + { + /* Ontain a free secure context. */ + ulSecureContextIndex = ulGetSecureContext( pvTaskHandle ); + + /* Were we able to get a free context? */ + if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte for stack (excluding the space for seal values) + * because the hardware decrements the stack pointer before + * writing i.e. if stack pointer is 0x2, a push operation will + * decrement the stack pointer to 0x1 and then write at 0x1. */ + xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize; + + /* Seal the created secure process stack. */ + *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE; + *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory; + + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle; + + #if ( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart; + pulCurrentStackPointer--; + + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart; + } + #endif /* configENABLE_MPU */ + + /* Ensure to never return 0 as a valid context handle. */ + xSecureContextHandle = ulSecureContextIndex + 1UL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint32_t ulIPSR, ulSecureContextIndex; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Only free if a valid context handle is passed. */ + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + /* Ensure that the secure context being deleted is associated with + * the task. */ + if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) + { + /* Free the stack space. */ + vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit ); + + /* Return the secure context back to the free secure contexts pool. */ + vReturnSecureContext( ulSecureContextIndex ); + } + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that no secure context is loaded and the task is loading it's + * own context. */ + if( ( pucStackLimit == securecontextNO_STACK ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that task's context is loaded and the task is saving it's own + * context. */ + if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.h new file mode 100644 index 0000000..de33d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no secure context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Invalid context ID. + */ +#define securecontextINVALID_CONTEXT_ID 0UL +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent a secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first address of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t * pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t * pucStackStart; /**< First location of the stack memory. */ + void * pvTaskHandle; /**< Task handle of the task this context is associated with. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Opaque handle for a secure context. + */ +typedef uint32_t SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if ( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s new file mode 100644 index 0000000..4e26cf9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s @@ -0,0 +1,86 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + SECTION .text:CODE:NOROOT(2) + THUMB + +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + PUBLIC SecureContext_LoadContextAsm + PUBLIC SecureContext_SaveContextAsm +/*-----------------------------------------------------------*/ + +SecureContext_LoadContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, load_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + ldmia r0!, {r1, r2} /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + +#if ( configENABLE_MPU == 1 ) + ldmia r1!, {r3} /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + msr control, r3 /* CONTROL = r3. */ +#endif /* configENABLE_MPU */ + + msr psplim, r2 /* PSPLIM = r2. */ + msr psp, r1 /* PSP = r1. */ + + load_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + +SecureContext_SaveContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, save_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + mrs r1, psp /* r1 = PSP. */ + +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + vstmdb r1!, {s0} /* Trigger the deferred stacking of FPU registers. */ + vldmia r1!, {s0} /* Nullify the effect of the previous statement. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ + +#if ( configENABLE_MPU == 1 ) + mrs r2, control /* r2 = CONTROL. */ + stmdb r1!, {r2} /* Store CONTROL value on the stack. */ +#endif /* configENABLE_MPU */ + + str r1, [r0] /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + movs r1, #0 /* r1 = securecontextNO_STACK. */ + msr psplim, r1 /* PSPLIM = securecontextNO_STACK. */ + msr psp, r1 /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + + save_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.c new file mode 100644 index 0000000..b3bf007 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.c @@ -0,0 +1,454 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#ifndef secureconfigTOTAL_HEAP_SIZE + #define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) +#endif + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */ + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.h new file mode 100644 index 0000000..e469f2c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void * pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void * pv ); + +/** + * @brief Get the free heap size. + * + * @return Free heap size. + */ +size_t xPortGetFreeHeapSize( void ); + +/** + * @brief Get the minimum ever free heap size. + * + * @return Minimum ever free heap size. + */ +size_t xPortGetMinimumEverFreeHeapSize( void ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.c new file mode 100644 index 0000000..f6570d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.c @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.h new file mode 100644 index 0000000..e89af71 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_port_macros.h new file mode 100644 index 0000000..2fb7c59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_port_macros.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) ) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Read the PSPLIM value in the given variable. + */ +#define secureportREAD_PSPLIM( pucOutStackLimit ) \ + __asm volatile ( "mrs %0, psplim" : "=r" ( pucOutStackLimit ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ; ; ) {; } \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s new file mode 100644 index 0000000..4d02a43 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s @@ -0,0 +1,262 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r3, [r1] /* r3 = *r1 i.e. r3 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r3, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r3, #4 /* r3 = 4. */ + str r3, [r2] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r3} /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + msr control, r2 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r3 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r2} /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r2 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + bic r0, r0, #1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, basepri /* r0 = basepri. Return original basepri value. */ + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr basepri, r0 /* basepri = ulMask. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +PendSV_Handler: + mrs r0, psp /* Read PSP in r0. */ +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vstmdbeq r0!, {s16-s31} /* Store the additional FP context registers which are not saved automatically. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ +#if ( configENABLE_MPU == 1 ) + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r2, control /* r2 = CONTROL. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmdb r0!, {r1-r11} /* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */ +#else /* configENABLE_MPU */ + mrs r2, psplim /* r2 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmdb r0!, {r2-r11} /* Store on the stack - PSPLIM, LR and registers that are not automatically. */ +#endif /* configENABLE_MPU */ + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + str r0, [r1] /* Save the new top of stack in TCB. */ + + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bl vTaskSwitchContext + mov r0, #0 /* r0 = 0. */ + msr basepri, r0 /* Enable interrupts. */ + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r3, [r1] /* r3 = *r1 i.e. r3 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r3, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r3, #4 /* r3 = 4. */ + str r3, [r2] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldmia r0!, {r1-r11} /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */ +#else /* configENABLE_MPU */ + ldmia r0!, {r2-r11} /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */ +#endif /* configENABLE_MPU */ + +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst r3, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vldmiaeq r0!, {s16-s31} /* Restore the additional FP context registers which are not restored automatically. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ + + #if ( configENABLE_MPU == 1 ) + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r2 /* Restore the CONTROL register value for the task. */ +#else /* configENABLE_MPU */ + msr psplim, r2 /* Restore the PSPLIM register value for the task. */ +#endif /* configENABLE_MPU */ + msr psp, r0 /* Remember the new top of stack for the task. */ + bx r3 +/*-----------------------------------------------------------*/ + +SVC_Handler: + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h new file mode 100644 index 0000000..5384062 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h @@ -0,0 +1,83 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M55" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/ReadMe.txt new file mode 100644 index 0000000..5ecbe81 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/ReadMe.txt @@ -0,0 +1,18 @@ +There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers. +The best option depends on the revision of the ARM Cortex-M7 core in use. The +revision is specified by an 'r' number, and a 'p' number, so will look something +like 'r0p1'. Check the documentation for the microcontroller in use to find the +revision of the Cortex-M7 core used in that microcontroller. If in doubt, use +the FreeRTOS port provided specifically for r0p1 revisions, as that can be used +with all core revisions. + +The first option is to use the ARM Cortex-M4F port, and the second option is to +use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround. + +If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be +used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in +the /FreeRTOS/Source/portable/IAR/ARM_CM4F directory. + +If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM +Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/IAR/ARM_CM7/r0p1 +directory. \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/port.c new file mode 100644 index 0000000..d360131 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/port.c @@ -0,0 +1,689 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM7 port. +*----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __ARMVFP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known. */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the __disable_interrupt() + * call above. */ + __enable_interrupt(); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the __disable_interrupt() call above. */ + __enable_interrupt(); + __DSB(); + __ISB(); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_interrupt(); + __DSB(); + __ISB(); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __enable_interrupt(); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portasm.s new file mode 100644 index 0000000..521d8b4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portasm.s @@ -0,0 +1,152 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC vPortEnableVFP + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r0, r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + cpsid i + msr basepri, r0 + dsb + isb + cpsie i + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + #endif + #endif + + bx r14 + + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Clear the bit that indicates the FPU is in use in case the FPU was used + before the scheduler was started - which would otherwise result in the + unnecessary leaving of space in the SVC stack for lazy saving of FPU + registers. */ + mov r0, #0 + msr control, r0 + /* Call SVC to start the first task. */ + cpsie i + cpsie f + dsb + isb + svc 0 + +/*-----------------------------------------------------------*/ + +vPortEnableVFP: + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portmacro.h new file mode 100644 index 0000000..db95f29 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portmacro.h @@ -0,0 +1,210 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* IAR includes. */ + #include + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Compiler directives. */ + #define portWEAK_SYMBOL __attribute__( ( weak ) ) + +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + __DSB(); \ + __ISB(); \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( ( uint32_t ) __CLZ( ( uxReadyPriorities ) ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() \ + { \ + /* Errata work around. */ \ + __disable_interrupt(); \ + __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ); \ + __DSB(); \ + __ISB(); \ + __enable_interrupt(); \ + } + + #define portENABLE_INTERRUPTS() __set_BASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() __get_BASEPRI(); portDISABLE_INTERRUPTS() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) __set_BASEPRI( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + +/*-----------------------------------------------------------*/ + + portFORCE_INLINE static BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ + #pragma diag_suppress=Pe191 + #pragma diag_suppress=Pa082 + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.s new file mode 100644 index 0000000..2f0fb7e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.s @@ -0,0 +1,353 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN xSecureContext + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + EXTERN SecureContext_SaveContext + EXTERN SecureContext_LoadContext + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vPortAllocateSecureContext + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler + PUBLIC vPortFreeSecureContext +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vPortAllocateSecureContext: + svc 0 /* Secure context is allocated in the supervisor call. portSVC_ALLOCATE_SECURE_CONTEXT = 0. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r3, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r3] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r3, #4 /* r3 = r3 + 4. r3 now points to MAIR0 in TCB. */ + ldr r4, [r3] /* r4 = *r3 i.e. r4 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r2] /* Program RNR = 4. */ + adds r3, #4 /* r3 = r3 + 4. r3 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r3!, {r4-r11} /* Read 4 set of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r4} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM, r3 = CONTROL and r4 = EXC_RETURN. */ + ldr r5, =xSecureContext + str r1, [r5] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + msr control, r3 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r4 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r3} /* Read from stack - r1 = xSecureContext, r2 = PSPLIM and r3 = EXC_RETURN. */ + ldr r4, =xSecureContext + str r1, [r4] /* Set xSecureContext to this task's value for the same. */ + msr psplim, r2 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r3 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + bic r0, r0, #1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, basepri /* r0 = basepri. Return original basepri value. */ + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr basepri, r0 /* basepri = ulMask. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +PendSV_Handler: + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + ldr r0, [r3] /* Read xSecureContext - Value of xSecureContext must be in r0 as it is used as a parameter later. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB - Value of pxCurrentTCB must be in r1 as it is used as a parameter later. */ + mrs r2, psp /* Read PSP in r2. */ + + cbz r0, save_ns_context /* No secure context to save. */ + push {r0-r2, r14} + bl SecureContext_SaveContext /* Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r0-r3} /* LR is now in r3. */ + mov lr, r3 /* LR = r3. */ + lsls r1, r3, #25 /* r1 = r3 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl save_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ +#if ( configENABLE_MPU == 1 ) + subs r2, r2, #16 /* Make space for xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ +#else /* configENABLE_MPU */ + subs r2, r2, #12 /* Make space for xSecureContext, PSPLIM and LR on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ +#endif /* configENABLE_MPU */ + b select_next_task + + save_ns_context: + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vstmdbeq r2!, {s16-s31} /* Store the additional FP context registers which are not saved automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + #if ( configENABLE_MPU == 1 ) + subs r2, r2, #48 /* Make space for xSecureContext, PSPLIM, CONTROL, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #16 /* r2 = r2 + 16. */ + stm r2, {r4-r11} /* Store the registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r3, control /* r3 = CONTROL. */ + mov r4, lr /* r4 = LR/EXC_RETURN. */ + subs r2, r2, #16 /* r2 = r2 - 16. */ + stmia r2!, {r0, r1, r3, r4} /* Store xSecureContext, PSPLIM, CONTROL and LR on the stack. */ + #else /* configENABLE_MPU */ + subs r2, r2, #44 /* Make space for xSecureContext, PSPLIM, LR and the remaining registers on the stack. */ + str r2, [r1] /* Save the new top of stack in TCB. */ + adds r2, r2, #12 /* r2 = r2 + 12. */ + stm r2, {r4-r11} /* Store the registers that are not saved automatically. */ + mrs r1, psplim /* r1 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + subs r2, r2, #12 /* r2 = r2 - 12. */ + stmia r2!, {r0, r1, r3} /* Store xSecureContext, PSPLIM and LR on the stack. */ + #endif /* configENABLE_MPU */ + + select_next_task: + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bl vTaskSwitchContext + mov r0, #0 /* r0 = 0. */ + msr basepri, r0 /* Enable interrupts. */ + + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + ldr r2, [r1] /* The first item in pxCurrentTCB is the task top of stack. r2 now points to the top of stack. */ + + #if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r3] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r4, [r1] /* r4 = *r1 i.e. r4 = MAIR0. */ + ldr r3, =0xe000edc0 /* r3 = 0xe000edc0 [Location of MAIR0]. */ + str r4, [r3] /* Program MAIR0. */ + ldr r3, =0xe000ed98 /* r3 = 0xe000ed98 [Location of RNR]. */ + movs r4, #4 /* r4 = 4. */ + str r4, [r3] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r3, =0xe000ed9c /* r3 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r3!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r3, =0xe000ed94 /* r3 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r3] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r3] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + #endif /* configENABLE_MPU */ + + #if ( configENABLE_MPU == 1 ) + ldmia r2!, {r0, r1, r3, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM, r3 = CONTROL and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r3 /* Restore the CONTROL register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #else /* configENABLE_MPU */ + ldmia r2!, {r0, r1, r4} /* Read from stack - r0 = xSecureContext, r1 = PSPLIM and r4 = LR. */ + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + mov lr, r4 /* LR = r4. */ + ldr r3, =xSecureContext /* Read the location of xSecureContext i.e. &( xSecureContext ). */ + str r0, [r3] /* Restore the task's xSecureContext. */ + cbz r0, restore_ns_context /* If there is no secure context for the task, restore the non-secure context. */ + ldr r3, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r3] /* Read pxCurrentTCB. */ + push {r2, r4} + bl SecureContext_LoadContext /* Restore the secure context. Params are in r0 and r1. r0 = xSecureContext and r1 = pxCurrentTCB. */ + pop {r2, r4} + mov lr, r4 /* LR = r4. */ + lsls r1, r4, #25 /* r1 = r4 << 25. Bit[6] of EXC_RETURN is 1 if secure stack was used, 0 if non-secure stack was used to store stack frame. */ + bpl restore_ns_context /* bpl - branch if positive or zero. If r1 >= 0 ==> Bit[6] in EXC_RETURN is 0 i.e. non-secure stack was used. */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr + #endif /* configENABLE_MPU */ + + restore_ns_context: + ldmia r2!, {r4-r11} /* Restore the registers that are not automatically restored. */ + #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vldmiaeq r2!, {s16-s31} /* Restore the additional FP context registers which are not restored automatically. */ + #endif /* configENABLE_FPU || configENABLE_MVE */ + msr psp, r2 /* Remember the new top of stack for the task. */ + bx lr +/*-----------------------------------------------------------*/ + +SVC_Handler: + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + +vPortFreeSecureContext: + /* r0 = uint32_t *pulTCB. */ + ldr r2, [r0] /* The first item in the TCB is the top of the stack. */ + ldr r1, [r2] /* The first item on the stack is the task's xSecureContext. */ + cmp r1, #0 /* Raise svc if task's xSecureContext is not NULL. */ + it ne + svcne 1 /* Secure context is freed in the supervisor call. portSVC_FREE_SECURE_CONTEXT = 1. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacro.h new file mode 100644 index 0000000..c1e5550 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacro.h @@ -0,0 +1,83 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M85" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.c new file mode 100644 index 0000000..1996693 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.c @@ -0,0 +1,351 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Secure context includes. */ +#include "secure_context.h" + +/* Secure heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief CONTROL value for privileged tasks. + * + * Bit[0] - 0 --> Thread mode is privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_PRIVILEGED 0x02 + +/** + * @brief CONTROL value for un-privileged tasks. + * + * Bit[0] - 1 --> Thread mode is un-privileged. + * Bit[1] - 1 --> Thread mode uses PSP. + */ +#define securecontextCONTROL_VALUE_UNPRIVILEGED 0x03 + +/** + * @brief Size of stack seal values in bytes. + */ +#define securecontextSTACK_SEAL_SIZE 8 + +/** + * @brief Stack seal value as recommended by ARM. + */ +#define securecontextSTACK_SEAL_VALUE 0xFEF5EDA5 + +/** + * @brief Maximum number of secure contexts. + */ +#ifndef secureconfigMAX_SECURE_CONTEXTS + #define secureconfigMAX_SECURE_CONTEXTS 8UL +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Pre-allocated array of secure contexts. + */ +SecureContext_t xSecureContexts[ secureconfigMAX_SECURE_CONTEXTS ]; +/*-----------------------------------------------------------*/ + +/** + * @brief Get a free secure context for a task from the secure context pool (xSecureContexts). + * + * This function ensures that only one secure context is allocated for a task. + * + * @param[in] pvTaskHandle The task handle for which the secure context is allocated. + * + * @return Index of a free secure context in the xSecureContexts array. + */ +static uint32_t ulGetSecureContext( void * pvTaskHandle ); + +/** + * @brief Return the secure context to the secure context pool (xSecureContexts). + * + * @param[in] ulSecureContextIndex Index of the context in the xSecureContexts array. + */ +static void vReturnSecureContext( uint32_t ulSecureContextIndex ); + +/* These are implemented in assembly. */ +extern void SecureContext_LoadContextAsm( SecureContext_t * pxSecureContext ); +extern void SecureContext_SaveContextAsm( SecureContext_t * pxSecureContext ); +/*-----------------------------------------------------------*/ + +static uint32_t ulGetSecureContext( void * pvTaskHandle ) +{ + /* Start with invalid index. */ + uint32_t i, ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + if( ( xSecureContexts[ i ].pucCurrentStackPointer == NULL ) && + ( xSecureContexts[ i ].pucStackLimit == NULL ) && + ( xSecureContexts[ i ].pucStackStart == NULL ) && + ( xSecureContexts[ i ].pvTaskHandle == NULL ) && + ( ulSecureContextIndex == secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = i; + } + else if( xSecureContexts[ i ].pvTaskHandle == pvTaskHandle ) + { + /* A task can only have one secure context. Do not allocate a second + * context for the same task. */ + ulSecureContextIndex = secureconfigMAX_SECURE_CONTEXTS; + break; + } + } + + return ulSecureContextIndex; +} +/*-----------------------------------------------------------*/ + +static void vReturnSecureContext( uint32_t ulSecureContextIndex ) +{ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = NULL; + xSecureContexts[ ulSecureContextIndex ].pucStackStart = NULL; + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = NULL; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_Init( void ) +{ + uint32_t ulIPSR, i; + static uint32_t ulSecureContextsInitialized = 0; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ( ulIPSR != 0 ) && ( ulSecureContextsInitialized == 0 ) ) + { + /* Ensure to initialize secure contexts only once. */ + ulSecureContextsInitialized = 1; + + /* No stack for thread mode until a task's context is loaded. */ + secureportSET_PSPLIM( securecontextNO_STACK ); + secureportSET_PSP( securecontextNO_STACK ); + + /* Initialize all secure contexts. */ + for( i = 0; i < secureconfigMAX_SECURE_CONTEXTS; i++ ) + { + xSecureContexts[ i ].pucCurrentStackPointer = NULL; + xSecureContexts[ i ].pucStackLimit = NULL; + xSecureContexts[ i ].pucStackStart = NULL; + xSecureContexts[ i ].pvTaskHandle = NULL; + } + + #if ( configENABLE_MPU == 1 ) + { + /* Configure thread mode to use PSP and to be unprivileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_UNPRIVILEGED ); + } + #else /* configENABLE_MPU */ + { + /* Configure thread mode to use PSP and to be privileged. */ + secureportSET_CONTROL( securecontextCONTROL_VALUE_PRIVILEGED ); + } + #endif /* configENABLE_MPU */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ) +#else /* configENABLE_MPU */ + secureportNON_SECURE_CALLABLE SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ) +#endif /* configENABLE_MPU */ +{ + uint8_t * pucStackMemory = NULL; + uint8_t * pucStackLimit; + uint32_t ulIPSR, ulSecureContextIndex; + SecureContextHandle_t xSecureContextHandle = securecontextINVALID_CONTEXT_ID; + + #if ( configENABLE_MPU == 1 ) + uint32_t * pulCurrentStackPointer = NULL; + #endif /* configENABLE_MPU */ + + /* Read the Interrupt Program Status Register (IPSR) and Process Stack Limit + * Register (PSPLIM) value. */ + secureportREAD_IPSR( ulIPSR ); + secureportREAD_PSPLIM( pucStackLimit ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. + * Also do nothing, if a secure context us already loaded. PSPLIM is set to + * securecontextNO_STACK when no secure context is loaded. */ + if( ( ulIPSR != 0 ) && ( pucStackLimit == securecontextNO_STACK ) ) + { + /* Ontain a free secure context. */ + ulSecureContextIndex = ulGetSecureContext( pvTaskHandle ); + + /* Were we able to get a free context? */ + if( ulSecureContextIndex < secureconfigMAX_SECURE_CONTEXTS ) + { + /* Allocate the stack space. */ + pucStackMemory = pvPortMalloc( ulSecureStackSize + securecontextSTACK_SEAL_SIZE ); + + if( pucStackMemory != NULL ) + { + /* Since stack grows down, the starting point will be the last + * location. Note that this location is next to the last + * allocated byte for stack (excluding the space for seal values) + * because the hardware decrements the stack pointer before + * writing i.e. if stack pointer is 0x2, a push operation will + * decrement the stack pointer to 0x1 and then write at 0x1. */ + xSecureContexts[ ulSecureContextIndex ].pucStackStart = pucStackMemory + ulSecureStackSize; + + /* Seal the created secure process stack. */ + *( uint32_t * )( pucStackMemory + ulSecureStackSize ) = securecontextSTACK_SEAL_VALUE; + *( uint32_t * )( pucStackMemory + ulSecureStackSize + 4 ) = securecontextSTACK_SEAL_VALUE; + + /* The stack cannot go beyond this location. This value is + * programmed in the PSPLIM register on context switch.*/ + xSecureContexts[ ulSecureContextIndex ].pucStackLimit = pucStackMemory; + + xSecureContexts[ ulSecureContextIndex ].pvTaskHandle = pvTaskHandle; + + #if ( configENABLE_MPU == 1 ) + { + /* Store the correct CONTROL value for the task on the stack. + * This value is programmed in the CONTROL register on + * context switch. */ + pulCurrentStackPointer = ( uint32_t * ) xSecureContexts[ ulSecureContextIndex ].pucStackStart; + pulCurrentStackPointer--; + + if( ulIsTaskPrivileged ) + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_PRIVILEGED; + } + else + { + *( pulCurrentStackPointer ) = securecontextCONTROL_VALUE_UNPRIVILEGED; + } + + /* Store the current stack pointer. This value is programmed in + * the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = ( uint8_t * ) pulCurrentStackPointer; + } + #else /* configENABLE_MPU */ + { + /* Current SP is set to the starting of the stack. This + * value programmed in the PSP register on context switch. */ + xSecureContexts[ ulSecureContextIndex ].pucCurrentStackPointer = xSecureContexts[ ulSecureContextIndex ].pucStackStart; + } + #endif /* configENABLE_MPU */ + + /* Ensure to never return 0 as a valid context handle. */ + xSecureContextHandle = ulSecureContextIndex + 1UL; + } + } + } + + return xSecureContextHandle; +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint32_t ulIPSR, ulSecureContextIndex; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* Only free if a valid context handle is passed. */ + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + /* Ensure that the secure context being deleted is associated with + * the task. */ + if( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) + { + /* Free the stack space. */ + vPortFree( xSecureContexts[ ulSecureContextIndex ].pucStackLimit ); + + /* Return the secure context back to the free secure contexts pool. */ + vReturnSecureContext( ulSecureContextIndex ); + } + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that no secure context is loaded and the task is loading it's + * own context. */ + if( ( pucStackLimit == securecontextNO_STACK ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_LoadContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ) +{ + uint8_t * pucStackLimit; + uint32_t ulSecureContextIndex; + + if( ( xSecureContextHandle > 0UL ) && ( xSecureContextHandle <= secureconfigMAX_SECURE_CONTEXTS ) ) + { + ulSecureContextIndex = xSecureContextHandle - 1UL; + + secureportREAD_PSPLIM( pucStackLimit ); + + /* Ensure that task's context is loaded and the task is saving it's own + * context. */ + if( ( xSecureContexts[ ulSecureContextIndex ].pucStackLimit == pucStackLimit ) && + ( xSecureContexts[ ulSecureContextIndex ].pvTaskHandle == pvTaskHandle ) ) + { + SecureContext_SaveContextAsm( &( xSecureContexts[ ulSecureContextIndex ] ) ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.h new file mode 100644 index 0000000..de33d15 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_CONTEXT_H__ +#define __SECURE_CONTEXT_H__ + +/* Standard includes. */ +#include + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" + +/** + * @brief PSP value when no secure context is loaded. + */ +#define securecontextNO_STACK 0x0 + +/** + * @brief Invalid context ID. + */ +#define securecontextINVALID_CONTEXT_ID 0UL +/*-----------------------------------------------------------*/ + +/** + * @brief Structure to represent a secure context. + * + * @note Since stack grows down, pucStackStart is the highest address while + * pucStackLimit is the first address of the allocated memory. + */ +typedef struct SecureContext +{ + uint8_t * pucCurrentStackPointer; /**< Current value of stack pointer (PSP). */ + uint8_t * pucStackLimit; /**< Last location of the stack memory (PSPLIM). */ + uint8_t * pucStackStart; /**< First location of the stack memory. */ + void * pvTaskHandle; /**< Task handle of the task this context is associated with. */ +} SecureContext_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Opaque handle for a secure context. + */ +typedef uint32_t SecureContextHandle_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Initializes the secure context management system. + * + * PSP is set to NULL and therefore a task must allocate and load a context + * before calling any secure side function in the thread mode. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureContext_Init( void ); + +/** + * @brief Allocates a context on the secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] ulSecureStackSize Size of the stack to allocate on secure side. + * @param[in] ulIsTaskPrivileged 1 if the calling task is privileged, 0 otherwise. + * + * @return Opaque context handle if context is successfully allocated, NULL + * otherwise. + */ +#if ( configENABLE_MPU == 1 ) + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + uint32_t ulIsTaskPrivileged, + void * pvTaskHandle ); +#else /* configENABLE_MPU */ + SecureContextHandle_t SecureContext_AllocateContext( uint32_t ulSecureStackSize, + void * pvTaskHandle ); +#endif /* configENABLE_MPU */ + +/** + * @brief Frees the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the + * context to be freed. + */ +void SecureContext_FreeContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Loads the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be loaded. + */ +void SecureContext_LoadContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +/** + * @brief Saves the given context. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + * + * @param[in] xSecureContextHandle Context handle corresponding to the context + * to be saved. + */ +void SecureContext_SaveContext( SecureContextHandle_t xSecureContextHandle, void * pvTaskHandle ); + +#endif /* __SECURE_CONTEXT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s new file mode 100644 index 0000000..4e26cf9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s @@ -0,0 +1,86 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + SECTION .text:CODE:NOROOT(2) + THUMB + +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + PUBLIC SecureContext_LoadContextAsm + PUBLIC SecureContext_SaveContextAsm +/*-----------------------------------------------------------*/ + +SecureContext_LoadContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, load_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + ldmia r0!, {r1, r2} /* r1 = pxSecureContext->pucCurrentStackPointer, r2 = pxSecureContext->pucStackLimit. */ + +#if ( configENABLE_MPU == 1 ) + ldmia r1!, {r3} /* Read CONTROL register value from task's stack. r3 = CONTROL. */ + msr control, r3 /* CONTROL = r3. */ +#endif /* configENABLE_MPU */ + + msr psplim, r2 /* PSPLIM = r2. */ + msr psp, r1 /* PSP = r1. */ + + load_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + +SecureContext_SaveContextAsm: + /* pxSecureContext value is in r0. */ + mrs r1, ipsr /* r1 = IPSR. */ + cbz r1, save_ctx_therad_mode /* Do nothing if the processor is running in the Thread Mode. */ + mrs r1, psp /* r1 = PSP. */ + +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + vstmdb r1!, {s0} /* Trigger the deferred stacking of FPU registers. */ + vldmia r1!, {s0} /* Nullify the effect of the previous statement. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ + +#if ( configENABLE_MPU == 1 ) + mrs r2, control /* r2 = CONTROL. */ + stmdb r1!, {r2} /* Store CONTROL value on the stack. */ +#endif /* configENABLE_MPU */ + + str r1, [r0] /* Save the top of stack in context. pxSecureContext->pucCurrentStackPointer = r1. */ + movs r1, #0 /* r1 = securecontextNO_STACK. */ + msr psplim, r1 /* PSPLIM = securecontextNO_STACK. */ + msr psp, r1 /* PSP = securecontextNO_STACK i.e. No stack for thread mode until next task's context is loaded. */ + + save_ctx_therad_mode: + bx lr +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.c new file mode 100644 index 0000000..b3bf007 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.c @@ -0,0 +1,454 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure context heap includes. */ +#include "secure_heap.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Total heap size. + */ +#ifndef secureconfigTOTAL_HEAP_SIZE + #define secureconfigTOTAL_HEAP_SIZE ( ( ( size_t ) ( 10 * 1024 ) ) ) +#endif + +/* No test marker by default. */ +#ifndef mtCOVERAGE_TEST_MARKER + #define mtCOVERAGE_TEST_MARKER() +#endif + +/* No tracing by default. */ +#ifndef traceMALLOC + #define traceMALLOC( pvReturn, xWantedSize ) +#endif + +/* No tracing by default. */ +#ifndef traceFREE + #define traceFREE( pv, xBlockSize ) +#endif + +/* Block sizes must not get too small. */ +#define secureheapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define secureheapBITS_PER_BYTE ( ( size_t ) 8 ) +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#else /* configAPPLICATION_ALLOCATED_HEAP */ + static uint8_t ucHeap[ secureconfigTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/** + * @brief The linked list structure. + * + * This is used to link free blocks in order of their memory address. + */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */ + size_t xBlockSize; /**< The size of the free block. */ +} BlockLink_t; +/*-----------------------------------------------------------*/ + +/** + * @brief Called automatically to setup the required heap structures the first + * time pvPortMalloc() is called. + */ +static void prvHeapInit( void ); + +/** + * @brief Inserts a block of memory that is being freed into the correct + * position in the list of free memory blocks. + * + * The block being freed will be merged with the block in front it and/or the + * block behind it if the memory blocks are adjacent to each other. + * + * @param[in] pxBlockToInsert The block being freed. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); +/*-----------------------------------------------------------*/ + +/** + * @brief The size of the structure placed at the beginning of each allocated + * memory block must by correctly byte aligned. + */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( secureportBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + +/** + * @brief Create a couple of list links to mark the start and end of the list. + */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/** + * @brief Keeps track of the number of free bytes remaining, but says nothing + * about fragmentation. + */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; + +/** + * @brief Gets set to the top bit of an size_t type. + * + * When this bit in the xBlockSize member of an BlockLink_t structure is set + * then the block belongs to the application. When the bit is free the block is + * still part of the free heap space. + */ +static size_t xBlockAllocatedBit = 0; +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + size_t uxAddress; + size_t xTotalHeapSize = secureconfigTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( size_t ) ucHeap; + + if( ( uxAddress & secureportBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( secureportBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( size_t ) secureportBYTE_ALIGNMENT_MASK ); + pxEnd = ( void * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + + /* Work out the position of the top bit in a size_t variable. */ + xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * secureheapBITS_PER_BYTE ) - 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the requested block size is not so large that the top bit is set. + * The top bit of the block size member of the BlockLink_t structure is used + * to determine who owns the block - the application or the kernel, so it + * must be free. */ + if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) + { + /* The wanted size is increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += xHeapStructSize; + + /* Ensure that blocks are always aligned to the required number of + * bytes. */ + if( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) != 0x00 ) + { + /* Byte alignment required. */ + xWantedSize += ( secureportBYTE_ALIGNMENT - ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) ); + secureportASSERT( ( xWantedSize & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size was + * not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > secureheapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + secureportASSERT( ( ( ( size_t ) pxNewBlockLink ) & secureportBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned by + * the application and has no "next" block. */ + pxBlock->xBlockSize |= xBlockAllocatedBit; + pxBlock->pxNextFreeBlock = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + + #if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( secureconfigUSE_MALLOC_FAILED_HOOK == 1 ) */ + + secureportASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) secureportBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + /* Check the block is actually allocated. */ + secureportASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); + secureportASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + pxLink->xBlockSize &= ~xBlockAllocatedBit; + + secureportDISABLE_NON_SECURE_INTERRUPTS(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + } + secureportENABLE_NON_SECURE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.h new file mode 100644 index 0000000..e469f2c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.h @@ -0,0 +1,66 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_HEAP_H__ +#define __SECURE_HEAP_H__ + +/* Standard includes. */ +#include + +/** + * @brief Allocates memory from heap. + * + * @param[in] xWantedSize The size of the memory to be allocated. + * + * @return Pointer to the memory region if the allocation is successful, NULL + * otherwise. + */ +void * pvPortMalloc( size_t xWantedSize ); + +/** + * @brief Frees the previously allocated memory. + * + * @param[in] pv Pointer to the memory to be freed. + */ +void vPortFree( void * pv ); + +/** + * @brief Get the free heap size. + * + * @return Free heap size. + */ +size_t xPortGetFreeHeapSize( void ); + +/** + * @brief Get the minimum ever free heap size. + * + * @return Minimum ever free heap size. + */ +size_t xPortGetMinimumEverFreeHeapSize( void ); + +#endif /* __SECURE_HEAP_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.c new file mode 100644 index 0000000..f6570d8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.c @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Secure init includes. */ +#include "secure_init.h" + +/* Secure port macros. */ +#include "secure_port_macros.h" + +/** + * @brief Constants required to manipulate the SCB. + */ +#define secureinitSCB_AIRCR ( ( volatile uint32_t * ) 0xe000ed0c ) /* Application Interrupt and Reset Control Register. */ +#define secureinitSCB_AIRCR_VECTKEY_POS ( 16UL ) +#define secureinitSCB_AIRCR_VECTKEY_MASK ( 0xFFFFUL << secureinitSCB_AIRCR_VECTKEY_POS ) +#define secureinitSCB_AIRCR_PRIS_POS ( 14UL ) +#define secureinitSCB_AIRCR_PRIS_MASK ( 1UL << secureinitSCB_AIRCR_PRIS_POS ) + +/** + * @brief Constants required to manipulate the FPU. + */ +#define secureinitFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define secureinitFPCCR_LSPENS_POS ( 29UL ) +#define secureinitFPCCR_LSPENS_MASK ( 1UL << secureinitFPCCR_LSPENS_POS ) +#define secureinitFPCCR_TS_POS ( 26UL ) +#define secureinitFPCCR_TS_MASK ( 1UL << secureinitFPCCR_TS_POS ) + +#define secureinitNSACR ( ( volatile uint32_t * ) 0xe000ed8c ) /* Non-secure Access Control Register. */ +#define secureinitNSACR_CP10_POS ( 10UL ) +#define secureinitNSACR_CP10_MASK ( 1UL << secureinitNSACR_CP10_POS ) +#define secureinitNSACR_CP11_POS ( 11UL ) +#define secureinitNSACR_CP11_MASK ( 1UL << secureinitNSACR_CP11_POS ) +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_DePrioritizeNSExceptions( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + *( secureinitSCB_AIRCR ) = ( *( secureinitSCB_AIRCR ) & ~( secureinitSCB_AIRCR_VECTKEY_MASK | secureinitSCB_AIRCR_PRIS_MASK ) ) | + ( ( 0x05FAUL << secureinitSCB_AIRCR_VECTKEY_POS ) & secureinitSCB_AIRCR_VECTKEY_MASK ) | + ( ( 0x1UL << secureinitSCB_AIRCR_PRIS_POS ) & secureinitSCB_AIRCR_PRIS_MASK ); + } +} +/*-----------------------------------------------------------*/ + +secureportNON_SECURE_CALLABLE void SecureInit_EnableNSFPUAccess( void ) +{ + uint32_t ulIPSR; + + /* Read the Interrupt Program Status Register (IPSR) value. */ + secureportREAD_IPSR( ulIPSR ); + + /* Do nothing if the processor is running in the Thread Mode. IPSR is zero + * when the processor is running in the Thread Mode. */ + if( ulIPSR != 0 ) + { + /* CP10 = 1 ==> Non-secure access to the Floating Point Unit is + * permitted. CP11 should be programmed to the same value as CP10. */ + *( secureinitNSACR ) |= ( secureinitNSACR_CP10_MASK | secureinitNSACR_CP11_MASK ); + + /* LSPENS = 0 ==> LSPEN is writable fron non-secure state. This ensures + * that we can enable/disable lazy stacking in port.c file. */ + *( secureinitFPCCR ) &= ~( secureinitFPCCR_LSPENS_MASK ); + + /* TS = 1 ==> Treat FP registers as secure i.e. callee saved FP + * registers (S16-S31) are also pushed to stack on exception entry and + * restored on exception return. */ + *( secureinitFPCCR ) |= ( secureinitFPCCR_TS_MASK ); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.h new file mode 100644 index 0000000..e89af71 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_INIT_H__ +#define __SECURE_INIT_H__ + +/** + * @brief De-prioritizes the non-secure exceptions. + * + * This is needed to ensure that the non-secure PendSV runs at the lowest + * priority. Context switch is done in the non-secure PendSV handler. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_DePrioritizeNSExceptions( void ); + +/** + * @brief Sets up the Floating Point Unit (FPU) for Non-Secure access. + * + * Also sets FPCCR.TS=1 to ensure that the content of the Floating Point + * Registers are not leaked to the non-secure side. + * + * @note This function must be called in the handler mode. It is no-op if called + * in the thread mode. + */ +void SecureInit_EnableNSFPUAccess( void ); + +#endif /* __SECURE_INIT_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_port_macros.h new file mode 100644 index 0000000..2fb7c59 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_port_macros.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __SECURE_PORT_MACROS_H__ +#define __SECURE_PORT_MACROS_H__ + +/** + * @brief Byte alignment requirements. + */ +#define secureportBYTE_ALIGNMENT 8 +#define secureportBYTE_ALIGNMENT_MASK ( 0x0007 ) + +/** + * @brief Macro to declare a function as non-secure callable. + */ +#if defined( __IAR_SYSTEMS_ICC__ ) + #define secureportNON_SECURE_CALLABLE __cmse_nonsecure_entry __root +#else + #define secureportNON_SECURE_CALLABLE __attribute__( ( cmse_nonsecure_entry ) ) __attribute__( ( used ) ) +#endif + +/** + * @brief Set the secure PRIMASK value. + */ +#define secureportSET_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Set the non-secure PRIMASK value. + */ +#define secureportSET_NON_SECURE_PRIMASK( ulPrimaskValue ) \ + __asm volatile ( "msr primask_ns, %0" : : "r" ( ulPrimaskValue ) : "memory" ) + +/** + * @brief Read the PSP value in the given variable. + */ +#define secureportREAD_PSP( pucOutCurrentStackPointer ) \ + __asm volatile ( "mrs %0, psp" : "=r" ( pucOutCurrentStackPointer ) ) + +/** + * @brief Set the PSP to the given value. + */ +#define secureportSET_PSP( pucCurrentStackPointer ) \ + __asm volatile ( "msr psp, %0" : : "r" ( pucCurrentStackPointer ) ) + +/** + * @brief Read the PSPLIM value in the given variable. + */ +#define secureportREAD_PSPLIM( pucOutStackLimit ) \ + __asm volatile ( "mrs %0, psplim" : "=r" ( pucOutStackLimit ) ) + +/** + * @brief Set the PSPLIM to the given value. + */ +#define secureportSET_PSPLIM( pucStackLimit ) \ + __asm volatile ( "msr psplim, %0" : : "r" ( pucStackLimit ) ) + +/** + * @brief Set the NonSecure MSP to the given value. + */ +#define secureportSET_MSP_NS( pucMainStackPointer ) \ + __asm volatile ( "msr msp_ns, %0" : : "r" ( pucMainStackPointer ) ) + +/** + * @brief Set the CONTROL register to the given value. + */ +#define secureportSET_CONTROL( ulControl ) \ + __asm volatile ( "msr control, %0" : : "r" ( ulControl ) : "memory" ) + +/** + * @brief Read the Interrupt Program Status Register (IPSR) value in the given + * variable. + */ +#define secureportREAD_IPSR( ulIPSR ) \ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulIPSR ) ) + +/** + * @brief PRIMASK value to enable interrupts. + */ +#define secureportPRIMASK_ENABLE_INTERRUPTS_VAL 0 + +/** + * @brief PRIMASK value to disable interrupts. + */ +#define secureportPRIMASK_DISABLE_INTERRUPTS_VAL 1 + +/** + * @brief Disable secure interrupts. + */ +#define secureportDISABLE_SECURE_INTERRUPTS() secureportSET_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Disable non-secure interrupts. + * + * This effectively disables context switches. + */ +#define secureportDISABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_DISABLE_INTERRUPTS_VAL ) + +/** + * @brief Enable non-secure interrupts. + */ +#define secureportENABLE_NON_SECURE_INTERRUPTS() secureportSET_NON_SECURE_PRIMASK( secureportPRIMASK_ENABLE_INTERRUPTS_VAL ) + +/** + * @brief Assert definition. + */ +#define secureportASSERT( x ) \ + if( ( x ) == 0 ) \ + { \ + secureportDISABLE_SECURE_INTERRUPTS(); \ + secureportDISABLE_NON_SECURE_INTERRUPTS(); \ + for( ; ; ) {; } \ + } + +#endif /* __SECURE_PORT_MACROS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/port.c new file mode 100644 index 0000000..349aeff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/port.c @@ -0,0 +1,1261 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/* Portasm includes. */ +#include "portasm.h" + +#if ( configENABLE_TRUSTZONE == 1 ) + /* Secure components includes. */ + #include "secure_context.h" + #include "secure_init.h" +#endif /* configENABLE_TRUSTZONE */ + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/** + * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only + * i.e. the processor boots as secure and never jumps to the non-secure side. + * The Trust Zone support in the port must be disabled in order to run FreeRTOS + * on the secure side. The following are the valid configuration seetings: + * + * 1. Run FreeRTOS on the Secure Side: + * configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0 + * + * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1 + * + * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support: + * configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0 + */ +#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) ) + #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the NVIC. + */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the SCB. + */ +#define portSCB_SYS_HANDLER_CTRL_STATE_REG ( *( volatile uint32_t * ) 0xe000ed24 ) +#define portSCB_MEM_FAULT_ENABLE_BIT ( 1UL << 16UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the FPU. + */ +#define portCPACR ( ( volatile uint32_t * ) 0xe000ed88 ) /* Coprocessor Access Control Register. */ +#define portCPACR_CP10_VALUE ( 3UL ) +#define portCPACR_CP11_VALUE portCPACR_CP10_VALUE +#define portCPACR_CP10_POS ( 20UL ) +#define portCPACR_CP11_POS ( 22UL ) + +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating Point Context Control Register. */ +#define portFPCCR_ASPEN_POS ( 31UL ) +#define portFPCCR_ASPEN_MASK ( 1UL << portFPCCR_ASPEN_POS ) +#define portFPCCR_LSPEN_POS ( 30UL ) +#define portFPCCR_LSPEN_MASK ( 1UL << portFPCCR_LSPEN_POS ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to manipulate the MPU. + */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portMPU_RNR_REG ( *( ( volatile uint32_t * ) 0xe000ed98 ) ) + +#define portMPU_RBAR_REG ( *( ( volatile uint32_t * ) 0xe000ed9c ) ) +#define portMPU_RLAR_REG ( *( ( volatile uint32_t * ) 0xe000eda0 ) ) + +#define portMPU_RBAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda4 ) ) +#define portMPU_RLAR_A1_REG ( *( ( volatile uint32_t * ) 0xe000eda8 ) ) + +#define portMPU_RBAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edac ) ) +#define portMPU_RLAR_A2_REG ( *( ( volatile uint32_t * ) 0xe000edb0 ) ) + +#define portMPU_RBAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb4 ) ) +#define portMPU_RLAR_A3_REG ( *( ( volatile uint32_t * ) 0xe000edb8 ) ) + +#define portMPU_MAIR0_REG ( *( ( volatile uint32_t * ) 0xe000edc0 ) ) +#define portMPU_MAIR1_REG ( *( ( volatile uint32_t * ) 0xe000edc4 ) ) + +#define portMPU_RBAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ +#define portMPU_RLAR_ADDRESS_MASK ( 0xffffffe0 ) /* Must be 32-byte aligned. */ + +#define portMPU_MAIR_ATTR0_POS ( 0UL ) +#define portMPU_MAIR_ATTR0_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR1_POS ( 8UL ) +#define portMPU_MAIR_ATTR1_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR2_POS ( 16UL ) +#define portMPU_MAIR_ATTR2_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR3_POS ( 24UL ) +#define portMPU_MAIR_ATTR3_MASK ( 0xff000000 ) + +#define portMPU_MAIR_ATTR4_POS ( 0UL ) +#define portMPU_MAIR_ATTR4_MASK ( 0x000000ff ) + +#define portMPU_MAIR_ATTR5_POS ( 8UL ) +#define portMPU_MAIR_ATTR5_MASK ( 0x0000ff00 ) + +#define portMPU_MAIR_ATTR6_POS ( 16UL ) +#define portMPU_MAIR_ATTR6_MASK ( 0x00ff0000 ) + +#define portMPU_MAIR_ATTR7_POS ( 24UL ) +#define portMPU_MAIR_ATTR7_MASK ( 0xff000000 ) + +#define portMPU_RLAR_ATTR_INDEX0 ( 0UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX1 ( 1UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX2 ( 2UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX3 ( 3UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX4 ( 4UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX5 ( 5UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX6 ( 6UL << 1UL ) +#define portMPU_RLAR_ATTR_INDEX7 ( 7UL << 1UL ) + +#define portMPU_RLAR_REGION_ENABLE ( 1UL ) + +/* Enable privileged access to unmapped region. */ +#define portMPU_PRIV_BACKGROUND_ENABLE_BIT ( 1UL << 2UL ) + +/* Enable MPU. */ +#define portMPU_ENABLE_BIT ( 1UL << 0UL ) + +/* Expected value of the portMPU_TYPE register. */ +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief The maximum 24-bit number. + * + * It is needed because the systick is a 24-bit counter. + */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/** + * @brief A fiddle factor to estimate the number of SysTick counts that would + * have occurred while the SysTick counter is stopped during tickless idle + * calculations. + */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Constants required to set up the initial stack. + */ +#define portINITIAL_XPSR ( 0x01000000 ) + +#if ( configRUN_FREERTOS_SECURE_ONLY == 1 ) + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF FD + * 1111 1111 1111 1111 1111 1111 1111 1101 + * + * Bit[6] - 1 --> The exception was taken from the Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 1 --> The exception was taken to the Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xfffffffd ) +#else + +/** + * @brief Initial EXC_RETURN value. + * + * FF FF FF BC + * 1111 1111 1111 1111 1111 1111 1011 1100 + * + * Bit[6] - 0 --> The exception was taken from the Non-Secure state. + * Bit[5] - 1 --> Do not skip stacking of additional state context. + * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context. + * Bit[3] - 1 --> Return to the Thread mode. + * Bit[2] - 1 --> Restore registers from the process stack. + * Bit[1] - 0 --> Reserved, 0. + * Bit[0] - 0 --> The exception was taken to the Non-Secure state. + */ + #define portINITIAL_EXC_RETURN ( 0xffffffbc ) +#endif /* configRUN_FREERTOS_SECURE_ONLY */ + +/** + * @brief CONTROL register privileged bit mask. + * + * Bit[0] in CONTROL register tells the privilege: + * Bit[0] = 0 ==> The task is privileged. + * Bit[0] = 1 ==> The task is not privileged. + */ +#define portCONTROL_PRIVILEGED_MASK ( 1UL << 0UL ) + +/** + * @brief Initial CONTROL register values. + */ +#define portINITIAL_CONTROL_UNPRIVILEGED ( 0x3 ) +#define portINITIAL_CONTROL_PRIVILEGED ( 0x2 ) + +/** + * @brief Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. + */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/** + * @brief Let the user override the pre-loading of the initial LR with the + * address of prvTaskExitError() in case it messes up unwinding of the stack + * in the debugger. + */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/** + * @brief If portPRELOAD_REGISTERS then registers will be given an initial value + * when a task is created. This helps in debugging at the cost of code size. + */ +#define portPRELOAD_REGISTERS 1 + +/** + * @brief A task is created without a secure context, and must call + * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes + * any secure calls. + */ +#define portNO_SECURE_CONTEXT 0 +/*-----------------------------------------------------------*/ + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +#if ( configENABLE_MPU == 1 ) + +/** + * @brief Setup the Memory Protection Unit (MPU). + */ + static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_MPU */ + +#if ( configENABLE_FPU == 1 ) + +/** + * @brief Setup the Floating Point Unit (FPU). + */ + static void prvSetupFPU( void ) PRIVILEGED_FUNCTION; +#endif /* configENABLE_FPU */ + +/** + * @brief Setup the timer to generate the tick interrupts. + * + * The implementation in this file is weak to allow application writers to + * change the timer used to generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether the current execution context is interrupt. + * + * @return pdTRUE if the current execution context is interrupt, pdFALSE + * otherwise. + */ +BaseType_t xPortIsInsideInterrupt( void ); + +/** + * @brief Yield the processor. + */ +void vPortYield( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Enter critical section. + */ +void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief Exit from critical section. + */ +void vPortExitCritical( void ) PRIVILEGED_FUNCTION; + +/** + * @brief SysTick handler. + */ +void SysTick_Handler( void ) PRIVILEGED_FUNCTION; + +/** + * @brief C part of SVC handler. + */ +portDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + +/** + * @brief Each task maintains its own interrupt status in the critical nesting + * variable. + */ +PRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +#if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Saved as part of the task context to indicate which context the + * task is using on the secure side. + */ + PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT; +#endif /* configENABLE_TRUSTZONE */ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +/** + * @brief The number of SysTick increments that make up one tick period. + */ + PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0; + +/** + * @brief The maximum number of tick periods that can be suppressed is + * limited by the 24 bit resolution of the SysTick timer. + */ + PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0; + +/** + * @brief Compensate for the CPU cycles that pass while the SysTick is + * stopped (low power functionality only). + */ + PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_functions_start__; + extern uint32_t * __privileged_functions_end__; + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + extern uint32_t * __unprivileged_flash_start__; + extern uint32_t * __unprivileged_flash_end__; + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else /* if defined( __ARMCC_VERSION ) */ + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_functions_start__[]; + extern uint32_t __privileged_functions_end__[]; + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + extern uint32_t __unprivileged_flash_start__[]; + extern uint32_t __unprivileged_flash_end__[]; + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check that the MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* MAIR0 - Index 0. */ + portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + /* MAIR0 - Index 1. */ + portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* Setup privileged flash as Read Only so that privileged tasks can + * read it but not modify. */ + portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged flash as Read Only by both privileged and + * unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup unprivileged syscalls flash as Read Only by both privileged + * and unprivileged tasks. All tasks can read it but no-one can modify. */ + portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_ONLY ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Setup RAM containing kernel data for privileged access only. */ + portMPU_RNR_REG = portPRIVILEGED_RAM_REGION; + portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Enable mem fault. */ + portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT; + + /* Enable MPU with privileged background access i.e. unmapped + * regions have privileged access. */ + portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT ); + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +#if ( configENABLE_FPU == 1 ) + static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */ + { + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* Enable non-secure access to the FPU. */ + SecureInit_EnableNSFPUAccess(); + } + #endif /* configENABLE_TRUSTZONE */ + + /* CP10 = 11 ==> Full access to FPU i.e. both privileged and + * unprivileged code should be able to access FPU. CP11 should be + * programmed to the same value as CP10. */ + *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) | + ( portCPACR_CP11_VALUE << portCPACR_CP11_POS ) + ); + + /* ASPEN = 1 ==> Hardware should automatically preserve floating point + * context on exception entry and restore on exception return. + * LSPEN = 1 ==> Enable lazy context save of FP state. */ + *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK ); + } +#endif /* configENABLE_FPU */ +/*-----------------------------------------------------------*/ + +void vPortYield( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + + /* Barriers are normally not required but do ensure the code is + * completely within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */ +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */ +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */ +{ + #if ( configENABLE_MPU == 1 ) + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __syscalls_flash_start__; + extern uint32_t * __syscalls_flash_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __syscalls_flash_start__[]; + extern uint32_t __syscalls_flash_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + #endif /* configENABLE_MPU */ + + uint32_t ulPC; + + #if ( configENABLE_TRUSTZONE == 1 ) + uint32_t ulR0, ulR1; + extern TaskHandle_t pxCurrentTCB; + #if ( configENABLE_MPU == 1 ) + uint32_t ulControl, ulIsTaskPrivileged; + #endif /* configENABLE_MPU */ + #endif /* configENABLE_TRUSTZONE */ + uint8_t ucSVCNumber; + + /* Register are stored on the stack in the following order - R0, R1, R2, R3, + * R12, LR, PC, xPSR. */ + ulPC = pulCallerStackAddress[ 6 ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + #if ( configENABLE_TRUSTZONE == 1 ) + case portSVC_ALLOCATE_SECURE_CONTEXT: + + /* R0 contains the stack size passed as parameter to the + * vPortAllocateSecureContext function. */ + ulR0 = pulCallerStackAddress[ 0 ]; + + #if ( configENABLE_MPU == 1 ) + { + /* Read the CONTROL register value. */ + __asm volatile ( "mrs %0, control" : "=r" ( ulControl ) ); + + /* The task that raised the SVC is privileged if Bit[0] + * in the CONTROL register is 0. */ + ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 ); + + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB ); + } + #else /* if ( configENABLE_MPU == 1 ) */ + { + /* Allocate and load a context for the secure task. */ + xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB ); + } + #endif /* configENABLE_MPU */ + + configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID ); + SecureContext_LoadContext( xSecureContext, pxCurrentTCB ); + break; + + case portSVC_FREE_SECURE_CONTEXT: + + /* R0 contains TCB being freed and R1 contains the secure + * context handle to be freed. */ + ulR0 = pulCallerStackAddress[ 0 ]; + ulR1 = pulCallerStackAddress[ 1 ]; + + /* Free the secure context. */ + SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 ); + break; + #endif /* configENABLE_TRUSTZONE */ + + case portSVC_START_SCHEDULER: + #if ( configENABLE_TRUSTZONE == 1 ) + { + /* De-prioritize the non-secure exceptions so that the + * non-secure pendSV runs at the lowest priority. */ + SecureInit_DePrioritizeNSExceptions(); + + /* Initialize the secure context management system. */ + SecureContext_Init(); + } + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_FPU == 1 ) + { + /* Setup the Floating Point Unit (FPU). */ + prvSetupFPU(); + } + #endif /* configENABLE_FPU */ + + /* Setup the context of the first task so that the first task starts + * executing. */ + vRestoreContextOfFirstTask(); + break; + + #if ( configENABLE_MPU == 1 ) + case portSVC_RAISE_PRIVILEGE: + + /* Only raise the privilege, if the svc was raised from any of + * the system calls. */ + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + vRaisePrivilege(); + } + break; + #endif /* configENABLE_MPU */ + + default: + /* Incorrect SVC call. */ + configASSERT( pdFALSE ); + } +} +/*-----------------------------------------------------------*/ +/* *INDENT-OFF* */ +#if ( configENABLE_MPU == 1 ) + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) /* PRIVILEGED_FUNCTION */ +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + StackType_t * pxEndOfStack, + TaskFunction_t pxCode, + void * pvParameters ) /* PRIVILEGED_FUNCTION */ +#endif /* configENABLE_MPU */ +/* *INDENT-ON* */ +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + #if ( portPRELOAD_REGISTERS == 0 ) + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11..R4, EXC_RETURN. */ + *pxTopOfStack = portINITIAL_EXC_RETURN; + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #else /* portPRELOAD_REGISTERS */ + { + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212UL; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303UL; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202UL; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101UL; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111UL; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010UL; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909UL; /* R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808UL; /* R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707UL; /* R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606UL; /* R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505UL; /* R05 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404UL; /* R04 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; /* EXC_RETURN */ + + #if ( configENABLE_MPU == 1 ) + { + pxTopOfStack--; + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_PRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_UNPRIVILEGED; /* Slot used to hold this task's CONTROL value. */ + } + } + #endif /* configENABLE_MPU */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */ + + #if ( configENABLE_TRUSTZONE == 1 ) + { + pxTopOfStack--; + *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */ + } + #endif /* configENABLE_TRUSTZONE */ + } + #endif /* portPRELOAD_REGISTERS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if ( configENABLE_MPU == 1 ) + { + /* Setup the Memory Protection Unit (MPU). */ + prvSetupMPU(); + } + #endif /* configENABLE_MPU */ + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialize the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Start the first task. */ + vStartFirstTask(); + + /* Should never get here as the tasks will now be executing. Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimization does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */ +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +#if ( configENABLE_MPU == 1 ) + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) + { + uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber; + int32_t lIndex = 0; + + #if defined( __ARMCC_VERSION ) + + /* Declaration when these variable are defined in code instead of being + * exported from linker scripts. */ + extern uint32_t * __privileged_sram_start__; + extern uint32_t * __privileged_sram_end__; + #else + /* Declaration when these variable are exported from linker scripts. */ + extern uint32_t __privileged_sram_start__[]; + extern uint32_t __privileged_sram_end__[]; + #endif /* defined( __ARMCC_VERSION ) */ + + /* Setup MAIR0. */ + xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK ); + xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK ); + + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that + * the stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + ulRegionStartAddress = ( uint32_t ) pxBottomOfStack; + ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1; + + /* If the stack is within the privileged SRAM, do not protect it + * using a separate MPU region. This is needed because privileged + * SRAM is already protected using an MPU region and ARMv8-M does + * not allow overlapping MPU regions. */ + if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) && + ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) ) + { + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0; + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0; + } + else + { + /* Define the region that allows access to the stack. */ + ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ) | + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ); + + xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_ATTR_INDEX0 ) | + ( portMPU_RLAR_REGION_ENABLE ); + } + } + + /* User supplied configurable regions. */ + for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ ) + { + /* If xRegions is NULL i.e. the task has not specified any MPU + * region, the else part ensures that all the configurable MPU + * regions are invalidated. */ + if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) ) + { + /* Translate the generic region definition contained in xRegions + * into the ARMv8 specific MPU settings that are then stored in + * xMPUSettings. */ + ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK; + ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1; + ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK; + + /* Start address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) | + ( portMPU_REGION_NON_SHAREABLE ); + + /* RO/RW. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY ); + } + else + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE ); + } + + /* XN. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 ) + { + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER ); + } + + /* End Address. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) | + ( portMPU_RLAR_REGION_ENABLE ); + + /* Normal memory/ Device memory. */ + if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 ) + { + /* Attr1 in MAIR0 is configured as device memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1; + } + else + { + /* Attr0 in MAIR0 is configured as normal memory. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0; + } + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL; + xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL; + } + + lIndex++; + } + } +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. Interrupt Program + * Status Register (IPSR) holds the exception number of the currently-executing + * exception or zero for Thread mode.*/ + __asm volatile ( "mrs %0, ipsr" : "=r" ( ulCurrentInterrupt )::"memory" ); + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h new file mode 100644 index 0000000..93606b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef __PORT_ASM_H__ +#define __PORT_ASM_H__ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* MPU wrappers includes. */ +#include "mpu_wrappers.h" + +/** + * @brief Restore the context of the first task so that the first task starts + * executing. + */ +void vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ) __attribute__( ( naked ) ); + +/** + * @brief Raises the privilege level by clearing the bit 0 of the CONTROL + * register. + * + * @note This is a privileged function and should only be called from the kenrel + * code. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ) __attribute__( ( naked ) ); + +/** + * @brief Starts the first task. + */ +void vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Disables interrupts. + */ +uint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Enables interrupts. + */ +void vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief PendSV Exception handler. + */ +void PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief SVC Handler. + */ +void SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +/** + * @brief Allocate a Secure context for the calling task. + * + * @param[in] ulSecureStackSize The size of the stack to be allocated on the + * secure side for the calling task. + */ +void vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) ); + +/** + * @brief Free the task's secure context. + * + * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task. + */ +void vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION; + +#endif /* __PORT_ASM_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s new file mode 100644 index 0000000..4d02a43 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s @@ -0,0 +1,262 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/* Including FreeRTOSConfig.h here will cause build errors if the header file +contains code not understood by the assembler - for example the 'extern' keyword. +To avoid errors place any such code inside a #ifdef __ICCARM__/#endif block so +the code is included in C files but excluded by the preprocessor in assembly +files (__ICCARM__ is defined by the IAR C compiler but not by the IAR assembler. */ +#include "FreeRTOSConfig.h" + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vPortSVCHandler_C + + PUBLIC xIsPrivileged + PUBLIC vResetPrivilege + PUBLIC vRestoreContextOfFirstTask + PUBLIC vRaisePrivilege + PUBLIC vStartFirstTask + PUBLIC ulSetInterruptMask + PUBLIC vClearInterruptMask + PUBLIC PendSV_Handler + PUBLIC SVC_Handler +/*-----------------------------------------------------------*/ + +/*---------------- Unprivileged Functions -------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION .text:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +xIsPrivileged: + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is not privileged. */ + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vResetPrivilege: + mrs r0, control /* r0 = CONTROL. */ + orr r0, r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +/*----------------- Privileged Functions --------------------*/ + +/*-----------------------------------------------------------*/ + + SECTION privileged_functions:CODE:NOROOT(2) + THUMB +/*-----------------------------------------------------------*/ + +vRestoreContextOfFirstTask: + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r3, [r1] /* r3 = *r1 i.e. r3 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r3, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r3, #4 /* r3 = 4. */ + str r3, [r2] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldm r0!, {r1-r3} /* Read from stack - r1 = PSPLIM, r2 = CONTROL and r3 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + msr control, r2 /* Set this task's CONTROL value. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r3 /* Finally, branch to EXC_RETURN. */ +#else /* configENABLE_MPU */ + ldm r0!, {r1-r2} /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */ + msr psplim, r1 /* Set this task's PSPLIM value. */ + movs r1, #2 /* r1 = 2. */ + msr CONTROL, r1 /* Switch to use PSP in the thread mode. */ + adds r0, #32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + isb + mov r0, #0 + msr basepri, r0 /* Ensure that interrupts are enabled when the first task starts. */ + bx r2 /* Finally, branch to EXC_RETURN. */ +#endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +vRaisePrivilege: + mrs r0, control /* Read the CONTROL register. */ + bic r0, r0, #1 /* Clear the bit 0. */ + msr control, r0 /* Write back the new CONTROL value. */ + bx lr /* Return to the caller. */ +/*-----------------------------------------------------------*/ + +vStartFirstTask: + ldr r0, =0xe000ed08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [r0] /* Read the VTOR register which gives the address of vector table. */ + ldr r0, [r0] /* The first entry in vector table is stack pointer. */ + msr msp, r0 /* Set the MSP back to the start of the stack. */ + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc 2 /* System call to start the first task. portSVC_START_SCHEDULER = 2. */ +/*-----------------------------------------------------------*/ + +ulSetInterruptMask: + mrs r0, basepri /* r0 = basepri. Return original basepri value. */ + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +vClearInterruptMask: + msr basepri, r0 /* basepri = ulMask. */ + dsb + isb + bx lr /* Return. */ +/*-----------------------------------------------------------*/ + +PendSV_Handler: + mrs r0, psp /* Read PSP in r0. */ +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst lr, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vstmdbeq r0!, {s16-s31} /* Store the additional FP context registers which are not saved automatically. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ +#if ( configENABLE_MPU == 1 ) + mrs r1, psplim /* r1 = PSPLIM. */ + mrs r2, control /* r2 = CONTROL. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmdb r0!, {r1-r11} /* Store on the stack - PSPLIM, CONTROL, LR and registers that are not automatically saved. */ +#else /* configENABLE_MPU */ + mrs r2, psplim /* r2 = PSPLIM. */ + mov r3, lr /* r3 = LR/EXC_RETURN. */ + stmdb r0!, {r2-r11} /* Store on the stack - PSPLIM, LR and registers that are not automatically. */ +#endif /* configENABLE_MPU */ + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + str r0, [r1] /* Save the new top of stack in TCB. */ + + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + dsb + isb + bl vTaskSwitchContext + mov r0, #0 /* r0 = 0. */ + msr basepri, r0 /* Enable interrupts. */ + + ldr r2, =pxCurrentTCB /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */ + ldr r1, [r2] /* Read pxCurrentTCB. */ + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */ + +#if ( configENABLE_MPU == 1 ) + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + bic r4, r4, #1 /* r4 = r4 & ~1 i.e. Clear the bit 0 in r4. */ + str r4, [r2] /* Disable MPU. */ + + adds r1, #4 /* r1 = r1 + 4. r1 now points to MAIR0 in TCB. */ + ldr r3, [r1] /* r3 = *r1 i.e. r3 = MAIR0. */ + ldr r2, =0xe000edc0 /* r2 = 0xe000edc0 [Location of MAIR0]. */ + str r3, [r2] /* Program MAIR0. */ + ldr r2, =0xe000ed98 /* r2 = 0xe000ed98 [Location of RNR]. */ + movs r3, #4 /* r3 = 4. */ + str r3, [r2] /* Program RNR = 4. */ + adds r1, #4 /* r1 = r1 + 4. r1 now points to first RBAR in TCB. */ + ldr r2, =0xe000ed9c /* r2 = 0xe000ed9c [Location of RBAR]. */ + ldmia r1!, {r4-r11} /* Read 4 sets of RBAR/RLAR registers from TCB. */ + stmia r2!, {r4-r11} /* Write 4 set of RBAR/RLAR registers using alias registers. */ + + ldr r2, =0xe000ed94 /* r2 = 0xe000ed94 [Location of MPU_CTRL]. */ + ldr r4, [r2] /* Read the value of MPU_CTRL. */ + orr r4, r4, #1 /* r4 = r4 | 1 i.e. Set the bit 0 in r4. */ + str r4, [r2] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ +#endif /* configENABLE_MPU */ + +#if ( configENABLE_MPU == 1 ) + ldmia r0!, {r1-r11} /* Read from stack - r1 = PSPLIM, r2 = CONTROL, r3 = LR and r4-r11 restored. */ +#else /* configENABLE_MPU */ + ldmia r0!, {r2-r11} /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */ +#endif /* configENABLE_MPU */ + +#if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) + tst r3, #0x10 /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */ + it eq + vldmiaeq r0!, {s16-s31} /* Restore the additional FP context registers which are not restored automatically. */ +#endif /* configENABLE_FPU || configENABLE_MVE */ + + #if ( configENABLE_MPU == 1 ) + msr psplim, r1 /* Restore the PSPLIM register value for the task. */ + msr control, r2 /* Restore the CONTROL register value for the task. */ +#else /* configENABLE_MPU */ + msr psplim, r2 /* Restore the PSPLIM register value for the task. */ +#endif /* configENABLE_MPU */ + msr psp, r0 /* Remember the new top of stack for the task. */ + bx r3 +/*-----------------------------------------------------------*/ + +SVC_Handler: + tst lr, #4 + ite eq + mrseq r0, msp + mrsne r0, psp + b vPortSVCHandler_C +/*-----------------------------------------------------------*/ + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h new file mode 100644 index 0000000..c1e5550 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h @@ -0,0 +1,83 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "portmacrocommon.h" + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + +#ifndef configENABLE_MVE + #error configENABLE_MVE must be defined in FreeRTOSConfig.h. Set configENABLE_MVE to 1 to enable the MVE or 0 to disable the MVE. +#endif /* configENABLE_MVE */ +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ +#define portARCH_NAME "Cortex-M85" +#define portDONT_DISCARD __root +/*-----------------------------------------------------------*/ + +#if( configTOTAL_MPU_REGIONS == 16 ) + #error 16 MPU regions are not yet supported for this port. +#endif +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ +#define portDISABLE_INTERRUPTS() ulSetInterruptMask() +#define portENABLE_INTERRUPTS() vClearInterruptMask( 0 ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Be006 +#pragma diag_suppress=Pa082 +/*-----------------------------------------------------------*/ + +#ifdef __cplusplus + } +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h new file mode 100644 index 0000000..e68692a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h @@ -0,0 +1,311 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACROCOMMON_H + #define PORTMACROCOMMON_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*------------------------------------------------------------------------------ + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *------------------------------------------------------------------------------ + */ + + #ifndef configENABLE_FPU + #error configENABLE_FPU must be defined in FreeRTOSConfig.h. Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU. + #endif /* configENABLE_FPU */ + + #ifndef configENABLE_MPU + #error configENABLE_MPU must be defined in FreeRTOSConfig.h. Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU. + #endif /* configENABLE_MPU */ + + #ifndef configENABLE_TRUSTZONE + #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h. Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone. + #endif /* configENABLE_TRUSTZONE */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Type definitions. + */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/** + * Architecture specifics. + */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() + #define portINLINE __inline + #ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__( ( always_inline ) ) + #endif + #define portHAS_STACK_OVERFLOW_CHECKING 1 +/*-----------------------------------------------------------*/ + +/** + * @brief Extern declarations. + */ + extern BaseType_t xPortIsInsideInterrupt( void ); + + extern void vPortYield( void ) /* PRIVILEGED_FUNCTION */; + + extern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */; + extern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */; + + extern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + extern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */; + + #if ( configENABLE_TRUSTZONE == 1 ) + extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */ + extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */; + #endif /* configENABLE_TRUSTZONE */ + + #if ( configENABLE_MPU == 1 ) + extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */; + extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */; + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief MPU specific constants. + */ + #if ( configENABLE_MPU == 1 ) + #define portUSING_MPU_WRAPPERS 1 + #define portPRIVILEGE_BIT ( 0x80000000UL ) + #else + #define portPRIVILEGE_BIT ( 0x0UL ) + #endif /* configENABLE_MPU */ + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* MPU regions. */ + #define portPRIVILEGED_FLASH_REGION ( 0UL ) + #define portUNPRIVILEGED_FLASH_REGION ( 1UL ) + #define portUNPRIVILEGED_SYSCALLS_REGION ( 2UL ) + #define portPRIVILEGED_RAM_REGION ( 3UL ) + #define portSTACK_REGION ( 4UL ) + #define portFIRST_CONFIGURABLE_REGION ( 5UL ) + #define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 1UL ) + #define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) + #define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +/* Device memory attributes used in MPU_MAIR registers. + * + * 8-bit values encoded as follows: + * Bit[7:4] - 0000 - Device Memory + * Bit[3:2] - 00 --> Device-nGnRnE + * 01 --> Device-nGnRE + * 10 --> Device-nGRE + * 11 --> Device-GRE + * Bit[1:0] - 00, Reserved. + */ + #define portMPU_DEVICE_MEMORY_nGnRnE ( 0x00 ) /* 0000 0000 */ + #define portMPU_DEVICE_MEMORY_nGnRE ( 0x04 ) /* 0000 0100 */ + #define portMPU_DEVICE_MEMORY_nGRE ( 0x08 ) /* 0000 1000 */ + #define portMPU_DEVICE_MEMORY_GRE ( 0x0C ) /* 0000 1100 */ + +/* Normal memory attributes used in MPU_MAIR registers. */ + #define portMPU_NORMAL_MEMORY_NON_CACHEABLE ( 0x44 ) /* Non-cacheable. */ + #define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE ( 0xFF ) /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */ + +/* Attributes used in MPU_RBAR registers. */ + #define portMPU_REGION_NON_SHAREABLE ( 0UL << 3UL ) + #define portMPU_REGION_INNER_SHAREABLE ( 1UL << 3UL ) + #define portMPU_REGION_OUTER_SHAREABLE ( 2UL << 3UL ) + + #define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0UL << 1UL ) + #define portMPU_REGION_READ_WRITE ( 1UL << 1UL ) + #define portMPU_REGION_PRIVILEGED_READ_ONLY ( 2UL << 1UL ) + #define portMPU_REGION_READ_ONLY ( 3UL << 1UL ) + + #define portMPU_REGION_EXECUTE_NEVER ( 1UL ) +/*-----------------------------------------------------------*/ + +/** + * @brief Settings to define an MPU region. + */ + typedef struct MPURegionSettings + { + uint32_t ulRBAR; /**< RBAR for the region. */ + uint32_t ulRLAR; /**< RLAR for the region. */ + } MPURegionSettings_t; + +/** + * @brief MPU settings as stored in the TCB. + */ + typedef struct MPU_SETTINGS + { + uint32_t ulMAIR0; /**< MAIR0 for the task containing attributes for all the 4 per task regions. */ + MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */ + } xMPU_SETTINGS; +/*-----------------------------------------------------------*/ + +/** + * @brief SVC numbers. + */ + #define portSVC_ALLOCATE_SECURE_CONTEXT 0 + #define portSVC_FREE_SECURE_CONTEXT 1 + #define portSVC_START_SCHEDULER 2 + #define portSVC_RAISE_PRIVILEGE 3 +/*-----------------------------------------------------------*/ + +/** + * @brief Scheduler utilities. + */ + #define portYIELD() vPortYield() + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/** + * @brief Critical section management. + */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMask( x ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/** + * @brief Tickless idle/low power functionality. + */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/** + * @brief Task function macros as described on the FreeRTOS.org WEB site. + */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #if ( configENABLE_TRUSTZONE == 1 ) + +/** + * @brief Allocate a secure context for the task. + * + * Tasks are not created with a secure context. Any task that is going to call + * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a + * secure context before it calls any secure function. + * + * @param[in] ulSecureStackSize The size of the secure stack to be allocated. + */ + #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize ) vPortAllocateSecureContext( ulSecureStackSize ) + +/** + * @brief Called when a task is deleted to delete the task's secure context, + * if it has one. + * + * @param[in] pxTCB The TCB of the task being deleted. + */ + #define portCLEAN_UP_TCB( pxTCB ) vPortFreeSecureContext( ( uint32_t * ) pxTCB ) + #endif /* configENABLE_TRUSTZONE */ +/*-----------------------------------------------------------*/ + + #if ( configENABLE_MPU == 1 ) + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ + #define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + * + * The SVC handler checks that the SVC was raised from a system call and only + * then it raises the privilege. If this is called from any other place, + * the privilege is not raised. + */ + #define portRAISE_PRIVILEGE() __asm volatile ( "svc %0 \n" ::"i" ( portSVC_RAISE_PRIVILEGE ) : "memory" ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ + #define portRESET_PRIVILEGE() vResetPrivilege() + #else + #define portIS_PRIVILEGED() + #define portRAISE_PRIVILEGE() + #define portRESET_PRIVILEGE() + #endif /* configENABLE_MPU */ +/*-----------------------------------------------------------*/ + +/** + * @brief Barriers. + */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACROCOMMON_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/port.c new file mode 100644 index 0000000..f195e93 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/port.c @@ -0,0 +1,317 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined in FreeRTOSConfig.h to call the function that sets up the tick interrupt. +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #error configCLEAR_TICK_INTERRUPT must be defined in FreeRTOSConfig.h to clear which ever interrupt was used to generate the tick interrupt. +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, IRQ enabled FIQ enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then +a floating point context must be saved and restored for the task. */ +volatile uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +volatile uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +volatile uint32_t ulPortInterruptNesting = 0UL; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm volatile ( "MRS %0, APSR" : "=r" ( ulAPSR ) ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Start the timer that generates the tick ISR. */ + portDISABLE_INTERRUPTS(); + configSETUP_TICK_INTERRUPT(); + + /* Start the first task executing. */ + vPortRestoreTaskContext(); + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. prvTaskExitError() is referenced to prevent a compiler + warning about it being defined but not referenced in the case that the user + defines their own exit address. */ + ( void ) prvTaskExitError; + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ +uint32_t ulInterruptStatus; + + ulInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulInterruptStatus ); + + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm volatile ( "FMXR FPSCR, %0" :: "r" (ulInitialFPSCR) ); +} +/*-----------------------------------------------------------*/ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portASM.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portASM.s new file mode 100644 index 0000000..e5f1ee1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portASM.s @@ -0,0 +1,248 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + +#include "FreeRTOSConfig.h" + + SECTION .text:CODE:ROOT(2) + arm + + /* Variables and functions. */ + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + EXTERN vApplicationIRQHandler + EXTERN ulPortInterruptNesting + EXTERN ulPortTaskHasFPUContext + EXTERN ulPortYieldRequired + EXTERN ulCriticalNesting + + PUBLIC FreeRTOS_IRQ_Handler + PUBLIC FreeRTOS_SVC_Handler + PUBLIC vPortRestoreTaskContext + +SYS_MODE EQU 0x1f +SVC_MODE EQU 0x13 +IRQ_MODE EQU 0x12 + +portSAVE_CONTEXT MACRO + + /* Save the LR and SPSR onto the system mode stack before switching to + system mode to save the remaining system mode registers. */ + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + /* Push the critical nesting count. */ + LDR R2, =ulCriticalNesting + LDR R1, [R2] + PUSH {R1} + + /* Does the task have a floating point context that needs saving? If + ulPortTaskHasFPUContext is 0 then no. */ + LDR R2, =ulPortTaskHasFPUContext + LDR R3, [R2] + CMP R3, #0 + + /* Save the floating point context, if any. */ + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} +#if configFPU_D32 == 1 + VPUSHNE {D16-D31} +#endif /* configFPU_D32 */ + PUSHNE {R1} + + /* Save ulPortTaskHasFPUContext itself. */ + PUSH {R3} + + /* Save the stack pointer in the TCB. */ + LDR R0, =pxCurrentTCB + LDR R1, [R0] + STR SP, [R1] + + ENDM + +; /**********************************************************************/ + +portRESTORE_CONTEXT MACRO + + /* Set the SP to point to the stack of the task being restored. */ + LDR R0, =pxCurrentTCB + LDR R1, [R0] + LDR SP, [R1] + + /* Is there a floating point context to restore? If the restored + ulPortTaskHasFPUContext is zero then no. */ + LDR R0, =ulPortTaskHasFPUContext + POP {R1} + STR R1, [R0] + CMP R1, #0 + + /* Restore the floating point context, if any. */ + POPNE {R0} +#if configFPU_D32 == 1 + VPOPNE {D16-D31} +#endif /* configFPU_D32 */ + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + /* Restore the critical section nesting depth. */ + LDR R0, =ulCriticalNesting + POP {R1} + STR R1, [R0] + + /* Restore all system mode registers other than the SP (which is already + being used). */ + POP {R0-R12, R14} + + /* Return to the task code, loading CPSR on the way. */ + RFEIA sp! + + ENDM + + + + +/****************************************************************************** + * SVC handler is used to yield. + *****************************************************************************/ +FreeRTOS_SVC_Handler: + /* Save the context of the current task and select a new task to run. */ + portSAVE_CONTEXT + LDR R0, =vTaskSwitchContext + BLX R0 + portRESTORE_CONTEXT + + +/****************************************************************************** + * vPortRestoreTaskContext is used to start the scheduler. + *****************************************************************************/ +vPortRestoreTaskContext: + /* Switch to system mode. */ + CPS #SYS_MODE + portRESTORE_CONTEXT + +FreeRTOS_IRQ_Handler: + /* Return to the interrupted instruction. */ + SUB lr, lr, #4 + + /* Push the return address and SPSR. */ + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + /* Change to supervisor mode to allow reentry. */ + CPS #SVC_MODE + + /* Push used registers. */ + PUSH {r0-r3, r12} + + /* Increment nesting count. r3 holds the address of ulPortInterruptNesting + for future use. r1 holds the original ulPortInterruptNesting value for + future use. */ + LDR r3, =ulPortInterruptNesting + LDR r1, [r3] + ADD r0, r1, #1 + STR r0, [r3] + + /* Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + future use. */ + MOV r0, sp + AND r2, r0, #4 + SUB sp, sp, r2 + + /* Call the interrupt handler. */ + PUSH {r0-r3, lr} + LDR r1, =vApplicationIRQHandler + BLX r1 + POP {r0-r3, lr} + ADD sp, sp, r2 + + CPSID i + DSB + ISB + + /* Write to the EOI register. */ + LDR r2, =configEOI_ADDRESS + STR r0, [r2] + + /* Restore the old nesting count. */ + STR r1, [r3] + + /* A context switch is never performed if the nesting count is not 0. */ + CMP r1, #0 + BNE exit_without_switch + + /* Did the interrupt request a context switch? r1 holds the address of + ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + use. */ + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch: + /* No context switch. Restore used registers, LR_irq and SPSR before + returning. */ + POP {r0-r3, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit: + /* A context swtich is to be performed. Clear the context switch pending + flag. */ + MOV r0, #0 + STR r0, [r1] + + /* Restore used registers, LR-irq and SPSR before saving the context + to the task stack. */ + POP {r0-r3, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + /* Call the function that selects the new task to execute. + vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + instructions, or 8 byte aligned stack allocated data. LR does not need + saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. */ + LDR R0, =vTaskSwitchContext + BLX R0 + + /* Restore the context of, and branch to, the task selected to execute + next. */ + portRESTORE_CONTEXT + + END + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portmacro.h new file mode 100644 index 0000000..613c714 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portmacro.h @@ -0,0 +1,182 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef uint32_t TickType_t; +#define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do +not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern volatile uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm volatile ( "SWI 0 \n" \ + "ISB " ); + + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); +extern void vPortInstallFreeRTOSVectorTable( void ); + +/* The I bit within the CPSR. */ +#define portINTERRUPT_ENABLE_BIT ( 1 << 7 ) + +/* In the absence of a priority mask register, these functions and macros +globally enable and disable interrupts. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portENABLE_INTERRUPTS() __asm volatile ( "CPSIE i \n" ); +#define portDISABLE_INTERRUPTS() __asm volatile ( "CPSID i \n" \ + "DSB \n" \ + "ISB " ); +#pragma inline +static inline uint32_t portINLINE_SET_INTERRUPT_MASK_FROM_ISR( void ) +{ +volatile uint32_t ulCPSR; + + __asm volatile ( "MRS %0, CPSR" : "=r" (ulCPSR) ); + ulCPSR &= portINTERRUPT_ENABLE_BIT; + portDISABLE_INTERRUPTS(); + return ulCPSR; +} + +#define portSET_INTERRUPT_MASK_FROM_ISR() portINLINE_SET_INTERRUPT_MASK_FROM_ISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) do { if( x == 0 ) portENABLE_INTERRUPTS(); } while( 0 ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __CLZ( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#define portNOP() __asm volatile( "NOP" ) +#define portINLINE inline + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in +the source code because to do so would cause other compilers to generate +warnings. */ +#pragma diag_suppress=Pe191 +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus + } /* extern C */ +#endif + + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/port.c new file mode 100644 index 0000000..86bbc8e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/port.c @@ -0,0 +1,340 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the AVR/IAR port. + *----------------------------------------------------------*/ + +/* Start tasks with interrupts enables. */ +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x80 ) + +/* Hardware constants for timer 1. */ +#define portCLEAR_COUNTER_ON_MATCH ( ( uint8_t ) 0x08 ) +#define portPRESCALE_64 ( ( uint8_t ) 0x03 ) +#define portCLOCK_PRESCALER ( ( uint32_t ) 64 ) +#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE ( ( uint8_t ) 0x10 ) + +/* The number of bytes used on the hardware stack by the task start address. */ +#define portBYTES_USED_BY_RETURN_ADDRESS ( 2 ) +/*-----------------------------------------------------------*/ + +/* Stores the critical section nesting. This must not be initialised to 0. +It will be initialised when a task starts. */ +#define portNO_CRITICAL_NESTING ( ( UBaseType_t ) 0 ) +UBaseType_t uxCriticalNesting = 0x50; + + +/* + * Perform hardware setup to enable ticks from timer 1, compare match A. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The IAR compiler does not have full support for inline assembler, so + * these are defined in the portmacro assembler file. + */ +extern void vPortYieldFromTick( void ); +extern void vPortStart( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t usAddress; +StackType_t *pxTopOfHardwareStack; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x11; + pxTopOfStack--; + *pxTopOfStack = 0x22; + pxTopOfStack--; + *pxTopOfStack = 0x33; + pxTopOfStack--; + + /* Remember where the top of the hardware stack is - this is required + below. */ + pxTopOfHardwareStack = pxTopOfStack; + + + /* Simulate how the stack would look after a call to vPortYield(). */ + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + + + /* The IAR compiler requires two stacks per task. First there is the + hardware call stack which uses the AVR stack pointer. Second there is the + software stack (local variables, parameter passing, etc.) which uses the + AVR Y register. + + This function places both stacks within the memory block passed in as the + first parameter. The hardware stack is placed at the bottom of the memory + block. A gap is then left for the hardware stack to grow. Next the software + stack is placed. The amount of space between the software and hardware + stacks is defined by configCALL_STACK_SIZE. + + + + The first part of the stack is the hardware stack. Place the start + address of the task on the hardware stack. */ + usAddress = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + + /* Leave enough space for the hardware stack before starting the software + stack. The '- 2' is because we have already used two spaces for the + address of the start of the task. */ + pxTopOfStack -= ( configCALL_STACK_SIZE - 2 ); + + + + /* Next simulate the stack as if after a call to portSAVE_CONTEXT(). + portSAVE_CONTEXT places the flags on the stack immediately after r0 + to ensure the interrupts get disabled as soon as possible, and so ensuring + the stack use is minimal should a context switch interrupt occur. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next place the address of the hardware stack. This is required so + the AVR stack pointer can be restored to point to the hardware stack. */ + pxTopOfHardwareStack -= portBYTES_USED_BY_RETURN_ADDRESS; + usAddress = ( uint16_t ) pxTopOfHardwareStack; + + /* SPL */ + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* SPH */ + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + + + + /* Now the remaining registers. */ + *pxTopOfStack = ( StackType_t ) 0x01; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R15 */ + pxTopOfStack--; + + /* Place the parameter on the stack in the expected location. */ + usAddress = ( uint16_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x18; /* R18 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R19 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x20; /* R20 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x21; /* R21 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22; /* R22 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x23; /* R23 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x24; /* R24 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x25; /* R25 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x26; /* R26 X */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x27; /* R27 */ + pxTopOfStack--; + + /* The Y register is not stored as it is used as the software stack and + gets saved into the task control block. */ + + *pxTopOfStack = ( StackType_t ) 0x30; /* R30 Z */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x031; /* R31 */ + + pxTopOfStack--; + *pxTopOfStack = portNO_CRITICAL_NESTING; /* Critical nesting is zero when the task starts. */ + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. + Normally we would just call portRESTORE_CONTEXT() here, but as the IAR + compiler does not fully support inline assembler we have to make a call.*/ + vPortStart(); + + /* Should not get here! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the AVR port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Setup timer 1 compare match A to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; +uint8_t ucHighByte, ucLowByte; + + /* Using 16bit timer 1 to generate the tick. Correct fuses must be + selected for the configCPU_CLOCK_HZ clock. */ + + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* We only have 16 bits so have to scale to get our required tick rate. */ + ulCompareMatch /= portCLOCK_PRESCALER; + + /* Adjust for correct value. */ + ulCompareMatch -= ( uint32_t ) 1; + + /* Setup compare match value for compare match A. Interrupts are disabled + before this is called so we need not worry here. */ + ucLowByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff ); + ulCompareMatch >>= 8; + ucHighByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff ); + OCR1AH = ucHighByte; + OCR1AL = ucLowByte; + + /* Setup clock source and compare match behaviour. */ + ucLowByte = portCLEAR_COUNTER_ON_MATCH | portPRESCALE_64; + TCCR1B = ucLowByte; + + /* Enable the interrupt - this is okay as interrupt are currently globally + disabled. */ + TIMSK |= portCOMPARE_MATCH_A_INTERRUPT_ENABLE; +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. We can use a __task attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + __task void SIG_OUTPUT_COMPARE1A( void ) + { + vPortYieldFromTick(); + asm( "reti" ); + } + +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + * + * THE INTERRUPT VECTOR IS POPULATED IN portmacro.s90. DO NOT INSTALL + * IT HERE USING THE USUAL PRAGMA. + */ + __interrupt void SIG_OUTPUT_COMPARE1A( void ) + { + xTaskIncrementTick(); + } +#endif +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == portNO_CRITICAL_NESTING ) + { + portENABLE_INTERRUPTS(); + } +} + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.h new file mode 100644 index 0000000..107c79f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.h @@ -0,0 +1,113 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V1.2.3 + + + portCPU_CLOSK_HZ definition changed to 8MHz base 10, previously it + base 16. +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char +#define portPOINTER_SIZE_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +#define portDISABLE_INTERRUPTS() asm( "cli" ) +#define portENABLE_INTERRUPTS() asm( "sei" ) +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 1 +#define portNOP() asm( "nop" ) +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +void vPortYield( void ); +#define portYIELD() vPortYield() + +#ifdef IAR_MEGA_AVR + #define outb( PORT, VALUE ) PORT = VALUE +#endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.s90 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.s90 new file mode 100644 index 0000000..ece9100 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.s90 @@ -0,0 +1,246 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + +#include + +; Declare all extern symbols here - including any ISRs that are referenced in +; the vector table. + +; ISR functions +; ------------- +EXTERN SIG_OUTPUT_COMPARE1A +EXTERN SIG_UART_RECV +EXTERN SIG_UART_DATA + + +; Functions used by scheduler +; --------------------------- +EXTERN vTaskSwitchContext +EXTERN pxCurrentTCB +EXTERN xTaskIncrementTick +EXTERN uxCriticalNesting + +; Functions implemented in this file +; ---------------------------------- +PUBLIC vPortYield +PUBLIC vPortYieldFromTick +PUBLIC vPortStart + + +; Interrupt vector table. +; ----------------------- +; +; For simplicity the RTOS tick interrupt routine uses the __task keyword. +; As the IAR compiler does not permit a function to be declared using both +; __task and __interrupt, the use of __task necessitates that the interrupt +; vector table be setup manually. +; +; To write an ISR, implement the ISR function using the __interrupt keyword +; but do not install the interrupt using the "#pragma vector=ABC" method. +; Instead manually place the name of the ISR in the vector table using an +; ORG and jmp instruction as demonstrated below. +; You will also have to add an EXTERN statement at the top of the file. + + ASEG + + + ORG TIMER1_COMPA_vect ; Vector address + jmp SIG_OUTPUT_COMPARE1A ; ISR + + ORG USART_RXC_vect ; Vector address + jmp SIG_UART_RECV ; ISR + + ORG USART_UDRE_vect ; Vector address + jmp SIG_UART_DATA ; ISR + + + RSEG CODE + + + +; Saving and Restoring a Task Context and Task Switching +; ------------------------------------------------------ +; +; The IAR compiler does not fully support inline assembler, so saving and +; restoring a task context has to be written in an asm file. +; +; vPortYield() and vPortYieldFromTick() are usually written in C. Doing +; so in this case would required calls to be made to portSAVE_CONTEXT() and +; portRESTORE_CONTEXT(). This is dis-advantageous as the context switch +; function would require two extra jump and return instructions over the +; WinAVR equivalent. +; +; To avoid this I have opted to implement both vPortYield() and +; vPortYieldFromTick() in this assembly file. For convenience +; portSAVE_CONTEXT and portRESTORE_CONTEXT are implemented as macros. + +portSAVE_CONTEXT MACRO + st -y, r0 ; First save the r0 register - we need to use this. + in r0, SREG ; Obtain the SREG value so we can disable interrupts... + cli ; ... as soon as possible. + st -y, r0 ; Store the SREG as it was before we disabled interrupts. + + in r0, SPL ; Next store the hardware stack pointer. The IAR... + st -y, r0 ; ... compiler uses the hardware stack as a call stack ... + in r0, SPH ; ... only. + st -y, r0 + + st -y, r1 ; Now store the rest of the registers. Dont store the ... + st -y, r2 ; ... the Y register here as it is used as the software + st -y, r3 ; stack pointer and will get saved into the TCB. + st -y, r4 + st -y, r5 + st -y, r6 + st -y, r7 + st -y, r8 + st -y, r9 + st -y, r10 + st -y, r11 + st -y, r12 + st -y, r13 + st -y, r14 + st -y, r15 + st -y, r16 + st -y, r17 + st -y, r18 + st -y, r19 + st -y, r20 + st -y, r21 + st -y, r22 + st -y, r23 + st -y, r24 + st -y, r25 + st -y, r26 + st -y, r27 + st -y, r30 + st -y, r31 + lds r0, uxCriticalNesting + st -y, r0 ; Store the critical nesting counter. + + lds r26, pxCurrentTCB ; Finally save the software stack pointer (Y ... + lds r27, pxCurrentTCB + 1 ; ... register) into the TCB. + st x+, r28 + st x+, r29 + + ENDM + + +portRESTORE_CONTEXT MACRO + lds r26, pxCurrentTCB + lds r27, pxCurrentTCB + 1 ; Restore the software stack pointer from ... + ld r28, x+ ; the TCB into the software stack pointer (... + ld r29, x+ ; ... the Y register). + + ld r0, y+ + sts uxCriticalNesting, r0 + ld r31, y+ ; Restore the registers down to R0. The Y + ld r30, y+ ; register is missing from this list as it + ld r27, y+ ; has already been restored. + ld r26, y+ + ld r25, y+ + ld r24, y+ + ld r23, y+ + ld r22, y+ + ld r21, y+ + ld r20, y+ + ld r19, y+ + ld r18, y+ + ld r17, y+ + ld r16, y+ + ld r15, y+ + ld r14, y+ + ld r13, y+ + ld r12, y+ + ld r11, y+ + ld r10, y+ + ld r9, y+ + ld r8, y+ + ld r7, y+ + ld r6, y+ + ld r5, y+ + ld r4, y+ + ld r3, y+ + ld r2, y+ + ld r1, y+ + + ld r0, y+ ; The next thing on the stack is the ... + out SPH, r0 ; ... hardware stack pointer. + ld r0, y+ + out SPL, r0 + + ld r0, y+ ; Next there is the SREG register. + out SREG, r0 + + ld r0, y+ ; Finally we have finished with r0, so restore r0. + + ENDM + + + +; vPortYield() and vPortYieldFromTick() +; ------------------------------------- +; +; Manual and preemptive context switch functions respectively. +; The IAR compiler does not fully support inline assembler, +; so these are implemented here rather than the more usually +; place of within port.c. + +vPortYield: + portSAVE_CONTEXT ; Save the context of the current task. + call vTaskSwitchContext ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ret ; ... scheduler decided should run. + +vPortYieldFromTick: + portSAVE_CONTEXT ; Save the context of the current task. + call xTaskIncrementTick ; Call the timer tick function. + tst r16 + breq SkipTaskSwitch + call vTaskSwitchContext ; Call the scheduler. +SkipTaskSwitch: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ret ; ... scheduler decided should run. + +; vPortStart() +; ------------ +; +; Again due to the lack of inline assembler, this is required +; to get access to the portRESTORE_CONTEXT macro. + +vPortStart: + portRESTORE_CONTEXT + ret + + +; Just a filler for unused interrupt vectors. +vNoISR: + reti + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/exception.s82 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/exception.s82 new file mode 100644 index 0000000..e5e1211 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/exception.s82 @@ -0,0 +1,340 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Exception and interrupt vectors. + * + * This file maps all events supported by an AVR32UC. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32UC devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation (Now Microchip): + https://www.microchip.com \n + * Support and FAQ: https://www.microchip.com/support + * + ******************************************************************************/ + +/* + * Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * 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. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``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 EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + */ + + +#include +#include "intc.h" + + +//! @{ +//! \verbatim + + +// Start of Exception Vector Table. + + // EVBA must be aligned with a power of two strictly greater than the EVBA- + // relative offset of the last vector. + COMMON EVTAB:CODE:ROOT(9) + + + // Force EVBA initialization. + EXTERN ??init_EVBA + REQUIRE ??init_EVBA + + // Export symbol. + PUBLIC ??EVBA + PUBLIC _evba +??EVBA: +_evba: + + ORG 0x000 + // Unrecoverable Exception. +_handle_Unrecoverable_Exception: + rjmp $ + + ORG 0x004 + // TLB Multiple Hit: UNUSED IN AVR32UC. +_handle_TLB_Multiple_Hit: + rjmp $ + + ORG 0x008 + // Bus Error Data Fetch. +_handle_Bus_Error_Data_Fetch: + rjmp $ + + ORG 0x00C + // Bus Error Instruction Fetch. +_handle_Bus_Error_Instruction_Fetch: + rjmp $ + + ORG 0x010 + // NMI. +_handle_NMI: + rjmp $ + + ORG 0x014 + // Instruction Address. +_handle_Instruction_Address: + rjmp $ + + ORG 0x018 + // ITLB Protection. +_handle_ITLB_Protection: + rjmp $ + + ORG 0x01C + // Breakpoint. +_handle_Breakpoint: + rjmp $ + + ORG 0x020 + // Illegal Opcode. +_handle_Illegal_Opcode: + rjmp $ + + ORG 0x024 + // Unimplemented Instruction. +_handle_Unimplemented_Instruction: + rjmp $ + + ORG 0x028 + // Privilege Violation. +_handle_Privilege_Violation: + rjmp $ + + ORG 0x02C + // Floating-Point: UNUSED IN AVR32UC. +_handle_Floating_Point: + rjmp $ + + ORG 0x030 + // Coprocessor Absent: UNUSED IN AVR32UC. +_handle_Coprocessor_Absent: + rjmp $ + + ORG 0x034 + // Data Address (Read). +_handle_Data_Address_Read: + rjmp $ + + ORG 0x038 + // Data Address (Write). +_handle_Data_Address_Write: + rjmp $ + + ORG 0x03C + // DTLB Protection (Read). +_handle_DTLB_Protection_Read: + rjmp $ + + ORG 0x040 + // DTLB Protection (Write). +_handle_DTLB_Protection_Write: + rjmp $ + + ORG 0x044 + // DTLB Modified: UNUSED IN AVR32UC. +_handle_DTLB_Modified: + rjmp $ + + ORG 0x050 + // ITLB Miss: UNUSED IN AVR32UC. +_handle_ITLB_Miss: + rjmp $ + + ORG 0x060 + // DTLB Miss (Read): UNUSED IN AVR32UC. +_handle_DTLB_Miss_Read: + rjmp $ + + ORG 0x070 + // DTLB Miss (Write): UNUSED IN AVR32UC. +_handle_DTLB_Miss_Write: + rjmp $ + + ORG 0x100 + // Supervisor Call. +_handle_Supervisor_Call: + lddpc pc, __SCALLYield + + +// Interrupt support. +// The interrupt controller must provide the offset address relative to EVBA. +// Important note: +// All interrupts call a C function named _get_interrupt_handler. +// This function will read group and interrupt line number to then return in +// R12 a pointer to a user-provided interrupt handler. + + ALIGN 2 + +_int0: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 110b + brlo _int0_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int0_normal: +#endif + mov r12, 0 // Pass the int_lev parameter to the _get_interrupt_handler function. + mcall __get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int1: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 110b + brlo _int1_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int1_normal: +#endif + mov r12, 1 // Pass the int_lev parameter to the _get_interrupt_handler function. + mcall __get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int2: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 110b + brlo _int2_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int2_normal: +#endif + mov r12, 2 // Pass the int_lev parameter to the _get_interrupt_handler function. + mcall __get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + +_int3: + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. +#if 1 // B1832: interrupt stack changed to exception stack if exception is detected. + mfsr r12, AVR32_SR + bfextu r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE + cp.w r12, 110b + brlo _int3_normal + lddsp r12, sp[0 * 4] + stdsp sp[6 * 4], r12 + lddsp r12, sp[1 * 4] + stdsp sp[7 * 4], r12 + lddsp r12, sp[3 * 4] + sub sp, -6 * 4 + rete +_int3_normal: +#endif + mov r12, 3 // Pass the int_lev parameter to the _get_interrupt_handler function. + mcall __get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + + +// Constant data area. + + ALIGN 2 + + // Import symbols. + EXTERN SCALLYield + EXTERN _get_interrupt_handler +__SCALLYield: + DC32 SCALLYield +__get_interrupt_handler: + DC32 _get_interrupt_handler + + // Values to store in the interrupt priority registers for the various interrupt priority levels. + // The interrupt priority registers contain the interrupt priority level and + // the EVBA-relative interrupt vector offset. + PUBLIC ipr_val +ipr_val: + DC32 (INT0 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int0 - _evba),\ + (INT1 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int1 - _evba),\ + (INT2 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int2 - _evba),\ + (INT3 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int3 - _evba) + + + END + + +//! \endverbatim +//! @} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/port.c new file mode 100644 index 0000000..b604652 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/port.c @@ -0,0 +1,435 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FreeRTOS port source for AVR32 UC3. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation (Now Microchip): + * https://www.microchip.com \n + * Support and FAQ: https://www.microchip.com/support/ + * + *****************************************************************************/ + +/* + * Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * 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. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``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 EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* AVR32 UC3 includes. */ +#include +#include +#include "gpio.h" + +#if configDBG + #include "usart.h" +#endif + +#if( configTICK_USE_TC==1 ) + #include "tc.h" +#endif + + +/* Constants required to setup the task context. */ +#define portINITIAL_SR ( ( StackType_t ) 0x00400000 ) /* AVR32 : [M2:M0]=001 I1M=0 I0M=0, GM=0 */ +#define portINSTRUCTION_SIZE ( ( StackType_t ) 0 ) + +/* Each task maintains its own critical nesting variable. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +#if( configTICK_USE_TC==0 ) + static void prvScheduleNextTick( void ); +#else + static void prvClearTcInt( void ); +#endif + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ + +/* + * Low-level initialization routine called during startup, before the main + * function. + */ +int __low_level_init(void) +{ + #if configHEAP_INIT + #pragma segment = "HEAP" + BaseType_t *pxMem; + #endif + + /* Enable exceptions. */ + ENABLE_ALL_EXCEPTIONS(); + + /* Initialize interrupt handling. */ + INTC_init_interrupts(); + + #if configHEAP_INIT + { + /* Initialize the heap used by malloc. */ + for( pxMem = __segment_begin( "HEAP" ); pxMem < ( BaseType_t * ) __segment_end( "HEAP" ); ) + { + *pxMem++ = 0xA5A5A5A5; + } + } + #endif + + /* Code section present if and only if the debug trace is activated. */ + #if configDBG + { + static const gpio_map_t DBG_USART_GPIO_MAP = + { + { configDBG_USART_RX_PIN, configDBG_USART_RX_FUNCTION }, + { configDBG_USART_TX_PIN, configDBG_USART_TX_FUNCTION } + }; + + static const usart_options_t DBG_USART_OPTIONS = + { + .baudrate = configDBG_USART_BAUDRATE, + .charlength = 8, + .paritytype = USART_NO_PARITY, + .stopbits = USART_1_STOPBIT, + .channelmode = USART_NORMAL_CHMODE + }; + + /* Initialize the USART used for the debug trace with the configured parameters. */ + extern volatile avr32_usart_t *volatile stdio_usart_base; + stdio_usart_base = configDBG_USART; + gpio_enable_module( DBG_USART_GPIO_MAP, + sizeof( DBG_USART_GPIO_MAP ) / sizeof( DBG_USART_GPIO_MAP[0] ) ); + usart_init_rs232(configDBG_USART, &DBG_USART_OPTIONS, configCPU_CLOCK_HZ); + } + #endif + + /* Request initialization of data segments. */ + return 1; +} +/*-----------------------------------------------------------*/ + +/* Added as there is no such function in FreeRTOS. */ +void *pvPortRealloc( void *pv, size_t xWantedSize ) +{ +void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = realloc( pv, xWantedSize ); + } + xTaskResumeAll(); + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +/* The cooperative scheduler requires a normal IRQ service routine to +simply increment the system tick. */ +/* The preemptive scheduler is defined as "naked" as the full context is saved +on entry as part of the context switch. */ +#pragma shadow_registers = full // Naked. +static void vTick( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT_OS_INT(); + + #if( configTICK_USE_TC==1 ) + /* Clear the interrupt flag. */ + prvClearTcInt(); + #else + /* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ) + clock cycles from now. */ + prvScheduleNextTick(); + #endif + + /* Because FreeRTOS is not supposed to run with nested interrupts, put all OS + calls in a critical section . */ + portENTER_CRITICAL(); + xTaskIncrementTick(); + portEXIT_CRITICAL(); + + /* Restore the context of the "elected task". */ + portRESTORE_CONTEXT_OS_INT(); +} +/*-----------------------------------------------------------*/ + +#pragma shadow_registers = full // Naked. +void SCALLYield( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT_SCALL(); + vTaskSwitchContext(); + portRESTORE_CONTEXT_SCALL(); +} +/*-----------------------------------------------------------*/ + +/* The code generated by the GCC compiler uses the stack in different ways at +different optimisation levels. The interrupt flags can therefore not always +be saved to the stack. Instead the critical section nesting level is stored +in a variable, which is then saved as part of the stack context. */ +#pragma optimize = no_inline +void vPortEnterCritical( void ) +{ + /* Disable interrupts */ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +#pragma optimize = no_inline +void vPortExitCritical( void ) +{ + if(ulCriticalNesting > portNO_CRITICAL_NESTING) + { + ulCriticalNesting--; + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable all interrupt/exception. */ + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* When the task starts, it will expect to find the function parameter in R12. */ + pxTopOfStack--; + *pxTopOfStack-- = ( StackType_t ) 0x08080808; /* R8 */ + *pxTopOfStack-- = ( StackType_t ) 0x09090909; /* R9 */ + *pxTopOfStack-- = ( StackType_t ) 0x0A0A0A0A; /* R10 */ + *pxTopOfStack-- = ( StackType_t ) 0x0B0B0B0B; /* R11 */ + *pxTopOfStack-- = ( StackType_t ) pvParameters; /* R12 */ + *pxTopOfStack-- = ( StackType_t ) 0xDEADBEEF; /* R14/LR */ + *pxTopOfStack-- = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; /* R15/PC */ + *pxTopOfStack-- = ( StackType_t ) portINITIAL_SR; /* SR */ + *pxTopOfStack-- = ( StackType_t ) 0xFF0000FF; /* R0 */ + *pxTopOfStack-- = ( StackType_t ) 0x01010101; /* R1 */ + *pxTopOfStack-- = ( StackType_t ) 0x02020202; /* R2 */ + *pxTopOfStack-- = ( StackType_t ) 0x03030303; /* R3 */ + *pxTopOfStack-- = ( StackType_t ) 0x04040404; /* R4 */ + *pxTopOfStack-- = ( StackType_t ) 0x05050505; /* R5 */ + *pxTopOfStack-- = ( StackType_t ) 0x06060606; /* R6 */ + *pxTopOfStack-- = ( StackType_t ) 0x07070707; /* R7 */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_NESTING; /* ulCriticalNesting */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + portRESTORE_CONTEXT(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the AVR32 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* Schedule the COUNT&COMPARE match interrupt in (configCPU_CLOCK_HZ/configTICK_RATE_HZ) +clock cycles from now. */ +#if( configTICK_USE_TC==0 ) + static void prvScheduleFirstTick(void) + { + uint32_t lCycles; + + lCycles = Get_system_register(AVR32_COUNT); + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception + // generation feature does not get disabled. + if(0 == lCycles) + { + lCycles++; + } + Set_system_register(AVR32_COMPARE, lCycles); + } + + #pragma optimize = no_inline + static void prvScheduleNextTick(void) + { + uint32_t lCycles, lCount; + + lCycles = Get_system_register(AVR32_COMPARE); + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + // If lCycles ends up to be 0, make it 1 so that the COMPARE and exception + // generation feature does not get disabled. + if(0 == lCycles) + { + lCycles++; + } + lCount = Get_system_register(AVR32_COUNT); + if( lCycles < lCount ) + { // We missed a tick, recover for the next. + lCycles += (configCPU_CLOCK_HZ/configTICK_RATE_HZ); + } + Set_system_register(AVR32_COMPARE, lCycles); + } +#else + #pragma optimize = no_inline + static void prvClearTcInt(void) + { + AVR32_TC.channel[configTICK_TC_CHANNEL].sr; + } +#endif +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt(void) +{ + #if( configTICK_USE_TC==1 ) + + volatile avr32_tc_t *tc = &AVR32_TC; + + // Options for waveform genration. + tc_waveform_opt_t waveform_opt = + { + .channel = configTICK_TC_CHANNEL, /* Channel selection. */ + + .bswtrg = TC_EVT_EFFECT_NOOP, /* Software trigger effect on TIOB. */ + .beevt = TC_EVT_EFFECT_NOOP, /* External event effect on TIOB. */ + .bcpc = TC_EVT_EFFECT_NOOP, /* RC compare effect on TIOB. */ + .bcpb = TC_EVT_EFFECT_NOOP, /* RB compare effect on TIOB. */ + + .aswtrg = TC_EVT_EFFECT_NOOP, /* Software trigger effect on TIOA. */ + .aeevt = TC_EVT_EFFECT_NOOP, /* External event effect on TIOA. */ + .acpc = TC_EVT_EFFECT_NOOP, /* RC compare effect on TIOA: toggle. */ + .acpa = TC_EVT_EFFECT_NOOP, /* RA compare effect on TIOA: toggle (other possibilities are none, set and clear). */ + + .wavsel = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,/* Waveform selection: Up mode without automatic trigger on RC compare. */ + .enetrg = FALSE, /* External event trigger enable. */ + .eevt = 0, /* External event selection. */ + .eevtedg = TC_SEL_NO_EDGE, /* External event edge selection. */ + .cpcdis = FALSE, /* Counter disable when RC compare. */ + .cpcstop = FALSE, /* Counter clock stopped with RC compare. */ + + .burst = FALSE, /* Burst signal selection. */ + .clki = FALSE, /* Clock inversion. */ + .tcclks = TC_CLOCK_SOURCE_TC2 /* Internal source clock 2. */ + }; + + tc_interrupt_t tc_interrupt = + { + .etrgs=0, + .ldrbs=0, + .ldras=0, + .cpcs =1, + .cpbs =0, + .cpas =0, + .lovrs=0, + .covfs=0, + }; + + #endif + + /* Disable all interrupt/exception. */ + portDISABLE_INTERRUPTS(); + + /* Register the compare interrupt handler to the interrupt controller and + enable the compare interrupt. */ + + #if( configTICK_USE_TC==1 ) + { + INTC_register_interrupt((__int_handler)&vTick, configTICK_TC_IRQ, INT0); + + /* Initialize the timer/counter. */ + tc_init_waveform(tc, &waveform_opt); + + /* Set the compare triggers. + Remember TC counter is 16-bits, so counting second is not possible! + That's why we configure it to count ms. */ + tc_write_rc( tc, configTICK_TC_CHANNEL, ( configPBA_CLOCK_HZ / 4) / configTICK_RATE_HZ ); + + tc_configure_interrupts( tc, configTICK_TC_CHANNEL, &tc_interrupt ); + + /* Start the timer/counter. */ + tc_start(tc, configTICK_TC_CHANNEL); + } + #else + { + INTC_register_interrupt((__int_handler)&vTick, AVR32_CORE_COMPARE_IRQ, INT0); + prvScheduleFirstTick(); + } + #endif +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/portmacro.h new file mode 100644 index 0000000..8c3f94f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/portmacro.h @@ -0,0 +1,684 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FreeRTOS port header for AVR32 UC3. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation (Now Microchip): + * https://www.microchip.com + * Support and FAQ: https://www.microchip.com/support + * + *****************************************************************************/ + +/* + * Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * 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. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``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 EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + */ + + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ +#include +#include "intc.h" +#include "compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#define TASK_DELAY_MS(x) ( (x) /portTICK_PERIOD_MS ) +#define TASK_DELAY_S(x) ( (x)*1000 /portTICK_PERIOD_MS ) +#define TASK_DELAY_MIN(x) ( (x)*60*1000/portTICK_PERIOD_MS ) + +#define configTICK_TC_IRQ ATPASTE2(AVR32_TC_IRQ, configTICK_TC_CHANNEL) + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() {__asm__ __volatile__ ("nop");} +/*-----------------------------------------------------------*/ + + +/*-----------------------------------------------------------*/ + +/* INTC-specific. */ +#define DISABLE_ALL_EXCEPTIONS() Disable_global_exception() +#define ENABLE_ALL_EXCEPTIONS() Enable_global_exception() + +#define DISABLE_ALL_INTERRUPTS() Disable_global_interrupt() +#define ENABLE_ALL_INTERRUPTS() Enable_global_interrupt() + +#define DISABLE_INT_LEVEL(int_lev) Disable_interrupt_level(int_lev) +#define ENABLE_INT_LEVEL(int_lev) Enable_interrupt_level(int_lev) + + +/* + * Debug trace. + * Activated if and only if configDBG is nonzero. + * Prints a formatted string to stdout. + * The current source file name and line number are output with a colon before + * the formatted string. + * A carriage return and a linefeed are appended to the output. + * stdout is redirected to the USART configured by configDBG_USART. + * The parameters are the same as for the standard printf function. + * There is no return value. + * SHALL NOT BE CALLED FROM WITHIN AN INTERRUPT as fputs and printf use malloc, + * which is interrupt-unsafe with the current __malloc_lock and __malloc_unlock. + */ +#if configDBG + #define portDBG_TRACE(...) \ + { \ + fputs(__FILE__ ":" ASTRINGZ(__LINE__) ": ", stdout); \ + printf(__VA_ARGS__); \ + fputs("\r\n", stdout); \ + } +#else + #define portDBG_TRACE(...) +#endif + + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() DISABLE_ALL_INTERRUPTS() +#define portENABLE_INTERRUPTS() ENABLE_ALL_INTERRUPTS() + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); + + +/* Added as there is no such function in FreeRTOS. */ +extern void *pvPortRealloc( void *pv, size_t xSize ); +/*-----------------------------------------------------------*/ + + +/*=============================================================================================*/ + +/* + * Restore Context for cases other than INTi. + */ +#define portRESTORE_CONTEXT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + __asm__ __volatile__ ( \ + /* Set SP to point to new stack */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + /* R0-R7 should not be used below this line */ \ + /* Skip PC and SR (will do it at the end) */ \ + "sub sp, -2*4 \n\t"\ + /* Restore R8..R12 and LR */ \ + "ldm sp++, r8-r12, lr \n\t"\ + /* Restore SR */ \ + "ld.w r0, sp[-8*4] \n\t" /* R0 is modified, is restored later. */\ + "mtsr "ASTRINGZ(AVR32_SR)", r0 \n\t"\ + /* Restore r0 */ \ + "ld.w r0, sp[-9*4] \n\t"\ + /* Restore PC */ \ + "ld.w pc, sp[-7*4]" /* Get PC from stack - PC is the 7th register saved */ \ + ); \ + \ + /* Force import of global symbols from assembly */ \ + ulCriticalNesting; \ + pxCurrentTCB; \ +} + + +/* + * portSAVE_CONTEXT_INT() and portRESTORE_CONTEXT_INT(): for INT0..3 exceptions. + * portSAVE_CONTEXT_SCALL() and portRESTORE_CONTEXT_SCALL(): for the scall exception. + * + * Had to make different versions because registers saved on the system stack + * are not the same between INT0..3 exceptions and the scall exception. + */ + +// Task context stack layout: + // R8 (*) + // R9 (*) + // R10 (*) + // R11 (*) + // R12 (*) + // R14/LR (*) + // R15/PC (*) + // SR (*) + // R0 + // R1 + // R2 + // R3 + // R4 + // R5 + // R6 + // R7 + // ulCriticalNesting +// (*) automatically done for INT0..INT3, but not for SCALL + +/* + * The ISR used for the scheduler tick depends on whether the cooperative or + * the preemptive scheduler is being used. + */ +#if configUSE_PREEMPTION == 0 + +/* + * portSAVE_CONTEXT_OS_INT() for OS Tick exception. + */ +#define portSAVE_CONTEXT_OS_INT() \ +{ \ + /* Save R0..R7 */ \ + __asm__ __volatile__ ("stm --sp, r0-r7"); \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context save. */ \ +} + +/* + * portRESTORE_CONTEXT_OS_INT() for Tick exception. + */ +#define portRESTORE_CONTEXT_OS_INT() \ +{ \ + __asm__ __volatile__ ( \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context restore. */ \ + "rete" \ + ); \ +} + +#else + +/* + * portSAVE_CONTEXT_OS_INT() for OS Tick exception. + */ +#define portSAVE_CONTEXT_OS_INT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* When we come here */ \ + /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */ \ + \ + __asm__ __volatile__ ( \ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0 \n\t"\ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_INT_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)" \n\t"\ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + /* NOTE: we don't enter a critical section here because all interrupt handlers */ \ + /* MUST perform a SAVE_CONTEXT/RESTORE_CONTEXT in the same way as */ \ + /* portSAVE_CONTEXT_OS_INT/port_RESTORE_CONTEXT_OS_INT if they call OS functions. */ \ + /* => all interrupt handlers must use portENTER_SWITCHING_ISR/portEXIT_SWITCHING_ISR. */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp \n"\ + \ + "LABEL_INT_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)":" \ + ); \ +} + +/* + * portRESTORE_CONTEXT_OS_INT() for Tick exception. + */ +#define portRESTORE_CONTEXT_OS_INT() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + __asm__ __volatile__ ( \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_INT_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__) \ + ); \ + \ + /* Else */ \ + /* because it is here safe, always call vTaskSwitchContext() since an OS tick occurred. */ \ + /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\ + portENTER_CRITICAL(); \ + vTaskSwitchContext(); \ + portEXIT_CRITICAL(); \ + \ + /* Restore all registers */ \ + \ + __asm__ __volatile__ ( \ + /* Set SP to point to new stack */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n"\ + \ + "LABEL_INT_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)": \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* Now, the stack should be R8..R12, LR, PC and SR */ \ + "rete" \ + ); \ + \ + /* Force import of global symbols from assembly */ \ + ulCriticalNesting; \ + pxCurrentTCB; \ +} + +#endif + + +/* + * portSAVE_CONTEXT_SCALL() for SupervisorCALL exception. + * + * NOTE: taskYIELD()(== SCALL) MUST NOT be called in a mode > supervisor mode. + * + */ +#define portSAVE_CONTEXT_SCALL() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Warning: the stack layout after SCALL doesn't match the one after an interrupt. */ \ + /* If SR[M2:M0] == 001 */ \ + /* PC and SR are on the stack. */ \ + /* Else (other modes) */ \ + /* Nothing on the stack. */ \ + \ + /* WARNING NOTE: the else case cannot happen as it is strictly forbidden to call */ \ + /* vTaskDelay() and vTaskDelayUntil() OS functions (that result in a taskYield()) */ \ + /* in an interrupt|exception handler. */ \ + \ + __asm__ __volatile__ ( \ + /* in order to save R0-R7 */ \ + "sub sp, 6*4 \n\t"\ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* in order to save R8-R12 and LR */ \ + /* do not use SP if interrupts occurs, SP must be left at bottom of stack */ \ + "sub r7, sp,-16*4 \n\t"\ + /* Copy PC and SR in other places in the stack. */ \ + "ld.w r0, r7[-2*4] \n\t" /* Read SR */\ + "st.w r7[-8*4], r0 \n\t" /* Copy SR */\ + "ld.w r0, r7[-1*4] \n\t" /* Read PC */\ + "st.w r7[-7*4], r0 \n\t" /* Copy PC */\ + \ + /* Save R8..R12 and LR on the stack. */ \ + "stm --r7, r8-r12, lr \n\t"\ + \ + /* Arriving here we have the following stack organizations: */ \ + /* R8..R12, LR, PC, SR, R0..R7. */ \ + \ + /* Now we can finalize the save. */ \ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0" \ + ); \ + \ + /* Disable the its which may cause a context switch (i.e. cause a change of */ \ + /* pxCurrentTCB). */ \ + /* Basically, all accesses to the pxCurrentTCB structure should be put in a */ \ + /* critical section because it is a global structure. */ \ + portENTER_CRITICAL(); \ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + __asm__ __volatile__ ( \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp" \ + ); \ +} + +/* + * portRESTORE_CONTEXT() for SupervisorCALL exception. + */ +#define portRESTORE_CONTEXT_SCALL() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* Restore all registers */ \ + \ + /* Set SP to point to new stack */ \ + __asm__ __volatile__ ( \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0]" \ + ); \ + \ + /* Leave pxCurrentTCB variable access critical section */ \ + portEXIT_CRITICAL(); \ + \ + __asm__ __volatile__ ( \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* skip PC and SR */ \ + /* do not use SP if interrupts occurs, SP must be left at bottom of stack */ \ + "sub r7, sp, -10*4 \n\t"\ + /* Restore r8-r12 and LR */ \ + "ldm r7++, r8-r12, lr \n\t"\ + \ + /* RETS will take care of the extra PC and SR restore. */ \ + /* So, we have to prepare the stack for this. */ \ + "ld.w r0, r7[-8*4] \n\t" /* Read SR */\ + "st.w r7[-2*4], r0 \n\t" /* Copy SR */\ + "ld.w r0, r7[-7*4] \n\t" /* Read PC */\ + "st.w r7[-1*4], r0 \n\t" /* Copy PC */\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + "sub sp, -6*4 \n\t"\ + \ + "rets" \ + ); \ + \ + /* Force import of global symbols from assembly */ \ + ulCriticalNesting; \ + pxCurrentTCB; \ +} + + +/* + * The ISR used depends on whether the cooperative or + * the preemptive scheduler is being used. + */ +#if configUSE_PREEMPTION == 0 + +/* + * ISR entry and exit macros. These are only required if a task switch + * is required from the ISR. + */ +#define portENTER_SWITCHING_ISR() \ +{ \ + /* Save R0..R7 */ \ + __asm__ __volatile__ ("stm --sp, r0-r7"); \ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context save. */ \ +} + +/* + * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1 + */ +#define portEXIT_SWITCHING_ISR() \ +{ \ + __asm__ __volatile__ ( \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* With the cooperative scheduler, as there is no context switch by interrupt, */ \ + /* there is also no context restore. */ \ + "rete" \ + ); \ +} + +#else + +/* + * ISR entry and exit macros. These are only required if a task switch + * is required from the ISR. + */ +#define portENTER_SWITCHING_ISR() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + /* When we come here */ \ + /* Registers R8..R12, LR, PC and SR had already been pushed to system stack */ \ + \ + __asm__ __volatile__ ( \ + /* Save R0..R7 */ \ + "stm --sp, r0-r7 \n\t"\ + \ + /* Save ulCriticalNesting variable - R0 is overwritten */ \ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w --sp, r0 \n\t"\ + \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case we don't want to do a task switch because we don't know what the stack */ \ + /* currently looks like (we don't know what the interrupted interrupt handler was doing). */ \ + /* Saving SP in pxCurrentTCB and then later restoring it (thinking restoring the task) */ \ + /* will just be restoring the interrupt handler, no way!!! */ \ + /* So, since we won't do a vTaskSwitchContext(), it's of no use to save SP. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_ISR_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)" \n\t"\ + \ + /* Store SP in the first member of the structure pointed to by pxCurrentTCB */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "st.w r0[0], sp \n"\ + \ + "LABEL_ISR_SKIP_SAVE_CONTEXT_"ASTRINGZ(__LINE__)":" \ + ); \ +} + + +/* + * Input parameter: in R12, boolean. Perform a vTaskSwitchContext() if 1 + */ +#define portEXIT_SWITCHING_ISR() \ +{ \ + extern volatile uint32_t ulCriticalNesting; \ + extern volatile void *volatile pxCurrentTCB; \ + \ + __asm__ __volatile__ ( \ + /* Check if INT0 or higher were being handled (case where the OS tick interrupted another */ \ + /* interrupt handler (which was of a higher priority level but decided to lower its priority */ \ + /* level and allow other lower interrupt level to occur). */ \ + /* In this case it's of no use to switch context and restore a new SP because we purposedly */ \ + /* did not previously save SP in its TCB. */ \ + "ld.w r0, sp[9*4] \n\t" /* Read SR in stack */\ + "bfextu r0, r0, 22, 3 \n\t" /* Extract the mode bits to R0. */\ + "cp.w r0, 1 \n\t" /* Compare the mode bits with supervisor mode(b'001) */\ + "brhi LABEL_ISR_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)" \n\t"\ + \ + /* If a switch is required then we just need to call */ \ + /* vTaskSwitchContext() as the context has already been */ \ + /* saved. */ \ + "cp.w r12, 1 \n\t" /* Check if Switch context is required. */\ + "brne LABEL_ISR_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)":C" \ + ); \ + \ + /* A critical section has to be used here because vTaskSwitchContext handles FreeRTOS linked lists. */\ + portENTER_CRITICAL(); \ + vTaskSwitchContext(); \ + portEXIT_CRITICAL(); \ + \ + __asm__ __volatile__ ( \ + "LABEL_ISR_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)": \n\t"\ + /* Restore the context of which ever task is now the highest */ \ + /* priority that is ready to run. */ \ + \ + /* Restore all registers */ \ + \ + /* Set SP to point to new stack */ \ + "mov r8, LWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(pxCurrentTCB)") \n\t"\ + "ld.w r0, r8[0] \n\t"\ + "ld.w sp, r0[0] \n"\ + \ + "LABEL_ISR_SKIP_RESTORE_CONTEXT_"ASTRINGZ(__LINE__)": \n\t"\ + \ + /* Restore ulCriticalNesting variable */ \ + "ld.w r0, sp++ \n\t"\ + "mov r8, LWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "orh r8, HWRD("ASTRINGZ(ulCriticalNesting)") \n\t"\ + "st.w r8[0], r0 \n\t"\ + \ + /* Restore R0..R7 */ \ + "ldm sp++, r0-r7 \n\t"\ + \ + /* Now, the stack should be R8..R12, LR, PC and SR */ \ + "rete" \ + ); \ + \ + /* Force import of global symbols from assembly */ \ + ulCriticalNesting; \ + pxCurrentTCB; \ +} + +#endif + + +#define portYIELD() {__asm__ __volatile__ ("scall");} + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/read.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/read.c new file mode 100644 index 0000000..68406fc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/read.c @@ -0,0 +1,123 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief System-specific implementation of the \ref __read function used by + the standard library. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * - AppNote: + * + * \author Atmel Corporation (Now Microchip): + * https://www.microchip.com \n + * Support and FAQ: https://www.microchip.com/support/ + * + ******************************************************************************/ + +/* + * Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * 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. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``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 EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + */ + + +#include +#include +#include "usart.h" + + +_STD_BEGIN + + +#pragma module_name = "?__read" + + +extern volatile avr32_usart_t *volatile stdio_usart_base; + + +/*! \brief Reads a number of bytes, at most \a size, into the memory area + * pointed to by \a buffer. + * + * \param handle File handle to read from. + * \param buffer Pointer to buffer to write read bytes to. + * \param size Number of bytes to read. + * + * \return The number of bytes read, \c 0 at the end of the file, or + * \c _LLIO_ERROR on failure. + */ +size_t __read(int handle, uint8_t *buffer, size_t size) +{ + int nChars = 0; + + // This implementation only reads from stdin. + // For all other file handles, it returns failure. + if (handle != _LLIO_STDIN) + { + return _LLIO_ERROR; + } + + for (; size > 0; --size) + { + int c = usart_getchar(stdio_usart_base); + if (c < 0) + break; + + *buffer++ = c; + ++nChars; + } + + return nChars; +} + + +_STD_END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/write.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/write.c new file mode 100644 index 0000000..3ddab90 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/write.c @@ -0,0 +1,133 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief System-specific implementation of the \ref __write function used by + the standard library. + * + * - Compiler: IAR EWAVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * - AppNote: + * + * \author Atmel Corporation (Now Microchip): + * https://www.microchip.com \n + * Support and FAQ: https://www.microchip.com/support + * + ******************************************************************************/ + +/* + * Copyright (c) 2007, Atmel Corporation All rights reserved. + * + * 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. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``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 EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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. + */ + + +#include +#include +#include "usart.h" + + +_STD_BEGIN + + +#pragma module_name = "?__write" + + +//! Pointer to the base of the USART module instance to use for stdio. +__no_init volatile avr32_usart_t *volatile stdio_usart_base; + + +/*! \brief Writes a number of bytes, at most \a size, from the memory area + * pointed to by \a buffer. + * + * If \a buffer is zero then \ref __write performs flushing of internal buffers, + * if any. In this case, \a handle can be \c -1 to indicate that all handles + * should be flushed. + * + * \param handle File handle to write to. + * \param buffer Pointer to buffer to read bytes to write from. + * \param size Number of bytes to write. + * + * \return The number of bytes written, or \c _LLIO_ERROR on failure. + */ +size_t __write(int handle, const uint8_t *buffer, size_t size) +{ + size_t nChars = 0; + + if (buffer == 0) + { + // This means that we should flush internal buffers. + return 0; + } + + // This implementation only writes to stdout and stderr. + // For all other file handles, it returns failure. + if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) + { + return _LLIO_ERROR; + } + + for (; size != 0; --size) + { + if (usart_putchar(stdio_usart_base, *buffer++) < 0) + { + return _LLIO_ERROR; + } + + ++nChars; + } + + return nChars; +} + + +_STD_END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/port.c new file mode 100644 index 0000000..95e6887 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/port.c @@ -0,0 +1,301 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include +#include "porthardware.h" +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the AVR port. +*----------------------------------------------------------*/ + +/* Start tasks with interrupts enables. */ +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x80 ) + +/*-----------------------------------------------------------*/ + + +#define portBYTES_USED_BY_RETURN_ADDRESS 2 +#define portNO_CRITICAL_NESTING ( ( UBaseType_t ) 0 ) + +/* Stores the critical section nesting. This must not be initialised to 0. + * It will be initialised when a task starts. */ +UBaseType_t uxCriticalNesting = 0x50; + +/* + * Setup timer to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The IAR compiler does not have full support for inline assembler, so + * these are defined in the portmacro assembler file. + */ +extern void vPortYieldFromTick( void ); +extern void vPortStart( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + uint16_t usAddress; + StackType_t * pxTopOfHardwareStack; + + /* Simulate how the stack would look after a call to vPortYield(). */ + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* The IAR compiler requires two stacks per task. First there is the + * hardware call stack which uses the AVR stack pointer. Second there is the + * software stack (local variables, parameter passing, etc.) which uses the + * AVR Y register. + * This function places both stacks within the memory block passed in as the + * first parameter. The hardware stack is placed at the bottom of the memory + * block. A gap is then left for the hardware stack to grow. Next the software + * stack is placed. The amount of space between the software and hardware + * stacks is defined by configCALL_STACK_SIZE. + * The first part of the stack is the hardware stack. Place the start + * address of the task on the hardware stack. */ + + /* Place a few bytes of known values on the bottom of the stack. + * This is just useful for debugging. */ + /**pxTopOfStack = 0x11; */ + /*pxTopOfStack--; */ + /**pxTopOfStack = 0x22; */ + /*pxTopOfStack--; */ + /**pxTopOfStack = 0x33; */ + /*pxTopOfStack--; */ + + /* Remember where the top of the hardware stack is - this is required + * below. */ + pxTopOfHardwareStack = pxTopOfStack; + + usAddress = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* Leave enough space for the hardware stack before starting the software + * stack. The '- 2' is because we have already used two spaces for the + * address of the start of the task. */ + pxTopOfStack -= ( configCALL_STACK_SIZE - 2 ); + + /* Next simulate the stack as if after a call to portSAVE_CONTEXT(). + * portSAVE_CONTEXT places the flags on the stack immediately after r0 + * to ensure the interrupts get disabled as soon as possible, and so ensuring + * the stack use is minimal should a context switch interrupt occur. */ + + *pxTopOfStack = ( StackType_t ) 0x00; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00; /* RAMPZ */ + pxTopOfStack--; + + /* Next place the address of the hardware stack. This is required so + * the AVR stack pointer can be restored to point to the hardware stack. */ + pxTopOfHardwareStack -= portBYTES_USED_BY_RETURN_ADDRESS; + usAddress = ( uint16_t ) pxTopOfHardwareStack; + + /* SPL */ + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* SPH */ + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* Now the remaining registers. */ + *pxTopOfStack = ( StackType_t ) 0x01; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R15 */ + pxTopOfStack--; + + /* Place the parameter on the stack in the expected location. */ + usAddress = ( uint16_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x18; /* R18 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R19 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x20; /* R20 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x21; /* R21 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22; /* R22 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x23; /* R23 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x24; /* R24 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x25; /* R25 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x26; /* R26 X */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x27; /* R27 */ + pxTopOfStack--; + + /* The Y register is not stored as it is used as the software stack and + * gets saved into the task control block. */ + + *pxTopOfStack = ( StackType_t ) 0x30; /* R30 Z */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x031; /* R31 */ + + pxTopOfStack--; + *pxTopOfStack = portNO_CRITICAL_NESTING; /* Critical nesting is zero when the task starts. */ + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. + * Normally we would just call portRESTORE_CONTEXT() here, but as the IAR + * compiler does not fully support inline assembler we have to make a call.*/ + vPortStart(); + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* vPortEndScheduler is not implemented in this port. */ +} + +/*-----------------------------------------------------------*/ + +/* + * Setup timer to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ + TICK_init(); +} + +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + +/* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + + __task void TICK_INT( void ) + { + vPortYieldFromTick(); + asm ( "reti" ); + } +#else + +/* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + + __interrupt void TICK_INT( void ) + { + /* Clear tick interrupt flag. */ + INT_FLAGS = INT_MASK; + + xTaskIncrementTick(); + } +#endif /* if configUSE_PREEMPTION == 1 */ + +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +} + +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + + if( uxCriticalNesting == portNO_CRITICAL_NESTING ) + { + portENABLE_INTERRUPTS(); + } +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/porthardware.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/porthardware.h new file mode 100644 index 0000000..4970b1a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/porthardware.h @@ -0,0 +1,129 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +#ifndef PORTHARDWARE_H +#define PORTHARDWARE_H + +#ifndef __IAR_SYSTEMS_ASM__ + #include +#endif +#include "FreeRTOSConfig.h" + +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMER_INSTANCE == 0 ) + + #define TICK_INT_vect TCB0_INT_vect + #define INT_FLAGS TCB0_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB0.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB0.INTCTRL = TCB_CAPT_bm; \ + TCB0.CTRLA = TCB_ENABLE_bm; \ + } + +#elif ( configUSE_TIMER_INSTANCE == 1 ) + + #define TICK_INT_vect TCB1_INT_vect + #define INT_FLAGS TCB1_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB1.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB1.INTCTRL = TCB_CAPT_bm; \ + TCB1.CTRLA = TCB_ENABLE_bm; \ + } + +#elif ( configUSE_TIMER_INSTANCE == 2 ) + + #define TICK_INT_vect TCB2_INT_vect + #define INT_FLAGS TCB2_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB2.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB2.INTCTRL = TCB_CAPT_bm; \ + TCB2.CTRLA = TCB_ENABLE_bm; \ + } + +#elif ( configUSE_TIMER_INSTANCE == 3 ) + + #define TICK_INT_vect TCB3_INT_vect + #define INT_FLAGS TCB3_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB3.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB3.INTCTRL = TCB_CAPT_bm; \ + TCB3.CTRLA = TCB_ENABLE_bm; \ + } + +#elif ( configUSE_TIMER_INSTANCE == 4 ) + + #define TICK_INT_vect TCB4_INT_vect + #define INT_FLAGS TCB4_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB4.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB4.INTCTRL = TCB_CAPT_bm; \ + TCB4.CTRLA = TCB_ENABLE_bm; \ + } + +#elif ( configUSE_TIMER_INSTANCE == 5 ) + + #define TICK_INT_vect RTC_CNT_vect + #define INT_FLAGS RTC_INTFLAGS + #define INT_MASK RTC_OVF_bm + +/* Hertz to period for RTC setup */ + #define RTC_PERIOD_HZ( x ) ( 32768 * ( ( 1.0 / x ) ) ) + #define TICK_init() \ + { \ + while( RTC.STATUS > 0 ) {; } \ + RTC.CTRLA = RTC_PRESCALER_DIV1_gc | 1 << RTC_RTCEN_bp; \ + RTC.PER = RTC_PERIOD_HZ( configTICK_RATE_HZ ); \ + RTC.INTCTRL |= 1 << RTC_OVF_bp; \ + } + +#else /* if ( configUSE_TIMER_INSTANCE == 0 ) */ + #undef TICK_INT_vect + #undef INT_FLAGS + #undef INT_MASK + #undef TICK_init() + #error Invalid timer setting. +#endif /* if ( configUSE_TIMER_INSTANCE == 0 ) */ + +/*-----------------------------------------------------------*/ + +#endif /* PORTHARDWARE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.h new file mode 100644 index 0000000..17a1a2a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.h @@ -0,0 +1,109 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +#define portPOINTER_SIZE_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +#define portDISABLE_INTERRUPTS() asm ( "cli" ) +#define portENABLE_INTERRUPTS() asm ( "sei" ) +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 1 +#define portNOP() asm ( "nop" ) +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() + +extern void vPortYieldFromISR( void ); +#define portYIELD_FROM_ISR() vPortYieldFromISR() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.s90 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.s90 new file mode 100644 index 0000000..43b144c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.s90 @@ -0,0 +1,255 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + +#include "porthardware.h" + +; Declare all extern symbols here - including any ISRs that are referenced in +; the vector table. + +; ISR functions +; ------------- +EXTERN TICK_INT + +; Functions used by scheduler +; --------------------------- +EXTERN vTaskSwitchContext +EXTERN pxCurrentTCB +EXTERN xTaskIncrementTick +EXTERN uxCriticalNesting + +; Functions implemented in this file +; ---------------------------------- +PUBLIC vPortYield +PUBLIC vPortYieldFromTick +PUBLIC vPortYieldFromISR +PUBLIC vPortStart + +; Interrupt vector table. +; ----------------------- +; +; For simplicity the RTOS tick interrupt routine uses the __task keyword. +; As the IAR compiler does not permit a function to be declared using both +; __task and __interrupt, the use of __task necessitates that the interrupt +; vector table be setup manually. +; +; To write an ISR, implement the ISR function using the __interrupt keyword +; but do not install the interrupt using the "#pragma vector=ABC" method. +; Instead manually place the name of the ISR in the vector table using an +; ORG and jmp instruction as demonstrated below. +; You will also have to add an EXTERN statement at the top of the file. + + ASEG + + ORG TICK_INT_vect ; Vector address + jmp TICK_INT ; ISR + + RSEG CODE + +CLR_INT MACRO FLAG_REG, FLAG_MASK + st -y, r16 + ldi r16, FLAG_MASK + sts FLAG_REG, r16 + ld r16, y+ + + ENDM + +; Saving and Restoring a Task Context and Task Switching +; ------------------------------------------------------ +; +; The IAR compiler does not fully support inline assembler, so saving and +; restoring a task context has to be written in an asm file. +; +; vPortYield() and vPortYieldFromTick() are usually written in C. Doing +; so in this case would required calls to be made to portSAVE_CONTEXT() and +; portRESTORE_CONTEXT(). This is dis-advantageous as the context switch +; function would require two extra jump and return instructions over the +; WinAVR equivalent. +; +; To avoid this I have opted to implement both vPortYield() and +; vPortYieldFromTick() in this assembly file. For convenience +; portSAVE_CONTEXT and portRESTORE_CONTEXT are implemented as macros. + +portSAVE_CONTEXT MACRO + st -y, r0 ; First save the r0 register - we need to use this. + in r0, SREG ; Obtain the SREG value so we can disable interrupts... + cli ; ... as soon as possible. + st -y, r0 ; Store the SREG as it was before we disabled interrupts. + + in r0, RAMPZ + st -y, r0 + + in r0, SPL ; Next store the hardware stack pointer. The IAR... + st -y, r0 ; ... compiler uses the hardware stack as a call stack ... + in r0, SPH ; ... only. + st -y, r0 + + st -y, r1 ; Now store the rest of the registers. Dont store the ... + st -y, r2 ; ... the Y register here as it is used as the software + st -y, r3 ; stack pointer and will get saved into the TCB. + st -y, r4 + st -y, r5 + st -y, r6 + st -y, r7 + st -y, r8 + st -y, r9 + st -y, r10 + st -y, r11 + st -y, r12 + st -y, r13 + st -y, r14 + st -y, r15 + st -y, r16 + st -y, r17 + st -y, r18 + st -y, r19 + st -y, r20 + st -y, r21 + st -y, r22 + st -y, r23 + st -y, r24 + st -y, r25 + st -y, r26 + st -y, r27 + st -y, r30 + st -y, r31 + + lds r0, uxCriticalNesting + st -y, r0 ; Store the critical nesting counter. + + lds r26, pxCurrentTCB ; Finally save the software stack pointer (Y ... + lds r27, pxCurrentTCB + 1 ; ... register) into the TCB. + st x+, r28 + st x+, r29 + + ENDM + + +portRESTORE_CONTEXT MACRO + lds r26, pxCurrentTCB + lds r27, pxCurrentTCB + 1 ; Restore the software stack pointer from ... + ld r28, x+ ; the TCB into the software stack pointer (... + ld r29, x+ ; ... the Y register). + + ld r0, y+ + sts uxCriticalNesting, r0 + + ld r31, y+ ; Restore the registers down to R0. The Y + ld r30, y+ ; register is missing from this list as it + ld r27, y+ ; has already been restored. + ld r26, y+ + ld r25, y+ + ld r24, y+ + ld r23, y+ + ld r22, y+ + ld r21, y+ + ld r20, y+ + ld r19, y+ + ld r18, y+ + ld r17, y+ + ld r16, y+ + ld r15, y+ + ld r14, y+ + ld r13, y+ + ld r12, y+ + ld r11, y+ + ld r10, y+ + ld r9, y+ + ld r8, y+ + ld r7, y+ + ld r6, y+ + ld r5, y+ + ld r4, y+ + ld r3, y+ + ld r2, y+ + ld r1, y+ + + ld r0, y+ ; The next thing on the stack is the ... + out SPH, r0 ; ... hardware stack pointer. + ld r0, y+ + out SPL, r0 + + ld r0, y+ + out RAMPZ, r0 + + ld r0, y+ ; Next there is the SREG register. + out SREG, r0 + + ld r0, y+ ; Finally we have finished with r0, so restore r0. + + ENDM + + + +; vPortYield(), vPortYieldFromTick() and vPortYieldFromISR() +; ------------------------------------- +; +; Manual and preemptive context switch functions respectively. +; The IAR compiler does not fully support inline assembler, +; so these are implemented here rather than the more usually +; place of within port.c. + +vPortYield: + portSAVE_CONTEXT ; Save the context of the current task. + call vTaskSwitchContext ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ret ; ... scheduler decided should run. + +vPortYieldFromTick: + CLR_INT INT_FLAGS, INT_MASK ; Clear tick interrupt flag + + portSAVE_CONTEXT ; Save the context of the current task. + call xTaskIncrementTick ; Call the timer tick function. + tst r16 + breq SkipTaskSwitch + call vTaskSwitchContext ; Call the scheduler. + +SkipTaskSwitch: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + reti ; ... scheduler decided should run. + +vPortYieldFromISR: + portSAVE_CONTEXT ; Save the context of the current task. + call vTaskSwitchContext ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + reti ; ... scheduler decided should run. + +; vPortStart() +; ------------ +; +; Again due to the lack of inline assembler, this is required +; to get access to the portRESTORE_CONTEXT macro. + +vPortStart: + portRESTORE_CONTEXT + ret + +; Just a filler for unused interrupt vectors. +vNoISR: + reti + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/port.c new file mode 100644 index 0000000..7afea8c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/port.c @@ -0,0 +1,299 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include +#include "porthardware.h" +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the AVR port. +*----------------------------------------------------------*/ + +/* Start tasks with interrupts enables. */ +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x80 ) + +/*-----------------------------------------------------------*/ + + +#define portBYTES_USED_BY_RETURN_ADDRESS 2 +#define portNO_CRITICAL_NESTING ( ( UBaseType_t ) 0 ) + +/* Stores the critical section nesting. This must not be initialised to 0. + * It will be initialised when a task starts. */ +UBaseType_t uxCriticalNesting = 0x50; + +/* + * Setup timer to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * The IAR compiler does not have full support for inline assembler, so + * these are defined in the portmacro assembler file. + */ +extern void vPortYieldFromTick( void ); +extern void vPortStart( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + uint16_t usAddress; + StackType_t * pxTopOfHardwareStack; + + /* Simulate how the stack would look after a call to vPortYield(). */ + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* The IAR compiler requires two stacks per task. First there is the + * hardware call stack which uses the AVR stack pointer. Second there is the + * software stack (local variables, parameter passing, etc.) which uses the + * AVR Y register. + * This function places both stacks within the memory block passed in as the + * first parameter. The hardware stack is placed at the bottom of the memory + * block. A gap is then left for the hardware stack to grow. Next the software + * stack is placed. The amount of space between the software and hardware + * stacks is defined by configCALL_STACK_SIZE. + * The first part of the stack is the hardware stack. Place the start + * address of the task on the hardware stack. */ + + /* Place a few bytes of known values on the bottom of the stack. + * This is just useful for debugging. */ + /**pxTopOfStack = 0x11; */ + /*pxTopOfStack--; */ + /**pxTopOfStack = 0x22; */ + /*pxTopOfStack--; */ + /**pxTopOfStack = 0x33; */ + /*pxTopOfStack--; */ + + /* Remember where the top of the hardware stack is - this is required + * below. */ + pxTopOfHardwareStack = pxTopOfStack; + + usAddress = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* Leave enough space for the hardware stack before starting the software + * stack. The '- 2' is because we have already used two spaces for the + * address of the start of the task. */ + pxTopOfStack -= ( configCALL_STACK_SIZE - 2 ); + + /* Next simulate the stack as if after a call to portSAVE_CONTEXT(). + * portSAVE_CONTEXT places the flags on the stack immediately after r0 + * to ensure the interrupts get disabled as soon as possible, and so ensuring + * the stack use is minimal should a context switch interrupt occur. */ + + *pxTopOfStack = ( StackType_t ) 0x00; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next place the address of the hardware stack. This is required so + * the AVR stack pointer can be restored to point to the hardware stack. */ + pxTopOfHardwareStack -= portBYTES_USED_BY_RETURN_ADDRESS; + usAddress = ( uint16_t ) pxTopOfHardwareStack; + + /* SPL */ + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* SPH */ + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* Now the remaining registers. */ + *pxTopOfStack = ( StackType_t ) 0x01; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15; /* R15 */ + pxTopOfStack--; + + /* Place the parameter on the stack in the expected location. */ + usAddress = ( uint16_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x18; /* R18 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19; /* R19 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x20; /* R20 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x21; /* R21 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22; /* R22 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x23; /* R23 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x24; /* R24 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x25; /* R25 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x26; /* R26 X */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x27; /* R27 */ + pxTopOfStack--; + + /* The Y register is not stored as it is used as the software stack and + * gets saved into the task control block. */ + + *pxTopOfStack = ( StackType_t ) 0x30; /* R30 Z */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x031; /* R31 */ + + pxTopOfStack--; + *pxTopOfStack = portNO_CRITICAL_NESTING; /* Critical nesting is zero when the task starts. */ + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. + * Normally we would just call portRESTORE_CONTEXT() here, but as the IAR + * compiler does not fully support inline assembler we have to make a call.*/ + vPortStart(); + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* vPortEndScheduler is not implemented in this port. */ +} + +/*-----------------------------------------------------------*/ + +/* + * Setup timer to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ + TICK_init(); +} + +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + +/* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + + __task void TICK_INT( void ) + { + vPortYieldFromTick(); + asm ( "reti" ); + } +#else + +/* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + + __interrupt void TICK_INT( void ) + { + /* Clear tick interrupt flag. */ + INT_FLAGS = INT_MASK; + + xTaskIncrementTick(); + } +#endif /* if configUSE_PREEMPTION == 1 */ + +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +} + +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + + if( uxCriticalNesting == portNO_CRITICAL_NESTING ) + { + portENABLE_INTERRUPTS(); + } +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/porthardware.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/porthardware.h new file mode 100644 index 0000000..9858e52 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/porthardware.h @@ -0,0 +1,116 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +#ifndef PORTHARDWARE_H +#define PORTHARDWARE_H + +#ifndef __IAR_SYSTEMS_ASM__ + #include +#endif +#include "FreeRTOSConfig.h" + +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMER_INSTANCE == 0 ) + + #define TICK_INT_vect TCB0_INT_vect + #define INT_FLAGS TCB0_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB0.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB0.INTCTRL = TCB_CAPT_bm; \ + TCB0.CTRLA = TCB_ENABLE_bm; \ + } + +#elif ( configUSE_TIMER_INSTANCE == 1 ) + + #define TICK_INT_vect TCB1_INT_vect + #define INT_FLAGS TCB1_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB1.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB1.INTCTRL = TCB_CAPT_bm; \ + TCB1.CTRLA = TCB_ENABLE_bm; \ + } + +#elif ( configUSE_TIMER_INSTANCE == 2 ) + + #define TICK_INT_vect TCB2_INT_vect + #define INT_FLAGS TCB2_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB2.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB2.INTCTRL = TCB_CAPT_bm; \ + TCB2.CTRLA = TCB_ENABLE_bm; \ + } + +#elif ( configUSE_TIMER_INSTANCE == 3 ) + + #define TICK_INT_vect TCB3_INT_vect + #define INT_FLAGS TCB3_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB3.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB3.INTCTRL = TCB_CAPT_bm; \ + TCB3.CTRLA = TCB_ENABLE_bm; \ + } + +#elif ( configUSE_TIMER_INSTANCE == 4 ) + + #define TICK_INT_vect RTC_CNT_vect + #define INT_FLAGS RTC_INTFLAGS + #define INT_MASK RTC_OVF_bm + +/* Hertz to period for RTC setup */ + #define RTC_PERIOD_HZ( x ) ( 32768 * ( ( 1.0 / x ) ) ) + #define TICK_init() \ + { \ + while( RTC.STATUS > 0 ) {; } \ + RTC.CTRLA = RTC_PRESCALER_DIV1_gc | 1 << RTC_RTCEN_bp; \ + RTC.PER = RTC_PERIOD_HZ( configTICK_RATE_HZ ); \ + RTC.INTCTRL |= 1 << RTC_OVF_bp; \ + } + +#else /* if ( configUSE_TIMER_INSTANCE == 0 ) */ + #undef TICK_INT_vect + #undef INT_FLAGS + #undef INT_MASK + #undef TICK_init() + #error Invalid timer setting. +#endif /* if ( configUSE_TIMER_INSTANCE == 0 ) */ + +/*-----------------------------------------------------------*/ + +#endif /* PORTHARDWARE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.h new file mode 100644 index 0000000..17a1a2a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.h @@ -0,0 +1,109 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +#define portPOINTER_SIZE_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +#define portDISABLE_INTERRUPTS() asm ( "cli" ) +#define portENABLE_INTERRUPTS() asm ( "sei" ) +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 1 +#define portNOP() asm ( "nop" ) +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() + +extern void vPortYieldFromISR( void ); +#define portYIELD_FROM_ISR() vPortYieldFromISR() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.s90 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.s90 new file mode 100644 index 0000000..bb6ca09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.s90 @@ -0,0 +1,249 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + +#include "porthardware.h" + +; Declare all extern symbols here - including any ISRs that are referenced in +; the vector table. + +; ISR functions +; ------------- +EXTERN TICK_INT + +; Functions used by scheduler +; --------------------------- +EXTERN vTaskSwitchContext +EXTERN pxCurrentTCB +EXTERN xTaskIncrementTick +EXTERN uxCriticalNesting + +; Functions implemented in this file +; ---------------------------------- +PUBLIC vPortYield +PUBLIC vPortYieldFromTick +PUBLIC vPortYieldFromISR +PUBLIC vPortStart + +; Interrupt vector table. +; ----------------------- +; +; For simplicity the RTOS tick interrupt routine uses the __task keyword. +; As the IAR compiler does not permit a function to be declared using both +; __task and __interrupt, the use of __task necessitates that the interrupt +; vector table be setup manually. +; +; To write an ISR, implement the ISR function using the __interrupt keyword +; but do not install the interrupt using the "#pragma vector=ABC" method. +; Instead manually place the name of the ISR in the vector table using an +; ORG and jmp instruction as demonstrated below. +; You will also have to add an EXTERN statement at the top of the file. + + ASEG + + ORG TICK_INT_vect ; Vector address + jmp TICK_INT ; ISR + + RSEG CODE + +CLR_INT MACRO FLAG_REG, FLAG_MASK + st -y, r16 + ldi r16, FLAG_MASK + sts FLAG_REG, r16 + ld r16, y+ + + ENDM + +; Saving and Restoring a Task Context and Task Switching +; ------------------------------------------------------ +; +; The IAR compiler does not fully support inline assembler, so saving and +; restoring a task context has to be written in an asm file. +; +; vPortYield() and vPortYieldFromTick() are usually written in C. Doing +; so in this case would required calls to be made to portSAVE_CONTEXT() and +; portRESTORE_CONTEXT(). This is dis-advantageous as the context switch +; function would require two extra jump and return instructions over the +; WinAVR equivalent. +; +; To avoid this I have opted to implement both vPortYield() and +; vPortYieldFromTick() in this assembly file. For convenience +; portSAVE_CONTEXT and portRESTORE_CONTEXT are implemented as macros. + +portSAVE_CONTEXT MACRO + st -y, r0 ; First save the r0 register - we need to use this. + in r0, SREG ; Obtain the SREG value so we can disable interrupts... + cli ; ... as soon as possible. + st -y, r0 ; Store the SREG as it was before we disabled interrupts. + + in r0, SPL ; Next store the hardware stack pointer. The IAR... + st -y, r0 ; ... compiler uses the hardware stack as a call stack ... + in r0, SPH ; ... only. + st -y, r0 + + st -y, r1 ; Now store the rest of the registers. Dont store the ... + st -y, r2 ; ... the Y register here as it is used as the software + st -y, r3 ; stack pointer and will get saved into the TCB. + st -y, r4 + st -y, r5 + st -y, r6 + st -y, r7 + st -y, r8 + st -y, r9 + st -y, r10 + st -y, r11 + st -y, r12 + st -y, r13 + st -y, r14 + st -y, r15 + st -y, r16 + st -y, r17 + st -y, r18 + st -y, r19 + st -y, r20 + st -y, r21 + st -y, r22 + st -y, r23 + st -y, r24 + st -y, r25 + st -y, r26 + st -y, r27 + st -y, r30 + st -y, r31 + + lds r0, uxCriticalNesting + st -y, r0 ; Store the critical nesting counter. + + lds r26, pxCurrentTCB ; Finally save the software stack pointer (Y ... + lds r27, pxCurrentTCB + 1 ; ... register) into the TCB. + st x+, r28 + st x+, r29 + + ENDM + + +portRESTORE_CONTEXT MACRO + lds r26, pxCurrentTCB + lds r27, pxCurrentTCB + 1 ; Restore the software stack pointer from ... + ld r28, x+ ; the TCB into the software stack pointer (... + ld r29, x+ ; ... the Y register). + + ld r0, y+ + sts uxCriticalNesting, r0 + + ld r31, y+ ; Restore the registers down to R0. The Y + ld r30, y+ ; register is missing from this list as it + ld r27, y+ ; has already been restored. + ld r26, y+ + ld r25, y+ + ld r24, y+ + ld r23, y+ + ld r22, y+ + ld r21, y+ + ld r20, y+ + ld r19, y+ + ld r18, y+ + ld r17, y+ + ld r16, y+ + ld r15, y+ + ld r14, y+ + ld r13, y+ + ld r12, y+ + ld r11, y+ + ld r10, y+ + ld r9, y+ + ld r8, y+ + ld r7, y+ + ld r6, y+ + ld r5, y+ + ld r4, y+ + ld r3, y+ + ld r2, y+ + ld r1, y+ + + ld r0, y+ ; The next thing on the stack is the ... + out SPH, r0 ; ... hardware stack pointer. + ld r0, y+ + out SPL, r0 + + ld r0, y+ ; Next there is the SREG register. + out SREG, r0 + + ld r0, y+ ; Finally we have finished with r0, so restore r0. + + ENDM + + + +; vPortYield(), vPortYieldFromTick() and vPortYieldFromISR() +; ------------------------------------- +; +; Manual and preemptive context switch functions respectively. +; The IAR compiler does not fully support inline assembler, +; so these are implemented here rather than the more usually +; place of within port.c. + +vPortYield: + portSAVE_CONTEXT ; Save the context of the current task. + call vTaskSwitchContext ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ret ; ... scheduler decided should run. + +vPortYieldFromTick: + CLR_INT INT_FLAGS, INT_MASK ; Clear tick interrupt flag + + portSAVE_CONTEXT ; Save the context of the current task. + call xTaskIncrementTick ; Call the timer tick function. + tst r16 + breq SkipTaskSwitch + call vTaskSwitchContext ; Call the scheduler. + +SkipTaskSwitch: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + reti ; ... scheduler decided should run. + +vPortYieldFromISR: + portSAVE_CONTEXT ; Save the context of the current task. + call vTaskSwitchContext ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + reti ; ... scheduler decided should run. + +; vPortStart() +; ------------ +; +; Again due to the lack of inline assembler, this is required +; to get access to the portRESTORE_CONTEXT macro. + +vPortStart: + portRESTORE_CONTEXT + ret + +; Just a filler for unused interrupt vectors. +vNoISR: + reti + +END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h new file mode 100644 index 0000000..233dc07 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h @@ -0,0 +1,1914 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// The software is delivered "AS IS" without warranty or condition of any +// kind, either express, implied or statutory. This includes without +// limitation any warranty or condition with respect to merchantability or +// fitness for any particular purpose, or against the infringements of +// intellectual property rights of others. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7S64.h +// Object : AT91SAM7S64 definitions +// Generated : AT91 SW Application Group 07/16/2004 (07:43:08) +// +// CVS Reference : /AT91SAM7S64.pl/1.12/Mon Jul 12 13:02:30 2004// +// CVS Reference : /SYSC_SAM7Sxx.pl/1.5/Mon Jul 12 16:22:12 2004// +// CVS Reference : /MC_SAM02.pl/1.3/Wed Mar 10 08:37:04 2004// +// CVS Reference : /UDP_1765B.pl/1.3/Fri Aug 2 14:45:38 2002// +// CVS Reference : /AIC_1796B.pl/1.1.1.1/Fri Jun 28 09:36:48 2002// +// CVS Reference : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004// +// CVS Reference : /PIO_1725D.pl/1.1.1.1/Fri Jun 28 09:36:48 2002// +// CVS Reference : /DBGU_1754A.pl/1.4/Fri Jan 31 12:18:24 2003// +// CVS Reference : /US_1739C.pl/1.2/Mon Jul 12 17:26:24 2004// +// CVS Reference : /SPI2.pl/1.2/Fri Oct 17 08:13:40 2003// +// CVS Reference : /SSC_1762A.pl/1.2/Fri Nov 8 13:26:40 2002// +// CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +// CVS Reference : /TWI_1761B.pl/1.4/Fri Feb 7 10:30:08 2003// +// CVS Reference : /PDC_1734B.pl/1.2/Thu Nov 21 16:38:24 2002// +// CVS Reference : /ADC_SAM.pl/1.7/Fri Oct 17 08:12:38 2003// +// CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +// ---------------------------------------------------------------------------- + +#ifndef AT91SAM7S64_H +#define AT91SAM7S64_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYSC { + AT91_REG SYSC_AIC_SMR[32]; // Source Mode Register + AT91_REG SYSC_AIC_SVR[32]; // Source Vector Register + AT91_REG SYSC_AIC_IVR; // IRQ Vector Register + AT91_REG SYSC_AIC_FVR; // FIQ Vector Register + AT91_REG SYSC_AIC_ISR; // Interrupt Status Register + AT91_REG SYSC_AIC_IPR; // Interrupt Pending Register + AT91_REG SYSC_AIC_IMR; // Interrupt Mask Register + AT91_REG SYSC_AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG SYSC_AIC_IECR; // Interrupt Enable Command Register + AT91_REG SYSC_AIC_IDCR; // Interrupt Disable Command Register + AT91_REG SYSC_AIC_ICCR; // Interrupt Clear Command Register + AT91_REG SYSC_AIC_ISCR; // Interrupt Set Command Register + AT91_REG SYSC_AIC_EOICR; // End of Interrupt Command Register + AT91_REG SYSC_AIC_SPU; // Spurious Vector Register + AT91_REG SYSC_AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG SYSC_AIC_FFER; // Fast Forcing Enable Register + AT91_REG SYSC_AIC_FFDR; // Fast Forcing Disable Register + AT91_REG SYSC_AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG SYSC_DBGU_CR; // Control Register + AT91_REG SYSC_DBGU_MR; // Mode Register + AT91_REG SYSC_DBGU_IER; // Interrupt Enable Register + AT91_REG SYSC_DBGU_IDR; // Interrupt Disable Register + AT91_REG SYSC_DBGU_IMR; // Interrupt Mask Register + AT91_REG SYSC_DBGU_CSR; // Channel Status Register + AT91_REG SYSC_DBGU_RHR; // Receiver Holding Register + AT91_REG SYSC_DBGU_THR; // Transmitter Holding Register + AT91_REG SYSC_DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG SYSC_DBGU_C1R; // Chip ID1 Register + AT91_REG SYSC_DBGU_C2R; // Chip ID2 Register + AT91_REG SYSC_DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG SYSC_DBGU_RPR; // Receive Pointer Register + AT91_REG SYSC_DBGU_RCR; // Receive Counter Register + AT91_REG SYSC_DBGU_TPR; // Transmit Pointer Register + AT91_REG SYSC_DBGU_TCR; // Transmit Counter Register + AT91_REG SYSC_DBGU_RNPR; // Receive Next Pointer Register + AT91_REG SYSC_DBGU_RNCR; // Receive Next Counter Register + AT91_REG SYSC_DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG SYSC_DBGU_TNCR; // Transmit Next Counter Register + AT91_REG SYSC_DBGU_PTCR; // PDC Transfer Control Register + AT91_REG SYSC_DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG SYSC_PIOA_PER; // PIO Enable Register + AT91_REG SYSC_PIOA_PDR; // PIO Disable Register + AT91_REG SYSC_PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG SYSC_PIOA_OER; // Output Enable Register + AT91_REG SYSC_PIOA_ODR; // Output Disable Registerr + AT91_REG SYSC_PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG SYSC_PIOA_IFER; // Input Filter Enable Register + AT91_REG SYSC_PIOA_IFDR; // Input Filter Disable Register + AT91_REG SYSC_PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG SYSC_PIOA_SODR; // Set Output Data Register + AT91_REG SYSC_PIOA_CODR; // Clear Output Data Register + AT91_REG SYSC_PIOA_ODSR; // Output Data Status Register + AT91_REG SYSC_PIOA_PDSR; // Pin Data Status Register + AT91_REG SYSC_PIOA_IER; // Interrupt Enable Register + AT91_REG SYSC_PIOA_IDR; // Interrupt Disable Register + AT91_REG SYSC_PIOA_IMR; // Interrupt Mask Register + AT91_REG SYSC_PIOA_ISR; // Interrupt Status Register + AT91_REG SYSC_PIOA_MDER; // Multi-driver Enable Register + AT91_REG SYSC_PIOA_MDDR; // Multi-driver Disable Register + AT91_REG SYSC_PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG SYSC_PIOA_PPUDR; // Pull-up Disable Register + AT91_REG SYSC_PIOA_PPUER; // Pull-up Enable Register + AT91_REG SYSC_PIOA_PPUSR; // Pad Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG SYSC_PIOA_ASR; // Select A Register + AT91_REG SYSC_PIOA_BSR; // Select B Register + AT91_REG SYSC_PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG SYSC_PIOA_OWER; // Output Write Enable Register + AT91_REG SYSC_PIOA_OWDR; // Output Write Disable Register + AT91_REG SYSC_PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[469]; // + AT91_REG SYSC_PMC_SCER; // System Clock Enable Register + AT91_REG SYSC_PMC_SCDR; // System Clock Disable Register + AT91_REG SYSC_PMC_SCSR; // System Clock Status Register + AT91_REG Reserved13[1]; // + AT91_REG SYSC_PMC_PCER; // Peripheral Clock Enable Register + AT91_REG SYSC_PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG SYSC_PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved14[1]; // + AT91_REG SYSC_PMC_MOR; // Main Oscillator Register + AT91_REG SYSC_PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved15[1]; // + AT91_REG SYSC_PMC_PLLR; // PLL Register + AT91_REG SYSC_PMC_MCKR; // Master Clock Register + AT91_REG Reserved16[3]; // + AT91_REG SYSC_PMC_PCKR[8]; // Programmable Clock Register + AT91_REG SYSC_PMC_IER; // Interrupt Enable Register + AT91_REG SYSC_PMC_IDR; // Interrupt Disable Register + AT91_REG SYSC_PMC_SR; // Status Register + AT91_REG SYSC_PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved17[36]; // + AT91_REG SYSC_RSTC_RCR; // Reset Control Register + AT91_REG SYSC_RSTC_RSR; // Reset Status Register + AT91_REG SYSC_RSTC_RMR; // Reset Mode Register + AT91_REG Reserved18[5]; // + AT91_REG SYSC_RTTC_RTMR; // Real-time Mode Register + AT91_REG SYSC_RTTC_RTAR; // Real-time Alarm Register + AT91_REG SYSC_RTTC_RTVR; // Real-time Value Register + AT91_REG SYSC_RTTC_RTSR; // Real-time Status Register + AT91_REG SYSC_PITC_PIMR; // Period Interval Mode Register + AT91_REG SYSC_PITC_PISR; // Period Interval Status Register + AT91_REG SYSC_PITC_PIVR; // Period Interval Value Register + AT91_REG SYSC_PITC_PIIR; // Period Interval Image Register + AT91_REG SYSC_WDTC_WDCR; // Watchdog Control Register + AT91_REG SYSC_WDTC_WDMR; // Watchdog Mode Register + AT91_REG SYSC_WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved19[5]; // + AT91_REG SYSC_SYSC_VRPM; // Voltage Regulator Power Mode Register +} AT91S_SYSC, *AT91PS_SYSC; + +// -------- VRPM : (SYSC Offset: 0xd60) Voltage Regulator Power Mode Register -------- +#define AT91C_SYSC_PSTDBY ((unsigned int) 0x1 << 0) // (SYSC) Voltage Regulator Power Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label Level Sensitive +#define AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_C1R; // Chip ID1 Register + AT91_REG DBGU_C2R; // Chip ID2 Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral Data Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pad Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[8]; // Programmable Clock Register + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- SYSC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_SYSC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_SYSC_ICERST ((unsigned int) 0x1 << 1) // (RSTC) ICE Interface Reset +#define AT91C_SYSC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_SYSC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_SYSC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- SYSC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_SYSC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_SYSC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brown-out Detection Status +#define AT91C_SYSC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_SYSC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_SYSC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_SYSC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_SYSC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_SYSC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brown-out Reset. +#define AT91C_SYSC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_SYSC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- SYSC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_SYSC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_SYSC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_SYSC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_SYSC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brown-out Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- SYSC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_SYSC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_SYSC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_SYSC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_SYSC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- SYSC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_SYSC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- SYSC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_SYSC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- SYSC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_SYSC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_SYSC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- SYSC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_SYSC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_SYSC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_SYSC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- SYSC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_SYSC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- SYSC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_SYSC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_SYSC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- SYSC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- SYSC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_SYSC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +// -------- SYSC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_SYSC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_SYSC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_SYSC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_SYSC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_SYSC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_SYSC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_SYSC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_SYSC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- SYSC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_SYSC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_SYSC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 2) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG SSC_RC0R; // Receive Compare 0 Register + AT91_REG SSC_RC1R; // Receive Compare 1 Register + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved2[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_CKG ((unsigned int) 0x3 << 6) // (SSC) Receive/Transmit Clock Gating Selection +#define AT91C_SSC_CKG_NONE ((unsigned int) 0x0 << 6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock +#define AT91C_SSC_CKG_LOW ((unsigned int) 0x1 << 6) // (SSC) Receive/Transmit Clock enabled only if RF Low +#define AT91C_SSC_CKG_HIGH ((unsigned int) 0x2 << 6) // (SSC) Receive/Transmit Clock enabled only if RF High +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STOP ((unsigned int) 0x1 << 12) // (SSC) Receive Stop Selection +#define AT91C_SSC_STTOUT ((unsigned int) 0x1 << 15) // (SSC) Receive/Transmit Start Output Selection +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_CP0 ((unsigned int) 0x1 << 8) // (SSC) Compare 0 +#define AT91C_SSC_CP1 ((unsigned int) 0x1 << 9) // (SSC) Compare 1 +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG US_XXR; // XON_XOFF Register + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved1[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (USART) Reset Status Bits +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG TWI_SMR; // Slave Mode Register + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved0[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SVEN ((unsigned int) 0x1 << 4) // (TWI) TWI Slave Transfer Enabled +#define AT91C_TWI_SVDIS ((unsigned int) 0x1 << 5) // (TWI) TWI Slave Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register -------- +#define AT91C_TWI_SADR ((unsigned int) 0x7F << 16) // (TWI) Slave Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_SVREAD ((unsigned int) 0x1 << 3) // (TWI) Slave Read +#define AT91C_TWI_SVACC ((unsigned int) 0x1 << 4) // (TWI) Slave Access +#define AT91C_TWI_GCACC ((unsigned int) 0x1 << 5) // (TWI) General Call Access +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +#define AT91C_TWI_ARBLST ((unsigned int) 0x1 << 9) // (TWI) Arbitration Lost +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_NONE ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_RISING ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_FALLING ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_BOTH ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRCS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x1 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x1 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x1 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA2 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[32]; // PWMC Channel 0 +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +#define AT91C_PWMC_CHID4 ((unsigned int) 0x1 << 4) // (PWMC) Channel ID 4 +#define AT91C_PWMC_CHID5 ((unsigned int) 0x1 << 5) // (PWMC) Channel ID 5 +#define AT91C_PWMC_CHID6 ((unsigned int) 0x1 << 6) // (PWMC) Channel ID 6 +#define AT91C_PWMC_CHID7 ((unsigned int) 0x1 << 7) // (PWMC) Channel ID 7 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[8]; // Endpoint Control and Status Register + AT91_REG UDP_FDR[8]; // Endpoint FIFO Data Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 2) // (UDP) Remote Wake Up Enable +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_EPINT6 ((unsigned int) 0x1 << 6) // (UDP) Endpoint 6 Interrupt +#define AT91C_UDP_EPINT7 ((unsigned int) 0x1 << 7) // (UDP) Endpoint 7 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +#define AT91C_UDP_EP6 ((unsigned int) 0x1 << 6) // (UDP) Reset Endpoint 6 +#define AT91C_UDP_EP7 ((unsigned int) 0x1 << 7) // (UDP) Reset Endpoint 7 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7S64 +// ***************************************************************************** +// ========== Register definition for SYSC peripheral ========== +#define AT91C_SYSC_SYSC_VRPM ((AT91_REG *) 0xFFFFFD60) // (SYSC) Voltage Regulator Power Mode Register +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_C2R ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID2 Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_C1R ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID1 Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pad Pull-up Status Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +// ========== Register definition for PDC_SPI peripheral ========== +#define AT91C_SPI_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register +#define AT91C_SPI_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register +#define AT91C_SPI_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register +#define AT91C_SPI_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI) Transmit Pointer Register +#define AT91C_SPI_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI) Receive Pointer Register +#define AT91C_SPI_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register +#define AT91C_SPI_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register +#define AT91C_SPI_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI) Receive Next Counter Register +#define AT91C_SPI_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI) Transmit Counter Register +#define AT91C_SPI_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI) Receive Counter Register +// ========== Register definition for SPI peripheral ========== +#define AT91C_SPI_CSR ((AT91_REG *) 0xFFFE0030) // (SPI) Chip Select Register +#define AT91C_SPI_IDR ((AT91_REG *) 0xFFFE0018) // (SPI) Interrupt Disable Register +#define AT91C_SPI_SR ((AT91_REG *) 0xFFFE0010) // (SPI) Status Register +#define AT91C_SPI_RDR ((AT91_REG *) 0xFFFE0008) // (SPI) Receive Data Register +#define AT91C_SPI_CR ((AT91_REG *) 0xFFFE0000) // (SPI) Control Register +#define AT91C_SPI_IMR ((AT91_REG *) 0xFFFE001C) // (SPI) Interrupt Mask Register +#define AT91C_SPI_IER ((AT91_REG *) 0xFFFE0014) // (SPI) Interrupt Enable Register +#define AT91C_SPI_TDR ((AT91_REG *) 0xFFFE000C) // (SPI) Transmit Data Register +#define AT91C_SPI_MR ((AT91_REG *) 0xFFFE0004) // (SPI) Mode Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_RC0R ((AT91_REG *) 0xFFFD4038) // (SSC) Receive Compare 0 Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_RC1R ((AT91_REG *) 0xFFFD403C) // (SSC) Receive Compare 1 Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_XXR ((AT91_REG *) 0xFFFC4048) // (US1) XON_XOFF Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_XXR ((AT91_REG *) 0xFFFC0048) // (US0) XON_XOFF Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_SMR ((AT91_REG *) 0xFFFB8008) // (TWI) Slave Mode Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +#define AT91C_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +#define AT91C_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +#define AT91C_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_PWM0 ((unsigned int) AT91C_PIO_PA0) // PWM Channel 0 +#define AT91C_PA0_TIOA0 ((unsigned int) AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_PWM1 ((unsigned int) AT91C_PIO_PA1) // PWM Channel 1 +#define AT91C_PA1_TIOB0 ((unsigned int) AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_DTXD ((unsigned int) AT91C_PIO_PA10) // DBGU Debug Transmit Data +#define AT91C_PA10_NPCS2 ((unsigned int) AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_NPCS0 ((unsigned int) AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 +#define AT91C_PA11_PWM0 ((unsigned int) AT91C_PIO_PA11) // PWM Channel 0 +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_MISO ((unsigned int) AT91C_PIO_PA12) // SPI Master In Slave +#define AT91C_PA12_PWM1 ((unsigned int) AT91C_PIO_PA12) // PWM Channel 1 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_MOSI ((unsigned int) AT91C_PIO_PA13) // SPI Master Out Slave +#define AT91C_PA13_PWM2 ((unsigned int) AT91C_PIO_PA13) // PWM Channel 2 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_SPCK ((unsigned int) AT91C_PIO_PA14) // SPI Serial Clock +#define AT91C_PA14_PWM3 ((unsigned int) AT91C_PIO_PA14) // PWM Channel 3 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_TF ((unsigned int) AT91C_PIO_PA15) // SSC Transmit Frame Sync +#define AT91C_PA15_TIOA1 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_TK ((unsigned int) AT91C_PIO_PA16) // SSC Transmit Clock +#define AT91C_PA16_TIOB1 ((unsigned int) AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_TD ((unsigned int) AT91C_PIO_PA17) // SSC Transmit data +#define AT91C_PA17_PCK1 ((unsigned int) AT91C_PIO_PA17) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_RD ((unsigned int) AT91C_PIO_PA18) // SSC Receive Data +#define AT91C_PA18_PCK2 ((unsigned int) AT91C_PIO_PA18) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_RK ((unsigned int) AT91C_PIO_PA19) // SSC Receive Clock +#define AT91C_PA19_FIQ ((unsigned int) AT91C_PIO_PA19) // AIC Fast Interrupt Input +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_PWM2 ((unsigned int) AT91C_PIO_PA2) // PWM Channel 2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_RF ((unsigned int) AT91C_PIO_PA20) // SSC Receive Frame Sync +#define AT91C_PA20_IRQ0 ((unsigned int) AT91C_PIO_PA20) // External Interrupt 0 +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_RXD1 ((unsigned int) AT91C_PIO_PA21) // USART 1 Receive Data +#define AT91C_PA21_PCK1 ((unsigned int) AT91C_PIO_PA21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TXD1 ((unsigned int) AT91C_PIO_PA22) // USART 1 Transmit Data +#define AT91C_PA22_NPCS3 ((unsigned int) AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_SCK1 ((unsigned int) AT91C_PIO_PA23) // USART 1 Serial Clock +#define AT91C_PA23_PWM0 ((unsigned int) AT91C_PIO_PA23) // PWM Channel 0 +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RTS1 ((unsigned int) AT91C_PIO_PA24) // USART 1 Ready To Send +#define AT91C_PA24_PWM1 ((unsigned int) AT91C_PIO_PA24) // PWM Channel 1 +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_CTS1 ((unsigned int) AT91C_PIO_PA25) // USART 1 Clear To Send +#define AT91C_PA25_PWM2 ((unsigned int) AT91C_PIO_PA25) // PWM Channel 2 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_DCD1 ((unsigned int) AT91C_PIO_PA26) // USART 1 Data Carrier Detect +#define AT91C_PA26_TIOA2 ((unsigned int) AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DTR1 ((unsigned int) AT91C_PIO_PA27) // USART 1 Data Terminal ready +#define AT91C_PA27_TIOB2 ((unsigned int) AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DSR1 ((unsigned int) AT91C_PIO_PA28) // USART 1 Data Set ready +#define AT91C_PA28_TCLK1 ((unsigned int) AT91C_PIO_PA28) // Timer Counter 1 external clock input +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_RI1 ((unsigned int) AT91C_PIO_PA29) // USART 1 Ring Indicator +#define AT91C_PA29_TCLK2 ((unsigned int) AT91C_PIO_PA29) // Timer Counter 2 external clock input +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_TWD ((unsigned int) AT91C_PIO_PA3) // TWI Two-wire Serial Data +#define AT91C_PA3_NPCS3 ((unsigned int) AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ1 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 1 +#define AT91C_PA30_NPCS2 ((unsigned int) AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA31 ((unsigned int) 1 << 31) // Pin Controlled by PA31 +#define AT91C_PA31_NPCS1 ((unsigned int) AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 +#define AT91C_PA31_PCK2 ((unsigned int) AT91C_PIO_PA31) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_TWCK ((unsigned int) AT91C_PIO_PA4) // TWI Two-wire Serial Clock +#define AT91C_PA4_TCLK0 ((unsigned int) AT91C_PIO_PA4) // Timer Counter 0 external clock input +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD0 ((unsigned int) AT91C_PIO_PA5) // USART 0 Receive Data +#define AT91C_PA5_NPCS3 ((unsigned int) AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD0 ((unsigned int) AT91C_PIO_PA6) // USART 0 Transmit Data +#define AT91C_PA6_PCK0 ((unsigned int) AT91C_PIO_PA6) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_RTS0 ((unsigned int) AT91C_PIO_PA7) // USART 0 Ready To Send +#define AT91C_PA7_PWM3 ((unsigned int) AT91C_PIO_PA7) // PWM Channel 3 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_CTS0 ((unsigned int) AT91C_PIO_PA8) // USART 0 Clear To Send +#define AT91C_PA8_ADTRG ((unsigned int) AT91C_PIO_PA8) // ADC External Trigger +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_DRXD ((unsigned int) AT91C_PIO_PA9) // DBGU Debug Receive Data +#define AT91C_PA9_NPCS1 ((unsigned int) AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller +#define AT91C_ID_3_Reserved ((unsigned int) 3) // Reserved +#define AT91C_ID_ADC ((unsigned int) 4) // Analog-to-Digital Converter +#define AT91C_ID_SPI ((unsigned int) 5) // Serial Peripheral Interface +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_15_Reserved ((unsigned int) 15) // Reserved +#define AT91C_ID_16_Reserved ((unsigned int) 16) // Reserved +#define AT91C_ID_17_Reserved ((unsigned int) 17) // Reserved +#define AT91C_ID_18_Reserved ((unsigned int) 18) // Reserved +#define AT91C_ID_19_Reserved ((unsigned int) 19) // Reserved +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_BASE_SYSC ((AT91PS_SYSC) 0xFFFFF000) // (SYSC) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI) Base Address +#define AT91C_BASE_SPI ((AT91PS_SPI) 0xFFFE0000) // (SPI) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00004000) // Internal SRAM size in byte (16 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00010000) // Internal ROM size in byte (64 Kbyte) + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h new file mode 100644 index 0000000..fe1451a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h @@ -0,0 +1,1812 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// The software is delivered "AS IS" without warranty or condition of any +// kind, either express, implied or statutory. This includes without +// limitation any warranty or condition with respect to merchantability or +// fitness for any particular purpose, or against the infringements of +// intellectual property rights of others. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7S64.h +// Object : AT91SAM7S64 definitions +// Generated : AT91 SW Application Group 07/16/2004 (07:43:09) +// +// CVS Reference : /AT91SAM7S64.pl/1.12/Mon Jul 12 13:02:30 2004// +// CVS Reference : /SYSC_SAM7Sxx.pl/1.5/Mon Jul 12 16:22:12 2004// +// CVS Reference : /MC_SAM02.pl/1.3/Wed Mar 10 08:37:04 2004// +// CVS Reference : /UDP_1765B.pl/1.3/Fri Aug 2 14:45:38 2002// +// CVS Reference : /AIC_1796B.pl/1.1.1.1/Fri Jun 28 09:36:48 2002// +// CVS Reference : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004// +// CVS Reference : /PIO_1725D.pl/1.1.1.1/Fri Jun 28 09:36:48 2002// +// CVS Reference : /DBGU_1754A.pl/1.4/Fri Jan 31 12:18:24 2003// +// CVS Reference : /US_1739C.pl/1.2/Mon Jul 12 17:26:24 2004// +// CVS Reference : /SPI2.pl/1.2/Fri Oct 17 08:13:40 2003// +// CVS Reference : /SSC_1762A.pl/1.2/Fri Nov 8 13:26:40 2002// +// CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +// CVS Reference : /TWI_1761B.pl/1.4/Fri Feb 7 10:30:08 2003// +// CVS Reference : /PDC_1734B.pl/1.2/Thu Nov 21 16:38:24 2002// +// CVS Reference : /ADC_SAM.pl/1.7/Fri Oct 17 08:12:38 2003// +// CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +// ---------------------------------------------------------------------------- + +// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +// *** Register offset in AT91S_SYSC structure *** +#define SYSC_AIC_SMR ( 0) // Source Mode Register +#define SYSC_AIC_SVR (128) // Source Vector Register +#define SYSC_AIC_IVR (256) // IRQ Vector Register +#define SYSC_AIC_FVR (260) // FIQ Vector Register +#define SYSC_AIC_ISR (264) // Interrupt Status Register +#define SYSC_AIC_IPR (268) // Interrupt Pending Register +#define SYSC_AIC_IMR (272) // Interrupt Mask Register +#define SYSC_AIC_CISR (276) // Core Interrupt Status Register +#define SYSC_AIC_IECR (288) // Interrupt Enable Command Register +#define SYSC_AIC_IDCR (292) // Interrupt Disable Command Register +#define SYSC_AIC_ICCR (296) // Interrupt Clear Command Register +#define SYSC_AIC_ISCR (300) // Interrupt Set Command Register +#define SYSC_AIC_EOICR (304) // End of Interrupt Command Register +#define SYSC_AIC_SPU (308) // Spurious Vector Register +#define SYSC_AIC_DCR (312) // Debug Control Register (Protect) +#define SYSC_AIC_FFER (320) // Fast Forcing Enable Register +#define SYSC_AIC_FFDR (324) // Fast Forcing Disable Register +#define SYSC_AIC_FFSR (328) // Fast Forcing Status Register +#define SYSC_DBGU_CR (512) // Control Register +#define SYSC_DBGU_MR (516) // Mode Register +#define SYSC_DBGU_IER (520) // Interrupt Enable Register +#define SYSC_DBGU_IDR (524) // Interrupt Disable Register +#define SYSC_DBGU_IMR (528) // Interrupt Mask Register +#define SYSC_DBGU_CSR (532) // Channel Status Register +#define SYSC_DBGU_RHR (536) // Receiver Holding Register +#define SYSC_DBGU_THR (540) // Transmitter Holding Register +#define SYSC_DBGU_BRGR (544) // Baud Rate Generator Register +#define SYSC_DBGU_C1R (576) // Chip ID1 Register +#define SYSC_DBGU_C2R (580) // Chip ID2 Register +#define SYSC_DBGU_FNTR (584) // Force NTRST Register +#define SYSC_DBGU_RPR (768) // Receive Pointer Register +#define SYSC_DBGU_RCR (772) // Receive Counter Register +#define SYSC_DBGU_TPR (776) // Transmit Pointer Register +#define SYSC_DBGU_TCR (780) // Transmit Counter Register +#define SYSC_DBGU_RNPR (784) // Receive Next Pointer Register +#define SYSC_DBGU_RNCR (788) // Receive Next Counter Register +#define SYSC_DBGU_TNPR (792) // Transmit Next Pointer Register +#define SYSC_DBGU_TNCR (796) // Transmit Next Counter Register +#define SYSC_DBGU_PTCR (800) // PDC Transfer Control Register +#define SYSC_DBGU_PTSR (804) // PDC Transfer Status Register +#define SYSC_PIOA_PER (1024) // PIO Enable Register +#define SYSC_PIOA_PDR (1028) // PIO Disable Register +#define SYSC_PIOA_PSR (1032) // PIO Status Register +#define SYSC_PIOA_OER (1040) // Output Enable Register +#define SYSC_PIOA_ODR (1044) // Output Disable Registerr +#define SYSC_PIOA_OSR (1048) // Output Status Register +#define SYSC_PIOA_IFER (1056) // Input Filter Enable Register +#define SYSC_PIOA_IFDR (1060) // Input Filter Disable Register +#define SYSC_PIOA_IFSR (1064) // Input Filter Status Register +#define SYSC_PIOA_SODR (1072) // Set Output Data Register +#define SYSC_PIOA_CODR (1076) // Clear Output Data Register +#define SYSC_PIOA_ODSR (1080) // Output Data Status Register +#define SYSC_PIOA_PDSR (1084) // Pin Data Status Register +#define SYSC_PIOA_IER (1088) // Interrupt Enable Register +#define SYSC_PIOA_IDR (1092) // Interrupt Disable Register +#define SYSC_PIOA_IMR (1096) // Interrupt Mask Register +#define SYSC_PIOA_ISR (1100) // Interrupt Status Register +#define SYSC_PIOA_MDER (1104) // Multi-driver Enable Register +#define SYSC_PIOA_MDDR (1108) // Multi-driver Disable Register +#define SYSC_PIOA_MDSR (1112) // Multi-driver Status Register +#define SYSC_PIOA_PPUDR (1120) // Pull-up Disable Register +#define SYSC_PIOA_PPUER (1124) // Pull-up Enable Register +#define SYSC_PIOA_PPUSR (1128) // Pad Pull-up Status Register +#define SYSC_PIOA_ASR (1136) // Select A Register +#define SYSC_PIOA_BSR (1140) // Select B Register +#define SYSC_PIOA_ABSR (1144) // AB Select Status Register +#define SYSC_PIOA_OWER (1184) // Output Write Enable Register +#define SYSC_PIOA_OWDR (1188) // Output Write Disable Register +#define SYSC_PIOA_OWSR (1192) // Output Write Status Register +#define SYSC_PMC_SCER (3072) // System Clock Enable Register +#define SYSC_PMC_SCDR (3076) // System Clock Disable Register +#define SYSC_PMC_SCSR (3080) // System Clock Status Register +#define SYSC_PMC_PCER (3088) // Peripheral Clock Enable Register +#define SYSC_PMC_PCDR (3092) // Peripheral Clock Disable Register +#define SYSC_PMC_PCSR (3096) // Peripheral Clock Status Register +#define SYSC_PMC_MOR (3104) // Main Oscillator Register +#define SYSC_PMC_MCFR (3108) // Main Clock Frequency Register +#define SYSC_PMC_PLLR (3116) // PLL Register +#define SYSC_PMC_MCKR (3120) // Master Clock Register +#define SYSC_PMC_PCKR (3136) // Programmable Clock Register +#define SYSC_PMC_IER (3168) // Interrupt Enable Register +#define SYSC_PMC_IDR (3172) // Interrupt Disable Register +#define SYSC_PMC_SR (3176) // Status Register +#define SYSC_PMC_IMR (3180) // Interrupt Mask Register +#define SYSC_RSTC_RCR (3328) // Reset Control Register +#define SYSC_RSTC_RSR (3332) // Reset Status Register +#define SYSC_RSTC_RMR (3336) // Reset Mode Register +#define SYSC_RTTC_RTMR (3360) // Real-time Mode Register +#define SYSC_RTTC_RTAR (3364) // Real-time Alarm Register +#define SYSC_RTTC_RTVR (3368) // Real-time Value Register +#define SYSC_RTTC_RTSR (3372) // Real-time Status Register +#define SYSC_PITC_PIMR (3376) // Period Interval Mode Register +#define SYSC_PITC_PISR (3380) // Period Interval Status Register +#define SYSC_PITC_PIVR (3384) // Period Interval Value Register +#define SYSC_PITC_PIIR (3388) // Period Interval Image Register +#define SYSC_WDTC_WDCR (3392) // Watchdog Control Register +#define SYSC_WDTC_WDMR (3396) // Watchdog Mode Register +#define SYSC_WDTC_WDSR (3400) // Watchdog Status Register +#define SYSC_SYSC_VRPM (3424) // Voltage Regulator Power Mode Register +// -------- VRPM : (SYSC Offset: 0xd60) Voltage Regulator Power Mode Register -------- +#define AT91C_SYSC_PSTDBY (0x1 << 0) // (SYSC) Voltage Regulator Power Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +// *** Register offset in AT91S_AIC structure *** +#define AIC_SMR ( 0) // Source Mode Register +#define AIC_SVR (128) // Source Vector Register +#define AIC_IVR (256) // IRQ Vector Register +#define AIC_FVR (260) // FIQ Vector Register +#define AIC_ISR (264) // Interrupt Status Register +#define AIC_IPR (268) // Interrupt Pending Register +#define AIC_IMR (272) // Interrupt Mask Register +#define AIC_CISR (276) // Core Interrupt Status Register +#define AIC_IECR (288) // Interrupt Enable Command Register +#define AIC_IDCR (292) // Interrupt Disable Command Register +#define AIC_ICCR (296) // Interrupt Clear Command Register +#define AIC_ISCR (300) // Interrupt Set Command Register +#define AIC_EOICR (304) // End of Interrupt Command Register +#define AIC_SPU (308) // Spurious Vector Register +#define AIC_DCR (312) // Debug Control Register (Protect) +#define AIC_FFER (320) // Fast Forcing Enable Register +#define AIC_FFDR (324) // Fast Forcing Disable Register +#define AIC_FFSR (328) // Fast Forcing Status Register +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE (0x0 << 5) // (AIC) Internal Sources Code Label Level Sensitive +#define AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED (0x1 << 5) // (AIC) Internal Sources Code Label Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL (0x2 << 5) // (AIC) External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE (0x3 << 5) // (AIC) External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +// *** Register offset in AT91S_DBGU structure *** +#define DBGU_CR ( 0) // Control Register +#define DBGU_MR ( 4) // Mode Register +#define DBGU_IER ( 8) // Interrupt Enable Register +#define DBGU_IDR (12) // Interrupt Disable Register +#define DBGU_IMR (16) // Interrupt Mask Register +#define DBGU_CSR (20) // Channel Status Register +#define DBGU_RHR (24) // Receiver Holding Register +#define DBGU_THR (28) // Transmitter Holding Register +#define DBGU_BRGR (32) // Baud Rate Generator Register +#define DBGU_C1R (64) // Chip ID1 Register +#define DBGU_C2R (68) // Chip ID2 Register +#define DBGU_FNTR (72) // Force NTRST Register +#define DBGU_RPR (256) // Receive Pointer Register +#define DBGU_RCR (260) // Receive Counter Register +#define DBGU_TPR (264) // Transmit Pointer Register +#define DBGU_TCR (268) // Transmit Counter Register +#define DBGU_RNPR (272) // Receive Next Pointer Register +#define DBGU_RNCR (276) // Receive Next Counter Register +#define DBGU_TNPR (280) // Transmit Next Pointer Register +#define DBGU_TNCR (284) // Transmit Next Counter Register +#define DBGU_PTCR (288) // PDC Transfer Control Register +#define DBGU_PTSR (292) // PDC Transfer Status Register +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral Data Controller +// ***************************************************************************** +// *** Register offset in AT91S_PDC structure *** +#define PDC_RPR ( 0) // Receive Pointer Register +#define PDC_RCR ( 4) // Receive Counter Register +#define PDC_TPR ( 8) // Transmit Pointer Register +#define PDC_TCR (12) // Transmit Counter Register +#define PDC_RNPR (16) // Receive Next Pointer Register +#define PDC_RNCR (20) // Receive Next Counter Register +#define PDC_TNPR (24) // Transmit Next Pointer Register +#define PDC_TNCR (28) // Transmit Next Counter Register +#define PDC_PTCR (32) // PDC Transfer Control Register +#define PDC_PTSR (36) // PDC Transfer Status Register +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +// *** Register offset in AT91S_PIO structure *** +#define PIO_PER ( 0) // PIO Enable Register +#define PIO_PDR ( 4) // PIO Disable Register +#define PIO_PSR ( 8) // PIO Status Register +#define PIO_OER (16) // Output Enable Register +#define PIO_ODR (20) // Output Disable Registerr +#define PIO_OSR (24) // Output Status Register +#define PIO_IFER (32) // Input Filter Enable Register +#define PIO_IFDR (36) // Input Filter Disable Register +#define PIO_IFSR (40) // Input Filter Status Register +#define PIO_SODR (48) // Set Output Data Register +#define PIO_CODR (52) // Clear Output Data Register +#define PIO_ODSR (56) // Output Data Status Register +#define PIO_PDSR (60) // Pin Data Status Register +#define PIO_IER (64) // Interrupt Enable Register +#define PIO_IDR (68) // Interrupt Disable Register +#define PIO_IMR (72) // Interrupt Mask Register +#define PIO_ISR (76) // Interrupt Status Register +#define PIO_MDER (80) // Multi-driver Enable Register +#define PIO_MDDR (84) // Multi-driver Disable Register +#define PIO_MDSR (88) // Multi-driver Status Register +#define PIO_PPUDR (96) // Pull-up Disable Register +#define PIO_PPUER (100) // Pull-up Enable Register +#define PIO_PPUSR (104) // Pad Pull-up Status Register +#define PIO_ASR (112) // Select A Register +#define PIO_BSR (116) // Select B Register +#define PIO_ABSR (120) // AB Select Status Register +#define PIO_OWER (160) // Output Write Enable Register +#define PIO_OWDR (164) // Output Write Disable Register +#define PIO_OWSR (168) // Output Write Status Register + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +// *** Register offset in AT91S_CKGR structure *** +#define CKGR_MOR ( 0) // Main Oscillator Register +#define CKGR_MCFR ( 4) // Main Clock Frequency Register +#define CKGR_PLLR (12) // PLL Register +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +// *** Register offset in AT91S_PMC structure *** +#define PMC_SCER ( 0) // System Clock Enable Register +#define PMC_SCDR ( 4) // System Clock Disable Register +#define PMC_SCSR ( 8) // System Clock Status Register +#define PMC_PCER (16) // Peripheral Clock Enable Register +#define PMC_PCDR (20) // Peripheral Clock Disable Register +#define PMC_PCSR (24) // Peripheral Clock Status Register +#define PMC_MOR (32) // Main Oscillator Register +#define PMC_MCFR (36) // Main Clock Frequency Register +#define PMC_PLLR (44) // PLL Register +#define PMC_MCKR (48) // Master Clock Register +#define PMC_PCKR (64) // Programmable Clock Register +#define PMC_IER (96) // Interrupt Enable Register +#define PMC_IDR (100) // Interrupt Disable Register +#define PMC_SR (104) // Status Register +#define PMC_IMR (108) // Interrupt Mask Register +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 (0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RSTC structure *** +#define RSTC_RCR ( 0) // Reset Control Register +#define RSTC_RSR ( 4) // Reset Status Register +#define RSTC_RMR ( 8) // Reset Mode Register +// -------- SYSC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_SYSC_PROCRST (0x1 << 0) // (RSTC) Processor Reset +#define AT91C_SYSC_ICERST (0x1 << 1) // (RSTC) ICE Interface Reset +#define AT91C_SYSC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_SYSC_EXTRST (0x1 << 3) // (RSTC) External Reset +#define AT91C_SYSC_KEY (0xFF << 24) // (RSTC) Password +// -------- SYSC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_SYSC_URSTS (0x1 << 0) // (RSTC) User Reset Status +#define AT91C_SYSC_BODSTS (0x1 << 1) // (RSTC) Brown-out Detection Status +#define AT91C_SYSC_RSTTYP (0x7 << 8) // (RSTC) Reset Type +#define AT91C_SYSC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_SYSC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_SYSC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_SYSC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_SYSC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brown-out Reset. +#define AT91C_SYSC_NRSTL (0x1 << 16) // (RSTC) NRST pin level +#define AT91C_SYSC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- SYSC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_SYSC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_SYSC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_SYSC_ERSTL (0xF << 8) // (RSTC) User Reset Enable +#define AT91C_SYSC_BODIEN (0x1 << 16) // (RSTC) Brown-out Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RTTC structure *** +#define RTTC_RTMR ( 0) // Real-time Mode Register +#define RTTC_RTAR ( 4) // Real-time Alarm Register +#define RTTC_RTVR ( 8) // Real-time Value Register +#define RTTC_RTSR (12) // Real-time Status Register +// -------- SYSC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_SYSC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_SYSC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_SYSC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_SYSC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- SYSC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_SYSC_ALMV (0x0 << 0) // (RTTC) Alarm Value +// -------- SYSC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_SYSC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value +// -------- SYSC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_SYSC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_SYSC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PITC structure *** +#define PITC_PIMR ( 0) // Period Interval Mode Register +#define PITC_PISR ( 4) // Period Interval Status Register +#define PITC_PIVR ( 8) // Period Interval Value Register +#define PITC_PIIR (12) // Period Interval Image Register +// -------- SYSC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_SYSC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_SYSC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_SYSC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- SYSC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_SYSC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- SYSC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_SYSC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_SYSC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- SYSC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_WDTC structure *** +#define WDTC_WDCR ( 0) // Watchdog Control Register +#define WDTC_WDMR ( 4) // Watchdog Mode Register +#define WDTC_WDSR ( 8) // Watchdog Status Register +// -------- SYSC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_SYSC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart +// -------- SYSC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_SYSC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_SYSC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_SYSC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_SYSC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_SYSC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_SYSC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_SYSC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_SYSC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- SYSC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_SYSC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_SYSC_WDERR (0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_MC structure *** +#define MC_RCR ( 0) // MC Remap Control Register +#define MC_ASR ( 4) // MC Abort Status Register +#define MC_AASR ( 8) // MC Abort Address Status Register +#define MC_FMR (96) // MC Flash Mode Register +#define MC_FCR (100) // MC Flash Command Register +#define MC_FSR (104) // MC Flash Status Register +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +// *** Register offset in AT91S_SPI structure *** +#define SPI_CR ( 0) // Control Register +#define SPI_MR ( 4) // Mode Register +#define SPI_RDR ( 8) // Receive Data Register +#define SPI_TDR (12) // Transmit Data Register +#define SPI_SR (16) // Status Register +#define SPI_IER (20) // Interrupt Enable Register +#define SPI_IDR (24) // Interrupt Disable Register +#define SPI_IMR (28) // Interrupt Mask Register +#define SPI_CSR (48) // Chip Select Register +#define SPI_RPR (256) // Receive Pointer Register +#define SPI_RCR (260) // Receive Counter Register +#define SPI_TPR (264) // Transmit Pointer Register +#define SPI_TCR (268) // Transmit Counter Register +#define SPI_RNPR (272) // Receive Next Pointer Register +#define SPI_RNCR (276) // Receive Next Counter Register +#define SPI_TNPR (280) // Transmit Next Pointer Register +#define SPI_TNCR (284) // Transmit Next Counter Register +#define SPI_PTCR (288) // PDC Transfer Control Register +#define SPI_PTSR (292) // PDC Transfer Status Register +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT (0x1 << 2) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +// *** Register offset in AT91S_ADC structure *** +#define ADC_CR ( 0) // ADC Control Register +#define ADC_MR ( 4) // ADC Mode Register +#define ADC_CHER (16) // ADC Channel Enable Register +#define ADC_CHDR (20) // ADC Channel Disable Register +#define ADC_CHSR (24) // ADC Channel Status Register +#define ADC_SR (28) // ADC Status Register +#define ADC_LCDR (32) // ADC Last Converted Data Register +#define ADC_IER (36) // ADC Interrupt Enable Register +#define ADC_IDR (40) // ADC Interrupt Disable Register +#define ADC_IMR (44) // ADC Interrupt Mask Register +#define ADC_CDR0 (48) // ADC Channel Data Register 0 +#define ADC_CDR1 (52) // ADC Channel Data Register 1 +#define ADC_CDR2 (56) // ADC Channel Data Register 2 +#define ADC_CDR3 (60) // ADC Channel Data Register 3 +#define ADC_CDR4 (64) // ADC Channel Data Register 4 +#define ADC_CDR5 (68) // ADC Channel Data Register 5 +#define ADC_CDR6 (72) // ADC Channel Data Register 6 +#define ADC_CDR7 (76) // ADC Channel Data Register 7 +#define ADC_RPR (256) // Receive Pointer Register +#define ADC_RCR (260) // Receive Counter Register +#define ADC_TPR (264) // Transmit Pointer Register +#define ADC_TCR (268) // Transmit Counter Register +#define ADC_RNPR (272) // Receive Next Pointer Register +#define ADC_RNCR (276) // Receive Next Counter Register +#define ADC_TNPR (280) // Transmit Next Pointer Register +#define ADC_TNCR (284) // Transmit Next Counter Register +#define ADC_PTCR (288) // PDC Transfer Control Register +#define ADC_PTSR (292) // PDC Transfer Status Register +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_SSC structure *** +#define SSC_CR ( 0) // Control Register +#define SSC_CMR ( 4) // Clock Mode Register +#define SSC_RCMR (16) // Receive Clock ModeRegister +#define SSC_RFMR (20) // Receive Frame Mode Register +#define SSC_TCMR (24) // Transmit Clock Mode Register +#define SSC_TFMR (28) // Transmit Frame Mode Register +#define SSC_RHR (32) // Receive Holding Register +#define SSC_THR (36) // Transmit Holding Register +#define SSC_RSHR (48) // Receive Sync Holding Register +#define SSC_TSHR (52) // Transmit Sync Holding Register +#define SSC_RC0R (56) // Receive Compare 0 Register +#define SSC_RC1R (60) // Receive Compare 1 Register +#define SSC_SR (64) // Status Register +#define SSC_IER (68) // Interrupt Enable Register +#define SSC_IDR (72) // Interrupt Disable Register +#define SSC_IMR (76) // Interrupt Mask Register +#define SSC_RPR (256) // Receive Pointer Register +#define SSC_RCR (260) // Receive Counter Register +#define SSC_TPR (264) // Transmit Pointer Register +#define SSC_TCR (268) // Transmit Counter Register +#define SSC_RNPR (272) // Receive Next Pointer Register +#define SSC_RNCR (276) // Receive Next Counter Register +#define SSC_TNPR (280) // Transmit Next Pointer Register +#define SSC_TNCR (284) // Transmit Next Counter Register +#define SSC_PTCR (288) // PDC Transfer Control Register +#define SSC_PTSR (292) // PDC Transfer Status Register +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin +#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_CKG (0x3 << 6) // (SSC) Receive/Transmit Clock Gating Selection +#define AT91C_SSC_CKG_NONE (0x0 << 6) // (SSC) Receive/Transmit Clock Gating: None, continuous clock +#define AT91C_SSC_CKG_LOW (0x1 << 6) // (SSC) Receive/Transmit Clock enabled only if RF Low +#define AT91C_SSC_CKG_HIGH (0x2 << 6) // (SSC) Receive/Transmit Clock enabled only if RF High +#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STOP (0x1 << 12) // (SSC) Receive Stop Selection +#define AT91C_SSC_STTOUT (0x1 << 15) // (SSC) Receive/Transmit Start Output Selection +#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_CP0 (0x1 << 8) // (SSC) Compare 0 +#define AT91C_SSC_CP1 (0x1 << 9) // (SSC) Compare 1 +#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +// *** Register offset in AT91S_USART structure *** +#define US_CR ( 0) // Control Register +#define US_MR ( 4) // Mode Register +#define US_IER ( 8) // Interrupt Enable Register +#define US_IDR (12) // Interrupt Disable Register +#define US_IMR (16) // Interrupt Mask Register +#define US_CSR (20) // Channel Status Register +#define US_RHR (24) // Receiver Holding Register +#define US_THR (28) // Transmitter Holding Register +#define US_BRGR (32) // Baud Rate Generator Register +#define US_RTOR (36) // Receiver Time-out Register +#define US_TTGR (40) // Transmitter Time-guard Register +#define US_FIDI (64) // FI_DI_Ratio Register +#define US_NER (68) // Nb Errors Register +#define US_XXR (72) // XON_XOFF Register +#define US_IF (76) // IRDA_FILTER Register +#define US_RPR (256) // Receive Pointer Register +#define US_RCR (260) // Receive Counter Register +#define US_TPR (264) // Transmit Pointer Register +#define US_TCR (268) // Transmit Counter Register +#define US_RNPR (272) // Receive Next Pointer Register +#define US_RNCR (276) // Receive Next Counter Register +#define US_TNPR (280) // Transmit Next Pointer Register +#define US_TNCR (284) // Transmit Next Counter Register +#define US_PTCR (288) // PDC Transfer Control Register +#define US_PTSR (292) // PDC Transfer Status Register +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTSTA (0x1 << 8) // (USART) Reset Status Bits +#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +// *** Register offset in AT91S_TWI structure *** +#define TWI_CR ( 0) // Control Register +#define TWI_MMR ( 4) // Master Mode Register +#define TWI_SMR ( 8) // Slave Mode Register +#define TWI_IADR (12) // Internal Address Register +#define TWI_CWGR (16) // Clock Waveform Generator Register +#define TWI_SR (32) // Status Register +#define TWI_IER (36) // Interrupt Enable Register +#define TWI_IDR (40) // Interrupt Disable Register +#define TWI_IMR (44) // Interrupt Mask Register +#define TWI_RHR (48) // Receive Holding Register +#define TWI_THR (52) // Transmit Holding Register +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SVEN (0x1 << 4) // (TWI) TWI Slave Transfer Enabled +#define AT91C_TWI_SVDIS (0x1 << 5) // (TWI) TWI Slave Transfer Disabled +#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address +// -------- TWI_SMR : (TWI Offset: 0x8) TWI Slave Mode Register -------- +#define AT91C_TWI_SADR (0x7F << 16) // (TWI) Slave Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_SVREAD (0x1 << 3) // (TWI) Slave Read +#define AT91C_TWI_SVACC (0x1 << 4) // (TWI) Slave Access +#define AT91C_TWI_GCACC (0x1 << 5) // (TWI) General Call Access +#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged +#define AT91C_TWI_ARBLST (0x1 << 9) // (TWI) Arbitration Lost +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_TC structure *** +#define TC_CCR ( 0) // Channel Control Register +#define TC_CMR ( 4) // Channel Mode Register (Capture Mode / Waveform Mode) +#define TC_CV (16) // Counter Value +#define TC_RA (20) // Register A +#define TC_RB (24) // Register B +#define TC_RC (28) // Register C +#define TC_SR (32) // Status Register +#define TC_IER (36) // Interrupt Enable Register +#define TC_IDR (40) // Interrupt Disable Register +#define TC_IMR (44) // Interrupt Mask Register +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_NONE (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_RISING (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_FALLING (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_BOTH (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE (0x1 << 15) // (TC) +#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRCS (0x1 << 7) // (TC) External Trigger +#define AT91C_TC_ETRGS (0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +// *** Register offset in AT91S_TCB structure *** +#define TCB_TC0 ( 0) // TC Channel 0 +#define TCB_TC1 (64) // TC Channel 1 +#define TCB_TC2 (128) // TC Channel 2 +#define TCB_BCR (192) // TC Block Control Register +#define TCB_BMR (196) // TC Block Mode Register +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S (0x1 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S (0x1 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S (0x1 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA2 (0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC_CH structure *** +#define PWMC_CMR ( 0) // Channel Mode Register +#define PWMC_CDTYR ( 4) // Channel Duty Cycle Register +#define PWMC_CPRDR ( 8) // Channel Period Register +#define PWMC_CCNTR (12) // Channel Counter Register +#define PWMC_CUPDR (16) // Channel Update Register +#define PWMC_Reserved (20) // Reserved +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC structure *** +#define PWMC_MR ( 0) // PWMC Mode Register +#define PWMC_ENA ( 4) // PWMC Enable Register +#define PWMC_DIS ( 8) // PWMC Disable Register +#define PWMC_SR (12) // PWMC Status Register +#define PWMC_IER (16) // PWMC Interrupt Enable Register +#define PWMC_IDR (20) // PWMC Interrupt Disable Register +#define PWMC_IMR (24) // PWMC Interrupt Mask Register +#define PWMC_ISR (28) // PWMC Interrupt Status Register +#define PWMC_VR (252) // PWMC Version Register +#define PWMC_CH (512) // PWMC Channel 0 +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 +#define AT91C_PWMC_CHID4 (0x1 << 4) // (PWMC) Channel ID 4 +#define AT91C_PWMC_CHID5 (0x1 << 5) // (PWMC) Channel ID 5 +#define AT91C_PWMC_CHID6 (0x1 << 6) // (PWMC) Channel ID 6 +#define AT91C_PWMC_CHID7 (0x1 << 7) // (PWMC) Channel ID 7 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +// *** Register offset in AT91S_UDP structure *** +#define UDP_NUM ( 0) // Frame Number Register +#define UDP_GLBSTATE ( 4) // Global State Register +#define UDP_FADDR ( 8) // Function Address Register +#define UDP_IER (16) // Interrupt Enable Register +#define UDP_IDR (20) // Interrupt Disable Register +#define UDP_IMR (24) // Interrupt Mask Register +#define UDP_ISR (28) // Interrupt Status Register +#define UDP_ICR (32) // Interrupt Clear Register +#define UDP_RSTEP (40) // Reset Endpoint Register +#define UDP_CSR (48) // Endpoint Control and Status Register +#define UDP_FDR (80) // Endpoint FIFO Data Register +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured +#define AT91C_UDP_RMWUPE (0x1 << 2) // (UDP) Remote Wake Up Enable +#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 (0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 (0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_EPINT6 (0x1 << 6) // (UDP) Endpoint 6 Interrupt +#define AT91C_UDP_EPINT7 (0x1 << 7) // (UDP) Endpoint 7 Interrupt +#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 (0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 (0x1 << 5) // (UDP) Reset Endpoint 5 +#define AT91C_UDP_EP6 (0x1 << 6) // (UDP) Reset Endpoint 6 +#define AT91C_UDP_EP7 (0x1 << 7) // (UDP) Reset Endpoint 7 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7S64 +// ***************************************************************************** +// ========== Register definition for SYSC peripheral ========== +#define AT91C_SYSC_SYSC_VRPM (0xFFFFFD60) // (SYSC) Voltage Regulator Power Mode Register +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_ICCR (0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_IECR (0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_SMR (0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_ISCR (0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_EOICR (0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_DCR (0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_FFER (0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_SVR (0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_SPU (0xFFFFF134) // (AIC) Spurious Vector Register +#define AT91C_AIC_FFDR (0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_FVR (0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_FFSR (0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_IMR (0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_ISR (0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IVR (0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_IDCR (0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_CISR (0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IPR (0xFFFFF10C) // (AIC) Interrupt Pending Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_C2R (0xFFFFF244) // (DBGU) Chip ID2 Register +#define AT91C_DBGU_THR (0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_CSR (0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_IDR (0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_MR (0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_FNTR (0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_C1R (0xFFFFF240) // (DBGU) Chip ID1 Register +#define AT91C_DBGU_BRGR (0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_RHR (0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IMR (0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_IER (0xFFFFF208) // (DBGU) Interrupt Enable Register +#define AT91C_DBGU_CR (0xFFFFF200) // (DBGU) Control Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TNCR (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +#define AT91C_DBGU_RNCR (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_RCR (0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_TCR (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RPR (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_TPR (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RNPR (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_IMR (0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_IER (0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_OWDR (0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_ISR (0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_PPUDR (0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_MDSR (0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_MDER (0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PER (0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_PSR (0xFFFFF408) // (PIOA) PIO Status Register +#define AT91C_PIOA_OER (0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_BSR (0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_PPUER (0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_MDDR (0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_PDR (0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_ODR (0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_IFDR (0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_ABSR (0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_ASR (0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_PPUSR (0xFFFFF468) // (PIOA) Pad Pull-up Status Register +#define AT91C_PIOA_ODSR (0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_SODR (0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_IFSR (0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_IFER (0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_OSR (0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_IDR (0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_PDSR (0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_CODR (0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_OWSR (0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_OWER (0xFFFFF4A0) // (PIOA) Output Write Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_PLLR (0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR (0xFFFFFC24) // (CKGR) Main Clock Frequency Register +#define AT91C_CKGR_MOR (0xFFFFFC20) // (CKGR) Main Oscillator Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_SCSR (0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_SCER (0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR (0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IDR (0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_PCDR (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCDR (0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_SR (0xFFFFFC68) // (PMC) Status Register +#define AT91C_PMC_IER (0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_MCKR (0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_MOR (0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PCER (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCSR (0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_PLLR (0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_MCFR (0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_PCKR (0xFFFFFC40) // (PMC) Programmable Clock Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RSR (0xFFFFFD04) // (RSTC) Reset Status Register +#define AT91C_RSTC_RMR (0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RCR (0xFFFFFD00) // (RSTC) Reset Control Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR (0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTAR (0xFFFFFD24) // (RTTC) Real-time Alarm Register +#define AT91C_RTTC_RTVR (0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTMR (0xFFFFFD20) // (RTTC) Real-time Mode Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIIR (0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PISR (0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIVR (0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PIMR (0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDMR (0xFFFFFD44) // (WDTC) Watchdog Mode Register +#define AT91C_WDTC_WDSR (0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDCR (0xFFFFFD40) // (WDTC) Watchdog Control Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_FCR (0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_ASR (0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_FSR (0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR (0xFFFFFF60) // (MC) MC Flash Mode Register +#define AT91C_MC_AASR (0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_RCR (0xFFFFFF00) // (MC) MC Remap Control Register +// ========== Register definition for PDC_SPI peripheral ========== +#define AT91C_SPI_PTCR (0xFFFE0120) // (PDC_SPI) PDC Transfer Control Register +#define AT91C_SPI_TNPR (0xFFFE0118) // (PDC_SPI) Transmit Next Pointer Register +#define AT91C_SPI_RNPR (0xFFFE0110) // (PDC_SPI) Receive Next Pointer Register +#define AT91C_SPI_TPR (0xFFFE0108) // (PDC_SPI) Transmit Pointer Register +#define AT91C_SPI_RPR (0xFFFE0100) // (PDC_SPI) Receive Pointer Register +#define AT91C_SPI_PTSR (0xFFFE0124) // (PDC_SPI) PDC Transfer Status Register +#define AT91C_SPI_TNCR (0xFFFE011C) // (PDC_SPI) Transmit Next Counter Register +#define AT91C_SPI_RNCR (0xFFFE0114) // (PDC_SPI) Receive Next Counter Register +#define AT91C_SPI_TCR (0xFFFE010C) // (PDC_SPI) Transmit Counter Register +#define AT91C_SPI_RCR (0xFFFE0104) // (PDC_SPI) Receive Counter Register +// ========== Register definition for SPI peripheral ========== +#define AT91C_SPI_CSR (0xFFFE0030) // (SPI) Chip Select Register +#define AT91C_SPI_IDR (0xFFFE0018) // (SPI) Interrupt Disable Register +#define AT91C_SPI_SR (0xFFFE0010) // (SPI) Status Register +#define AT91C_SPI_RDR (0xFFFE0008) // (SPI) Receive Data Register +#define AT91C_SPI_CR (0xFFFE0000) // (SPI) Control Register +#define AT91C_SPI_IMR (0xFFFE001C) // (SPI) Interrupt Mask Register +#define AT91C_SPI_IER (0xFFFE0014) // (SPI) Interrupt Enable Register +#define AT91C_SPI_TDR (0xFFFE000C) // (SPI) Transmit Data Register +#define AT91C_SPI_MR (0xFFFE0004) // (SPI) Mode Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTCR (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_RNPR (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_TPR (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RPR (0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_PTSR (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_TNCR (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNCR (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_TCR (0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_RCR (0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_IMR (0xFFFD802C) // (ADC) ADC Interrupt Mask Register +#define AT91C_ADC_CDR4 (0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR2 (0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR0 (0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR7 (0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR1 (0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_CDR3 (0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR5 (0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_MR (0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_CDR6 (0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_CR (0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CHER (0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR (0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_IER (0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_SR (0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CHDR (0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_IDR (0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_LCDR (0xFFFD8020) // (ADC) ADC Last Converted Data Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_PTCR (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TNPR (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_RNPR (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TPR (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_RPR (0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_PTSR (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +#define AT91C_SSC_TNCR (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RNCR (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TCR (0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR (0xFFFD4104) // (PDC_SSC) Receive Counter Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RFMR (0xFFFD4014) // (SSC) Receive Frame Mode Register +#define AT91C_SSC_CMR (0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_IDR (0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_SR (0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_RC0R (0xFFFD4038) // (SSC) Receive Compare 0 Register +#define AT91C_SSC_RSHR (0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_RHR (0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_TCMR (0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_RCMR (0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_CR (0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR (0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_IER (0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_RC1R (0xFFFD403C) // (SSC) Receive Compare 1 Register +#define AT91C_SSC_TSHR (0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_THR (0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_TFMR (0xFFFD401C) // (SSC) Transmit Frame Mode Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_PTSR (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNCR (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_RNCR (0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_TCR (0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_RCR (0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_PTCR (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TNPR (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RNPR (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_TPR (0xFFFC4108) // (PDC_US1) Transmit Pointer Register +#define AT91C_US1_RPR (0xFFFC4100) // (PDC_US1) Receive Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_XXR (0xFFFC4048) // (US1) XON_XOFF Register +#define AT91C_US1_RHR (0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_IMR (0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_IER (0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_CR (0xFFFC4000) // (US1) Control Register +#define AT91C_US1_RTOR (0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_THR (0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_CSR (0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR (0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_FIDI (0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_BRGR (0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_TTGR (0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_IF (0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER (0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_MR (0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_PTCR (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_TNPR (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TPR (0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RPR (0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_PTSR (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_RNCR (0xFFFC0114) // (PDC_US0) Receive Next Counter Register +#define AT91C_US0_TCR (0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_RCR (0xFFFC0104) // (PDC_US0) Receive Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_TTGR (0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_BRGR (0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_RHR (0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IMR (0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_NER (0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_RTOR (0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_XXR (0xFFFC0048) // (US0) XON_XOFF Register +#define AT91C_US0_FIDI (0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_CR (0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IER (0xFFFC0008) // (US0) Interrupt Enable Register +#define AT91C_US0_IF (0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_MR (0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_IDR (0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_CSR (0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_THR (0xFFFC001C) // (US0) Transmitter Holding Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_RHR (0xFFFB8030) // (TWI) Receive Holding Register +#define AT91C_TWI_IDR (0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_SR (0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_CWGR (0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_SMR (0xFFFB8008) // (TWI) Slave Mode Register +#define AT91C_TWI_CR (0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_THR (0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IMR (0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_IER (0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_IADR (0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR (0xFFFB8004) // (TWI) Master Mode Register +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_IMR (0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_IER (0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_RC (0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_RA (0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_CMR (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_IDR (0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_SR (0xFFFA00A0) // (TC2) Status Register +#define AT91C_TC2_RB (0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_CV (0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_CCR (0xFFFA0080) // (TC2) Channel Control Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_IMR (0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_IER (0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_RC (0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_RA (0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_CMR (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_IDR (0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR (0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_RB (0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CV (0xFFFA0050) // (TC1) Counter Value +#define AT91C_TC1_CCR (0xFFFA0040) // (TC1) Channel Control Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_IMR (0xFFFA002C) // (TC0) Interrupt Mask Register +#define AT91C_TC0_IER (0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RC (0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RA (0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_CMR (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IDR (0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_SR (0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RB (0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CV (0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_CCR (0xFFFA0000) // (TC0) Channel Control Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR (0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR (0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_CH3_CUPDR (0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_CH3_CPRDR (0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_CH3_CMR (0xFFFCC260) // (PWMC_CH3) Channel Mode Register +#define AT91C_CH3_Reserved (0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_CH3_CCNTR (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_CH3_CDTYR (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_CH2_CUPDR (0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_CH2_CPRDR (0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_CH2_CMR (0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_CH2_Reserved (0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_CH2_CCNTR (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_CH2_CDTYR (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_CH1_CUPDR (0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_CH1_CPRDR (0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_CH1_CMR (0xFFFCC220) // (PWMC_CH1) Channel Mode Register +#define AT91C_CH1_Reserved (0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_CH1_CCNTR (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_CH1_CDTYR (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_CH0_CUPDR (0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_CH0_CPRDR (0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_CH0_CMR (0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_CH0_Reserved (0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_CH0_CCNTR (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +#define AT91C_CH0_CDTYR (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_VR (0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_IDR (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_SR (0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_ENA (0xFFFCC004) // (PWMC) PWMC Enable Register +#define AT91C_PWMC_IMR (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR (0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_DIS (0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_ISR (0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_IDR (0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_GLBSTATE (0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_FDR (0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_CSR (0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_RSTEP (0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_ICR (0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_IMR (0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_IER (0xFFFB0010) // (UDP) Interrupt Enable Register +#define AT91C_UDP_FADDR (0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM (0xFFFB0000) // (UDP) Frame Number Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_PWM0 (AT91C_PIO_PA0) // PWM Channel 0 +#define AT91C_PA0_TIOA0 (AT91C_PIO_PA0) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_PWM1 (AT91C_PIO_PA1) // PWM Channel 1 +#define AT91C_PA1_TIOB0 (AT91C_PIO_PA1) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_DTXD (AT91C_PIO_PA10) // DBGU Debug Transmit Data +#define AT91C_PA10_NPCS2 (AT91C_PIO_PA10) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_NPCS0 (AT91C_PIO_PA11) // SPI Peripheral Chip Select 0 +#define AT91C_PA11_PWM0 (AT91C_PIO_PA11) // PWM Channel 0 +#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_MISO (AT91C_PIO_PA12) // SPI Master In Slave +#define AT91C_PA12_PWM1 (AT91C_PIO_PA12) // PWM Channel 1 +#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_MOSI (AT91C_PIO_PA13) // SPI Master Out Slave +#define AT91C_PA13_PWM2 (AT91C_PIO_PA13) // PWM Channel 2 +#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_SPCK (AT91C_PIO_PA14) // SPI Serial Clock +#define AT91C_PA14_PWM3 (AT91C_PIO_PA14) // PWM Channel 3 +#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_TF (AT91C_PIO_PA15) // SSC Transmit Frame Sync +#define AT91C_PA15_TIOA1 (AT91C_PIO_PA15) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_TK (AT91C_PIO_PA16) // SSC Transmit Clock +#define AT91C_PA16_TIOB1 (AT91C_PIO_PA16) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_TD (AT91C_PIO_PA17) // SSC Transmit data +#define AT91C_PA17_PCK1 (AT91C_PIO_PA17) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_RD (AT91C_PIO_PA18) // SSC Receive Data +#define AT91C_PA18_PCK2 (AT91C_PIO_PA18) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_RK (AT91C_PIO_PA19) // SSC Receive Clock +#define AT91C_PA19_FIQ (AT91C_PIO_PA19) // AIC Fast Interrupt Input +#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_PWM2 (AT91C_PIO_PA2) // PWM Channel 2 +#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_RF (AT91C_PIO_PA20) // SSC Receive Frame Sync +#define AT91C_PA20_IRQ0 (AT91C_PIO_PA20) // External Interrupt 0 +#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_RXD1 (AT91C_PIO_PA21) // USART 1 Receive Data +#define AT91C_PA21_PCK1 (AT91C_PIO_PA21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TXD1 (AT91C_PIO_PA22) // USART 1 Transmit Data +#define AT91C_PA22_NPCS3 (AT91C_PIO_PA22) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_SCK1 (AT91C_PIO_PA23) // USART 1 Serial Clock +#define AT91C_PA23_PWM0 (AT91C_PIO_PA23) // PWM Channel 0 +#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RTS1 (AT91C_PIO_PA24) // USART 1 Ready To Send +#define AT91C_PA24_PWM1 (AT91C_PIO_PA24) // PWM Channel 1 +#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_CTS1 (AT91C_PIO_PA25) // USART 1 Clear To Send +#define AT91C_PA25_PWM2 (AT91C_PIO_PA25) // PWM Channel 2 +#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_DCD1 (AT91C_PIO_PA26) // USART 1 Data Carrier Detect +#define AT91C_PA26_TIOA2 (AT91C_PIO_PA26) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DTR1 (AT91C_PIO_PA27) // USART 1 Data Terminal ready +#define AT91C_PA27_TIOB2 (AT91C_PIO_PA27) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DSR1 (AT91C_PIO_PA28) // USART 1 Data Set ready +#define AT91C_PA28_TCLK1 (AT91C_PIO_PA28) // Timer Counter 1 external clock input +#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_RI1 (AT91C_PIO_PA29) // USART 1 Ring Indicator +#define AT91C_PA29_TCLK2 (AT91C_PIO_PA29) // Timer Counter 2 external clock input +#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_TWD (AT91C_PIO_PA3) // TWI Two-wire Serial Data +#define AT91C_PA3_NPCS3 (AT91C_PIO_PA3) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ1 (AT91C_PIO_PA30) // External Interrupt 1 +#define AT91C_PA30_NPCS2 (AT91C_PIO_PA30) // SPI Peripheral Chip Select 2 +#define AT91C_PIO_PA31 (1 << 31) // Pin Controlled by PA31 +#define AT91C_PA31_NPCS1 (AT91C_PIO_PA31) // SPI Peripheral Chip Select 1 +#define AT91C_PA31_PCK2 (AT91C_PIO_PA31) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_TWCK (AT91C_PIO_PA4) // TWI Two-wire Serial Clock +#define AT91C_PA4_TCLK0 (AT91C_PIO_PA4) // Timer Counter 0 external clock input +#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD0 (AT91C_PIO_PA5) // USART 0 Receive Data +#define AT91C_PA5_NPCS3 (AT91C_PIO_PA5) // SPI Peripheral Chip Select 3 +#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD0 (AT91C_PIO_PA6) // USART 0 Transmit Data +#define AT91C_PA6_PCK0 (AT91C_PIO_PA6) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_RTS0 (AT91C_PIO_PA7) // USART 0 Ready To Send +#define AT91C_PA7_PWM3 (AT91C_PIO_PA7) // PWM Channel 3 +#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_CTS0 (AT91C_PIO_PA8) // USART 0 Clear To Send +#define AT91C_PA8_ADTRG (AT91C_PIO_PA8) // ADC External Trigger +#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_DRXD (AT91C_PIO_PA9) // DBGU Debug Receive Data +#define AT91C_PA9_NPCS1 (AT91C_PIO_PA9) // SPI Peripheral Chip Select 1 + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ( 1) // System Peripheral +#define AT91C_ID_PIOA ( 2) // Parallel IO Controller +#define AT91C_ID_3_Reserved ( 3) // Reserved +#define AT91C_ID_ADC ( 4) // Analog-to-Digital Converter +#define AT91C_ID_SPI ( 5) // Serial Peripheral Interface +#define AT91C_ID_US0 ( 6) // USART 0 +#define AT91C_ID_US1 ( 7) // USART 1 +#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ( 9) // Two-Wire Interface +#define AT91C_ID_PWMC (10) // PWM Controller +#define AT91C_ID_UDP (11) // USB Device Port +#define AT91C_ID_TC0 (12) // Timer Counter 0 +#define AT91C_ID_TC1 (13) // Timer Counter 1 +#define AT91C_ID_TC2 (14) // Timer Counter 2 +#define AT91C_ID_15_Reserved (15) // Reserved +#define AT91C_ID_16_Reserved (16) // Reserved +#define AT91C_ID_17_Reserved (17) // Reserved +#define AT91C_ID_18_Reserved (18) // Reserved +#define AT91C_ID_19_Reserved (19) // Reserved +#define AT91C_ID_20_Reserved (20) // Reserved +#define AT91C_ID_21_Reserved (21) // Reserved +#define AT91C_ID_22_Reserved (22) // Reserved +#define AT91C_ID_23_Reserved (23) // Reserved +#define AT91C_ID_24_Reserved (24) // Reserved +#define AT91C_ID_25_Reserved (25) // Reserved +#define AT91C_ID_26_Reserved (26) // Reserved +#define AT91C_ID_27_Reserved (27) // Reserved +#define AT91C_ID_28_Reserved (28) // Reserved +#define AT91C_ID_29_Reserved (29) // Reserved +#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_BASE_SYSC (0xFFFFF000) // (SYSC) Base Address +#define AT91C_BASE_AIC (0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_DBGU (0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PDC_DBGU (0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_PIOA (0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_CKGR (0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC (0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC (0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC (0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC (0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC (0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_MC (0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI (0xFFFE0100) // (PDC_SPI) Base Address +#define AT91C_BASE_SPI (0xFFFE0000) // (SPI) Base Address +#define AT91C_BASE_PDC_ADC (0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC (0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_SSC (0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC (0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_PDC_US1 (0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 (0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 (0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 (0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_TWI (0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_TC2 (0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TC1 (0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC0 (0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TCB (0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_PWMC_CH3 (0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 (0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 (0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 (0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC (0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP (0xFFFB0000) // (UDP) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7S64 +// ***************************************************************************** +#define AT91C_ISRAM (0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE (0x00004000) // Internal SRAM size in byte (16 Kbyte) +#define AT91C_IFLASH (0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE (0x00010000) // Internal ROM size in byte (64 Kbyte) + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h new file mode 100644 index 0000000..ee0cbae --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h @@ -0,0 +1,2715 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X128.h +// Object : AT91SAM7X128 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:23) +// +// CVS Reference : /AT91SAM7X128.pl/1.14/Tue May 10 12:12:05 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +#ifndef AT91SAM7X128_H +#define AT91SAM7X128_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYS { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG PIOA_PER; // PIO Enable Register + AT91_REG PIOA_PDR; // PIO Disable Register + AT91_REG PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG PIOA_OER; // Output Enable Register + AT91_REG PIOA_ODR; // Output Disable Registerr + AT91_REG PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG PIOA_IFER; // Input Filter Enable Register + AT91_REG PIOA_IFDR; // Input Filter Disable Register + AT91_REG PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG PIOA_SODR; // Set Output Data Register + AT91_REG PIOA_CODR; // Clear Output Data Register + AT91_REG PIOA_ODSR; // Output Data Status Register + AT91_REG PIOA_PDSR; // Pin Data Status Register + AT91_REG PIOA_IER; // Interrupt Enable Register + AT91_REG PIOA_IDR; // Interrupt Disable Register + AT91_REG PIOA_IMR; // Interrupt Mask Register + AT91_REG PIOA_ISR; // Interrupt Status Register + AT91_REG PIOA_MDER; // Multi-driver Enable Register + AT91_REG PIOA_MDDR; // Multi-driver Disable Register + AT91_REG PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG PIOA_PPUDR; // Pull-up Disable Register + AT91_REG PIOA_PPUER; // Pull-up Enable Register + AT91_REG PIOA_PPUSR; // Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG PIOA_ASR; // Select A Register + AT91_REG PIOA_BSR; // Select B Register + AT91_REG PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG PIOA_OWER; // Output Write Enable Register + AT91_REG PIOA_OWDR; // Output Write Disable Register + AT91_REG PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[85]; // + AT91_REG PIOB_PER; // PIO Enable Register + AT91_REG PIOB_PDR; // PIO Disable Register + AT91_REG PIOB_PSR; // PIO Status Register + AT91_REG Reserved13[1]; // + AT91_REG PIOB_OER; // Output Enable Register + AT91_REG PIOB_ODR; // Output Disable Registerr + AT91_REG PIOB_OSR; // Output Status Register + AT91_REG Reserved14[1]; // + AT91_REG PIOB_IFER; // Input Filter Enable Register + AT91_REG PIOB_IFDR; // Input Filter Disable Register + AT91_REG PIOB_IFSR; // Input Filter Status Register + AT91_REG Reserved15[1]; // + AT91_REG PIOB_SODR; // Set Output Data Register + AT91_REG PIOB_CODR; // Clear Output Data Register + AT91_REG PIOB_ODSR; // Output Data Status Register + AT91_REG PIOB_PDSR; // Pin Data Status Register + AT91_REG PIOB_IER; // Interrupt Enable Register + AT91_REG PIOB_IDR; // Interrupt Disable Register + AT91_REG PIOB_IMR; // Interrupt Mask Register + AT91_REG PIOB_ISR; // Interrupt Status Register + AT91_REG PIOB_MDER; // Multi-driver Enable Register + AT91_REG PIOB_MDDR; // Multi-driver Disable Register + AT91_REG PIOB_MDSR; // Multi-driver Status Register + AT91_REG Reserved16[1]; // + AT91_REG PIOB_PPUDR; // Pull-up Disable Register + AT91_REG PIOB_PPUER; // Pull-up Enable Register + AT91_REG PIOB_PPUSR; // Pull-up Status Register + AT91_REG Reserved17[1]; // + AT91_REG PIOB_ASR; // Select A Register + AT91_REG PIOB_BSR; // Select B Register + AT91_REG PIOB_ABSR; // AB Select Status Register + AT91_REG Reserved18[9]; // + AT91_REG PIOB_OWER; // Output Write Enable Register + AT91_REG PIOB_OWDR; // Output Write Disable Register + AT91_REG PIOB_OWSR; // Output Write Status Register + AT91_REG Reserved19[341]; // + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved20[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved21[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved22[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved23[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved24[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved25[36]; // + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register + AT91_REG Reserved26[5]; // + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved27[5]; // + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_SYS, *AT91PS_SYS; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL ((unsigned int) 0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved4[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP ((unsigned int) 0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +typedef struct _AT91S_VREG { + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_VREG, *AT91PS_VREG; + +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY ((unsigned int) 0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG Reserved1[1]; // + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved2[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG Reserved2[2]; // + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved3[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG Reserved0[1]; // + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved1[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register + AT91_REG Reserved3[2]; // + AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register + AT91_REG Reserved4[3]; // + AT91_REG UDP_TXVC; // Transceiver Control Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR ((unsigned int) 0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS ((unsigned int) 0x1 << 8) // (UDP) +#define AT91C_UDP_PUON ((unsigned int) 0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +typedef struct _AT91S_CAN_MB { + AT91_REG CAN_MB_MMR; // MailBox Mode Register + AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register + AT91_REG CAN_MB_MID; // MailBox ID Register + AT91_REG CAN_MB_MFID; // MailBox Family ID Register + AT91_REG CAN_MB_MSR; // MailBox Status Register + AT91_REG CAN_MB_MDL; // MailBox Data Low Register + AT91_REG CAN_MB_MDH; // MailBox Data High Register + AT91_REG CAN_MB_MCR; // MailBox Control Register +} AT91S_CAN_MB, *AT91PS_CAN_MB; + +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK ((unsigned int) 0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS ((unsigned int) 0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX ((unsigned int) 0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE ((unsigned int) 0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX ((unsigned int) 0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER ((unsigned int) 0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER ((unsigned int) 0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB ((unsigned int) 0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP ((unsigned int) 0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +typedef struct _AT91S_CAN { + AT91_REG CAN_MR; // Mode Register + AT91_REG CAN_IER; // Interrupt Enable Register + AT91_REG CAN_IDR; // Interrupt Disable Register + AT91_REG CAN_IMR; // Interrupt Mask Register + AT91_REG CAN_SR; // Status Register + AT91_REG CAN_BR; // Baudrate Register + AT91_REG CAN_TIM; // Timer Register + AT91_REG CAN_TIMESTP; // Time Stamp Register + AT91_REG CAN_ECR; // Error Counter Register + AT91_REG CAN_TCR; // Transfer Command Register + AT91_REG CAN_ACR; // Abort Command Register + AT91_REG Reserved0[52]; // + AT91_REG CAN_VR; // Version Register + AT91_REG Reserved1[64]; // + AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 + AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 + AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 + AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 + AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 + AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 + AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 + AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 + AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 + AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 + AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 + AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 + AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 + AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 + AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 + AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 +} AT91S_CAN, *AT91PS_CAN; + +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN ((unsigned int) 0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM ((unsigned int) 0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM ((unsigned int) 0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL ((unsigned int) 0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF ((unsigned int) 0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM ((unsigned int) 0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ ((unsigned int) 0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT ((unsigned int) 0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 ((unsigned int) 0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 ((unsigned int) 0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 ((unsigned int) 0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 ((unsigned int) 0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 ((unsigned int) 0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 ((unsigned int) 0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 ((unsigned int) 0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 ((unsigned int) 0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 ((unsigned int) 0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 ((unsigned int) 0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR ((unsigned int) 0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR ((unsigned int) 0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR ((unsigned int) 0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY ((unsigned int) 0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 ((unsigned int) 0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 ((unsigned int) 0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG ((unsigned int) 0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP ((unsigned int) 0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER ((unsigned int) 0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC ((unsigned int) 0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +typedef struct _AT91S_EMAC { + AT91_REG EMAC_NCR; // Network Control Register + AT91_REG EMAC_NCFGR; // Network Configuration Register + AT91_REG EMAC_NSR; // Network Status Register + AT91_REG Reserved0[2]; // + AT91_REG EMAC_TSR; // Transmit Status Register + AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer + AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer + AT91_REG EMAC_RSR; // Receive Status Register + AT91_REG EMAC_ISR; // Interrupt Status Register + AT91_REG EMAC_IER; // Interrupt Enable Register + AT91_REG EMAC_IDR; // Interrupt Disable Register + AT91_REG EMAC_IMR; // Interrupt Mask Register + AT91_REG EMAC_MAN; // PHY Maintenance Register + AT91_REG EMAC_PTR; // Pause Time Register + AT91_REG EMAC_PFR; // Pause Frames received Register + AT91_REG EMAC_FTO; // Frames Transmitted OK Register + AT91_REG EMAC_SCF; // Single Collision Frame Register + AT91_REG EMAC_MCF; // Multiple Collision Frame Register + AT91_REG EMAC_FRO; // Frames Received OK Register + AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register + AT91_REG EMAC_ALE; // Alignment Error Register + AT91_REG EMAC_DTF; // Deferred Transmission Frame Register + AT91_REG EMAC_LCOL; // Late Collision Register + AT91_REG EMAC_ECOL; // Excessive Collision Register + AT91_REG EMAC_TUND; // Transmit Underrun Error Register + AT91_REG EMAC_CSE; // Carrier Sense Error Register + AT91_REG EMAC_RRE; // Receive Ressource Error Register + AT91_REG EMAC_ROV; // Receive Overrun Errors Register + AT91_REG EMAC_RSE; // Receive Symbol Errors Register + AT91_REG EMAC_ELE; // Excessive Length Errors Register + AT91_REG EMAC_RJA; // Receive Jabbers Register + AT91_REG EMAC_USF; // Undersize Frames Register + AT91_REG EMAC_STE; // SQE Test Error Register + AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register + AT91_REG EMAC_TPF; // Transmitted Pause Frames Register + AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] + AT91_REG EMAC_HRT; // Hash Address Top[63:32] + AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes + AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes + AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes + AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes + AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes + AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes + AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes + AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes + AT91_REG EMAC_TID; // Type ID Checking Register + AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register + AT91_REG EMAC_USRIO; // USER Input/Output Register + AT91_REG EMAC_WOL; // Wake On LAN Register + AT91_REG Reserved1[13]; // + AT91_REG EMAC_REV; // Revision Register +} AT91S_EMAC, *AT91PS_EMAC; + +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB ((unsigned int) 0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB ((unsigned int) 0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE ((unsigned int) 0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE ((unsigned int) 0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE ((unsigned int) 0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT ((unsigned int) 0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT ((unsigned int) 0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT ((unsigned int) 0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP ((unsigned int) 0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART ((unsigned int) 0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD ((unsigned int) 0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD ((unsigned int) 0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME ((unsigned int) 0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF ((unsigned int) 0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC ((unsigned int) 0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI ((unsigned int) 0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI ((unsigned int) 0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG ((unsigned int) 0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE ((unsigned int) 0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK ((unsigned int) 0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE ((unsigned int) 0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF ((unsigned int) 0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD ((unsigned int) 0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO ((unsigned int) 0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX ((unsigned int) 0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND ((unsigned int) 0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR ((unsigned int) 0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR ((unsigned int) 0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR ((unsigned int) 0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP ((unsigned int) 0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK ((unsigned int) 0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR ((unsigned int) 0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP ((unsigned int) 0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ ((unsigned int) 0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE ((unsigned int) 0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA ((unsigned int) 0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA ((unsigned int) 0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW ((unsigned int) 0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF ((unsigned int) 0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII ((unsigned int) 0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP ((unsigned int) 0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF ((unsigned int) 0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_AES { + AT91_REG AES_CR; // Control Register + AT91_REG AES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG AES_IER; // Interrupt Enable Register + AT91_REG AES_IDR; // Interrupt Disable Register + AT91_REG AES_IMR; // Interrupt Mask Register + AT91_REG AES_ISR; // Interrupt Status Register + AT91_REG AES_KEYWxR[4]; // Key Word x Register + AT91_REG Reserved1[4]; // + AT91_REG AES_IDATAxR[4]; // Input Data x Register + AT91_REG AES_ODATAxR[4]; // Output Data x Register + AT91_REG AES_IVxR[4]; // Initialization Vector x Register + AT91_REG Reserved2[35]; // + AT91_REG AES_VR; // AES Version Register + AT91_REG AES_RPR; // Receive Pointer Register + AT91_REG AES_RCR; // Receive Counter Register + AT91_REG AES_TPR; // Transmit Pointer Register + AT91_REG AES_TCR; // Transmit Counter Register + AT91_REG AES_RNPR; // Receive Next Pointer Register + AT91_REG AES_RNCR; // Receive Next Counter Register + AT91_REG AES_TNPR; // Transmit Next Pointer Register + AT91_REG AES_TNCR; // Transmit Next Counter Register + AT91_REG AES_PTCR; // PDC Transfer Control Register + AT91_REG AES_PTSR; // PDC Transfer Status Register +} AT91S_AES, *AT91PS_AES; + +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START ((unsigned int) 0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST ((unsigned int) 0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER ((unsigned int) 0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY ((unsigned int) 0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD ((unsigned int) 0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC ((unsigned int) 0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD ((unsigned int) 0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT ((unsigned int) 0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT ((unsigned int) 0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT ((unsigned int) 0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT ((unsigned int) 0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT ((unsigned int) 0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY ((unsigned int) 0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY ((unsigned int) 0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX ((unsigned int) 0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX ((unsigned int) 0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF ((unsigned int) 0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE ((unsigned int) 0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD ((unsigned int) 0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ ((unsigned int) 0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_TDES { + AT91_REG TDES_CR; // Control Register + AT91_REG TDES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG TDES_IER; // Interrupt Enable Register + AT91_REG TDES_IDR; // Interrupt Disable Register + AT91_REG TDES_IMR; // Interrupt Mask Register + AT91_REG TDES_ISR; // Interrupt Status Register + AT91_REG TDES_KEY1WxR[2]; // Key 1 Word x Register + AT91_REG TDES_KEY2WxR[2]; // Key 2 Word x Register + AT91_REG TDES_KEY3WxR[2]; // Key 3 Word x Register + AT91_REG Reserved1[2]; // + AT91_REG TDES_IDATAxR[2]; // Input Data x Register + AT91_REG Reserved2[2]; // + AT91_REG TDES_ODATAxR[2]; // Output Data x Register + AT91_REG Reserved3[2]; // + AT91_REG TDES_IVxR[2]; // Initialization Vector x Register + AT91_REG Reserved4[37]; // + AT91_REG TDES_VR; // TDES Version Register + AT91_REG TDES_RPR; // Receive Pointer Register + AT91_REG TDES_RCR; // Receive Counter Register + AT91_REG TDES_TPR; // Transmit Pointer Register + AT91_REG TDES_TCR; // Transmit Counter Register + AT91_REG TDES_RNPR; // Receive Next Pointer Register + AT91_REG TDES_RNCR; // Receive Next Counter Register + AT91_REG TDES_TNPR; // Transmit Next Pointer Register + AT91_REG TDES_TNCR; // Transmit Next Counter Register + AT91_REG TDES_PTCR; // PDC Transfer Control Register + AT91_REG TDES_PTSR; // PDC Transfer Status Register +} AT91S_TDES, *AT91PS_TDES; + +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START ((unsigned int) 0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST ((unsigned int) 0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER ((unsigned int) 0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD ((unsigned int) 0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD ((unsigned int) 0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD ((unsigned int) 0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC ((unsigned int) 0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD ((unsigned int) 0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT ((unsigned int) 0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT ((unsigned int) 0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT ((unsigned int) 0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT ((unsigned int) 0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY ((unsigned int) 0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX ((unsigned int) 0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX ((unsigned int) 0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF ((unsigned int) 0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE ((unsigned int) 0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD ((unsigned int) 0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X128 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR ((AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER ((AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR ((AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR ((AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR ((AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR ((AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR ((AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER ((AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR ((AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER ((AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR ((AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR ((AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR ((AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR ((AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR ((AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR ((AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR ((AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR ((AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER ((AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR ((AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR ((AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR ((AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR ((AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR ((AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER ((AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR ((AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR ((AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER ((AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER ((AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR ((AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR ((AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR ((AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR ((AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR ((AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR ((AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR ((AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR ((AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR ((AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR ((AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR ((AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR ((AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER ((AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR ((AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR ((AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR ((AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR ((AT91_REG *) 0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR ((AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR ((AT91_REG *) 0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR ((AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER ((AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR ((AT91_REG *) 0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR ((AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR ((AT91_REG *) 0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR ((AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR ((AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR ((AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR ((AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR ((AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC ((AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL ((AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM ((AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR ((AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID ((AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR ((AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID ((AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH ((AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR ((AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL ((AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID ((AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR ((AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR ((AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM ((AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH ((AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR ((AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID ((AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR ((AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH ((AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID ((AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL ((AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR ((AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM ((AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID ((AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR ((AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID ((AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM ((AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID ((AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR ((AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR ((AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR ((AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL ((AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH ((AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID ((AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR ((AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH ((AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID ((AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR ((AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR ((AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL ((AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM ((AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR ((AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR ((AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID ((AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH ((AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID ((AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR ((AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL ((AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM ((AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID ((AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID ((AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM ((AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR ((AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL ((AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR ((AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH ((AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR ((AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR ((AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH ((AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID ((AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL ((AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID ((AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR ((AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM ((AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR ((AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR ((AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR ((AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER ((AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR ((AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP ((AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR ((AT91_REG *) 0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR ((AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR ((AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM ((AT91_REG *) 0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR ((AT91_REG *) 0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR ((AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR ((AT91_REG *) 0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR ((AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H ((AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L ((AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE ((AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL ((AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE ((AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL ((AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF ((AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND ((AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR ((AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L ((AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR ((AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L ((AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR ((AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR ((AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE ((AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL ((AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID ((AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB ((AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP ((AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO ((AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR ((AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H ((AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV ((AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE ((AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA ((AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP ((AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF ((AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR ((AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT ((AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF ((AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE ((AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ ((AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN ((AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO ((AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV ((AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR ((AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF ((AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR ((AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF ((AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR ((AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L ((AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO ((AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER ((AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H ((AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE ((AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H ((AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE ((AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE ((AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR ((AT91_REG *) 0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR ((AT91_REG *) 0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR ((AT91_REG *) 0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR ((AT91_REG *) 0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR ((AT91_REG *) 0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR ((AT91_REG *) 0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR ((AT91_REG *) 0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR ((AT91_REG *) 0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR ((AT91_REG *) 0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR ((AT91_REG *) 0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR ((AT91_REG *) 0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR ((AT91_REG *) 0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR ((AT91_REG *) 0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR ((AT91_REG *) 0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR ((AT91_REG *) 0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR ((AT91_REG *) 0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR ((AT91_REG *) 0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR ((AT91_REG *) 0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER ((AT91_REG *) 0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR ((AT91_REG *) 0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR ((AT91_REG *) 0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR ((AT91_REG *) 0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR ((AT91_REG *) 0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR ((AT91_REG *) 0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR ((AT91_REG *) 0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR ((AT91_REG *) 0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR ((AT91_REG *) 0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR ((AT91_REG *) 0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR ((AT91_REG *) 0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR ((AT91_REG *) 0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR ((AT91_REG *) 0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR ((AT91_REG *) 0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR ((AT91_REG *) 0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR ((AT91_REG *) 0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR ((AT91_REG *) 0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR ((AT91_REG *) 0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR ((AT91_REG *) 0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR ((AT91_REG *) 0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR ((AT91_REG *) 0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR ((AT91_REG *) 0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER ((AT91_REG *) 0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR ((AT91_REG *) 0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR ((AT91_REG *) 0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR ((AT91_REG *) 0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 ((unsigned int) AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 ((unsigned int) AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD ((unsigned int) AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK ((unsigned int) AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 ((unsigned int) AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 ((unsigned int) AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 ((unsigned int) AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 ((unsigned int) AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 ((unsigned int) AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 ((unsigned int) AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 ((unsigned int) AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 ((unsigned int) AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 ((unsigned int) AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX ((unsigned int) AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 ((unsigned int) AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX ((unsigned int) AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF ((unsigned int) AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 ((unsigned int) AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK ((unsigned int) AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 ((unsigned int) AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD ((unsigned int) AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 ((unsigned int) AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD ((unsigned int) AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 ((unsigned int) AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK ((unsigned int) AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 ((unsigned int) AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF ((unsigned int) AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 ((unsigned int) AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD ((unsigned int) AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 ((unsigned int) AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD ((unsigned int) AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ ((unsigned int) AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 ((unsigned int) AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 ((unsigned int) AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 ((unsigned int) AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 ((unsigned int) AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 ((unsigned int) AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 ((unsigned int) AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 ((unsigned int) AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 ((unsigned int) AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 ((unsigned int) AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 ((unsigned int) AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 ((unsigned int) AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 ((unsigned int) AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 ((unsigned int) AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 ((unsigned int) AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 ((unsigned int) 1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 ((unsigned int) AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 ((unsigned int) 1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN ((unsigned int) AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 ((unsigned int) 1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 ((unsigned int) AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 ((unsigned int) AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 ((unsigned int) 1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 ((unsigned int) AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 ((unsigned int) AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 ((unsigned int) 1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER ((unsigned int) AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 ((unsigned int) AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 ((unsigned int) 1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 ((unsigned int) AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 ((unsigned int) AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 ((unsigned int) 1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 ((unsigned int) AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 ((unsigned int) AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 ((unsigned int) 1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV ((unsigned int) AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 ((unsigned int) 1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL ((unsigned int) AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 ((unsigned int) AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 ((unsigned int) 1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK ((unsigned int) AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 ((unsigned int) AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 ((unsigned int) 1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 ((unsigned int) AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG ((unsigned int) AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 ((unsigned int) 1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 ((unsigned int) AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 ((unsigned int) AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 ((unsigned int) 1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 ((unsigned int) AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 ((unsigned int) 1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 ((unsigned int) AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 ((unsigned int) AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 ((unsigned int) 1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 ((unsigned int) AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 ((unsigned int) AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 ((unsigned int) 1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 ((unsigned int) AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 ((unsigned int) AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 ((unsigned int) 1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 ((unsigned int) AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 ((unsigned int) AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 ((unsigned int) 1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 ((unsigned int) AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 ((unsigned int) AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 ((unsigned int) 1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 ((unsigned int) AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 ((unsigned int) AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 ((unsigned int) 1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 ((unsigned int) AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 ((unsigned int) AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 ((unsigned int) 1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 ((unsigned int) AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 ((unsigned int) AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 ((unsigned int) 1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 ((unsigned int) AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 ((unsigned int) AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 ((unsigned int) 1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 ((unsigned int) AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 ((unsigned int) AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 ((unsigned int) 1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 ((unsigned int) AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 ((unsigned int) 1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 ((unsigned int) AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 ((unsigned int) AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 ((unsigned int) 1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 ((unsigned int) 1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 ((unsigned int) AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 ((unsigned int) 1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 ((unsigned int) AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 ((unsigned int) 1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER ((unsigned int) AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 ((unsigned int) 1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC ((unsigned int) AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 ((unsigned int) 1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO ((unsigned int) AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ((unsigned int) 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ((unsigned int) 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ((unsigned int) 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_CAN ((unsigned int) 15) // Control Area Network Controller +#define AT91C_ID_EMAC ((unsigned int) 16) // Ethernet MAC +#define AT91C_ID_ADC ((unsigned int) 17) // Analog-to-Digital Converter +#define AT91C_ID_AES ((unsigned int) 18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES ((unsigned int) 19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB ((AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG ((AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 ((AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 ((AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 ((AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 ((AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 ((AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 ((AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 ((AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 ((AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 ((AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 ((AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 ((AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN ((AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC ((AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES ((AT91PS_PDC) 0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES ((AT91PS_AES) 0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES ((AT91PS_PDC) 0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES ((AT91PS_TDES) 0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00008000) // Internal SRAM size in byte (32 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00020000) // Internal ROM size in byte (128 Kbyte) + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h new file mode 100644 index 0000000..a84760c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h @@ -0,0 +1,2446 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X128.h +// Object : AT91SAM7X128 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:23) +// +// CVS Reference : /AT91SAM7X128.pl/1.14/Tue May 10 12:12:05 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +// *** Register offset in AT91S_AIC structure *** +#define AIC_SMR ( 0) // Source Mode Register +#define AIC_SVR (128) // Source Vector Register +#define AIC_IVR (256) // IRQ Vector Register +#define AIC_FVR (260) // FIQ Vector Register +#define AIC_ISR (264) // Interrupt Status Register +#define AIC_IPR (268) // Interrupt Pending Register +#define AIC_IMR (272) // Interrupt Mask Register +#define AIC_CISR (276) // Core Interrupt Status Register +#define AIC_IECR (288) // Interrupt Enable Command Register +#define AIC_IDCR (292) // Interrupt Disable Command Register +#define AIC_ICCR (296) // Interrupt Clear Command Register +#define AIC_ISCR (300) // Interrupt Set Command Register +#define AIC_EOICR (304) // End of Interrupt Command Register +#define AIC_SPU (308) // Spurious Vector Register +#define AIC_DCR (312) // Debug Control Register (Protect) +#define AIC_FFER (320) // Fast Forcing Enable Register +#define AIC_FFDR (324) // Fast Forcing Disable Register +#define AIC_FFSR (328) // Fast Forcing Status Register +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +// *** Register offset in AT91S_PDC structure *** +#define PDC_RPR ( 0) // Receive Pointer Register +#define PDC_RCR ( 4) // Receive Counter Register +#define PDC_TPR ( 8) // Transmit Pointer Register +#define PDC_TCR (12) // Transmit Counter Register +#define PDC_RNPR (16) // Receive Next Pointer Register +#define PDC_RNCR (20) // Receive Next Counter Register +#define PDC_TNPR (24) // Transmit Next Pointer Register +#define PDC_TNCR (28) // Transmit Next Counter Register +#define PDC_PTCR (32) // PDC Transfer Control Register +#define PDC_PTSR (36) // PDC Transfer Status Register +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +// *** Register offset in AT91S_DBGU structure *** +#define DBGU_CR ( 0) // Control Register +#define DBGU_MR ( 4) // Mode Register +#define DBGU_IER ( 8) // Interrupt Enable Register +#define DBGU_IDR (12) // Interrupt Disable Register +#define DBGU_IMR (16) // Interrupt Mask Register +#define DBGU_CSR (20) // Channel Status Register +#define DBGU_RHR (24) // Receiver Holding Register +#define DBGU_THR (28) // Transmitter Holding Register +#define DBGU_BRGR (32) // Baud Rate Generator Register +#define DBGU_CIDR (64) // Chip ID Register +#define DBGU_EXID (68) // Chip ID Extension Register +#define DBGU_FNTR (72) // Force NTRST Register +#define DBGU_RPR (256) // Receive Pointer Register +#define DBGU_RCR (260) // Receive Counter Register +#define DBGU_TPR (264) // Transmit Pointer Register +#define DBGU_TCR (268) // Transmit Counter Register +#define DBGU_RNPR (272) // Receive Next Pointer Register +#define DBGU_RNCR (276) // Receive Next Counter Register +#define DBGU_TNPR (280) // Transmit Next Pointer Register +#define DBGU_TNCR (284) // Transmit Next Counter Register +#define DBGU_PTCR (288) // PDC Transfer Control Register +#define DBGU_PTSR (292) // PDC Transfer Status Register +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +// *** Register offset in AT91S_PIO structure *** +#define PIO_PER ( 0) // PIO Enable Register +#define PIO_PDR ( 4) // PIO Disable Register +#define PIO_PSR ( 8) // PIO Status Register +#define PIO_OER (16) // Output Enable Register +#define PIO_ODR (20) // Output Disable Registerr +#define PIO_OSR (24) // Output Status Register +#define PIO_IFER (32) // Input Filter Enable Register +#define PIO_IFDR (36) // Input Filter Disable Register +#define PIO_IFSR (40) // Input Filter Status Register +#define PIO_SODR (48) // Set Output Data Register +#define PIO_CODR (52) // Clear Output Data Register +#define PIO_ODSR (56) // Output Data Status Register +#define PIO_PDSR (60) // Pin Data Status Register +#define PIO_IER (64) // Interrupt Enable Register +#define PIO_IDR (68) // Interrupt Disable Register +#define PIO_IMR (72) // Interrupt Mask Register +#define PIO_ISR (76) // Interrupt Status Register +#define PIO_MDER (80) // Multi-driver Enable Register +#define PIO_MDDR (84) // Multi-driver Disable Register +#define PIO_MDSR (88) // Multi-driver Status Register +#define PIO_PPUDR (96) // Pull-up Disable Register +#define PIO_PPUER (100) // Pull-up Enable Register +#define PIO_PPUSR (104) // Pull-up Status Register +#define PIO_ASR (112) // Select A Register +#define PIO_BSR (116) // Select B Register +#define PIO_ABSR (120) // AB Select Status Register +#define PIO_OWER (160) // Output Write Enable Register +#define PIO_OWDR (164) // Output Write Disable Register +#define PIO_OWSR (168) // Output Write Status Register + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +// *** Register offset in AT91S_CKGR structure *** +#define CKGR_MOR ( 0) // Main Oscillator Register +#define CKGR_MCFR ( 4) // Main Clock Frequency Register +#define CKGR_PLLR (12) // PLL Register +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +// *** Register offset in AT91S_PMC structure *** +#define PMC_SCER ( 0) // System Clock Enable Register +#define PMC_SCDR ( 4) // System Clock Disable Register +#define PMC_SCSR ( 8) // System Clock Status Register +#define PMC_PCER (16) // Peripheral Clock Enable Register +#define PMC_PCDR (20) // Peripheral Clock Disable Register +#define PMC_PCSR (24) // Peripheral Clock Status Register +#define PMC_MOR (32) // Main Oscillator Register +#define PMC_MCFR (36) // Main Clock Frequency Register +#define PMC_PLLR (44) // PLL Register +#define PMC_MCKR (48) // Master Clock Register +#define PMC_PCKR (64) // Programmable Clock Register +#define PMC_IER (96) // Interrupt Enable Register +#define PMC_IDR (100) // Interrupt Disable Register +#define PMC_SR (104) // Status Register +#define PMC_IMR (108) // Interrupt Mask Register +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 (0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RSTC structure *** +#define RSTC_RCR ( 0) // Reset Control Register +#define RSTC_RSR ( 4) // Reset Status Register +#define RSTC_RMR ( 8) // Reset Mode Register +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RTTC structure *** +#define RTTC_RTMR ( 0) // Real-time Mode Register +#define RTTC_RTAR ( 4) // Real-time Alarm Register +#define RTTC_RTVR ( 8) // Real-time Value Register +#define RTTC_RTSR (12) // Real-time Status Register +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PITC structure *** +#define PITC_PIMR ( 0) // Period Interval Mode Register +#define PITC_PISR ( 4) // Period Interval Status Register +#define PITC_PIVR ( 8) // Period Interval Value Register +#define PITC_PIIR (12) // Period Interval Image Register +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_WDTC structure *** +#define WDTC_WDCR ( 0) // Watchdog Control Register +#define WDTC_WDMR ( 4) // Watchdog Mode Register +#define WDTC_WDSR ( 8) // Watchdog Status Register +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_VREG structure *** +#define VREG_MR ( 0) // Voltage Regulator Mode Register +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_MC structure *** +#define MC_RCR ( 0) // MC Remap Control Register +#define MC_ASR ( 4) // MC Abort Status Register +#define MC_AASR ( 8) // MC Abort Address Status Register +#define MC_FMR (96) // MC Flash Mode Register +#define MC_FCR (100) // MC Flash Command Register +#define MC_FSR (104) // MC Flash Status Register +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +// *** Register offset in AT91S_SPI structure *** +#define SPI_CR ( 0) // Control Register +#define SPI_MR ( 4) // Mode Register +#define SPI_RDR ( 8) // Receive Data Register +#define SPI_TDR (12) // Transmit Data Register +#define SPI_SR (16) // Status Register +#define SPI_IER (20) // Interrupt Enable Register +#define SPI_IDR (24) // Interrupt Disable Register +#define SPI_IMR (28) // Interrupt Mask Register +#define SPI_CSR (48) // Chip Select Register +#define SPI_RPR (256) // Receive Pointer Register +#define SPI_RCR (260) // Receive Counter Register +#define SPI_TPR (264) // Transmit Pointer Register +#define SPI_TCR (268) // Transmit Counter Register +#define SPI_RNPR (272) // Receive Next Pointer Register +#define SPI_RNCR (276) // Receive Next Counter Register +#define SPI_TNPR (280) // Transmit Next Pointer Register +#define SPI_TNCR (284) // Transmit Next Counter Register +#define SPI_PTCR (288) // PDC Transfer Control Register +#define SPI_PTSR (292) // PDC Transfer Status Register +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +// *** Register offset in AT91S_USART structure *** +#define US_CR ( 0) // Control Register +#define US_MR ( 4) // Mode Register +#define US_IER ( 8) // Interrupt Enable Register +#define US_IDR (12) // Interrupt Disable Register +#define US_IMR (16) // Interrupt Mask Register +#define US_CSR (20) // Channel Status Register +#define US_RHR (24) // Receiver Holding Register +#define US_THR (28) // Transmitter Holding Register +#define US_BRGR (32) // Baud Rate Generator Register +#define US_RTOR (36) // Receiver Time-out Register +#define US_TTGR (40) // Transmitter Time-guard Register +#define US_FIDI (64) // FI_DI_Ratio Register +#define US_NER (68) // Nb Errors Register +#define US_IF (76) // IRDA_FILTER Register +#define US_RPR (256) // Receive Pointer Register +#define US_RCR (260) // Receive Counter Register +#define US_TPR (264) // Transmit Pointer Register +#define US_TCR (268) // Transmit Counter Register +#define US_RNPR (272) // Receive Next Pointer Register +#define US_RNCR (276) // Receive Next Counter Register +#define US_TNPR (280) // Transmit Next Pointer Register +#define US_TNCR (284) // Transmit Next Counter Register +#define US_PTCR (288) // PDC Transfer Control Register +#define US_PTSR (292) // PDC Transfer Status Register +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_SSC structure *** +#define SSC_CR ( 0) // Control Register +#define SSC_CMR ( 4) // Clock Mode Register +#define SSC_RCMR (16) // Receive Clock ModeRegister +#define SSC_RFMR (20) // Receive Frame Mode Register +#define SSC_TCMR (24) // Transmit Clock Mode Register +#define SSC_TFMR (28) // Transmit Frame Mode Register +#define SSC_RHR (32) // Receive Holding Register +#define SSC_THR (36) // Transmit Holding Register +#define SSC_RSHR (48) // Receive Sync Holding Register +#define SSC_TSHR (52) // Transmit Sync Holding Register +#define SSC_SR (64) // Status Register +#define SSC_IER (68) // Interrupt Enable Register +#define SSC_IDR (72) // Interrupt Disable Register +#define SSC_IMR (76) // Interrupt Mask Register +#define SSC_RPR (256) // Receive Pointer Register +#define SSC_RCR (260) // Receive Counter Register +#define SSC_TPR (264) // Transmit Pointer Register +#define SSC_TCR (268) // Transmit Counter Register +#define SSC_RNPR (272) // Receive Next Pointer Register +#define SSC_RNCR (276) // Receive Next Counter Register +#define SSC_TNPR (280) // Transmit Next Pointer Register +#define SSC_TNCR (284) // Transmit Next Counter Register +#define SSC_PTCR (288) // PDC Transfer Control Register +#define SSC_PTSR (292) // PDC Transfer Status Register +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin +#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +// *** Register offset in AT91S_TWI structure *** +#define TWI_CR ( 0) // Control Register +#define TWI_MMR ( 4) // Master Mode Register +#define TWI_IADR (12) // Internal Address Register +#define TWI_CWGR (16) // Clock Waveform Generator Register +#define TWI_SR (32) // Status Register +#define TWI_IER (36) // Interrupt Enable Register +#define TWI_IDR (40) // Interrupt Disable Register +#define TWI_IMR (44) // Interrupt Mask Register +#define TWI_RHR (48) // Receive Holding Register +#define TWI_THR (52) // Transmit Holding Register +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC_CH structure *** +#define PWMC_CMR ( 0) // Channel Mode Register +#define PWMC_CDTYR ( 4) // Channel Duty Cycle Register +#define PWMC_CPRDR ( 8) // Channel Period Register +#define PWMC_CCNTR (12) // Channel Counter Register +#define PWMC_CUPDR (16) // Channel Update Register +#define PWMC_Reserved (20) // Reserved +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC structure *** +#define PWMC_MR ( 0) // PWMC Mode Register +#define PWMC_ENA ( 4) // PWMC Enable Register +#define PWMC_DIS ( 8) // PWMC Disable Register +#define PWMC_SR (12) // PWMC Status Register +#define PWMC_IER (16) // PWMC Interrupt Enable Register +#define PWMC_IDR (20) // PWMC Interrupt Disable Register +#define PWMC_IMR (24) // PWMC Interrupt Mask Register +#define PWMC_ISR (28) // PWMC Interrupt Status Register +#define PWMC_VR (252) // PWMC Version Register +#define PWMC_CH (512) // PWMC Channel +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +// *** Register offset in AT91S_UDP structure *** +#define UDP_NUM ( 0) // Frame Number Register +#define UDP_GLBSTATE ( 4) // Global State Register +#define UDP_FADDR ( 8) // Function Address Register +#define UDP_IER (16) // Interrupt Enable Register +#define UDP_IDR (20) // Interrupt Disable Register +#define UDP_IMR (24) // Interrupt Mask Register +#define UDP_ISR (28) // Interrupt Status Register +#define UDP_ICR (32) // Interrupt Clear Register +#define UDP_RSTEP (40) // Reset Endpoint Register +#define UDP_CSR (48) // Endpoint Control and Status Register +#define UDP_FDR (80) // Endpoint FIFO Data Register +#define UDP_TXVC (116) // Transceiver Control Register +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 (0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 (0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 (0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 (0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) +#define AT91C_UDP_PUON (0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_TC structure *** +#define TC_CCR ( 0) // Channel Control Register +#define TC_CMR ( 4) // Channel Mode Register (Capture Mode / Waveform Mode) +#define TC_CV (16) // Counter Value +#define TC_RA (20) // Register A +#define TC_RB (24) // Register B +#define TC_RC (28) // Register C +#define TC_SR (32) // Status Register +#define TC_IER (36) // Interrupt Enable Register +#define TC_IDR (40) // Interrupt Disable Register +#define TC_IMR (44) // Interrupt Mask Register +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE (0x1 << 15) // (TC) +#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +// *** Register offset in AT91S_TCB structure *** +#define TCB_TC0 ( 0) // TC Channel 0 +#define TCB_TC1 (64) // TC Channel 1 +#define TCB_TC2 (128) // TC Channel 2 +#define TCB_BCR (192) // TC Block Control Register +#define TCB_BMR (196) // TC Block Mode Register +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +// *** Register offset in AT91S_CAN_MB structure *** +#define CAN_MB_MMR ( 0) // MailBox Mode Register +#define CAN_MB_MAM ( 4) // MailBox Acceptance Mask Register +#define CAN_MB_MID ( 8) // MailBox ID Register +#define CAN_MB_MFID (12) // MailBox Family ID Register +#define CAN_MB_MSR (16) // MailBox Status Register +#define CAN_MB_MDL (20) // MailBox Data Low Register +#define CAN_MB_MDH (24) // MailBox Data High Register +#define CAN_MB_MCR (28) // MailBox Control Register +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK (0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR (0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT (0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS (0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX (0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE (0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX (0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER (0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER (0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB (0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE (0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP (0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC (0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT (0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY (0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI (0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR (0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR (0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +// *** Register offset in AT91S_CAN structure *** +#define CAN_MR ( 0) // Mode Register +#define CAN_IER ( 4) // Interrupt Enable Register +#define CAN_IDR ( 8) // Interrupt Disable Register +#define CAN_IMR (12) // Interrupt Mask Register +#define CAN_SR (16) // Status Register +#define CAN_BR (20) // Baudrate Register +#define CAN_TIM (24) // Timer Register +#define CAN_TIMESTP (28) // Time Stamp Register +#define CAN_ECR (32) // Error Counter Register +#define CAN_TCR (36) // Transfer Command Register +#define CAN_ACR (40) // Abort Command Register +#define CAN_VR (252) // Version Register +#define CAN_MB0 (512) // CAN Mailbox 0 +#define CAN_MB1 (544) // CAN Mailbox 1 +#define CAN_MB2 (576) // CAN Mailbox 2 +#define CAN_MB3 (608) // CAN Mailbox 3 +#define CAN_MB4 (640) // CAN Mailbox 4 +#define CAN_MB5 (672) // CAN Mailbox 5 +#define CAN_MB6 (704) // CAN Mailbox 6 +#define CAN_MB7 (736) // CAN Mailbox 7 +#define CAN_MB8 (768) // CAN Mailbox 8 +#define CAN_MB9 (800) // CAN Mailbox 9 +#define CAN_MB10 (832) // CAN Mailbox 10 +#define CAN_MB11 (864) // CAN Mailbox 11 +#define CAN_MB12 (896) // CAN Mailbox 12 +#define CAN_MB13 (928) // CAN Mailbox 13 +#define CAN_MB14 (960) // CAN Mailbox 14 +#define CAN_MB15 (992) // CAN Mailbox 15 +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN (0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM (0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM (0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL (0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF (0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM (0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ (0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT (0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 (0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 (0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 (0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 (0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 (0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 (0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 (0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 (0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 (0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 (0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 (0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 (0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 (0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 (0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 (0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 (0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA (0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN (0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP (0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF (0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP (0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP (0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF (0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP (0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR (0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR (0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR (0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR (0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR (0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY (0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY (0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY (0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 (0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 (0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG (0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC (0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP (0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP (0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER (0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC (0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC (0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST (0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +// *** Register offset in AT91S_EMAC structure *** +#define EMAC_NCR ( 0) // Network Control Register +#define EMAC_NCFGR ( 4) // Network Configuration Register +#define EMAC_NSR ( 8) // Network Status Register +#define EMAC_TSR (20) // Transmit Status Register +#define EMAC_RBQP (24) // Receive Buffer Queue Pointer +#define EMAC_TBQP (28) // Transmit Buffer Queue Pointer +#define EMAC_RSR (32) // Receive Status Register +#define EMAC_ISR (36) // Interrupt Status Register +#define EMAC_IER (40) // Interrupt Enable Register +#define EMAC_IDR (44) // Interrupt Disable Register +#define EMAC_IMR (48) // Interrupt Mask Register +#define EMAC_MAN (52) // PHY Maintenance Register +#define EMAC_PTR (56) // Pause Time Register +#define EMAC_PFR (60) // Pause Frames received Register +#define EMAC_FTO (64) // Frames Transmitted OK Register +#define EMAC_SCF (68) // Single Collision Frame Register +#define EMAC_MCF (72) // Multiple Collision Frame Register +#define EMAC_FRO (76) // Frames Received OK Register +#define EMAC_FCSE (80) // Frame Check Sequence Error Register +#define EMAC_ALE (84) // Alignment Error Register +#define EMAC_DTF (88) // Deferred Transmission Frame Register +#define EMAC_LCOL (92) // Late Collision Register +#define EMAC_ECOL (96) // Excessive Collision Register +#define EMAC_TUND (100) // Transmit Underrun Error Register +#define EMAC_CSE (104) // Carrier Sense Error Register +#define EMAC_RRE (108) // Receive Ressource Error Register +#define EMAC_ROV (112) // Receive Overrun Errors Register +#define EMAC_RSE (116) // Receive Symbol Errors Register +#define EMAC_ELE (120) // Excessive Length Errors Register +#define EMAC_RJA (124) // Receive Jabbers Register +#define EMAC_USF (128) // Undersize Frames Register +#define EMAC_STE (132) // SQE Test Error Register +#define EMAC_RLE (136) // Receive Length Field Mismatch Register +#define EMAC_TPF (140) // Transmitted Pause Frames Register +#define EMAC_HRB (144) // Hash Address Bottom[31:0] +#define EMAC_HRT (148) // Hash Address Top[63:32] +#define EMAC_SA1L (152) // Specific Address 1 Bottom, First 4 bytes +#define EMAC_SA1H (156) // Specific Address 1 Top, Last 2 bytes +#define EMAC_SA2L (160) // Specific Address 2 Bottom, First 4 bytes +#define EMAC_SA2H (164) // Specific Address 2 Top, Last 2 bytes +#define EMAC_SA3L (168) // Specific Address 3 Bottom, First 4 bytes +#define EMAC_SA3H (172) // Specific Address 3 Top, Last 2 bytes +#define EMAC_SA4L (176) // Specific Address 4 Bottom, First 4 bytes +#define EMAC_SA4H (180) // Specific Address 4 Top, Last 2 bytes +#define EMAC_TID (184) // Type ID Checking Register +#define EMAC_TPQ (188) // Transmit Pause Quantum Register +#define EMAC_USRIO (192) // USER Input/Output Register +#define EMAC_WOL (196) // Wake On LAN Register +#define EMAC_REV (252) // Revision Register +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB (0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB (0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE (0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE (0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE (0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT (0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT (0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT (0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP (0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART (0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT (0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR (0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ (0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD (0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD (0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME (0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF (0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC (0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI (0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI (0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG (0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE (0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK (0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 (0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 (0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 (0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 (0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY (0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE (0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF (0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 (0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 (0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE (0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS (0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD (0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS (0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR (0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO (0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE (0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR (0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL (0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES (0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO (0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX (0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP (0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND (0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA (0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC (0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR (0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD (0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP (0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR (0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR (0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR (0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX (0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR (0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP (0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK (0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR (0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP (0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE (0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ (0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA (0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE (0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA (0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA (0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW (0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF (0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII (0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP (0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG (0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP (0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 (0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF (0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF (0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +// *** Register offset in AT91S_ADC structure *** +#define ADC_CR ( 0) // ADC Control Register +#define ADC_MR ( 4) // ADC Mode Register +#define ADC_CHER (16) // ADC Channel Enable Register +#define ADC_CHDR (20) // ADC Channel Disable Register +#define ADC_CHSR (24) // ADC Channel Status Register +#define ADC_SR (28) // ADC Status Register +#define ADC_LCDR (32) // ADC Last Converted Data Register +#define ADC_IER (36) // ADC Interrupt Enable Register +#define ADC_IDR (40) // ADC Interrupt Disable Register +#define ADC_IMR (44) // ADC Interrupt Mask Register +#define ADC_CDR0 (48) // ADC Channel Data Register 0 +#define ADC_CDR1 (52) // ADC Channel Data Register 1 +#define ADC_CDR2 (56) // ADC Channel Data Register 2 +#define ADC_CDR3 (60) // ADC Channel Data Register 3 +#define ADC_CDR4 (64) // ADC Channel Data Register 4 +#define ADC_CDR5 (68) // ADC Channel Data Register 5 +#define ADC_CDR6 (72) // ADC Channel Data Register 6 +#define ADC_CDR7 (76) // ADC Channel Data Register 7 +#define ADC_RPR (256) // Receive Pointer Register +#define ADC_RCR (260) // Receive Counter Register +#define ADC_TPR (264) // Transmit Pointer Register +#define ADC_TCR (268) // Transmit Counter Register +#define ADC_RNPR (272) // Receive Next Pointer Register +#define ADC_RNCR (276) // Receive Next Counter Register +#define ADC_TNPR (280) // Transmit Next Pointer Register +#define ADC_TNCR (284) // Transmit Next Counter Register +#define ADC_PTCR (288) // PDC Transfer Control Register +#define ADC_PTSR (292) // PDC Transfer Status Register +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +// *** Register offset in AT91S_AES structure *** +#define AES_CR ( 0) // Control Register +#define AES_MR ( 4) // Mode Register +#define AES_IER (16) // Interrupt Enable Register +#define AES_IDR (20) // Interrupt Disable Register +#define AES_IMR (24) // Interrupt Mask Register +#define AES_ISR (28) // Interrupt Status Register +#define AES_KEYWxR (32) // Key Word x Register +#define AES_IDATAxR (64) // Input Data x Register +#define AES_ODATAxR (80) // Output Data x Register +#define AES_IVxR (96) // Initialization Vector x Register +#define AES_VR (252) // AES Version Register +#define AES_RPR (256) // Receive Pointer Register +#define AES_RCR (260) // Receive Counter Register +#define AES_TPR (264) // Transmit Pointer Register +#define AES_TCR (268) // Transmit Counter Register +#define AES_RNPR (272) // Receive Next Pointer Register +#define AES_RNCR (276) // Receive Next Counter Register +#define AES_TNPR (280) // Transmit Next Pointer Register +#define AES_TNCR (284) // Transmit Next Counter Register +#define AES_PTCR (288) // PDC Transfer Control Register +#define AES_PTSR (292) // PDC Transfer Status Register +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START (0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST (0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED (0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER (0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY (0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD (0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL (0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO (0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC (0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD (0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB (0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC (0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB (0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB (0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR (0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD (0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS (0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT (0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT (0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT (0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT (0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT (0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY (0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE (0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN (0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN (0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN (0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN (0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN (0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY (0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX (0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX (0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF (0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE (0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD (0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT (0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY (0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY (0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ (0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +// *** Register offset in AT91S_TDES structure *** +#define TDES_CR ( 0) // Control Register +#define TDES_MR ( 4) // Mode Register +#define TDES_IER (16) // Interrupt Enable Register +#define TDES_IDR (20) // Interrupt Disable Register +#define TDES_IMR (24) // Interrupt Mask Register +#define TDES_ISR (28) // Interrupt Status Register +#define TDES_KEY1WxR (32) // Key 1 Word x Register +#define TDES_KEY2WxR (40) // Key 2 Word x Register +#define TDES_KEY3WxR (48) // Key 3 Word x Register +#define TDES_IDATAxR (64) // Input Data x Register +#define TDES_ODATAxR (80) // Output Data x Register +#define TDES_IVxR (96) // Initialization Vector x Register +#define TDES_VR (252) // TDES Version Register +#define TDES_RPR (256) // Receive Pointer Register +#define TDES_RCR (260) // Receive Counter Register +#define TDES_TPR (264) // Transmit Pointer Register +#define TDES_TCR (268) // Transmit Counter Register +#define TDES_RNPR (272) // Receive Next Pointer Register +#define TDES_RNCR (276) // Receive Next Counter Register +#define TDES_TNPR (280) // Transmit Next Pointer Register +#define TDES_TNCR (284) // Transmit Next Counter Register +#define TDES_PTCR (288) // PDC Transfer Control Register +#define TDES_PTSR (292) // PDC Transfer Status Register +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START (0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST (0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER (0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD (0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD (0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD (0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL (0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO (0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC (0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD (0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB (0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC (0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB (0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB (0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD (0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS (0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT (0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT (0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT (0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT (0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY (0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX (0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX (0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF (0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE (0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD (0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT (0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ (0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X128 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR (0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR (0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR (0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR (0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR (0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR (0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR (0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR (0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR (0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR (0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR (0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER (0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR (0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR (0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR (0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR (0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR (0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU (0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR (0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID (0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR (0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR (0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR (0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR (0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR (0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR (0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR (0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR (0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR (0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR (0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER (0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR (0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR (0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR (0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR (0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER (0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR (0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR (0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER (0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR (0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR (0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR (0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR (0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR (0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR (0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR (0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR (0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER (0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER (0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR (0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER (0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR (0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR (0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR (0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR (0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER (0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR (0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR (0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER (0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR (0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR (0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER (0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR (0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR (0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR (0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR (0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR (0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER (0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR (0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER (0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR (0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR (0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR (0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR (0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR (0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR (0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR (0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR (0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER (0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR (0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR (0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR (0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR (0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR (0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER (0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR (0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR (0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER (0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER (0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR (0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR (0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR (0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR (0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR (0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR (0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR (0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR (0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR (0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR (0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR (0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR (0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER (0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR (0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER (0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR (0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR (0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR (0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR (0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR (0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR (0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR (0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR (0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR (0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR (0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR (0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR (0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR (0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR (0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR (0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR (0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR (0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR (0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR (0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR (0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR (0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR (0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR (0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR (0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR (0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR (0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR (0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR (0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR (0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR (0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR (0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR (0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR (0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER (0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR (0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR (0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR (0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR (0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR (0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR (0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR (0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR (0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR (0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR (0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR (0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR (0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR (0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR (0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR (0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR (0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR (0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER (0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR (0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR (0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR (0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR (0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR (0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR (0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR (0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR (0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR (0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR (0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR (0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR (0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR (0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF (0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER (0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR (0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR (0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR (0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER (0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR (0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR (0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR (0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR (0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR (0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI (0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR (0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR (0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR (0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR (0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR (0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR (0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR (0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR (0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER (0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR (0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR (0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI (0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR (0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR (0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR (0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR (0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR (0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR (0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR (0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF (0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER (0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR (0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR (0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR (0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR (0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR (0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR (0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR (0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR (0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR (0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER (0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR (0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR (0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR (0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR (0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR (0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR (0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR (0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER (0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR (0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR (0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR (0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR (0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR (0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR (0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR (0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR (0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR (0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR (0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved (0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR (0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR (0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved (0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR (0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR (0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR (0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved (0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR (0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR (0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR (0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved (0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR (0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR (0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR (0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS (0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR (0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR (0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR (0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA (0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR (0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR (0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM (0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR (0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR (0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR (0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR (0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR (0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP (0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC (0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE (0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER (0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR (0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC (0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB (0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR (0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER (0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA (0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR (0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV (0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR (0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB (0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR (0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER (0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR (0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR (0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA (0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC (0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR (0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV (0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR (0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV (0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA (0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB (0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR (0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR (0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC (0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER (0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR (0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR (0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR (0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL (0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM (0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR (0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID (0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR (0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID (0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH (0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR (0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL (0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID (0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR (0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR (0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM (0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH (0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR (0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID (0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR (0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH (0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID (0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL (0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR (0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM (0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID (0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR (0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID (0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM (0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID (0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR (0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR (0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR (0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL (0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH (0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID (0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR (0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH (0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID (0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR (0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR (0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL (0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM (0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR (0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR (0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID (0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH (0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID (0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR (0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL (0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM (0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID (0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID (0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM (0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR (0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL (0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR (0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH (0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR (0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR (0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH (0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID (0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL (0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID (0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR (0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM (0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR (0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR (0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR (0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER (0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR (0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP (0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR (0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR (0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR (0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM (0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR (0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR (0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR (0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR (0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H (0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L (0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE (0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL (0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE (0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL (0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF (0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND (0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR (0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L (0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR (0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L (0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR (0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR (0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE (0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL (0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID (0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB (0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP (0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO (0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR (0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H (0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV (0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE (0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA (0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP (0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF (0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR (0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT (0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF (0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE (0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ (0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN (0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO (0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV (0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR (0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF (0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR (0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF (0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR (0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L (0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO (0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER (0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H (0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE (0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H (0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE (0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE (0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR (0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR (0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR (0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 (0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 (0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 (0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 (0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR (0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR (0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 (0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 (0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR (0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR (0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR (0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 (0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 (0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER (0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER (0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR (0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR (0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR (0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR (0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR (0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR (0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR (0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR (0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR (0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR (0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR (0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR (0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR (0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR (0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR (0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR (0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR (0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR (0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR (0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR (0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR (0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER (0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR (0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR (0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR (0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR (0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR (0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR (0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR (0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR (0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR (0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR (0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR (0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR (0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR (0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR (0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR (0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR (0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR (0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR (0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR (0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR (0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR (0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER (0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR (0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR (0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR (0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 (AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 (AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD (AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK (AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 (AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 (AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 (AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 (AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 (AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 (AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 (AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 (AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 (AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 (AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX (AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 (AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX (AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF (AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 (AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK (AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 (AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD (AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 (AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD (AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 (AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK (AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 (AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF (AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 (AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD (AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 (AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD (AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ (AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 (AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 (AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 (AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 (AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 (AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 (AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 (AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 (AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 (AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 (AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 (AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 (AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 (AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 (AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 (AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 (1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK (AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 (AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 (1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN (AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 (1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 (AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 (AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 (1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 (AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 (AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 (1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER (AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 (AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 (1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 (AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 (AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 (1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 (AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 (AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 (1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV (AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 (1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL (AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 (AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 (1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK (AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 (AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 (1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 (AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG (AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 (1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 (AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 (AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 (1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 (AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 (1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 (AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 (AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 (1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 (AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 (AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 (1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 (AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 (AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 (1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 (AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 (AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 (1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 (AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 (AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 (1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 (AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 (AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 (1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 (AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 (AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 (1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 (AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 (AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 (1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 (AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 (AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 (1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 (AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 (AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 (1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 (AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 (1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 (AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 (AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 (1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV (AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 (1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 (AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 (1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 (AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 (1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER (AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 (1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC (AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 (1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO (AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ( 1) // System Peripheral +#define AT91C_ID_PIOA ( 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ( 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ( 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ( 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ( 6) // USART 0 +#define AT91C_ID_US1 ( 7) // USART 1 +#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ( 9) // Two-Wire Interface +#define AT91C_ID_PWMC (10) // PWM Controller +#define AT91C_ID_UDP (11) // USB Device Port +#define AT91C_ID_TC0 (12) // Timer Counter 0 +#define AT91C_ID_TC1 (13) // Timer Counter 1 +#define AT91C_ID_TC2 (14) // Timer Counter 2 +#define AT91C_ID_CAN (15) // Control Area Network Controller +#define AT91C_ID_EMAC (16) // Ethernet MAC +#define AT91C_ID_ADC (17) // Analog-to-Digital Converter +#define AT91C_ID_AES (18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES (19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved (20) // Reserved +#define AT91C_ID_21_Reserved (21) // Reserved +#define AT91C_ID_22_Reserved (22) // Reserved +#define AT91C_ID_23_Reserved (23) // Reserved +#define AT91C_ID_24_Reserved (24) // Reserved +#define AT91C_ID_25_Reserved (25) // Reserved +#define AT91C_ID_26_Reserved (26) // Reserved +#define AT91C_ID_27_Reserved (27) // Reserved +#define AT91C_ID_28_Reserved (28) // Reserved +#define AT91C_ID_29_Reserved (29) // Reserved +#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_BASE_SYS (0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC (0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU (0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU (0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA (0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB (0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR (0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC (0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC (0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC (0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC (0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC (0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG (0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC (0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 (0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 (0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 (0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 (0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 (0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 (0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 (0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 (0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC (0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC (0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI (0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 (0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 (0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 (0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 (0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC (0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP (0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 (0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 (0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 (0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB (0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 (0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 (0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 (0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 (0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 (0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 (0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 (0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 (0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN (0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC (0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC (0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC (0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES (0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES (0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES (0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES (0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X128 +// ***************************************************************************** +#define AT91C_ISRAM (0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE (0x00008000) // Internal SRAM size in byte (32 Kbyte) +#define AT91C_IFLASH (0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE (0x00020000) // Internal ROM size in byte (128 Kbyte) + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h new file mode 100644 index 0000000..733d2f5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h @@ -0,0 +1,2715 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X256.h +// Object : AT91SAM7X256 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +// +// CVS Reference : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +#ifndef AT91SAM7X256_H +#define AT91SAM7X256_H + +typedef volatile unsigned int AT91_REG;// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** +typedef struct _AT91S_SYS { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register + AT91_REG Reserved2[45]; // + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved3[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved4[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register + AT91_REG Reserved5[54]; // + AT91_REG PIOA_PER; // PIO Enable Register + AT91_REG PIOA_PDR; // PIO Disable Register + AT91_REG PIOA_PSR; // PIO Status Register + AT91_REG Reserved6[1]; // + AT91_REG PIOA_OER; // Output Enable Register + AT91_REG PIOA_ODR; // Output Disable Registerr + AT91_REG PIOA_OSR; // Output Status Register + AT91_REG Reserved7[1]; // + AT91_REG PIOA_IFER; // Input Filter Enable Register + AT91_REG PIOA_IFDR; // Input Filter Disable Register + AT91_REG PIOA_IFSR; // Input Filter Status Register + AT91_REG Reserved8[1]; // + AT91_REG PIOA_SODR; // Set Output Data Register + AT91_REG PIOA_CODR; // Clear Output Data Register + AT91_REG PIOA_ODSR; // Output Data Status Register + AT91_REG PIOA_PDSR; // Pin Data Status Register + AT91_REG PIOA_IER; // Interrupt Enable Register + AT91_REG PIOA_IDR; // Interrupt Disable Register + AT91_REG PIOA_IMR; // Interrupt Mask Register + AT91_REG PIOA_ISR; // Interrupt Status Register + AT91_REG PIOA_MDER; // Multi-driver Enable Register + AT91_REG PIOA_MDDR; // Multi-driver Disable Register + AT91_REG PIOA_MDSR; // Multi-driver Status Register + AT91_REG Reserved9[1]; // + AT91_REG PIOA_PPUDR; // Pull-up Disable Register + AT91_REG PIOA_PPUER; // Pull-up Enable Register + AT91_REG PIOA_PPUSR; // Pull-up Status Register + AT91_REG Reserved10[1]; // + AT91_REG PIOA_ASR; // Select A Register + AT91_REG PIOA_BSR; // Select B Register + AT91_REG PIOA_ABSR; // AB Select Status Register + AT91_REG Reserved11[9]; // + AT91_REG PIOA_OWER; // Output Write Enable Register + AT91_REG PIOA_OWDR; // Output Write Disable Register + AT91_REG PIOA_OWSR; // Output Write Status Register + AT91_REG Reserved12[85]; // + AT91_REG PIOB_PER; // PIO Enable Register + AT91_REG PIOB_PDR; // PIO Disable Register + AT91_REG PIOB_PSR; // PIO Status Register + AT91_REG Reserved13[1]; // + AT91_REG PIOB_OER; // Output Enable Register + AT91_REG PIOB_ODR; // Output Disable Registerr + AT91_REG PIOB_OSR; // Output Status Register + AT91_REG Reserved14[1]; // + AT91_REG PIOB_IFER; // Input Filter Enable Register + AT91_REG PIOB_IFDR; // Input Filter Disable Register + AT91_REG PIOB_IFSR; // Input Filter Status Register + AT91_REG Reserved15[1]; // + AT91_REG PIOB_SODR; // Set Output Data Register + AT91_REG PIOB_CODR; // Clear Output Data Register + AT91_REG PIOB_ODSR; // Output Data Status Register + AT91_REG PIOB_PDSR; // Pin Data Status Register + AT91_REG PIOB_IER; // Interrupt Enable Register + AT91_REG PIOB_IDR; // Interrupt Disable Register + AT91_REG PIOB_IMR; // Interrupt Mask Register + AT91_REG PIOB_ISR; // Interrupt Status Register + AT91_REG PIOB_MDER; // Multi-driver Enable Register + AT91_REG PIOB_MDDR; // Multi-driver Disable Register + AT91_REG PIOB_MDSR; // Multi-driver Status Register + AT91_REG Reserved16[1]; // + AT91_REG PIOB_PPUDR; // Pull-up Disable Register + AT91_REG PIOB_PPUER; // Pull-up Enable Register + AT91_REG PIOB_PPUSR; // Pull-up Status Register + AT91_REG Reserved17[1]; // + AT91_REG PIOB_ASR; // Select A Register + AT91_REG PIOB_BSR; // Select B Register + AT91_REG PIOB_ABSR; // AB Select Status Register + AT91_REG Reserved18[9]; // + AT91_REG PIOB_OWER; // Output Write Enable Register + AT91_REG PIOB_OWDR; // Output Write Disable Register + AT91_REG PIOB_OWSR; // Output Write Status Register + AT91_REG Reserved19[341]; // + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved20[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved21[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved22[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved23[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved24[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register + AT91_REG Reserved25[36]; // + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register + AT91_REG Reserved26[5]; // + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register + AT91_REG Reserved27[5]; // + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_SYS, *AT91PS_SYS; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +typedef struct _AT91S_AIC { + AT91_REG AIC_SMR[32]; // Source Mode Register + AT91_REG AIC_SVR[32]; // Source Vector Register + AT91_REG AIC_IVR; // IRQ Vector Register + AT91_REG AIC_FVR; // FIQ Vector Register + AT91_REG AIC_ISR; // Interrupt Status Register + AT91_REG AIC_IPR; // Interrupt Pending Register + AT91_REG AIC_IMR; // Interrupt Mask Register + AT91_REG AIC_CISR; // Core Interrupt Status Register + AT91_REG Reserved0[2]; // + AT91_REG AIC_IECR; // Interrupt Enable Command Register + AT91_REG AIC_IDCR; // Interrupt Disable Command Register + AT91_REG AIC_ICCR; // Interrupt Clear Command Register + AT91_REG AIC_ISCR; // Interrupt Set Command Register + AT91_REG AIC_EOICR; // End of Interrupt Command Register + AT91_REG AIC_SPU; // Spurious Vector Register + AT91_REG AIC_DCR; // Debug Control Register (Protect) + AT91_REG Reserved1[1]; // + AT91_REG AIC_FFER; // Fast Forcing Enable Register + AT91_REG AIC_FFDR; // Fast Forcing Disable Register + AT91_REG AIC_FFSR; // Fast Forcing Status Register +} AT91S_AIC, *AT91PS_AIC; + +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR ((unsigned int) 0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST ((unsigned int) 0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST ((unsigned int) 0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE ((unsigned int) 0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL ((unsigned int) 0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL ((unsigned int) 0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE ((unsigned int) 0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL ((unsigned int) 0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE ((unsigned int) 0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ ((unsigned int) 0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ ((unsigned int) 0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT ((unsigned int) 0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK ((unsigned int) 0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +typedef struct _AT91S_PDC { + AT91_REG PDC_RPR; // Receive Pointer Register + AT91_REG PDC_RCR; // Receive Counter Register + AT91_REG PDC_TPR; // Transmit Pointer Register + AT91_REG PDC_TCR; // Transmit Counter Register + AT91_REG PDC_RNPR; // Receive Next Pointer Register + AT91_REG PDC_RNCR; // Receive Next Counter Register + AT91_REG PDC_TNPR; // Transmit Next Pointer Register + AT91_REG PDC_TNCR; // Transmit Next Counter Register + AT91_REG PDC_PTCR; // PDC Transfer Control Register + AT91_REG PDC_PTSR; // PDC Transfer Status Register +} AT91S_PDC, *AT91PS_PDC; + +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN ((unsigned int) 0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS ((unsigned int) 0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN ((unsigned int) 0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS ((unsigned int) 0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +typedef struct _AT91S_DBGU { + AT91_REG DBGU_CR; // Control Register + AT91_REG DBGU_MR; // Mode Register + AT91_REG DBGU_IER; // Interrupt Enable Register + AT91_REG DBGU_IDR; // Interrupt Disable Register + AT91_REG DBGU_IMR; // Interrupt Mask Register + AT91_REG DBGU_CSR; // Channel Status Register + AT91_REG DBGU_RHR; // Receiver Holding Register + AT91_REG DBGU_THR; // Transmitter Holding Register + AT91_REG DBGU_BRGR; // Baud Rate Generator Register + AT91_REG Reserved0[7]; // + AT91_REG DBGU_CIDR; // Chip ID Register + AT91_REG DBGU_EXID; // Chip ID Extension Register + AT91_REG DBGU_FNTR; // Force NTRST Register + AT91_REG Reserved1[45]; // + AT91_REG DBGU_RPR; // Receive Pointer Register + AT91_REG DBGU_RCR; // Receive Counter Register + AT91_REG DBGU_TPR; // Transmit Pointer Register + AT91_REG DBGU_TCR; // Transmit Counter Register + AT91_REG DBGU_RNPR; // Receive Next Pointer Register + AT91_REG DBGU_RNCR; // Receive Next Counter Register + AT91_REG DBGU_TNPR; // Transmit Next Pointer Register + AT91_REG DBGU_TNCR; // Transmit Next Counter Register + AT91_REG DBGU_PTCR; // PDC Transfer Control Register + AT91_REG DBGU_PTSR; // PDC Transfer Status Register +} AT91S_DBGU, *AT91PS_DBGU; + +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX ((unsigned int) 0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX ((unsigned int) 0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN ((unsigned int) 0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS ((unsigned int) 0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN ((unsigned int) 0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS ((unsigned int) 0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA ((unsigned int) 0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR ((unsigned int) 0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN ((unsigned int) 0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD ((unsigned int) 0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE ((unsigned int) 0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK ((unsigned int) 0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE ((unsigned int) 0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP ((unsigned int) 0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE ((unsigned int) 0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL ((unsigned int) 0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO ((unsigned int) 0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL ((unsigned int) 0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE ((unsigned int) 0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY ((unsigned int) 0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY ((unsigned int) 0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX ((unsigned int) 0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX ((unsigned int) 0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE ((unsigned int) 0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME ((unsigned int) 0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE ((unsigned int) 0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY ((unsigned int) 0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE ((unsigned int) 0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF ((unsigned int) 0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX ((unsigned int) 0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX ((unsigned int) 0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST ((unsigned int) 0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +typedef struct _AT91S_PIO { + AT91_REG PIO_PER; // PIO Enable Register + AT91_REG PIO_PDR; // PIO Disable Register + AT91_REG PIO_PSR; // PIO Status Register + AT91_REG Reserved0[1]; // + AT91_REG PIO_OER; // Output Enable Register + AT91_REG PIO_ODR; // Output Disable Registerr + AT91_REG PIO_OSR; // Output Status Register + AT91_REG Reserved1[1]; // + AT91_REG PIO_IFER; // Input Filter Enable Register + AT91_REG PIO_IFDR; // Input Filter Disable Register + AT91_REG PIO_IFSR; // Input Filter Status Register + AT91_REG Reserved2[1]; // + AT91_REG PIO_SODR; // Set Output Data Register + AT91_REG PIO_CODR; // Clear Output Data Register + AT91_REG PIO_ODSR; // Output Data Status Register + AT91_REG PIO_PDSR; // Pin Data Status Register + AT91_REG PIO_IER; // Interrupt Enable Register + AT91_REG PIO_IDR; // Interrupt Disable Register + AT91_REG PIO_IMR; // Interrupt Mask Register + AT91_REG PIO_ISR; // Interrupt Status Register + AT91_REG PIO_MDER; // Multi-driver Enable Register + AT91_REG PIO_MDDR; // Multi-driver Disable Register + AT91_REG PIO_MDSR; // Multi-driver Status Register + AT91_REG Reserved3[1]; // + AT91_REG PIO_PPUDR; // Pull-up Disable Register + AT91_REG PIO_PPUER; // Pull-up Enable Register + AT91_REG PIO_PPUSR; // Pull-up Status Register + AT91_REG Reserved4[1]; // + AT91_REG PIO_ASR; // Select A Register + AT91_REG PIO_BSR; // Select B Register + AT91_REG PIO_ABSR; // AB Select Status Register + AT91_REG Reserved5[9]; // + AT91_REG PIO_OWER; // Output Write Enable Register + AT91_REG PIO_OWDR; // Output Write Disable Register + AT91_REG PIO_OWSR; // Output Write Status Register +} AT91S_PIO, *AT91PS_PIO; + + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +typedef struct _AT91S_CKGR { + AT91_REG CKGR_MOR; // Main Oscillator Register + AT91_REG CKGR_MCFR; // Main Clock Frequency Register + AT91_REG Reserved0[1]; // + AT91_REG CKGR_PLLR; // PLL Register +} AT91S_CKGR, *AT91PS_CKGR; + +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN ((unsigned int) 0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS ((unsigned int) 0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT ((unsigned int) 0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF ((unsigned int) 0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY ((unsigned int) 0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV ((unsigned int) 0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 ((unsigned int) 0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS ((unsigned int) 0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT ((unsigned int) 0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT ((unsigned int) 0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 ((unsigned int) 0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 ((unsigned int) 0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 ((unsigned int) 0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 ((unsigned int) 0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL ((unsigned int) 0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV ((unsigned int) 0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 ((unsigned int) 0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 ((unsigned int) 0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 ((unsigned int) 0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +typedef struct _AT91S_PMC { + AT91_REG PMC_SCER; // System Clock Enable Register + AT91_REG PMC_SCDR; // System Clock Disable Register + AT91_REG PMC_SCSR; // System Clock Status Register + AT91_REG Reserved0[1]; // + AT91_REG PMC_PCER; // Peripheral Clock Enable Register + AT91_REG PMC_PCDR; // Peripheral Clock Disable Register + AT91_REG PMC_PCSR; // Peripheral Clock Status Register + AT91_REG Reserved1[1]; // + AT91_REG PMC_MOR; // Main Oscillator Register + AT91_REG PMC_MCFR; // Main Clock Frequency Register + AT91_REG Reserved2[1]; // + AT91_REG PMC_PLLR; // PLL Register + AT91_REG PMC_MCKR; // Master Clock Register + AT91_REG Reserved3[3]; // + AT91_REG PMC_PCKR[4]; // Programmable Clock Register + AT91_REG Reserved4[4]; // + AT91_REG PMC_IER; // Interrupt Enable Register + AT91_REG PMC_IDR; // Interrupt Disable Register + AT91_REG PMC_SR; // Status Register + AT91_REG PMC_IMR; // Interrupt Mask Register +} AT91S_PMC, *AT91PS_PMC; + +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK ((unsigned int) 0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP ((unsigned int) 0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 ((unsigned int) 0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 ((unsigned int) 0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 ((unsigned int) 0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 ((unsigned int) 0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS ((unsigned int) 0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK ((unsigned int) 0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK ((unsigned int) 0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK ((unsigned int) 0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES ((unsigned int) 0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK ((unsigned int) 0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 ((unsigned int) 0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 ((unsigned int) 0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 ((unsigned int) 0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 ((unsigned int) 0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 ((unsigned int) 0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 ((unsigned int) 0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS ((unsigned int) 0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK ((unsigned int) 0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY ((unsigned int) 0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY ((unsigned int) 0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY ((unsigned int) 0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY ((unsigned int) 0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY ((unsigned int) 0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RSTC { + AT91_REG RSTC_RCR; // Reset Control Register + AT91_REG RSTC_RSR; // Reset Status Register + AT91_REG RSTC_RMR; // Reset Mode Register +} AT91S_RSTC, *AT91PS_RSTC; + +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST ((unsigned int) 0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST ((unsigned int) 0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST ((unsigned int) 0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY ((unsigned int) 0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS ((unsigned int) 0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS ((unsigned int) 0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP ((unsigned int) 0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP ((unsigned int) 0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP ((unsigned int) 0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG ((unsigned int) 0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE ((unsigned int) 0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER ((unsigned int) 0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT ((unsigned int) 0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL ((unsigned int) 0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP ((unsigned int) 0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN ((unsigned int) 0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN ((unsigned int) 0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL ((unsigned int) 0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN ((unsigned int) 0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_RTTC { + AT91_REG RTTC_RTMR; // Real-time Mode Register + AT91_REG RTTC_RTAR; // Real-time Alarm Register + AT91_REG RTTC_RTVR; // Real-time Value Register + AT91_REG RTTC_RTSR; // Real-time Status Register +} AT91S_RTTC, *AT91PS_RTTC; + +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES ((unsigned int) 0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN ((unsigned int) 0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN ((unsigned int) 0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST ((unsigned int) 0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV ((unsigned int) 0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV ((unsigned int) 0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS ((unsigned int) 0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC ((unsigned int) 0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PITC { + AT91_REG PITC_PIMR; // Period Interval Mode Register + AT91_REG PITC_PISR; // Period Interval Status Register + AT91_REG PITC_PIVR; // Period Interval Value Register + AT91_REG PITC_PIIR; // Period Interval Image Register +} AT91S_PITC, *AT91PS_PITC; + +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV ((unsigned int) 0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN ((unsigned int) 0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN ((unsigned int) 0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS ((unsigned int) 0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV ((unsigned int) 0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT ((unsigned int) 0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +typedef struct _AT91S_WDTC { + AT91_REG WDTC_WDCR; // Watchdog Control Register + AT91_REG WDTC_WDMR; // Watchdog Mode Register + AT91_REG WDTC_WDSR; // Watchdog Status Register +} AT91S_WDTC, *AT91PS_WDTC; + +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY ((unsigned int) 0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV ((unsigned int) 0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN ((unsigned int) 0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN ((unsigned int) 0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC ((unsigned int) 0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS ((unsigned int) 0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD ((unsigned int) 0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT ((unsigned int) 0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT ((unsigned int) 0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF ((unsigned int) 0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR ((unsigned int) 0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +typedef struct _AT91S_VREG { + AT91_REG VREG_MR; // Voltage Regulator Mode Register +} AT91S_VREG, *AT91PS_VREG; + +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY ((unsigned int) 0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +typedef struct _AT91S_MC { + AT91_REG MC_RCR; // MC Remap Control Register + AT91_REG MC_ASR; // MC Abort Status Register + AT91_REG MC_AASR; // MC Abort Address Status Register + AT91_REG Reserved0[21]; // + AT91_REG MC_FMR; // MC Flash Mode Register + AT91_REG MC_FCR; // MC Flash Command Register + AT91_REG MC_FSR; // MC Flash Status Register +} AT91S_MC, *AT91PS_MC; + +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB ((unsigned int) 0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD ((unsigned int) 0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD ((unsigned int) 0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ ((unsigned int) 0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE ((unsigned int) 0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD ((unsigned int) 0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD ((unsigned int) 0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP ((unsigned int) 0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR ((unsigned int) 0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW ((unsigned int) 0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH ((unsigned int) 0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 ((unsigned int) 0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 ((unsigned int) 0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 ((unsigned int) 0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 ((unsigned int) 0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY ((unsigned int) 0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE ((unsigned int) 0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE ((unsigned int) 0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP ((unsigned int) 0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS ((unsigned int) 0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS ((unsigned int) 0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS ((unsigned int) 0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS ((unsigned int) 0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS ((unsigned int) 0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN ((unsigned int) 0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD ((unsigned int) 0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG ((unsigned int) 0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK ((unsigned int) 0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK ((unsigned int) 0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK ((unsigned int) 0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL ((unsigned int) 0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM ((unsigned int) 0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM ((unsigned int) 0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY ((unsigned int) 0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN ((unsigned int) 0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY ((unsigned int) 0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY ((unsigned int) 0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 ((unsigned int) 0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 ((unsigned int) 0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 ((unsigned int) 0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 ((unsigned int) 0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 ((unsigned int) 0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 ((unsigned int) 0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 ((unsigned int) 0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 ((unsigned int) 0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 ((unsigned int) 0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 ((unsigned int) 0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 ((unsigned int) 0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 ((unsigned int) 0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 ((unsigned int) 0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 ((unsigned int) 0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 ((unsigned int) 0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 ((unsigned int) 0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 ((unsigned int) 0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 ((unsigned int) 0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 ((unsigned int) 0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 ((unsigned int) 0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 ((unsigned int) 0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 ((unsigned int) 0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 ((unsigned int) 0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 ((unsigned int) 0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +typedef struct _AT91S_SPI { + AT91_REG SPI_CR; // Control Register + AT91_REG SPI_MR; // Mode Register + AT91_REG SPI_RDR; // Receive Data Register + AT91_REG SPI_TDR; // Transmit Data Register + AT91_REG SPI_SR; // Status Register + AT91_REG SPI_IER; // Interrupt Enable Register + AT91_REG SPI_IDR; // Interrupt Disable Register + AT91_REG SPI_IMR; // Interrupt Mask Register + AT91_REG Reserved0[4]; // + AT91_REG SPI_CSR[4]; // Chip Select Register + AT91_REG Reserved1[48]; // + AT91_REG SPI_RPR; // Receive Pointer Register + AT91_REG SPI_RCR; // Receive Counter Register + AT91_REG SPI_TPR; // Transmit Pointer Register + AT91_REG SPI_TCR; // Transmit Counter Register + AT91_REG SPI_RNPR; // Receive Next Pointer Register + AT91_REG SPI_RNCR; // Receive Next Counter Register + AT91_REG SPI_TNPR; // Transmit Next Pointer Register + AT91_REG SPI_TNCR; // Transmit Next Counter Register + AT91_REG SPI_PTCR; // PDC Transfer Control Register + AT91_REG SPI_PTSR; // PDC Transfer Status Register +} AT91S_SPI, *AT91PS_SPI; + +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN ((unsigned int) 0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS ((unsigned int) 0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST ((unsigned int) 0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER ((unsigned int) 0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR ((unsigned int) 0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS ((unsigned int) 0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED ((unsigned int) 0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE ((unsigned int) 0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC ((unsigned int) 0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV ((unsigned int) 0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS ((unsigned int) 0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB ((unsigned int) 0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS ((unsigned int) 0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD ((unsigned int) 0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD ((unsigned int) 0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS ((unsigned int) 0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF ((unsigned int) 0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE ((unsigned int) 0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF ((unsigned int) 0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES ((unsigned int) 0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX ((unsigned int) 0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX ((unsigned int) 0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF ((unsigned int) 0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE ((unsigned int) 0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR ((unsigned int) 0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY ((unsigned int) 0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS ((unsigned int) 0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL ((unsigned int) 0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA ((unsigned int) 0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT ((unsigned int) 0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS ((unsigned int) 0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 ((unsigned int) 0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 ((unsigned int) 0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 ((unsigned int) 0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 ((unsigned int) 0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 ((unsigned int) 0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 ((unsigned int) 0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 ((unsigned int) 0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 ((unsigned int) 0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 ((unsigned int) 0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR ((unsigned int) 0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS ((unsigned int) 0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT ((unsigned int) 0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +typedef struct _AT91S_USART { + AT91_REG US_CR; // Control Register + AT91_REG US_MR; // Mode Register + AT91_REG US_IER; // Interrupt Enable Register + AT91_REG US_IDR; // Interrupt Disable Register + AT91_REG US_IMR; // Interrupt Mask Register + AT91_REG US_CSR; // Channel Status Register + AT91_REG US_RHR; // Receiver Holding Register + AT91_REG US_THR; // Transmitter Holding Register + AT91_REG US_BRGR; // Baud Rate Generator Register + AT91_REG US_RTOR; // Receiver Time-out Register + AT91_REG US_TTGR; // Transmitter Time-guard Register + AT91_REG Reserved0[5]; // + AT91_REG US_FIDI; // FI_DI_Ratio Register + AT91_REG US_NER; // Nb Errors Register + AT91_REG Reserved1[1]; // + AT91_REG US_IF; // IRDA_FILTER Register + AT91_REG Reserved2[44]; // + AT91_REG US_RPR; // Receive Pointer Register + AT91_REG US_RCR; // Receive Counter Register + AT91_REG US_TPR; // Transmit Pointer Register + AT91_REG US_TCR; // Transmit Counter Register + AT91_REG US_RNPR; // Receive Next Pointer Register + AT91_REG US_RNCR; // Receive Next Counter Register + AT91_REG US_TNPR; // Transmit Next Pointer Register + AT91_REG US_TNCR; // Transmit Next Counter Register + AT91_REG US_PTCR; // PDC Transfer Control Register + AT91_REG US_PTSR; // PDC Transfer Status Register +} AT91S_USART, *AT91PS_USART; + +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK ((unsigned int) 0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK ((unsigned int) 0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO ((unsigned int) 0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA ((unsigned int) 0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT ((unsigned int) 0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK ((unsigned int) 0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO ((unsigned int) 0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN ((unsigned int) 0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS ((unsigned int) 0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN ((unsigned int) 0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS ((unsigned int) 0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE ((unsigned int) 0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL ((unsigned int) 0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 ((unsigned int) 0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH ((unsigned int) 0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM ((unsigned int) 0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 ((unsigned int) 0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 ((unsigned int) 0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA ((unsigned int) 0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH ((unsigned int) 0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS ((unsigned int) 0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK ((unsigned int) 0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 ((unsigned int) 0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW ((unsigned int) 0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT ((unsigned int) 0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL ((unsigned int) 0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS ((unsigned int) 0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS ((unsigned int) 0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS ((unsigned int) 0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS ((unsigned int) 0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC ((unsigned int) 0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP ((unsigned int) 0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT ((unsigned int) 0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT ((unsigned int) 0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT ((unsigned int) 0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF ((unsigned int) 0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 ((unsigned int) 0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO ((unsigned int) 0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER ((unsigned int) 0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK ((unsigned int) 0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK ((unsigned int) 0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER ((unsigned int) 0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER ((unsigned int) 0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK ((unsigned int) 0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT ((unsigned int) 0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION ((unsigned int) 0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK ((unsigned int) 0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC ((unsigned int) 0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC ((unsigned int) 0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC ((unsigned int) 0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC ((unsigned int) 0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI ((unsigned int) 0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR ((unsigned int) 0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD ((unsigned int) 0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS ((unsigned int) 0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +typedef struct _AT91S_SSC { + AT91_REG SSC_CR; // Control Register + AT91_REG SSC_CMR; // Clock Mode Register + AT91_REG Reserved0[2]; // + AT91_REG SSC_RCMR; // Receive Clock ModeRegister + AT91_REG SSC_RFMR; // Receive Frame Mode Register + AT91_REG SSC_TCMR; // Transmit Clock Mode Register + AT91_REG SSC_TFMR; // Transmit Frame Mode Register + AT91_REG SSC_RHR; // Receive Holding Register + AT91_REG SSC_THR; // Transmit Holding Register + AT91_REG Reserved1[2]; // + AT91_REG SSC_RSHR; // Receive Sync Holding Register + AT91_REG SSC_TSHR; // Transmit Sync Holding Register + AT91_REG Reserved2[2]; // + AT91_REG SSC_SR; // Status Register + AT91_REG SSC_IER; // Interrupt Enable Register + AT91_REG SSC_IDR; // Interrupt Disable Register + AT91_REG SSC_IMR; // Interrupt Mask Register + AT91_REG Reserved3[44]; // + AT91_REG SSC_RPR; // Receive Pointer Register + AT91_REG SSC_RCR; // Receive Counter Register + AT91_REG SSC_TPR; // Transmit Pointer Register + AT91_REG SSC_TCR; // Transmit Counter Register + AT91_REG SSC_RNPR; // Receive Next Pointer Register + AT91_REG SSC_RNCR; // Receive Next Counter Register + AT91_REG SSC_TNPR; // Transmit Next Pointer Register + AT91_REG SSC_TNCR; // Transmit Next Counter Register + AT91_REG SSC_PTCR; // PDC Transfer Control Register + AT91_REG SSC_PTSR; // PDC Transfer Status Register +} AT91S_SSC, *AT91PS_SSC; + +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN ((unsigned int) 0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS ((unsigned int) 0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN ((unsigned int) 0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS ((unsigned int) 0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST ((unsigned int) 0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS ((unsigned int) 0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV ((unsigned int) 0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK ((unsigned int) 0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK ((unsigned int) 0x2) // (SSC) RK pin +#define AT91C_SSC_CKO ((unsigned int) 0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE ((unsigned int) 0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS ((unsigned int) 0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX ((unsigned int) 0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI ((unsigned int) 0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START ((unsigned int) 0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS ((unsigned int) 0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX ((unsigned int) 0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF ((unsigned int) 0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF ((unsigned int) 0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF ((unsigned int) 0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF ((unsigned int) 0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF ((unsigned int) 0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF ((unsigned int) 0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 ((unsigned int) 0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY ((unsigned int) 0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD ((unsigned int) 0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN ((unsigned int) 0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP ((unsigned int) 0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF ((unsigned int) 0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB ((unsigned int) 0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN ((unsigned int) 0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS ((unsigned int) 0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE ((unsigned int) 0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE ((unsigned int) 0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE ((unsigned int) 0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW ((unsigned int) 0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH ((unsigned int) 0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE ((unsigned int) 0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE ((unsigned int) 0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF ((unsigned int) 0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN ((unsigned int) 0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY ((unsigned int) 0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY ((unsigned int) 0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX ((unsigned int) 0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE ((unsigned int) 0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY ((unsigned int) 0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN ((unsigned int) 0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX ((unsigned int) 0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF ((unsigned int) 0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN ((unsigned int) 0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN ((unsigned int) 0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA ((unsigned int) 0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA ((unsigned int) 0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +typedef struct _AT91S_TWI { + AT91_REG TWI_CR; // Control Register + AT91_REG TWI_MMR; // Master Mode Register + AT91_REG Reserved0[1]; // + AT91_REG TWI_IADR; // Internal Address Register + AT91_REG TWI_CWGR; // Clock Waveform Generator Register + AT91_REG Reserved1[3]; // + AT91_REG TWI_SR; // Status Register + AT91_REG TWI_IER; // Interrupt Enable Register + AT91_REG TWI_IDR; // Interrupt Disable Register + AT91_REG TWI_IMR; // Interrupt Mask Register + AT91_REG TWI_RHR; // Receive Holding Register + AT91_REG TWI_THR; // Transmit Holding Register +} AT91S_TWI, *AT91PS_TWI; + +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START ((unsigned int) 0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP ((unsigned int) 0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN ((unsigned int) 0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS ((unsigned int) 0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST ((unsigned int) 0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ ((unsigned int) 0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO ((unsigned int) 0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE ((unsigned int) 0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE ((unsigned int) 0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE ((unsigned int) 0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD ((unsigned int) 0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR ((unsigned int) 0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV ((unsigned int) 0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV ((unsigned int) 0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV ((unsigned int) 0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP ((unsigned int) 0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY ((unsigned int) 0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY ((unsigned int) 0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE ((unsigned int) 0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE ((unsigned int) 0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK ((unsigned int) 0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC_CH { + AT91_REG PWMC_CMR; // Channel Mode Register + AT91_REG PWMC_CDTYR; // Channel Duty Cycle Register + AT91_REG PWMC_CPRDR; // Channel Period Register + AT91_REG PWMC_CCNTR; // Channel Counter Register + AT91_REG PWMC_CUPDR; // Channel Update Register + AT91_REG PWMC_Reserved[3]; // Reserved +} AT91S_PWMC_CH, *AT91PS_PWMC_CH; + +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE ((unsigned int) 0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK ((unsigned int) 0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA ((unsigned int) 0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB ((unsigned int) 0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG ((unsigned int) 0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL ((unsigned int) 0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD ((unsigned int) 0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD ((unsigned int) 0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +typedef struct _AT91S_PWMC { + AT91_REG PWMC_MR; // PWMC Mode Register + AT91_REG PWMC_ENA; // PWMC Enable Register + AT91_REG PWMC_DIS; // PWMC Disable Register + AT91_REG PWMC_SR; // PWMC Status Register + AT91_REG PWMC_IER; // PWMC Interrupt Enable Register + AT91_REG PWMC_IDR; // PWMC Interrupt Disable Register + AT91_REG PWMC_IMR; // PWMC Interrupt Mask Register + AT91_REG PWMC_ISR; // PWMC Interrupt Status Register + AT91_REG Reserved0[55]; // + AT91_REG PWMC_VR; // PWMC Version Register + AT91_REG Reserved1[64]; // + AT91S_PWMC_CH PWMC_CH[4]; // PWMC Channel +} AT91S_PWMC, *AT91PS_PWMC; + +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA ((unsigned int) 0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA ((unsigned int) 0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK ((unsigned int) 0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB ((unsigned int) 0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB ((unsigned int) 0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK ((unsigned int) 0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 ((unsigned int) 0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 ((unsigned int) 0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 ((unsigned int) 0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 ((unsigned int) 0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +typedef struct _AT91S_UDP { + AT91_REG UDP_NUM; // Frame Number Register + AT91_REG UDP_GLBSTATE; // Global State Register + AT91_REG UDP_FADDR; // Function Address Register + AT91_REG Reserved0[1]; // + AT91_REG UDP_IER; // Interrupt Enable Register + AT91_REG UDP_IDR; // Interrupt Disable Register + AT91_REG UDP_IMR; // Interrupt Mask Register + AT91_REG UDP_ISR; // Interrupt Status Register + AT91_REG UDP_ICR; // Interrupt Clear Register + AT91_REG Reserved1[1]; // + AT91_REG UDP_RSTEP; // Reset Endpoint Register + AT91_REG Reserved2[1]; // + AT91_REG UDP_CSR[6]; // Endpoint Control and Status Register + AT91_REG Reserved3[2]; // + AT91_REG UDP_FDR[6]; // Endpoint FIFO Data Register + AT91_REG Reserved4[3]; // + AT91_REG UDP_TXVC; // Transceiver Control Register +} AT91S_UDP, *AT91PS_UDP; + +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM ((unsigned int) 0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR ((unsigned int) 0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK ((unsigned int) 0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN ((unsigned int) 0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG ((unsigned int) 0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR ((unsigned int) 0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR ((unsigned int) 0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE ((unsigned int) 0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD ((unsigned int) 0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN ((unsigned int) 0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 ((unsigned int) 0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 ((unsigned int) 0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 ((unsigned int) 0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 ((unsigned int) 0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 ((unsigned int) 0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 ((unsigned int) 0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP ((unsigned int) 0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM ((unsigned int) 0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM ((unsigned int) 0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT ((unsigned int) 0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP ((unsigned int) 0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES ((unsigned int) 0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 ((unsigned int) 0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 ((unsigned int) 0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 ((unsigned int) 0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 ((unsigned int) 0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 ((unsigned int) 0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 ((unsigned int) 0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP ((unsigned int) 0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 ((unsigned int) 0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP ((unsigned int) 0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR ((unsigned int) 0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY ((unsigned int) 0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL ((unsigned int) 0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 ((unsigned int) 0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR ((unsigned int) 0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE ((unsigned int) 0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL ((unsigned int) 0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT ((unsigned int) 0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT ((unsigned int) 0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT ((unsigned int) 0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN ((unsigned int) 0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN ((unsigned int) 0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN ((unsigned int) 0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE ((unsigned int) 0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS ((unsigned int) 0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT ((unsigned int) 0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS ((unsigned int) 0x1 << 8) // (UDP) +#define AT91C_UDP_PUON ((unsigned int) 0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +typedef struct _AT91S_TC { + AT91_REG TC_CCR; // Channel Control Register + AT91_REG TC_CMR; // Channel Mode Register (Capture Mode / Waveform Mode) + AT91_REG Reserved0[2]; // + AT91_REG TC_CV; // Counter Value + AT91_REG TC_RA; // Register A + AT91_REG TC_RB; // Register B + AT91_REG TC_RC; // Register C + AT91_REG TC_SR; // Status Register + AT91_REG TC_IER; // Interrupt Enable Register + AT91_REG TC_IDR; // Interrupt Disable Register + AT91_REG TC_IMR; // Interrupt Mask Register +} AT91S_TC, *AT91PS_TC; + +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN ((unsigned int) 0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS ((unsigned int) 0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG ((unsigned int) 0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS ((unsigned int) 0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK ((unsigned int) 0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK ((unsigned int) 0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK ((unsigned int) 0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK ((unsigned int) 0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK ((unsigned int) 0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 ((unsigned int) 0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 ((unsigned int) 0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 ((unsigned int) 0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI ((unsigned int) 0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST ((unsigned int) 0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE ((unsigned int) 0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 ((unsigned int) 0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 ((unsigned int) 0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 ((unsigned int) 0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP ((unsigned int) 0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS ((unsigned int) 0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG ((unsigned int) 0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG ((unsigned int) 0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE ((unsigned int) 0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING ((unsigned int) 0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING ((unsigned int) 0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH ((unsigned int) 0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT ((unsigned int) 0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB ((unsigned int) 0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 ((unsigned int) 0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 ((unsigned int) 0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 ((unsigned int) 0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG ((unsigned int) 0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG ((unsigned int) 0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL ((unsigned int) 0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP ((unsigned int) 0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN ((unsigned int) 0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO ((unsigned int) 0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO ((unsigned int) 0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG ((unsigned int) 0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE ((unsigned int) 0x1 << 15) // (TC) +#define AT91C_TC_ACPA ((unsigned int) 0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE ((unsigned int) 0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET ((unsigned int) 0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR ((unsigned int) 0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE ((unsigned int) 0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA ((unsigned int) 0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE ((unsigned int) 0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING ((unsigned int) 0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING ((unsigned int) 0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH ((unsigned int) 0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC ((unsigned int) 0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE ((unsigned int) 0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET ((unsigned int) 0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR ((unsigned int) 0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE ((unsigned int) 0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB ((unsigned int) 0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE ((unsigned int) 0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING ((unsigned int) 0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING ((unsigned int) 0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH ((unsigned int) 0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT ((unsigned int) 0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE ((unsigned int) 0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET ((unsigned int) 0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR ((unsigned int) 0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE ((unsigned int) 0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG ((unsigned int) 0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE ((unsigned int) 0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET ((unsigned int) 0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR ((unsigned int) 0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE ((unsigned int) 0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB ((unsigned int) 0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE ((unsigned int) 0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET ((unsigned int) 0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR ((unsigned int) 0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE ((unsigned int) 0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC ((unsigned int) 0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE ((unsigned int) 0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET ((unsigned int) 0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR ((unsigned int) 0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE ((unsigned int) 0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT ((unsigned int) 0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE ((unsigned int) 0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET ((unsigned int) 0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR ((unsigned int) 0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE ((unsigned int) 0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG ((unsigned int) 0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE ((unsigned int) 0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET ((unsigned int) 0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR ((unsigned int) 0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE ((unsigned int) 0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS ((unsigned int) 0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS ((unsigned int) 0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS ((unsigned int) 0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS ((unsigned int) 0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS ((unsigned int) 0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS ((unsigned int) 0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS ((unsigned int) 0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS ((unsigned int) 0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA ((unsigned int) 0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA ((unsigned int) 0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB ((unsigned int) 0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +typedef struct _AT91S_TCB { + AT91S_TC TCB_TC0; // TC Channel 0 + AT91_REG Reserved0[4]; // + AT91S_TC TCB_TC1; // TC Channel 1 + AT91_REG Reserved1[4]; // + AT91S_TC TCB_TC2; // TC Channel 2 + AT91_REG Reserved2[4]; // + AT91_REG TCB_BCR; // TC Block Control Register + AT91_REG TCB_BMR; // TC Block Mode Register +} AT91S_TCB, *AT91PS_TCB; + +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC ((unsigned int) 0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S ((unsigned int) 0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 ((unsigned int) 0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE ((unsigned int) 0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 ((unsigned int) 0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 ((unsigned int) 0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S ((unsigned int) 0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 ((unsigned int) 0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE ((unsigned int) 0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 ((unsigned int) 0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 ((unsigned int) 0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S ((unsigned int) 0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 ((unsigned int) 0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE ((unsigned int) 0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 ((unsigned int) 0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 ((unsigned int) 0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +typedef struct _AT91S_CAN_MB { + AT91_REG CAN_MB_MMR; // MailBox Mode Register + AT91_REG CAN_MB_MAM; // MailBox Acceptance Mask Register + AT91_REG CAN_MB_MID; // MailBox ID Register + AT91_REG CAN_MB_MFID; // MailBox Family ID Register + AT91_REG CAN_MB_MSR; // MailBox Status Register + AT91_REG CAN_MB_MDL; // MailBox Data Low Register + AT91_REG CAN_MB_MDH; // MailBox Data High Register + AT91_REG CAN_MB_MCR; // MailBox Control Register +} AT91S_CAN_MB, *AT91PS_CAN_MB; + +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK ((unsigned int) 0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT ((unsigned int) 0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS ((unsigned int) 0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX ((unsigned int) 0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE ((unsigned int) 0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX ((unsigned int) 0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER ((unsigned int) 0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER ((unsigned int) 0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB ((unsigned int) 0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA ((unsigned int) 0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE ((unsigned int) 0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP ((unsigned int) 0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC ((unsigned int) 0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR ((unsigned int) 0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT ((unsigned int) 0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI ((unsigned int) 0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR ((unsigned int) 0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR ((unsigned int) 0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +typedef struct _AT91S_CAN { + AT91_REG CAN_MR; // Mode Register + AT91_REG CAN_IER; // Interrupt Enable Register + AT91_REG CAN_IDR; // Interrupt Disable Register + AT91_REG CAN_IMR; // Interrupt Mask Register + AT91_REG CAN_SR; // Status Register + AT91_REG CAN_BR; // Baudrate Register + AT91_REG CAN_TIM; // Timer Register + AT91_REG CAN_TIMESTP; // Time Stamp Register + AT91_REG CAN_ECR; // Error Counter Register + AT91_REG CAN_TCR; // Transfer Command Register + AT91_REG CAN_ACR; // Abort Command Register + AT91_REG Reserved0[52]; // + AT91_REG CAN_VR; // Version Register + AT91_REG Reserved1[64]; // + AT91S_CAN_MB CAN_MB0; // CAN Mailbox 0 + AT91S_CAN_MB CAN_MB1; // CAN Mailbox 1 + AT91S_CAN_MB CAN_MB2; // CAN Mailbox 2 + AT91S_CAN_MB CAN_MB3; // CAN Mailbox 3 + AT91S_CAN_MB CAN_MB4; // CAN Mailbox 4 + AT91S_CAN_MB CAN_MB5; // CAN Mailbox 5 + AT91S_CAN_MB CAN_MB6; // CAN Mailbox 6 + AT91S_CAN_MB CAN_MB7; // CAN Mailbox 7 + AT91S_CAN_MB CAN_MB8; // CAN Mailbox 8 + AT91S_CAN_MB CAN_MB9; // CAN Mailbox 9 + AT91S_CAN_MB CAN_MB10; // CAN Mailbox 10 + AT91S_CAN_MB CAN_MB11; // CAN Mailbox 11 + AT91S_CAN_MB CAN_MB12; // CAN Mailbox 12 + AT91S_CAN_MB CAN_MB13; // CAN Mailbox 13 + AT91S_CAN_MB CAN_MB14; // CAN Mailbox 14 + AT91S_CAN_MB CAN_MB15; // CAN Mailbox 15 +} AT91S_CAN, *AT91PS_CAN; + +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN ((unsigned int) 0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM ((unsigned int) 0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM ((unsigned int) 0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL ((unsigned int) 0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF ((unsigned int) 0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM ((unsigned int) 0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ ((unsigned int) 0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT ((unsigned int) 0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 ((unsigned int) 0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 ((unsigned int) 0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 ((unsigned int) 0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 ((unsigned int) 0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 ((unsigned int) 0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 ((unsigned int) 0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 ((unsigned int) 0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 ((unsigned int) 0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 ((unsigned int) 0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 ((unsigned int) 0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 ((unsigned int) 0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 ((unsigned int) 0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 ((unsigned int) 0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 ((unsigned int) 0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 ((unsigned int) 0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 ((unsigned int) 0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA ((unsigned int) 0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN ((unsigned int) 0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP ((unsigned int) 0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF ((unsigned int) 0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP ((unsigned int) 0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP ((unsigned int) 0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF ((unsigned int) 0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP ((unsigned int) 0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR ((unsigned int) 0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR ((unsigned int) 0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR ((unsigned int) 0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR ((unsigned int) 0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR ((unsigned int) 0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY ((unsigned int) 0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY ((unsigned int) 0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY ((unsigned int) 0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 ((unsigned int) 0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 ((unsigned int) 0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG ((unsigned int) 0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC ((unsigned int) 0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP ((unsigned int) 0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP ((unsigned int) 0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER ((unsigned int) 0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC ((unsigned int) 0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC ((unsigned int) 0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST ((unsigned int) 0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +typedef struct _AT91S_EMAC { + AT91_REG EMAC_NCR; // Network Control Register + AT91_REG EMAC_NCFGR; // Network Configuration Register + AT91_REG EMAC_NSR; // Network Status Register + AT91_REG Reserved0[2]; // + AT91_REG EMAC_TSR; // Transmit Status Register + AT91_REG EMAC_RBQP; // Receive Buffer Queue Pointer + AT91_REG EMAC_TBQP; // Transmit Buffer Queue Pointer + AT91_REG EMAC_RSR; // Receive Status Register + AT91_REG EMAC_ISR; // Interrupt Status Register + AT91_REG EMAC_IER; // Interrupt Enable Register + AT91_REG EMAC_IDR; // Interrupt Disable Register + AT91_REG EMAC_IMR; // Interrupt Mask Register + AT91_REG EMAC_MAN; // PHY Maintenance Register + AT91_REG EMAC_PTR; // Pause Time Register + AT91_REG EMAC_PFR; // Pause Frames received Register + AT91_REG EMAC_FTO; // Frames Transmitted OK Register + AT91_REG EMAC_SCF; // Single Collision Frame Register + AT91_REG EMAC_MCF; // Multiple Collision Frame Register + AT91_REG EMAC_FRO; // Frames Received OK Register + AT91_REG EMAC_FCSE; // Frame Check Sequence Error Register + AT91_REG EMAC_ALE; // Alignment Error Register + AT91_REG EMAC_DTF; // Deferred Transmission Frame Register + AT91_REG EMAC_LCOL; // Late Collision Register + AT91_REG EMAC_ECOL; // Excessive Collision Register + AT91_REG EMAC_TUND; // Transmit Underrun Error Register + AT91_REG EMAC_CSE; // Carrier Sense Error Register + AT91_REG EMAC_RRE; // Receive Ressource Error Register + AT91_REG EMAC_ROV; // Receive Overrun Errors Register + AT91_REG EMAC_RSE; // Receive Symbol Errors Register + AT91_REG EMAC_ELE; // Excessive Length Errors Register + AT91_REG EMAC_RJA; // Receive Jabbers Register + AT91_REG EMAC_USF; // Undersize Frames Register + AT91_REG EMAC_STE; // SQE Test Error Register + AT91_REG EMAC_RLE; // Receive Length Field Mismatch Register + AT91_REG EMAC_TPF; // Transmitted Pause Frames Register + AT91_REG EMAC_HRB; // Hash Address Bottom[31:0] + AT91_REG EMAC_HRT; // Hash Address Top[63:32] + AT91_REG EMAC_SA1L; // Specific Address 1 Bottom, First 4 bytes + AT91_REG EMAC_SA1H; // Specific Address 1 Top, Last 2 bytes + AT91_REG EMAC_SA2L; // Specific Address 2 Bottom, First 4 bytes + AT91_REG EMAC_SA2H; // Specific Address 2 Top, Last 2 bytes + AT91_REG EMAC_SA3L; // Specific Address 3 Bottom, First 4 bytes + AT91_REG EMAC_SA3H; // Specific Address 3 Top, Last 2 bytes + AT91_REG EMAC_SA4L; // Specific Address 4 Bottom, First 4 bytes + AT91_REG EMAC_SA4H; // Specific Address 4 Top, Last 2 bytes + AT91_REG EMAC_TID; // Type ID Checking Register + AT91_REG EMAC_TPQ; // Transmit Pause Quantum Register + AT91_REG EMAC_USRIO; // USER Input/Output Register + AT91_REG EMAC_WOL; // Wake On LAN Register + AT91_REG Reserved1[13]; // + AT91_REG EMAC_REV; // Revision Register +} AT91S_EMAC, *AT91PS_EMAC; + +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB ((unsigned int) 0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB ((unsigned int) 0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE ((unsigned int) 0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE ((unsigned int) 0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE ((unsigned int) 0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT ((unsigned int) 0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT ((unsigned int) 0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT ((unsigned int) 0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP ((unsigned int) 0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART ((unsigned int) 0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT ((unsigned int) 0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR ((unsigned int) 0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ ((unsigned int) 0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD ((unsigned int) 0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD ((unsigned int) 0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME ((unsigned int) 0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF ((unsigned int) 0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC ((unsigned int) 0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI ((unsigned int) 0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI ((unsigned int) 0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG ((unsigned int) 0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE ((unsigned int) 0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK ((unsigned int) 0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 ((unsigned int) 0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 ((unsigned int) 0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 ((unsigned int) 0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 ((unsigned int) 0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE ((unsigned int) 0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF ((unsigned int) 0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 ((unsigned int) 0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 ((unsigned int) 0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 ((unsigned int) 0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 ((unsigned int) 0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE ((unsigned int) 0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS ((unsigned int) 0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD ((unsigned int) 0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS ((unsigned int) 0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO ((unsigned int) 0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX ((unsigned int) 0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND ((unsigned int) 0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR ((unsigned int) 0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD ((unsigned int) 0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP ((unsigned int) 0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR ((unsigned int) 0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR ((unsigned int) 0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR ((unsigned int) 0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX ((unsigned int) 0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR ((unsigned int) 0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP ((unsigned int) 0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK ((unsigned int) 0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR ((unsigned int) 0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP ((unsigned int) 0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE ((unsigned int) 0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ ((unsigned int) 0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE ((unsigned int) 0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA ((unsigned int) 0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA ((unsigned int) 0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW ((unsigned int) 0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF ((unsigned int) 0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII ((unsigned int) 0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP ((unsigned int) 0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG ((unsigned int) 0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP ((unsigned int) 0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 ((unsigned int) 0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF ((unsigned int) 0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF ((unsigned int) 0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +typedef struct _AT91S_ADC { + AT91_REG ADC_CR; // ADC Control Register + AT91_REG ADC_MR; // ADC Mode Register + AT91_REG Reserved0[2]; // + AT91_REG ADC_CHER; // ADC Channel Enable Register + AT91_REG ADC_CHDR; // ADC Channel Disable Register + AT91_REG ADC_CHSR; // ADC Channel Status Register + AT91_REG ADC_SR; // ADC Status Register + AT91_REG ADC_LCDR; // ADC Last Converted Data Register + AT91_REG ADC_IER; // ADC Interrupt Enable Register + AT91_REG ADC_IDR; // ADC Interrupt Disable Register + AT91_REG ADC_IMR; // ADC Interrupt Mask Register + AT91_REG ADC_CDR0; // ADC Channel Data Register 0 + AT91_REG ADC_CDR1; // ADC Channel Data Register 1 + AT91_REG ADC_CDR2; // ADC Channel Data Register 2 + AT91_REG ADC_CDR3; // ADC Channel Data Register 3 + AT91_REG ADC_CDR4; // ADC Channel Data Register 4 + AT91_REG ADC_CDR5; // ADC Channel Data Register 5 + AT91_REG ADC_CDR6; // ADC Channel Data Register 6 + AT91_REG ADC_CDR7; // ADC Channel Data Register 7 + AT91_REG Reserved1[44]; // + AT91_REG ADC_RPR; // Receive Pointer Register + AT91_REG ADC_RCR; // Receive Counter Register + AT91_REG ADC_TPR; // Transmit Pointer Register + AT91_REG ADC_TCR; // Transmit Counter Register + AT91_REG ADC_RNPR; // Receive Next Pointer Register + AT91_REG ADC_RNCR; // Receive Next Counter Register + AT91_REG ADC_TNPR; // Transmit Next Pointer Register + AT91_REG ADC_TNCR; // Transmit Next Counter Register + AT91_REG ADC_PTCR; // PDC Transfer Control Register + AT91_REG ADC_PTSR; // PDC Transfer Status Register +} AT91S_ADC, *AT91PS_ADC; + +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST ((unsigned int) 0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START ((unsigned int) 0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN ((unsigned int) 0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS ((unsigned int) 0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN ((unsigned int) 0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL ((unsigned int) 0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 ((unsigned int) 0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 ((unsigned int) 0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 ((unsigned int) 0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 ((unsigned int) 0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 ((unsigned int) 0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 ((unsigned int) 0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT ((unsigned int) 0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES ((unsigned int) 0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT ((unsigned int) 0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT ((unsigned int) 0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE ((unsigned int) 0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE ((unsigned int) 0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL ((unsigned int) 0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP ((unsigned int) 0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM ((unsigned int) 0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 ((unsigned int) 0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 ((unsigned int) 0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 ((unsigned int) 0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 ((unsigned int) 0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 ((unsigned int) 0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 ((unsigned int) 0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 ((unsigned int) 0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 ((unsigned int) 0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 ((unsigned int) 0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 ((unsigned int) 0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 ((unsigned int) 0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 ((unsigned int) 0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 ((unsigned int) 0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 ((unsigned int) 0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 ((unsigned int) 0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 ((unsigned int) 0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 ((unsigned int) 0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 ((unsigned int) 0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 ((unsigned int) 0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 ((unsigned int) 0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 ((unsigned int) 0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 ((unsigned int) 0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 ((unsigned int) 0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 ((unsigned int) 0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY ((unsigned int) 0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE ((unsigned int) 0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX ((unsigned int) 0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF ((unsigned int) 0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA ((unsigned int) 0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA ((unsigned int) 0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_AES { + AT91_REG AES_CR; // Control Register + AT91_REG AES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG AES_IER; // Interrupt Enable Register + AT91_REG AES_IDR; // Interrupt Disable Register + AT91_REG AES_IMR; // Interrupt Mask Register + AT91_REG AES_ISR; // Interrupt Status Register + AT91_REG AES_KEYWxR[4]; // Key Word x Register + AT91_REG Reserved1[4]; // + AT91_REG AES_IDATAxR[4]; // Input Data x Register + AT91_REG AES_ODATAxR[4]; // Output Data x Register + AT91_REG AES_IVxR[4]; // Initialization Vector x Register + AT91_REG Reserved2[35]; // + AT91_REG AES_VR; // AES Version Register + AT91_REG AES_RPR; // Receive Pointer Register + AT91_REG AES_RCR; // Receive Counter Register + AT91_REG AES_TPR; // Transmit Pointer Register + AT91_REG AES_TCR; // Transmit Counter Register + AT91_REG AES_RNPR; // Receive Next Pointer Register + AT91_REG AES_RNCR; // Receive Next Counter Register + AT91_REG AES_TNPR; // Transmit Next Pointer Register + AT91_REG AES_TNCR; // Transmit Next Counter Register + AT91_REG AES_PTCR; // PDC Transfer Control Register + AT91_REG AES_PTSR; // PDC Transfer Status Register +} AT91S_AES, *AT91PS_AES; + +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START ((unsigned int) 0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST ((unsigned int) 0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED ((unsigned int) 0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER ((unsigned int) 0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY ((unsigned int) 0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD ((unsigned int) 0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC ((unsigned int) 0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD ((unsigned int) 0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR ((unsigned int) 0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD ((unsigned int) 0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS ((unsigned int) 0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT ((unsigned int) 0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT ((unsigned int) 0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT ((unsigned int) 0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT ((unsigned int) 0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT ((unsigned int) 0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY ((unsigned int) 0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE ((unsigned int) 0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN ((unsigned int) 0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN ((unsigned int) 0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN ((unsigned int) 0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN ((unsigned int) 0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN ((unsigned int) 0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY ((unsigned int) 0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX ((unsigned int) 0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX ((unsigned int) 0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF ((unsigned int) 0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE ((unsigned int) 0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD ((unsigned int) 0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT ((unsigned int) 0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY ((unsigned int) 0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY ((unsigned int) 0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ ((unsigned int) 0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +typedef struct _AT91S_TDES { + AT91_REG TDES_CR; // Control Register + AT91_REG TDES_MR; // Mode Register + AT91_REG Reserved0[2]; // + AT91_REG TDES_IER; // Interrupt Enable Register + AT91_REG TDES_IDR; // Interrupt Disable Register + AT91_REG TDES_IMR; // Interrupt Mask Register + AT91_REG TDES_ISR; // Interrupt Status Register + AT91_REG TDES_KEY1WxR[2]; // Key 1 Word x Register + AT91_REG TDES_KEY2WxR[2]; // Key 2 Word x Register + AT91_REG TDES_KEY3WxR[2]; // Key 3 Word x Register + AT91_REG Reserved1[2]; // + AT91_REG TDES_IDATAxR[2]; // Input Data x Register + AT91_REG Reserved2[2]; // + AT91_REG TDES_ODATAxR[2]; // Output Data x Register + AT91_REG Reserved3[2]; // + AT91_REG TDES_IVxR[2]; // Initialization Vector x Register + AT91_REG Reserved4[37]; // + AT91_REG TDES_VR; // TDES Version Register + AT91_REG TDES_RPR; // Receive Pointer Register + AT91_REG TDES_RCR; // Receive Counter Register + AT91_REG TDES_TPR; // Transmit Pointer Register + AT91_REG TDES_TCR; // Transmit Counter Register + AT91_REG TDES_RNPR; // Receive Next Pointer Register + AT91_REG TDES_RNCR; // Receive Next Counter Register + AT91_REG TDES_TNPR; // Transmit Next Pointer Register + AT91_REG TDES_TNCR; // Transmit Next Counter Register + AT91_REG TDES_PTCR; // PDC Transfer Control Register + AT91_REG TDES_PTSR; // PDC Transfer Status Register +} AT91S_TDES, *AT91PS_TDES; + +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START ((unsigned int) 0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST ((unsigned int) 0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER ((unsigned int) 0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD ((unsigned int) 0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD ((unsigned int) 0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD ((unsigned int) 0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL ((unsigned int) 0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO ((unsigned int) 0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC ((unsigned int) 0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD ((unsigned int) 0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB ((unsigned int) 0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC ((unsigned int) 0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB ((unsigned int) 0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB ((unsigned int) 0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD ((unsigned int) 0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS ((unsigned int) 0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT ((unsigned int) 0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT ((unsigned int) 0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT ((unsigned int) 0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT ((unsigned int) 0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY ((unsigned int) 0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX ((unsigned int) 0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX ((unsigned int) 0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF ((unsigned int) 0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE ((unsigned int) 0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD ((unsigned int) 0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT ((unsigned int) 0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC ((unsigned int) 0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC ((unsigned int) 0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC ((unsigned int) 0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ ((unsigned int) 0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR ((AT91_REG *) 0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR ((AT91_REG *) 0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR ((AT91_REG *) 0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR ((AT91_REG *) 0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR ((AT91_REG *) 0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR ((AT91_REG *) 0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR ((AT91_REG *) 0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR ((AT91_REG *) 0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR ((AT91_REG *) 0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR ((AT91_REG *) 0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR ((AT91_REG *) 0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER ((AT91_REG *) 0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR ((AT91_REG *) 0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR ((AT91_REG *) 0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR ((AT91_REG *) 0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR ((AT91_REG *) 0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR ((AT91_REG *) 0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU ((AT91_REG *) 0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR ((AT91_REG *) 0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR ((AT91_REG *) 0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR ((AT91_REG *) 0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR ((AT91_REG *) 0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR ((AT91_REG *) 0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR ((AT91_REG *) 0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR ((AT91_REG *) 0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR ((AT91_REG *) 0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR ((AT91_REG *) 0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR ((AT91_REG *) 0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID ((AT91_REG *) 0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR ((AT91_REG *) 0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR ((AT91_REG *) 0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR ((AT91_REG *) 0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR ((AT91_REG *) 0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR ((AT91_REG *) 0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR ((AT91_REG *) 0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR ((AT91_REG *) 0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR ((AT91_REG *) 0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR ((AT91_REG *) 0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR ((AT91_REG *) 0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER ((AT91_REG *) 0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR ((AT91_REG *) 0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR ((AT91_REG *) 0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR ((AT91_REG *) 0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR ((AT91_REG *) 0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER ((AT91_REG *) 0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR ((AT91_REG *) 0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR ((AT91_REG *) 0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER ((AT91_REG *) 0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR ((AT91_REG *) 0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR ((AT91_REG *) 0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR ((AT91_REG *) 0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR ((AT91_REG *) 0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR ((AT91_REG *) 0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR ((AT91_REG *) 0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR ((AT91_REG *) 0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR ((AT91_REG *) 0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER ((AT91_REG *) 0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER ((AT91_REG *) 0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR ((AT91_REG *) 0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER ((AT91_REG *) 0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR ((AT91_REG *) 0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR ((AT91_REG *) 0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR ((AT91_REG *) 0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR ((AT91_REG *) 0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER ((AT91_REG *) 0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR ((AT91_REG *) 0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR ((AT91_REG *) 0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER ((AT91_REG *) 0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR ((AT91_REG *) 0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR ((AT91_REG *) 0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER ((AT91_REG *) 0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR ((AT91_REG *) 0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR ((AT91_REG *) 0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR ((AT91_REG *) 0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR ((AT91_REG *) 0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR ((AT91_REG *) 0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER ((AT91_REG *) 0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR ((AT91_REG *) 0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER ((AT91_REG *) 0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR ((AT91_REG *) 0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR ((AT91_REG *) 0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR ((AT91_REG *) 0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR ((AT91_REG *) 0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR ((AT91_REG *) 0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR ((AT91_REG *) 0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR ((AT91_REG *) 0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR ((AT91_REG *) 0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER ((AT91_REG *) 0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR ((AT91_REG *) 0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR ((AT91_REG *) 0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR ((AT91_REG *) 0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR ((AT91_REG *) 0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR ((AT91_REG *) 0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER ((AT91_REG *) 0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR ((AT91_REG *) 0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR ((AT91_REG *) 0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER ((AT91_REG *) 0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER ((AT91_REG *) 0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR ((AT91_REG *) 0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR ((AT91_REG *) 0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR ((AT91_REG *) 0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR ((AT91_REG *) 0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER ((AT91_REG *) 0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR ((AT91_REG *) 0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR ((AT91_REG *) 0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR ((AT91_REG *) 0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR ((AT91_REG *) 0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR ((AT91_REG *) 0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR ((AT91_REG *) 0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER ((AT91_REG *) 0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR ((AT91_REG *) 0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER ((AT91_REG *) 0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR ((AT91_REG *) 0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR ((AT91_REG *) 0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR ((AT91_REG *) 0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR ((AT91_REG *) 0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR ((AT91_REG *) 0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR ((AT91_REG *) 0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR ((AT91_REG *) 0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR ((AT91_REG *) 0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR ((AT91_REG *) 0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR ((AT91_REG *) 0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR ((AT91_REG *) 0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR ((AT91_REG *) 0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR ((AT91_REG *) 0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR ((AT91_REG *) 0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR ((AT91_REG *) 0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR ((AT91_REG *) 0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR ((AT91_REG *) 0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR ((AT91_REG *) 0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR ((AT91_REG *) 0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR ((AT91_REG *) 0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR ((AT91_REG *) 0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR ((AT91_REG *) 0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR ((AT91_REG *) 0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR ((AT91_REG *) 0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR ((AT91_REG *) 0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR ((AT91_REG *) 0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR ((AT91_REG *) 0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR ((AT91_REG *) 0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR ((AT91_REG *) 0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR ((AT91_REG *) 0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR ((AT91_REG *) 0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR ((AT91_REG *) 0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR ((AT91_REG *) 0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER ((AT91_REG *) 0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR ((AT91_REG *) 0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR ((AT91_REG *) 0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR ((AT91_REG *) 0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR ((AT91_REG *) 0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR ((AT91_REG *) 0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR ((AT91_REG *) 0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR ((AT91_REG *) 0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR ((AT91_REG *) 0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR ((AT91_REG *) 0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR ((AT91_REG *) 0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR ((AT91_REG *) 0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR ((AT91_REG *) 0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR ((AT91_REG *) 0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR ((AT91_REG *) 0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR ((AT91_REG *) 0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR ((AT91_REG *) 0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR ((AT91_REG *) 0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER ((AT91_REG *) 0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR ((AT91_REG *) 0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR ((AT91_REG *) 0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR ((AT91_REG *) 0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR ((AT91_REG *) 0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR ((AT91_REG *) 0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR ((AT91_REG *) 0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR ((AT91_REG *) 0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR ((AT91_REG *) 0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR ((AT91_REG *) 0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR ((AT91_REG *) 0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR ((AT91_REG *) 0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR ((AT91_REG *) 0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR ((AT91_REG *) 0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR ((AT91_REG *) 0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR ((AT91_REG *) 0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR ((AT91_REG *) 0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR ((AT91_REG *) 0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR ((AT91_REG *) 0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF ((AT91_REG *) 0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER ((AT91_REG *) 0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR ((AT91_REG *) 0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR ((AT91_REG *) 0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR ((AT91_REG *) 0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER ((AT91_REG *) 0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR ((AT91_REG *) 0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR ((AT91_REG *) 0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR ((AT91_REG *) 0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR ((AT91_REG *) 0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR ((AT91_REG *) 0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI ((AT91_REG *) 0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR ((AT91_REG *) 0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR ((AT91_REG *) 0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR ((AT91_REG *) 0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR ((AT91_REG *) 0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR ((AT91_REG *) 0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR ((AT91_REG *) 0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR ((AT91_REG *) 0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR ((AT91_REG *) 0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR ((AT91_REG *) 0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR ((AT91_REG *) 0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR ((AT91_REG *) 0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR ((AT91_REG *) 0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR ((AT91_REG *) 0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER ((AT91_REG *) 0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR ((AT91_REG *) 0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR ((AT91_REG *) 0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI ((AT91_REG *) 0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR ((AT91_REG *) 0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR ((AT91_REG *) 0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR ((AT91_REG *) 0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR ((AT91_REG *) 0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR ((AT91_REG *) 0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR ((AT91_REG *) 0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR ((AT91_REG *) 0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF ((AT91_REG *) 0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER ((AT91_REG *) 0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR ((AT91_REG *) 0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR ((AT91_REG *) 0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR ((AT91_REG *) 0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR ((AT91_REG *) 0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR ((AT91_REG *) 0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR ((AT91_REG *) 0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR ((AT91_REG *) 0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR ((AT91_REG *) 0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR ((AT91_REG *) 0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR ((AT91_REG *) 0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR ((AT91_REG *) 0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR ((AT91_REG *) 0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR ((AT91_REG *) 0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR ((AT91_REG *) 0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR ((AT91_REG *) 0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR ((AT91_REG *) 0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER ((AT91_REG *) 0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR ((AT91_REG *) 0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR ((AT91_REG *) 0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR ((AT91_REG *) 0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR ((AT91_REG *) 0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR ((AT91_REG *) 0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR ((AT91_REG *) 0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR ((AT91_REG *) 0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER ((AT91_REG *) 0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR ((AT91_REG *) 0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR ((AT91_REG *) 0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR ((AT91_REG *) 0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR ((AT91_REG *) 0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR ((AT91_REG *) 0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR ((AT91_REG *) 0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR ((AT91_REG *) 0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR ((AT91_REG *) 0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR ((AT91_REG *) 0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR ((AT91_REG *) 0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved ((AT91_REG *) 0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR ((AT91_REG *) 0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR ((AT91_REG *) 0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR ((AT91_REG *) 0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR ((AT91_REG *) 0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved ((AT91_REG *) 0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR ((AT91_REG *) 0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR ((AT91_REG *) 0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR ((AT91_REG *) 0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR ((AT91_REG *) 0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR ((AT91_REG *) 0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved ((AT91_REG *) 0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR ((AT91_REG *) 0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR ((AT91_REG *) 0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR ((AT91_REG *) 0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR ((AT91_REG *) 0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR ((AT91_REG *) 0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved ((AT91_REG *) 0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR ((AT91_REG *) 0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR ((AT91_REG *) 0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR ((AT91_REG *) 0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR ((AT91_REG *) 0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR ((AT91_REG *) 0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR ((AT91_REG *) 0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS ((AT91_REG *) 0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER ((AT91_REG *) 0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR ((AT91_REG *) 0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR ((AT91_REG *) 0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR ((AT91_REG *) 0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR ((AT91_REG *) 0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR ((AT91_REG *) 0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA ((AT91_REG *) 0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR ((AT91_REG *) 0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR ((AT91_REG *) 0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM ((AT91_REG *) 0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR ((AT91_REG *) 0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR ((AT91_REG *) 0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR ((AT91_REG *) 0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR ((AT91_REG *) 0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR ((AT91_REG *) 0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP ((AT91_REG *) 0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC ((AT91_REG *) 0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE ((AT91_REG *) 0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER ((AT91_REG *) 0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR ((AT91_REG *) 0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC ((AT91_REG *) 0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB ((AT91_REG *) 0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR ((AT91_REG *) 0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR ((AT91_REG *) 0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER ((AT91_REG *) 0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA ((AT91_REG *) 0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR ((AT91_REG *) 0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV ((AT91_REG *) 0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR ((AT91_REG *) 0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB ((AT91_REG *) 0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR ((AT91_REG *) 0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER ((AT91_REG *) 0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR ((AT91_REG *) 0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR ((AT91_REG *) 0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR ((AT91_REG *) 0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA ((AT91_REG *) 0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC ((AT91_REG *) 0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR ((AT91_REG *) 0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV ((AT91_REG *) 0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR ((AT91_REG *) 0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR ((AT91_REG *) 0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV ((AT91_REG *) 0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA ((AT91_REG *) 0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB ((AT91_REG *) 0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR ((AT91_REG *) 0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR ((AT91_REG *) 0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC ((AT91_REG *) 0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER ((AT91_REG *) 0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR ((AT91_REG *) 0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR ((AT91_REG *) 0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR ((AT91_REG *) 0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL ((AT91_REG *) 0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM ((AT91_REG *) 0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR ((AT91_REG *) 0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID ((AT91_REG *) 0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR ((AT91_REG *) 0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID ((AT91_REG *) 0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH ((AT91_REG *) 0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR ((AT91_REG *) 0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL ((AT91_REG *) 0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID ((AT91_REG *) 0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR ((AT91_REG *) 0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR ((AT91_REG *) 0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM ((AT91_REG *) 0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH ((AT91_REG *) 0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR ((AT91_REG *) 0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID ((AT91_REG *) 0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR ((AT91_REG *) 0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH ((AT91_REG *) 0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID ((AT91_REG *) 0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL ((AT91_REG *) 0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR ((AT91_REG *) 0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM ((AT91_REG *) 0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID ((AT91_REG *) 0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR ((AT91_REG *) 0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID ((AT91_REG *) 0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM ((AT91_REG *) 0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID ((AT91_REG *) 0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR ((AT91_REG *) 0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR ((AT91_REG *) 0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR ((AT91_REG *) 0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL ((AT91_REG *) 0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH ((AT91_REG *) 0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID ((AT91_REG *) 0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR ((AT91_REG *) 0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH ((AT91_REG *) 0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID ((AT91_REG *) 0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR ((AT91_REG *) 0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR ((AT91_REG *) 0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL ((AT91_REG *) 0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM ((AT91_REG *) 0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR ((AT91_REG *) 0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR ((AT91_REG *) 0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID ((AT91_REG *) 0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH ((AT91_REG *) 0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID ((AT91_REG *) 0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR ((AT91_REG *) 0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL ((AT91_REG *) 0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM ((AT91_REG *) 0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID ((AT91_REG *) 0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID ((AT91_REG *) 0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM ((AT91_REG *) 0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR ((AT91_REG *) 0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL ((AT91_REG *) 0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR ((AT91_REG *) 0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH ((AT91_REG *) 0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR ((AT91_REG *) 0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR ((AT91_REG *) 0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH ((AT91_REG *) 0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID ((AT91_REG *) 0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL ((AT91_REG *) 0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID ((AT91_REG *) 0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR ((AT91_REG *) 0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM ((AT91_REG *) 0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR ((AT91_REG *) 0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR ((AT91_REG *) 0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR ((AT91_REG *) 0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER ((AT91_REG *) 0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR ((AT91_REG *) 0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP ((AT91_REG *) 0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR ((AT91_REG *) 0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR ((AT91_REG *) 0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR ((AT91_REG *) 0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM ((AT91_REG *) 0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR ((AT91_REG *) 0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR ((AT91_REG *) 0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR ((AT91_REG *) 0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR ((AT91_REG *) 0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H ((AT91_REG *) 0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L ((AT91_REG *) 0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE ((AT91_REG *) 0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL ((AT91_REG *) 0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE ((AT91_REG *) 0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL ((AT91_REG *) 0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF ((AT91_REG *) 0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND ((AT91_REG *) 0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR ((AT91_REG *) 0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L ((AT91_REG *) 0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR ((AT91_REG *) 0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L ((AT91_REG *) 0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR ((AT91_REG *) 0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR ((AT91_REG *) 0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE ((AT91_REG *) 0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL ((AT91_REG *) 0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID ((AT91_REG *) 0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB ((AT91_REG *) 0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP ((AT91_REG *) 0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO ((AT91_REG *) 0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR ((AT91_REG *) 0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H ((AT91_REG *) 0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV ((AT91_REG *) 0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE ((AT91_REG *) 0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA ((AT91_REG *) 0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP ((AT91_REG *) 0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF ((AT91_REG *) 0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR ((AT91_REG *) 0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT ((AT91_REG *) 0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF ((AT91_REG *) 0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE ((AT91_REG *) 0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ ((AT91_REG *) 0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN ((AT91_REG *) 0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO ((AT91_REG *) 0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV ((AT91_REG *) 0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR ((AT91_REG *) 0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF ((AT91_REG *) 0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR ((AT91_REG *) 0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF ((AT91_REG *) 0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR ((AT91_REG *) 0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L ((AT91_REG *) 0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO ((AT91_REG *) 0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER ((AT91_REG *) 0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H ((AT91_REG *) 0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE ((AT91_REG *) 0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H ((AT91_REG *) 0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE ((AT91_REG *) 0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE ((AT91_REG *) 0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR ((AT91_REG *) 0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR ((AT91_REG *) 0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR ((AT91_REG *) 0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR ((AT91_REG *) 0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR ((AT91_REG *) 0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR ((AT91_REG *) 0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR ((AT91_REG *) 0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR ((AT91_REG *) 0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR ((AT91_REG *) 0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR ((AT91_REG *) 0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 ((AT91_REG *) 0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 ((AT91_REG *) 0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 ((AT91_REG *) 0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 ((AT91_REG *) 0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR ((AT91_REG *) 0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR ((AT91_REG *) 0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 ((AT91_REG *) 0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 ((AT91_REG *) 0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR ((AT91_REG *) 0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR ((AT91_REG *) 0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR ((AT91_REG *) 0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 ((AT91_REG *) 0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 ((AT91_REG *) 0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER ((AT91_REG *) 0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER ((AT91_REG *) 0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR ((AT91_REG *) 0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR ((AT91_REG *) 0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR ((AT91_REG *) 0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR ((AT91_REG *) 0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR ((AT91_REG *) 0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR ((AT91_REG *) 0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR ((AT91_REG *) 0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR ((AT91_REG *) 0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR ((AT91_REG *) 0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR ((AT91_REG *) 0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR ((AT91_REG *) 0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR ((AT91_REG *) 0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR ((AT91_REG *) 0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR ((AT91_REG *) 0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR ((AT91_REG *) 0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR ((AT91_REG *) 0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR ((AT91_REG *) 0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR ((AT91_REG *) 0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR ((AT91_REG *) 0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR ((AT91_REG *) 0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR ((AT91_REG *) 0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER ((AT91_REG *) 0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR ((AT91_REG *) 0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR ((AT91_REG *) 0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR ((AT91_REG *) 0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR ((AT91_REG *) 0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR ((AT91_REG *) 0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR ((AT91_REG *) 0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR ((AT91_REG *) 0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR ((AT91_REG *) 0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR ((AT91_REG *) 0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR ((AT91_REG *) 0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR ((AT91_REG *) 0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR ((AT91_REG *) 0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR ((AT91_REG *) 0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR ((AT91_REG *) 0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR ((AT91_REG *) 0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR ((AT91_REG *) 0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR ((AT91_REG *) 0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR ((AT91_REG *) 0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR ((AT91_REG *) 0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR ((AT91_REG *) 0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR ((AT91_REG *) 0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER ((AT91_REG *) 0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR ((AT91_REG *) 0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR ((AT91_REG *) 0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR ((AT91_REG *) 0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_PIO_PA0 ((unsigned int) 1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 ((unsigned int) AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 ((unsigned int) 1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 ((unsigned int) AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 ((unsigned int) 1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD ((unsigned int) AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 ((unsigned int) 1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK ((unsigned int) AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 ((unsigned int) 1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 ((unsigned int) AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 ((unsigned int) 1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 ((unsigned int) AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 ((unsigned int) AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 ((unsigned int) 1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 ((unsigned int) AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 ((unsigned int) AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 ((unsigned int) 1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 ((unsigned int) AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 ((unsigned int) AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 ((unsigned int) 1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 ((unsigned int) AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 ((unsigned int) 1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 ((unsigned int) AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 ((unsigned int) 1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 ((unsigned int) AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 ((unsigned int) 1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX ((unsigned int) AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 ((unsigned int) 1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 ((unsigned int) AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 ((unsigned int) AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 ((unsigned int) 1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX ((unsigned int) AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 ((unsigned int) 1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF ((unsigned int) AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 ((unsigned int) AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 ((unsigned int) 1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK ((unsigned int) AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 ((unsigned int) AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 ((unsigned int) 1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD ((unsigned int) AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 ((unsigned int) AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 ((unsigned int) 1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD ((unsigned int) AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 ((unsigned int) AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 ((unsigned int) 1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK ((unsigned int) AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 ((unsigned int) AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 ((unsigned int) 1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF ((unsigned int) AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 ((unsigned int) AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 ((unsigned int) 1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD ((unsigned int) AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 ((unsigned int) AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 ((unsigned int) 1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD ((unsigned int) AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 ((unsigned int) 1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ ((unsigned int) AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 ((unsigned int) AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 ((unsigned int) 1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 ((unsigned int) AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 ((unsigned int) AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 ((unsigned int) 1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 ((unsigned int) AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 ((unsigned int) AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 ((unsigned int) 1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 ((unsigned int) AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 ((unsigned int) AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 ((unsigned int) 1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 ((unsigned int) AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 ((unsigned int) 1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 ((unsigned int) AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 ((unsigned int) 1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 ((unsigned int) AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 ((unsigned int) AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 ((unsigned int) 1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 ((unsigned int) AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 ((unsigned int) AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 ((unsigned int) 1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 ((unsigned int) AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 ((unsigned int) AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 ((unsigned int) 1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 ((unsigned int) AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 ((unsigned int) 1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN ((unsigned int) AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 ((unsigned int) 1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 ((unsigned int) AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 ((unsigned int) AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 ((unsigned int) 1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 ((unsigned int) AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 ((unsigned int) AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 ((unsigned int) 1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER ((unsigned int) AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 ((unsigned int) AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 ((unsigned int) 1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 ((unsigned int) AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 ((unsigned int) AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 ((unsigned int) 1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 ((unsigned int) AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 ((unsigned int) AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 ((unsigned int) 1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV ((unsigned int) AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 ((unsigned int) 1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL ((unsigned int) AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 ((unsigned int) AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 ((unsigned int) 1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK ((unsigned int) AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 ((unsigned int) AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 ((unsigned int) 1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 ((unsigned int) AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG ((unsigned int) AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 ((unsigned int) 1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 ((unsigned int) AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 ((unsigned int) AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 ((unsigned int) 1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 ((unsigned int) AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 ((unsigned int) 1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 ((unsigned int) AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 ((unsigned int) AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 ((unsigned int) 1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 ((unsigned int) AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 ((unsigned int) AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 ((unsigned int) 1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 ((unsigned int) AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 ((unsigned int) AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 ((unsigned int) 1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 ((unsigned int) AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 ((unsigned int) AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 ((unsigned int) 1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 ((unsigned int) AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 ((unsigned int) AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 ((unsigned int) 1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 ((unsigned int) AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 ((unsigned int) AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 ((unsigned int) 1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 ((unsigned int) AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 ((unsigned int) AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 ((unsigned int) 1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 ((unsigned int) AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 ((unsigned int) AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 ((unsigned int) 1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 ((unsigned int) AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 ((unsigned int) AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 ((unsigned int) 1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 ((unsigned int) AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 ((unsigned int) AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 ((unsigned int) 1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 ((unsigned int) AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 ((unsigned int) 1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 ((unsigned int) AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 ((unsigned int) AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 ((unsigned int) 1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV ((unsigned int) AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 ((unsigned int) 1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 ((unsigned int) AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 ((unsigned int) 1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 ((unsigned int) AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 ((unsigned int) 1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER ((unsigned int) AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 ((unsigned int) 1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC ((unsigned int) AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 ((unsigned int) 1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO ((unsigned int) AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ID_FIQ ((unsigned int) 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ((unsigned int) 1) // System Peripheral +#define AT91C_ID_PIOA ((unsigned int) 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ((unsigned int) 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ((unsigned int) 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ((unsigned int) 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ((unsigned int) 6) // USART 0 +#define AT91C_ID_US1 ((unsigned int) 7) // USART 1 +#define AT91C_ID_SSC ((unsigned int) 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ((unsigned int) 9) // Two-Wire Interface +#define AT91C_ID_PWMC ((unsigned int) 10) // PWM Controller +#define AT91C_ID_UDP ((unsigned int) 11) // USB Device Port +#define AT91C_ID_TC0 ((unsigned int) 12) // Timer Counter 0 +#define AT91C_ID_TC1 ((unsigned int) 13) // Timer Counter 1 +#define AT91C_ID_TC2 ((unsigned int) 14) // Timer Counter 2 +#define AT91C_ID_CAN ((unsigned int) 15) // Control Area Network Controller +#define AT91C_ID_EMAC ((unsigned int) 16) // Ethernet MAC +#define AT91C_ID_ADC ((unsigned int) 17) // Analog-to-Digital Converter +#define AT91C_ID_AES ((unsigned int) 18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES ((unsigned int) 19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved ((unsigned int) 20) // Reserved +#define AT91C_ID_21_Reserved ((unsigned int) 21) // Reserved +#define AT91C_ID_22_Reserved ((unsigned int) 22) // Reserved +#define AT91C_ID_23_Reserved ((unsigned int) 23) // Reserved +#define AT91C_ID_24_Reserved ((unsigned int) 24) // Reserved +#define AT91C_ID_25_Reserved ((unsigned int) 25) // Reserved +#define AT91C_ID_26_Reserved ((unsigned int) 26) // Reserved +#define AT91C_ID_27_Reserved ((unsigned int) 27) // Reserved +#define AT91C_ID_28_Reserved ((unsigned int) 28) // Reserved +#define AT91C_ID_29_Reserved ((unsigned int) 29) // Reserved +#define AT91C_ID_IRQ0 ((unsigned int) 30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 ((unsigned int) 31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_BASE_SYS ((AT91PS_SYS) 0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC ((AT91PS_AIC) 0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU ((AT91PS_PDC) 0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU ((AT91PS_DBGU) 0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA ((AT91PS_PIO) 0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB ((AT91PS_PIO) 0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR ((AT91PS_CKGR) 0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC ((AT91PS_PMC) 0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC ((AT91PS_RSTC) 0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC ((AT91PS_RTTC) 0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC ((AT91PS_PITC) 0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC ((AT91PS_WDTC) 0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG ((AT91PS_VREG) 0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC ((AT91PS_MC) 0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 ((AT91PS_PDC) 0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 ((AT91PS_SPI) 0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 ((AT91PS_PDC) 0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 ((AT91PS_SPI) 0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 ((AT91PS_PDC) 0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 ((AT91PS_USART) 0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 ((AT91PS_PDC) 0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 ((AT91PS_USART) 0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC ((AT91PS_PDC) 0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC ((AT91PS_SSC) 0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI ((AT91PS_TWI) 0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 ((AT91PS_PWMC_CH) 0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 ((AT91PS_PWMC_CH) 0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 ((AT91PS_PWMC_CH) 0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 ((AT91PS_PWMC_CH) 0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC ((AT91PS_PWMC) 0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP ((AT91PS_UDP) 0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 ((AT91PS_TC) 0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 ((AT91PS_TC) 0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 ((AT91PS_TC) 0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB ((AT91PS_TCB) 0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 ((AT91PS_CAN_MB) 0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 ((AT91PS_CAN_MB) 0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 ((AT91PS_CAN_MB) 0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 ((AT91PS_CAN_MB) 0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 ((AT91PS_CAN_MB) 0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 ((AT91PS_CAN_MB) 0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 ((AT91PS_CAN_MB) 0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 ((AT91PS_CAN_MB) 0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN ((AT91PS_CAN) 0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC ((AT91PS_EMAC) 0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC ((AT91PS_PDC) 0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC ((AT91PS_ADC) 0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES ((AT91PS_PDC) 0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES ((AT91PS_AES) 0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES ((AT91PS_PDC) 0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES ((AT91PS_TDES) 0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ISRAM ((char *) 0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE ((unsigned int) 0x00010000) // Internal SRAM size in byte (64 Kbyte) +#define AT91C_IFLASH ((char *) 0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE ((unsigned int) 0x00040000) // Internal ROM size in byte (256 Kbyte) + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h new file mode 100644 index 0000000..194ce4e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h @@ -0,0 +1,2446 @@ +// ---------------------------------------------------------------------------- +// ATMEL Microcontroller Software Support - ROUSSET - +// ---------------------------------------------------------------------------- +// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +// DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +// ---------------------------------------------------------------------------- +// File Name : AT91SAM7X256.h +// Object : AT91SAM7X256 definitions +// Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +// +// CVS Reference : /AT91SAM7X256.pl/1.11/Tue May 10 12:15:32 2005// +// CVS Reference : /SYS_SAM7X.pl/1.3/Tue Feb 1 17:01:43 2005// +// CVS Reference : /MC_SAM7X.pl/1.2/Fri May 20 14:13:04 2005// +// CVS Reference : /PMC_SAM7X.pl/1.4/Tue Feb 8 13:58:10 2005// +// CVS Reference : /RSTC_SAM7X.pl/1.1/Tue Feb 1 16:16:26 2005// +// CVS Reference : /UDP_SAM7X.pl/1.1/Tue May 10 11:35:35 2005// +// CVS Reference : /PWM_SAM7X.pl/1.1/Tue May 10 11:53:07 2005// +// CVS Reference : /AIC_6075B.pl/1.3/Fri May 20 14:01:30 2005// +// CVS Reference : /PIO_6057A.pl/1.2/Thu Feb 3 10:18:28 2005// +// CVS Reference : /RTTC_6081A.pl/1.2/Tue Nov 9 14:43:58 2004// +// CVS Reference : /PITC_6079A.pl/1.2/Tue Nov 9 14:43:56 2004// +// CVS Reference : /WDTC_6080A.pl/1.3/Tue Nov 9 14:44:00 2004// +// CVS Reference : /VREG_6085B.pl/1.1/Tue Feb 1 16:05:48 2005// +// CVS Reference : /PDC_6074C.pl/1.2/Thu Feb 3 08:48:54 2005// +// CVS Reference : /DBGU_6059D.pl/1.1/Mon Jan 31 13:15:32 2005// +// CVS Reference : /SPI_6088D.pl/1.3/Fri May 20 14:08:59 2005// +// CVS Reference : /US_6089C.pl/1.1/Mon Jul 12 18:23:26 2004// +// CVS Reference : /SSC_6078A.pl/1.1/Tue Jul 13 07:45:40 2004// +// CVS Reference : /TWI_6061A.pl/1.1/Tue Jul 13 07:38:06 2004// +// CVS Reference : /TC_6082A.pl/1.7/Fri Mar 11 12:52:17 2005// +// CVS Reference : /CAN_6019B.pl/1.1/Tue Mar 8 12:42:22 2005// +// CVS Reference : /EMACB_6119A.pl/1.5/Thu Feb 3 15:52:04 2005// +// CVS Reference : /ADC_6051C.pl/1.1/Fri Oct 17 09:12:38 2003// +// CVS Reference : /AES_6149A.pl/1.10/Mon Feb 7 09:44:25 2005// +// CVS Reference : /DES3_6150A.pl/1.1/Mon Jan 17 08:34:31 2005// +// ---------------------------------------------------------------------------- + +// Hardware register definition + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR System Peripherals +// ***************************************************************************** + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Interrupt Controller +// ***************************************************************************** +// *** Register offset in AT91S_AIC structure *** +#define AIC_SMR ( 0) // Source Mode Register +#define AIC_SVR (128) // Source Vector Register +#define AIC_IVR (256) // IRQ Vector Register +#define AIC_FVR (260) // FIQ Vector Register +#define AIC_ISR (264) // Interrupt Status Register +#define AIC_IPR (268) // Interrupt Pending Register +#define AIC_IMR (272) // Interrupt Mask Register +#define AIC_CISR (276) // Core Interrupt Status Register +#define AIC_IECR (288) // Interrupt Enable Command Register +#define AIC_IDCR (292) // Interrupt Disable Command Register +#define AIC_ICCR (296) // Interrupt Clear Command Register +#define AIC_ISCR (300) // Interrupt Set Command Register +#define AIC_EOICR (304) // End of Interrupt Command Register +#define AIC_SPU (308) // Spurious Vector Register +#define AIC_DCR (312) // Debug Control Register (Protect) +#define AIC_FFER (320) // Fast Forcing Enable Register +#define AIC_FFDR (324) // Fast Forcing Disable Register +#define AIC_FFSR (328) // Fast Forcing Status Register +// -------- AIC_SMR : (AIC Offset: 0x0) Control Register -------- +#define AT91C_AIC_PRIOR (0x7 << 0) // (AIC) Priority Level +#define AT91C_AIC_PRIOR_LOWEST (0x0) // (AIC) Lowest priority level +#define AT91C_AIC_PRIOR_HIGHEST (0x7) // (AIC) Highest priority level +#define AT91C_AIC_SRCTYPE (0x3 << 5) // (AIC) Interrupt Source Type +#define AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL (0x0 << 5) // (AIC) Internal Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_EXT_LOW_LEVEL (0x0 << 5) // (AIC) External Sources Code Label Low-level Sensitive +#define AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE (0x1 << 5) // (AIC) Internal Sources Code Label Positive Edge triggered +#define AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE (0x1 << 5) // (AIC) External Sources Code Label Negative Edge triggered +#define AT91C_AIC_SRCTYPE_HIGH_LEVEL (0x2 << 5) // (AIC) Internal Or External Sources Code Label High-level Sensitive +#define AT91C_AIC_SRCTYPE_POSITIVE_EDGE (0x3 << 5) // (AIC) Internal Or External Sources Code Label Positive Edge triggered +// -------- AIC_CISR : (AIC Offset: 0x114) AIC Core Interrupt Status Register -------- +#define AT91C_AIC_NFIQ (0x1 << 0) // (AIC) NFIQ Status +#define AT91C_AIC_NIRQ (0x1 << 1) // (AIC) NIRQ Status +// -------- AIC_DCR : (AIC Offset: 0x138) AIC Debug Control Register (Protect) -------- +#define AT91C_AIC_DCR_PROT (0x1 << 0) // (AIC) Protection Mode +#define AT91C_AIC_DCR_GMSK (0x1 << 1) // (AIC) General Mask + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Peripheral DMA Controller +// ***************************************************************************** +// *** Register offset in AT91S_PDC structure *** +#define PDC_RPR ( 0) // Receive Pointer Register +#define PDC_RCR ( 4) // Receive Counter Register +#define PDC_TPR ( 8) // Transmit Pointer Register +#define PDC_TCR (12) // Transmit Counter Register +#define PDC_RNPR (16) // Receive Next Pointer Register +#define PDC_RNCR (20) // Receive Next Counter Register +#define PDC_TNPR (24) // Transmit Next Pointer Register +#define PDC_TNCR (28) // Transmit Next Counter Register +#define PDC_PTCR (32) // PDC Transfer Control Register +#define PDC_PTSR (36) // PDC Transfer Status Register +// -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- +#define AT91C_PDC_RXTEN (0x1 << 0) // (PDC) Receiver Transfer Enable +#define AT91C_PDC_RXTDIS (0x1 << 1) // (PDC) Receiver Transfer Disable +#define AT91C_PDC_TXTEN (0x1 << 8) // (PDC) Transmitter Transfer Enable +#define AT91C_PDC_TXTDIS (0x1 << 9) // (PDC) Transmitter Transfer Disable +// -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Debug Unit +// ***************************************************************************** +// *** Register offset in AT91S_DBGU structure *** +#define DBGU_CR ( 0) // Control Register +#define DBGU_MR ( 4) // Mode Register +#define DBGU_IER ( 8) // Interrupt Enable Register +#define DBGU_IDR (12) // Interrupt Disable Register +#define DBGU_IMR (16) // Interrupt Mask Register +#define DBGU_CSR (20) // Channel Status Register +#define DBGU_RHR (24) // Receiver Holding Register +#define DBGU_THR (28) // Transmitter Holding Register +#define DBGU_BRGR (32) // Baud Rate Generator Register +#define DBGU_CIDR (64) // Chip ID Register +#define DBGU_EXID (68) // Chip ID Extension Register +#define DBGU_FNTR (72) // Force NTRST Register +#define DBGU_RPR (256) // Receive Pointer Register +#define DBGU_RCR (260) // Receive Counter Register +#define DBGU_TPR (264) // Transmit Pointer Register +#define DBGU_TCR (268) // Transmit Counter Register +#define DBGU_RNPR (272) // Receive Next Pointer Register +#define DBGU_RNCR (276) // Receive Next Counter Register +#define DBGU_TNPR (280) // Transmit Next Pointer Register +#define DBGU_TNCR (284) // Transmit Next Counter Register +#define DBGU_PTCR (288) // PDC Transfer Control Register +#define DBGU_PTSR (292) // PDC Transfer Status Register +// -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_RSTRX (0x1 << 2) // (DBGU) Reset Receiver +#define AT91C_US_RSTTX (0x1 << 3) // (DBGU) Reset Transmitter +#define AT91C_US_RXEN (0x1 << 4) // (DBGU) Receiver Enable +#define AT91C_US_RXDIS (0x1 << 5) // (DBGU) Receiver Disable +#define AT91C_US_TXEN (0x1 << 6) // (DBGU) Transmitter Enable +#define AT91C_US_TXDIS (0x1 << 7) // (DBGU) Transmitter Disable +#define AT91C_US_RSTSTA (0x1 << 8) // (DBGU) Reset Status Bits +// -------- DBGU_MR : (DBGU Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_PAR (0x7 << 9) // (DBGU) Parity type +#define AT91C_US_PAR_EVEN (0x0 << 9) // (DBGU) Even Parity +#define AT91C_US_PAR_ODD (0x1 << 9) // (DBGU) Odd Parity +#define AT91C_US_PAR_SPACE (0x2 << 9) // (DBGU) Parity forced to 0 (Space) +#define AT91C_US_PAR_MARK (0x3 << 9) // (DBGU) Parity forced to 1 (Mark) +#define AT91C_US_PAR_NONE (0x4 << 9) // (DBGU) No Parity +#define AT91C_US_PAR_MULTI_DROP (0x6 << 9) // (DBGU) Multi-drop mode +#define AT91C_US_CHMODE (0x3 << 14) // (DBGU) Channel Mode +#define AT91C_US_CHMODE_NORMAL (0x0 << 14) // (DBGU) Normal Mode: The USART channel operates as an RX/TX USART. +#define AT91C_US_CHMODE_AUTO (0x1 << 14) // (DBGU) Automatic Echo: Receiver Data Input is connected to the TXD pin. +#define AT91C_US_CHMODE_LOCAL (0x2 << 14) // (DBGU) Local Loopback: Transmitter Output Signal is connected to Receiver Input Signal. +#define AT91C_US_CHMODE_REMOTE (0x3 << 14) // (DBGU) Remote Loopback: RXD pin is internally connected to TXD pin. +// -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXRDY (0x1 << 0) // (DBGU) RXRDY Interrupt +#define AT91C_US_TXRDY (0x1 << 1) // (DBGU) TXRDY Interrupt +#define AT91C_US_ENDRX (0x1 << 3) // (DBGU) End of Receive Transfer Interrupt +#define AT91C_US_ENDTX (0x1 << 4) // (DBGU) End of Transmit Interrupt +#define AT91C_US_OVRE (0x1 << 5) // (DBGU) Overrun Interrupt +#define AT91C_US_FRAME (0x1 << 6) // (DBGU) Framing Error Interrupt +#define AT91C_US_PARE (0x1 << 7) // (DBGU) Parity Error Interrupt +#define AT91C_US_TXEMPTY (0x1 << 9) // (DBGU) TXEMPTY Interrupt +#define AT91C_US_TXBUFE (0x1 << 11) // (DBGU) TXBUFE Interrupt +#define AT91C_US_RXBUFF (0x1 << 12) // (DBGU) RXBUFF Interrupt +#define AT91C_US_COMM_TX (0x1 << 30) // (DBGU) COMM_TX Interrupt +#define AT91C_US_COMM_RX (0x1 << 31) // (DBGU) COMM_RX Interrupt +// -------- DBGU_IDR : (DBGU Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- DBGU_IMR : (DBGU Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- DBGU_CSR : (DBGU Offset: 0x14) Debug Unit Channel Status Register -------- +// -------- DBGU_FNTR : (DBGU Offset: 0x48) Debug Unit FORCE_NTRST Register -------- +#define AT91C_US_FORCE_NTRST (0x1 << 0) // (DBGU) Force NTRST in JTAG + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Parallel Input Output Controler +// ***************************************************************************** +// *** Register offset in AT91S_PIO structure *** +#define PIO_PER ( 0) // PIO Enable Register +#define PIO_PDR ( 4) // PIO Disable Register +#define PIO_PSR ( 8) // PIO Status Register +#define PIO_OER (16) // Output Enable Register +#define PIO_ODR (20) // Output Disable Registerr +#define PIO_OSR (24) // Output Status Register +#define PIO_IFER (32) // Input Filter Enable Register +#define PIO_IFDR (36) // Input Filter Disable Register +#define PIO_IFSR (40) // Input Filter Status Register +#define PIO_SODR (48) // Set Output Data Register +#define PIO_CODR (52) // Clear Output Data Register +#define PIO_ODSR (56) // Output Data Status Register +#define PIO_PDSR (60) // Pin Data Status Register +#define PIO_IER (64) // Interrupt Enable Register +#define PIO_IDR (68) // Interrupt Disable Register +#define PIO_IMR (72) // Interrupt Mask Register +#define PIO_ISR (76) // Interrupt Status Register +#define PIO_MDER (80) // Multi-driver Enable Register +#define PIO_MDDR (84) // Multi-driver Disable Register +#define PIO_MDSR (88) // Multi-driver Status Register +#define PIO_PPUDR (96) // Pull-up Disable Register +#define PIO_PPUER (100) // Pull-up Enable Register +#define PIO_PPUSR (104) // Pull-up Status Register +#define PIO_ASR (112) // Select A Register +#define PIO_BSR (116) // Select B Register +#define PIO_ABSR (120) // AB Select Status Register +#define PIO_OWER (160) // Output Write Enable Register +#define PIO_OWDR (164) // Output Write Disable Register +#define PIO_OWSR (168) // Output Write Status Register + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Clock Generator Controler +// ***************************************************************************** +// *** Register offset in AT91S_CKGR structure *** +#define CKGR_MOR ( 0) // Main Oscillator Register +#define CKGR_MCFR ( 4) // Main Clock Frequency Register +#define CKGR_PLLR (12) // PLL Register +// -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- +#define AT91C_CKGR_MOSCEN (0x1 << 0) // (CKGR) Main Oscillator Enable +#define AT91C_CKGR_OSCBYPASS (0x1 << 1) // (CKGR) Main Oscillator Bypass +#define AT91C_CKGR_OSCOUNT (0xFF << 8) // (CKGR) Main Oscillator Start-up Time +// -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- +#define AT91C_CKGR_MAINF (0xFFFF << 0) // (CKGR) Main Clock Frequency +#define AT91C_CKGR_MAINRDY (0x1 << 16) // (CKGR) Main Clock Ready +// -------- CKGR_PLLR : (CKGR Offset: 0xc) PLL B Register -------- +#define AT91C_CKGR_DIV (0xFF << 0) // (CKGR) Divider Selected +#define AT91C_CKGR_DIV_0 (0x0) // (CKGR) Divider output is 0 +#define AT91C_CKGR_DIV_BYPASS (0x1) // (CKGR) Divider is bypassed +#define AT91C_CKGR_PLLCOUNT (0x3F << 8) // (CKGR) PLL Counter +#define AT91C_CKGR_OUT (0x3 << 14) // (CKGR) PLL Output Frequency Range +#define AT91C_CKGR_OUT_0 (0x0 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_1 (0x1 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_2 (0x2 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_OUT_3 (0x3 << 14) // (CKGR) Please refer to the PLL datasheet +#define AT91C_CKGR_MUL (0x7FF << 16) // (CKGR) PLL Multiplier +#define AT91C_CKGR_USBDIV (0x3 << 28) // (CKGR) Divider for USB Clocks +#define AT91C_CKGR_USBDIV_0 (0x0 << 28) // (CKGR) Divider output is PLL clock output +#define AT91C_CKGR_USBDIV_1 (0x1 << 28) // (CKGR) Divider output is PLL clock output divided by 2 +#define AT91C_CKGR_USBDIV_2 (0x2 << 28) // (CKGR) Divider output is PLL clock output divided by 4 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Power Management Controler +// ***************************************************************************** +// *** Register offset in AT91S_PMC structure *** +#define PMC_SCER ( 0) // System Clock Enable Register +#define PMC_SCDR ( 4) // System Clock Disable Register +#define PMC_SCSR ( 8) // System Clock Status Register +#define PMC_PCER (16) // Peripheral Clock Enable Register +#define PMC_PCDR (20) // Peripheral Clock Disable Register +#define PMC_PCSR (24) // Peripheral Clock Status Register +#define PMC_MOR (32) // Main Oscillator Register +#define PMC_MCFR (36) // Main Clock Frequency Register +#define PMC_PLLR (44) // PLL Register +#define PMC_MCKR (48) // Master Clock Register +#define PMC_PCKR (64) // Programmable Clock Register +#define PMC_IER (96) // Interrupt Enable Register +#define PMC_IDR (100) // Interrupt Disable Register +#define PMC_SR (104) // Status Register +#define PMC_IMR (108) // Interrupt Mask Register +// -------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register -------- +#define AT91C_PMC_PCK (0x1 << 0) // (PMC) Processor Clock +#define AT91C_PMC_UDP (0x1 << 7) // (PMC) USB Device Port Clock +#define AT91C_PMC_PCK0 (0x1 << 8) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK1 (0x1 << 9) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK2 (0x1 << 10) // (PMC) Programmable Clock Output +#define AT91C_PMC_PCK3 (0x1 << 11) // (PMC) Programmable Clock Output +// -------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register -------- +// -------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------- +// -------- CKGR_MOR : (PMC Offset: 0x20) Main Oscillator Register -------- +// -------- CKGR_MCFR : (PMC Offset: 0x24) Main Clock Frequency Register -------- +// -------- CKGR_PLLR : (PMC Offset: 0x2c) PLL B Register -------- +// -------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register -------- +#define AT91C_PMC_CSS (0x3 << 0) // (PMC) Programmable Clock Selection +#define AT91C_PMC_CSS_SLOW_CLK (0x0) // (PMC) Slow Clock is selected +#define AT91C_PMC_CSS_MAIN_CLK (0x1) // (PMC) Main Clock is selected +#define AT91C_PMC_CSS_PLL_CLK (0x3) // (PMC) Clock from PLL is selected +#define AT91C_PMC_PRES (0x7 << 2) // (PMC) Programmable Clock Prescaler +#define AT91C_PMC_PRES_CLK (0x0 << 2) // (PMC) Selected clock +#define AT91C_PMC_PRES_CLK_2 (0x1 << 2) // (PMC) Selected clock divided by 2 +#define AT91C_PMC_PRES_CLK_4 (0x2 << 2) // (PMC) Selected clock divided by 4 +#define AT91C_PMC_PRES_CLK_8 (0x3 << 2) // (PMC) Selected clock divided by 8 +#define AT91C_PMC_PRES_CLK_16 (0x4 << 2) // (PMC) Selected clock divided by 16 +#define AT91C_PMC_PRES_CLK_32 (0x5 << 2) // (PMC) Selected clock divided by 32 +#define AT91C_PMC_PRES_CLK_64 (0x6 << 2) // (PMC) Selected clock divided by 64 +// -------- PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register -------- +// -------- PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------- +#define AT91C_PMC_MOSCS (0x1 << 0) // (PMC) MOSC Status/Enable/Disable/Mask +#define AT91C_PMC_LOCK (0x1 << 2) // (PMC) PLL Status/Enable/Disable/Mask +#define AT91C_PMC_MCKRDY (0x1 << 3) // (PMC) MCK_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK0RDY (0x1 << 8) // (PMC) PCK0_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK1RDY (0x1 << 9) // (PMC) PCK1_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK2RDY (0x1 << 10) // (PMC) PCK2_RDY Status/Enable/Disable/Mask +#define AT91C_PMC_PCK3RDY (0x1 << 11) // (PMC) PCK3_RDY Status/Enable/Disable/Mask +// -------- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register -------- +// -------- PMC_SR : (PMC Offset: 0x68) PMC Status Register -------- +// -------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Reset Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RSTC structure *** +#define RSTC_RCR ( 0) // Reset Control Register +#define RSTC_RSR ( 4) // Reset Status Register +#define RSTC_RMR ( 8) // Reset Mode Register +// -------- RSTC_RCR : (RSTC Offset: 0x0) Reset Control Register -------- +#define AT91C_RSTC_PROCRST (0x1 << 0) // (RSTC) Processor Reset +#define AT91C_RSTC_PERRST (0x1 << 2) // (RSTC) Peripheral Reset +#define AT91C_RSTC_EXTRST (0x1 << 3) // (RSTC) External Reset +#define AT91C_RSTC_KEY (0xFF << 24) // (RSTC) Password +// -------- RSTC_RSR : (RSTC Offset: 0x4) Reset Status Register -------- +#define AT91C_RSTC_URSTS (0x1 << 0) // (RSTC) User Reset Status +#define AT91C_RSTC_BODSTS (0x1 << 1) // (RSTC) Brownout Detection Status +#define AT91C_RSTC_RSTTYP (0x7 << 8) // (RSTC) Reset Type +#define AT91C_RSTC_RSTTYP_POWERUP (0x0 << 8) // (RSTC) Power-up Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WAKEUP (0x1 << 8) // (RSTC) WakeUp Reset. VDDCORE rising. +#define AT91C_RSTC_RSTTYP_WATCHDOG (0x2 << 8) // (RSTC) Watchdog Reset. Watchdog overflow occured. +#define AT91C_RSTC_RSTTYP_SOFTWARE (0x3 << 8) // (RSTC) Software Reset. Processor reset required by the software. +#define AT91C_RSTC_RSTTYP_USER (0x4 << 8) // (RSTC) User Reset. NRST pin detected low. +#define AT91C_RSTC_RSTTYP_BROWNOUT (0x5 << 8) // (RSTC) Brownout Reset occured. +#define AT91C_RSTC_NRSTL (0x1 << 16) // (RSTC) NRST pin level +#define AT91C_RSTC_SRCMP (0x1 << 17) // (RSTC) Software Reset Command in Progress. +// -------- RSTC_RMR : (RSTC Offset: 0x8) Reset Mode Register -------- +#define AT91C_RSTC_URSTEN (0x1 << 0) // (RSTC) User Reset Enable +#define AT91C_RSTC_URSTIEN (0x1 << 4) // (RSTC) User Reset Interrupt Enable +#define AT91C_RSTC_ERSTL (0xF << 8) // (RSTC) User Reset Enable +#define AT91C_RSTC_BODIEN (0x1 << 16) // (RSTC) Brownout Detection Interrupt Enable + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Real Time Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_RTTC structure *** +#define RTTC_RTMR ( 0) // Real-time Mode Register +#define RTTC_RTAR ( 4) // Real-time Alarm Register +#define RTTC_RTVR ( 8) // Real-time Value Register +#define RTTC_RTSR (12) // Real-time Status Register +// -------- RTTC_RTMR : (RTTC Offset: 0x0) Real-time Mode Register -------- +#define AT91C_RTTC_RTPRES (0xFFFF << 0) // (RTTC) Real-time Timer Prescaler Value +#define AT91C_RTTC_ALMIEN (0x1 << 16) // (RTTC) Alarm Interrupt Enable +#define AT91C_RTTC_RTTINCIEN (0x1 << 17) // (RTTC) Real Time Timer Increment Interrupt Enable +#define AT91C_RTTC_RTTRST (0x1 << 18) // (RTTC) Real Time Timer Restart +// -------- RTTC_RTAR : (RTTC Offset: 0x4) Real-time Alarm Register -------- +#define AT91C_RTTC_ALMV (0x0 << 0) // (RTTC) Alarm Value +// -------- RTTC_RTVR : (RTTC Offset: 0x8) Current Real-time Value Register -------- +#define AT91C_RTTC_CRTV (0x0 << 0) // (RTTC) Current Real-time Value +// -------- RTTC_RTSR : (RTTC Offset: 0xc) Real-time Status Register -------- +#define AT91C_RTTC_ALMS (0x1 << 0) // (RTTC) Real-time Alarm Status +#define AT91C_RTTC_RTTINC (0x1 << 1) // (RTTC) Real-time Timer Increment + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Periodic Interval Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PITC structure *** +#define PITC_PIMR ( 0) // Period Interval Mode Register +#define PITC_PISR ( 4) // Period Interval Status Register +#define PITC_PIVR ( 8) // Period Interval Value Register +#define PITC_PIIR (12) // Period Interval Image Register +// -------- PITC_PIMR : (PITC Offset: 0x0) Periodic Interval Mode Register -------- +#define AT91C_PITC_PIV (0xFFFFF << 0) // (PITC) Periodic Interval Value +#define AT91C_PITC_PITEN (0x1 << 24) // (PITC) Periodic Interval Timer Enabled +#define AT91C_PITC_PITIEN (0x1 << 25) // (PITC) Periodic Interval Timer Interrupt Enable +// -------- PITC_PISR : (PITC Offset: 0x4) Periodic Interval Status Register -------- +#define AT91C_PITC_PITS (0x1 << 0) // (PITC) Periodic Interval Timer Status +// -------- PITC_PIVR : (PITC Offset: 0x8) Periodic Interval Value Register -------- +#define AT91C_PITC_CPIV (0xFFFFF << 0) // (PITC) Current Periodic Interval Value +#define AT91C_PITC_PICNT (0xFFF << 20) // (PITC) Periodic Interval Counter +// -------- PITC_PIIR : (PITC Offset: 0xc) Periodic Interval Image Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Watchdog Timer Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_WDTC structure *** +#define WDTC_WDCR ( 0) // Watchdog Control Register +#define WDTC_WDMR ( 4) // Watchdog Mode Register +#define WDTC_WDSR ( 8) // Watchdog Status Register +// -------- WDTC_WDCR : (WDTC Offset: 0x0) Periodic Interval Image Register -------- +#define AT91C_WDTC_WDRSTT (0x1 << 0) // (WDTC) Watchdog Restart +#define AT91C_WDTC_KEY (0xFF << 24) // (WDTC) Watchdog KEY Password +// -------- WDTC_WDMR : (WDTC Offset: 0x4) Watchdog Mode Register -------- +#define AT91C_WDTC_WDV (0xFFF << 0) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDFIEN (0x1 << 12) // (WDTC) Watchdog Fault Interrupt Enable +#define AT91C_WDTC_WDRSTEN (0x1 << 13) // (WDTC) Watchdog Reset Enable +#define AT91C_WDTC_WDRPROC (0x1 << 14) // (WDTC) Watchdog Timer Restart +#define AT91C_WDTC_WDDIS (0x1 << 15) // (WDTC) Watchdog Disable +#define AT91C_WDTC_WDD (0xFFF << 16) // (WDTC) Watchdog Delta Value +#define AT91C_WDTC_WDDBGHLT (0x1 << 28) // (WDTC) Watchdog Debug Halt +#define AT91C_WDTC_WDIDLEHLT (0x1 << 29) // (WDTC) Watchdog Idle Halt +// -------- WDTC_WDSR : (WDTC Offset: 0x8) Watchdog Status Register -------- +#define AT91C_WDTC_WDUNF (0x1 << 0) // (WDTC) Watchdog Underflow +#define AT91C_WDTC_WDERR (0x1 << 1) // (WDTC) Watchdog Error + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Voltage Regulator Mode Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_VREG structure *** +#define VREG_MR ( 0) // Voltage Regulator Mode Register +// -------- VREG_MR : (VREG Offset: 0x0) Voltage Regulator Mode Register -------- +#define AT91C_VREG_PSTDBY (0x1 << 0) // (VREG) Voltage Regulator Power Standby Mode + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Memory Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_MC structure *** +#define MC_RCR ( 0) // MC Remap Control Register +#define MC_ASR ( 4) // MC Abort Status Register +#define MC_AASR ( 8) // MC Abort Address Status Register +#define MC_FMR (96) // MC Flash Mode Register +#define MC_FCR (100) // MC Flash Command Register +#define MC_FSR (104) // MC Flash Status Register +// -------- MC_RCR : (MC Offset: 0x0) MC Remap Control Register -------- +#define AT91C_MC_RCB (0x1 << 0) // (MC) Remap Command Bit +// -------- MC_ASR : (MC Offset: 0x4) MC Abort Status Register -------- +#define AT91C_MC_UNDADD (0x1 << 0) // (MC) Undefined Addess Abort Status +#define AT91C_MC_MISADD (0x1 << 1) // (MC) Misaligned Addess Abort Status +#define AT91C_MC_ABTSZ (0x3 << 8) // (MC) Abort Size Status +#define AT91C_MC_ABTSZ_BYTE (0x0 << 8) // (MC) Byte +#define AT91C_MC_ABTSZ_HWORD (0x1 << 8) // (MC) Half-word +#define AT91C_MC_ABTSZ_WORD (0x2 << 8) // (MC) Word +#define AT91C_MC_ABTTYP (0x3 << 10) // (MC) Abort Type Status +#define AT91C_MC_ABTTYP_DATAR (0x0 << 10) // (MC) Data Read +#define AT91C_MC_ABTTYP_DATAW (0x1 << 10) // (MC) Data Write +#define AT91C_MC_ABTTYP_FETCH (0x2 << 10) // (MC) Code Fetch +#define AT91C_MC_MST0 (0x1 << 16) // (MC) Master 0 Abort Source +#define AT91C_MC_MST1 (0x1 << 17) // (MC) Master 1 Abort Source +#define AT91C_MC_SVMST0 (0x1 << 24) // (MC) Saved Master 0 Abort Source +#define AT91C_MC_SVMST1 (0x1 << 25) // (MC) Saved Master 1 Abort Source +// -------- MC_FMR : (MC Offset: 0x60) MC Flash Mode Register -------- +#define AT91C_MC_FRDY (0x1 << 0) // (MC) Flash Ready +#define AT91C_MC_LOCKE (0x1 << 2) // (MC) Lock Error +#define AT91C_MC_PROGE (0x1 << 3) // (MC) Programming Error +#define AT91C_MC_NEBP (0x1 << 7) // (MC) No Erase Before Programming +#define AT91C_MC_FWS (0x3 << 8) // (MC) Flash Wait State +#define AT91C_MC_FWS_0FWS (0x0 << 8) // (MC) 1 cycle for Read, 2 for Write operations +#define AT91C_MC_FWS_1FWS (0x1 << 8) // (MC) 2 cycles for Read, 3 for Write operations +#define AT91C_MC_FWS_2FWS (0x2 << 8) // (MC) 3 cycles for Read, 4 for Write operations +#define AT91C_MC_FWS_3FWS (0x3 << 8) // (MC) 4 cycles for Read, 4 for Write operations +#define AT91C_MC_FMCN (0xFF << 16) // (MC) Flash Microsecond Cycle Number +// -------- MC_FCR : (MC Offset: 0x64) MC Flash Command Register -------- +#define AT91C_MC_FCMD (0xF << 0) // (MC) Flash Command +#define AT91C_MC_FCMD_START_PROG (0x1) // (MC) Starts the programming of th epage specified by PAGEN. +#define AT91C_MC_FCMD_LOCK (0x2) // (MC) Starts a lock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_PROG_AND_LOCK (0x3) // (MC) The lock sequence automatically happens after the programming sequence is completed. +#define AT91C_MC_FCMD_UNLOCK (0x4) // (MC) Starts an unlock sequence of the sector defined by the bits 4 to 7 of the field PAGEN. +#define AT91C_MC_FCMD_ERASE_ALL (0x8) // (MC) Starts the erase of the entire flash.If at least a page is locked, the command is cancelled. +#define AT91C_MC_FCMD_SET_GP_NVM (0xB) // (MC) Set General Purpose NVM bits. +#define AT91C_MC_FCMD_CLR_GP_NVM (0xD) // (MC) Clear General Purpose NVM bits. +#define AT91C_MC_FCMD_SET_SECURITY (0xF) // (MC) Set Security Bit. +#define AT91C_MC_PAGEN (0x3FF << 8) // (MC) Page Number +#define AT91C_MC_KEY (0xFF << 24) // (MC) Writing Protect Key +// -------- MC_FSR : (MC Offset: 0x68) MC Flash Command Register -------- +#define AT91C_MC_SECURITY (0x1 << 4) // (MC) Security Bit Status +#define AT91C_MC_GPNVM0 (0x1 << 8) // (MC) Sector 0 Lock Status +#define AT91C_MC_GPNVM1 (0x1 << 9) // (MC) Sector 1 Lock Status +#define AT91C_MC_GPNVM2 (0x1 << 10) // (MC) Sector 2 Lock Status +#define AT91C_MC_GPNVM3 (0x1 << 11) // (MC) Sector 3 Lock Status +#define AT91C_MC_GPNVM4 (0x1 << 12) // (MC) Sector 4 Lock Status +#define AT91C_MC_GPNVM5 (0x1 << 13) // (MC) Sector 5 Lock Status +#define AT91C_MC_GPNVM6 (0x1 << 14) // (MC) Sector 6 Lock Status +#define AT91C_MC_GPNVM7 (0x1 << 15) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS0 (0x1 << 16) // (MC) Sector 0 Lock Status +#define AT91C_MC_LOCKS1 (0x1 << 17) // (MC) Sector 1 Lock Status +#define AT91C_MC_LOCKS2 (0x1 << 18) // (MC) Sector 2 Lock Status +#define AT91C_MC_LOCKS3 (0x1 << 19) // (MC) Sector 3 Lock Status +#define AT91C_MC_LOCKS4 (0x1 << 20) // (MC) Sector 4 Lock Status +#define AT91C_MC_LOCKS5 (0x1 << 21) // (MC) Sector 5 Lock Status +#define AT91C_MC_LOCKS6 (0x1 << 22) // (MC) Sector 6 Lock Status +#define AT91C_MC_LOCKS7 (0x1 << 23) // (MC) Sector 7 Lock Status +#define AT91C_MC_LOCKS8 (0x1 << 24) // (MC) Sector 8 Lock Status +#define AT91C_MC_LOCKS9 (0x1 << 25) // (MC) Sector 9 Lock Status +#define AT91C_MC_LOCKS10 (0x1 << 26) // (MC) Sector 10 Lock Status +#define AT91C_MC_LOCKS11 (0x1 << 27) // (MC) Sector 11 Lock Status +#define AT91C_MC_LOCKS12 (0x1 << 28) // (MC) Sector 12 Lock Status +#define AT91C_MC_LOCKS13 (0x1 << 29) // (MC) Sector 13 Lock Status +#define AT91C_MC_LOCKS14 (0x1 << 30) // (MC) Sector 14 Lock Status +#define AT91C_MC_LOCKS15 (0x1 << 31) // (MC) Sector 15 Lock Status + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Serial Parallel Interface +// ***************************************************************************** +// *** Register offset in AT91S_SPI structure *** +#define SPI_CR ( 0) // Control Register +#define SPI_MR ( 4) // Mode Register +#define SPI_RDR ( 8) // Receive Data Register +#define SPI_TDR (12) // Transmit Data Register +#define SPI_SR (16) // Status Register +#define SPI_IER (20) // Interrupt Enable Register +#define SPI_IDR (24) // Interrupt Disable Register +#define SPI_IMR (28) // Interrupt Mask Register +#define SPI_CSR (48) // Chip Select Register +#define SPI_RPR (256) // Receive Pointer Register +#define SPI_RCR (260) // Receive Counter Register +#define SPI_TPR (264) // Transmit Pointer Register +#define SPI_TCR (268) // Transmit Counter Register +#define SPI_RNPR (272) // Receive Next Pointer Register +#define SPI_RNCR (276) // Receive Next Counter Register +#define SPI_TNPR (280) // Transmit Next Pointer Register +#define SPI_TNCR (284) // Transmit Next Counter Register +#define SPI_PTCR (288) // PDC Transfer Control Register +#define SPI_PTSR (292) // PDC Transfer Status Register +// -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- +#define AT91C_SPI_SPIEN (0x1 << 0) // (SPI) SPI Enable +#define AT91C_SPI_SPIDIS (0x1 << 1) // (SPI) SPI Disable +#define AT91C_SPI_SWRST (0x1 << 7) // (SPI) SPI Software reset +#define AT91C_SPI_LASTXFER (0x1 << 24) // (SPI) SPI Last Transfer +// -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- +#define AT91C_SPI_MSTR (0x1 << 0) // (SPI) Master/Slave Mode +#define AT91C_SPI_PS (0x1 << 1) // (SPI) Peripheral Select +#define AT91C_SPI_PS_FIXED (0x0 << 1) // (SPI) Fixed Peripheral Select +#define AT91C_SPI_PS_VARIABLE (0x1 << 1) // (SPI) Variable Peripheral Select +#define AT91C_SPI_PCSDEC (0x1 << 2) // (SPI) Chip Select Decode +#define AT91C_SPI_FDIV (0x1 << 3) // (SPI) Clock Selection +#define AT91C_SPI_MODFDIS (0x1 << 4) // (SPI) Mode Fault Detection +#define AT91C_SPI_LLB (0x1 << 7) // (SPI) Clock Selection +#define AT91C_SPI_PCS (0xF << 16) // (SPI) Peripheral Chip Select +#define AT91C_SPI_DLYBCS (0xFF << 24) // (SPI) Delay Between Chip Selects +// -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- +#define AT91C_SPI_RD (0xFFFF << 0) // (SPI) Receive Data +#define AT91C_SPI_RPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- +#define AT91C_SPI_TD (0xFFFF << 0) // (SPI) Transmit Data +#define AT91C_SPI_TPCS (0xF << 16) // (SPI) Peripheral Chip Select Status +// -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- +#define AT91C_SPI_RDRF (0x1 << 0) // (SPI) Receive Data Register Full +#define AT91C_SPI_TDRE (0x1 << 1) // (SPI) Transmit Data Register Empty +#define AT91C_SPI_MODF (0x1 << 2) // (SPI) Mode Fault Error +#define AT91C_SPI_OVRES (0x1 << 3) // (SPI) Overrun Error Status +#define AT91C_SPI_ENDRX (0x1 << 4) // (SPI) End of Receiver Transfer +#define AT91C_SPI_ENDTX (0x1 << 5) // (SPI) End of Receiver Transfer +#define AT91C_SPI_RXBUFF (0x1 << 6) // (SPI) RXBUFF Interrupt +#define AT91C_SPI_TXBUFE (0x1 << 7) // (SPI) TXBUFE Interrupt +#define AT91C_SPI_NSSR (0x1 << 8) // (SPI) NSSR Interrupt +#define AT91C_SPI_TXEMPTY (0x1 << 9) // (SPI) TXEMPTY Interrupt +#define AT91C_SPI_SPIENS (0x1 << 16) // (SPI) Enable Status +// -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- +// -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- +// -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- +// -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- +#define AT91C_SPI_CPOL (0x1 << 0) // (SPI) Clock Polarity +#define AT91C_SPI_NCPHA (0x1 << 1) // (SPI) Clock Phase +#define AT91C_SPI_CSAAT (0x1 << 3) // (SPI) Chip Select Active After Transfer +#define AT91C_SPI_BITS (0xF << 4) // (SPI) Bits Per Transfer +#define AT91C_SPI_BITS_8 (0x0 << 4) // (SPI) 8 Bits Per transfer +#define AT91C_SPI_BITS_9 (0x1 << 4) // (SPI) 9 Bits Per transfer +#define AT91C_SPI_BITS_10 (0x2 << 4) // (SPI) 10 Bits Per transfer +#define AT91C_SPI_BITS_11 (0x3 << 4) // (SPI) 11 Bits Per transfer +#define AT91C_SPI_BITS_12 (0x4 << 4) // (SPI) 12 Bits Per transfer +#define AT91C_SPI_BITS_13 (0x5 << 4) // (SPI) 13 Bits Per transfer +#define AT91C_SPI_BITS_14 (0x6 << 4) // (SPI) 14 Bits Per transfer +#define AT91C_SPI_BITS_15 (0x7 << 4) // (SPI) 15 Bits Per transfer +#define AT91C_SPI_BITS_16 (0x8 << 4) // (SPI) 16 Bits Per transfer +#define AT91C_SPI_SCBR (0xFF << 8) // (SPI) Serial Clock Baud Rate +#define AT91C_SPI_DLYBS (0xFF << 16) // (SPI) Delay Before SPCK +#define AT91C_SPI_DLYBCT (0xFF << 24) // (SPI) Delay Between Consecutive Transfers + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Usart +// ***************************************************************************** +// *** Register offset in AT91S_USART structure *** +#define US_CR ( 0) // Control Register +#define US_MR ( 4) // Mode Register +#define US_IER ( 8) // Interrupt Enable Register +#define US_IDR (12) // Interrupt Disable Register +#define US_IMR (16) // Interrupt Mask Register +#define US_CSR (20) // Channel Status Register +#define US_RHR (24) // Receiver Holding Register +#define US_THR (28) // Transmitter Holding Register +#define US_BRGR (32) // Baud Rate Generator Register +#define US_RTOR (36) // Receiver Time-out Register +#define US_TTGR (40) // Transmitter Time-guard Register +#define US_FIDI (64) // FI_DI_Ratio Register +#define US_NER (68) // Nb Errors Register +#define US_IF (76) // IRDA_FILTER Register +#define US_RPR (256) // Receive Pointer Register +#define US_RCR (260) // Receive Counter Register +#define US_TPR (264) // Transmit Pointer Register +#define US_TCR (268) // Transmit Counter Register +#define US_RNPR (272) // Receive Next Pointer Register +#define US_RNCR (276) // Receive Next Counter Register +#define US_TNPR (280) // Transmit Next Pointer Register +#define US_TNCR (284) // Transmit Next Counter Register +#define US_PTCR (288) // PDC Transfer Control Register +#define US_PTSR (292) // PDC Transfer Status Register +// -------- US_CR : (USART Offset: 0x0) Debug Unit Control Register -------- +#define AT91C_US_STTBRK (0x1 << 9) // (USART) Start Break +#define AT91C_US_STPBRK (0x1 << 10) // (USART) Stop Break +#define AT91C_US_STTTO (0x1 << 11) // (USART) Start Time-out +#define AT91C_US_SENDA (0x1 << 12) // (USART) Send Address +#define AT91C_US_RSTIT (0x1 << 13) // (USART) Reset Iterations +#define AT91C_US_RSTNACK (0x1 << 14) // (USART) Reset Non Acknowledge +#define AT91C_US_RETTO (0x1 << 15) // (USART) Rearm Time-out +#define AT91C_US_DTREN (0x1 << 16) // (USART) Data Terminal ready Enable +#define AT91C_US_DTRDIS (0x1 << 17) // (USART) Data Terminal ready Disable +#define AT91C_US_RTSEN (0x1 << 18) // (USART) Request to Send enable +#define AT91C_US_RTSDIS (0x1 << 19) // (USART) Request to Send Disable +// -------- US_MR : (USART Offset: 0x4) Debug Unit Mode Register -------- +#define AT91C_US_USMODE (0xF << 0) // (USART) Usart mode +#define AT91C_US_USMODE_NORMAL (0x0) // (USART) Normal +#define AT91C_US_USMODE_RS485 (0x1) // (USART) RS485 +#define AT91C_US_USMODE_HWHSH (0x2) // (USART) Hardware Handshaking +#define AT91C_US_USMODE_MODEM (0x3) // (USART) Modem +#define AT91C_US_USMODE_ISO7816_0 (0x4) // (USART) ISO7816 protocol: T = 0 +#define AT91C_US_USMODE_ISO7816_1 (0x6) // (USART) ISO7816 protocol: T = 1 +#define AT91C_US_USMODE_IRDA (0x8) // (USART) IrDA +#define AT91C_US_USMODE_SWHSH (0xC) // (USART) Software Handshaking +#define AT91C_US_CLKS (0x3 << 4) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CLKS_CLOCK (0x0 << 4) // (USART) Clock +#define AT91C_US_CLKS_FDIV1 (0x1 << 4) // (USART) fdiv1 +#define AT91C_US_CLKS_SLOW (0x2 << 4) // (USART) slow_clock (ARM) +#define AT91C_US_CLKS_EXT (0x3 << 4) // (USART) External (SCK) +#define AT91C_US_CHRL (0x3 << 6) // (USART) Clock Selection (Baud Rate generator Input Clock +#define AT91C_US_CHRL_5_BITS (0x0 << 6) // (USART) Character Length: 5 bits +#define AT91C_US_CHRL_6_BITS (0x1 << 6) // (USART) Character Length: 6 bits +#define AT91C_US_CHRL_7_BITS (0x2 << 6) // (USART) Character Length: 7 bits +#define AT91C_US_CHRL_8_BITS (0x3 << 6) // (USART) Character Length: 8 bits +#define AT91C_US_SYNC (0x1 << 8) // (USART) Synchronous Mode Select +#define AT91C_US_NBSTOP (0x3 << 12) // (USART) Number of Stop bits +#define AT91C_US_NBSTOP_1_BIT (0x0 << 12) // (USART) 1 stop bit +#define AT91C_US_NBSTOP_15_BIT (0x1 << 12) // (USART) Asynchronous (SYNC=0) 2 stop bits Synchronous (SYNC=1) 2 stop bits +#define AT91C_US_NBSTOP_2_BIT (0x2 << 12) // (USART) 2 stop bits +#define AT91C_US_MSBF (0x1 << 16) // (USART) Bit Order +#define AT91C_US_MODE9 (0x1 << 17) // (USART) 9-bit Character length +#define AT91C_US_CKLO (0x1 << 18) // (USART) Clock Output Select +#define AT91C_US_OVER (0x1 << 19) // (USART) Over Sampling Mode +#define AT91C_US_INACK (0x1 << 20) // (USART) Inhibit Non Acknowledge +#define AT91C_US_DSNACK (0x1 << 21) // (USART) Disable Successive NACK +#define AT91C_US_MAX_ITER (0x1 << 24) // (USART) Number of Repetitions +#define AT91C_US_FILTER (0x1 << 28) // (USART) Receive Line Filter +// -------- US_IER : (USART Offset: 0x8) Debug Unit Interrupt Enable Register -------- +#define AT91C_US_RXBRK (0x1 << 2) // (USART) Break Received/End of Break +#define AT91C_US_TIMEOUT (0x1 << 8) // (USART) Receiver Time-out +#define AT91C_US_ITERATION (0x1 << 10) // (USART) Max number of Repetitions Reached +#define AT91C_US_NACK (0x1 << 13) // (USART) Non Acknowledge +#define AT91C_US_RIIC (0x1 << 16) // (USART) Ring INdicator Input Change Flag +#define AT91C_US_DSRIC (0x1 << 17) // (USART) Data Set Ready Input Change Flag +#define AT91C_US_DCDIC (0x1 << 18) // (USART) Data Carrier Flag +#define AT91C_US_CTSIC (0x1 << 19) // (USART) Clear To Send Input Change Flag +// -------- US_IDR : (USART Offset: 0xc) Debug Unit Interrupt Disable Register -------- +// -------- US_IMR : (USART Offset: 0x10) Debug Unit Interrupt Mask Register -------- +// -------- US_CSR : (USART Offset: 0x14) Debug Unit Channel Status Register -------- +#define AT91C_US_RI (0x1 << 20) // (USART) Image of RI Input +#define AT91C_US_DSR (0x1 << 21) // (USART) Image of DSR Input +#define AT91C_US_DCD (0x1 << 22) // (USART) Image of DCD Input +#define AT91C_US_CTS (0x1 << 23) // (USART) Image of CTS Input + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Synchronous Serial Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_SSC structure *** +#define SSC_CR ( 0) // Control Register +#define SSC_CMR ( 4) // Clock Mode Register +#define SSC_RCMR (16) // Receive Clock ModeRegister +#define SSC_RFMR (20) // Receive Frame Mode Register +#define SSC_TCMR (24) // Transmit Clock Mode Register +#define SSC_TFMR (28) // Transmit Frame Mode Register +#define SSC_RHR (32) // Receive Holding Register +#define SSC_THR (36) // Transmit Holding Register +#define SSC_RSHR (48) // Receive Sync Holding Register +#define SSC_TSHR (52) // Transmit Sync Holding Register +#define SSC_SR (64) // Status Register +#define SSC_IER (68) // Interrupt Enable Register +#define SSC_IDR (72) // Interrupt Disable Register +#define SSC_IMR (76) // Interrupt Mask Register +#define SSC_RPR (256) // Receive Pointer Register +#define SSC_RCR (260) // Receive Counter Register +#define SSC_TPR (264) // Transmit Pointer Register +#define SSC_TCR (268) // Transmit Counter Register +#define SSC_RNPR (272) // Receive Next Pointer Register +#define SSC_RNCR (276) // Receive Next Counter Register +#define SSC_TNPR (280) // Transmit Next Pointer Register +#define SSC_TNCR (284) // Transmit Next Counter Register +#define SSC_PTCR (288) // PDC Transfer Control Register +#define SSC_PTSR (292) // PDC Transfer Status Register +// -------- SSC_CR : (SSC Offset: 0x0) SSC Control Register -------- +#define AT91C_SSC_RXEN (0x1 << 0) // (SSC) Receive Enable +#define AT91C_SSC_RXDIS (0x1 << 1) // (SSC) Receive Disable +#define AT91C_SSC_TXEN (0x1 << 8) // (SSC) Transmit Enable +#define AT91C_SSC_TXDIS (0x1 << 9) // (SSC) Transmit Disable +#define AT91C_SSC_SWRST (0x1 << 15) // (SSC) Software Reset +// -------- SSC_RCMR : (SSC Offset: 0x10) SSC Receive Clock Mode Register -------- +#define AT91C_SSC_CKS (0x3 << 0) // (SSC) Receive/Transmit Clock Selection +#define AT91C_SSC_CKS_DIV (0x0) // (SSC) Divided Clock +#define AT91C_SSC_CKS_TK (0x1) // (SSC) TK Clock signal +#define AT91C_SSC_CKS_RK (0x2) // (SSC) RK pin +#define AT91C_SSC_CKO (0x7 << 2) // (SSC) Receive/Transmit Clock Output Mode Selection +#define AT91C_SSC_CKO_NONE (0x0 << 2) // (SSC) Receive/Transmit Clock Output Mode: None RK pin: Input-only +#define AT91C_SSC_CKO_CONTINOUS (0x1 << 2) // (SSC) Continuous Receive/Transmit Clock RK pin: Output +#define AT91C_SSC_CKO_DATA_TX (0x2 << 2) // (SSC) Receive/Transmit Clock only during data transfers RK pin: Output +#define AT91C_SSC_CKI (0x1 << 5) // (SSC) Receive/Transmit Clock Inversion +#define AT91C_SSC_START (0xF << 8) // (SSC) Receive/Transmit Start Selection +#define AT91C_SSC_START_CONTINOUS (0x0 << 8) // (SSC) Continuous, as soon as the receiver is enabled, and immediately after the end of transfer of the previous data. +#define AT91C_SSC_START_TX (0x1 << 8) // (SSC) Transmit/Receive start +#define AT91C_SSC_START_LOW_RF (0x2 << 8) // (SSC) Detection of a low level on RF input +#define AT91C_SSC_START_HIGH_RF (0x3 << 8) // (SSC) Detection of a high level on RF input +#define AT91C_SSC_START_FALL_RF (0x4 << 8) // (SSC) Detection of a falling edge on RF input +#define AT91C_SSC_START_RISE_RF (0x5 << 8) // (SSC) Detection of a rising edge on RF input +#define AT91C_SSC_START_LEVEL_RF (0x6 << 8) // (SSC) Detection of any level change on RF input +#define AT91C_SSC_START_EDGE_RF (0x7 << 8) // (SSC) Detection of any edge on RF input +#define AT91C_SSC_START_0 (0x8 << 8) // (SSC) Compare 0 +#define AT91C_SSC_STTDLY (0xFF << 16) // (SSC) Receive/Transmit Start Delay +#define AT91C_SSC_PERIOD (0xFF << 24) // (SSC) Receive/Transmit Period Divider Selection +// -------- SSC_RFMR : (SSC Offset: 0x14) SSC Receive Frame Mode Register -------- +#define AT91C_SSC_DATLEN (0x1F << 0) // (SSC) Data Length +#define AT91C_SSC_LOOP (0x1 << 5) // (SSC) Loop Mode +#define AT91C_SSC_MSBF (0x1 << 7) // (SSC) Most Significant Bit First +#define AT91C_SSC_DATNB (0xF << 8) // (SSC) Data Number per Frame +#define AT91C_SSC_FSLEN (0xF << 16) // (SSC) Receive/Transmit Frame Sync length +#define AT91C_SSC_FSOS (0x7 << 20) // (SSC) Receive/Transmit Frame Sync Output Selection +#define AT91C_SSC_FSOS_NONE (0x0 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: None RK pin Input-only +#define AT91C_SSC_FSOS_NEGATIVE (0x1 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Negative Pulse +#define AT91C_SSC_FSOS_POSITIVE (0x2 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Positive Pulse +#define AT91C_SSC_FSOS_LOW (0x3 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver Low during data transfer +#define AT91C_SSC_FSOS_HIGH (0x4 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Driver High during data transfer +#define AT91C_SSC_FSOS_TOGGLE (0x5 << 20) // (SSC) Selected Receive/Transmit Frame Sync Signal: Toggling at each start of data transfer +#define AT91C_SSC_FSEDGE (0x1 << 24) // (SSC) Frame Sync Edge Detection +// -------- SSC_TCMR : (SSC Offset: 0x18) SSC Transmit Clock Mode Register -------- +// -------- SSC_TFMR : (SSC Offset: 0x1c) SSC Transmit Frame Mode Register -------- +#define AT91C_SSC_DATDEF (0x1 << 5) // (SSC) Data Default Value +#define AT91C_SSC_FSDEN (0x1 << 23) // (SSC) Frame Sync Data Enable +// -------- SSC_SR : (SSC Offset: 0x40) SSC Status Register -------- +#define AT91C_SSC_TXRDY (0x1 << 0) // (SSC) Transmit Ready +#define AT91C_SSC_TXEMPTY (0x1 << 1) // (SSC) Transmit Empty +#define AT91C_SSC_ENDTX (0x1 << 2) // (SSC) End Of Transmission +#define AT91C_SSC_TXBUFE (0x1 << 3) // (SSC) Transmit Buffer Empty +#define AT91C_SSC_RXRDY (0x1 << 4) // (SSC) Receive Ready +#define AT91C_SSC_OVRUN (0x1 << 5) // (SSC) Receive Overrun +#define AT91C_SSC_ENDRX (0x1 << 6) // (SSC) End of Reception +#define AT91C_SSC_RXBUFF (0x1 << 7) // (SSC) Receive Buffer Full +#define AT91C_SSC_TXSYN (0x1 << 10) // (SSC) Transmit Sync +#define AT91C_SSC_RXSYN (0x1 << 11) // (SSC) Receive Sync +#define AT91C_SSC_TXENA (0x1 << 16) // (SSC) Transmit Enable +#define AT91C_SSC_RXENA (0x1 << 17) // (SSC) Receive Enable +// -------- SSC_IER : (SSC Offset: 0x44) SSC Interrupt Enable Register -------- +// -------- SSC_IDR : (SSC Offset: 0x48) SSC Interrupt Disable Register -------- +// -------- SSC_IMR : (SSC Offset: 0x4c) SSC Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Two-wire Interface +// ***************************************************************************** +// *** Register offset in AT91S_TWI structure *** +#define TWI_CR ( 0) // Control Register +#define TWI_MMR ( 4) // Master Mode Register +#define TWI_IADR (12) // Internal Address Register +#define TWI_CWGR (16) // Clock Waveform Generator Register +#define TWI_SR (32) // Status Register +#define TWI_IER (36) // Interrupt Enable Register +#define TWI_IDR (40) // Interrupt Disable Register +#define TWI_IMR (44) // Interrupt Mask Register +#define TWI_RHR (48) // Receive Holding Register +#define TWI_THR (52) // Transmit Holding Register +// -------- TWI_CR : (TWI Offset: 0x0) TWI Control Register -------- +#define AT91C_TWI_START (0x1 << 0) // (TWI) Send a START Condition +#define AT91C_TWI_STOP (0x1 << 1) // (TWI) Send a STOP Condition +#define AT91C_TWI_MSEN (0x1 << 2) // (TWI) TWI Master Transfer Enabled +#define AT91C_TWI_MSDIS (0x1 << 3) // (TWI) TWI Master Transfer Disabled +#define AT91C_TWI_SWRST (0x1 << 7) // (TWI) Software Reset +// -------- TWI_MMR : (TWI Offset: 0x4) TWI Master Mode Register -------- +#define AT91C_TWI_IADRSZ (0x3 << 8) // (TWI) Internal Device Address Size +#define AT91C_TWI_IADRSZ_NO (0x0 << 8) // (TWI) No internal device address +#define AT91C_TWI_IADRSZ_1_BYTE (0x1 << 8) // (TWI) One-byte internal device address +#define AT91C_TWI_IADRSZ_2_BYTE (0x2 << 8) // (TWI) Two-byte internal device address +#define AT91C_TWI_IADRSZ_3_BYTE (0x3 << 8) // (TWI) Three-byte internal device address +#define AT91C_TWI_MREAD (0x1 << 12) // (TWI) Master Read Direction +#define AT91C_TWI_DADR (0x7F << 16) // (TWI) Device Address +// -------- TWI_CWGR : (TWI Offset: 0x10) TWI Clock Waveform Generator Register -------- +#define AT91C_TWI_CLDIV (0xFF << 0) // (TWI) Clock Low Divider +#define AT91C_TWI_CHDIV (0xFF << 8) // (TWI) Clock High Divider +#define AT91C_TWI_CKDIV (0x7 << 16) // (TWI) Clock Divider +// -------- TWI_SR : (TWI Offset: 0x20) TWI Status Register -------- +#define AT91C_TWI_TXCOMP (0x1 << 0) // (TWI) Transmission Completed +#define AT91C_TWI_RXRDY (0x1 << 1) // (TWI) Receive holding register ReaDY +#define AT91C_TWI_TXRDY (0x1 << 2) // (TWI) Transmit holding register ReaDY +#define AT91C_TWI_OVRE (0x1 << 6) // (TWI) Overrun Error +#define AT91C_TWI_UNRE (0x1 << 7) // (TWI) Underrun Error +#define AT91C_TWI_NACK (0x1 << 8) // (TWI) Not Acknowledged +// -------- TWI_IER : (TWI Offset: 0x24) TWI Interrupt Enable Register -------- +// -------- TWI_IDR : (TWI Offset: 0x28) TWI Interrupt Disable Register -------- +// -------- TWI_IMR : (TWI Offset: 0x2c) TWI Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR PWMC Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC_CH structure *** +#define PWMC_CMR ( 0) // Channel Mode Register +#define PWMC_CDTYR ( 4) // Channel Duty Cycle Register +#define PWMC_CPRDR ( 8) // Channel Period Register +#define PWMC_CCNTR (12) // Channel Counter Register +#define PWMC_CUPDR (16) // Channel Update Register +#define PWMC_Reserved (20) // Reserved +// -------- PWMC_CMR : (PWMC_CH Offset: 0x0) PWMC Channel Mode Register -------- +#define AT91C_PWMC_CPRE (0xF << 0) // (PWMC_CH) Channel Pre-scaler : PWMC_CLKx +#define AT91C_PWMC_CPRE_MCK (0x0) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKA (0xB) // (PWMC_CH) +#define AT91C_PWMC_CPRE_MCKB (0xC) // (PWMC_CH) +#define AT91C_PWMC_CALG (0x1 << 8) // (PWMC_CH) Channel Alignment +#define AT91C_PWMC_CPOL (0x1 << 9) // (PWMC_CH) Channel Polarity +#define AT91C_PWMC_CPD (0x1 << 10) // (PWMC_CH) Channel Update Period +// -------- PWMC_CDTYR : (PWMC_CH Offset: 0x4) PWMC Channel Duty Cycle Register -------- +#define AT91C_PWMC_CDTY (0x0 << 0) // (PWMC_CH) Channel Duty Cycle +// -------- PWMC_CPRDR : (PWMC_CH Offset: 0x8) PWMC Channel Period Register -------- +#define AT91C_PWMC_CPRD (0x0 << 0) // (PWMC_CH) Channel Period +// -------- PWMC_CCNTR : (PWMC_CH Offset: 0xc) PWMC Channel Counter Register -------- +#define AT91C_PWMC_CCNT (0x0 << 0) // (PWMC_CH) Channel Counter +// -------- PWMC_CUPDR : (PWMC_CH Offset: 0x10) PWMC Channel Update Register -------- +#define AT91C_PWMC_CUPD (0x0 << 0) // (PWMC_CH) Channel Update + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Pulse Width Modulation Controller Interface +// ***************************************************************************** +// *** Register offset in AT91S_PWMC structure *** +#define PWMC_MR ( 0) // PWMC Mode Register +#define PWMC_ENA ( 4) // PWMC Enable Register +#define PWMC_DIS ( 8) // PWMC Disable Register +#define PWMC_SR (12) // PWMC Status Register +#define PWMC_IER (16) // PWMC Interrupt Enable Register +#define PWMC_IDR (20) // PWMC Interrupt Disable Register +#define PWMC_IMR (24) // PWMC Interrupt Mask Register +#define PWMC_ISR (28) // PWMC Interrupt Status Register +#define PWMC_VR (252) // PWMC Version Register +#define PWMC_CH (512) // PWMC Channel +// -------- PWMC_MR : (PWMC Offset: 0x0) PWMC Mode Register -------- +#define AT91C_PWMC_DIVA (0xFF << 0) // (PWMC) CLKA divide factor. +#define AT91C_PWMC_PREA (0xF << 8) // (PWMC) Divider Input Clock Prescaler A +#define AT91C_PWMC_PREA_MCK (0x0 << 8) // (PWMC) +#define AT91C_PWMC_DIVB (0xFF << 16) // (PWMC) CLKB divide factor. +#define AT91C_PWMC_PREB (0xF << 24) // (PWMC) Divider Input Clock Prescaler B +#define AT91C_PWMC_PREB_MCK (0x0 << 24) // (PWMC) +// -------- PWMC_ENA : (PWMC Offset: 0x4) PWMC Enable Register -------- +#define AT91C_PWMC_CHID0 (0x1 << 0) // (PWMC) Channel ID 0 +#define AT91C_PWMC_CHID1 (0x1 << 1) // (PWMC) Channel ID 1 +#define AT91C_PWMC_CHID2 (0x1 << 2) // (PWMC) Channel ID 2 +#define AT91C_PWMC_CHID3 (0x1 << 3) // (PWMC) Channel ID 3 +// -------- PWMC_DIS : (PWMC Offset: 0x8) PWMC Disable Register -------- +// -------- PWMC_SR : (PWMC Offset: 0xc) PWMC Status Register -------- +// -------- PWMC_IER : (PWMC Offset: 0x10) PWMC Interrupt Enable Register -------- +// -------- PWMC_IDR : (PWMC Offset: 0x14) PWMC Interrupt Disable Register -------- +// -------- PWMC_IMR : (PWMC Offset: 0x18) PWMC Interrupt Mask Register -------- +// -------- PWMC_ISR : (PWMC Offset: 0x1c) PWMC Interrupt Status Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR USB Device Interface +// ***************************************************************************** +// *** Register offset in AT91S_UDP structure *** +#define UDP_NUM ( 0) // Frame Number Register +#define UDP_GLBSTATE ( 4) // Global State Register +#define UDP_FADDR ( 8) // Function Address Register +#define UDP_IER (16) // Interrupt Enable Register +#define UDP_IDR (20) // Interrupt Disable Register +#define UDP_IMR (24) // Interrupt Mask Register +#define UDP_ISR (28) // Interrupt Status Register +#define UDP_ICR (32) // Interrupt Clear Register +#define UDP_RSTEP (40) // Reset Endpoint Register +#define UDP_CSR (48) // Endpoint Control and Status Register +#define UDP_FDR (80) // Endpoint FIFO Data Register +#define UDP_TXVC (116) // Transceiver Control Register +// -------- UDP_FRM_NUM : (UDP Offset: 0x0) USB Frame Number Register -------- +#define AT91C_UDP_FRM_NUM (0x7FF << 0) // (UDP) Frame Number as Defined in the Packet Field Formats +#define AT91C_UDP_FRM_ERR (0x1 << 16) // (UDP) Frame Error +#define AT91C_UDP_FRM_OK (0x1 << 17) // (UDP) Frame OK +// -------- UDP_GLB_STATE : (UDP Offset: 0x4) USB Global State Register -------- +#define AT91C_UDP_FADDEN (0x1 << 0) // (UDP) Function Address Enable +#define AT91C_UDP_CONFG (0x1 << 1) // (UDP) Configured +#define AT91C_UDP_ESR (0x1 << 2) // (UDP) Enable Send Resume +#define AT91C_UDP_RSMINPR (0x1 << 3) // (UDP) A Resume Has Been Sent to the Host +#define AT91C_UDP_RMWUPE (0x1 << 4) // (UDP) Remote Wake Up Enable +// -------- UDP_FADDR : (UDP Offset: 0x8) USB Function Address Register -------- +#define AT91C_UDP_FADD (0xFF << 0) // (UDP) Function Address Value +#define AT91C_UDP_FEN (0x1 << 8) // (UDP) Function Enable +// -------- UDP_IER : (UDP Offset: 0x10) USB Interrupt Enable Register -------- +#define AT91C_UDP_EPINT0 (0x1 << 0) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT1 (0x1 << 1) // (UDP) Endpoint 0 Interrupt +#define AT91C_UDP_EPINT2 (0x1 << 2) // (UDP) Endpoint 2 Interrupt +#define AT91C_UDP_EPINT3 (0x1 << 3) // (UDP) Endpoint 3 Interrupt +#define AT91C_UDP_EPINT4 (0x1 << 4) // (UDP) Endpoint 4 Interrupt +#define AT91C_UDP_EPINT5 (0x1 << 5) // (UDP) Endpoint 5 Interrupt +#define AT91C_UDP_RXSUSP (0x1 << 8) // (UDP) USB Suspend Interrupt +#define AT91C_UDP_RXRSM (0x1 << 9) // (UDP) USB Resume Interrupt +#define AT91C_UDP_EXTRSM (0x1 << 10) // (UDP) USB External Resume Interrupt +#define AT91C_UDP_SOFINT (0x1 << 11) // (UDP) USB Start Of frame Interrupt +#define AT91C_UDP_WAKEUP (0x1 << 13) // (UDP) USB Resume Interrupt +// -------- UDP_IDR : (UDP Offset: 0x14) USB Interrupt Disable Register -------- +// -------- UDP_IMR : (UDP Offset: 0x18) USB Interrupt Mask Register -------- +// -------- UDP_ISR : (UDP Offset: 0x1c) USB Interrupt Status Register -------- +#define AT91C_UDP_ENDBUSRES (0x1 << 12) // (UDP) USB End Of Bus Reset Interrupt +// -------- UDP_ICR : (UDP Offset: 0x20) USB Interrupt Clear Register -------- +// -------- UDP_RST_EP : (UDP Offset: 0x28) USB Reset Endpoint Register -------- +#define AT91C_UDP_EP0 (0x1 << 0) // (UDP) Reset Endpoint 0 +#define AT91C_UDP_EP1 (0x1 << 1) // (UDP) Reset Endpoint 1 +#define AT91C_UDP_EP2 (0x1 << 2) // (UDP) Reset Endpoint 2 +#define AT91C_UDP_EP3 (0x1 << 3) // (UDP) Reset Endpoint 3 +#define AT91C_UDP_EP4 (0x1 << 4) // (UDP) Reset Endpoint 4 +#define AT91C_UDP_EP5 (0x1 << 5) // (UDP) Reset Endpoint 5 +// -------- UDP_CSR : (UDP Offset: 0x30) USB Endpoint Control and Status Register -------- +#define AT91C_UDP_TXCOMP (0x1 << 0) // (UDP) Generates an IN packet with data previously written in the DPR +#define AT91C_UDP_RX_DATA_BK0 (0x1 << 1) // (UDP) Receive Data Bank 0 +#define AT91C_UDP_RXSETUP (0x1 << 2) // (UDP) Sends STALL to the Host (Control endpoints) +#define AT91C_UDP_ISOERROR (0x1 << 3) // (UDP) Isochronous error (Isochronous endpoints) +#define AT91C_UDP_TXPKTRDY (0x1 << 4) // (UDP) Transmit Packet Ready +#define AT91C_UDP_FORCESTALL (0x1 << 5) // (UDP) Force Stall (used by Control, Bulk and Isochronous endpoints). +#define AT91C_UDP_RX_DATA_BK1 (0x1 << 6) // (UDP) Receive Data Bank 1 (only used by endpoints with ping-pong attributes). +#define AT91C_UDP_DIR (0x1 << 7) // (UDP) Transfer Direction +#define AT91C_UDP_EPTYPE (0x7 << 8) // (UDP) Endpoint type +#define AT91C_UDP_EPTYPE_CTRL (0x0 << 8) // (UDP) Control +#define AT91C_UDP_EPTYPE_ISO_OUT (0x1 << 8) // (UDP) Isochronous OUT +#define AT91C_UDP_EPTYPE_BULK_OUT (0x2 << 8) // (UDP) Bulk OUT +#define AT91C_UDP_EPTYPE_INT_OUT (0x3 << 8) // (UDP) Interrupt OUT +#define AT91C_UDP_EPTYPE_ISO_IN (0x5 << 8) // (UDP) Isochronous IN +#define AT91C_UDP_EPTYPE_BULK_IN (0x6 << 8) // (UDP) Bulk IN +#define AT91C_UDP_EPTYPE_INT_IN (0x7 << 8) // (UDP) Interrupt IN +#define AT91C_UDP_DTGLE (0x1 << 11) // (UDP) Data Toggle +#define AT91C_UDP_EPEDS (0x1 << 15) // (UDP) Endpoint Enable Disable +#define AT91C_UDP_RXBYTECNT (0x7FF << 16) // (UDP) Number Of Bytes Available in the FIFO +// -------- UDP_TXVC : (UDP Offset: 0x74) Transceiver Control Register -------- +#define AT91C_UDP_TXVDIS (0x1 << 8) // (UDP) +#define AT91C_UDP_PUON (0x1 << 9) // (UDP) Pull-up ON + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Channel Interface +// ***************************************************************************** +// *** Register offset in AT91S_TC structure *** +#define TC_CCR ( 0) // Channel Control Register +#define TC_CMR ( 4) // Channel Mode Register (Capture Mode / Waveform Mode) +#define TC_CV (16) // Counter Value +#define TC_RA (20) // Register A +#define TC_RB (24) // Register B +#define TC_RC (28) // Register C +#define TC_SR (32) // Status Register +#define TC_IER (36) // Interrupt Enable Register +#define TC_IDR (40) // Interrupt Disable Register +#define TC_IMR (44) // Interrupt Mask Register +// -------- TC_CCR : (TC Offset: 0x0) TC Channel Control Register -------- +#define AT91C_TC_CLKEN (0x1 << 0) // (TC) Counter Clock Enable Command +#define AT91C_TC_CLKDIS (0x1 << 1) // (TC) Counter Clock Disable Command +#define AT91C_TC_SWTRG (0x1 << 2) // (TC) Software Trigger Command +// -------- TC_CMR : (TC Offset: 0x4) TC Channel Mode Register: Capture Mode / Waveform Mode -------- +#define AT91C_TC_CLKS (0x7 << 0) // (TC) Clock Selection +#define AT91C_TC_CLKS_TIMER_DIV1_CLOCK (0x0) // (TC) Clock selected: TIMER_DIV1_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV2_CLOCK (0x1) // (TC) Clock selected: TIMER_DIV2_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV3_CLOCK (0x2) // (TC) Clock selected: TIMER_DIV3_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV4_CLOCK (0x3) // (TC) Clock selected: TIMER_DIV4_CLOCK +#define AT91C_TC_CLKS_TIMER_DIV5_CLOCK (0x4) // (TC) Clock selected: TIMER_DIV5_CLOCK +#define AT91C_TC_CLKS_XC0 (0x5) // (TC) Clock selected: XC0 +#define AT91C_TC_CLKS_XC1 (0x6) // (TC) Clock selected: XC1 +#define AT91C_TC_CLKS_XC2 (0x7) // (TC) Clock selected: XC2 +#define AT91C_TC_CLKI (0x1 << 3) // (TC) Clock Invert +#define AT91C_TC_BURST (0x3 << 4) // (TC) Burst Signal Selection +#define AT91C_TC_BURST_NONE (0x0 << 4) // (TC) The clock is not gated by an external signal +#define AT91C_TC_BURST_XC0 (0x1 << 4) // (TC) XC0 is ANDed with the selected clock +#define AT91C_TC_BURST_XC1 (0x2 << 4) // (TC) XC1 is ANDed with the selected clock +#define AT91C_TC_BURST_XC2 (0x3 << 4) // (TC) XC2 is ANDed with the selected clock +#define AT91C_TC_CPCSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RC Compare +#define AT91C_TC_LDBSTOP (0x1 << 6) // (TC) Counter Clock Stopped with RB Loading +#define AT91C_TC_CPCDIS (0x1 << 7) // (TC) Counter Clock Disable with RC Compare +#define AT91C_TC_LDBDIS (0x1 << 7) // (TC) Counter Clock Disabled with RB Loading +#define AT91C_TC_ETRGEDG (0x3 << 8) // (TC) External Trigger Edge Selection +#define AT91C_TC_ETRGEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_ETRGEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_ETRGEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_ETRGEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVTEDG (0x3 << 8) // (TC) External Event Edge Selection +#define AT91C_TC_EEVTEDG_NONE (0x0 << 8) // (TC) Edge: None +#define AT91C_TC_EEVTEDG_RISING (0x1 << 8) // (TC) Edge: rising edge +#define AT91C_TC_EEVTEDG_FALLING (0x2 << 8) // (TC) Edge: falling edge +#define AT91C_TC_EEVTEDG_BOTH (0x3 << 8) // (TC) Edge: each edge +#define AT91C_TC_EEVT (0x3 << 10) // (TC) External Event Selection +#define AT91C_TC_EEVT_TIOB (0x0 << 10) // (TC) Signal selected as external event: TIOB TIOB direction: input +#define AT91C_TC_EEVT_XC0 (0x1 << 10) // (TC) Signal selected as external event: XC0 TIOB direction: output +#define AT91C_TC_EEVT_XC1 (0x2 << 10) // (TC) Signal selected as external event: XC1 TIOB direction: output +#define AT91C_TC_EEVT_XC2 (0x3 << 10) // (TC) Signal selected as external event: XC2 TIOB direction: output +#define AT91C_TC_ABETRG (0x1 << 10) // (TC) TIOA or TIOB External Trigger Selection +#define AT91C_TC_ENETRG (0x1 << 12) // (TC) External Event Trigger enable +#define AT91C_TC_WAVESEL (0x3 << 13) // (TC) Waveform Selection +#define AT91C_TC_WAVESEL_UP (0x0 << 13) // (TC) UP mode without atomatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN (0x1 << 13) // (TC) UPDOWN mode without automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UP_AUTO (0x2 << 13) // (TC) UP mode with automatic trigger on RC Compare +#define AT91C_TC_WAVESEL_UPDOWN_AUTO (0x3 << 13) // (TC) UPDOWN mode with automatic trigger on RC Compare +#define AT91C_TC_CPCTRG (0x1 << 14) // (TC) RC Compare Trigger Enable +#define AT91C_TC_WAVE (0x1 << 15) // (TC) +#define AT91C_TC_ACPA (0x3 << 16) // (TC) RA Compare Effect on TIOA +#define AT91C_TC_ACPA_NONE (0x0 << 16) // (TC) Effect: none +#define AT91C_TC_ACPA_SET (0x1 << 16) // (TC) Effect: set +#define AT91C_TC_ACPA_CLEAR (0x2 << 16) // (TC) Effect: clear +#define AT91C_TC_ACPA_TOGGLE (0x3 << 16) // (TC) Effect: toggle +#define AT91C_TC_LDRA (0x3 << 16) // (TC) RA Loading Selection +#define AT91C_TC_LDRA_NONE (0x0 << 16) // (TC) Edge: None +#define AT91C_TC_LDRA_RISING (0x1 << 16) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRA_FALLING (0x2 << 16) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRA_BOTH (0x3 << 16) // (TC) Edge: each edge of TIOA +#define AT91C_TC_ACPC (0x3 << 18) // (TC) RC Compare Effect on TIOA +#define AT91C_TC_ACPC_NONE (0x0 << 18) // (TC) Effect: none +#define AT91C_TC_ACPC_SET (0x1 << 18) // (TC) Effect: set +#define AT91C_TC_ACPC_CLEAR (0x2 << 18) // (TC) Effect: clear +#define AT91C_TC_ACPC_TOGGLE (0x3 << 18) // (TC) Effect: toggle +#define AT91C_TC_LDRB (0x3 << 18) // (TC) RB Loading Selection +#define AT91C_TC_LDRB_NONE (0x0 << 18) // (TC) Edge: None +#define AT91C_TC_LDRB_RISING (0x1 << 18) // (TC) Edge: rising edge of TIOA +#define AT91C_TC_LDRB_FALLING (0x2 << 18) // (TC) Edge: falling edge of TIOA +#define AT91C_TC_LDRB_BOTH (0x3 << 18) // (TC) Edge: each edge of TIOA +#define AT91C_TC_AEEVT (0x3 << 20) // (TC) External Event Effect on TIOA +#define AT91C_TC_AEEVT_NONE (0x0 << 20) // (TC) Effect: none +#define AT91C_TC_AEEVT_SET (0x1 << 20) // (TC) Effect: set +#define AT91C_TC_AEEVT_CLEAR (0x2 << 20) // (TC) Effect: clear +#define AT91C_TC_AEEVT_TOGGLE (0x3 << 20) // (TC) Effect: toggle +#define AT91C_TC_ASWTRG (0x3 << 22) // (TC) Software Trigger Effect on TIOA +#define AT91C_TC_ASWTRG_NONE (0x0 << 22) // (TC) Effect: none +#define AT91C_TC_ASWTRG_SET (0x1 << 22) // (TC) Effect: set +#define AT91C_TC_ASWTRG_CLEAR (0x2 << 22) // (TC) Effect: clear +#define AT91C_TC_ASWTRG_TOGGLE (0x3 << 22) // (TC) Effect: toggle +#define AT91C_TC_BCPB (0x3 << 24) // (TC) RB Compare Effect on TIOB +#define AT91C_TC_BCPB_NONE (0x0 << 24) // (TC) Effect: none +#define AT91C_TC_BCPB_SET (0x1 << 24) // (TC) Effect: set +#define AT91C_TC_BCPB_CLEAR (0x2 << 24) // (TC) Effect: clear +#define AT91C_TC_BCPB_TOGGLE (0x3 << 24) // (TC) Effect: toggle +#define AT91C_TC_BCPC (0x3 << 26) // (TC) RC Compare Effect on TIOB +#define AT91C_TC_BCPC_NONE (0x0 << 26) // (TC) Effect: none +#define AT91C_TC_BCPC_SET (0x1 << 26) // (TC) Effect: set +#define AT91C_TC_BCPC_CLEAR (0x2 << 26) // (TC) Effect: clear +#define AT91C_TC_BCPC_TOGGLE (0x3 << 26) // (TC) Effect: toggle +#define AT91C_TC_BEEVT (0x3 << 28) // (TC) External Event Effect on TIOB +#define AT91C_TC_BEEVT_NONE (0x0 << 28) // (TC) Effect: none +#define AT91C_TC_BEEVT_SET (0x1 << 28) // (TC) Effect: set +#define AT91C_TC_BEEVT_CLEAR (0x2 << 28) // (TC) Effect: clear +#define AT91C_TC_BEEVT_TOGGLE (0x3 << 28) // (TC) Effect: toggle +#define AT91C_TC_BSWTRG (0x3 << 30) // (TC) Software Trigger Effect on TIOB +#define AT91C_TC_BSWTRG_NONE (0x0 << 30) // (TC) Effect: none +#define AT91C_TC_BSWTRG_SET (0x1 << 30) // (TC) Effect: set +#define AT91C_TC_BSWTRG_CLEAR (0x2 << 30) // (TC) Effect: clear +#define AT91C_TC_BSWTRG_TOGGLE (0x3 << 30) // (TC) Effect: toggle +// -------- TC_SR : (TC Offset: 0x20) TC Channel Status Register -------- +#define AT91C_TC_COVFS (0x1 << 0) // (TC) Counter Overflow +#define AT91C_TC_LOVRS (0x1 << 1) // (TC) Load Overrun +#define AT91C_TC_CPAS (0x1 << 2) // (TC) RA Compare +#define AT91C_TC_CPBS (0x1 << 3) // (TC) RB Compare +#define AT91C_TC_CPCS (0x1 << 4) // (TC) RC Compare +#define AT91C_TC_LDRAS (0x1 << 5) // (TC) RA Loading +#define AT91C_TC_LDRBS (0x1 << 6) // (TC) RB Loading +#define AT91C_TC_ETRGS (0x1 << 7) // (TC) External Trigger +#define AT91C_TC_CLKSTA (0x1 << 16) // (TC) Clock Enabling +#define AT91C_TC_MTIOA (0x1 << 17) // (TC) TIOA Mirror +#define AT91C_TC_MTIOB (0x1 << 18) // (TC) TIOA Mirror +// -------- TC_IER : (TC Offset: 0x24) TC Channel Interrupt Enable Register -------- +// -------- TC_IDR : (TC Offset: 0x28) TC Channel Interrupt Disable Register -------- +// -------- TC_IMR : (TC Offset: 0x2c) TC Channel Interrupt Mask Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Timer Counter Interface +// ***************************************************************************** +// *** Register offset in AT91S_TCB structure *** +#define TCB_TC0 ( 0) // TC Channel 0 +#define TCB_TC1 (64) // TC Channel 1 +#define TCB_TC2 (128) // TC Channel 2 +#define TCB_BCR (192) // TC Block Control Register +#define TCB_BMR (196) // TC Block Mode Register +// -------- TCB_BCR : (TCB Offset: 0xc0) TC Block Control Register -------- +#define AT91C_TCB_SYNC (0x1 << 0) // (TCB) Synchro Command +// -------- TCB_BMR : (TCB Offset: 0xc4) TC Block Mode Register -------- +#define AT91C_TCB_TC0XC0S (0x3 << 0) // (TCB) External Clock Signal 0 Selection +#define AT91C_TCB_TC0XC0S_TCLK0 (0x0) // (TCB) TCLK0 connected to XC0 +#define AT91C_TCB_TC0XC0S_NONE (0x1) // (TCB) None signal connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA1 (0x2) // (TCB) TIOA1 connected to XC0 +#define AT91C_TCB_TC0XC0S_TIOA2 (0x3) // (TCB) TIOA2 connected to XC0 +#define AT91C_TCB_TC1XC1S (0x3 << 2) // (TCB) External Clock Signal 1 Selection +#define AT91C_TCB_TC1XC1S_TCLK1 (0x0 << 2) // (TCB) TCLK1 connected to XC1 +#define AT91C_TCB_TC1XC1S_NONE (0x1 << 2) // (TCB) None signal connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA0 (0x2 << 2) // (TCB) TIOA0 connected to XC1 +#define AT91C_TCB_TC1XC1S_TIOA2 (0x3 << 2) // (TCB) TIOA2 connected to XC1 +#define AT91C_TCB_TC2XC2S (0x3 << 4) // (TCB) External Clock Signal 2 Selection +#define AT91C_TCB_TC2XC2S_TCLK2 (0x0 << 4) // (TCB) TCLK2 connected to XC2 +#define AT91C_TCB_TC2XC2S_NONE (0x1 << 4) // (TCB) None signal connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA0 (0x2 << 4) // (TCB) TIOA0 connected to XC2 +#define AT91C_TCB_TC2XC2S_TIOA1 (0x3 << 4) // (TCB) TIOA2 connected to XC2 + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network MailBox Interface +// ***************************************************************************** +// *** Register offset in AT91S_CAN_MB structure *** +#define CAN_MB_MMR ( 0) // MailBox Mode Register +#define CAN_MB_MAM ( 4) // MailBox Acceptance Mask Register +#define CAN_MB_MID ( 8) // MailBox ID Register +#define CAN_MB_MFID (12) // MailBox Family ID Register +#define CAN_MB_MSR (16) // MailBox Status Register +#define CAN_MB_MDL (20) // MailBox Data Low Register +#define CAN_MB_MDH (24) // MailBox Data High Register +#define CAN_MB_MCR (28) // MailBox Control Register +// -------- CAN_MMR : (CAN_MB Offset: 0x0) CAN Message Mode Register -------- +#define AT91C_CAN_MTIMEMARK (0xFFFF << 0) // (CAN_MB) Mailbox Timemark +#define AT91C_CAN_PRIOR (0xF << 16) // (CAN_MB) Mailbox Priority +#define AT91C_CAN_MOT (0x7 << 24) // (CAN_MB) Mailbox Object Type +#define AT91C_CAN_MOT_DIS (0x0 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RX (0x1 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_RXOVERWRITE (0x2 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_TX (0x3 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_CONSUMER (0x4 << 24) // (CAN_MB) +#define AT91C_CAN_MOT_PRODUCER (0x5 << 24) // (CAN_MB) +// -------- CAN_MAM : (CAN_MB Offset: 0x4) CAN Message Acceptance Mask Register -------- +#define AT91C_CAN_MIDvB (0x3FFFF << 0) // (CAN_MB) Complementary bits for identifier in extended mode +#define AT91C_CAN_MIDvA (0x7FF << 18) // (CAN_MB) Identifier for standard frame mode +#define AT91C_CAN_MIDE (0x1 << 29) // (CAN_MB) Identifier Version +// -------- CAN_MID : (CAN_MB Offset: 0x8) CAN Message ID Register -------- +// -------- CAN_MFID : (CAN_MB Offset: 0xc) CAN Message Family ID Register -------- +// -------- CAN_MSR : (CAN_MB Offset: 0x10) CAN Message Status Register -------- +#define AT91C_CAN_MTIMESTAMP (0xFFFF << 0) // (CAN_MB) Timer Value +#define AT91C_CAN_MDLC (0xF << 16) // (CAN_MB) Mailbox Data Length Code +#define AT91C_CAN_MRTR (0x1 << 20) // (CAN_MB) Mailbox Remote Transmission Request +#define AT91C_CAN_MABT (0x1 << 22) // (CAN_MB) Mailbox Message Abort +#define AT91C_CAN_MRDY (0x1 << 23) // (CAN_MB) Mailbox Ready +#define AT91C_CAN_MMI (0x1 << 24) // (CAN_MB) Mailbox Message Ignored +// -------- CAN_MDL : (CAN_MB Offset: 0x14) CAN Message Data Low Register -------- +// -------- CAN_MDH : (CAN_MB Offset: 0x18) CAN Message Data High Register -------- +// -------- CAN_MCR : (CAN_MB Offset: 0x1c) CAN Message Control Register -------- +#define AT91C_CAN_MACR (0x1 << 22) // (CAN_MB) Abort Request for Mailbox +#define AT91C_CAN_MTCR (0x1 << 23) // (CAN_MB) Mailbox Transfer Command + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Control Area Network Interface +// ***************************************************************************** +// *** Register offset in AT91S_CAN structure *** +#define CAN_MR ( 0) // Mode Register +#define CAN_IER ( 4) // Interrupt Enable Register +#define CAN_IDR ( 8) // Interrupt Disable Register +#define CAN_IMR (12) // Interrupt Mask Register +#define CAN_SR (16) // Status Register +#define CAN_BR (20) // Baudrate Register +#define CAN_TIM (24) // Timer Register +#define CAN_TIMESTP (28) // Time Stamp Register +#define CAN_ECR (32) // Error Counter Register +#define CAN_TCR (36) // Transfer Command Register +#define CAN_ACR (40) // Abort Command Register +#define CAN_VR (252) // Version Register +#define CAN_MB0 (512) // CAN Mailbox 0 +#define CAN_MB1 (544) // CAN Mailbox 1 +#define CAN_MB2 (576) // CAN Mailbox 2 +#define CAN_MB3 (608) // CAN Mailbox 3 +#define CAN_MB4 (640) // CAN Mailbox 4 +#define CAN_MB5 (672) // CAN Mailbox 5 +#define CAN_MB6 (704) // CAN Mailbox 6 +#define CAN_MB7 (736) // CAN Mailbox 7 +#define CAN_MB8 (768) // CAN Mailbox 8 +#define CAN_MB9 (800) // CAN Mailbox 9 +#define CAN_MB10 (832) // CAN Mailbox 10 +#define CAN_MB11 (864) // CAN Mailbox 11 +#define CAN_MB12 (896) // CAN Mailbox 12 +#define CAN_MB13 (928) // CAN Mailbox 13 +#define CAN_MB14 (960) // CAN Mailbox 14 +#define CAN_MB15 (992) // CAN Mailbox 15 +// -------- CAN_MR : (CAN Offset: 0x0) CAN Mode Register -------- +#define AT91C_CAN_CANEN (0x1 << 0) // (CAN) CAN Controller Enable +#define AT91C_CAN_LPM (0x1 << 1) // (CAN) Disable/Enable Low Power Mode +#define AT91C_CAN_ABM (0x1 << 2) // (CAN) Disable/Enable Autobaud/Listen Mode +#define AT91C_CAN_OVL (0x1 << 3) // (CAN) Disable/Enable Overload Frame +#define AT91C_CAN_TEOF (0x1 << 4) // (CAN) Time Stamp messages at each end of Frame +#define AT91C_CAN_TTM (0x1 << 5) // (CAN) Disable/Enable Time Trigger Mode +#define AT91C_CAN_TIMFRZ (0x1 << 6) // (CAN) Enable Timer Freeze +#define AT91C_CAN_DRPT (0x1 << 7) // (CAN) Disable Repeat +// -------- CAN_IER : (CAN Offset: 0x4) CAN Interrupt Enable Register -------- +#define AT91C_CAN_MB0 (0x1 << 0) // (CAN) Mailbox 0 Flag +#define AT91C_CAN_MB1 (0x1 << 1) // (CAN) Mailbox 1 Flag +#define AT91C_CAN_MB2 (0x1 << 2) // (CAN) Mailbox 2 Flag +#define AT91C_CAN_MB3 (0x1 << 3) // (CAN) Mailbox 3 Flag +#define AT91C_CAN_MB4 (0x1 << 4) // (CAN) Mailbox 4 Flag +#define AT91C_CAN_MB5 (0x1 << 5) // (CAN) Mailbox 5 Flag +#define AT91C_CAN_MB6 (0x1 << 6) // (CAN) Mailbox 6 Flag +#define AT91C_CAN_MB7 (0x1 << 7) // (CAN) Mailbox 7 Flag +#define AT91C_CAN_MB8 (0x1 << 8) // (CAN) Mailbox 8 Flag +#define AT91C_CAN_MB9 (0x1 << 9) // (CAN) Mailbox 9 Flag +#define AT91C_CAN_MB10 (0x1 << 10) // (CAN) Mailbox 10 Flag +#define AT91C_CAN_MB11 (0x1 << 11) // (CAN) Mailbox 11 Flag +#define AT91C_CAN_MB12 (0x1 << 12) // (CAN) Mailbox 12 Flag +#define AT91C_CAN_MB13 (0x1 << 13) // (CAN) Mailbox 13 Flag +#define AT91C_CAN_MB14 (0x1 << 14) // (CAN) Mailbox 14 Flag +#define AT91C_CAN_MB15 (0x1 << 15) // (CAN) Mailbox 15 Flag +#define AT91C_CAN_ERRA (0x1 << 16) // (CAN) Error Active Mode Flag +#define AT91C_CAN_WARN (0x1 << 17) // (CAN) Warning Limit Flag +#define AT91C_CAN_ERRP (0x1 << 18) // (CAN) Error Passive Mode Flag +#define AT91C_CAN_BOFF (0x1 << 19) // (CAN) Bus Off Mode Flag +#define AT91C_CAN_SLEEP (0x1 << 20) // (CAN) Sleep Flag +#define AT91C_CAN_WAKEUP (0x1 << 21) // (CAN) Wakeup Flag +#define AT91C_CAN_TOVF (0x1 << 22) // (CAN) Timer Overflow Flag +#define AT91C_CAN_TSTP (0x1 << 23) // (CAN) Timestamp Flag +#define AT91C_CAN_CERR (0x1 << 24) // (CAN) CRC Error +#define AT91C_CAN_SERR (0x1 << 25) // (CAN) Stuffing Error +#define AT91C_CAN_AERR (0x1 << 26) // (CAN) Acknowledgment Error +#define AT91C_CAN_FERR (0x1 << 27) // (CAN) Form Error +#define AT91C_CAN_BERR (0x1 << 28) // (CAN) Bit Error +// -------- CAN_IDR : (CAN Offset: 0x8) CAN Interrupt Disable Register -------- +// -------- CAN_IMR : (CAN Offset: 0xc) CAN Interrupt Mask Register -------- +// -------- CAN_SR : (CAN Offset: 0x10) CAN Status Register -------- +#define AT91C_CAN_RBSY (0x1 << 29) // (CAN) Receiver Busy +#define AT91C_CAN_TBSY (0x1 << 30) // (CAN) Transmitter Busy +#define AT91C_CAN_OVLY (0x1 << 31) // (CAN) Overload Busy +// -------- CAN_BR : (CAN Offset: 0x14) CAN Baudrate Register -------- +#define AT91C_CAN_PHASE2 (0x7 << 0) // (CAN) Phase 2 segment +#define AT91C_CAN_PHASE1 (0x7 << 4) // (CAN) Phase 1 segment +#define AT91C_CAN_PROPAG (0x7 << 8) // (CAN) Programmation time segment +#define AT91C_CAN_SYNC (0x3 << 12) // (CAN) Re-synchronization jump width segment +#define AT91C_CAN_BRP (0x7F << 16) // (CAN) Baudrate Prescaler +#define AT91C_CAN_SMP (0x1 << 24) // (CAN) Sampling mode +// -------- CAN_TIM : (CAN Offset: 0x18) CAN Timer Register -------- +#define AT91C_CAN_TIMER (0xFFFF << 0) // (CAN) Timer field +// -------- CAN_TIMESTP : (CAN Offset: 0x1c) CAN Timestamp Register -------- +// -------- CAN_ECR : (CAN Offset: 0x20) CAN Error Counter Register -------- +#define AT91C_CAN_REC (0xFF << 0) // (CAN) Receive Error Counter +#define AT91C_CAN_TEC (0xFF << 16) // (CAN) Transmit Error Counter +// -------- CAN_TCR : (CAN Offset: 0x24) CAN Transfer Command Register -------- +#define AT91C_CAN_TIMRST (0x1 << 31) // (CAN) Timer Reset Field +// -------- CAN_ACR : (CAN Offset: 0x28) CAN Abort Command Register -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Ethernet MAC 10/100 +// ***************************************************************************** +// *** Register offset in AT91S_EMAC structure *** +#define EMAC_NCR ( 0) // Network Control Register +#define EMAC_NCFGR ( 4) // Network Configuration Register +#define EMAC_NSR ( 8) // Network Status Register +#define EMAC_TSR (20) // Transmit Status Register +#define EMAC_RBQP (24) // Receive Buffer Queue Pointer +#define EMAC_TBQP (28) // Transmit Buffer Queue Pointer +#define EMAC_RSR (32) // Receive Status Register +#define EMAC_ISR (36) // Interrupt Status Register +#define EMAC_IER (40) // Interrupt Enable Register +#define EMAC_IDR (44) // Interrupt Disable Register +#define EMAC_IMR (48) // Interrupt Mask Register +#define EMAC_MAN (52) // PHY Maintenance Register +#define EMAC_PTR (56) // Pause Time Register +#define EMAC_PFR (60) // Pause Frames received Register +#define EMAC_FTO (64) // Frames Transmitted OK Register +#define EMAC_SCF (68) // Single Collision Frame Register +#define EMAC_MCF (72) // Multiple Collision Frame Register +#define EMAC_FRO (76) // Frames Received OK Register +#define EMAC_FCSE (80) // Frame Check Sequence Error Register +#define EMAC_ALE (84) // Alignment Error Register +#define EMAC_DTF (88) // Deferred Transmission Frame Register +#define EMAC_LCOL (92) // Late Collision Register +#define EMAC_ECOL (96) // Excessive Collision Register +#define EMAC_TUND (100) // Transmit Underrun Error Register +#define EMAC_CSE (104) // Carrier Sense Error Register +#define EMAC_RRE (108) // Receive Ressource Error Register +#define EMAC_ROV (112) // Receive Overrun Errors Register +#define EMAC_RSE (116) // Receive Symbol Errors Register +#define EMAC_ELE (120) // Excessive Length Errors Register +#define EMAC_RJA (124) // Receive Jabbers Register +#define EMAC_USF (128) // Undersize Frames Register +#define EMAC_STE (132) // SQE Test Error Register +#define EMAC_RLE (136) // Receive Length Field Mismatch Register +#define EMAC_TPF (140) // Transmitted Pause Frames Register +#define EMAC_HRB (144) // Hash Address Bottom[31:0] +#define EMAC_HRT (148) // Hash Address Top[63:32] +#define EMAC_SA1L (152) // Specific Address 1 Bottom, First 4 bytes +#define EMAC_SA1H (156) // Specific Address 1 Top, Last 2 bytes +#define EMAC_SA2L (160) // Specific Address 2 Bottom, First 4 bytes +#define EMAC_SA2H (164) // Specific Address 2 Top, Last 2 bytes +#define EMAC_SA3L (168) // Specific Address 3 Bottom, First 4 bytes +#define EMAC_SA3H (172) // Specific Address 3 Top, Last 2 bytes +#define EMAC_SA4L (176) // Specific Address 4 Bottom, First 4 bytes +#define EMAC_SA4H (180) // Specific Address 4 Top, Last 2 bytes +#define EMAC_TID (184) // Type ID Checking Register +#define EMAC_TPQ (188) // Transmit Pause Quantum Register +#define EMAC_USRIO (192) // USER Input/Output Register +#define EMAC_WOL (196) // Wake On LAN Register +#define EMAC_REV (252) // Revision Register +// -------- EMAC_NCR : (EMAC Offset: 0x0) -------- +#define AT91C_EMAC_LB (0x1 << 0) // (EMAC) Loopback. Optional. When set, loopback signal is at high level. +#define AT91C_EMAC_LLB (0x1 << 1) // (EMAC) Loopback local. +#define AT91C_EMAC_RE (0x1 << 2) // (EMAC) Receive enable. +#define AT91C_EMAC_TE (0x1 << 3) // (EMAC) Transmit enable. +#define AT91C_EMAC_MPE (0x1 << 4) // (EMAC) Management port enable. +#define AT91C_EMAC_CLRSTAT (0x1 << 5) // (EMAC) Clear statistics registers. +#define AT91C_EMAC_INCSTAT (0x1 << 6) // (EMAC) Increment statistics registers. +#define AT91C_EMAC_WESTAT (0x1 << 7) // (EMAC) Write enable for statistics registers. +#define AT91C_EMAC_BP (0x1 << 8) // (EMAC) Back pressure. +#define AT91C_EMAC_TSTART (0x1 << 9) // (EMAC) Start Transmission. +#define AT91C_EMAC_THALT (0x1 << 10) // (EMAC) Transmission Halt. +#define AT91C_EMAC_TPFR (0x1 << 11) // (EMAC) Transmit pause frame +#define AT91C_EMAC_TZQ (0x1 << 12) // (EMAC) Transmit zero quantum pause frame +// -------- EMAC_NCFGR : (EMAC Offset: 0x4) Network Configuration Register -------- +#define AT91C_EMAC_SPD (0x1 << 0) // (EMAC) Speed. +#define AT91C_EMAC_FD (0x1 << 1) // (EMAC) Full duplex. +#define AT91C_EMAC_JFRAME (0x1 << 3) // (EMAC) Jumbo Frames. +#define AT91C_EMAC_CAF (0x1 << 4) // (EMAC) Copy all frames. +#define AT91C_EMAC_NBC (0x1 << 5) // (EMAC) No broadcast. +#define AT91C_EMAC_MTI (0x1 << 6) // (EMAC) Multicast hash event enable +#define AT91C_EMAC_UNI (0x1 << 7) // (EMAC) Unicast hash enable. +#define AT91C_EMAC_BIG (0x1 << 8) // (EMAC) Receive 1522 bytes. +#define AT91C_EMAC_EAE (0x1 << 9) // (EMAC) External address match enable. +#define AT91C_EMAC_CLK (0x3 << 10) // (EMAC) +#define AT91C_EMAC_CLK_HCLK_8 (0x0 << 10) // (EMAC) HCLK divided by 8 +#define AT91C_EMAC_CLK_HCLK_16 (0x1 << 10) // (EMAC) HCLK divided by 16 +#define AT91C_EMAC_CLK_HCLK_32 (0x2 << 10) // (EMAC) HCLK divided by 32 +#define AT91C_EMAC_CLK_HCLK_64 (0x3 << 10) // (EMAC) HCLK divided by 64 +#define AT91C_EMAC_RTY (0x1 << 12) // (EMAC) +#define AT91C_EMAC_PAE (0x1 << 13) // (EMAC) +#define AT91C_EMAC_RBOF (0x3 << 14) // (EMAC) +#define AT91C_EMAC_RBOF_OFFSET_0 (0x0 << 14) // (EMAC) no offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_1 (0x1 << 14) // (EMAC) one byte offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_2 (0x2 << 14) // (EMAC) two bytes offset from start of receive buffer +#define AT91C_EMAC_RBOF_OFFSET_3 (0x3 << 14) // (EMAC) three bytes offset from start of receive buffer +#define AT91C_EMAC_RLCE (0x1 << 16) // (EMAC) Receive Length field Checking Enable +#define AT91C_EMAC_DRFCS (0x1 << 17) // (EMAC) Discard Receive FCS +#define AT91C_EMAC_EFRHD (0x1 << 18) // (EMAC) +#define AT91C_EMAC_IRXFCS (0x1 << 19) // (EMAC) Ignore RX FCS +// -------- EMAC_NSR : (EMAC Offset: 0x8) Network Status Register -------- +#define AT91C_EMAC_LINKR (0x1 << 0) // (EMAC) +#define AT91C_EMAC_MDIO (0x1 << 1) // (EMAC) +#define AT91C_EMAC_IDLE (0x1 << 2) // (EMAC) +// -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Status Register -------- +#define AT91C_EMAC_UBR (0x1 << 0) // (EMAC) +#define AT91C_EMAC_COL (0x1 << 1) // (EMAC) +#define AT91C_EMAC_RLES (0x1 << 2) // (EMAC) +#define AT91C_EMAC_TGO (0x1 << 3) // (EMAC) Transmit Go +#define AT91C_EMAC_BEX (0x1 << 4) // (EMAC) Buffers exhausted mid frame +#define AT91C_EMAC_COMP (0x1 << 5) // (EMAC) +#define AT91C_EMAC_UND (0x1 << 6) // (EMAC) +// -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- +#define AT91C_EMAC_BNA (0x1 << 0) // (EMAC) +#define AT91C_EMAC_REC (0x1 << 1) // (EMAC) +#define AT91C_EMAC_OVR (0x1 << 2) // (EMAC) +// -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- +#define AT91C_EMAC_MFD (0x1 << 0) // (EMAC) +#define AT91C_EMAC_RCOMP (0x1 << 1) // (EMAC) +#define AT91C_EMAC_RXUBR (0x1 << 2) // (EMAC) +#define AT91C_EMAC_TXUBR (0x1 << 3) // (EMAC) +#define AT91C_EMAC_TUNDR (0x1 << 4) // (EMAC) +#define AT91C_EMAC_RLEX (0x1 << 5) // (EMAC) +#define AT91C_EMAC_TXERR (0x1 << 6) // (EMAC) +#define AT91C_EMAC_TCOMP (0x1 << 7) // (EMAC) +#define AT91C_EMAC_LINK (0x1 << 9) // (EMAC) +#define AT91C_EMAC_ROVR (0x1 << 10) // (EMAC) +#define AT91C_EMAC_HRESP (0x1 << 11) // (EMAC) +#define AT91C_EMAC_PFRE (0x1 << 12) // (EMAC) +#define AT91C_EMAC_PTZ (0x1 << 13) // (EMAC) +// -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- +// -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- +// -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- +// -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- +#define AT91C_EMAC_DATA (0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_CODE (0x3 << 16) // (EMAC) +#define AT91C_EMAC_REGA (0x1F << 18) // (EMAC) +#define AT91C_EMAC_PHYA (0x1F << 23) // (EMAC) +#define AT91C_EMAC_RW (0x3 << 28) // (EMAC) +#define AT91C_EMAC_SOF (0x3 << 30) // (EMAC) +// -------- EMAC_USRIO : (EMAC Offset: 0xc0) USER Input Output Register -------- +#define AT91C_EMAC_RMII (0x1 << 0) // (EMAC) Reduce MII +// -------- EMAC_WOL : (EMAC Offset: 0xc4) Wake On LAN Register -------- +#define AT91C_EMAC_IP (0xFFFF << 0) // (EMAC) ARP request IP address +#define AT91C_EMAC_MAG (0x1 << 16) // (EMAC) Magic packet event enable +#define AT91C_EMAC_ARP (0x1 << 17) // (EMAC) ARP request event enable +#define AT91C_EMAC_SA1 (0x1 << 18) // (EMAC) Specific address register 1 event enable +// -------- EMAC_REV : (EMAC Offset: 0xfc) Revision Register -------- +#define AT91C_EMAC_REVREF (0xFFFF << 0) // (EMAC) +#define AT91C_EMAC_PARTREF (0xFFFF << 16) // (EMAC) + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Analog to Digital Convertor +// ***************************************************************************** +// *** Register offset in AT91S_ADC structure *** +#define ADC_CR ( 0) // ADC Control Register +#define ADC_MR ( 4) // ADC Mode Register +#define ADC_CHER (16) // ADC Channel Enable Register +#define ADC_CHDR (20) // ADC Channel Disable Register +#define ADC_CHSR (24) // ADC Channel Status Register +#define ADC_SR (28) // ADC Status Register +#define ADC_LCDR (32) // ADC Last Converted Data Register +#define ADC_IER (36) // ADC Interrupt Enable Register +#define ADC_IDR (40) // ADC Interrupt Disable Register +#define ADC_IMR (44) // ADC Interrupt Mask Register +#define ADC_CDR0 (48) // ADC Channel Data Register 0 +#define ADC_CDR1 (52) // ADC Channel Data Register 1 +#define ADC_CDR2 (56) // ADC Channel Data Register 2 +#define ADC_CDR3 (60) // ADC Channel Data Register 3 +#define ADC_CDR4 (64) // ADC Channel Data Register 4 +#define ADC_CDR5 (68) // ADC Channel Data Register 5 +#define ADC_CDR6 (72) // ADC Channel Data Register 6 +#define ADC_CDR7 (76) // ADC Channel Data Register 7 +#define ADC_RPR (256) // Receive Pointer Register +#define ADC_RCR (260) // Receive Counter Register +#define ADC_TPR (264) // Transmit Pointer Register +#define ADC_TCR (268) // Transmit Counter Register +#define ADC_RNPR (272) // Receive Next Pointer Register +#define ADC_RNCR (276) // Receive Next Counter Register +#define ADC_TNPR (280) // Transmit Next Pointer Register +#define ADC_TNCR (284) // Transmit Next Counter Register +#define ADC_PTCR (288) // PDC Transfer Control Register +#define ADC_PTSR (292) // PDC Transfer Status Register +// -------- ADC_CR : (ADC Offset: 0x0) ADC Control Register -------- +#define AT91C_ADC_SWRST (0x1 << 0) // (ADC) Software Reset +#define AT91C_ADC_START (0x1 << 1) // (ADC) Start Conversion +// -------- ADC_MR : (ADC Offset: 0x4) ADC Mode Register -------- +#define AT91C_ADC_TRGEN (0x1 << 0) // (ADC) Trigger Enable +#define AT91C_ADC_TRGEN_DIS (0x0) // (ADC) Hradware triggers are disabled. Starting a conversion is only possible by software +#define AT91C_ADC_TRGEN_EN (0x1) // (ADC) Hardware trigger selected by TRGSEL field is enabled. +#define AT91C_ADC_TRGSEL (0x7 << 1) // (ADC) Trigger Selection +#define AT91C_ADC_TRGSEL_TIOA0 (0x0 << 1) // (ADC) Selected TRGSEL = TIAO0 +#define AT91C_ADC_TRGSEL_TIOA1 (0x1 << 1) // (ADC) Selected TRGSEL = TIAO1 +#define AT91C_ADC_TRGSEL_TIOA2 (0x2 << 1) // (ADC) Selected TRGSEL = TIAO2 +#define AT91C_ADC_TRGSEL_TIOA3 (0x3 << 1) // (ADC) Selected TRGSEL = TIAO3 +#define AT91C_ADC_TRGSEL_TIOA4 (0x4 << 1) // (ADC) Selected TRGSEL = TIAO4 +#define AT91C_ADC_TRGSEL_TIOA5 (0x5 << 1) // (ADC) Selected TRGSEL = TIAO5 +#define AT91C_ADC_TRGSEL_EXT (0x6 << 1) // (ADC) Selected TRGSEL = External Trigger +#define AT91C_ADC_LOWRES (0x1 << 4) // (ADC) Resolution. +#define AT91C_ADC_LOWRES_10_BIT (0x0 << 4) // (ADC) 10-bit resolution +#define AT91C_ADC_LOWRES_8_BIT (0x1 << 4) // (ADC) 8-bit resolution +#define AT91C_ADC_SLEEP (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_SLEEP_NORMAL_MODE (0x0 << 5) // (ADC) Normal Mode +#define AT91C_ADC_SLEEP_MODE (0x1 << 5) // (ADC) Sleep Mode +#define AT91C_ADC_PRESCAL (0x3F << 8) // (ADC) Prescaler rate selection +#define AT91C_ADC_STARTUP (0x1F << 16) // (ADC) Startup Time +#define AT91C_ADC_SHTIM (0xF << 24) // (ADC) Sample & Hold Time +// -------- ADC_CHER : (ADC Offset: 0x10) ADC Channel Enable Register -------- +#define AT91C_ADC_CH0 (0x1 << 0) // (ADC) Channel 0 +#define AT91C_ADC_CH1 (0x1 << 1) // (ADC) Channel 1 +#define AT91C_ADC_CH2 (0x1 << 2) // (ADC) Channel 2 +#define AT91C_ADC_CH3 (0x1 << 3) // (ADC) Channel 3 +#define AT91C_ADC_CH4 (0x1 << 4) // (ADC) Channel 4 +#define AT91C_ADC_CH5 (0x1 << 5) // (ADC) Channel 5 +#define AT91C_ADC_CH6 (0x1 << 6) // (ADC) Channel 6 +#define AT91C_ADC_CH7 (0x1 << 7) // (ADC) Channel 7 +// -------- ADC_CHDR : (ADC Offset: 0x14) ADC Channel Disable Register -------- +// -------- ADC_CHSR : (ADC Offset: 0x18) ADC Channel Status Register -------- +// -------- ADC_SR : (ADC Offset: 0x1c) ADC Status Register -------- +#define AT91C_ADC_EOC0 (0x1 << 0) // (ADC) End of Conversion +#define AT91C_ADC_EOC1 (0x1 << 1) // (ADC) End of Conversion +#define AT91C_ADC_EOC2 (0x1 << 2) // (ADC) End of Conversion +#define AT91C_ADC_EOC3 (0x1 << 3) // (ADC) End of Conversion +#define AT91C_ADC_EOC4 (0x1 << 4) // (ADC) End of Conversion +#define AT91C_ADC_EOC5 (0x1 << 5) // (ADC) End of Conversion +#define AT91C_ADC_EOC6 (0x1 << 6) // (ADC) End of Conversion +#define AT91C_ADC_EOC7 (0x1 << 7) // (ADC) End of Conversion +#define AT91C_ADC_OVRE0 (0x1 << 8) // (ADC) Overrun Error +#define AT91C_ADC_OVRE1 (0x1 << 9) // (ADC) Overrun Error +#define AT91C_ADC_OVRE2 (0x1 << 10) // (ADC) Overrun Error +#define AT91C_ADC_OVRE3 (0x1 << 11) // (ADC) Overrun Error +#define AT91C_ADC_OVRE4 (0x1 << 12) // (ADC) Overrun Error +#define AT91C_ADC_OVRE5 (0x1 << 13) // (ADC) Overrun Error +#define AT91C_ADC_OVRE6 (0x1 << 14) // (ADC) Overrun Error +#define AT91C_ADC_OVRE7 (0x1 << 15) // (ADC) Overrun Error +#define AT91C_ADC_DRDY (0x1 << 16) // (ADC) Data Ready +#define AT91C_ADC_GOVRE (0x1 << 17) // (ADC) General Overrun +#define AT91C_ADC_ENDRX (0x1 << 18) // (ADC) End of Receiver Transfer +#define AT91C_ADC_RXBUFF (0x1 << 19) // (ADC) RXBUFF Interrupt +// -------- ADC_LCDR : (ADC Offset: 0x20) ADC Last Converted Data Register -------- +#define AT91C_ADC_LDATA (0x3FF << 0) // (ADC) Last Data Converted +// -------- ADC_IER : (ADC Offset: 0x24) ADC Interrupt Enable Register -------- +// -------- ADC_IDR : (ADC Offset: 0x28) ADC Interrupt Disable Register -------- +// -------- ADC_IMR : (ADC Offset: 0x2c) ADC Interrupt Mask Register -------- +// -------- ADC_CDR0 : (ADC Offset: 0x30) ADC Channel Data Register 0 -------- +#define AT91C_ADC_DATA (0x3FF << 0) // (ADC) Converted Data +// -------- ADC_CDR1 : (ADC Offset: 0x34) ADC Channel Data Register 1 -------- +// -------- ADC_CDR2 : (ADC Offset: 0x38) ADC Channel Data Register 2 -------- +// -------- ADC_CDR3 : (ADC Offset: 0x3c) ADC Channel Data Register 3 -------- +// -------- ADC_CDR4 : (ADC Offset: 0x40) ADC Channel Data Register 4 -------- +// -------- ADC_CDR5 : (ADC Offset: 0x44) ADC Channel Data Register 5 -------- +// -------- ADC_CDR6 : (ADC Offset: 0x48) ADC Channel Data Register 6 -------- +// -------- ADC_CDR7 : (ADC Offset: 0x4c) ADC Channel Data Register 7 -------- + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Advanced Encryption Standard +// ***************************************************************************** +// *** Register offset in AT91S_AES structure *** +#define AES_CR ( 0) // Control Register +#define AES_MR ( 4) // Mode Register +#define AES_IER (16) // Interrupt Enable Register +#define AES_IDR (20) // Interrupt Disable Register +#define AES_IMR (24) // Interrupt Mask Register +#define AES_ISR (28) // Interrupt Status Register +#define AES_KEYWxR (32) // Key Word x Register +#define AES_IDATAxR (64) // Input Data x Register +#define AES_ODATAxR (80) // Output Data x Register +#define AES_IVxR (96) // Initialization Vector x Register +#define AES_VR (252) // AES Version Register +#define AES_RPR (256) // Receive Pointer Register +#define AES_RCR (260) // Receive Counter Register +#define AES_TPR (264) // Transmit Pointer Register +#define AES_TCR (268) // Transmit Counter Register +#define AES_RNPR (272) // Receive Next Pointer Register +#define AES_RNCR (276) // Receive Next Counter Register +#define AES_TNPR (280) // Transmit Next Pointer Register +#define AES_TNCR (284) // Transmit Next Counter Register +#define AES_PTCR (288) // PDC Transfer Control Register +#define AES_PTSR (292) // PDC Transfer Status Register +// -------- AES_CR : (AES Offset: 0x0) Control Register -------- +#define AT91C_AES_START (0x1 << 0) // (AES) Starts Processing +#define AT91C_AES_SWRST (0x1 << 8) // (AES) Software Reset +#define AT91C_AES_LOADSEED (0x1 << 16) // (AES) Random Number Generator Seed Loading +// -------- AES_MR : (AES Offset: 0x4) Mode Register -------- +#define AT91C_AES_CIPHER (0x1 << 0) // (AES) Processing Mode +#define AT91C_AES_PROCDLY (0xF << 4) // (AES) Processing Delay +#define AT91C_AES_SMOD (0x3 << 8) // (AES) Start Mode +#define AT91C_AES_SMOD_MANUAL (0x0 << 8) // (AES) Manual Mode: The START bit in register AES_CR must be set to begin encryption or decryption. +#define AT91C_AES_SMOD_AUTO (0x1 << 8) // (AES) Auto Mode: no action in AES_CR is necessary (cf datasheet). +#define AT91C_AES_SMOD_PDC (0x2 << 8) // (AES) PDC Mode (cf datasheet). +#define AT91C_AES_OPMOD (0x7 << 12) // (AES) Operation Mode +#define AT91C_AES_OPMOD_ECB (0x0 << 12) // (AES) ECB Electronic CodeBook mode. +#define AT91C_AES_OPMOD_CBC (0x1 << 12) // (AES) CBC Cipher Block Chaining mode. +#define AT91C_AES_OPMOD_OFB (0x2 << 12) // (AES) OFB Output Feedback mode. +#define AT91C_AES_OPMOD_CFB (0x3 << 12) // (AES) CFB Cipher Feedback mode. +#define AT91C_AES_OPMOD_CTR (0x4 << 12) // (AES) CTR Counter mode. +#define AT91C_AES_LOD (0x1 << 15) // (AES) Last Output Data Mode +#define AT91C_AES_CFBS (0x7 << 16) // (AES) Cipher Feedback Data Size +#define AT91C_AES_CFBS_128_BIT (0x0 << 16) // (AES) 128-bit. +#define AT91C_AES_CFBS_64_BIT (0x1 << 16) // (AES) 64-bit. +#define AT91C_AES_CFBS_32_BIT (0x2 << 16) // (AES) 32-bit. +#define AT91C_AES_CFBS_16_BIT (0x3 << 16) // (AES) 16-bit. +#define AT91C_AES_CFBS_8_BIT (0x4 << 16) // (AES) 8-bit. +#define AT91C_AES_CKEY (0xF << 20) // (AES) Countermeasure Key +#define AT91C_AES_CTYPE (0x1F << 24) // (AES) Countermeasure Type +#define AT91C_AES_CTYPE_TYPE1_EN (0x1 << 24) // (AES) Countermeasure type 1 is enabled. +#define AT91C_AES_CTYPE_TYPE2_EN (0x2 << 24) // (AES) Countermeasure type 2 is enabled. +#define AT91C_AES_CTYPE_TYPE3_EN (0x4 << 24) // (AES) Countermeasure type 3 is enabled. +#define AT91C_AES_CTYPE_TYPE4_EN (0x8 << 24) // (AES) Countermeasure type 4 is enabled. +#define AT91C_AES_CTYPE_TYPE5_EN (0x10 << 24) // (AES) Countermeasure type 5 is enabled. +// -------- AES_IER : (AES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_AES_DATRDY (0x1 << 0) // (AES) DATRDY +#define AT91C_AES_ENDRX (0x1 << 1) // (AES) PDC Read Buffer End +#define AT91C_AES_ENDTX (0x1 << 2) // (AES) PDC Write Buffer End +#define AT91C_AES_RXBUFF (0x1 << 3) // (AES) PDC Read Buffer Full +#define AT91C_AES_TXBUFE (0x1 << 4) // (AES) PDC Write Buffer Empty +#define AT91C_AES_URAD (0x1 << 8) // (AES) Unspecified Register Access Detection +// -------- AES_IDR : (AES Offset: 0x14) Interrupt Disable Register -------- +// -------- AES_IMR : (AES Offset: 0x18) Interrupt Mask Register -------- +// -------- AES_ISR : (AES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_AES_URAT (0x7 << 12) // (AES) Unspecified Register Access Type Status +#define AT91C_AES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (AES) Input data register written during the data processing in PDC mode. +#define AT91C_AES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (AES) Output data register read during the data processing. +#define AT91C_AES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (AES) Mode register written during the data processing. +#define AT91C_AES_URAT_OUT_DAT_READ_SUBKEY (0x3 << 12) // (AES) Output data register read during the sub-keys generation. +#define AT91C_AES_URAT_MODEREG_WRITE_SUBKEY (0x4 << 12) // (AES) Mode register written during the sub-keys generation. +#define AT91C_AES_URAT_WO_REG_READ (0x5 << 12) // (AES) Write-only register read access. + +// ***************************************************************************** +// SOFTWARE API DEFINITION FOR Triple Data Encryption Standard +// ***************************************************************************** +// *** Register offset in AT91S_TDES structure *** +#define TDES_CR ( 0) // Control Register +#define TDES_MR ( 4) // Mode Register +#define TDES_IER (16) // Interrupt Enable Register +#define TDES_IDR (20) // Interrupt Disable Register +#define TDES_IMR (24) // Interrupt Mask Register +#define TDES_ISR (28) // Interrupt Status Register +#define TDES_KEY1WxR (32) // Key 1 Word x Register +#define TDES_KEY2WxR (40) // Key 2 Word x Register +#define TDES_KEY3WxR (48) // Key 3 Word x Register +#define TDES_IDATAxR (64) // Input Data x Register +#define TDES_ODATAxR (80) // Output Data x Register +#define TDES_IVxR (96) // Initialization Vector x Register +#define TDES_VR (252) // TDES Version Register +#define TDES_RPR (256) // Receive Pointer Register +#define TDES_RCR (260) // Receive Counter Register +#define TDES_TPR (264) // Transmit Pointer Register +#define TDES_TCR (268) // Transmit Counter Register +#define TDES_RNPR (272) // Receive Next Pointer Register +#define TDES_RNCR (276) // Receive Next Counter Register +#define TDES_TNPR (280) // Transmit Next Pointer Register +#define TDES_TNCR (284) // Transmit Next Counter Register +#define TDES_PTCR (288) // PDC Transfer Control Register +#define TDES_PTSR (292) // PDC Transfer Status Register +// -------- TDES_CR : (TDES Offset: 0x0) Control Register -------- +#define AT91C_TDES_START (0x1 << 0) // (TDES) Starts Processing +#define AT91C_TDES_SWRST (0x1 << 8) // (TDES) Software Reset +// -------- TDES_MR : (TDES Offset: 0x4) Mode Register -------- +#define AT91C_TDES_CIPHER (0x1 << 0) // (TDES) Processing Mode +#define AT91C_TDES_TDESMOD (0x1 << 1) // (TDES) Single or Triple DES Mode +#define AT91C_TDES_KEYMOD (0x1 << 4) // (TDES) Key Mode +#define AT91C_TDES_SMOD (0x3 << 8) // (TDES) Start Mode +#define AT91C_TDES_SMOD_MANUAL (0x0 << 8) // (TDES) Manual Mode: The START bit in register TDES_CR must be set to begin encryption or decryption. +#define AT91C_TDES_SMOD_AUTO (0x1 << 8) // (TDES) Auto Mode: no action in TDES_CR is necessary (cf datasheet). +#define AT91C_TDES_SMOD_PDC (0x2 << 8) // (TDES) PDC Mode (cf datasheet). +#define AT91C_TDES_OPMOD (0x3 << 12) // (TDES) Operation Mode +#define AT91C_TDES_OPMOD_ECB (0x0 << 12) // (TDES) ECB Electronic CodeBook mode. +#define AT91C_TDES_OPMOD_CBC (0x1 << 12) // (TDES) CBC Cipher Block Chaining mode. +#define AT91C_TDES_OPMOD_OFB (0x2 << 12) // (TDES) OFB Output Feedback mode. +#define AT91C_TDES_OPMOD_CFB (0x3 << 12) // (TDES) CFB Cipher Feedback mode. +#define AT91C_TDES_LOD (0x1 << 15) // (TDES) Last Output Data Mode +#define AT91C_TDES_CFBS (0x3 << 16) // (TDES) Cipher Feedback Data Size +#define AT91C_TDES_CFBS_64_BIT (0x0 << 16) // (TDES) 64-bit. +#define AT91C_TDES_CFBS_32_BIT (0x1 << 16) // (TDES) 32-bit. +#define AT91C_TDES_CFBS_16_BIT (0x2 << 16) // (TDES) 16-bit. +#define AT91C_TDES_CFBS_8_BIT (0x3 << 16) // (TDES) 8-bit. +// -------- TDES_IER : (TDES Offset: 0x10) Interrupt Enable Register -------- +#define AT91C_TDES_DATRDY (0x1 << 0) // (TDES) DATRDY +#define AT91C_TDES_ENDRX (0x1 << 1) // (TDES) PDC Read Buffer End +#define AT91C_TDES_ENDTX (0x1 << 2) // (TDES) PDC Write Buffer End +#define AT91C_TDES_RXBUFF (0x1 << 3) // (TDES) PDC Read Buffer Full +#define AT91C_TDES_TXBUFE (0x1 << 4) // (TDES) PDC Write Buffer Empty +#define AT91C_TDES_URAD (0x1 << 8) // (TDES) Unspecified Register Access Detection +// -------- TDES_IDR : (TDES Offset: 0x14) Interrupt Disable Register -------- +// -------- TDES_IMR : (TDES Offset: 0x18) Interrupt Mask Register -------- +// -------- TDES_ISR : (TDES Offset: 0x1c) Interrupt Status Register -------- +#define AT91C_TDES_URAT (0x3 << 12) // (TDES) Unspecified Register Access Type Status +#define AT91C_TDES_URAT_IN_DAT_WRITE_DATPROC (0x0 << 12) // (TDES) Input data register written during the data processing in PDC mode. +#define AT91C_TDES_URAT_OUT_DAT_READ_DATPROC (0x1 << 12) // (TDES) Output data register read during the data processing. +#define AT91C_TDES_URAT_MODEREG_WRITE_DATPROC (0x2 << 12) // (TDES) Mode register written during the data processing. +#define AT91C_TDES_URAT_WO_REG_READ (0x3 << 12) // (TDES) Write-only register read access. + +// ***************************************************************************** +// REGISTER ADDRESS DEFINITION FOR AT91SAM7X256 +// ***************************************************************************** +// ========== Register definition for SYS peripheral ========== +// ========== Register definition for AIC peripheral ========== +#define AT91C_AIC_IVR (0xFFFFF100) // (AIC) IRQ Vector Register +#define AT91C_AIC_SMR (0xFFFFF000) // (AIC) Source Mode Register +#define AT91C_AIC_FVR (0xFFFFF104) // (AIC) FIQ Vector Register +#define AT91C_AIC_DCR (0xFFFFF138) // (AIC) Debug Control Register (Protect) +#define AT91C_AIC_EOICR (0xFFFFF130) // (AIC) End of Interrupt Command Register +#define AT91C_AIC_SVR (0xFFFFF080) // (AIC) Source Vector Register +#define AT91C_AIC_FFSR (0xFFFFF148) // (AIC) Fast Forcing Status Register +#define AT91C_AIC_ICCR (0xFFFFF128) // (AIC) Interrupt Clear Command Register +#define AT91C_AIC_ISR (0xFFFFF108) // (AIC) Interrupt Status Register +#define AT91C_AIC_IMR (0xFFFFF110) // (AIC) Interrupt Mask Register +#define AT91C_AIC_IPR (0xFFFFF10C) // (AIC) Interrupt Pending Register +#define AT91C_AIC_FFER (0xFFFFF140) // (AIC) Fast Forcing Enable Register +#define AT91C_AIC_IECR (0xFFFFF120) // (AIC) Interrupt Enable Command Register +#define AT91C_AIC_ISCR (0xFFFFF12C) // (AIC) Interrupt Set Command Register +#define AT91C_AIC_FFDR (0xFFFFF144) // (AIC) Fast Forcing Disable Register +#define AT91C_AIC_CISR (0xFFFFF114) // (AIC) Core Interrupt Status Register +#define AT91C_AIC_IDCR (0xFFFFF124) // (AIC) Interrupt Disable Command Register +#define AT91C_AIC_SPU (0xFFFFF134) // (AIC) Spurious Vector Register +// ========== Register definition for PDC_DBGU peripheral ========== +#define AT91C_DBGU_TCR (0xFFFFF30C) // (PDC_DBGU) Transmit Counter Register +#define AT91C_DBGU_RNPR (0xFFFFF310) // (PDC_DBGU) Receive Next Pointer Register +#define AT91C_DBGU_TNPR (0xFFFFF318) // (PDC_DBGU) Transmit Next Pointer Register +#define AT91C_DBGU_TPR (0xFFFFF308) // (PDC_DBGU) Transmit Pointer Register +#define AT91C_DBGU_RPR (0xFFFFF300) // (PDC_DBGU) Receive Pointer Register +#define AT91C_DBGU_RCR (0xFFFFF304) // (PDC_DBGU) Receive Counter Register +#define AT91C_DBGU_RNCR (0xFFFFF314) // (PDC_DBGU) Receive Next Counter Register +#define AT91C_DBGU_PTCR (0xFFFFF320) // (PDC_DBGU) PDC Transfer Control Register +#define AT91C_DBGU_PTSR (0xFFFFF324) // (PDC_DBGU) PDC Transfer Status Register +#define AT91C_DBGU_TNCR (0xFFFFF31C) // (PDC_DBGU) Transmit Next Counter Register +// ========== Register definition for DBGU peripheral ========== +#define AT91C_DBGU_EXID (0xFFFFF244) // (DBGU) Chip ID Extension Register +#define AT91C_DBGU_BRGR (0xFFFFF220) // (DBGU) Baud Rate Generator Register +#define AT91C_DBGU_IDR (0xFFFFF20C) // (DBGU) Interrupt Disable Register +#define AT91C_DBGU_CSR (0xFFFFF214) // (DBGU) Channel Status Register +#define AT91C_DBGU_CIDR (0xFFFFF240) // (DBGU) Chip ID Register +#define AT91C_DBGU_MR (0xFFFFF204) // (DBGU) Mode Register +#define AT91C_DBGU_IMR (0xFFFFF210) // (DBGU) Interrupt Mask Register +#define AT91C_DBGU_CR (0xFFFFF200) // (DBGU) Control Register +#define AT91C_DBGU_FNTR (0xFFFFF248) // (DBGU) Force NTRST Register +#define AT91C_DBGU_THR (0xFFFFF21C) // (DBGU) Transmitter Holding Register +#define AT91C_DBGU_RHR (0xFFFFF218) // (DBGU) Receiver Holding Register +#define AT91C_DBGU_IER (0xFFFFF208) // (DBGU) Interrupt Enable Register +// ========== Register definition for PIOA peripheral ========== +#define AT91C_PIOA_ODR (0xFFFFF414) // (PIOA) Output Disable Registerr +#define AT91C_PIOA_SODR (0xFFFFF430) // (PIOA) Set Output Data Register +#define AT91C_PIOA_ISR (0xFFFFF44C) // (PIOA) Interrupt Status Register +#define AT91C_PIOA_ABSR (0xFFFFF478) // (PIOA) AB Select Status Register +#define AT91C_PIOA_IER (0xFFFFF440) // (PIOA) Interrupt Enable Register +#define AT91C_PIOA_PPUDR (0xFFFFF460) // (PIOA) Pull-up Disable Register +#define AT91C_PIOA_IMR (0xFFFFF448) // (PIOA) Interrupt Mask Register +#define AT91C_PIOA_PER (0xFFFFF400) // (PIOA) PIO Enable Register +#define AT91C_PIOA_IFDR (0xFFFFF424) // (PIOA) Input Filter Disable Register +#define AT91C_PIOA_OWDR (0xFFFFF4A4) // (PIOA) Output Write Disable Register +#define AT91C_PIOA_MDSR (0xFFFFF458) // (PIOA) Multi-driver Status Register +#define AT91C_PIOA_IDR (0xFFFFF444) // (PIOA) Interrupt Disable Register +#define AT91C_PIOA_ODSR (0xFFFFF438) // (PIOA) Output Data Status Register +#define AT91C_PIOA_PPUSR (0xFFFFF468) // (PIOA) Pull-up Status Register +#define AT91C_PIOA_OWSR (0xFFFFF4A8) // (PIOA) Output Write Status Register +#define AT91C_PIOA_BSR (0xFFFFF474) // (PIOA) Select B Register +#define AT91C_PIOA_OWER (0xFFFFF4A0) // (PIOA) Output Write Enable Register +#define AT91C_PIOA_IFER (0xFFFFF420) // (PIOA) Input Filter Enable Register +#define AT91C_PIOA_PDSR (0xFFFFF43C) // (PIOA) Pin Data Status Register +#define AT91C_PIOA_PPUER (0xFFFFF464) // (PIOA) Pull-up Enable Register +#define AT91C_PIOA_OSR (0xFFFFF418) // (PIOA) Output Status Register +#define AT91C_PIOA_ASR (0xFFFFF470) // (PIOA) Select A Register +#define AT91C_PIOA_MDDR (0xFFFFF454) // (PIOA) Multi-driver Disable Register +#define AT91C_PIOA_CODR (0xFFFFF434) // (PIOA) Clear Output Data Register +#define AT91C_PIOA_MDER (0xFFFFF450) // (PIOA) Multi-driver Enable Register +#define AT91C_PIOA_PDR (0xFFFFF404) // (PIOA) PIO Disable Register +#define AT91C_PIOA_IFSR (0xFFFFF428) // (PIOA) Input Filter Status Register +#define AT91C_PIOA_OER (0xFFFFF410) // (PIOA) Output Enable Register +#define AT91C_PIOA_PSR (0xFFFFF408) // (PIOA) PIO Status Register +// ========== Register definition for PIOB peripheral ========== +#define AT91C_PIOB_OWDR (0xFFFFF6A4) // (PIOB) Output Write Disable Register +#define AT91C_PIOB_MDER (0xFFFFF650) // (PIOB) Multi-driver Enable Register +#define AT91C_PIOB_PPUSR (0xFFFFF668) // (PIOB) Pull-up Status Register +#define AT91C_PIOB_IMR (0xFFFFF648) // (PIOB) Interrupt Mask Register +#define AT91C_PIOB_ASR (0xFFFFF670) // (PIOB) Select A Register +#define AT91C_PIOB_PPUDR (0xFFFFF660) // (PIOB) Pull-up Disable Register +#define AT91C_PIOB_PSR (0xFFFFF608) // (PIOB) PIO Status Register +#define AT91C_PIOB_IER (0xFFFFF640) // (PIOB) Interrupt Enable Register +#define AT91C_PIOB_CODR (0xFFFFF634) // (PIOB) Clear Output Data Register +#define AT91C_PIOB_OWER (0xFFFFF6A0) // (PIOB) Output Write Enable Register +#define AT91C_PIOB_ABSR (0xFFFFF678) // (PIOB) AB Select Status Register +#define AT91C_PIOB_IFDR (0xFFFFF624) // (PIOB) Input Filter Disable Register +#define AT91C_PIOB_PDSR (0xFFFFF63C) // (PIOB) Pin Data Status Register +#define AT91C_PIOB_IDR (0xFFFFF644) // (PIOB) Interrupt Disable Register +#define AT91C_PIOB_OWSR (0xFFFFF6A8) // (PIOB) Output Write Status Register +#define AT91C_PIOB_PDR (0xFFFFF604) // (PIOB) PIO Disable Register +#define AT91C_PIOB_ODR (0xFFFFF614) // (PIOB) Output Disable Registerr +#define AT91C_PIOB_IFSR (0xFFFFF628) // (PIOB) Input Filter Status Register +#define AT91C_PIOB_PPUER (0xFFFFF664) // (PIOB) Pull-up Enable Register +#define AT91C_PIOB_SODR (0xFFFFF630) // (PIOB) Set Output Data Register +#define AT91C_PIOB_ISR (0xFFFFF64C) // (PIOB) Interrupt Status Register +#define AT91C_PIOB_ODSR (0xFFFFF638) // (PIOB) Output Data Status Register +#define AT91C_PIOB_OSR (0xFFFFF618) // (PIOB) Output Status Register +#define AT91C_PIOB_MDSR (0xFFFFF658) // (PIOB) Multi-driver Status Register +#define AT91C_PIOB_IFER (0xFFFFF620) // (PIOB) Input Filter Enable Register +#define AT91C_PIOB_BSR (0xFFFFF674) // (PIOB) Select B Register +#define AT91C_PIOB_MDDR (0xFFFFF654) // (PIOB) Multi-driver Disable Register +#define AT91C_PIOB_OER (0xFFFFF610) // (PIOB) Output Enable Register +#define AT91C_PIOB_PER (0xFFFFF600) // (PIOB) PIO Enable Register +// ========== Register definition for CKGR peripheral ========== +#define AT91C_CKGR_MOR (0xFFFFFC20) // (CKGR) Main Oscillator Register +#define AT91C_CKGR_PLLR (0xFFFFFC2C) // (CKGR) PLL Register +#define AT91C_CKGR_MCFR (0xFFFFFC24) // (CKGR) Main Clock Frequency Register +// ========== Register definition for PMC peripheral ========== +#define AT91C_PMC_IDR (0xFFFFFC64) // (PMC) Interrupt Disable Register +#define AT91C_PMC_MOR (0xFFFFFC20) // (PMC) Main Oscillator Register +#define AT91C_PMC_PLLR (0xFFFFFC2C) // (PMC) PLL Register +#define AT91C_PMC_PCER (0xFFFFFC10) // (PMC) Peripheral Clock Enable Register +#define AT91C_PMC_PCKR (0xFFFFFC40) // (PMC) Programmable Clock Register +#define AT91C_PMC_MCKR (0xFFFFFC30) // (PMC) Master Clock Register +#define AT91C_PMC_SCDR (0xFFFFFC04) // (PMC) System Clock Disable Register +#define AT91C_PMC_PCDR (0xFFFFFC14) // (PMC) Peripheral Clock Disable Register +#define AT91C_PMC_SCSR (0xFFFFFC08) // (PMC) System Clock Status Register +#define AT91C_PMC_PCSR (0xFFFFFC18) // (PMC) Peripheral Clock Status Register +#define AT91C_PMC_MCFR (0xFFFFFC24) // (PMC) Main Clock Frequency Register +#define AT91C_PMC_SCER (0xFFFFFC00) // (PMC) System Clock Enable Register +#define AT91C_PMC_IMR (0xFFFFFC6C) // (PMC) Interrupt Mask Register +#define AT91C_PMC_IER (0xFFFFFC60) // (PMC) Interrupt Enable Register +#define AT91C_PMC_SR (0xFFFFFC68) // (PMC) Status Register +// ========== Register definition for RSTC peripheral ========== +#define AT91C_RSTC_RCR (0xFFFFFD00) // (RSTC) Reset Control Register +#define AT91C_RSTC_RMR (0xFFFFFD08) // (RSTC) Reset Mode Register +#define AT91C_RSTC_RSR (0xFFFFFD04) // (RSTC) Reset Status Register +// ========== Register definition for RTTC peripheral ========== +#define AT91C_RTTC_RTSR (0xFFFFFD2C) // (RTTC) Real-time Status Register +#define AT91C_RTTC_RTMR (0xFFFFFD20) // (RTTC) Real-time Mode Register +#define AT91C_RTTC_RTVR (0xFFFFFD28) // (RTTC) Real-time Value Register +#define AT91C_RTTC_RTAR (0xFFFFFD24) // (RTTC) Real-time Alarm Register +// ========== Register definition for PITC peripheral ========== +#define AT91C_PITC_PIVR (0xFFFFFD38) // (PITC) Period Interval Value Register +#define AT91C_PITC_PISR (0xFFFFFD34) // (PITC) Period Interval Status Register +#define AT91C_PITC_PIIR (0xFFFFFD3C) // (PITC) Period Interval Image Register +#define AT91C_PITC_PIMR (0xFFFFFD30) // (PITC) Period Interval Mode Register +// ========== Register definition for WDTC peripheral ========== +#define AT91C_WDTC_WDCR (0xFFFFFD40) // (WDTC) Watchdog Control Register +#define AT91C_WDTC_WDSR (0xFFFFFD48) // (WDTC) Watchdog Status Register +#define AT91C_WDTC_WDMR (0xFFFFFD44) // (WDTC) Watchdog Mode Register +// ========== Register definition for VREG peripheral ========== +#define AT91C_VREG_MR (0xFFFFFD60) // (VREG) Voltage Regulator Mode Register +// ========== Register definition for MC peripheral ========== +#define AT91C_MC_ASR (0xFFFFFF04) // (MC) MC Abort Status Register +#define AT91C_MC_RCR (0xFFFFFF00) // (MC) MC Remap Control Register +#define AT91C_MC_FCR (0xFFFFFF64) // (MC) MC Flash Command Register +#define AT91C_MC_AASR (0xFFFFFF08) // (MC) MC Abort Address Status Register +#define AT91C_MC_FSR (0xFFFFFF68) // (MC) MC Flash Status Register +#define AT91C_MC_FMR (0xFFFFFF60) // (MC) MC Flash Mode Register +// ========== Register definition for PDC_SPI1 peripheral ========== +#define AT91C_SPI1_PTCR (0xFFFE4120) // (PDC_SPI1) PDC Transfer Control Register +#define AT91C_SPI1_RPR (0xFFFE4100) // (PDC_SPI1) Receive Pointer Register +#define AT91C_SPI1_TNCR (0xFFFE411C) // (PDC_SPI1) Transmit Next Counter Register +#define AT91C_SPI1_TPR (0xFFFE4108) // (PDC_SPI1) Transmit Pointer Register +#define AT91C_SPI1_TNPR (0xFFFE4118) // (PDC_SPI1) Transmit Next Pointer Register +#define AT91C_SPI1_TCR (0xFFFE410C) // (PDC_SPI1) Transmit Counter Register +#define AT91C_SPI1_RCR (0xFFFE4104) // (PDC_SPI1) Receive Counter Register +#define AT91C_SPI1_RNPR (0xFFFE4110) // (PDC_SPI1) Receive Next Pointer Register +#define AT91C_SPI1_RNCR (0xFFFE4114) // (PDC_SPI1) Receive Next Counter Register +#define AT91C_SPI1_PTSR (0xFFFE4124) // (PDC_SPI1) PDC Transfer Status Register +// ========== Register definition for SPI1 peripheral ========== +#define AT91C_SPI1_IMR (0xFFFE401C) // (SPI1) Interrupt Mask Register +#define AT91C_SPI1_IER (0xFFFE4014) // (SPI1) Interrupt Enable Register +#define AT91C_SPI1_MR (0xFFFE4004) // (SPI1) Mode Register +#define AT91C_SPI1_RDR (0xFFFE4008) // (SPI1) Receive Data Register +#define AT91C_SPI1_IDR (0xFFFE4018) // (SPI1) Interrupt Disable Register +#define AT91C_SPI1_SR (0xFFFE4010) // (SPI1) Status Register +#define AT91C_SPI1_TDR (0xFFFE400C) // (SPI1) Transmit Data Register +#define AT91C_SPI1_CR (0xFFFE4000) // (SPI1) Control Register +#define AT91C_SPI1_CSR (0xFFFE4030) // (SPI1) Chip Select Register +// ========== Register definition for PDC_SPI0 peripheral ========== +#define AT91C_SPI0_PTCR (0xFFFE0120) // (PDC_SPI0) PDC Transfer Control Register +#define AT91C_SPI0_TPR (0xFFFE0108) // (PDC_SPI0) Transmit Pointer Register +#define AT91C_SPI0_TCR (0xFFFE010C) // (PDC_SPI0) Transmit Counter Register +#define AT91C_SPI0_RCR (0xFFFE0104) // (PDC_SPI0) Receive Counter Register +#define AT91C_SPI0_PTSR (0xFFFE0124) // (PDC_SPI0) PDC Transfer Status Register +#define AT91C_SPI0_RNPR (0xFFFE0110) // (PDC_SPI0) Receive Next Pointer Register +#define AT91C_SPI0_RPR (0xFFFE0100) // (PDC_SPI0) Receive Pointer Register +#define AT91C_SPI0_TNCR (0xFFFE011C) // (PDC_SPI0) Transmit Next Counter Register +#define AT91C_SPI0_RNCR (0xFFFE0114) // (PDC_SPI0) Receive Next Counter Register +#define AT91C_SPI0_TNPR (0xFFFE0118) // (PDC_SPI0) Transmit Next Pointer Register +// ========== Register definition for SPI0 peripheral ========== +#define AT91C_SPI0_IER (0xFFFE0014) // (SPI0) Interrupt Enable Register +#define AT91C_SPI0_SR (0xFFFE0010) // (SPI0) Status Register +#define AT91C_SPI0_IDR (0xFFFE0018) // (SPI0) Interrupt Disable Register +#define AT91C_SPI0_CR (0xFFFE0000) // (SPI0) Control Register +#define AT91C_SPI0_MR (0xFFFE0004) // (SPI0) Mode Register +#define AT91C_SPI0_IMR (0xFFFE001C) // (SPI0) Interrupt Mask Register +#define AT91C_SPI0_TDR (0xFFFE000C) // (SPI0) Transmit Data Register +#define AT91C_SPI0_RDR (0xFFFE0008) // (SPI0) Receive Data Register +#define AT91C_SPI0_CSR (0xFFFE0030) // (SPI0) Chip Select Register +// ========== Register definition for PDC_US1 peripheral ========== +#define AT91C_US1_RNCR (0xFFFC4114) // (PDC_US1) Receive Next Counter Register +#define AT91C_US1_PTCR (0xFFFC4120) // (PDC_US1) PDC Transfer Control Register +#define AT91C_US1_TCR (0xFFFC410C) // (PDC_US1) Transmit Counter Register +#define AT91C_US1_PTSR (0xFFFC4124) // (PDC_US1) PDC Transfer Status Register +#define AT91C_US1_TNPR (0xFFFC4118) // (PDC_US1) Transmit Next Pointer Register +#define AT91C_US1_RCR (0xFFFC4104) // (PDC_US1) Receive Counter Register +#define AT91C_US1_RNPR (0xFFFC4110) // (PDC_US1) Receive Next Pointer Register +#define AT91C_US1_RPR (0xFFFC4100) // (PDC_US1) Receive Pointer Register +#define AT91C_US1_TNCR (0xFFFC411C) // (PDC_US1) Transmit Next Counter Register +#define AT91C_US1_TPR (0xFFFC4108) // (PDC_US1) Transmit Pointer Register +// ========== Register definition for US1 peripheral ========== +#define AT91C_US1_IF (0xFFFC404C) // (US1) IRDA_FILTER Register +#define AT91C_US1_NER (0xFFFC4044) // (US1) Nb Errors Register +#define AT91C_US1_RTOR (0xFFFC4024) // (US1) Receiver Time-out Register +#define AT91C_US1_CSR (0xFFFC4014) // (US1) Channel Status Register +#define AT91C_US1_IDR (0xFFFC400C) // (US1) Interrupt Disable Register +#define AT91C_US1_IER (0xFFFC4008) // (US1) Interrupt Enable Register +#define AT91C_US1_THR (0xFFFC401C) // (US1) Transmitter Holding Register +#define AT91C_US1_TTGR (0xFFFC4028) // (US1) Transmitter Time-guard Register +#define AT91C_US1_RHR (0xFFFC4018) // (US1) Receiver Holding Register +#define AT91C_US1_BRGR (0xFFFC4020) // (US1) Baud Rate Generator Register +#define AT91C_US1_IMR (0xFFFC4010) // (US1) Interrupt Mask Register +#define AT91C_US1_FIDI (0xFFFC4040) // (US1) FI_DI_Ratio Register +#define AT91C_US1_CR (0xFFFC4000) // (US1) Control Register +#define AT91C_US1_MR (0xFFFC4004) // (US1) Mode Register +// ========== Register definition for PDC_US0 peripheral ========== +#define AT91C_US0_TNPR (0xFFFC0118) // (PDC_US0) Transmit Next Pointer Register +#define AT91C_US0_RNPR (0xFFFC0110) // (PDC_US0) Receive Next Pointer Register +#define AT91C_US0_TCR (0xFFFC010C) // (PDC_US0) Transmit Counter Register +#define AT91C_US0_PTCR (0xFFFC0120) // (PDC_US0) PDC Transfer Control Register +#define AT91C_US0_PTSR (0xFFFC0124) // (PDC_US0) PDC Transfer Status Register +#define AT91C_US0_TNCR (0xFFFC011C) // (PDC_US0) Transmit Next Counter Register +#define AT91C_US0_TPR (0xFFFC0108) // (PDC_US0) Transmit Pointer Register +#define AT91C_US0_RCR (0xFFFC0104) // (PDC_US0) Receive Counter Register +#define AT91C_US0_RPR (0xFFFC0100) // (PDC_US0) Receive Pointer Register +#define AT91C_US0_RNCR (0xFFFC0114) // (PDC_US0) Receive Next Counter Register +// ========== Register definition for US0 peripheral ========== +#define AT91C_US0_BRGR (0xFFFC0020) // (US0) Baud Rate Generator Register +#define AT91C_US0_NER (0xFFFC0044) // (US0) Nb Errors Register +#define AT91C_US0_CR (0xFFFC0000) // (US0) Control Register +#define AT91C_US0_IMR (0xFFFC0010) // (US0) Interrupt Mask Register +#define AT91C_US0_FIDI (0xFFFC0040) // (US0) FI_DI_Ratio Register +#define AT91C_US0_TTGR (0xFFFC0028) // (US0) Transmitter Time-guard Register +#define AT91C_US0_MR (0xFFFC0004) // (US0) Mode Register +#define AT91C_US0_RTOR (0xFFFC0024) // (US0) Receiver Time-out Register +#define AT91C_US0_CSR (0xFFFC0014) // (US0) Channel Status Register +#define AT91C_US0_RHR (0xFFFC0018) // (US0) Receiver Holding Register +#define AT91C_US0_IDR (0xFFFC000C) // (US0) Interrupt Disable Register +#define AT91C_US0_THR (0xFFFC001C) // (US0) Transmitter Holding Register +#define AT91C_US0_IF (0xFFFC004C) // (US0) IRDA_FILTER Register +#define AT91C_US0_IER (0xFFFC0008) // (US0) Interrupt Enable Register +// ========== Register definition for PDC_SSC peripheral ========== +#define AT91C_SSC_TNCR (0xFFFD411C) // (PDC_SSC) Transmit Next Counter Register +#define AT91C_SSC_RPR (0xFFFD4100) // (PDC_SSC) Receive Pointer Register +#define AT91C_SSC_RNCR (0xFFFD4114) // (PDC_SSC) Receive Next Counter Register +#define AT91C_SSC_TPR (0xFFFD4108) // (PDC_SSC) Transmit Pointer Register +#define AT91C_SSC_PTCR (0xFFFD4120) // (PDC_SSC) PDC Transfer Control Register +#define AT91C_SSC_TCR (0xFFFD410C) // (PDC_SSC) Transmit Counter Register +#define AT91C_SSC_RCR (0xFFFD4104) // (PDC_SSC) Receive Counter Register +#define AT91C_SSC_RNPR (0xFFFD4110) // (PDC_SSC) Receive Next Pointer Register +#define AT91C_SSC_TNPR (0xFFFD4118) // (PDC_SSC) Transmit Next Pointer Register +#define AT91C_SSC_PTSR (0xFFFD4124) // (PDC_SSC) PDC Transfer Status Register +// ========== Register definition for SSC peripheral ========== +#define AT91C_SSC_RHR (0xFFFD4020) // (SSC) Receive Holding Register +#define AT91C_SSC_RSHR (0xFFFD4030) // (SSC) Receive Sync Holding Register +#define AT91C_SSC_TFMR (0xFFFD401C) // (SSC) Transmit Frame Mode Register +#define AT91C_SSC_IDR (0xFFFD4048) // (SSC) Interrupt Disable Register +#define AT91C_SSC_THR (0xFFFD4024) // (SSC) Transmit Holding Register +#define AT91C_SSC_RCMR (0xFFFD4010) // (SSC) Receive Clock ModeRegister +#define AT91C_SSC_IER (0xFFFD4044) // (SSC) Interrupt Enable Register +#define AT91C_SSC_TSHR (0xFFFD4034) // (SSC) Transmit Sync Holding Register +#define AT91C_SSC_SR (0xFFFD4040) // (SSC) Status Register +#define AT91C_SSC_CMR (0xFFFD4004) // (SSC) Clock Mode Register +#define AT91C_SSC_TCMR (0xFFFD4018) // (SSC) Transmit Clock Mode Register +#define AT91C_SSC_CR (0xFFFD4000) // (SSC) Control Register +#define AT91C_SSC_IMR (0xFFFD404C) // (SSC) Interrupt Mask Register +#define AT91C_SSC_RFMR (0xFFFD4014) // (SSC) Receive Frame Mode Register +// ========== Register definition for TWI peripheral ========== +#define AT91C_TWI_IER (0xFFFB8024) // (TWI) Interrupt Enable Register +#define AT91C_TWI_CR (0xFFFB8000) // (TWI) Control Register +#define AT91C_TWI_SR (0xFFFB8020) // (TWI) Status Register +#define AT91C_TWI_IMR (0xFFFB802C) // (TWI) Interrupt Mask Register +#define AT91C_TWI_THR (0xFFFB8034) // (TWI) Transmit Holding Register +#define AT91C_TWI_IDR (0xFFFB8028) // (TWI) Interrupt Disable Register +#define AT91C_TWI_IADR (0xFFFB800C) // (TWI) Internal Address Register +#define AT91C_TWI_MMR (0xFFFB8004) // (TWI) Master Mode Register +#define AT91C_TWI_CWGR (0xFFFB8010) // (TWI) Clock Waveform Generator Register +#define AT91C_TWI_RHR (0xFFFB8030) // (TWI) Receive Holding Register +// ========== Register definition for PWMC_CH3 peripheral ========== +#define AT91C_PWMC_CH3_CUPDR (0xFFFCC270) // (PWMC_CH3) Channel Update Register +#define AT91C_PWMC_CH3_Reserved (0xFFFCC274) // (PWMC_CH3) Reserved +#define AT91C_PWMC_CH3_CPRDR (0xFFFCC268) // (PWMC_CH3) Channel Period Register +#define AT91C_PWMC_CH3_CDTYR (0xFFFCC264) // (PWMC_CH3) Channel Duty Cycle Register +#define AT91C_PWMC_CH3_CCNTR (0xFFFCC26C) // (PWMC_CH3) Channel Counter Register +#define AT91C_PWMC_CH3_CMR (0xFFFCC260) // (PWMC_CH3) Channel Mode Register +// ========== Register definition for PWMC_CH2 peripheral ========== +#define AT91C_PWMC_CH2_Reserved (0xFFFCC254) // (PWMC_CH2) Reserved +#define AT91C_PWMC_CH2_CMR (0xFFFCC240) // (PWMC_CH2) Channel Mode Register +#define AT91C_PWMC_CH2_CCNTR (0xFFFCC24C) // (PWMC_CH2) Channel Counter Register +#define AT91C_PWMC_CH2_CPRDR (0xFFFCC248) // (PWMC_CH2) Channel Period Register +#define AT91C_PWMC_CH2_CUPDR (0xFFFCC250) // (PWMC_CH2) Channel Update Register +#define AT91C_PWMC_CH2_CDTYR (0xFFFCC244) // (PWMC_CH2) Channel Duty Cycle Register +// ========== Register definition for PWMC_CH1 peripheral ========== +#define AT91C_PWMC_CH1_Reserved (0xFFFCC234) // (PWMC_CH1) Reserved +#define AT91C_PWMC_CH1_CUPDR (0xFFFCC230) // (PWMC_CH1) Channel Update Register +#define AT91C_PWMC_CH1_CPRDR (0xFFFCC228) // (PWMC_CH1) Channel Period Register +#define AT91C_PWMC_CH1_CCNTR (0xFFFCC22C) // (PWMC_CH1) Channel Counter Register +#define AT91C_PWMC_CH1_CDTYR (0xFFFCC224) // (PWMC_CH1) Channel Duty Cycle Register +#define AT91C_PWMC_CH1_CMR (0xFFFCC220) // (PWMC_CH1) Channel Mode Register +// ========== Register definition for PWMC_CH0 peripheral ========== +#define AT91C_PWMC_CH0_Reserved (0xFFFCC214) // (PWMC_CH0) Reserved +#define AT91C_PWMC_CH0_CPRDR (0xFFFCC208) // (PWMC_CH0) Channel Period Register +#define AT91C_PWMC_CH0_CDTYR (0xFFFCC204) // (PWMC_CH0) Channel Duty Cycle Register +#define AT91C_PWMC_CH0_CMR (0xFFFCC200) // (PWMC_CH0) Channel Mode Register +#define AT91C_PWMC_CH0_CUPDR (0xFFFCC210) // (PWMC_CH0) Channel Update Register +#define AT91C_PWMC_CH0_CCNTR (0xFFFCC20C) // (PWMC_CH0) Channel Counter Register +// ========== Register definition for PWMC peripheral ========== +#define AT91C_PWMC_IDR (0xFFFCC014) // (PWMC) PWMC Interrupt Disable Register +#define AT91C_PWMC_DIS (0xFFFCC008) // (PWMC) PWMC Disable Register +#define AT91C_PWMC_IER (0xFFFCC010) // (PWMC) PWMC Interrupt Enable Register +#define AT91C_PWMC_VR (0xFFFCC0FC) // (PWMC) PWMC Version Register +#define AT91C_PWMC_ISR (0xFFFCC01C) // (PWMC) PWMC Interrupt Status Register +#define AT91C_PWMC_SR (0xFFFCC00C) // (PWMC) PWMC Status Register +#define AT91C_PWMC_IMR (0xFFFCC018) // (PWMC) PWMC Interrupt Mask Register +#define AT91C_PWMC_MR (0xFFFCC000) // (PWMC) PWMC Mode Register +#define AT91C_PWMC_ENA (0xFFFCC004) // (PWMC) PWMC Enable Register +// ========== Register definition for UDP peripheral ========== +#define AT91C_UDP_IMR (0xFFFB0018) // (UDP) Interrupt Mask Register +#define AT91C_UDP_FADDR (0xFFFB0008) // (UDP) Function Address Register +#define AT91C_UDP_NUM (0xFFFB0000) // (UDP) Frame Number Register +#define AT91C_UDP_FDR (0xFFFB0050) // (UDP) Endpoint FIFO Data Register +#define AT91C_UDP_ISR (0xFFFB001C) // (UDP) Interrupt Status Register +#define AT91C_UDP_CSR (0xFFFB0030) // (UDP) Endpoint Control and Status Register +#define AT91C_UDP_IDR (0xFFFB0014) // (UDP) Interrupt Disable Register +#define AT91C_UDP_ICR (0xFFFB0020) // (UDP) Interrupt Clear Register +#define AT91C_UDP_RSTEP (0xFFFB0028) // (UDP) Reset Endpoint Register +#define AT91C_UDP_TXVC (0xFFFB0074) // (UDP) Transceiver Control Register +#define AT91C_UDP_GLBSTATE (0xFFFB0004) // (UDP) Global State Register +#define AT91C_UDP_IER (0xFFFB0010) // (UDP) Interrupt Enable Register +// ========== Register definition for TC0 peripheral ========== +#define AT91C_TC0_SR (0xFFFA0020) // (TC0) Status Register +#define AT91C_TC0_RC (0xFFFA001C) // (TC0) Register C +#define AT91C_TC0_RB (0xFFFA0018) // (TC0) Register B +#define AT91C_TC0_CCR (0xFFFA0000) // (TC0) Channel Control Register +#define AT91C_TC0_CMR (0xFFFA0004) // (TC0) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC0_IER (0xFFFA0024) // (TC0) Interrupt Enable Register +#define AT91C_TC0_RA (0xFFFA0014) // (TC0) Register A +#define AT91C_TC0_IDR (0xFFFA0028) // (TC0) Interrupt Disable Register +#define AT91C_TC0_CV (0xFFFA0010) // (TC0) Counter Value +#define AT91C_TC0_IMR (0xFFFA002C) // (TC0) Interrupt Mask Register +// ========== Register definition for TC1 peripheral ========== +#define AT91C_TC1_RB (0xFFFA0058) // (TC1) Register B +#define AT91C_TC1_CCR (0xFFFA0040) // (TC1) Channel Control Register +#define AT91C_TC1_IER (0xFFFA0064) // (TC1) Interrupt Enable Register +#define AT91C_TC1_IDR (0xFFFA0068) // (TC1) Interrupt Disable Register +#define AT91C_TC1_SR (0xFFFA0060) // (TC1) Status Register +#define AT91C_TC1_CMR (0xFFFA0044) // (TC1) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC1_RA (0xFFFA0054) // (TC1) Register A +#define AT91C_TC1_RC (0xFFFA005C) // (TC1) Register C +#define AT91C_TC1_IMR (0xFFFA006C) // (TC1) Interrupt Mask Register +#define AT91C_TC1_CV (0xFFFA0050) // (TC1) Counter Value +// ========== Register definition for TC2 peripheral ========== +#define AT91C_TC2_CMR (0xFFFA0084) // (TC2) Channel Mode Register (Capture Mode / Waveform Mode) +#define AT91C_TC2_CCR (0xFFFA0080) // (TC2) Channel Control Register +#define AT91C_TC2_CV (0xFFFA0090) // (TC2) Counter Value +#define AT91C_TC2_RA (0xFFFA0094) // (TC2) Register A +#define AT91C_TC2_RB (0xFFFA0098) // (TC2) Register B +#define AT91C_TC2_IDR (0xFFFA00A8) // (TC2) Interrupt Disable Register +#define AT91C_TC2_IMR (0xFFFA00AC) // (TC2) Interrupt Mask Register +#define AT91C_TC2_RC (0xFFFA009C) // (TC2) Register C +#define AT91C_TC2_IER (0xFFFA00A4) // (TC2) Interrupt Enable Register +#define AT91C_TC2_SR (0xFFFA00A0) // (TC2) Status Register +// ========== Register definition for TCB peripheral ========== +#define AT91C_TCB_BMR (0xFFFA00C4) // (TCB) TC Block Mode Register +#define AT91C_TCB_BCR (0xFFFA00C0) // (TCB) TC Block Control Register +// ========== Register definition for CAN_MB0 peripheral ========== +#define AT91C_CAN_MB0_MDL (0xFFFD0214) // (CAN_MB0) MailBox Data Low Register +#define AT91C_CAN_MB0_MAM (0xFFFD0204) // (CAN_MB0) MailBox Acceptance Mask Register +#define AT91C_CAN_MB0_MCR (0xFFFD021C) // (CAN_MB0) MailBox Control Register +#define AT91C_CAN_MB0_MID (0xFFFD0208) // (CAN_MB0) MailBox ID Register +#define AT91C_CAN_MB0_MSR (0xFFFD0210) // (CAN_MB0) MailBox Status Register +#define AT91C_CAN_MB0_MFID (0xFFFD020C) // (CAN_MB0) MailBox Family ID Register +#define AT91C_CAN_MB0_MDH (0xFFFD0218) // (CAN_MB0) MailBox Data High Register +#define AT91C_CAN_MB0_MMR (0xFFFD0200) // (CAN_MB0) MailBox Mode Register +// ========== Register definition for CAN_MB1 peripheral ========== +#define AT91C_CAN_MB1_MDL (0xFFFD0234) // (CAN_MB1) MailBox Data Low Register +#define AT91C_CAN_MB1_MID (0xFFFD0228) // (CAN_MB1) MailBox ID Register +#define AT91C_CAN_MB1_MMR (0xFFFD0220) // (CAN_MB1) MailBox Mode Register +#define AT91C_CAN_MB1_MSR (0xFFFD0230) // (CAN_MB1) MailBox Status Register +#define AT91C_CAN_MB1_MAM (0xFFFD0224) // (CAN_MB1) MailBox Acceptance Mask Register +#define AT91C_CAN_MB1_MDH (0xFFFD0238) // (CAN_MB1) MailBox Data High Register +#define AT91C_CAN_MB1_MCR (0xFFFD023C) // (CAN_MB1) MailBox Control Register +#define AT91C_CAN_MB1_MFID (0xFFFD022C) // (CAN_MB1) MailBox Family ID Register +// ========== Register definition for CAN_MB2 peripheral ========== +#define AT91C_CAN_MB2_MCR (0xFFFD025C) // (CAN_MB2) MailBox Control Register +#define AT91C_CAN_MB2_MDH (0xFFFD0258) // (CAN_MB2) MailBox Data High Register +#define AT91C_CAN_MB2_MID (0xFFFD0248) // (CAN_MB2) MailBox ID Register +#define AT91C_CAN_MB2_MDL (0xFFFD0254) // (CAN_MB2) MailBox Data Low Register +#define AT91C_CAN_MB2_MMR (0xFFFD0240) // (CAN_MB2) MailBox Mode Register +#define AT91C_CAN_MB2_MAM (0xFFFD0244) // (CAN_MB2) MailBox Acceptance Mask Register +#define AT91C_CAN_MB2_MFID (0xFFFD024C) // (CAN_MB2) MailBox Family ID Register +#define AT91C_CAN_MB2_MSR (0xFFFD0250) // (CAN_MB2) MailBox Status Register +// ========== Register definition for CAN_MB3 peripheral ========== +#define AT91C_CAN_MB3_MFID (0xFFFD026C) // (CAN_MB3) MailBox Family ID Register +#define AT91C_CAN_MB3_MAM (0xFFFD0264) // (CAN_MB3) MailBox Acceptance Mask Register +#define AT91C_CAN_MB3_MID (0xFFFD0268) // (CAN_MB3) MailBox ID Register +#define AT91C_CAN_MB3_MCR (0xFFFD027C) // (CAN_MB3) MailBox Control Register +#define AT91C_CAN_MB3_MMR (0xFFFD0260) // (CAN_MB3) MailBox Mode Register +#define AT91C_CAN_MB3_MSR (0xFFFD0270) // (CAN_MB3) MailBox Status Register +#define AT91C_CAN_MB3_MDL (0xFFFD0274) // (CAN_MB3) MailBox Data Low Register +#define AT91C_CAN_MB3_MDH (0xFFFD0278) // (CAN_MB3) MailBox Data High Register +// ========== Register definition for CAN_MB4 peripheral ========== +#define AT91C_CAN_MB4_MID (0xFFFD0288) // (CAN_MB4) MailBox ID Register +#define AT91C_CAN_MB4_MMR (0xFFFD0280) // (CAN_MB4) MailBox Mode Register +#define AT91C_CAN_MB4_MDH (0xFFFD0298) // (CAN_MB4) MailBox Data High Register +#define AT91C_CAN_MB4_MFID (0xFFFD028C) // (CAN_MB4) MailBox Family ID Register +#define AT91C_CAN_MB4_MSR (0xFFFD0290) // (CAN_MB4) MailBox Status Register +#define AT91C_CAN_MB4_MCR (0xFFFD029C) // (CAN_MB4) MailBox Control Register +#define AT91C_CAN_MB4_MDL (0xFFFD0294) // (CAN_MB4) MailBox Data Low Register +#define AT91C_CAN_MB4_MAM (0xFFFD0284) // (CAN_MB4) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB5 peripheral ========== +#define AT91C_CAN_MB5_MSR (0xFFFD02B0) // (CAN_MB5) MailBox Status Register +#define AT91C_CAN_MB5_MCR (0xFFFD02BC) // (CAN_MB5) MailBox Control Register +#define AT91C_CAN_MB5_MFID (0xFFFD02AC) // (CAN_MB5) MailBox Family ID Register +#define AT91C_CAN_MB5_MDH (0xFFFD02B8) // (CAN_MB5) MailBox Data High Register +#define AT91C_CAN_MB5_MID (0xFFFD02A8) // (CAN_MB5) MailBox ID Register +#define AT91C_CAN_MB5_MMR (0xFFFD02A0) // (CAN_MB5) MailBox Mode Register +#define AT91C_CAN_MB5_MDL (0xFFFD02B4) // (CAN_MB5) MailBox Data Low Register +#define AT91C_CAN_MB5_MAM (0xFFFD02A4) // (CAN_MB5) MailBox Acceptance Mask Register +// ========== Register definition for CAN_MB6 peripheral ========== +#define AT91C_CAN_MB6_MFID (0xFFFD02CC) // (CAN_MB6) MailBox Family ID Register +#define AT91C_CAN_MB6_MID (0xFFFD02C8) // (CAN_MB6) MailBox ID Register +#define AT91C_CAN_MB6_MAM (0xFFFD02C4) // (CAN_MB6) MailBox Acceptance Mask Register +#define AT91C_CAN_MB6_MSR (0xFFFD02D0) // (CAN_MB6) MailBox Status Register +#define AT91C_CAN_MB6_MDL (0xFFFD02D4) // (CAN_MB6) MailBox Data Low Register +#define AT91C_CAN_MB6_MCR (0xFFFD02DC) // (CAN_MB6) MailBox Control Register +#define AT91C_CAN_MB6_MDH (0xFFFD02D8) // (CAN_MB6) MailBox Data High Register +#define AT91C_CAN_MB6_MMR (0xFFFD02C0) // (CAN_MB6) MailBox Mode Register +// ========== Register definition for CAN_MB7 peripheral ========== +#define AT91C_CAN_MB7_MCR (0xFFFD02FC) // (CAN_MB7) MailBox Control Register +#define AT91C_CAN_MB7_MDH (0xFFFD02F8) // (CAN_MB7) MailBox Data High Register +#define AT91C_CAN_MB7_MFID (0xFFFD02EC) // (CAN_MB7) MailBox Family ID Register +#define AT91C_CAN_MB7_MDL (0xFFFD02F4) // (CAN_MB7) MailBox Data Low Register +#define AT91C_CAN_MB7_MID (0xFFFD02E8) // (CAN_MB7) MailBox ID Register +#define AT91C_CAN_MB7_MMR (0xFFFD02E0) // (CAN_MB7) MailBox Mode Register +#define AT91C_CAN_MB7_MAM (0xFFFD02E4) // (CAN_MB7) MailBox Acceptance Mask Register +#define AT91C_CAN_MB7_MSR (0xFFFD02F0) // (CAN_MB7) MailBox Status Register +// ========== Register definition for CAN peripheral ========== +#define AT91C_CAN_TCR (0xFFFD0024) // (CAN) Transfer Command Register +#define AT91C_CAN_IMR (0xFFFD000C) // (CAN) Interrupt Mask Register +#define AT91C_CAN_IER (0xFFFD0004) // (CAN) Interrupt Enable Register +#define AT91C_CAN_ECR (0xFFFD0020) // (CAN) Error Counter Register +#define AT91C_CAN_TIMESTP (0xFFFD001C) // (CAN) Time Stamp Register +#define AT91C_CAN_MR (0xFFFD0000) // (CAN) Mode Register +#define AT91C_CAN_IDR (0xFFFD0008) // (CAN) Interrupt Disable Register +#define AT91C_CAN_ACR (0xFFFD0028) // (CAN) Abort Command Register +#define AT91C_CAN_TIM (0xFFFD0018) // (CAN) Timer Register +#define AT91C_CAN_SR (0xFFFD0010) // (CAN) Status Register +#define AT91C_CAN_BR (0xFFFD0014) // (CAN) Baudrate Register +#define AT91C_CAN_VR (0xFFFD00FC) // (CAN) Version Register +// ========== Register definition for EMAC peripheral ========== +#define AT91C_EMAC_ISR (0xFFFDC024) // (EMAC) Interrupt Status Register +#define AT91C_EMAC_SA4H (0xFFFDC0B4) // (EMAC) Specific Address 4 Top, Last 2 bytes +#define AT91C_EMAC_SA1L (0xFFFDC098) // (EMAC) Specific Address 1 Bottom, First 4 bytes +#define AT91C_EMAC_ELE (0xFFFDC078) // (EMAC) Excessive Length Errors Register +#define AT91C_EMAC_LCOL (0xFFFDC05C) // (EMAC) Late Collision Register +#define AT91C_EMAC_RLE (0xFFFDC088) // (EMAC) Receive Length Field Mismatch Register +#define AT91C_EMAC_WOL (0xFFFDC0C4) // (EMAC) Wake On LAN Register +#define AT91C_EMAC_DTF (0xFFFDC058) // (EMAC) Deferred Transmission Frame Register +#define AT91C_EMAC_TUND (0xFFFDC064) // (EMAC) Transmit Underrun Error Register +#define AT91C_EMAC_NCR (0xFFFDC000) // (EMAC) Network Control Register +#define AT91C_EMAC_SA4L (0xFFFDC0B0) // (EMAC) Specific Address 4 Bottom, First 4 bytes +#define AT91C_EMAC_RSR (0xFFFDC020) // (EMAC) Receive Status Register +#define AT91C_EMAC_SA3L (0xFFFDC0A8) // (EMAC) Specific Address 3 Bottom, First 4 bytes +#define AT91C_EMAC_TSR (0xFFFDC014) // (EMAC) Transmit Status Register +#define AT91C_EMAC_IDR (0xFFFDC02C) // (EMAC) Interrupt Disable Register +#define AT91C_EMAC_RSE (0xFFFDC074) // (EMAC) Receive Symbol Errors Register +#define AT91C_EMAC_ECOL (0xFFFDC060) // (EMAC) Excessive Collision Register +#define AT91C_EMAC_TID (0xFFFDC0B8) // (EMAC) Type ID Checking Register +#define AT91C_EMAC_HRB (0xFFFDC090) // (EMAC) Hash Address Bottom[31:0] +#define AT91C_EMAC_TBQP (0xFFFDC01C) // (EMAC) Transmit Buffer Queue Pointer +#define AT91C_EMAC_USRIO (0xFFFDC0C0) // (EMAC) USER Input/Output Register +#define AT91C_EMAC_PTR (0xFFFDC038) // (EMAC) Pause Time Register +#define AT91C_EMAC_SA2H (0xFFFDC0A4) // (EMAC) Specific Address 2 Top, Last 2 bytes +#define AT91C_EMAC_ROV (0xFFFDC070) // (EMAC) Receive Overrun Errors Register +#define AT91C_EMAC_ALE (0xFFFDC054) // (EMAC) Alignment Error Register +#define AT91C_EMAC_RJA (0xFFFDC07C) // (EMAC) Receive Jabbers Register +#define AT91C_EMAC_RBQP (0xFFFDC018) // (EMAC) Receive Buffer Queue Pointer +#define AT91C_EMAC_TPF (0xFFFDC08C) // (EMAC) Transmitted Pause Frames Register +#define AT91C_EMAC_NCFGR (0xFFFDC004) // (EMAC) Network Configuration Register +#define AT91C_EMAC_HRT (0xFFFDC094) // (EMAC) Hash Address Top[63:32] +#define AT91C_EMAC_USF (0xFFFDC080) // (EMAC) Undersize Frames Register +#define AT91C_EMAC_FCSE (0xFFFDC050) // (EMAC) Frame Check Sequence Error Register +#define AT91C_EMAC_TPQ (0xFFFDC0BC) // (EMAC) Transmit Pause Quantum Register +#define AT91C_EMAC_MAN (0xFFFDC034) // (EMAC) PHY Maintenance Register +#define AT91C_EMAC_FTO (0xFFFDC040) // (EMAC) Frames Transmitted OK Register +#define AT91C_EMAC_REV (0xFFFDC0FC) // (EMAC) Revision Register +#define AT91C_EMAC_IMR (0xFFFDC030) // (EMAC) Interrupt Mask Register +#define AT91C_EMAC_SCF (0xFFFDC044) // (EMAC) Single Collision Frame Register +#define AT91C_EMAC_PFR (0xFFFDC03C) // (EMAC) Pause Frames received Register +#define AT91C_EMAC_MCF (0xFFFDC048) // (EMAC) Multiple Collision Frame Register +#define AT91C_EMAC_NSR (0xFFFDC008) // (EMAC) Network Status Register +#define AT91C_EMAC_SA2L (0xFFFDC0A0) // (EMAC) Specific Address 2 Bottom, First 4 bytes +#define AT91C_EMAC_FRO (0xFFFDC04C) // (EMAC) Frames Received OK Register +#define AT91C_EMAC_IER (0xFFFDC028) // (EMAC) Interrupt Enable Register +#define AT91C_EMAC_SA1H (0xFFFDC09C) // (EMAC) Specific Address 1 Top, Last 2 bytes +#define AT91C_EMAC_CSE (0xFFFDC068) // (EMAC) Carrier Sense Error Register +#define AT91C_EMAC_SA3H (0xFFFDC0AC) // (EMAC) Specific Address 3 Top, Last 2 bytes +#define AT91C_EMAC_RRE (0xFFFDC06C) // (EMAC) Receive Ressource Error Register +#define AT91C_EMAC_STE (0xFFFDC084) // (EMAC) SQE Test Error Register +// ========== Register definition for PDC_ADC peripheral ========== +#define AT91C_ADC_PTSR (0xFFFD8124) // (PDC_ADC) PDC Transfer Status Register +#define AT91C_ADC_PTCR (0xFFFD8120) // (PDC_ADC) PDC Transfer Control Register +#define AT91C_ADC_TNPR (0xFFFD8118) // (PDC_ADC) Transmit Next Pointer Register +#define AT91C_ADC_TNCR (0xFFFD811C) // (PDC_ADC) Transmit Next Counter Register +#define AT91C_ADC_RNPR (0xFFFD8110) // (PDC_ADC) Receive Next Pointer Register +#define AT91C_ADC_RNCR (0xFFFD8114) // (PDC_ADC) Receive Next Counter Register +#define AT91C_ADC_RPR (0xFFFD8100) // (PDC_ADC) Receive Pointer Register +#define AT91C_ADC_TCR (0xFFFD810C) // (PDC_ADC) Transmit Counter Register +#define AT91C_ADC_TPR (0xFFFD8108) // (PDC_ADC) Transmit Pointer Register +#define AT91C_ADC_RCR (0xFFFD8104) // (PDC_ADC) Receive Counter Register +// ========== Register definition for ADC peripheral ========== +#define AT91C_ADC_CDR2 (0xFFFD8038) // (ADC) ADC Channel Data Register 2 +#define AT91C_ADC_CDR3 (0xFFFD803C) // (ADC) ADC Channel Data Register 3 +#define AT91C_ADC_CDR0 (0xFFFD8030) // (ADC) ADC Channel Data Register 0 +#define AT91C_ADC_CDR5 (0xFFFD8044) // (ADC) ADC Channel Data Register 5 +#define AT91C_ADC_CHDR (0xFFFD8014) // (ADC) ADC Channel Disable Register +#define AT91C_ADC_SR (0xFFFD801C) // (ADC) ADC Status Register +#define AT91C_ADC_CDR4 (0xFFFD8040) // (ADC) ADC Channel Data Register 4 +#define AT91C_ADC_CDR1 (0xFFFD8034) // (ADC) ADC Channel Data Register 1 +#define AT91C_ADC_LCDR (0xFFFD8020) // (ADC) ADC Last Converted Data Register +#define AT91C_ADC_IDR (0xFFFD8028) // (ADC) ADC Interrupt Disable Register +#define AT91C_ADC_CR (0xFFFD8000) // (ADC) ADC Control Register +#define AT91C_ADC_CDR7 (0xFFFD804C) // (ADC) ADC Channel Data Register 7 +#define AT91C_ADC_CDR6 (0xFFFD8048) // (ADC) ADC Channel Data Register 6 +#define AT91C_ADC_IER (0xFFFD8024) // (ADC) ADC Interrupt Enable Register +#define AT91C_ADC_CHER (0xFFFD8010) // (ADC) ADC Channel Enable Register +#define AT91C_ADC_CHSR (0xFFFD8018) // (ADC) ADC Channel Status Register +#define AT91C_ADC_MR (0xFFFD8004) // (ADC) ADC Mode Register +#define AT91C_ADC_IMR (0xFFFD802C) // (ADC) ADC Interrupt Mask Register +// ========== Register definition for PDC_AES peripheral ========== +#define AT91C_AES_TPR (0xFFFA4108) // (PDC_AES) Transmit Pointer Register +#define AT91C_AES_PTCR (0xFFFA4120) // (PDC_AES) PDC Transfer Control Register +#define AT91C_AES_RNPR (0xFFFA4110) // (PDC_AES) Receive Next Pointer Register +#define AT91C_AES_TNCR (0xFFFA411C) // (PDC_AES) Transmit Next Counter Register +#define AT91C_AES_TCR (0xFFFA410C) // (PDC_AES) Transmit Counter Register +#define AT91C_AES_RCR (0xFFFA4104) // (PDC_AES) Receive Counter Register +#define AT91C_AES_RNCR (0xFFFA4114) // (PDC_AES) Receive Next Counter Register +#define AT91C_AES_TNPR (0xFFFA4118) // (PDC_AES) Transmit Next Pointer Register +#define AT91C_AES_RPR (0xFFFA4100) // (PDC_AES) Receive Pointer Register +#define AT91C_AES_PTSR (0xFFFA4124) // (PDC_AES) PDC Transfer Status Register +// ========== Register definition for AES peripheral ========== +#define AT91C_AES_IVxR (0xFFFA4060) // (AES) Initialization Vector x Register +#define AT91C_AES_MR (0xFFFA4004) // (AES) Mode Register +#define AT91C_AES_VR (0xFFFA40FC) // (AES) AES Version Register +#define AT91C_AES_ODATAxR (0xFFFA4050) // (AES) Output Data x Register +#define AT91C_AES_IDATAxR (0xFFFA4040) // (AES) Input Data x Register +#define AT91C_AES_CR (0xFFFA4000) // (AES) Control Register +#define AT91C_AES_IDR (0xFFFA4014) // (AES) Interrupt Disable Register +#define AT91C_AES_IMR (0xFFFA4018) // (AES) Interrupt Mask Register +#define AT91C_AES_IER (0xFFFA4010) // (AES) Interrupt Enable Register +#define AT91C_AES_KEYWxR (0xFFFA4020) // (AES) Key Word x Register +#define AT91C_AES_ISR (0xFFFA401C) // (AES) Interrupt Status Register +// ========== Register definition for PDC_TDES peripheral ========== +#define AT91C_TDES_RNCR (0xFFFA8114) // (PDC_TDES) Receive Next Counter Register +#define AT91C_TDES_TCR (0xFFFA810C) // (PDC_TDES) Transmit Counter Register +#define AT91C_TDES_RCR (0xFFFA8104) // (PDC_TDES) Receive Counter Register +#define AT91C_TDES_TNPR (0xFFFA8118) // (PDC_TDES) Transmit Next Pointer Register +#define AT91C_TDES_RNPR (0xFFFA8110) // (PDC_TDES) Receive Next Pointer Register +#define AT91C_TDES_RPR (0xFFFA8100) // (PDC_TDES) Receive Pointer Register +#define AT91C_TDES_TNCR (0xFFFA811C) // (PDC_TDES) Transmit Next Counter Register +#define AT91C_TDES_TPR (0xFFFA8108) // (PDC_TDES) Transmit Pointer Register +#define AT91C_TDES_PTSR (0xFFFA8124) // (PDC_TDES) PDC Transfer Status Register +#define AT91C_TDES_PTCR (0xFFFA8120) // (PDC_TDES) PDC Transfer Control Register +// ========== Register definition for TDES peripheral ========== +#define AT91C_TDES_KEY2WxR (0xFFFA8028) // (TDES) Key 2 Word x Register +#define AT91C_TDES_KEY3WxR (0xFFFA8030) // (TDES) Key 3 Word x Register +#define AT91C_TDES_IDR (0xFFFA8014) // (TDES) Interrupt Disable Register +#define AT91C_TDES_VR (0xFFFA80FC) // (TDES) TDES Version Register +#define AT91C_TDES_IVxR (0xFFFA8060) // (TDES) Initialization Vector x Register +#define AT91C_TDES_ODATAxR (0xFFFA8050) // (TDES) Output Data x Register +#define AT91C_TDES_IMR (0xFFFA8018) // (TDES) Interrupt Mask Register +#define AT91C_TDES_MR (0xFFFA8004) // (TDES) Mode Register +#define AT91C_TDES_CR (0xFFFA8000) // (TDES) Control Register +#define AT91C_TDES_IER (0xFFFA8010) // (TDES) Interrupt Enable Register +#define AT91C_TDES_ISR (0xFFFA801C) // (TDES) Interrupt Status Register +#define AT91C_TDES_IDATAxR (0xFFFA8040) // (TDES) Input Data x Register +#define AT91C_TDES_KEY1WxR (0xFFFA8020) // (TDES) Key 1 Word x Register + +// ***************************************************************************** +// PIO DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_PIO_PA0 (1 << 0) // Pin Controlled by PA0 +#define AT91C_PA0_RXD0 (AT91C_PIO_PA0) // USART 0 Receive Data +#define AT91C_PIO_PA1 (1 << 1) // Pin Controlled by PA1 +#define AT91C_PA1_TXD0 (AT91C_PIO_PA1) // USART 0 Transmit Data +#define AT91C_PIO_PA10 (1 << 10) // Pin Controlled by PA10 +#define AT91C_PA10_TWD (AT91C_PIO_PA10) // TWI Two-wire Serial Data +#define AT91C_PIO_PA11 (1 << 11) // Pin Controlled by PA11 +#define AT91C_PA11_TWCK (AT91C_PIO_PA11) // TWI Two-wire Serial Clock +#define AT91C_PIO_PA12 (1 << 12) // Pin Controlled by PA12 +#define AT91C_PA12_NPCS00 (AT91C_PIO_PA12) // SPI 0 Peripheral Chip Select 0 +#define AT91C_PIO_PA13 (1 << 13) // Pin Controlled by PA13 +#define AT91C_PA13_NPCS01 (AT91C_PIO_PA13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PA13_PCK1 (AT91C_PIO_PA13) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PA14 (1 << 14) // Pin Controlled by PA14 +#define AT91C_PA14_NPCS02 (AT91C_PIO_PA14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PA14_IRQ1 (AT91C_PIO_PA14) // External Interrupt 1 +#define AT91C_PIO_PA15 (1 << 15) // Pin Controlled by PA15 +#define AT91C_PA15_NPCS03 (AT91C_PIO_PA15) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PA15_TCLK2 (AT91C_PIO_PA15) // Timer Counter 2 external clock input +#define AT91C_PIO_PA16 (1 << 16) // Pin Controlled by PA16 +#define AT91C_PA16_MISO0 (AT91C_PIO_PA16) // SPI 0 Master In Slave +#define AT91C_PIO_PA17 (1 << 17) // Pin Controlled by PA17 +#define AT91C_PA17_MOSI0 (AT91C_PIO_PA17) // SPI 0 Master Out Slave +#define AT91C_PIO_PA18 (1 << 18) // Pin Controlled by PA18 +#define AT91C_PA18_SPCK0 (AT91C_PIO_PA18) // SPI 0 Serial Clock +#define AT91C_PIO_PA19 (1 << 19) // Pin Controlled by PA19 +#define AT91C_PA19_CANRX (AT91C_PIO_PA19) // CAN Receive +#define AT91C_PIO_PA2 (1 << 2) // Pin Controlled by PA2 +#define AT91C_PA2_SCK0 (AT91C_PIO_PA2) // USART 0 Serial Clock +#define AT91C_PA2_NPCS11 (AT91C_PIO_PA2) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA20 (1 << 20) // Pin Controlled by PA20 +#define AT91C_PA20_CANTX (AT91C_PIO_PA20) // CAN Transmit +#define AT91C_PIO_PA21 (1 << 21) // Pin Controlled by PA21 +#define AT91C_PA21_TF (AT91C_PIO_PA21) // SSC Transmit Frame Sync +#define AT91C_PA21_NPCS10 (AT91C_PIO_PA21) // SPI 1 Peripheral Chip Select 0 +#define AT91C_PIO_PA22 (1 << 22) // Pin Controlled by PA22 +#define AT91C_PA22_TK (AT91C_PIO_PA22) // SSC Transmit Clock +#define AT91C_PA22_SPCK1 (AT91C_PIO_PA22) // SPI 1 Serial Clock +#define AT91C_PIO_PA23 (1 << 23) // Pin Controlled by PA23 +#define AT91C_PA23_TD (AT91C_PIO_PA23) // SSC Transmit data +#define AT91C_PA23_MOSI1 (AT91C_PIO_PA23) // SPI 1 Master Out Slave +#define AT91C_PIO_PA24 (1 << 24) // Pin Controlled by PA24 +#define AT91C_PA24_RD (AT91C_PIO_PA24) // SSC Receive Data +#define AT91C_PA24_MISO1 (AT91C_PIO_PA24) // SPI 1 Master In Slave +#define AT91C_PIO_PA25 (1 << 25) // Pin Controlled by PA25 +#define AT91C_PA25_RK (AT91C_PIO_PA25) // SSC Receive Clock +#define AT91C_PA25_NPCS11 (AT91C_PIO_PA25) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PA26 (1 << 26) // Pin Controlled by PA26 +#define AT91C_PA26_RF (AT91C_PIO_PA26) // SSC Receive Frame Sync +#define AT91C_PA26_NPCS12 (AT91C_PIO_PA26) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA27 (1 << 27) // Pin Controlled by PA27 +#define AT91C_PA27_DRXD (AT91C_PIO_PA27) // DBGU Debug Receive Data +#define AT91C_PA27_PCK3 (AT91C_PIO_PA27) // PMC Programmable Clock Output 3 +#define AT91C_PIO_PA28 (1 << 28) // Pin Controlled by PA28 +#define AT91C_PA28_DTXD (AT91C_PIO_PA28) // DBGU Debug Transmit Data +#define AT91C_PIO_PA29 (1 << 29) // Pin Controlled by PA29 +#define AT91C_PA29_FIQ (AT91C_PIO_PA29) // AIC Fast Interrupt Input +#define AT91C_PA29_NPCS13 (AT91C_PIO_PA29) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA3 (1 << 3) // Pin Controlled by PA3 +#define AT91C_PA3_RTS0 (AT91C_PIO_PA3) // USART 0 Ready To Send +#define AT91C_PA3_NPCS12 (AT91C_PIO_PA3) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PA30 (1 << 30) // Pin Controlled by PA30 +#define AT91C_PA30_IRQ0 (AT91C_PIO_PA30) // External Interrupt 0 +#define AT91C_PA30_PCK2 (AT91C_PIO_PA30) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PA4 (1 << 4) // Pin Controlled by PA4 +#define AT91C_PA4_CTS0 (AT91C_PIO_PA4) // USART 0 Clear To Send +#define AT91C_PA4_NPCS13 (AT91C_PIO_PA4) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PA5 (1 << 5) // Pin Controlled by PA5 +#define AT91C_PA5_RXD1 (AT91C_PIO_PA5) // USART 1 Receive Data +#define AT91C_PIO_PA6 (1 << 6) // Pin Controlled by PA6 +#define AT91C_PA6_TXD1 (AT91C_PIO_PA6) // USART 1 Transmit Data +#define AT91C_PIO_PA7 (1 << 7) // Pin Controlled by PA7 +#define AT91C_PA7_SCK1 (AT91C_PIO_PA7) // USART 1 Serial Clock +#define AT91C_PA7_NPCS01 (AT91C_PIO_PA7) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PA8 (1 << 8) // Pin Controlled by PA8 +#define AT91C_PA8_RTS1 (AT91C_PIO_PA8) // USART 1 Ready To Send +#define AT91C_PA8_NPCS02 (AT91C_PIO_PA8) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PA9 (1 << 9) // Pin Controlled by PA9 +#define AT91C_PA9_CTS1 (AT91C_PIO_PA9) // USART 1 Clear To Send +#define AT91C_PA9_NPCS03 (AT91C_PIO_PA9) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB0 (1 << 0) // Pin Controlled by PB0 +#define AT91C_PB0_ETXCK_EREFCK (AT91C_PIO_PB0) // Ethernet MAC Transmit Clock/Reference Clock +#define AT91C_PB0_PCK0 (AT91C_PIO_PB0) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB1 (1 << 1) // Pin Controlled by PB1 +#define AT91C_PB1_ETXEN (AT91C_PIO_PB1) // Ethernet MAC Transmit Enable +#define AT91C_PIO_PB10 (1 << 10) // Pin Controlled by PB10 +#define AT91C_PB10_ETX2 (AT91C_PIO_PB10) // Ethernet MAC Transmit Data 2 +#define AT91C_PB10_NPCS11 (AT91C_PIO_PB10) // SPI 1 Peripheral Chip Select 1 +#define AT91C_PIO_PB11 (1 << 11) // Pin Controlled by PB11 +#define AT91C_PB11_ETX3 (AT91C_PIO_PB11) // Ethernet MAC Transmit Data 3 +#define AT91C_PB11_NPCS12 (AT91C_PIO_PB11) // SPI 1 Peripheral Chip Select 2 +#define AT91C_PIO_PB12 (1 << 12) // Pin Controlled by PB12 +#define AT91C_PB12_ETXER (AT91C_PIO_PB12) // Ethernet MAC Transmikt Coding Error +#define AT91C_PB12_TCLK0 (AT91C_PIO_PB12) // Timer Counter 0 external clock input +#define AT91C_PIO_PB13 (1 << 13) // Pin Controlled by PB13 +#define AT91C_PB13_ERX2 (AT91C_PIO_PB13) // Ethernet MAC Receive Data 2 +#define AT91C_PB13_NPCS01 (AT91C_PIO_PB13) // SPI 0 Peripheral Chip Select 1 +#define AT91C_PIO_PB14 (1 << 14) // Pin Controlled by PB14 +#define AT91C_PB14_ERX3 (AT91C_PIO_PB14) // Ethernet MAC Receive Data 3 +#define AT91C_PB14_NPCS02 (AT91C_PIO_PB14) // SPI 0 Peripheral Chip Select 2 +#define AT91C_PIO_PB15 (1 << 15) // Pin Controlled by PB15 +#define AT91C_PB15_ERXDV (AT91C_PIO_PB15) // Ethernet MAC Receive Data Valid +#define AT91C_PIO_PB16 (1 << 16) // Pin Controlled by PB16 +#define AT91C_PB16_ECOL (AT91C_PIO_PB16) // Ethernet MAC Collision Detected +#define AT91C_PB16_NPCS13 (AT91C_PIO_PB16) // SPI 1 Peripheral Chip Select 3 +#define AT91C_PIO_PB17 (1 << 17) // Pin Controlled by PB17 +#define AT91C_PB17_ERXCK (AT91C_PIO_PB17) // Ethernet MAC Receive Clock +#define AT91C_PB17_NPCS03 (AT91C_PIO_PB17) // SPI 0 Peripheral Chip Select 3 +#define AT91C_PIO_PB18 (1 << 18) // Pin Controlled by PB18 +#define AT91C_PB18_EF100 (AT91C_PIO_PB18) // Ethernet MAC Force 100 Mbits/sec +#define AT91C_PB18_ADTRG (AT91C_PIO_PB18) // ADC External Trigger +#define AT91C_PIO_PB19 (1 << 19) // Pin Controlled by PB19 +#define AT91C_PB19_PWM0 (AT91C_PIO_PB19) // PWM Channel 0 +#define AT91C_PB19_TCLK1 (AT91C_PIO_PB19) // Timer Counter 1 external clock input +#define AT91C_PIO_PB2 (1 << 2) // Pin Controlled by PB2 +#define AT91C_PB2_ETX0 (AT91C_PIO_PB2) // Ethernet MAC Transmit Data 0 +#define AT91C_PIO_PB20 (1 << 20) // Pin Controlled by PB20 +#define AT91C_PB20_PWM1 (AT91C_PIO_PB20) // PWM Channel 1 +#define AT91C_PB20_PCK0 (AT91C_PIO_PB20) // PMC Programmable Clock Output 0 +#define AT91C_PIO_PB21 (1 << 21) // Pin Controlled by PB21 +#define AT91C_PB21_PWM2 (AT91C_PIO_PB21) // PWM Channel 2 +#define AT91C_PB21_PCK1 (AT91C_PIO_PB21) // PMC Programmable Clock Output 1 +#define AT91C_PIO_PB22 (1 << 22) // Pin Controlled by PB22 +#define AT91C_PB22_PWM3 (AT91C_PIO_PB22) // PWM Channel 3 +#define AT91C_PB22_PCK2 (AT91C_PIO_PB22) // PMC Programmable Clock Output 2 +#define AT91C_PIO_PB23 (1 << 23) // Pin Controlled by PB23 +#define AT91C_PB23_TIOA0 (AT91C_PIO_PB23) // Timer Counter 0 Multipurpose Timer I/O Pin A +#define AT91C_PB23_DCD1 (AT91C_PIO_PB23) // USART 1 Data Carrier Detect +#define AT91C_PIO_PB24 (1 << 24) // Pin Controlled by PB24 +#define AT91C_PB24_TIOB0 (AT91C_PIO_PB24) // Timer Counter 0 Multipurpose Timer I/O Pin B +#define AT91C_PB24_DSR1 (AT91C_PIO_PB24) // USART 1 Data Set ready +#define AT91C_PIO_PB25 (1 << 25) // Pin Controlled by PB25 +#define AT91C_PB25_TIOA1 (AT91C_PIO_PB25) // Timer Counter 1 Multipurpose Timer I/O Pin A +#define AT91C_PB25_DTR1 (AT91C_PIO_PB25) // USART 1 Data Terminal ready +#define AT91C_PIO_PB26 (1 << 26) // Pin Controlled by PB26 +#define AT91C_PB26_TIOB1 (AT91C_PIO_PB26) // Timer Counter 1 Multipurpose Timer I/O Pin B +#define AT91C_PB26_RI1 (AT91C_PIO_PB26) // USART 1 Ring Indicator +#define AT91C_PIO_PB27 (1 << 27) // Pin Controlled by PB27 +#define AT91C_PB27_TIOA2 (AT91C_PIO_PB27) // Timer Counter 2 Multipurpose Timer I/O Pin A +#define AT91C_PB27_PWM0 (AT91C_PIO_PB27) // PWM Channel 0 +#define AT91C_PIO_PB28 (1 << 28) // Pin Controlled by PB28 +#define AT91C_PB28_TIOB2 (AT91C_PIO_PB28) // Timer Counter 2 Multipurpose Timer I/O Pin B +#define AT91C_PB28_PWM1 (AT91C_PIO_PB28) // PWM Channel 1 +#define AT91C_PIO_PB29 (1 << 29) // Pin Controlled by PB29 +#define AT91C_PB29_PCK1 (AT91C_PIO_PB29) // PMC Programmable Clock Output 1 +#define AT91C_PB29_PWM2 (AT91C_PIO_PB29) // PWM Channel 2 +#define AT91C_PIO_PB3 (1 << 3) // Pin Controlled by PB3 +#define AT91C_PB3_ETX1 (AT91C_PIO_PB3) // Ethernet MAC Transmit Data 1 +#define AT91C_PIO_PB30 (1 << 30) // Pin Controlled by PB30 +#define AT91C_PB30_PCK2 (AT91C_PIO_PB30) // PMC Programmable Clock Output 2 +#define AT91C_PB30_PWM3 (AT91C_PIO_PB30) // PWM Channel 3 +#define AT91C_PIO_PB4 (1 << 4) // Pin Controlled by PB4 +#define AT91C_PB4_ECRS_ECRSDV (AT91C_PIO_PB4) // Ethernet MAC Carrier Sense/Carrier Sense and Data Valid +#define AT91C_PIO_PB5 (1 << 5) // Pin Controlled by PB5 +#define AT91C_PB5_ERX0 (AT91C_PIO_PB5) // Ethernet MAC Receive Data 0 +#define AT91C_PIO_PB6 (1 << 6) // Pin Controlled by PB6 +#define AT91C_PB6_ERX1 (AT91C_PIO_PB6) // Ethernet MAC Receive Data 1 +#define AT91C_PIO_PB7 (1 << 7) // Pin Controlled by PB7 +#define AT91C_PB7_ERXER (AT91C_PIO_PB7) // Ethernet MAC Receive Error +#define AT91C_PIO_PB8 (1 << 8) // Pin Controlled by PB8 +#define AT91C_PB8_EMDC (AT91C_PIO_PB8) // Ethernet MAC Management Data Clock +#define AT91C_PIO_PB9 (1 << 9) // Pin Controlled by PB9 +#define AT91C_PB9_EMDIO (AT91C_PIO_PB9) // Ethernet MAC Management Data Input/Output + +// ***************************************************************************** +// PERIPHERAL ID DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ID_FIQ ( 0) // Advanced Interrupt Controller (FIQ) +#define AT91C_ID_SYS ( 1) // System Peripheral +#define AT91C_ID_PIOA ( 2) // Parallel IO Controller A +#define AT91C_ID_PIOB ( 3) // Parallel IO Controller B +#define AT91C_ID_SPI0 ( 4) // Serial Peripheral Interface 0 +#define AT91C_ID_SPI1 ( 5) // Serial Peripheral Interface 1 +#define AT91C_ID_US0 ( 6) // USART 0 +#define AT91C_ID_US1 ( 7) // USART 1 +#define AT91C_ID_SSC ( 8) // Serial Synchronous Controller +#define AT91C_ID_TWI ( 9) // Two-Wire Interface +#define AT91C_ID_PWMC (10) // PWM Controller +#define AT91C_ID_UDP (11) // USB Device Port +#define AT91C_ID_TC0 (12) // Timer Counter 0 +#define AT91C_ID_TC1 (13) // Timer Counter 1 +#define AT91C_ID_TC2 (14) // Timer Counter 2 +#define AT91C_ID_CAN (15) // Control Area Network Controller +#define AT91C_ID_EMAC (16) // Ethernet MAC +#define AT91C_ID_ADC (17) // Analog-to-Digital Converter +#define AT91C_ID_AES (18) // Advanced Encryption Standard 128-bit +#define AT91C_ID_TDES (19) // Triple Data Encryption Standard +#define AT91C_ID_20_Reserved (20) // Reserved +#define AT91C_ID_21_Reserved (21) // Reserved +#define AT91C_ID_22_Reserved (22) // Reserved +#define AT91C_ID_23_Reserved (23) // Reserved +#define AT91C_ID_24_Reserved (24) // Reserved +#define AT91C_ID_25_Reserved (25) // Reserved +#define AT91C_ID_26_Reserved (26) // Reserved +#define AT91C_ID_27_Reserved (27) // Reserved +#define AT91C_ID_28_Reserved (28) // Reserved +#define AT91C_ID_29_Reserved (29) // Reserved +#define AT91C_ID_IRQ0 (30) // Advanced Interrupt Controller (IRQ0) +#define AT91C_ID_IRQ1 (31) // Advanced Interrupt Controller (IRQ1) + +// ***************************************************************************** +// BASE ADDRESS DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_BASE_SYS (0xFFFFF000) // (SYS) Base Address +#define AT91C_BASE_AIC (0xFFFFF000) // (AIC) Base Address +#define AT91C_BASE_PDC_DBGU (0xFFFFF300) // (PDC_DBGU) Base Address +#define AT91C_BASE_DBGU (0xFFFFF200) // (DBGU) Base Address +#define AT91C_BASE_PIOA (0xFFFFF400) // (PIOA) Base Address +#define AT91C_BASE_PIOB (0xFFFFF600) // (PIOB) Base Address +#define AT91C_BASE_CKGR (0xFFFFFC20) // (CKGR) Base Address +#define AT91C_BASE_PMC (0xFFFFFC00) // (PMC) Base Address +#define AT91C_BASE_RSTC (0xFFFFFD00) // (RSTC) Base Address +#define AT91C_BASE_RTTC (0xFFFFFD20) // (RTTC) Base Address +#define AT91C_BASE_PITC (0xFFFFFD30) // (PITC) Base Address +#define AT91C_BASE_WDTC (0xFFFFFD40) // (WDTC) Base Address +#define AT91C_BASE_VREG (0xFFFFFD60) // (VREG) Base Address +#define AT91C_BASE_MC (0xFFFFFF00) // (MC) Base Address +#define AT91C_BASE_PDC_SPI1 (0xFFFE4100) // (PDC_SPI1) Base Address +#define AT91C_BASE_SPI1 (0xFFFE4000) // (SPI1) Base Address +#define AT91C_BASE_PDC_SPI0 (0xFFFE0100) // (PDC_SPI0) Base Address +#define AT91C_BASE_SPI0 (0xFFFE0000) // (SPI0) Base Address +#define AT91C_BASE_PDC_US1 (0xFFFC4100) // (PDC_US1) Base Address +#define AT91C_BASE_US1 (0xFFFC4000) // (US1) Base Address +#define AT91C_BASE_PDC_US0 (0xFFFC0100) // (PDC_US0) Base Address +#define AT91C_BASE_US0 (0xFFFC0000) // (US0) Base Address +#define AT91C_BASE_PDC_SSC (0xFFFD4100) // (PDC_SSC) Base Address +#define AT91C_BASE_SSC (0xFFFD4000) // (SSC) Base Address +#define AT91C_BASE_TWI (0xFFFB8000) // (TWI) Base Address +#define AT91C_BASE_PWMC_CH3 (0xFFFCC260) // (PWMC_CH3) Base Address +#define AT91C_BASE_PWMC_CH2 (0xFFFCC240) // (PWMC_CH2) Base Address +#define AT91C_BASE_PWMC_CH1 (0xFFFCC220) // (PWMC_CH1) Base Address +#define AT91C_BASE_PWMC_CH0 (0xFFFCC200) // (PWMC_CH0) Base Address +#define AT91C_BASE_PWMC (0xFFFCC000) // (PWMC) Base Address +#define AT91C_BASE_UDP (0xFFFB0000) // (UDP) Base Address +#define AT91C_BASE_TC0 (0xFFFA0000) // (TC0) Base Address +#define AT91C_BASE_TC1 (0xFFFA0040) // (TC1) Base Address +#define AT91C_BASE_TC2 (0xFFFA0080) // (TC2) Base Address +#define AT91C_BASE_TCB (0xFFFA0000) // (TCB) Base Address +#define AT91C_BASE_CAN_MB0 (0xFFFD0200) // (CAN_MB0) Base Address +#define AT91C_BASE_CAN_MB1 (0xFFFD0220) // (CAN_MB1) Base Address +#define AT91C_BASE_CAN_MB2 (0xFFFD0240) // (CAN_MB2) Base Address +#define AT91C_BASE_CAN_MB3 (0xFFFD0260) // (CAN_MB3) Base Address +#define AT91C_BASE_CAN_MB4 (0xFFFD0280) // (CAN_MB4) Base Address +#define AT91C_BASE_CAN_MB5 (0xFFFD02A0) // (CAN_MB5) Base Address +#define AT91C_BASE_CAN_MB6 (0xFFFD02C0) // (CAN_MB6) Base Address +#define AT91C_BASE_CAN_MB7 (0xFFFD02E0) // (CAN_MB7) Base Address +#define AT91C_BASE_CAN (0xFFFD0000) // (CAN) Base Address +#define AT91C_BASE_EMAC (0xFFFDC000) // (EMAC) Base Address +#define AT91C_BASE_PDC_ADC (0xFFFD8100) // (PDC_ADC) Base Address +#define AT91C_BASE_ADC (0xFFFD8000) // (ADC) Base Address +#define AT91C_BASE_PDC_AES (0xFFFA4100) // (PDC_AES) Base Address +#define AT91C_BASE_AES (0xFFFA4000) // (AES) Base Address +#define AT91C_BASE_PDC_TDES (0xFFFA8100) // (PDC_TDES) Base Address +#define AT91C_BASE_TDES (0xFFFA8000) // (TDES) Base Address + +// ***************************************************************************** +// MEMORY MAPPING DEFINITIONS FOR AT91SAM7X256 +// ***************************************************************************** +#define AT91C_ISRAM (0x00200000) // Internal SRAM base address +#define AT91C_ISRAM_SIZE (0x00010000) // Internal SRAM size in byte (64 Kbyte) +#define AT91C_IFLASH (0x00100000) // Internal ROM base address +#define AT91C_IFLASH_SIZE (0x00040000) // Internal ROM size in byte (256 Kbyte) + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/ISR_Support.h new file mode 100644 index 0000000..9167d85 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/ISR_Support.h @@ -0,0 +1,106 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h new file mode 100644 index 0000000..3f1634d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h @@ -0,0 +1,3265 @@ +//*---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//*---------------------------------------------------------------------------- +//* The software is delivered "AS IS" without warranty or condition of any +//* kind, either express, implied or statutory. This includes without +//* limitation any warranty or condition with respect to merchantability or +//* fitness for any particular purpose, or against the infringements of +//* intellectual property rights of others. +//*---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7S64.h +//* Object : AT91SAM7S64 inlined functions +//* Generated : AT91 SW Application Group 07/16/2004 (07:43:09) +//* +//* CVS Reference : /lib_MC_SAM.h/1.3/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pdc_1363d.h/1.2/Wed Feb 19 09:25:22 2003// +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 13:23:52 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_pmc_SAM.h/1.6/Tue Apr 27 13:53:52 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 08:12:38 2003// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_twi.h/1.2/Fri Jan 31 12:19:38 2003// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_udp.h/1.3/Fri Jan 31 12:19:48 2003// +//* CVS Reference : /lib_aic.h/1.3/Fri Jul 12 07:46:12 2002// +//*---------------------------------------------------------------------------- + +#ifndef lib_AT91SAM7S64_H +#define lib_AT91SAM7S64_H + +/* ***************************************************************************** + SOFTWARE API FOR MC + ***************************************************************************** */ + +#define AT91C_MC_CORRECT_KEY ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_Remap +//* \brief Make Remap +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_Remap (void) // +{ + AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC; + + pMC->MC_RCR = AT91C_MC_RCB; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_CfgModeReg +//* \brief Configure the EFC Mode Register of the MC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_CfgModeReg ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int mode) // mode register +{ + // Write to the FMR register + pMC->MC_FMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetModeReg +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetModeReg( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_ComputeFMCN +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_ComputeFMCN( + int master_clock) // master clock in Hz +{ + return (master_clock/1000000 +2); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_PerformCmd +//* \brief Perform EFC Command +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_PerformCmd ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int transfer_cmd) +{ + pMC->MC_FCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetStatus +//* \brief Return MC EFC Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetStatus( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptMasked +//* \brief Test if EFC MC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptMasked( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetModeReg(pMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptSet +//* \brief Test if EFC MC Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptSet( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetStatus(pMC) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PDC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextRx +//* \brief Set the next receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RNPR = (unsigned int) address; + pPDC->PDC_RNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextTx +//* \brief Set the next transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TNPR = (unsigned int) address; + pPDC->PDC_TNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetRx +//* \brief Set the receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RPR = (unsigned int) address; + pPDC->PDC_RCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetTx +//* \brief Set the transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TPR = (unsigned int) address; + pPDC->PDC_TCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableTx +//* \brief Enable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableRx +//* \brief Enable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableTx +//* \brief Disable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableRx +//* \brief Disable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsTxEmpty +//* \brief Test if the current transfer descriptor has been sent +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextTxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsRxEmpty +//* \brief Test if the current transfer descriptor has been filled +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextRxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Open +//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Open ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + + //* Enable the RX and TX PDC transfer requests + AT91F_PDC_EnableRx(pPDC); + AT91F_PDC_EnableTx(pPDC); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Close +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Close ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SendFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_SendFrame( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsTxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextTxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_ReceiveFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_ReceiveFrame ( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsRxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} +/* ***************************************************************************** + SOFTWARE API FOR DBGU + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptEnable +//* \brief Enable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptEnable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be enabled +{ + pDbgu->DBGU_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptDisable +//* \brief Disable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptDisable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be disabled +{ + pDbgu->DBGU_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_GetInterruptMaskStatus +//* \brief Return DBGU Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status + AT91PS_DBGU pDbgu) // \arg pointer to a DBGU controller +{ + return pDbgu->DBGU_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_IsInterruptMasked +//* \brief Test if DBGU Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_DBGU_IsInterruptMasked( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SSC + ***************************************************************************** */ +//* Define the standard I2S mode configuration + +//* Configuration to set in the SSC Transmit Clock Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + AT91C_SSC_CKS_DIV +\ + AT91C_SSC_CKO_CONTINOUS +\ + AT91C_SSC_CKG_NONE +\ + AT91C_SSC_START_FALL_RF +\ + AT91C_SSC_STTOUT +\ + ((1<<16) & AT91C_SSC_STTDLY) +\ + ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24)) + + +//* Configuration to set in the SSC Transmit Frame Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + (nb_bit_by_slot-1) +\ + AT91C_SSC_MSBF +\ + (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB) +\ + (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\ + AT91C_SSC_FSOS_NEGATIVE) + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_SetBaudrate ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg SSC baudrate +{ + unsigned int baud_value; + //* Define the baud rate divisor register + if (speed == 0) + baud_value = 0; + else + { + baud_value = (unsigned int) (mainClock * 10)/(2*speed); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + } + + pSSC->SSC_CMR = baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_Configure +//* \brief Configure SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_Configure ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int syst_clock, // \arg System Clock Frequency + unsigned int baud_rate, // \arg Expected Baud Rate Frequency + unsigned int clock_rx, // \arg Receiver Clock Parameters + unsigned int mode_rx, // \arg mode Register to be programmed + unsigned int clock_tx, // \arg Transmitter Clock Parameters + unsigned int mode_tx) // \arg mode Register to be programmed +{ + //* Disable interrupts + pSSC->SSC_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; + + //* Define the Clock Mode Register + AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate); + + //* Write the Receive Clock Mode Register + pSSC->SSC_RCMR = clock_rx; + + //* Write the Transmit Clock Mode Register + pSSC->SSC_TCMR = clock_tx; + + //* Write the Receive Frame Mode Register + pSSC->SSC_RFMR = mode_rx; + + //* Write the Transmit Frame Mode Register + pSSC->SSC_TFMR = mode_tx; + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR)); + + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableRx +//* \brief Enable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable receiver + pSSC->SSC_CR = AT91C_SSC_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableRx +//* \brief Disable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable receiver + pSSC->SSC_CR = AT91C_SSC_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableTx +//* \brief Enable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable transmitter + pSSC->SSC_CR = AT91C_SSC_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableTx +//* \brief Disable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable transmitter + pSSC->SSC_CR = AT91C_SSC_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableIt +//* \brief Enable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pSSC->SSC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableIt +//* \brief Disable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pSSC->SSC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_ReceiveFrame ( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_SendFrame( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_GetInterruptMaskStatus +//* \brief Return SSC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status + AT91PS_SSC pSsc) // \arg pointer to a SSC controller +{ + return pSsc->SSC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_IsInterruptMasked +//* \brief Test if SSC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SSC_IsInterruptMasked( + AT91PS_SSC pSsc, // \arg pointer to a SSC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SPI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Open +//* \brief Open a SPI Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgCs +//* \brief Configure SPI chip select register +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgCs ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int cs, // SPI cs number (0 to 3) + int val) // chip select register +{ + //* Write to the CSR register + *(pSPI->SPI_CSR + cs) = val; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_EnableIt +//* \brief Enable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_EnableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pSPI->SPI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_DisableIt +//* \brief Disable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_DisableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pSPI->SPI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Reset +//* \brief Reset the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Reset ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Enable +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Enable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Disable +//* \brief Disable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Disable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgMode +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgMode ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int mode) // mode register +{ + //* Write to the MR register + pSPI->SPI_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPCS +//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPCS ( + AT91PS_SPI pSPI, // pointer to a SPI controller + char PCS_Device) // PCS of the Device +{ + //* Write to the MR register + pSPI->SPI_MR &= 0xFFF0FFFF; + pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_ReceiveFrame ( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_SendFrame( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Close +//* \brief Close SPI: disable IT disable transfert, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Close ( + AT91PS_SPI pSPI) // \arg pointer to a SPI controller +{ + //* Reset all the Chip Select register + pSPI->SPI_CSR[0] = 0 ; + pSPI->SPI_CSR[1] = 0 ; + pSPI->SPI_CSR[2] = 0 ; + pSPI->SPI_CSR[3] = 0 ; + + //* Reset the SPI mode + pSPI->SPI_MR = 0 ; + + //* Disable all interrupts + pSPI->SPI_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_PutChar ( + AT91PS_SPI pSPI, + unsigned int character, + unsigned int cs_number ) +{ + unsigned int value_for_cs; + value_for_cs = (~(1 << cs_number)) & 0xF; //Place a zero among a 4 ONEs number + pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_GetChar ( + const AT91PS_SPI pSPI) +{ + return((pSPI->SPI_RDR) & 0xFFFF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetInterruptMaskStatus +//* \brief Return SPI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status + AT91PS_SPI pSpi) // \arg pointer to a SPI controller +{ + return pSpi->SPI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_IsInterruptMasked +//* \brief Test if SPI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_IsInterruptMasked( + AT91PS_SPI pSpi, // \arg pointer to a SPI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PWMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetStatus +//* \brief Return PWM Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status + AT91PS_PWMC pPWM) // pointer to a PWM controller +{ + return pPWM->PWMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptEnable +//* \brief Enable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptEnable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be enabled +{ + pPwm->PWMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptDisable +//* \brief Disable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptDisable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be disabled +{ + pPwm->PWMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetInterruptMaskStatus +//* \brief Return PWM Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status + AT91PS_PWMC pPwm) // \arg pointer to a PWM controller +{ + return pPwm->PWMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsInterruptMasked +//* \brief Test if PWM Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsInterruptMasked( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsStatusSet +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsStatusSet( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_CfgChannel +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int mode, // \arg PWM mode + unsigned int period, // \arg PWM period + unsigned int duty) // \arg PWM duty cycle +{ + pPWM->PWMC_CH[channelId].PWMC_CMR = mode; + pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty; + pPWM->PWMC_CH[channelId].PWMC_CPRDR = period; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StartChannel +//* \brief Enable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StartChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_ENA = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StopChannel +//* \brief Disable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StopChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_DIS = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_UpdateChannel +//* \brief Update Period or Duty Cycle +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_UpdateChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int update) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_CH[channelId].PWMC_CUPDR = update; +} + +/* ***************************************************************************** + SOFTWARE API FOR TC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptEnable +//* \brief Enable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptEnable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be enabled +{ + pTc->TC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptDisable +//* \brief Disable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptDisable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be disabled +{ + pTc->TC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_GetInterruptMaskStatus +//* \brief Return TC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status + AT91PS_TC pTc) // \arg pointer to a TC controller +{ + return pTc->TC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_IsInterruptMasked +//* \brief Test if TC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TC_IsInterruptMasked( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkEnableReg +//* \brief Configure the System Clock Enable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkEnableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCER register + pPMC->PMC_SCER = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkDisableReg +//* \brief Configure the System Clock Disable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkDisableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCDR register + pPMC->PMC_SCDR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetSysClkStatusReg +//* \brief Return the System Clock Status Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetSysClkStatusReg ( + AT91PS_PMC pPMC // pointer to a CAN controller + ) +{ + return pPMC->PMC_SCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePeriphClock +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCER = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePeriphClock +//* \brief Disable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCDR = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetPeriphClock +//* \brief Get peripheral clock status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetPeriphClock ( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_PCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscillatorReg ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int mode) +{ + pCKGR->CKGR_MOR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainOscillatorReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MOR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_EnableMainOscillator +//* \brief Enable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_EnableMainOscillator( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_DisableMainOscillator +//* \brief Disable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_DisableMainOscillator ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscStartUpTime +//* \brief Cfg MOR Register according to the main osc startup time +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscStartUpTime ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int startup_time, // \arg main osc startup time in microsecond (us) + unsigned int slowClock) // \arg slowClock in Hz +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT; + pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClockFreqReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClockFreqReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MCFR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClock +//* \brief Return Main clock in Hz +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClock ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + return ((pCKGR->CKGR_MCFR & AT91C_CKGR_MAINF) * slowClock) >> 4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgMCKReg +//* \brief Cfg Master Clock Register +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgMCKReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + pPMC->PMC_MCKR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetMCKReg +//* \brief Return Master Clock Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetMCKReg( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_MCKR; +} + +//*------------------------------------------------------------------------------ +//* \fn AT91F_PMC_GetMasterClock +//* \brief Return master clock in Hz which correponds to processor clock for ARM7 +//*------------------------------------------------------------------------------ +__inline unsigned int AT91F_PMC_GetMasterClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + unsigned int reg = pPMC->PMC_MCKR; + unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2)); + unsigned int pllDivider, pllMultiplier; + + switch (reg & AT91C_PMC_CSS) { + case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected + return slowClock / prescaler; + case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler; + case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected + reg = pCKGR->CKGR_PLLR; + pllDivider = (reg & AT91C_CKGR_DIV); + pllMultiplier = ((reg & AT91C_CKGR_MUL) >> 16) + 1; + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler; + } + return 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck, // \arg Peripheral clock identifier 0 .. 7 + unsigned int mode) +{ + pPMC->PMC_PCKR[pck] = mode; + pPMC->PMC_SCER = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck) // \arg Peripheral clock identifier 0 .. 7 +{ + pPMC->PMC_SCDR = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnableIt +//* \brief Enable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pPMC->PMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisableIt +//* \brief Disable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pPMC->PMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetStatus +//* \brief Return PMC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetInterruptMaskStatus +//* \brief Return PMC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsInterruptMasked +//* \brief Test if PMC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsInterruptMasked( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsStatusSet +//* \brief Test if PMC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsStatusSet( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetStatus(pPMC) & flag); +}/* ***************************************************************************** + SOFTWARE API FOR ADC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableIt +//* \brief Enable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pADC->ADC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableIt +//* \brief Disable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pADC->ADC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetStatus +//* \brief Return ADC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetInterruptMaskStatus +//* \brief Return ADC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsInterruptMasked +//* \brief Test if ADC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsInterruptMasked( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsStatusSet +//* \brief Test if ADC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsStatusSet( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgModeReg +//* \brief Configure the Mode Register of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgModeReg ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pADC->ADC_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetModeReg +//* \brief Return the Mode Register of the ADC controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetModeReg ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgTimings +//* \brief Configure the different necessary timings of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgTimings ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mck_clock, // in MHz + unsigned int adc_clock, // in MHz + unsigned int startup_time, // in us + unsigned int sample_and_hold_time) // in ns +{ + unsigned int prescal,startup,shtim; + + prescal = mck_clock/(2*adc_clock) - 1; + startup = adc_clock*startup_time/8 - 1; + shtim = adc_clock*sample_and_hold_time/1000 - 1; + + //* Write to the MR register + pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHER register + pADC->ADC_CHER = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHDR register + pADC->ADC_CHDR = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetChannelStatus +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetChannelStatus ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CHSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_StartConversion +//* \brief Software request for a analog to digital conversion +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_StartConversion ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_SoftReset +//* \brief Software reset +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_SoftReset ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetLastConvertedData +//* \brief Return the Last Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetLastConvertedData ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_LCDR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH0 +//* \brief Return the Channel 0 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH0 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH1 +//* \brief Return the Channel 1 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH1 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR1; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH2 +//* \brief Return the Channel 2 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH2 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR2; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH3 +//* \brief Return the Channel 3 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH3 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR3; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH4 +//* \brief Return the Channel 4 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH4 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH5 +//* \brief Return the Channel 5 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH5 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR5; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH6 +//* \brief Return the Channel 6 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH6 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR6; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH7 +//* \brief Return the Channel 7 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH7 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR7; +} + +/* ***************************************************************************** + SOFTWARE API FOR PIO + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPeriph +//* \brief Enable pins to be drived by peripheral +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPeriph( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int periphAEnable, // \arg PERIPH A to enable + unsigned int periphBEnable) // \arg PERIPH B to enable + +{ + pPio->PIO_ASR = periphAEnable; + pPio->PIO_BSR = periphBEnable; + pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOutput +//* \brief Enable PIO in output mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pioEnable) // \arg PIO to be enabled +{ + pPio->PIO_PER = pioEnable; // Set in PIO mode + pPio->PIO_OER = pioEnable; // Configure in Output +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInput +//* \brief Enable PIO in input mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputEnable) // \arg PIO to be enabled +{ + // Disable output + pPio->PIO_ODR = inputEnable; + pPio->PIO_PER = inputEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOpendrain +//* \brief Configure PIO in open drain +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOpendrain( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int multiDrvEnable) // \arg pio to be configured in open drain +{ + // Configure the multi-drive option + pPio->PIO_MDDR = ~multiDrvEnable; + pPio->PIO_MDER = multiDrvEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPullup +//* \brief Enable pullup on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPullup( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pullupEnable) // \arg enable pullup on PIO +{ + // Connect or not Pullup + pPio->PIO_PPUDR = ~pullupEnable; + pPio->PIO_PPUER = pullupEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgDirectDrive +//* \brief Enable direct drive on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgDirectDrive( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int directDrive) // \arg PIO to be configured with direct drive + +{ + // Configure the Direct Drive + pPio->PIO_OWDR = ~directDrive; + pPio->PIO_OWER = directDrive; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInputFilter +//* \brief Enable input filter on input PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInputFilter( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputFilter) // \arg PIO to be configured with input filter + +{ + // Configure the Direct Drive + pPio->PIO_IFDR = ~inputFilter; + pPio->PIO_IFER = inputFilter; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInput +//* \brief Return PIO input value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInput( // \return PIO input + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputSet +//* \brief Test if PIO is input flag is active +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInput(pPio) & flag); +} + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_SetOutput +//* \brief Set to 1 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_SetOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be set +{ + pPio->PIO_SODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ClearOutput +//* \brief Set to 0 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ClearOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be cleared +{ + pPio->PIO_CODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ForceOutput +//* \brief Force output when Direct drive option is enabled +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ForceOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be forced +{ + pPio->PIO_ODSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Enable +//* \brief Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Enable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_PER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Disable +//* \brief Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Disable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_PDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetStatus +//* \brief Return PIO Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsSet +//* \brief Test if PIO is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputEnable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be enabled +{ + pPio->PIO_OER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputDisable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be disabled +{ + pPio->PIO_ODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputStatus +//* \brief Return PIO Output Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOuputSet +//* \brief Test if PIO Output is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterEnable +//* \brief Input Filter Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be enabled +{ + pPio->PIO_IFER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterDisable +//* \brief Input Filter Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be disabled +{ + pPio->PIO_IFDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInputFilterStatus +//* \brief Return PIO Input Filter Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IFSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputFilterSet +//* \brief Test if PIO Input filter is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputFilterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInputFilterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputDataStatus +//* \brief Return PIO Output Data Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ODSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptEnable +//* \brief Enable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be enabled +{ + pPio->PIO_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptDisable +//* \brief Disable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be disabled +{ + pPio->PIO_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptMaskStatus +//* \brief Return PIO Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptMasked +//* \brief Test if PIO Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptMasked( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptSet +//* \brief Test if PIO Interrupt is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverEnable +//* \brief Multi Driver Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_MDER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverDisable +//* \brief Multi Driver Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_MDDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetMultiDriverStatus +//* \brief Return PIO Multi Driver Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_MDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsMultiDriverSet +//* \brief Test if PIO MultiDriver is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsMultiDriverSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_A_RegisterSelection +//* \brief PIO A Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_A_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio A register selection +{ + pPio->PIO_ASR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_B_RegisterSelection +//* \brief PIO B Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_B_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio B register selection +{ + pPio->PIO_BSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Get_AB_RegisterStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ABSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsAB_RegisterSet +//* \brief Test if PIO AB Register is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsAB_RegisterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteEnable +//* \brief Output Write Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be enabled +{ + pPio->PIO_OWER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteDisable +//* \brief Output Write Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be disabled +{ + pPio->PIO_OWDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputWriteStatus +//* \brief Return PIO Output Write Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OWSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputWriteSet +//* \brief Test if PIO OutputWrite is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputWriteSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetCfgPullup +//* \brief Return PIO Configuration Pullup +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PPUSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputDataStatusSet +//* \brief Test if PIO Output Data Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputDataStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputDataStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsCfgPullupStatusSet +//* \brief Test if PIO Configuration Pullup Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsCfgPullupStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (~AT91F_PIO_GetCfgPullup(pPio) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TWI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_EnableIt +//* \brief Enable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_EnableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pTWI->TWI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_DisableIt +//* \brief Disable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_DisableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pTWI->TWI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_Configure +//* \brief Configure TWI in master mode +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller +{ + //* Disable interrupts + pTWI->TWI_IDR = (unsigned int) -1; + + //* Reset peripheral + pTWI->TWI_CR = AT91C_TWI_SWRST; + + //* Set Master mode + pTWI->TWI_CR = AT91C_TWI_MSEN | AT91C_TWI_SVDIS; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_GetInterruptMaskStatus +//* \brief Return TWI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status + AT91PS_TWI pTwi) // \arg pointer to a TWI controller +{ + return pTwi->TWI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_IsInterruptMasked +//* \brief Test if TWI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TWI_IsInterruptMasked( + AT91PS_TWI pTwi, // \arg pointer to a TWI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR USART + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Calculate the baudrate +//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_EXT ) + +//* Standard Synchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \ + AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* SCK used Label +#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT) + +//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity +#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \ + AT91C_US_CLKS_CLOCK +\ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_EVEN + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CKLO +\ + AT91C_US_OVER) + +//* Standard IRDA mode +#define AT91C_US_ASYNC_IRDA_MODE ( AT91C_US_USMODE_IRDA + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Caluculate baud_value according to the main clock and the baud rate +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Baudrate ( + const unsigned int main_clock, // \arg peripheral clock + const unsigned int baud_rate) // \arg UART baudrate +{ + unsigned int baud_value = ((main_clock*10)/(baud_rate * 16)); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + return baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetBaudrate ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg UART baudrate +{ + //* Define the baud rate divisor register + pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetTimeguard +//* \brief Set USART timeguard +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetTimeguard ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int timeguard) // \arg timeguard value +{ + //* Write the Timeguard Register + pUSART->US_TTGR = timeguard ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableIt +//* \brief Enable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUSART->US_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableIt +//* \brief Disable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IER register + pUSART->US_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Configure +//* \brief Configure USART +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Configure ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int mode , // \arg mode Register to be programmed + unsigned int baudRate , // \arg baudrate to be programmed + unsigned int timeguard ) // \arg timeguard to be programmed +{ + //* Disable interrupts + pUSART->US_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; + + //* Define the baud rate divisor register + AT91F_US_SetBaudrate(pUSART, mainClock, baudRate); + + //* Write the Timeguard Register + AT91F_US_SetTimeguard(pUSART, timeguard); + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Define the USART mode + pUSART->US_MR = mode ; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableRx +//* \brief Enable receiving characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableTx +//* \brief Enable sending characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetRx +//* \brief Reset Receiver and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset receiver + pUSART->US_CR = AT91C_US_RSTRX; + //* Re-Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetTx +//* \brief Reset Transmitter and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset transmitter + pUSART->US_CR = AT91C_US_RSTTX; + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableRx +//* \brief Disable Receiver +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable receiver + pUSART->US_CR = AT91C_US_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableTx +//* \brief Disable Transmitter +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable transmitter + pUSART->US_CR = AT91C_US_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Close +//* \brief Close USART: disable IT disable receiver and transmitter, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Close ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset the baud rate divisor register + pUSART->US_BRGR = 0 ; + + //* Reset the USART mode + pUSART->US_MR = 0 ; + + //* Reset the Timeguard Register + pUSART->US_TTGR = 0; + + //* Disable all interrupts + pUSART->US_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_TxReady +//* \brief Return 1 if a character can be written in US_THR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_TxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_TXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_RxReady +//* \brief Return 1 if a character can be read in US_RHR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_RxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_RXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Error +//* \brief Return the error flag +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Error ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & + (AT91C_US_OVRE | // Overrun error + AT91C_US_FRAME | // Framing error + AT91C_US_PARE)); // Parity error +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_US_PutChar ( + AT91PS_USART pUSART, + int character ) +{ + pUSART->US_THR = (character & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_US_GetChar ( + const AT91PS_USART pUSART) +{ + return((pUSART->US_RHR) & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_SendFrame( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_ReceiveFrame ( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetIrdaFilter +//* \brief Set the value of IrDa filter tregister +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetIrdaFilter ( + AT91PS_USART pUSART, + unsigned char value +) +{ + pUSART->US_IF = value; +} + +/* ***************************************************************************** + SOFTWARE API FOR UDP + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableIt +//* \brief Enable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUDP->UDP_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableIt +//* \brief Disable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pUDP->UDP_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetAddress +//* \brief Set UDP functional address +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetAddress ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char address) // \arg new UDP address +{ + pUDP->UDP_FADDR = (AT91C_UDP_FEN | address); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg endpoints to be enabled +{ + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg endpoints to be enabled +{ + pUDP->UDP_GLBSTATE &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetState +//* \brief Set UDP Device state +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetState ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg new UDP address +{ + pUDP->UDP_GLBSTATE &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG); + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetState +//* \brief return UDP Device state +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state + AT91PS_UDP pUDP) // \arg pointer to a UDP controller +{ + return (pUDP->UDP_GLBSTATE & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_ResetEp +//* \brief Reset UDP endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_ResetEp ( // \return the UDP device state + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg Endpoints to be reset +{ + pUDP->UDP_RSTEP = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStall +//* \brief Endpoint will STALL requests +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpStall( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpWrite +//* \brief Write value in the DPR +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpWrite( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned char value) // \arg value to be written in the DPR +{ + pUDP->UDP_FDR[endpoint] = value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpRead +//* \brief Return value from the DPR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpRead( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_FDR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpEndOfWr +//* \brief Notify the UDP that values in DPR are ready to be sent +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpEndOfWr( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpClear +//* \brief Clear flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpClear( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpSet +//* \brief Set flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpSet( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStatus +//* \brief Return the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpStatus( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_CSR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetInterruptMaskStatus +//* \brief Return UDP Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status + AT91PS_UDP pUdp) // \arg pointer to a UDP controller +{ + return pUdp->UDP_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_IsInterruptMasked +//* \brief Test if UDP Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_UDP_IsInterruptMasked( + AT91PS_UDP pUdp, // \arg pointer to a UDP controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR AIC + ***************************************************************************** */ +#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20] + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_ConfigureIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id, // \arg interrupt number to initialize + unsigned int priority, // \arg priority to give to the interrupt + unsigned int src_type, // \arg activation and sense of activation + void (*newHandler) (void) ) // \arg address of the interrupt handler +{ + unsigned int oldHandler; + unsigned int mask ; + + oldHandler = pAic->AIC_SVR[irq_id]; + + mask = 0x1 << irq_id ; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Save the interrupt handler routine pointer and the interrupt priority + pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; + //* Store the Source Mode Register + pAic->AIC_SMR[irq_id] = src_type | priority ; + //* Clear the interrupt on the interrupt controller + pAic->AIC_ICCR = mask ; + + return oldHandler; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_EnableIt +//* \brief Enable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_EnableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + //* Enable the interrupt on the interrupt controller + pAic->AIC_IECR = 0x1 << irq_id ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_DisableIt +//* \brief Disable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_DisableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + unsigned int mask = 0x1 << irq_id; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = mask ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ClearIt +//* \brief Clear corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_ClearIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number to initialize +{ + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = (0x1 << irq_id); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_AcknowledgeIt +//* \brief Acknowledge corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_AcknowledgeIt ( + AT91PS_AIC pAic) // \arg pointer to the AIC registers +{ + pAic->AIC_EOICR = pAic->AIC_EOICR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_SetExceptionVector +//* \brief Configure vector handler +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_SetExceptionVector ( + unsigned int *pVector, // \arg pointer to the AIC registers + void (*Handler) () ) // \arg Interrupt Handler +{ + unsigned int oldVector = *pVector; + + if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) + *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; + else + *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000; + + return oldVector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Trig +//* \brief Trig an IT +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Trig ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number +{ + pAic->AIC_ISCR = (0x1 << irq_id) ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsActive +//* \brief Test if an IT is active +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsActive ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_ISR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsPending +//* \brief Test if an IT is pending +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsPending ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_IPR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Open +//* \brief Set exception vectors and AIC registers to default values +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Open( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + void (*IrqHandler) (), // \arg Default IRQ vector exception + void (*FiqHandler) (), // \arg Default FIQ vector exception + void (*DefaultHandler) (), // \arg Default Handler set in ISR + void (*SpuriousHandler) (), // \arg Default Spurious Handler + unsigned int protectMode) // \arg Debug Control Register +{ + int i; + + // Disable all interrupts and set IVR to the default handler + for (i = 0; i < 32; ++i) { + AT91F_AIC_DisableIt(pAic, i); + AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, DefaultHandler); + } + + // Set the IRQ exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler); + // Set the Fast Interrupt exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler); + + pAic->AIC_SPU = (unsigned int) SpuriousHandler; + pAic->AIC_DCR = protectMode; +} +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_CfgPMC +//* \brief Enable Peripheral clock in PMC for MC +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPMC +//* \brief Enable Peripheral clock in PMC for DBGU +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPIO +//* \brief Configure PIO controllers to drive DBGU signals +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA10_DTXD ) | + ((unsigned int) AT91C_PA9_DRXD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH3_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH3 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH3_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA14_PWM3 ) | + ((unsigned int) AT91C_PA7_PWM3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH2_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA2_PWM2 ), // Peripheral A + ((unsigned int) AT91C_PA25_PWM2 ) | + ((unsigned int) AT91C_PA13_PWM2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH1_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA1_PWM1 ), // Peripheral A + ((unsigned int) AT91C_PA24_PWM1 ) | + ((unsigned int) AT91C_PA12_PWM1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH0_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA0_PWM0 ), // Peripheral A + ((unsigned int) AT91C_PA23_PWM0 ) | + ((unsigned int) AT91C_PA11_PWM0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPMC +//* \brief Enable Peripheral clock in PMC for SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SSC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPIO +//* \brief Configure PIO controllers to drive SSC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA17_TD ) | + ((unsigned int) AT91C_PA15_TF ) | + ((unsigned int) AT91C_PA19_RK ) | + ((unsigned int) AT91C_PA18_RD ) | + ((unsigned int) AT91C_PA20_RF ) | + ((unsigned int) AT91C_PA16_TK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPIO +//* \brief Configure PIO controllers to drive SPI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA11_NPCS0 ) | + ((unsigned int) AT91C_PA13_MOSI ) | + ((unsigned int) AT91C_PA31_NPCS1 ) | + ((unsigned int) AT91C_PA12_MISO ) | + ((unsigned int) AT91C_PA14_SPCK ), // Peripheral A + ((unsigned int) AT91C_PA9_NPCS1 ) | + ((unsigned int) AT91C_PA30_NPCS2 ) | + ((unsigned int) AT91C_PA10_NPCS2 ) | + ((unsigned int) AT91C_PA22_NPCS3 ) | + ((unsigned int) AT91C_PA3_NPCS3 ) | + ((unsigned int) AT91C_PA5_NPCS3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PWMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PWMC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC2 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC2)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPIO +//* \brief Configure PIO controllers to drive TC2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA26_TIOA2 ) | + ((unsigned int) AT91C_PA27_TIOB2 ) | + ((unsigned int) AT91C_PA29_TCLK2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC1 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPIO +//* \brief Configure PIO controllers to drive TC1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA15_TIOA1 ) | + ((unsigned int) AT91C_PA16_TIOB1 ) | + ((unsigned int) AT91C_PA28_TCLK1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC0 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPIO +//* \brief Configure PIO controllers to drive TC0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA0_TIOA0 ) | + ((unsigned int) AT91C_PA1_TIOB0 ) | + ((unsigned int) AT91C_PA4_TCLK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPIO +//* \brief Configure PIO controllers to drive PMC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA17_PCK1 ) | + ((unsigned int) AT91C_PA21_PCK1 ) | + ((unsigned int) AT91C_PA31_PCK2 ) | + ((unsigned int) AT91C_PA18_PCK2 ) | + ((unsigned int) AT91C_PA6_PCK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPMC +//* \brief Enable Peripheral clock in PMC for ADC +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_ADC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPIO +//* \brief Configure PIO controllers to drive ADC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA8_ADTRG )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOA_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOA +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOA_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOA)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPMC +//* \brief Enable Peripheral clock in PMC for TWI +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TWI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPIO +//* \brief Configure PIO controllers to drive TWI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA3_TWD ) | + ((unsigned int) AT91C_PA4_TWCK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPMC +//* \brief Enable Peripheral clock in PMC for US1 +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPIO +//* \brief Configure PIO controllers to drive US1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA21_RXD1 ) | + ((unsigned int) AT91C_PA27_DTR1 ) | + ((unsigned int) AT91C_PA26_DCD1 ) | + ((unsigned int) AT91C_PA22_TXD1 ) | + ((unsigned int) AT91C_PA24_RTS1 ) | + ((unsigned int) AT91C_PA23_SCK1 ) | + ((unsigned int) AT91C_PA28_DSR1 ) | + ((unsigned int) AT91C_PA29_RI1 ) | + ((unsigned int) AT91C_PA25_CTS1 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPMC +//* \brief Enable Peripheral clock in PMC for US0 +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPIO +//* \brief Configure PIO controllers to drive US0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA5_RXD0 ) | + ((unsigned int) AT91C_PA6_TXD0 ) | + ((unsigned int) AT91C_PA7_RTS0 ) | + ((unsigned int) AT91C_PA8_CTS0 ), // Peripheral A + ((unsigned int) AT91C_PA2_SCK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_CfgPMC +//* \brief Enable Peripheral clock in PMC for UDP +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_UDP)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPMC +//* \brief Enable Peripheral clock in PMC for AIC +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_IRQ0) | + ((unsigned int) 1 << AT91C_ID_FIQ) | + ((unsigned int) 1 << AT91C_ID_IRQ1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPIO +//* \brief Configure PIO controllers to drive AIC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA30_IRQ1 ), // Peripheral A + ((unsigned int) AT91C_PA20_IRQ0 ) | + ((unsigned int) AT91C_PA19_FIQ )); // Peripheral B +} + +#endif // lib_AT91SAM7S64_H diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h new file mode 100644 index 0000000..93bb5f2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h @@ -0,0 +1,4558 @@ +//* ---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//* ---------------------------------------------------------------------------- +//* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +//* DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +//* ---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7X128.h +//* Object : AT91SAM7X128 inlined functions +//* Generated : AT91 SW Application Group 05/20/2005 (16:22:23) +//* +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_pmc_SAM7X.h/1.1/Tue Feb 1 08:32:10 2005// +//* CVS Reference : /lib_VREG_6085B.h/1.1/Tue Feb 1 16:20:47 2005// +//* CVS Reference : /lib_rstc_6098A.h/1.1/Wed Oct 6 10:39:20 2004// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_wdtc_6080A.h/1.1/Wed Oct 6 10:38:30 2004// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003// +//* CVS Reference : /lib_pitc_6079A.h/1.2/Tue Nov 9 14:43:56 2004// +//* CVS Reference : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005// +//* CVS Reference : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005// +//* CVS Reference : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003// +//* CVS Reference : /lib_rttc_6081A.h/1.1/Wed Oct 6 10:39:38 2004// +//* CVS Reference : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005// +//* CVS Reference : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_pdc.h/1.2/Tue Jul 2 13:29:40 2002// +//* ---------------------------------------------------------------------------- + +#ifndef lib_AT91SAM7X128_H +#define lib_AT91SAM7X128_H + +/* ***************************************************************************** + SOFTWARE API FOR AIC + ***************************************************************************** */ +#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20] + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_ConfigureIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id, // \arg interrupt number to initialize + unsigned int priority, // \arg priority to give to the interrupt + unsigned int src_type, // \arg activation and sense of activation + void (*newHandler) (void) ) // \arg address of the interrupt handler +{ + unsigned int oldHandler; + unsigned int mask ; + + oldHandler = pAic->AIC_SVR[irq_id]; + + mask = 0x1 << irq_id ; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Save the interrupt handler routine pointer and the interrupt priority + pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; + //* Store the Source Mode Register + pAic->AIC_SMR[irq_id] = src_type | priority ; + //* Clear the interrupt on the interrupt controller + pAic->AIC_ICCR = mask ; + + return oldHandler; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_EnableIt +//* \brief Enable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_EnableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + //* Enable the interrupt on the interrupt controller + pAic->AIC_IECR = 0x1 << irq_id ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_DisableIt +//* \brief Disable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_DisableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + unsigned int mask = 0x1 << irq_id; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = mask ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ClearIt +//* \brief Clear corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_ClearIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number to initialize +{ + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = (0x1 << irq_id); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_AcknowledgeIt +//* \brief Acknowledge corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_AcknowledgeIt ( + AT91PS_AIC pAic) // \arg pointer to the AIC registers +{ + pAic->AIC_EOICR = pAic->AIC_EOICR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_SetExceptionVector +//* \brief Configure vector handler +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_SetExceptionVector ( + unsigned int *pVector, // \arg pointer to the AIC registers + void (*Handler) () ) // \arg Interrupt Handler +{ + unsigned int oldVector = *pVector; + + if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) + *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; + else + *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000; + + return oldVector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Trig +//* \brief Trig an IT +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Trig ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number +{ + pAic->AIC_ISCR = (0x1 << irq_id) ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsActive +//* \brief Test if an IT is active +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsActive ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_ISR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsPending +//* \brief Test if an IT is pending +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsPending ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_IPR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Open +//* \brief Set exception vectors and AIC registers to default values +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Open( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + void (*IrqHandler) (), // \arg Default IRQ vector exception + void (*FiqHandler) (), // \arg Default FIQ vector exception + void (*DefaultHandler) (), // \arg Default Handler set in ISR + void (*SpuriousHandler) (), // \arg Default Spurious Handler + unsigned int protectMode) // \arg Debug Control Register +{ + int i; + + // Disable all interrupts and set IVR to the default handler + for (i = 0; i < 32; ++i) { + AT91F_AIC_DisableIt(pAic, i); + AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler); + } + + // Set the IRQ exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler); + // Set the Fast Interrupt exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler); + + pAic->AIC_SPU = (unsigned int) SpuriousHandler; + pAic->AIC_DCR = protectMode; +} +/* ***************************************************************************** + SOFTWARE API FOR PDC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextRx +//* \brief Set the next receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RNPR = (unsigned int) address; + pPDC->PDC_RNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextTx +//* \brief Set the next transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TNPR = (unsigned int) address; + pPDC->PDC_TNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetRx +//* \brief Set the receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RPR = (unsigned int) address; + pPDC->PDC_RCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetTx +//* \brief Set the transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TPR = (unsigned int) address; + pPDC->PDC_TCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableTx +//* \brief Enable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableRx +//* \brief Enable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableTx +//* \brief Disable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableRx +//* \brief Disable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsTxEmpty +//* \brief Test if the current transfer descriptor has been sent +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextTxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsRxEmpty +//* \brief Test if the current transfer descriptor has been filled +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextRxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Open +//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Open ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + + //* Enable the RX and TX PDC transfer requests + AT91F_PDC_EnableRx(pPDC); + AT91F_PDC_EnableTx(pPDC); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Close +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Close ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SendFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_SendFrame( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsTxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextTxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_ReceiveFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_ReceiveFrame ( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsRxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} +/* ***************************************************************************** + SOFTWARE API FOR DBGU + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptEnable +//* \brief Enable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptEnable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be enabled +{ + pDbgu->DBGU_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptDisable +//* \brief Disable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptDisable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be disabled +{ + pDbgu->DBGU_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_GetInterruptMaskStatus +//* \brief Return DBGU Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status + AT91PS_DBGU pDbgu) // \arg pointer to a DBGU controller +{ + return pDbgu->DBGU_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_IsInterruptMasked +//* \brief Test if DBGU Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_DBGU_IsInterruptMasked( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PIO + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPeriph +//* \brief Enable pins to be drived by peripheral +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPeriph( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int periphAEnable, // \arg PERIPH A to enable + unsigned int periphBEnable) // \arg PERIPH B to enable + +{ + pPio->PIO_ASR = periphAEnable; + pPio->PIO_BSR = periphBEnable; + pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOutput +//* \brief Enable PIO in output mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pioEnable) // \arg PIO to be enabled +{ + pPio->PIO_PER = pioEnable; // Set in PIO mode + pPio->PIO_OER = pioEnable; // Configure in Output +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInput +//* \brief Enable PIO in input mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputEnable) // \arg PIO to be enabled +{ + // Disable output + pPio->PIO_ODR = inputEnable; + pPio->PIO_PER = inputEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOpendrain +//* \brief Configure PIO in open drain +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOpendrain( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int multiDrvEnable) // \arg pio to be configured in open drain +{ + // Configure the multi-drive option + pPio->PIO_MDDR = ~multiDrvEnable; + pPio->PIO_MDER = multiDrvEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPullup +//* \brief Enable pullup on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPullup( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pullupEnable) // \arg enable pullup on PIO +{ + // Connect or not Pullup + pPio->PIO_PPUDR = ~pullupEnable; + pPio->PIO_PPUER = pullupEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgDirectDrive +//* \brief Enable direct drive on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgDirectDrive( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int directDrive) // \arg PIO to be configured with direct drive + +{ + // Configure the Direct Drive + pPio->PIO_OWDR = ~directDrive; + pPio->PIO_OWER = directDrive; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInputFilter +//* \brief Enable input filter on input PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInputFilter( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputFilter) // \arg PIO to be configured with input filter + +{ + // Configure the Direct Drive + pPio->PIO_IFDR = ~inputFilter; + pPio->PIO_IFER = inputFilter; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInput +//* \brief Return PIO input value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInput( // \return PIO input + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputSet +//* \brief Test if PIO is input flag is active +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInput(pPio) & flag); +} + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_SetOutput +//* \brief Set to 1 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_SetOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be set +{ + pPio->PIO_SODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ClearOutput +//* \brief Set to 0 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ClearOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be cleared +{ + pPio->PIO_CODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ForceOutput +//* \brief Force output when Direct drive option is enabled +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ForceOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be forced +{ + pPio->PIO_ODSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Enable +//* \brief Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Enable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_PER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Disable +//* \brief Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Disable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_PDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetStatus +//* \brief Return PIO Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsSet +//* \brief Test if PIO is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputEnable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be enabled +{ + pPio->PIO_OER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputDisable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be disabled +{ + pPio->PIO_ODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputStatus +//* \brief Return PIO Output Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOuputSet +//* \brief Test if PIO Output is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterEnable +//* \brief Input Filter Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be enabled +{ + pPio->PIO_IFER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterDisable +//* \brief Input Filter Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be disabled +{ + pPio->PIO_IFDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInputFilterStatus +//* \brief Return PIO Input Filter Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IFSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputFilterSet +//* \brief Test if PIO Input filter is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputFilterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInputFilterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputDataStatus +//* \brief Return PIO Output Data Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ODSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptEnable +//* \brief Enable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be enabled +{ + pPio->PIO_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptDisable +//* \brief Disable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be disabled +{ + pPio->PIO_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptMaskStatus +//* \brief Return PIO Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptMasked +//* \brief Test if PIO Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptMasked( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptSet +//* \brief Test if PIO Interrupt is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverEnable +//* \brief Multi Driver Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_MDER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverDisable +//* \brief Multi Driver Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_MDDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetMultiDriverStatus +//* \brief Return PIO Multi Driver Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_MDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsMultiDriverSet +//* \brief Test if PIO MultiDriver is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsMultiDriverSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_A_RegisterSelection +//* \brief PIO A Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_A_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio A register selection +{ + pPio->PIO_ASR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_B_RegisterSelection +//* \brief PIO B Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_B_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio B register selection +{ + pPio->PIO_BSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Get_AB_RegisterStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ABSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsAB_RegisterSet +//* \brief Test if PIO AB Register is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsAB_RegisterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteEnable +//* \brief Output Write Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be enabled +{ + pPio->PIO_OWER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteDisable +//* \brief Output Write Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be disabled +{ + pPio->PIO_OWDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputWriteStatus +//* \brief Return PIO Output Write Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OWSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputWriteSet +//* \brief Test if PIO OutputWrite is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputWriteSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetCfgPullup +//* \brief Return PIO Configuration Pullup +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PPUSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputDataStatusSet +//* \brief Test if PIO Output Data Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputDataStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputDataStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsCfgPullupStatusSet +//* \brief Test if PIO Configuration Pullup Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsCfgPullupStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (~AT91F_PIO_GetCfgPullup(pPio) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkEnableReg +//* \brief Configure the System Clock Enable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkEnableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCER register + pPMC->PMC_SCER = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkDisableReg +//* \brief Configure the System Clock Disable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkDisableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCDR register + pPMC->PMC_SCDR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetSysClkStatusReg +//* \brief Return the System Clock Status Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetSysClkStatusReg ( + AT91PS_PMC pPMC // pointer to a CAN controller + ) +{ + return pPMC->PMC_SCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePeriphClock +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCER = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePeriphClock +//* \brief Disable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCDR = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetPeriphClock +//* \brief Get peripheral clock status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetPeriphClock ( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_PCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscillatorReg ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int mode) +{ + pCKGR->CKGR_MOR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainOscillatorReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MOR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_EnableMainOscillator +//* \brief Enable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_EnableMainOscillator( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_DisableMainOscillator +//* \brief Disable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_DisableMainOscillator ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscStartUpTime +//* \brief Cfg MOR Register according to the main osc startup time +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscStartUpTime ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int startup_time, // \arg main osc startup time in microsecond (us) + unsigned int slowClock) // \arg slowClock in Hz +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT; + pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClockFreqReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClockFreqReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MCFR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClock +//* \brief Return Main clock in Hz +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClock ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + return ((pCKGR->CKGR_MCFR & AT91C_CKGR_MAINF) * slowClock) >> 4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgMCKReg +//* \brief Cfg Master Clock Register +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgMCKReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + pPMC->PMC_MCKR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetMCKReg +//* \brief Return Master Clock Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetMCKReg( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_MCKR; +} + +//*------------------------------------------------------------------------------ +//* \fn AT91F_PMC_GetMasterClock +//* \brief Return master clock in Hz which correponds to processor clock for ARM7 +//*------------------------------------------------------------------------------ +__inline unsigned int AT91F_PMC_GetMasterClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + unsigned int reg = pPMC->PMC_MCKR; + unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2)); + unsigned int pllDivider, pllMultiplier; + + switch (reg & AT91C_PMC_CSS) { + case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected + return slowClock / prescaler; + case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler; + case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected + reg = pCKGR->CKGR_PLLR; + pllDivider = (reg & AT91C_CKGR_DIV); + pllMultiplier = ((reg & AT91C_CKGR_MUL) >> 16) + 1; + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler; + } + return 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck, // \arg Peripheral clock identifier 0 .. 7 + unsigned int mode) +{ + pPMC->PMC_PCKR[pck] = mode; + pPMC->PMC_SCER = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck) // \arg Peripheral clock identifier 0 .. 7 +{ + pPMC->PMC_SCDR = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnableIt +//* \brief Enable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pPMC->PMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisableIt +//* \brief Disable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pPMC->PMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetStatus +//* \brief Return PMC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetInterruptMaskStatus +//* \brief Return PMC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsInterruptMasked +//* \brief Test if PMC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsInterruptMasked( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsStatusSet +//* \brief Test if PMC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsStatusSet( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetStatus(pPMC) & flag); +}/* ***************************************************************************** + SOFTWARE API FOR RSTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSoftReset +//* \brief Start Software Reset +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSoftReset( + AT91PS_RSTC pRSTC, + unsigned int reset) +{ + pRSTC->RSTC_RCR = (0xA5000000 | reset); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSetMode +//* \brief Set Reset Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSetMode( + AT91PS_RSTC pRSTC, + unsigned int mode) +{ + pRSTC->RSTC_RMR = (0xA5000000 | mode); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetMode +//* \brief Get Reset Mode +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetMode( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetStatus +//* \brief Get Reset Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetStatus( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RSR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTIsSoftRstActive +//* \brief Return !=0 if software reset is still not completed +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTIsSoftRstActive( + AT91PS_RSTC pRSTC) +{ + return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP); +} +/* ***************************************************************************** + SOFTWARE API FOR RTTC + ***************************************************************************** */ +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_SetRTT_TimeBase() +//* \brief Set the RTT prescaler according to the TimeBase in ms +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetTimeBase( + AT91PS_RTTC pRTTC, + unsigned int ms) +{ + if (ms > 2000) + return 1; // AT91C_TIME_OUT_OF_RANGE + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF); + return 0; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTSetPrescaler() +//* \brief Set the new prescaler value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetPrescaler( + AT91PS_RTTC pRTTC, + unsigned int rtpres) +{ + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF); + return (pRTTC->RTTC_RTMR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTRestart() +//* \brief Restart the RTT prescaler +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTRestart( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST; +} + + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmINT() +//* \brief Enable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearAlarmINT() +//* \brief Disable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetRttIncINT() +//* \brief Enable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearRttIncINT() +//* \brief Disable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmValue() +//* \brief Set RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmValue( + AT91PS_RTTC pRTTC, unsigned int alarm) +{ + pRTTC->RTTC_RTAR = alarm; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_GetAlarmValue() +//* \brief Get RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetAlarmValue( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTAR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTGetStatus() +//* \brief Read the RTT status +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetStatus( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTSR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ReadValue() +//* \brief Read the RTT value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTReadValue( + AT91PS_RTTC pRTTC) +{ + register volatile unsigned int val1,val2; + do + { + val1 = pRTTC->RTTC_RTVR; + val2 = pRTTC->RTTC_RTVR; + } + while(val1 != val2); + return(val1); +} +/* ***************************************************************************** + SOFTWARE API FOR PITC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITInit +//* \brief System timer init : period in µsecond, system clock freq in MHz +//*---------------------------------------------------------------------------- +__inline void AT91F_PITInit( + AT91PS_PITC pPITC, + unsigned int period, + unsigned int pit_frequency) +{ + pPITC->PITC_PIMR = period? (period * pit_frequency + 8) >> 4 : 0; // +8 to avoid %10 and /10 + pPITC->PITC_PIMR |= AT91C_PITC_PITEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITSetPIV +//* \brief Set the PIT Periodic Interval Value +//*---------------------------------------------------------------------------- +__inline void AT91F_PITSetPIV( + AT91PS_PITC pPITC, + unsigned int piv) +{ + pPITC->PITC_PIMR = piv | (pPITC->PITC_PIMR & (AT91C_PITC_PITEN | AT91C_PITC_PITIEN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITEnableInt +//* \brief Enable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITEnableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR |= AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITDisableInt +//* \brief Disable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITDisableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetMode +//* \brief Read PIT mode register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetMode( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetStatus +//* \brief Read PIT status register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetStatus( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PISR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIIR +//* \brief Read PIT CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIIR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIIR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIVR +//* \brief Read System timer CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIVR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIVR); +} +/* ***************************************************************************** + SOFTWARE API FOR WDTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSetMode +//* \brief Set Watchdog Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTSetMode( + AT91PS_WDTC pWDTC, + unsigned int Mode) +{ + pWDTC->WDTC_WDMR = Mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTRestart +//* \brief Restart Watchdog +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTRestart( + AT91PS_WDTC pWDTC) +{ + pWDTC->WDTC_WDCR = 0xA5000001; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSGettatus +//* \brief Get Watchdog Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTSGettatus( + AT91PS_WDTC pWDTC) +{ + return(pWDTC->WDTC_WDSR & 0x3); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTGetPeriod +//* \brief Translate ms into Watchdog Compatible value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTGetPeriod(unsigned int ms) +{ + if ((ms < 4) || (ms > 16000)) + return 0; + return((ms << 8) / 1000); +} +/* ***************************************************************************** + SOFTWARE API FOR VREG + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Enable_LowPowerMode +//* \brief Enable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Enable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR |= AT91C_VREG_PSTDBY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Disable_LowPowerMode +//* \brief Disable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Disable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR &= ~AT91C_VREG_PSTDBY; +}/* ***************************************************************************** + SOFTWARE API FOR MC + ***************************************************************************** */ + +#define AT91C_MC_CORRECT_KEY ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_Remap +//* \brief Make Remap +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_Remap (void) // +{ + AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC; + + pMC->MC_RCR = AT91C_MC_RCB; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_CfgModeReg +//* \brief Configure the EFC Mode Register of the MC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_CfgModeReg ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int mode) // mode register +{ + // Write to the FMR register + pMC->MC_FMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetModeReg +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetModeReg( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_ComputeFMCN +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_ComputeFMCN( + int master_clock) // master clock in Hz +{ + return (master_clock/1000000 +2); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_PerformCmd +//* \brief Perform EFC Command +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_PerformCmd ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int transfer_cmd) +{ + pMC->MC_FCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetStatus +//* \brief Return MC EFC Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetStatus( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptMasked +//* \brief Test if EFC MC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptMasked( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetModeReg(pMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptSet +//* \brief Test if EFC MC Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptSet( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetStatus(pMC) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SPI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Open +//* \brief Open a SPI Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgCs +//* \brief Configure SPI chip select register +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgCs ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int cs, // SPI cs number (0 to 3) + int val) // chip select register +{ + //* Write to the CSR register + *(pSPI->SPI_CSR + cs) = val; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_EnableIt +//* \brief Enable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_EnableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pSPI->SPI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_DisableIt +//* \brief Disable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_DisableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pSPI->SPI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Reset +//* \brief Reset the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Reset ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Enable +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Enable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Disable +//* \brief Disable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Disable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgMode +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgMode ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int mode) // mode register +{ + //* Write to the MR register + pSPI->SPI_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPCS +//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPCS ( + AT91PS_SPI pSPI, // pointer to a SPI controller + char PCS_Device) // PCS of the Device +{ + //* Write to the MR register + pSPI->SPI_MR &= 0xFFF0FFFF; + pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_ReceiveFrame ( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_SendFrame( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Close +//* \brief Close SPI: disable IT disable transfert, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Close ( + AT91PS_SPI pSPI) // \arg pointer to a SPI controller +{ + //* Reset all the Chip Select register + pSPI->SPI_CSR[0] = 0 ; + pSPI->SPI_CSR[1] = 0 ; + pSPI->SPI_CSR[2] = 0 ; + pSPI->SPI_CSR[3] = 0 ; + + //* Reset the SPI mode + pSPI->SPI_MR = 0 ; + + //* Disable all interrupts + pSPI->SPI_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_PutChar ( + AT91PS_SPI pSPI, + unsigned int character, + unsigned int cs_number ) +{ + unsigned int value_for_cs; + value_for_cs = (~(1 << cs_number)) & 0xF; //Place a zero among a 4 ONEs number + pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_GetChar ( + const AT91PS_SPI pSPI) +{ + return((pSPI->SPI_RDR) & 0xFFFF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetInterruptMaskStatus +//* \brief Return SPI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status + AT91PS_SPI pSpi) // \arg pointer to a SPI controller +{ + return pSpi->SPI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_IsInterruptMasked +//* \brief Test if SPI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_IsInterruptMasked( + AT91PS_SPI pSpi, // \arg pointer to a SPI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR USART + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Calculate the baudrate +//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_EXT ) + +//* Standard Synchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \ + AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* SCK used Label +#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT) + +//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity +#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \ + AT91C_US_CLKS_CLOCK +\ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_EVEN + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CKLO +\ + AT91C_US_OVER) + +//* Standard IRDA mode +#define AT91C_US_ASYNC_IRDA_MODE ( AT91C_US_USMODE_IRDA + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Caluculate baud_value according to the main clock and the baud rate +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Baudrate ( + const unsigned int main_clock, // \arg peripheral clock + const unsigned int baud_rate) // \arg UART baudrate +{ + unsigned int baud_value = ((main_clock*10)/(baud_rate * 16)); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + return baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetBaudrate ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg UART baudrate +{ + //* Define the baud rate divisor register + pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetTimeguard +//* \brief Set USART timeguard +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetTimeguard ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int timeguard) // \arg timeguard value +{ + //* Write the Timeguard Register + pUSART->US_TTGR = timeguard ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableIt +//* \brief Enable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUSART->US_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableIt +//* \brief Disable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IER register + pUSART->US_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Configure +//* \brief Configure USART +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Configure ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int mode , // \arg mode Register to be programmed + unsigned int baudRate , // \arg baudrate to be programmed + unsigned int timeguard ) // \arg timeguard to be programmed +{ + //* Disable interrupts + pUSART->US_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; + + //* Define the baud rate divisor register + AT91F_US_SetBaudrate(pUSART, mainClock, baudRate); + + //* Write the Timeguard Register + AT91F_US_SetTimeguard(pUSART, timeguard); + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Define the USART mode + pUSART->US_MR = mode ; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableRx +//* \brief Enable receiving characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableTx +//* \brief Enable sending characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetRx +//* \brief Reset Receiver and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset receiver + pUSART->US_CR = AT91C_US_RSTRX; + //* Re-Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetTx +//* \brief Reset Transmitter and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset transmitter + pUSART->US_CR = AT91C_US_RSTTX; + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableRx +//* \brief Disable Receiver +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable receiver + pUSART->US_CR = AT91C_US_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableTx +//* \brief Disable Transmitter +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable transmitter + pUSART->US_CR = AT91C_US_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Close +//* \brief Close USART: disable IT disable receiver and transmitter, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Close ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset the baud rate divisor register + pUSART->US_BRGR = 0 ; + + //* Reset the USART mode + pUSART->US_MR = 0 ; + + //* Reset the Timeguard Register + pUSART->US_TTGR = 0; + + //* Disable all interrupts + pUSART->US_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_TxReady +//* \brief Return 1 if a character can be written in US_THR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_TxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_TXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_RxReady +//* \brief Return 1 if a character can be read in US_RHR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_RxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_RXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Error +//* \brief Return the error flag +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Error ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & + (AT91C_US_OVRE | // Overrun error + AT91C_US_FRAME | // Framing error + AT91C_US_PARE)); // Parity error +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_US_PutChar ( + AT91PS_USART pUSART, + int character ) +{ + pUSART->US_THR = (character & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_US_GetChar ( + const AT91PS_USART pUSART) +{ + return((pUSART->US_RHR) & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_SendFrame( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_ReceiveFrame ( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetIrdaFilter +//* \brief Set the value of IrDa filter tregister +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetIrdaFilter ( + AT91PS_USART pUSART, + unsigned char value +) +{ + pUSART->US_IF = value; +} + +/* ***************************************************************************** + SOFTWARE API FOR SSC + ***************************************************************************** */ +//* Define the standard I2S mode configuration + +//* Configuration to set in the SSC Transmit Clock Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + AT91C_SSC_CKS_DIV +\ + AT91C_SSC_CKO_CONTINOUS +\ + AT91C_SSC_CKG_NONE +\ + AT91C_SSC_START_FALL_RF +\ + AT91C_SSC_STTOUT +\ + ((1<<16) & AT91C_SSC_STTDLY) +\ + ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24)) + + +//* Configuration to set in the SSC Transmit Frame Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + (nb_bit_by_slot-1) +\ + AT91C_SSC_MSBF +\ + (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB) +\ + (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\ + AT91C_SSC_FSOS_NEGATIVE) + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_SetBaudrate ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg SSC baudrate +{ + unsigned int baud_value; + //* Define the baud rate divisor register + if (speed == 0) + baud_value = 0; + else + { + baud_value = (unsigned int) (mainClock * 10)/(2*speed); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + } + + pSSC->SSC_CMR = baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_Configure +//* \brief Configure SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_Configure ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int syst_clock, // \arg System Clock Frequency + unsigned int baud_rate, // \arg Expected Baud Rate Frequency + unsigned int clock_rx, // \arg Receiver Clock Parameters + unsigned int mode_rx, // \arg mode Register to be programmed + unsigned int clock_tx, // \arg Transmitter Clock Parameters + unsigned int mode_tx) // \arg mode Register to be programmed +{ + //* Disable interrupts + pSSC->SSC_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; + + //* Define the Clock Mode Register + AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate); + + //* Write the Receive Clock Mode Register + pSSC->SSC_RCMR = clock_rx; + + //* Write the Transmit Clock Mode Register + pSSC->SSC_TCMR = clock_tx; + + //* Write the Receive Frame Mode Register + pSSC->SSC_RFMR = mode_rx; + + //* Write the Transmit Frame Mode Register + pSSC->SSC_TFMR = mode_tx; + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR)); + + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableRx +//* \brief Enable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable receiver + pSSC->SSC_CR = AT91C_SSC_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableRx +//* \brief Disable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable receiver + pSSC->SSC_CR = AT91C_SSC_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableTx +//* \brief Enable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable transmitter + pSSC->SSC_CR = AT91C_SSC_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableTx +//* \brief Disable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable transmitter + pSSC->SSC_CR = AT91C_SSC_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableIt +//* \brief Enable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pSSC->SSC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableIt +//* \brief Disable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pSSC->SSC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_ReceiveFrame ( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_SendFrame( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_GetInterruptMaskStatus +//* \brief Return SSC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status + AT91PS_SSC pSsc) // \arg pointer to a SSC controller +{ + return pSsc->SSC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_IsInterruptMasked +//* \brief Test if SSC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SSC_IsInterruptMasked( + AT91PS_SSC pSsc, // \arg pointer to a SSC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TWI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_EnableIt +//* \brief Enable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_EnableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pTWI->TWI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_DisableIt +//* \brief Disable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_DisableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pTWI->TWI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_Configure +//* \brief Configure TWI in master mode +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller +{ + //* Disable interrupts + pTWI->TWI_IDR = (unsigned int) -1; + + //* Reset peripheral + pTWI->TWI_CR = AT91C_TWI_SWRST; + + //* Set Master mode + pTWI->TWI_CR = AT91C_TWI_MSEN; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_GetInterruptMaskStatus +//* \brief Return TWI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status + AT91PS_TWI pTwi) // \arg pointer to a TWI controller +{ + return pTwi->TWI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_IsInterruptMasked +//* \brief Test if TWI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TWI_IsInterruptMasked( + AT91PS_TWI pTwi, // \arg pointer to a TWI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PWMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetStatus +//* \brief Return PWM Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status + AT91PS_PWMC pPWM) // pointer to a PWM controller +{ + return pPWM->PWMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptEnable +//* \brief Enable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptEnable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be enabled +{ + pPwm->PWMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptDisable +//* \brief Disable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptDisable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be disabled +{ + pPwm->PWMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetInterruptMaskStatus +//* \brief Return PWM Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status + AT91PS_PWMC pPwm) // \arg pointer to a PWM controller +{ + return pPwm->PWMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsInterruptMasked +//* \brief Test if PWM Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsInterruptMasked( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsStatusSet +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsStatusSet( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_CfgChannel +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int mode, // \arg PWM mode + unsigned int period, // \arg PWM period + unsigned int duty) // \arg PWM duty cycle +{ + pPWM->PWMC_CH[channelId].PWMC_CMR = mode; + pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty; + pPWM->PWMC_CH[channelId].PWMC_CPRDR = period; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StartChannel +//* \brief Enable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StartChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_ENA = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StopChannel +//* \brief Disable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StopChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_DIS = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_UpdateChannel +//* \brief Update Period or Duty Cycle +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_UpdateChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int update) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_CH[channelId].PWMC_CUPDR = update; +} + +/* ***************************************************************************** + SOFTWARE API FOR UDP + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableIt +//* \brief Enable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUDP->UDP_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableIt +//* \brief Disable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pUDP->UDP_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetAddress +//* \brief Set UDP functional address +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetAddress ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char address) // \arg new UDP address +{ + pUDP->UDP_FADDR = (AT91C_UDP_FEN | address); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] &= ~AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetState +//* \brief Set UDP Device state +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetState ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg new UDP address +{ + pUDP->UDP_GLBSTATE &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG); + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetState +//* \brief return UDP Device state +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state + AT91PS_UDP pUDP) // \arg pointer to a UDP controller +{ + return (pUDP->UDP_GLBSTATE & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_ResetEp +//* \brief Reset UDP endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_ResetEp ( // \return the UDP device state + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg Endpoints to be reset +{ + pUDP->UDP_RSTEP = flag; + pUDP->UDP_RSTEP = 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStall +//* \brief Endpoint will STALL requests +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpStall( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpWrite +//* \brief Write value in the DPR +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpWrite( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned char value) // \arg value to be written in the DPR +{ + pUDP->UDP_FDR[endpoint] = value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpRead +//* \brief Return value from the DPR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpRead( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_FDR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpEndOfWr +//* \brief Notify the UDP that values in DPR are ready to be sent +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpEndOfWr( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpClear +//* \brief Clear flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpClear( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpSet +//* \brief Set flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpSet( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStatus +//* \brief Return the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpStatus( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_CSR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetInterruptMaskStatus +//* \brief Return UDP Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status + AT91PS_UDP pUdp) // \arg pointer to a UDP controller +{ + return pUdp->UDP_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_IsInterruptMasked +//* \brief Test if UDP Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_UDP_IsInterruptMasked( + AT91PS_UDP pUdp, // \arg pointer to a UDP controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptEnable +//* \brief Enable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptEnable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be enabled +{ + pTc->TC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptDisable +//* \brief Disable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptDisable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be disabled +{ + pTc->TC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_GetInterruptMaskStatus +//* \brief Return TC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status + AT91PS_TC pTc) // \arg pointer to a TC controller +{ + return pTc->TC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_IsInterruptMasked +//* \brief Test if TC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TC_IsInterruptMasked( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR CAN + ***************************************************************************** */ +#define STANDARD_FORMAT 0 +#define EXTENDED_FORMAT 1 + +//*---------------------------------------------------------------------------- +//* \fn AT91F_InitMailboxRegisters() +//* \brief Configure the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_InitMailboxRegisters(AT91PS_CAN_MB CAN_Mailbox, + int mode_reg, + int acceptance_mask_reg, + int id_reg, + int data_low_reg, + int data_high_reg, + int control_reg) +{ + CAN_Mailbox->CAN_MB_MCR = 0x0; + CAN_Mailbox->CAN_MB_MMR = mode_reg; + CAN_Mailbox->CAN_MB_MAM = acceptance_mask_reg; + CAN_Mailbox->CAN_MB_MID = id_reg; + CAN_Mailbox->CAN_MB_MDL = data_low_reg; + CAN_Mailbox->CAN_MB_MDH = data_high_reg; + CAN_Mailbox->CAN_MB_MCR = control_reg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EnableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_EnableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR |= AT91C_CAN_CANEN; + + // Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver + while( (pCAN->CAN_SR & AT91C_CAN_WAKEUP) != AT91C_CAN_WAKEUP ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DisableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_DisableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR &= ~AT91C_CAN_CANEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_EnableIt +//* \brief Enable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_EnableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pCAN->CAN_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_DisableIt +//* \brief Disable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_DisableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pCAN->CAN_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetStatus +//* \brief Return CAN Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetStatus( // \return CAN Interrupt Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInterruptMaskStatus +//* \brief Return CAN Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInterruptMaskStatus( // \return CAN Interrupt Mask Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsInterruptMasked +//* \brief Test if CAN Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsInterruptMasked( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetInterruptMaskStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsStatusSet +//* \brief Test if CAN Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsStatusSet( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgModeReg +//* \brief Configure the Mode Register of the CAN controller +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgModeReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pCAN->CAN_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetModeReg +//* \brief Return the Mode Register of the CAN controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetModeReg ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgBaudrateReg +//* \brief Configure the Baudrate of the CAN controller for the network +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgBaudrateReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int baudrate_cfg) +{ + //* Write to the BR register + pCAN->CAN_BR = baudrate_cfg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetBaudrate +//* \brief Return the Baudrate of the CAN controller for the network value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetBaudrate ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_BR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInternalCounter +//* \brief Return CAN Timer Regsiter Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInternalCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetTimestamp +//* \brief Return CAN Timestamp Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetTimestamp ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIMESTP; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetErrorCounter +//* \brief Return CAN Error Counter Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetErrorCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_ECR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitTransferRequest +//* \brief Request for a transfer on the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitTransferRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int transfer_cmd) +{ + pCAN->CAN_TCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitAbortRequest +//* \brief Abort the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitAbortRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int abort_cmd) +{ + pCAN->CAN_ACR = abort_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageModeReg +//* \brief Program the Message Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mode) +{ + CAN_Mailbox->CAN_MB_MMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageModeReg +//* \brief Return the Message Mode Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageIDReg +//* \brief Program the Message ID Register +//* \brief Version == 0 for Standard messsage, Version == 1 for Extended +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int id, + unsigned char version) +{ + if(version==0) // IDvA Standard Format + CAN_Mailbox->CAN_MB_MID = id<<18; + else // IDvB Extended Format + CAN_Mailbox->CAN_MB_MID = id | (1<<29); // set MIDE bit +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageIDReg +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageAcceptanceMaskReg +//* \brief Program the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mask) +{ + CAN_Mailbox->CAN_MB_MAM = mask; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageAcceptanceMaskReg +//* \brief Return the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MAM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetFamilyID +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetFamilyID ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MFID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageCtrl +//* \brief Request and config for a transfer on the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageCtrlReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int message_ctrl_cmd) +{ + CAN_Mailbox->CAN_MB_MCR = message_ctrl_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageStatus +//* \brief Return CAN Mailbox Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageStatus ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataLow +//* \brief Program data low value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDL = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataLow +//* \brief Return data low value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataHigh +//* \brief Program data high value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDH = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataHigh +//* \brief Return data high value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDH; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_Open +//* \brief Open a CAN Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} +/* ***************************************************************************** + SOFTWARE API FOR ADC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableIt +//* \brief Enable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pADC->ADC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableIt +//* \brief Disable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pADC->ADC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetStatus +//* \brief Return ADC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetInterruptMaskStatus +//* \brief Return ADC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsInterruptMasked +//* \brief Test if ADC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsInterruptMasked( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsStatusSet +//* \brief Test if ADC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsStatusSet( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgModeReg +//* \brief Configure the Mode Register of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgModeReg ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pADC->ADC_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetModeReg +//* \brief Return the Mode Register of the ADC controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetModeReg ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgTimings +//* \brief Configure the different necessary timings of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgTimings ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mck_clock, // in MHz + unsigned int adc_clock, // in MHz + unsigned int startup_time, // in us + unsigned int sample_and_hold_time) // in ns +{ + unsigned int prescal,startup,shtim; + + prescal = mck_clock/(2*adc_clock) - 1; + startup = adc_clock*startup_time/8 - 1; + shtim = adc_clock*sample_and_hold_time/1000 - 1; + + //* Write to the MR register + pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHER register + pADC->ADC_CHER = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHDR register + pADC->ADC_CHDR = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetChannelStatus +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetChannelStatus ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CHSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_StartConversion +//* \brief Software request for a analog to digital conversion +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_StartConversion ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_SoftReset +//* \brief Software reset +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_SoftReset ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetLastConvertedData +//* \brief Return the Last Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetLastConvertedData ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_LCDR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH0 +//* \brief Return the Channel 0 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH0 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH1 +//* \brief Return the Channel 1 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH1 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR1; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH2 +//* \brief Return the Channel 2 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH2 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR2; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH3 +//* \brief Return the Channel 3 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH3 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR3; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH4 +//* \brief Return the Channel 4 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH4 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH5 +//* \brief Return the Channel 5 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH5 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR5; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH6 +//* \brief Return the Channel 6 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH6 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR6; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH7 +//* \brief Return the Channel 7 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH7 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR7; +} + +/* ***************************************************************************** + SOFTWARE API FOR AES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_EnableIt +//* \brief Enable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_EnableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pAES->AES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_DisableIt +//* \brief Disable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_DisableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pAES->AES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetStatus +//* \brief Return AES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetStatus( // \return AES Interrupt Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetInterruptMaskStatus +//* \brief Return AES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetInterruptMaskStatus( // \return AES Interrupt Mask Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsInterruptMasked +//* \brief Test if AES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsInterruptMasked( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetInterruptMaskStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsStatusSet +//* \brief Test if AES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsStatusSet( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgModeReg +//* \brief Configure the Mode Register of the AES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgModeReg ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pAES->AES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetModeReg +//* \brief Return the Mode Register of the AES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetModeReg ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + return pAES->AES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_StartProcessing ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SoftReset +//* \brief Reset AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SoftReset ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_LoadNewSeed +//* \brief Load New Seed in the random number generator +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_LoadNewSeed ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_LOADSEED; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetCryptoKey +//* \brief Set Cryptographic Key x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetCryptoKey ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int keyword + ) +{ + pAES->AES_KEYWxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_InputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int indata + ) +{ + pAES->AES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetOutputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index + ) +{ + return pAES->AES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetInitializationVector +//* \brief Set Initialization Vector (or Counter) x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetInitializationVector ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int initvector + ) +{ + pAES->AES_IVxR[index] = initvector; +} + +/* ***************************************************************************** + SOFTWARE API FOR TDES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_EnableIt +//* \brief Enable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_EnableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pTDES->TDES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_DisableIt +//* \brief Disable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_DisableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pTDES->TDES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetStatus +//* \brief Return TDES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetStatus( // \return TDES Interrupt Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetInterruptMaskStatus +//* \brief Return TDES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetInterruptMaskStatus( // \return TDES Interrupt Mask Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsInterruptMasked +//* \brief Test if TDES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsInterruptMasked( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetInterruptMaskStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsStatusSet +//* \brief Test if TDES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsStatusSet( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgModeReg +//* \brief Configure the Mode Register of the TDES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgModeReg ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pTDES->TDES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetModeReg +//* \brief Return the Mode Register of the TDES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetModeReg ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + return pTDES->TDES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_StartProcessing ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SoftReset +//* \brief Reset TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SoftReset ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey1 +//* \brief Set Cryptographic Key 1 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey1 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY1WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey2 +//* \brief Set Cryptographic Key 2 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey2 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY2WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey3 +//* \brief Set Cryptographic Key 3 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey3 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY3WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_InputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int indata + ) +{ + pTDES->TDES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetOutputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index + ) +{ + return pTDES->TDES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetInitializationVector +//* \brief Set Initialization Vector x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetInitializationVector ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int initvector + ) +{ + pTDES->TDES_IVxR[index] = initvector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPMC +//* \brief Enable Peripheral clock in PMC for DBGU +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPIO +//* \brief Configure PIO controllers to drive DBGU signals +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA27_DRXD ) | + ((unsigned int) AT91C_PA28_DTXD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPIO +//* \brief Configure PIO controllers to drive PMC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB30_PCK2 ) | + ((unsigned int) AT91C_PB29_PCK1 ), // Peripheral A + ((unsigned int) AT91C_PB20_PCK0 ) | + ((unsigned int) AT91C_PB0_PCK0 ) | + ((unsigned int) AT91C_PB22_PCK2 ) | + ((unsigned int) AT91C_PB21_PCK1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA30_PCK2 ) | + ((unsigned int) AT91C_PA13_PCK1 ) | + ((unsigned int) AT91C_PA27_PCK3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_CfgPMC +//* \brief Enable Peripheral clock in PMC for VREG +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RSTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPMC +//* \brief Enable Peripheral clock in PMC for SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SSC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPIO +//* \brief Configure PIO controllers to drive SSC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA25_RK ) | + ((unsigned int) AT91C_PA22_TK ) | + ((unsigned int) AT91C_PA21_TF ) | + ((unsigned int) AT91C_PA24_RD ) | + ((unsigned int) AT91C_PA26_RF ) | + ((unsigned int) AT91C_PA23_TD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for WDTC +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPMC +//* \brief Enable Peripheral clock in PMC for US1 +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPIO +//* \brief Configure PIO controllers to drive US1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB26_RI1 ) | + ((unsigned int) AT91C_PB24_DSR1 ) | + ((unsigned int) AT91C_PB23_DCD1 ) | + ((unsigned int) AT91C_PB25_DTR1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA7_SCK1 ) | + ((unsigned int) AT91C_PA8_RTS1 ) | + ((unsigned int) AT91C_PA6_TXD1 ) | + ((unsigned int) AT91C_PA5_RXD1 ) | + ((unsigned int) AT91C_PA9_CTS1 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPMC +//* \brief Enable Peripheral clock in PMC for US0 +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPIO +//* \brief Configure PIO controllers to drive US0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA0_RXD0 ) | + ((unsigned int) AT91C_PA4_CTS0 ) | + ((unsigned int) AT91C_PA3_RTS0 ) | + ((unsigned int) AT91C_PA2_SCK0 ) | + ((unsigned int) AT91C_PA1_TXD0 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI1 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPIO +//* \brief Configure PIO controllers to drive SPI1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB16_NPCS13 ) | + ((unsigned int) AT91C_PB10_NPCS11 ) | + ((unsigned int) AT91C_PB11_NPCS12 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA4_NPCS13 ) | + ((unsigned int) AT91C_PA29_NPCS13 ) | + ((unsigned int) AT91C_PA21_NPCS10 ) | + ((unsigned int) AT91C_PA22_SPCK1 ) | + ((unsigned int) AT91C_PA25_NPCS11 ) | + ((unsigned int) AT91C_PA2_NPCS11 ) | + ((unsigned int) AT91C_PA24_MISO1 ) | + ((unsigned int) AT91C_PA3_NPCS12 ) | + ((unsigned int) AT91C_PA26_NPCS12 ) | + ((unsigned int) AT91C_PA23_MOSI1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI0 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPIO +//* \brief Configure PIO controllers to drive SPI0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB13_NPCS01 ) | + ((unsigned int) AT91C_PB17_NPCS03 ) | + ((unsigned int) AT91C_PB14_NPCS02 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA16_MISO0 ) | + ((unsigned int) AT91C_PA13_NPCS01 ) | + ((unsigned int) AT91C_PA15_NPCS03 ) | + ((unsigned int) AT91C_PA17_MOSI0 ) | + ((unsigned int) AT91C_PA18_SPCK0 ) | + ((unsigned int) AT91C_PA14_NPCS02 ) | + ((unsigned int) AT91C_PA12_NPCS00 ), // Peripheral A + ((unsigned int) AT91C_PA7_NPCS01 ) | + ((unsigned int) AT91C_PA9_NPCS03 ) | + ((unsigned int) AT91C_PA8_NPCS02 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PITC +//*---------------------------------------------------------------------------- +__inline void AT91F_PITC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPMC +//* \brief Enable Peripheral clock in PMC for AIC +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_FIQ) | + ((unsigned int) 1 << AT91C_ID_IRQ0) | + ((unsigned int) 1 << AT91C_ID_IRQ1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPIO +//* \brief Configure PIO controllers to drive AIC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA30_IRQ0 ) | + ((unsigned int) AT91C_PA29_FIQ ), // Peripheral A + ((unsigned int) AT91C_PA14_IRQ1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgPMC +//* \brief Enable Peripheral clock in PMC for AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_AES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPMC +//* \brief Enable Peripheral clock in PMC for TWI +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TWI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPIO +//* \brief Configure PIO controllers to drive TWI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA11_TWCK ) | + ((unsigned int) AT91C_PA10_TWD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPMC +//* \brief Enable Peripheral clock in PMC for ADC +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_ADC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPIO +//* \brief Configure PIO controllers to drive ADC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB18_ADTRG )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH3_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH3 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH3_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB22_PWM3 ), // Peripheral A + ((unsigned int) AT91C_PB30_PWM3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH2_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB21_PWM2 ), // Peripheral A + ((unsigned int) AT91C_PB29_PWM2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH1_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB20_PWM1 ), // Peripheral A + ((unsigned int) AT91C_PB28_PWM1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH0_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB19_PWM0 ), // Peripheral A + ((unsigned int) AT91C_PB27_PWM0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RTTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RTTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RTTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_CfgPMC +//* \brief Enable Peripheral clock in PMC for UDP +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_UDP)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgPMC +//* \brief Enable Peripheral clock in PMC for TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TDES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPMC +//* \brief Enable Peripheral clock in PMC for EMAC +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_EMAC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPIO +//* \brief Configure PIO controllers to drive EMAC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB2_ETX0 ) | + ((unsigned int) AT91C_PB12_ETXER ) | + ((unsigned int) AT91C_PB16_ECOL ) | + ((unsigned int) AT91C_PB11_ETX3 ) | + ((unsigned int) AT91C_PB6_ERX1 ) | + ((unsigned int) AT91C_PB15_ERXDV ) | + ((unsigned int) AT91C_PB13_ERX2 ) | + ((unsigned int) AT91C_PB3_ETX1 ) | + ((unsigned int) AT91C_PB8_EMDC ) | + ((unsigned int) AT91C_PB5_ERX0 ) | + //((unsigned int) AT91C_PB18_EF100 ) | + ((unsigned int) AT91C_PB14_ERX3 ) | + ((unsigned int) AT91C_PB4_ECRS_ECRSDV) | + ((unsigned int) AT91C_PB1_ETXEN ) | + ((unsigned int) AT91C_PB10_ETX2 ) | + ((unsigned int) AT91C_PB0_ETXCK_EREFCK) | + ((unsigned int) AT91C_PB9_EMDIO ) | + ((unsigned int) AT91C_PB7_ERXER ) | + ((unsigned int) AT91C_PB17_ERXCK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC0 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPIO +//* \brief Configure PIO controllers to drive TC0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB23_TIOA0 ) | + ((unsigned int) AT91C_PB24_TIOB0 ), // Peripheral A + ((unsigned int) AT91C_PB12_TCLK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC1 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPIO +//* \brief Configure PIO controllers to drive TC1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB25_TIOA1 ) | + ((unsigned int) AT91C_PB26_TIOB1 ), // Peripheral A + ((unsigned int) AT91C_PB19_TCLK1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC2 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC2)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPIO +//* \brief Configure PIO controllers to drive TC2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB28_TIOB2 ) | + ((unsigned int) AT91C_PB27_TIOA2 ), // Peripheral A + 0); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA15_TCLK2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_CfgPMC +//* \brief Enable Peripheral clock in PMC for MC +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOA_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOA +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOA_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOA)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOB_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOB +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOB_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOB)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPMC +//* \brief Enable Peripheral clock in PMC for CAN +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_CAN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPIO +//* \brief Configure PIO controllers to drive CAN signals +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA20_CANTX ) | + ((unsigned int) AT91C_PA19_CANRX ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PWMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PWMC)); +} + +#endif // lib_AT91SAM7X128_H diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h new file mode 100644 index 0000000..efffc02 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h @@ -0,0 +1,4558 @@ +//* ---------------------------------------------------------------------------- +//* ATMEL Microcontroller Software Support - ROUSSET - +//* ---------------------------------------------------------------------------- +//* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR +//* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +//* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +//* DISCLAIMED. IN NO EVENT SHALL ATMEL 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. +//* ---------------------------------------------------------------------------- +//* File Name : lib_AT91SAM7X256.h +//* Object : AT91SAM7X256 inlined functions +//* Generated : AT91 SW Application Group 05/20/2005 (16:22:29) +//* +//* CVS Reference : /lib_dbgu.h/1.1/Fri Jan 31 12:18:40 2003// +//* CVS Reference : /lib_pmc_SAM7X.h/1.1/Tue Feb 1 08:32:10 2005// +//* CVS Reference : /lib_VREG_6085B.h/1.1/Tue Feb 1 16:20:47 2005// +//* CVS Reference : /lib_rstc_6098A.h/1.1/Wed Oct 6 10:39:20 2004// +//* CVS Reference : /lib_ssc.h/1.4/Fri Jan 31 12:19:20 2003// +//* CVS Reference : /lib_wdtc_6080A.h/1.1/Wed Oct 6 10:38:30 2004// +//* CVS Reference : /lib_usart.h/1.5/Thu Nov 21 16:01:54 2002// +//* CVS Reference : /lib_spi2.h/1.1/Mon Aug 25 14:23:52 2003// +//* CVS Reference : /lib_pitc_6079A.h/1.2/Tue Nov 9 14:43:56 2004// +//* CVS Reference : /lib_aic_6075b.h/1.1/Fri May 20 14:01:19 2005// +//* CVS Reference : /lib_aes_6149a.h/1.1/Mon Jan 17 07:43:09 2005// +//* CVS Reference : /lib_twi.h/1.3/Mon Jul 19 14:27:58 2004// +//* CVS Reference : /lib_adc.h/1.6/Fri Oct 17 09:12:38 2003// +//* CVS Reference : /lib_rttc_6081A.h/1.1/Wed Oct 6 10:39:38 2004// +//* CVS Reference : /lib_udp.h/1.4/Wed Feb 16 08:39:34 2005// +//* CVS Reference : /lib_des3_6150a.h/1.1/Mon Jan 17 09:19:19 2005// +//* CVS Reference : /lib_tc_1753b.h/1.1/Fri Jan 31 12:20:02 2003// +//* CVS Reference : /lib_MC_SAM7X.h/1.1/Thu Mar 25 15:19:14 2004// +//* CVS Reference : /lib_pio.h/1.3/Fri Jan 31 12:18:56 2003// +//* CVS Reference : /lib_can_AT91.h/1.4/Fri Oct 17 09:12:50 2003// +//* CVS Reference : /lib_PWM_SAM.h/1.3/Thu Jan 22 10:10:50 2004// +//* CVS Reference : /lib_pdc.h/1.2/Tue Jul 2 13:29:40 2002// +//* ---------------------------------------------------------------------------- + +#ifndef lib_AT91SAM7X256_H +#define lib_AT91SAM7X256_H + +/* ***************************************************************************** + SOFTWARE API FOR AIC + ***************************************************************************** */ +#define AT91C_AIC_BRANCH_OPCODE ((void (*) ()) 0xE51FFF20) // ldr, pc, [pc, #-&F20] + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ConfigureIt +//* \brief Interrupt Handler Initialization +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_ConfigureIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id, // \arg interrupt number to initialize + unsigned int priority, // \arg priority to give to the interrupt + unsigned int src_type, // \arg activation and sense of activation + void (*newHandler) (void) ) // \arg address of the interrupt handler +{ + unsigned int oldHandler; + unsigned int mask ; + + oldHandler = pAic->AIC_SVR[irq_id]; + + mask = 0x1 << irq_id ; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Save the interrupt handler routine pointer and the interrupt priority + pAic->AIC_SVR[irq_id] = (unsigned int) newHandler ; + //* Store the Source Mode Register + pAic->AIC_SMR[irq_id] = src_type | priority ; + //* Clear the interrupt on the interrupt controller + pAic->AIC_ICCR = mask ; + + return oldHandler; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_EnableIt +//* \brief Enable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_EnableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + //* Enable the interrupt on the interrupt controller + pAic->AIC_IECR = 0x1 << irq_id ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_DisableIt +//* \brief Disable corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_DisableIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id ) // \arg interrupt number to initialize +{ + unsigned int mask = 0x1 << irq_id; + //* Disable the interrupt on the interrupt controller + pAic->AIC_IDCR = mask ; + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = mask ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_ClearIt +//* \brief Clear corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_ClearIt ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number to initialize +{ + //* Clear the interrupt on the Interrupt Controller ( if one is pending ) + pAic->AIC_ICCR = (0x1 << irq_id); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_AcknowledgeIt +//* \brief Acknowledge corresponding IT number +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_AcknowledgeIt ( + AT91PS_AIC pAic) // \arg pointer to the AIC registers +{ + pAic->AIC_EOICR = pAic->AIC_EOICR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_SetExceptionVector +//* \brief Configure vector handler +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_SetExceptionVector ( + unsigned int *pVector, // \arg pointer to the AIC registers + void (*Handler) () ) // \arg Interrupt Handler +{ + unsigned int oldVector = *pVector; + + if ((unsigned int) Handler == (unsigned int) AT91C_AIC_BRANCH_OPCODE) + *pVector = (unsigned int) AT91C_AIC_BRANCH_OPCODE; + else + *pVector = (((((unsigned int) Handler) - ((unsigned int) pVector) - 0x8) >> 2) & 0x00FFFFFF) | 0xEA000000; + + return oldVector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Trig +//* \brief Trig an IT +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Trig ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg interrupt number +{ + pAic->AIC_ISCR = (0x1 << irq_id) ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsActive +//* \brief Test if an IT is active +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsActive ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_ISR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_IsPending +//* \brief Test if an IT is pending +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AIC_IsPending ( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + unsigned int irq_id) // \arg Interrupt Number +{ + return (pAic->AIC_IPR & (0x1 << irq_id)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_Open +//* \brief Set exception vectors and AIC registers to default values +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_Open( + AT91PS_AIC pAic, // \arg pointer to the AIC registers + void (*IrqHandler) (), // \arg Default IRQ vector exception + void (*FiqHandler) (), // \arg Default FIQ vector exception + void (*DefaultHandler) (), // \arg Default Handler set in ISR + void (*SpuriousHandler) (), // \arg Default Spurious Handler + unsigned int protectMode) // \arg Debug Control Register +{ + int i; + + // Disable all interrupts and set IVR to the default handler + for (i = 0; i < 32; ++i) { + AT91F_AIC_DisableIt(pAic, i); + AT91F_AIC_ConfigureIt(pAic, i, AT91C_AIC_PRIOR_LOWEST, AT91C_AIC_SRCTYPE_HIGH_LEVEL, DefaultHandler); + } + + // Set the IRQ exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x18, IrqHandler); + // Set the Fast Interrupt exception vector + AT91F_AIC_SetExceptionVector((unsigned int *) 0x1C, FiqHandler); + + pAic->AIC_SPU = (unsigned int) SpuriousHandler; + pAic->AIC_DCR = protectMode; +} +/* ***************************************************************************** + SOFTWARE API FOR PDC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextRx +//* \brief Set the next receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RNPR = (unsigned int) address; + pPDC->PDC_RNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetNextTx +//* \brief Set the next transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetNextTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TNPR = (unsigned int) address; + pPDC->PDC_TNCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetRx +//* \brief Set the receive transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetRx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be received + unsigned int bytes) // \arg number of bytes to be received +{ + pPDC->PDC_RPR = (unsigned int) address; + pPDC->PDC_RCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SetTx +//* \brief Set the transmit transfer descriptor +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_SetTx ( + AT91PS_PDC pPDC, // \arg pointer to a PDC controller + char *address, // \arg address to the next bloc to be transmitted + unsigned int bytes) // \arg number of bytes to be transmitted +{ + pPDC->PDC_TPR = (unsigned int) address; + pPDC->PDC_TCR = bytes; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableTx +//* \brief Enable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_EnableRx +//* \brief Enable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_EnableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableTx +//* \brief Disable transmit +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableTx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_TXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_DisableRx +//* \brief Disable receive +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_DisableRx ( + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + pPDC->PDC_PTCR = AT91C_PDC_RXTDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsTxEmpty +//* \brief Test if the current transfer descriptor has been sent +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextTxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextTxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_TNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsRxEmpty +//* \brief Test if the current transfer descriptor has been filled +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_IsNextRxEmpty +//* \brief Test if the next transfer descriptor has been moved to the current td +//*---------------------------------------------------------------------------- +__inline int AT91F_PDC_IsNextRxEmpty ( // \return return 1 if transfer is complete + AT91PS_PDC pPDC ) // \arg pointer to a PDC controller +{ + return !(pPDC->PDC_RNCR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Open +//* \brief Open PDC: disable TX and RX reset transfer descriptors, re-enable RX and TX +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Open ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + + //* Enable the RX and TX PDC transfer requests + AT91F_PDC_EnableRx(pPDC); + AT91F_PDC_EnableTx(pPDC); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_Close +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline void AT91F_PDC_Close ( + AT91PS_PDC pPDC) // \arg pointer to a PDC controller +{ + //* Disable the RX and TX PDC transfer requests + AT91F_PDC_DisableRx(pPDC); + AT91F_PDC_DisableTx(pPDC); + + //* Reset all Counter register Next buffer first + AT91F_PDC_SetNextTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetNextRx(pPDC, (char *) 0, 0); + AT91F_PDC_SetTx(pPDC, (char *) 0, 0); + AT91F_PDC_SetRx(pPDC, (char *) 0, 0); + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_SendFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_SendFrame( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsTxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetTx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextTx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextTxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextTx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PDC_ReceiveFrame +//* \brief Close PDC: disable TX and RX reset transfer descriptors +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PDC_ReceiveFrame ( + AT91PS_PDC pPDC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + if (AT91F_PDC_IsRxEmpty(pPDC)) { + //* Buffer and next buffer can be initialized + AT91F_PDC_SetRx(pPDC, pBuffer, szBuffer); + AT91F_PDC_SetNextRx(pPDC, pNextBuffer, szNextBuffer); + return 2; + } + else if (AT91F_PDC_IsNextRxEmpty(pPDC)) { + //* Only one buffer can be initialized + AT91F_PDC_SetNextRx(pPDC, pBuffer, szBuffer); + return 1; + } + else { + //* All buffer are in use... + return 0; + } +} +/* ***************************************************************************** + SOFTWARE API FOR DBGU + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptEnable +//* \brief Enable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptEnable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be enabled +{ + pDbgu->DBGU_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_InterruptDisable +//* \brief Disable DBGU Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_InterruptDisable( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg dbgu interrupt to be disabled +{ + pDbgu->DBGU_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_GetInterruptMaskStatus +//* \brief Return DBGU Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_DBGU_GetInterruptMaskStatus( // \return DBGU Interrupt Mask Status + AT91PS_DBGU pDbgu) // \arg pointer to a DBGU controller +{ + return pDbgu->DBGU_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_IsInterruptMasked +//* \brief Test if DBGU Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_DBGU_IsInterruptMasked( + AT91PS_DBGU pDbgu, // \arg pointer to a DBGU controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_DBGU_GetInterruptMaskStatus(pDbgu) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PIO + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPeriph +//* \brief Enable pins to be drived by peripheral +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPeriph( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int periphAEnable, // \arg PERIPH A to enable + unsigned int periphBEnable) // \arg PERIPH B to enable + +{ + pPio->PIO_ASR = periphAEnable; + pPio->PIO_BSR = periphBEnable; + pPio->PIO_PDR = (periphAEnable | periphBEnable); // Set in Periph mode +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOutput +//* \brief Enable PIO in output mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pioEnable) // \arg PIO to be enabled +{ + pPio->PIO_PER = pioEnable; // Set in PIO mode + pPio->PIO_OER = pioEnable; // Configure in Output +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInput +//* \brief Enable PIO in input mode +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputEnable) // \arg PIO to be enabled +{ + // Disable output + pPio->PIO_ODR = inputEnable; + pPio->PIO_PER = inputEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgOpendrain +//* \brief Configure PIO in open drain +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgOpendrain( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int multiDrvEnable) // \arg pio to be configured in open drain +{ + // Configure the multi-drive option + pPio->PIO_MDDR = ~multiDrvEnable; + pPio->PIO_MDER = multiDrvEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgPullup +//* \brief Enable pullup on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgPullup( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int pullupEnable) // \arg enable pullup on PIO +{ + // Connect or not Pullup + pPio->PIO_PPUDR = ~pullupEnable; + pPio->PIO_PPUER = pullupEnable; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgDirectDrive +//* \brief Enable direct drive on PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgDirectDrive( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int directDrive) // \arg PIO to be configured with direct drive + +{ + // Configure the Direct Drive + pPio->PIO_OWDR = ~directDrive; + pPio->PIO_OWER = directDrive; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_CfgInputFilter +//* \brief Enable input filter on input PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_CfgInputFilter( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int inputFilter) // \arg PIO to be configured with input filter + +{ + // Configure the Direct Drive + pPio->PIO_IFDR = ~inputFilter; + pPio->PIO_IFER = inputFilter; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInput +//* \brief Return PIO input value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInput( // \return PIO input + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputSet +//* \brief Test if PIO is input flag is active +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInput(pPio) & flag); +} + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_SetOutput +//* \brief Set to 1 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_SetOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be set +{ + pPio->PIO_SODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ClearOutput +//* \brief Set to 0 output PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ClearOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be cleared +{ + pPio->PIO_CODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_ForceOutput +//* \brief Force output when Direct drive option is enabled +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_ForceOutput( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg output to be forced +{ + pPio->PIO_ODSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Enable +//* \brief Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Enable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_PER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Disable +//* \brief Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_Disable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_PDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetStatus +//* \brief Return PIO Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetStatus( // \return PIO Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsSet +//* \brief Test if PIO is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputEnable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be enabled +{ + pPio->PIO_OER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputDisable +//* \brief Output Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output to be disabled +{ + pPio->PIO_ODR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputStatus +//* \brief Return PIO Output Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputStatus( // \return PIO Output Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOuputSet +//* \brief Test if PIO Output is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterEnable +//* \brief Input Filter Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be enabled +{ + pPio->PIO_IFER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InputFilterDisable +//* \brief Input Filter Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InputFilterDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio input filter to be disabled +{ + pPio->PIO_IFDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInputFilterStatus +//* \brief Return PIO Input Filter Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInputFilterStatus( // \return PIO Input Filter Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IFSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInputFilterSet +//* \brief Test if PIO Input filter is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInputFilterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInputFilterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputDataStatus +//* \brief Return PIO Output Data Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputDataStatus( // \return PIO Output Data Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ODSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptEnable +//* \brief Enable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be enabled +{ + pPio->PIO_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_InterruptDisable +//* \brief Disable PIO Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_InterruptDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio interrupt to be disabled +{ + pPio->PIO_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptMaskStatus +//* \brief Return PIO Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptMaskStatus( // \return PIO Interrupt Mask Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetInterruptStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetInterruptStatus( // \return PIO Interrupt Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptMasked +//* \brief Test if PIO Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptMasked( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptMaskStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsInterruptSet +//* \brief Test if PIO Interrupt is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsInterruptSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetInterruptStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverEnable +//* \brief Multi Driver Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be enabled +{ + pPio->PIO_MDER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_MultiDriverDisable +//* \brief Multi Driver Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_MultiDriverDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio to be disabled +{ + pPio->PIO_MDDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetMultiDriverStatus +//* \brief Return PIO Multi Driver Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetMultiDriverStatus( // \return PIO Multi Driver Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_MDSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsMultiDriverSet +//* \brief Test if PIO MultiDriver is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsMultiDriverSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetMultiDriverStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_A_RegisterSelection +//* \brief PIO A Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_A_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio A register selection +{ + pPio->PIO_ASR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_B_RegisterSelection +//* \brief PIO B Register Selection +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_B_RegisterSelection( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio B register selection +{ + pPio->PIO_BSR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_Get_AB_RegisterStatus +//* \brief Return PIO Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_Get_AB_RegisterStatus( // \return PIO AB Register Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_ABSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsAB_RegisterSet +//* \brief Test if PIO AB Register is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsAB_RegisterSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_Get_AB_RegisterStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteEnable +//* \brief Output Write Enable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteEnable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be enabled +{ + pPio->PIO_OWER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_OutputWriteDisable +//* \brief Output Write Disable PIO +//*---------------------------------------------------------------------------- +__inline void AT91F_PIO_OutputWriteDisable( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg pio output write to be disabled +{ + pPio->PIO_OWDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetOutputWriteStatus +//* \brief Return PIO Output Write Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetOutputWriteStatus( // \return PIO Output Write Status + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_OWSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputWriteSet +//* \brief Test if PIO OutputWrite is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputWriteSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputWriteStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_GetCfgPullup +//* \brief Return PIO Configuration Pullup +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PIO_GetCfgPullup( // \return PIO Configuration Pullup + AT91PS_PIO pPio) // \arg pointer to a PIO controller +{ + return pPio->PIO_PPUSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsOutputDataStatusSet +//* \brief Test if PIO Output Data Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsOutputDataStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PIO_GetOutputDataStatus(pPio) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIO_IsCfgPullupStatusSet +//* \brief Test if PIO Configuration Pullup Status is Set +//*---------------------------------------------------------------------------- +__inline int AT91F_PIO_IsCfgPullupStatusSet( + AT91PS_PIO pPio, // \arg pointer to a PIO controller + unsigned int flag) // \arg flag to be tested +{ + return (~AT91F_PIO_GetCfgPullup(pPio) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkEnableReg +//* \brief Configure the System Clock Enable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkEnableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCER register + pPMC->PMC_SCER = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgSysClkDisableReg +//* \brief Configure the System Clock Disable Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgSysClkDisableReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + //* Write to the SCDR register + pPMC->PMC_SCDR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetSysClkStatusReg +//* \brief Return the System Clock Status Register of the PMC controller +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetSysClkStatusReg ( + AT91PS_PMC pPMC // pointer to a CAN controller + ) +{ + return pPMC->PMC_SCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePeriphClock +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCER = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePeriphClock +//* \brief Disable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePeriphClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int periphIds) // \arg IDs of peripherals to enable +{ + pPMC->PMC_PCDR = periphIds; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetPeriphClock +//* \brief Get peripheral clock status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetPeriphClock ( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_PCSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscillatorReg ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int mode) +{ + pCKGR->CKGR_MOR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainOscillatorReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainOscillatorReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MOR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_EnableMainOscillator +//* \brief Enable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_EnableMainOscillator( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR |= AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_DisableMainOscillator +//* \brief Disable the main oscillator +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_DisableMainOscillator ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_MOSCEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_CfgMainOscStartUpTime +//* \brief Cfg MOR Register according to the main osc startup time +//*---------------------------------------------------------------------------- +__inline void AT91F_CKGR_CfgMainOscStartUpTime ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int startup_time, // \arg main osc startup time in microsecond (us) + unsigned int slowClock) // \arg slowClock in Hz +{ + pCKGR->CKGR_MOR &= ~AT91C_CKGR_OSCOUNT; + pCKGR->CKGR_MOR |= ((slowClock * startup_time)/(8*1000000)) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClockFreqReg +//* \brief Cfg the main oscillator +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClockFreqReg ( + AT91PS_CKGR pCKGR) // \arg pointer to CKGR controller +{ + return pCKGR->CKGR_MCFR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CKGR_GetMainClock +//* \brief Return Main clock in Hz +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CKGR_GetMainClock ( + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + return ((pCKGR->CKGR_MCFR & AT91C_CKGR_MAINF) * slowClock) >> 4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgMCKReg +//* \brief Cfg Master Clock Register +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgMCKReg ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int mode) +{ + pPMC->PMC_MCKR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetMCKReg +//* \brief Return Master Clock Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetMCKReg( + AT91PS_PMC pPMC) // \arg pointer to PMC controller +{ + return pPMC->PMC_MCKR; +} + +//*------------------------------------------------------------------------------ +//* \fn AT91F_PMC_GetMasterClock +//* \brief Return master clock in Hz which correponds to processor clock for ARM7 +//*------------------------------------------------------------------------------ +__inline unsigned int AT91F_PMC_GetMasterClock ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + AT91PS_CKGR pCKGR, // \arg pointer to CKGR controller + unsigned int slowClock) // \arg slowClock in Hz +{ + unsigned int reg = pPMC->PMC_MCKR; + unsigned int prescaler = (1 << ((reg & AT91C_PMC_PRES) >> 2)); + unsigned int pllDivider, pllMultiplier; + + switch (reg & AT91C_PMC_CSS) { + case AT91C_PMC_CSS_SLOW_CLK: // Slow clock selected + return slowClock / prescaler; + case AT91C_PMC_CSS_MAIN_CLK: // Main clock is selected + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / prescaler; + case AT91C_PMC_CSS_PLL_CLK: // PLLB clock is selected + reg = pCKGR->CKGR_PLLR; + pllDivider = (reg & AT91C_CKGR_DIV); + pllMultiplier = ((reg & AT91C_CKGR_MUL) >> 16) + 1; + return AT91F_CKGR_GetMainClock(pCKGR, slowClock) / pllDivider * pllMultiplier / prescaler; + } + return 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck, // \arg Peripheral clock identifier 0 .. 7 + unsigned int mode) +{ + pPMC->PMC_PCKR[pck] = mode; + pPMC->PMC_SCER = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisablePCK +//* \brief Enable peripheral clock +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisablePCK ( + AT91PS_PMC pPMC, // \arg pointer to PMC controller + unsigned int pck) // \arg Peripheral clock identifier 0 .. 7 +{ + pPMC->PMC_SCDR = (1 << pck) << 8; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_EnableIt +//* \brief Enable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_EnableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pPMC->PMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_DisableIt +//* \brief Disable PMC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_DisableIt ( + AT91PS_PMC pPMC, // pointer to a PMC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pPMC->PMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetStatus +//* \brief Return PMC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetStatus( // \return PMC Interrupt Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_GetInterruptMaskStatus +//* \brief Return PMC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_GetInterruptMaskStatus( // \return PMC Interrupt Mask Status + AT91PS_PMC pPMC) // pointer to a PMC controller +{ + return pPMC->PMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsInterruptMasked +//* \brief Test if PMC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsInterruptMasked( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetInterruptMaskStatus(pPMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_IsStatusSet +//* \brief Test if PMC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PMC_IsStatusSet( + AT91PS_PMC pPMC, // \arg pointer to a PMC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PMC_GetStatus(pPMC) & flag); +}/* ***************************************************************************** + SOFTWARE API FOR RSTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSoftReset +//* \brief Start Software Reset +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSoftReset( + AT91PS_RSTC pRSTC, + unsigned int reset) +{ + pRSTC->RSTC_RCR = (0xA5000000 | reset); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTSetMode +//* \brief Set Reset Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTSetMode( + AT91PS_RSTC pRSTC, + unsigned int mode) +{ + pRSTC->RSTC_RMR = (0xA5000000 | mode); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetMode +//* \brief Get Reset Mode +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetMode( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTGetStatus +//* \brief Get Reset Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTGetStatus( + AT91PS_RSTC pRSTC) +{ + return (pRSTC->RSTC_RSR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTIsSoftRstActive +//* \brief Return !=0 if software reset is still not completed +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_RSTIsSoftRstActive( + AT91PS_RSTC pRSTC) +{ + return ((pRSTC->RSTC_RSR) & AT91C_RSTC_SRCMP); +} +/* ***************************************************************************** + SOFTWARE API FOR RTTC + ***************************************************************************** */ +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_SetRTT_TimeBase() +//* \brief Set the RTT prescaler according to the TimeBase in ms +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetTimeBase( + AT91PS_RTTC pRTTC, + unsigned int ms) +{ + if (ms > 2000) + return 1; // AT91C_TIME_OUT_OF_RANGE + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (((ms << 15) /1000) & 0xFFFF); + return 0; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTSetPrescaler() +//* \brief Set the new prescaler value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTSetPrescaler( + AT91PS_RTTC pRTTC, + unsigned int rtpres) +{ + pRTTC->RTTC_RTMR &= ~0xFFFF; + pRTTC->RTTC_RTMR |= (rtpres & 0xFFFF); + return (pRTTC->RTTC_RTMR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTRestart() +//* \brief Restart the RTT prescaler +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTRestart( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTRST; +} + + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmINT() +//* \brief Enable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearAlarmINT() +//* \brief Disable RTT Alarm Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearAlarmINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_ALMIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetRttIncINT() +//* \brief Enable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR |= AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ClearRttIncINT() +//* \brief Disable RTT INC Interrupt +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTClearRttIncINT( + AT91PS_RTTC pRTTC) +{ + pRTTC->RTTC_RTMR &= ~AT91C_RTTC_RTTINCIEN; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_SetAlarmValue() +//* \brief Set RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline void AT91F_RTTSetAlarmValue( + AT91PS_RTTC pRTTC, unsigned int alarm) +{ + pRTTC->RTTC_RTAR = alarm; +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_GetAlarmValue() +//* \brief Get RTT Alarm Value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetAlarmValue( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTAR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTTGetStatus() +//* \brief Read the RTT status +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTGetStatus( + AT91PS_RTTC pRTTC) +{ + return(pRTTC->RTTC_RTSR); +} + +//*-------------------------------------------------------------------------------------- +//* \fn AT91F_RTT_ReadValue() +//* \brief Read the RTT value +//*-------------------------------------------------------------------------------------- +__inline unsigned int AT91F_RTTReadValue( + AT91PS_RTTC pRTTC) +{ + register volatile unsigned int val1,val2; + do + { + val1 = pRTTC->RTTC_RTVR; + val2 = pRTTC->RTTC_RTVR; + } + while(val1 != val2); + return(val1); +} +/* ***************************************************************************** + SOFTWARE API FOR PITC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITInit +//* \brief System timer init : period in µsecond, system clock freq in MHz +//*---------------------------------------------------------------------------- +__inline void AT91F_PITInit( + AT91PS_PITC pPITC, + unsigned int period, + unsigned int pit_frequency) +{ + pPITC->PITC_PIMR = period? (period * pit_frequency + 8) >> 4 : 0; // +8 to avoid %10 and /10 + pPITC->PITC_PIMR |= AT91C_PITC_PITEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITSetPIV +//* \brief Set the PIT Periodic Interval Value +//*---------------------------------------------------------------------------- +__inline void AT91F_PITSetPIV( + AT91PS_PITC pPITC, + unsigned int piv) +{ + pPITC->PITC_PIMR = piv | (pPITC->PITC_PIMR & (AT91C_PITC_PITEN | AT91C_PITC_PITIEN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITEnableInt +//* \brief Enable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITEnableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR |= AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITDisableInt +//* \brief Disable PIT periodic interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PITDisableInt( + AT91PS_PITC pPITC) +{ + pPITC->PITC_PIMR &= ~AT91C_PITC_PITIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetMode +//* \brief Read PIT mode register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetMode( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIMR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetStatus +//* \brief Read PIT status register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetStatus( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PISR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIIR +//* \brief Read PIT CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIIR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIIR); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITGetPIVR +//* \brief Read System timer CPIV and PICNT without ressetting the counters +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PITGetPIVR( + AT91PS_PITC pPITC) +{ + return(pPITC->PITC_PIVR); +} +/* ***************************************************************************** + SOFTWARE API FOR WDTC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSetMode +//* \brief Set Watchdog Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTSetMode( + AT91PS_WDTC pWDTC, + unsigned int Mode) +{ + pWDTC->WDTC_WDMR = Mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTRestart +//* \brief Restart Watchdog +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTRestart( + AT91PS_WDTC pWDTC) +{ + pWDTC->WDTC_WDCR = 0xA5000001; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTSGettatus +//* \brief Get Watchdog Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTSGettatus( + AT91PS_WDTC pWDTC) +{ + return(pWDTC->WDTC_WDSR & 0x3); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTGetPeriod +//* \brief Translate ms into Watchdog Compatible value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_WDTGetPeriod(unsigned int ms) +{ + if ((ms < 4) || (ms > 16000)) + return 0; + return((ms << 8) / 1000); +} +/* ***************************************************************************** + SOFTWARE API FOR VREG + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Enable_LowPowerMode +//* \brief Enable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Enable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR |= AT91C_VREG_PSTDBY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_Disable_LowPowerMode +//* \brief Disable VREG Low Power Mode +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_Disable_LowPowerMode( + AT91PS_VREG pVREG) +{ + pVREG->VREG_MR &= ~AT91C_VREG_PSTDBY; +}/* ***************************************************************************** + SOFTWARE API FOR MC + ***************************************************************************** */ + +#define AT91C_MC_CORRECT_KEY ((unsigned int) 0x5A << 24) // (MC) Correct Protect Key + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_Remap +//* \brief Make Remap +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_Remap (void) // +{ + AT91PS_MC pMC = (AT91PS_MC) AT91C_BASE_MC; + + pMC->MC_RCR = AT91C_MC_RCB; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_CfgModeReg +//* \brief Configure the EFC Mode Register of the MC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_CfgModeReg ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int mode) // mode register +{ + // Write to the FMR register + pMC->MC_FMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetModeReg +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetModeReg( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_ComputeFMCN +//* \brief Return MC EFC Mode Regsiter +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_ComputeFMCN( + int master_clock) // master clock in Hz +{ + return (master_clock/1000000 +2); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_PerformCmd +//* \brief Perform EFC Command +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_EFC_PerformCmd ( + AT91PS_MC pMC, // pointer to a MC controller + unsigned int transfer_cmd) +{ + pMC->MC_FCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_GetStatus +//* \brief Return MC EFC Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_GetStatus( + AT91PS_MC pMC) // pointer to a MC controller +{ + return pMC->MC_FSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptMasked +//* \brief Test if EFC MC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptMasked( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetModeReg(pMC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_EFC_IsInterruptSet +//* \brief Test if EFC MC Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_MC_EFC_IsInterruptSet( + AT91PS_MC pMC, // \arg pointer to a MC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_MC_EFC_GetStatus(pMC) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR SPI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Open +//* \brief Open a SPI Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgCs +//* \brief Configure SPI chip select register +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgCs ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int cs, // SPI cs number (0 to 3) + int val) // chip select register +{ + //* Write to the CSR register + *(pSPI->SPI_CSR + cs) = val; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_EnableIt +//* \brief Enable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_EnableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pSPI->SPI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_DisableIt +//* \brief Disable SPI interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_DisableIt ( + AT91PS_SPI pSPI, // pointer to a SPI controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pSPI->SPI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Reset +//* \brief Reset the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Reset ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Enable +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Enable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Disable +//* \brief Disable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Disable ( + AT91PS_SPI pSPI // pointer to a SPI controller + ) +{ + //* Write to the CR register + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgMode +//* \brief Enable the SPI controller +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgMode ( + AT91PS_SPI pSPI, // pointer to a SPI controller + int mode) // mode register +{ + //* Write to the MR register + pSPI->SPI_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_CfgPCS +//* \brief Switch to the correct PCS of SPI Mode Register : Fixed Peripheral Selected +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_CfgPCS ( + AT91PS_SPI pSPI, // pointer to a SPI controller + char PCS_Device) // PCS of the Device +{ + //* Write to the MR register + pSPI->SPI_MR &= 0xFFF0FFFF; + pSPI->SPI_MR |= ( (PCS_Device<<16) & AT91C_SPI_PCS ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_ReceiveFrame ( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is bSPIy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_SendFrame( + AT91PS_SPI pSPI, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSPI->SPI_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_Close +//* \brief Close SPI: disable IT disable transfert, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_Close ( + AT91PS_SPI pSPI) // \arg pointer to a SPI controller +{ + //* Reset all the Chip Select register + pSPI->SPI_CSR[0] = 0 ; + pSPI->SPI_CSR[1] = 0 ; + pSPI->SPI_CSR[2] = 0 ; + pSPI->SPI_CSR[3] = 0 ; + + //* Reset the SPI mode + pSPI->SPI_MR = 0 ; + + //* Disable all interrupts + pSPI->SPI_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pSPI->SPI_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pSPI->SPI_CR = AT91C_SPI_SPIDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI_PutChar ( + AT91PS_SPI pSPI, + unsigned int character, + unsigned int cs_number ) +{ + unsigned int value_for_cs; + value_for_cs = (~(1 << cs_number)) & 0xF; //Place a zero among a 4 ONEs number + pSPI->SPI_TDR = (character & 0xFFFF) | (value_for_cs << 16); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_GetChar ( + const AT91PS_SPI pSPI) +{ + return((pSPI->SPI_RDR) & 0xFFFF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_GetInterruptMaskStatus +//* \brief Return SPI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SPI_GetInterruptMaskStatus( // \return SPI Interrupt Mask Status + AT91PS_SPI pSpi) // \arg pointer to a SPI controller +{ + return pSpi->SPI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI_IsInterruptMasked +//* \brief Test if SPI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SPI_IsInterruptMasked( + AT91PS_SPI pSpi, // \arg pointer to a SPI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SPI_GetInterruptMaskStatus(pSpi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR USART + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Calculate the baudrate +//* Standard Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_ASYNC_SCK_MODE ( AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_EXT ) + +//* Standard Synchronous Mode : 8 bits , 1 stop , no parity +#define AT91C_US_SYNC_MODE ( AT91C_US_SYNC + \ + AT91C_US_USMODE_NORMAL + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//* SCK used Label +#define AT91C_US_SCK_USED (AT91C_US_CKLO | AT91C_US_CLKS_EXT) + +//* Standard ISO T=0 Mode : 8 bits , 1 stop , parity +#define AT91C_US_ISO_READER_MODE ( AT91C_US_USMODE_ISO7816_0 + \ + AT91C_US_CLKS_CLOCK +\ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_EVEN + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CKLO +\ + AT91C_US_OVER) + +//* Standard IRDA mode +#define AT91C_US_ASYNC_IRDA_MODE ( AT91C_US_USMODE_IRDA + \ + AT91C_US_NBSTOP_1_BIT + \ + AT91C_US_PAR_NONE + \ + AT91C_US_CHRL_8_BITS + \ + AT91C_US_CLKS_CLOCK ) + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Baudrate +//* \brief Caluculate baud_value according to the main clock and the baud rate +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Baudrate ( + const unsigned int main_clock, // \arg peripheral clock + const unsigned int baud_rate) // \arg UART baudrate +{ + unsigned int baud_value = ((main_clock*10)/(baud_rate * 16)); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + return baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetBaudrate ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg UART baudrate +{ + //* Define the baud rate divisor register + pUSART->US_BRGR = AT91F_US_Baudrate(mainClock, speed); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetTimeguard +//* \brief Set USART timeguard +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetTimeguard ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int timeguard) // \arg timeguard value +{ + //* Write the Timeguard Register + pUSART->US_TTGR = timeguard ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableIt +//* \brief Enable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUSART->US_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableIt +//* \brief Disable USART IT +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableIt ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IER register + pUSART->US_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Configure +//* \brief Configure USART +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Configure ( + AT91PS_USART pUSART, // \arg pointer to a USART controller + unsigned int mainClock, // \arg peripheral clock + unsigned int mode , // \arg mode Register to be programmed + unsigned int baudRate , // \arg baudrate to be programmed + unsigned int timeguard ) // \arg timeguard to be programmed +{ + //* Disable interrupts + pUSART->US_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pUSART->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; + + //* Define the baud rate divisor register + AT91F_US_SetBaudrate(pUSART, mainClock, baudRate); + + //* Write the Timeguard Register + AT91F_US_SetTimeguard(pUSART, timeguard); + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Define the USART mode + pUSART->US_MR = mode ; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableRx +//* \brief Enable receiving characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_EnableTx +//* \brief Enable sending characters +//*---------------------------------------------------------------------------- +__inline void AT91F_US_EnableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetRx +//* \brief Reset Receiver and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset receiver + pUSART->US_CR = AT91C_US_RSTRX; + //* Re-Enable receiver + pUSART->US_CR = AT91C_US_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ResetTx +//* \brief Reset Transmitter and re-enable it +//*---------------------------------------------------------------------------- +__inline void AT91F_US_ResetTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset transmitter + pUSART->US_CR = AT91C_US_RSTTX; + //* Enable transmitter + pUSART->US_CR = AT91C_US_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableRx +//* \brief Disable Receiver +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableRx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable receiver + pUSART->US_CR = AT91C_US_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_DisableTx +//* \brief Disable Transmitter +//*---------------------------------------------------------------------------- +__inline void AT91F_US_DisableTx ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Disable transmitter + pUSART->US_CR = AT91C_US_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Close +//* \brief Close USART: disable IT disable receiver and transmitter, close PDC +//*---------------------------------------------------------------------------- +__inline void AT91F_US_Close ( + AT91PS_USART pUSART) // \arg pointer to a USART controller +{ + //* Reset the baud rate divisor register + pUSART->US_BRGR = 0 ; + + //* Reset the USART mode + pUSART->US_MR = 0 ; + + //* Reset the Timeguard Register + pUSART->US_TTGR = 0; + + //* Disable all interrupts + pUSART->US_IDR = 0xFFFFFFFF ; + + //* Abort the Peripheral Data Transfers + AT91F_PDC_Close((AT91PS_PDC) &(pUSART->US_RPR)); + + //* Disable receiver and transmitter and stop any activity immediately + pUSART->US_CR = AT91C_US_TXDIS | AT91C_US_RXDIS | AT91C_US_RSTTX | AT91C_US_RSTRX ; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_TxReady +//* \brief Return 1 if a character can be written in US_THR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_TxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_TXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_RxReady +//* \brief Return 1 if a character can be read in US_RHR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_RxReady ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & AT91C_US_RXRDY); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_Error +//* \brief Return the error flag +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_Error ( + AT91PS_USART pUSART ) // \arg pointer to a USART controller +{ + return (pUSART->US_CSR & + (AT91C_US_OVRE | // Overrun error + AT91C_US_FRAME | // Framing error + AT91C_US_PARE)); // Parity error +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_PutChar +//* \brief Send a character,does not check if ready to send +//*---------------------------------------------------------------------------- +__inline void AT91F_US_PutChar ( + AT91PS_USART pUSART, + int character ) +{ + pUSART->US_THR = (character & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_GetChar +//* \brief Receive a character,does not check if a character is available +//*---------------------------------------------------------------------------- +__inline int AT91F_US_GetChar ( + const AT91PS_USART pUSART) +{ + return((pUSART->US_RHR) & 0x1FF); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_SendFrame( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initializaed with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_US_ReceiveFrame ( + AT91PS_USART pUSART, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pUSART->US_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US_SetIrdaFilter +//* \brief Set the value of IrDa filter tregister +//*---------------------------------------------------------------------------- +__inline void AT91F_US_SetIrdaFilter ( + AT91PS_USART pUSART, + unsigned char value +) +{ + pUSART->US_IF = value; +} + +/* ***************************************************************************** + SOFTWARE API FOR SSC + ***************************************************************************** */ +//* Define the standard I2S mode configuration + +//* Configuration to set in the SSC Transmit Clock Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + AT91C_SSC_CKS_DIV +\ + AT91C_SSC_CKO_CONTINOUS +\ + AT91C_SSC_CKG_NONE +\ + AT91C_SSC_START_FALL_RF +\ + AT91C_SSC_STTOUT +\ + ((1<<16) & AT91C_SSC_STTDLY) +\ + ((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24)) + + +//* Configuration to set in the SSC Transmit Frame Mode Register +//* Parameters : nb_bit_by_slot : 8, 16 or 32 bits +//* nb_slot_by_frame : number of channels +#define AT91C_I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\ + (nb_bit_by_slot-1) +\ + AT91C_SSC_MSBF +\ + (((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB) +\ + (((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\ + AT91C_SSC_FSOS_NEGATIVE) + + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SetBaudrate +//* \brief Set the baudrate according to the CPU clock +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_SetBaudrate ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int mainClock, // \arg peripheral clock + unsigned int speed) // \arg SSC baudrate +{ + unsigned int baud_value; + //* Define the baud rate divisor register + if (speed == 0) + baud_value = 0; + else + { + baud_value = (unsigned int) (mainClock * 10)/(2*speed); + if ((baud_value % 10) >= 5) + baud_value = (baud_value / 10) + 1; + else + baud_value /= 10; + } + + pSSC->SSC_CMR = baud_value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_Configure +//* \brief Configure SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_Configure ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int syst_clock, // \arg System Clock Frequency + unsigned int baud_rate, // \arg Expected Baud Rate Frequency + unsigned int clock_rx, // \arg Receiver Clock Parameters + unsigned int mode_rx, // \arg mode Register to be programmed + unsigned int clock_tx, // \arg Transmitter Clock Parameters + unsigned int mode_tx) // \arg mode Register to be programmed +{ + //* Disable interrupts + pSSC->SSC_IDR = (unsigned int) -1; + + //* Reset receiver and transmitter + pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ; + + //* Define the Clock Mode Register + AT91F_SSC_SetBaudrate(pSSC, syst_clock, baud_rate); + + //* Write the Receive Clock Mode Register + pSSC->SSC_RCMR = clock_rx; + + //* Write the Transmit Clock Mode Register + pSSC->SSC_TCMR = clock_tx; + + //* Write the Receive Frame Mode Register + pSSC->SSC_RFMR = mode_rx; + + //* Write the Transmit Frame Mode Register + pSSC->SSC_TFMR = mode_tx; + + //* Clear Transmit and Receive Counters + AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR)); + + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableRx +//* \brief Enable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable receiver + pSSC->SSC_CR = AT91C_SSC_RXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableRx +//* \brief Disable receiving datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableRx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable receiver + pSSC->SSC_CR = AT91C_SSC_RXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableTx +//* \brief Enable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Enable transmitter + pSSC->SSC_CR = AT91C_SSC_TXEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableTx +//* \brief Disable sending datas +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableTx ( + AT91PS_SSC pSSC) // \arg pointer to a SSC controller +{ + //* Disable transmitter + pSSC->SSC_CR = AT91C_SSC_TXDIS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_EnableIt +//* \brief Enable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_EnableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pSSC->SSC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_DisableIt +//* \brief Disable SSC IT +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_DisableIt ( + AT91PS_SSC pSSC, // \arg pointer to a SSC controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pSSC->SSC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_ReceiveFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_ReceiveFrame ( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_ReceiveFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_SendFrame +//* \brief Return 2 if PDC has been initialized with Buffer and Next Buffer, 1 if PDC has been initialized with Next Buffer, 0 if PDC is busy +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_SendFrame( + AT91PS_SSC pSSC, + char *pBuffer, + unsigned int szBuffer, + char *pNextBuffer, + unsigned int szNextBuffer ) +{ + return AT91F_PDC_SendFrame( + (AT91PS_PDC) &(pSSC->SSC_RPR), + pBuffer, + szBuffer, + pNextBuffer, + szNextBuffer); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_GetInterruptMaskStatus +//* \brief Return SSC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_SSC_GetInterruptMaskStatus( // \return SSC Interrupt Mask Status + AT91PS_SSC pSsc) // \arg pointer to a SSC controller +{ + return pSsc->SSC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_IsInterruptMasked +//* \brief Test if SSC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_SSC_IsInterruptMasked( + AT91PS_SSC pSsc, // \arg pointer to a SSC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_SSC_GetInterruptMaskStatus(pSsc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TWI + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_EnableIt +//* \brief Enable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_EnableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pTWI->TWI_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_DisableIt +//* \brief Disable TWI IT +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_DisableIt ( + AT91PS_TWI pTWI, // \arg pointer to a TWI controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pTWI->TWI_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_Configure +//* \brief Configure TWI in master mode +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_Configure ( AT91PS_TWI pTWI ) // \arg pointer to a TWI controller +{ + //* Disable interrupts + pTWI->TWI_IDR = (unsigned int) -1; + + //* Reset peripheral + pTWI->TWI_CR = AT91C_TWI_SWRST; + + //* Set Master mode + pTWI->TWI_CR = AT91C_TWI_MSEN; + +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_GetInterruptMaskStatus +//* \brief Return TWI Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TWI_GetInterruptMaskStatus( // \return TWI Interrupt Mask Status + AT91PS_TWI pTwi) // \arg pointer to a TWI controller +{ + return pTwi->TWI_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_IsInterruptMasked +//* \brief Test if TWI Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TWI_IsInterruptMasked( + AT91PS_TWI pTwi, // \arg pointer to a TWI controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TWI_GetInterruptMaskStatus(pTwi) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR PWMC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetStatus +//* \brief Return PWM Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetStatus( // \return PWM Interrupt Status + AT91PS_PWMC pPWM) // pointer to a PWM controller +{ + return pPWM->PWMC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptEnable +//* \brief Enable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptEnable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be enabled +{ + pPwm->PWMC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_InterruptDisable +//* \brief Disable PWM Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_InterruptDisable( + AT91PS_PWMC pPwm, // \arg pointer to a PWM controller + unsigned int flag) // \arg PWM interrupt to be disabled +{ + pPwm->PWMC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_GetInterruptMaskStatus +//* \brief Return PWM Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_GetInterruptMaskStatus( // \return PWM Interrupt Mask Status + AT91PS_PWMC pPwm) // \arg pointer to a PWM controller +{ + return pPwm->PWMC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsInterruptMasked +//* \brief Test if PWM Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsInterruptMasked( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetInterruptMaskStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_IsStatusSet +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_PWMC_IsStatusSet( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_PWMC_GetStatus(pPWM) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_CfgChannel +//* \brief Test if PWM Interrupt is Set +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int mode, // \arg PWM mode + unsigned int period, // \arg PWM period + unsigned int duty) // \arg PWM duty cycle +{ + pPWM->PWMC_CH[channelId].PWMC_CMR = mode; + pPWM->PWMC_CH[channelId].PWMC_CDTYR = duty; + pPWM->PWMC_CH[channelId].PWMC_CPRDR = period; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StartChannel +//* \brief Enable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StartChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_ENA = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_StopChannel +//* \brief Disable channel +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_StopChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int flag) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_DIS = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWM_UpdateChannel +//* \brief Update Period or Duty Cycle +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_UpdateChannel( + AT91PS_PWMC pPWM, // \arg pointer to a PWM controller + unsigned int channelId, // \arg PWM channel ID + unsigned int update) // \arg Channels IDs to be enabled +{ + pPWM->PWMC_CH[channelId].PWMC_CUPDR = update; +} + +/* ***************************************************************************** + SOFTWARE API FOR UDP + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableIt +//* \brief Enable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be enabled +{ + //* Write to the IER register + pUDP->UDP_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableIt +//* \brief Disable UDP IT +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableIt ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg IT to be disabled +{ + //* Write to the IDR register + pUDP->UDP_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetAddress +//* \brief Set UDP functional address +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetAddress ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char address) // \arg new UDP address +{ + pUDP->UDP_FADDR = (AT91C_UDP_FEN | address); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EnableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EnableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_DisableEp +//* \brief Enable Endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_DisableEp ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] &= ~AT91C_UDP_EPEDS; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_SetState +//* \brief Set UDP Device state +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_SetState ( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg new UDP address +{ + pUDP->UDP_GLBSTATE &= ~(AT91C_UDP_FADDEN | AT91C_UDP_CONFG); + pUDP->UDP_GLBSTATE |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetState +//* \brief return UDP Device state +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetState ( // \return the UDP device state + AT91PS_UDP pUDP) // \arg pointer to a UDP controller +{ + return (pUDP->UDP_GLBSTATE & (AT91C_UDP_FADDEN | AT91C_UDP_CONFG)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_ResetEp +//* \brief Reset UDP endpoint +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_ResetEp ( // \return the UDP device state + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned int flag) // \arg Endpoints to be reset +{ + pUDP->UDP_RSTEP = flag; + pUDP->UDP_RSTEP = 0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStall +//* \brief Endpoint will STALL requests +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpStall( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_FORCESTALL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpWrite +//* \brief Write value in the DPR +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpWrite( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned char value) // \arg value to be written in the DPR +{ + pUDP->UDP_FDR[endpoint] = value; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpRead +//* \brief Return value from the DPR +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpRead( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_FDR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpEndOfWr +//* \brief Notify the UDP that values in DPR are ready to be sent +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpEndOfWr( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + pUDP->UDP_CSR[endpoint] |= AT91C_UDP_TXPKTRDY; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpClear +//* \brief Clear flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpClear( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] &= ~(flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpSet +//* \brief Set flag in the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_EpSet( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint, // \arg endpoint number + unsigned int flag) // \arg flag to be cleared +{ + pUDP->UDP_CSR[endpoint] |= flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_EpStatus +//* \brief Return the endpoint CSR register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_EpStatus( + AT91PS_UDP pUDP, // \arg pointer to a UDP controller + unsigned char endpoint) // \arg endpoint number +{ + return pUDP->UDP_CSR[endpoint]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_GetInterruptMaskStatus +//* \brief Return UDP Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_UDP_GetInterruptMaskStatus( // \return UDP Interrupt Mask Status + AT91PS_UDP pUdp) // \arg pointer to a UDP controller +{ + return pUdp->UDP_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_IsInterruptMasked +//* \brief Test if UDP Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_UDP_IsInterruptMasked( + AT91PS_UDP pUdp, // \arg pointer to a UDP controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_UDP_GetInterruptMaskStatus(pUdp) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR TC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptEnable +//* \brief Enable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptEnable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be enabled +{ + pTc->TC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_InterruptDisable +//* \brief Disable TC Interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TC_InterruptDisable( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg TC interrupt to be disabled +{ + pTc->TC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_GetInterruptMaskStatus +//* \brief Return TC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TC_GetInterruptMaskStatus( // \return TC Interrupt Mask Status + AT91PS_TC pTc) // \arg pointer to a TC controller +{ + return pTc->TC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC_IsInterruptMasked +//* \brief Test if TC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline int AT91F_TC_IsInterruptMasked( + AT91PS_TC pTc, // \arg pointer to a TC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TC_GetInterruptMaskStatus(pTc) & flag); +} + +/* ***************************************************************************** + SOFTWARE API FOR CAN + ***************************************************************************** */ +#define STANDARD_FORMAT 0 +#define EXTENDED_FORMAT 1 + +//*---------------------------------------------------------------------------- +//* \fn AT91F_InitMailboxRegisters() +//* \brief Configure the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_InitMailboxRegisters(AT91PS_CAN_MB CAN_Mailbox, + int mode_reg, + int acceptance_mask_reg, + int id_reg, + int data_low_reg, + int data_high_reg, + int control_reg) +{ + CAN_Mailbox->CAN_MB_MCR = 0x0; + CAN_Mailbox->CAN_MB_MMR = mode_reg; + CAN_Mailbox->CAN_MB_MAM = acceptance_mask_reg; + CAN_Mailbox->CAN_MB_MID = id_reg; + CAN_Mailbox->CAN_MB_MDL = data_low_reg; + CAN_Mailbox->CAN_MB_MDH = data_high_reg; + CAN_Mailbox->CAN_MB_MCR = control_reg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EnableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_EnableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR |= AT91C_CAN_CANEN; + + // Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver + while( (pCAN->CAN_SR & AT91C_CAN_WAKEUP) != AT91C_CAN_WAKEUP ); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DisableCAN() +//* \brief +//*---------------------------------------------------------------------------- +__inline void AT91F_DisableCAN( + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + pCAN->CAN_MR &= ~AT91C_CAN_CANEN; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_EnableIt +//* \brief Enable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_EnableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pCAN->CAN_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_DisableIt +//* \brief Disable CAN interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_DisableIt ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pCAN->CAN_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetStatus +//* \brief Return CAN Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetStatus( // \return CAN Interrupt Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInterruptMaskStatus +//* \brief Return CAN Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInterruptMaskStatus( // \return CAN Interrupt Mask Status + AT91PS_CAN pCAN) // pointer to a CAN controller +{ + return pCAN->CAN_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsInterruptMasked +//* \brief Test if CAN Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsInterruptMasked( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetInterruptMaskStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_IsStatusSet +//* \brief Test if CAN Interrupt is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_IsStatusSet( + AT91PS_CAN pCAN, // \arg pointer to a CAN controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_CAN_GetStatus(pCAN) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgModeReg +//* \brief Configure the Mode Register of the CAN controller +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgModeReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pCAN->CAN_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetModeReg +//* \brief Return the Mode Register of the CAN controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetModeReg ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgBaudrateReg +//* \brief Configure the Baudrate of the CAN controller for the network +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgBaudrateReg ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int baudrate_cfg) +{ + //* Write to the BR register + pCAN->CAN_BR = baudrate_cfg; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetBaudrate +//* \brief Return the Baudrate of the CAN controller for the network value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetBaudrate ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_BR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetInternalCounter +//* \brief Return CAN Timer Regsiter Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetInternalCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetTimestamp +//* \brief Return CAN Timestamp Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetTimestamp ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_TIMESTP; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetErrorCounter +//* \brief Return CAN Error Counter Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetErrorCounter ( + AT91PS_CAN pCAN // pointer to a CAN controller + ) +{ + return pCAN->CAN_ECR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitTransferRequest +//* \brief Request for a transfer on the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitTransferRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int transfer_cmd) +{ + pCAN->CAN_TCR = transfer_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_InitAbortRequest +//* \brief Abort the corresponding mailboxes +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_InitAbortRequest ( + AT91PS_CAN pCAN, // pointer to a CAN controller + unsigned int abort_cmd) +{ + pCAN->CAN_ACR = abort_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageModeReg +//* \brief Program the Message Mode Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mode) +{ + CAN_Mailbox->CAN_MB_MMR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageModeReg +//* \brief Return the Message Mode Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageModeReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageIDReg +//* \brief Program the Message ID Register +//* \brief Version == 0 for Standard messsage, Version == 1 for Extended +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int id, + unsigned char version) +{ + if(version==0) // IDvA Standard Format + CAN_Mailbox->CAN_MB_MID = id<<18; + else // IDvB Extended Format + CAN_Mailbox->CAN_MB_MID = id | (1<<29); // set MIDE bit +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageIDReg +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageIDReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageAcceptanceMaskReg +//* \brief Program the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int mask) +{ + CAN_Mailbox->CAN_MB_MAM = mask; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageAcceptanceMaskReg +//* \brief Return the Message Acceptance Mask Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageAcceptanceMaskReg ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MAM; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetFamilyID +//* \brief Return the Message ID Register +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetFamilyID ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MFID; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageCtrl +//* \brief Request and config for a transfer on the corresponding mailbox +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageCtrlReg ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int message_ctrl_cmd) +{ + CAN_Mailbox->CAN_MB_MCR = message_ctrl_cmd; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageStatus +//* \brief Return CAN Mailbox Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageStatus ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataLow +//* \brief Program data low value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDL = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataLow +//* \brief Return data low value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataLow ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDL; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgMessageDataHigh +//* \brief Program data high value +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox, // pointer to a CAN Mailbox + unsigned int data) +{ + CAN_Mailbox->CAN_MB_MDH = data; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_GetMessageDataHigh +//* \brief Return data high value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_GetMessageDataHigh ( + AT91PS_CAN_MB CAN_Mailbox) // pointer to a CAN Mailbox +{ + return CAN_Mailbox->CAN_MB_MDH; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_Open +//* \brief Open a CAN Port +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_CAN_Open ( + const unsigned int null) // \arg +{ + /* NOT DEFINED AT THIS MOMENT */ + return ( 0 ); +} +/* ***************************************************************************** + SOFTWARE API FOR ADC + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableIt +//* \brief Enable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pADC->ADC_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableIt +//* \brief Disable ADC interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableIt ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pADC->ADC_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetStatus +//* \brief Return ADC Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetStatus( // \return ADC Interrupt Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_SR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetInterruptMaskStatus +//* \brief Return ADC Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetInterruptMaskStatus( // \return ADC Interrupt Mask Status + AT91PS_ADC pADC) // pointer to a ADC controller +{ + return pADC->ADC_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsInterruptMasked +//* \brief Test if ADC Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsInterruptMasked( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetInterruptMaskStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_IsStatusSet +//* \brief Test if ADC Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_IsStatusSet( + AT91PS_ADC pADC, // \arg pointer to a ADC controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_ADC_GetStatus(pADC) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgModeReg +//* \brief Configure the Mode Register of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgModeReg ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pADC->ADC_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetModeReg +//* \brief Return the Mode Register of the ADC controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetModeReg ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgTimings +//* \brief Configure the different necessary timings of the ADC controller +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgTimings ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int mck_clock, // in MHz + unsigned int adc_clock, // in MHz + unsigned int startup_time, // in us + unsigned int sample_and_hold_time) // in ns +{ + unsigned int prescal,startup,shtim; + + prescal = mck_clock/(2*adc_clock) - 1; + startup = adc_clock*startup_time/8 - 1; + shtim = adc_clock*sample_and_hold_time/1000 - 1; + + //* Write to the MR register + pADC->ADC_MR = ( (prescal<<8) & AT91C_ADC_PRESCAL) | ( (startup<<16) & AT91C_ADC_STARTUP) | ( (shtim<<24) & AT91C_ADC_SHTIM); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_EnableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_EnableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHER register + pADC->ADC_CHER = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_DisableChannel +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_DisableChannel ( + AT91PS_ADC pADC, // pointer to a ADC controller + unsigned int channel) // mode register +{ + //* Write to the CHDR register + pADC->ADC_CHDR = channel; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetChannelStatus +//* \brief Return ADC Timer Register Value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetChannelStatus ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CHSR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_StartConversion +//* \brief Software request for a analog to digital conversion +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_StartConversion ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_SoftReset +//* \brief Software reset +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_SoftReset ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + pADC->ADC_CR = AT91C_ADC_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetLastConvertedData +//* \brief Return the Last Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetLastConvertedData ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_LCDR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH0 +//* \brief Return the Channel 0 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH0 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR0; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH1 +//* \brief Return the Channel 1 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH1 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR1; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH2 +//* \brief Return the Channel 2 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH2 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR2; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH3 +//* \brief Return the Channel 3 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH3 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR3; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH4 +//* \brief Return the Channel 4 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH4 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR4; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH5 +//* \brief Return the Channel 5 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH5 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR5; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH6 +//* \brief Return the Channel 6 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH6 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR6; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_GetConvertedDataCH7 +//* \brief Return the Channel 7 Converted Data +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_ADC_GetConvertedDataCH7 ( + AT91PS_ADC pADC // pointer to a ADC controller + ) +{ + return pADC->ADC_CDR7; +} + +/* ***************************************************************************** + SOFTWARE API FOR AES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_EnableIt +//* \brief Enable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_EnableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pAES->AES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_DisableIt +//* \brief Disable AES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_DisableIt ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pAES->AES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetStatus +//* \brief Return AES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetStatus( // \return AES Interrupt Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetInterruptMaskStatus +//* \brief Return AES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetInterruptMaskStatus( // \return AES Interrupt Mask Status + AT91PS_AES pAES) // pointer to a AES controller +{ + return pAES->AES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsInterruptMasked +//* \brief Test if AES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsInterruptMasked( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetInterruptMaskStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_IsStatusSet +//* \brief Test if AES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_IsStatusSet( + AT91PS_AES pAES, // \arg pointer to a AES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_AES_GetStatus(pAES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgModeReg +//* \brief Configure the Mode Register of the AES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgModeReg ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pAES->AES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetModeReg +//* \brief Return the Mode Register of the AES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetModeReg ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + return pAES->AES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_StartProcessing ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SoftReset +//* \brief Reset AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SoftReset ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_LoadNewSeed +//* \brief Load New Seed in the random number generator +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_LoadNewSeed ( + AT91PS_AES pAES // pointer to a AES controller + ) +{ + pAES->AES_CR = AT91C_AES_LOADSEED; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetCryptoKey +//* \brief Set Cryptographic Key x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetCryptoKey ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int keyword + ) +{ + pAES->AES_KEYWxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_InputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int indata + ) +{ + pAES->AES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_AES_GetOutputData ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index + ) +{ + return pAES->AES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_SetInitializationVector +//* \brief Set Initialization Vector (or Counter) x +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_SetInitializationVector ( + AT91PS_AES pAES, // pointer to a AES controller + unsigned char index, + unsigned int initvector + ) +{ + pAES->AES_IVxR[index] = initvector; +} + +/* ***************************************************************************** + SOFTWARE API FOR TDES + ***************************************************************************** */ +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_EnableIt +//* \brief Enable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_EnableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be enabled +{ + //* Write to the IER register + pTDES->TDES_IER = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_DisableIt +//* \brief Disable TDES interrupt +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_DisableIt ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int flag) // IT to be disabled +{ + //* Write to the IDR register + pTDES->TDES_IDR = flag; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetStatus +//* \brief Return TDES Interrupt Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetStatus( // \return TDES Interrupt Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_ISR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetInterruptMaskStatus +//* \brief Return TDES Interrupt Mask Status +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetInterruptMaskStatus( // \return TDES Interrupt Mask Status + AT91PS_TDES pTDES) // pointer to a TDES controller +{ + return pTDES->TDES_IMR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsInterruptMasked +//* \brief Test if TDES Interrupt is Masked +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsInterruptMasked( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetInterruptMaskStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_IsStatusSet +//* \brief Test if TDES Status is Set +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_IsStatusSet( + AT91PS_TDES pTDES, // \arg pointer to a TDES controller + unsigned int flag) // \arg flag to be tested +{ + return (AT91F_TDES_GetStatus(pTDES) & flag); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgModeReg +//* \brief Configure the Mode Register of the TDES controller +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgModeReg ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned int mode) // mode register +{ + //* Write to the MR register + pTDES->TDES_MR = mode; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetModeReg +//* \brief Return the Mode Register of the TDES controller value +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetModeReg ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + return pTDES->TDES_MR; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_StartProcessing +//* \brief Start Encryption or Decryption +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_StartProcessing ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_START; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SoftReset +//* \brief Reset TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SoftReset ( + AT91PS_TDES pTDES // pointer to a TDES controller + ) +{ + pTDES->TDES_CR = AT91C_TDES_SWRST; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey1 +//* \brief Set Cryptographic Key 1 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey1 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY1WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey2 +//* \brief Set Cryptographic Key 2 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey2 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY2WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetCryptoKey3 +//* \brief Set Cryptographic Key 3 Word x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetCryptoKey3 ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int keyword + ) +{ + pTDES->TDES_KEY3WxR[index] = keyword; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_InputData +//* \brief Set Input Data x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_InputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int indata + ) +{ + pTDES->TDES_IDATAxR[index] = indata; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_GetOutputData +//* \brief Get Output Data x +//*---------------------------------------------------------------------------- +__inline unsigned int AT91F_TDES_GetOutputData ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index + ) +{ + return pTDES->TDES_ODATAxR[index]; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_SetInitializationVector +//* \brief Set Initialization Vector x +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_SetInitializationVector ( + AT91PS_TDES pTDES, // pointer to a TDES controller + unsigned char index, + unsigned int initvector + ) +{ + pTDES->TDES_IVxR[index] = initvector; +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPMC +//* \brief Enable Peripheral clock in PMC for DBGU +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_DBGU_CfgPIO +//* \brief Configure PIO controllers to drive DBGU signals +//*---------------------------------------------------------------------------- +__inline void AT91F_DBGU_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA27_DRXD ) | + ((unsigned int) AT91C_PA28_DTXD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PMC_CfgPIO +//* \brief Configure PIO controllers to drive PMC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PMC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB30_PCK2 ) | + ((unsigned int) AT91C_PB29_PCK1 ), // Peripheral A + ((unsigned int) AT91C_PB20_PCK0 ) | + ((unsigned int) AT91C_PB0_PCK0 ) | + ((unsigned int) AT91C_PB22_PCK2 ) | + ((unsigned int) AT91C_PB21_PCK1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA30_PCK2 ) | + ((unsigned int) AT91C_PA13_PCK1 ) | + ((unsigned int) AT91C_PA27_PCK3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_VREG_CfgPMC +//* \brief Enable Peripheral clock in PMC for VREG +//*---------------------------------------------------------------------------- +__inline void AT91F_VREG_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RSTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RSTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RSTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPMC +//* \brief Enable Peripheral clock in PMC for SSC +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SSC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SSC_CfgPIO +//* \brief Configure PIO controllers to drive SSC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SSC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA25_RK ) | + ((unsigned int) AT91C_PA22_TK ) | + ((unsigned int) AT91C_PA21_TF ) | + ((unsigned int) AT91C_PA24_RD ) | + ((unsigned int) AT91C_PA26_RF ) | + ((unsigned int) AT91C_PA23_TD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_WDTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for WDTC +//*---------------------------------------------------------------------------- +__inline void AT91F_WDTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPMC +//* \brief Enable Peripheral clock in PMC for US1 +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US1_CfgPIO +//* \brief Configure PIO controllers to drive US1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB26_RI1 ) | + ((unsigned int) AT91C_PB24_DSR1 ) | + ((unsigned int) AT91C_PB23_DCD1 ) | + ((unsigned int) AT91C_PB25_DTR1 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA7_SCK1 ) | + ((unsigned int) AT91C_PA8_RTS1 ) | + ((unsigned int) AT91C_PA6_TXD1 ) | + ((unsigned int) AT91C_PA5_RXD1 ) | + ((unsigned int) AT91C_PA9_CTS1 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPMC +//* \brief Enable Peripheral clock in PMC for US0 +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_US0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_US0_CfgPIO +//* \brief Configure PIO controllers to drive US0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_US0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA0_RXD0 ) | + ((unsigned int) AT91C_PA4_CTS0 ) | + ((unsigned int) AT91C_PA3_RTS0 ) | + ((unsigned int) AT91C_PA2_SCK0 ) | + ((unsigned int) AT91C_PA1_TXD0 ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI1 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI1_CfgPIO +//* \brief Configure PIO controllers to drive SPI1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB16_NPCS13 ) | + ((unsigned int) AT91C_PB10_NPCS11 ) | + ((unsigned int) AT91C_PB11_NPCS12 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA4_NPCS13 ) | + ((unsigned int) AT91C_PA29_NPCS13 ) | + ((unsigned int) AT91C_PA21_NPCS10 ) | + ((unsigned int) AT91C_PA22_SPCK1 ) | + ((unsigned int) AT91C_PA25_NPCS11 ) | + ((unsigned int) AT91C_PA2_NPCS11 ) | + ((unsigned int) AT91C_PA24_MISO1 ) | + ((unsigned int) AT91C_PA3_NPCS12 ) | + ((unsigned int) AT91C_PA26_NPCS12 ) | + ((unsigned int) AT91C_PA23_MOSI1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPMC +//* \brief Enable Peripheral clock in PMC for SPI0 +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SPI0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_SPI0_CfgPIO +//* \brief Configure PIO controllers to drive SPI0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_SPI0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB13_NPCS01 ) | + ((unsigned int) AT91C_PB17_NPCS03 ) | + ((unsigned int) AT91C_PB14_NPCS02 )); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA16_MISO0 ) | + ((unsigned int) AT91C_PA13_NPCS01 ) | + ((unsigned int) AT91C_PA15_NPCS03 ) | + ((unsigned int) AT91C_PA17_MOSI0 ) | + ((unsigned int) AT91C_PA18_SPCK0 ) | + ((unsigned int) AT91C_PA14_NPCS02 ) | + ((unsigned int) AT91C_PA12_NPCS00 ), // Peripheral A + ((unsigned int) AT91C_PA7_NPCS01 ) | + ((unsigned int) AT91C_PA9_NPCS03 ) | + ((unsigned int) AT91C_PA8_NPCS02 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PITC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PITC +//*---------------------------------------------------------------------------- +__inline void AT91F_PITC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPMC +//* \brief Enable Peripheral clock in PMC for AIC +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_FIQ) | + ((unsigned int) 1 << AT91C_ID_IRQ0) | + ((unsigned int) 1 << AT91C_ID_IRQ1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AIC_CfgPIO +//* \brief Configure PIO controllers to drive AIC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_AIC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA30_IRQ0 ) | + ((unsigned int) AT91C_PA29_FIQ ), // Peripheral A + ((unsigned int) AT91C_PA14_IRQ1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_AES_CfgPMC +//* \brief Enable Peripheral clock in PMC for AES +//*---------------------------------------------------------------------------- +__inline void AT91F_AES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_AES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPMC +//* \brief Enable Peripheral clock in PMC for TWI +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TWI)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TWI_CfgPIO +//* \brief Configure PIO controllers to drive TWI signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TWI_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA11_TWCK ) | + ((unsigned int) AT91C_PA10_TWD ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPMC +//* \brief Enable Peripheral clock in PMC for ADC +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_ADC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_ADC_CfgPIO +//* \brief Configure PIO controllers to drive ADC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_ADC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PB18_ADTRG )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH3_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH3 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH3_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB22_PWM3 ), // Peripheral A + ((unsigned int) AT91C_PB30_PWM3 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH2_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB21_PWM2 ), // Peripheral A + ((unsigned int) AT91C_PB29_PWM2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH1_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB20_PWM1 ), // Peripheral A + ((unsigned int) AT91C_PB28_PWM1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CH0_CfgPIO +//* \brief Configure PIO controllers to drive PWMC_CH0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CH0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB19_PWM0 ), // Peripheral A + ((unsigned int) AT91C_PB27_PWM0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_RTTC_CfgPMC +//* \brief Enable Peripheral clock in PMC for RTTC +//*---------------------------------------------------------------------------- +__inline void AT91F_RTTC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_UDP_CfgPMC +//* \brief Enable Peripheral clock in PMC for UDP +//*---------------------------------------------------------------------------- +__inline void AT91F_UDP_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_UDP)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TDES_CfgPMC +//* \brief Enable Peripheral clock in PMC for TDES +//*---------------------------------------------------------------------------- +__inline void AT91F_TDES_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TDES)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPMC +//* \brief Enable Peripheral clock in PMC for EMAC +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_EMAC)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_EMAC_CfgPIO +//* \brief Configure PIO controllers to drive EMAC signals +//*---------------------------------------------------------------------------- +__inline void AT91F_EMAC_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB2_ETX0 ) | + ((unsigned int) AT91C_PB12_ETXER ) | + ((unsigned int) AT91C_PB16_ECOL ) | + ((unsigned int) AT91C_PB11_ETX3 ) | + ((unsigned int) AT91C_PB6_ERX1 ) | + ((unsigned int) AT91C_PB15_ERXDV ) | + ((unsigned int) AT91C_PB13_ERX2 ) | + ((unsigned int) AT91C_PB3_ETX1 ) | + ((unsigned int) AT91C_PB8_EMDC ) | + ((unsigned int) AT91C_PB5_ERX0 ) | + //((unsigned int) AT91C_PB18_EF100 ) | + ((unsigned int) AT91C_PB14_ERX3 ) | + ((unsigned int) AT91C_PB4_ECRS_ECRSDV) | + ((unsigned int) AT91C_PB1_ETXEN ) | + ((unsigned int) AT91C_PB10_ETX2 ) | + ((unsigned int) AT91C_PB0_ETXCK_EREFCK) | + ((unsigned int) AT91C_PB9_EMDIO ) | + ((unsigned int) AT91C_PB7_ERXER ) | + ((unsigned int) AT91C_PB17_ERXCK ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC0 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC0)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC0_CfgPIO +//* \brief Configure PIO controllers to drive TC0 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC0_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB23_TIOA0 ) | + ((unsigned int) AT91C_PB24_TIOB0 ), // Peripheral A + ((unsigned int) AT91C_PB12_TCLK0 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC1 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC1)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC1_CfgPIO +//* \brief Configure PIO controllers to drive TC1 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC1_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB25_TIOA1 ) | + ((unsigned int) AT91C_PB26_TIOB1 ), // Peripheral A + ((unsigned int) AT91C_PB19_TCLK1 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPMC +//* \brief Enable Peripheral clock in PMC for TC2 +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_TC2)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_TC2_CfgPIO +//* \brief Configure PIO controllers to drive TC2 signals +//*---------------------------------------------------------------------------- +__inline void AT91F_TC2_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOB, // PIO controller base address + ((unsigned int) AT91C_PB28_TIOB2 ) | + ((unsigned int) AT91C_PB27_TIOA2 ), // Peripheral A + 0); // Peripheral B + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + 0, // Peripheral A + ((unsigned int) AT91C_PA15_TCLK2 )); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_MC_CfgPMC +//* \brief Enable Peripheral clock in PMC for MC +//*---------------------------------------------------------------------------- +__inline void AT91F_MC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_SYS)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOA_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOA +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOA_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOA)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PIOB_CfgPMC +//* \brief Enable Peripheral clock in PMC for PIOB +//*---------------------------------------------------------------------------- +__inline void AT91F_PIOB_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PIOB)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPMC +//* \brief Enable Peripheral clock in PMC for CAN +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_CAN)); +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_CAN_CfgPIO +//* \brief Configure PIO controllers to drive CAN signals +//*---------------------------------------------------------------------------- +__inline void AT91F_CAN_CfgPIO (void) +{ + // Configure PIO controllers to periph mode + AT91F_PIO_CfgPeriph( + AT91C_BASE_PIOA, // PIO controller base address + ((unsigned int) AT91C_PA20_CANTX ) | + ((unsigned int) AT91C_PA19_CANRX ), // Peripheral A + 0); // Peripheral B +} + +//*---------------------------------------------------------------------------- +//* \fn AT91F_PWMC_CfgPMC +//* \brief Enable Peripheral clock in PMC for PWMC +//*---------------------------------------------------------------------------- +__inline void AT91F_PWMC_CfgPMC (void) +{ + AT91F_PMC_EnablePeriphClock( + AT91C_BASE_PMC, // PIO controller base address + ((unsigned int) 1 << AT91C_ID_PWMC)); +} + +#endif // lib_AT91SAM7X256_H diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/port.c new file mode 100644 index 0000000..faac11d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/port.c @@ -0,0 +1,260 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Atmel ARM7 port. + *----------------------------------------------------------*/ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to setup the PIT. */ +#define portPIT_CLOCK_DIVISOR ( ( uint32_t ) 16 ) +#define portPIT_COUNTER_VALUE ( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + + +#define portINT_LEVEL_SENSITIVE 0 +#define portPIT_ENABLE ( ( uint16_t ) 0x1 << 24 ) +#define portPIT_INT_ENABLE ( ( uint16_t ) 0x1 << 25 ) +/*-----------------------------------------------------------*/ + +/* Setup the PIT to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + static __arm __irq void vPortNonPreemptiveTick( void ); + static __arm __irq void vPortNonPreemptiveTick( void ) + { + uint32_t ulDummy; + + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + xTaskIncrementTick(); + + /* Clear the PIT interrupt. */ + ulDummy = AT91C_BASE_PITC->PITC_PIVR; + + /* End the interrupt in the AIC. */ + AT91C_BASE_AIC->AIC_EOICR = ulDummy; + } + +#else + + /* Currently the IAR port requires the preemptive tick function to be + defined in an asm file. */ + +#endif + +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +AT91PS_PITC pxPIT = AT91C_BASE_PITC; + + /* Setup the AIC for PIT interrupts. The interrupt routine chosen depends + on whether the preemptive or cooperative scheduler is being used. */ + #if configUSE_PREEMPTION == 0 + + AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortNonPreemptiveTick ); + + #else + + extern void ( vPortPreemptiveTick )( void ); + AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortPreemptiveTick ); + + #endif + + /* Configure the PIT period. */ + pxPIT->PITC_PIMR = portPIT_ENABLE | portPIT_INT_ENABLE | portPIT_COUNTER_VALUE; + + /* Enable the interrupt. Global interrupts are disables at this point so + this is safe. */ + AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_SYS ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_interrupt(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_interrupt(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portasm.s79 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portasm.s79 new file mode 100644 index 0000000..57795fb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portasm.s79 @@ -0,0 +1,89 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + RSEG ICODE:CODE + CODE32 + + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + + PUBLIC vPortYieldProcessor + PUBLIC vPortPreemptiveTick + PUBLIC vPortStartFirstTask + +#include "AT91SAM7S64_inc.h" +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Preemptive context switch function. This will only ever get installed if +; portUSE_PREEMPTION is set to 1 in portmacro.h. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortPreemptiveTick: + portSAVE_CONTEXT ; Save the context of the current task. + + LDR R0, =xTaskIncrementTick ; Increment the tick count - this may wake a task. + mov lr, pc + BX R0 + + CMP R0, #0 + BEQ SkipContextSwitch + LDR R0, =vTaskSwitchContext ; Select the next task to execute. + mov lr, pc + BX R0 +SkipContextSwitch + LDR R14, =AT91C_BASE_PITC ; Clear the PIT interrupt + LDR R0, [R14, #PITC_PIVR ] + + LDR R14, =AT91C_BASE_AIC ; Mark the End of Interrupt on the AIC + STR R14, [R14, #AIC_EOICR] + + portRESTORE_CONTEXT ; Restore the context of the selected task. + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portmacro.h new file mode 100644 index 0000000..854e814 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portmacro.h @@ -0,0 +1,112 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortDisableInterruptsFromThumb( void ); +__arm __interwork void vPortEnableInterruptsFromThumb( void ); +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/ISR_Support.h new file mode 100644 index 0000000..a11b3fb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/ISR_Support.h @@ -0,0 +1,105 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/port.c new file mode 100644 index 0000000..3a051fa --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/port.c @@ -0,0 +1,257 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Atmel ARM7 port. + *----------------------------------------------------------*/ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware includes. */ +#include +#include +#include +#include +#include +#include +#include +#include + +/*-----------------------------------------------------------*/ + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to setup the PIT. */ +#define port1MHz_IN_Hz ( 1000000ul ) +#define port1SECOND_IN_uS ( 1000000.0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + + +#define portINT_LEVEL_SENSITIVE 0 +#define portPIT_ENABLE ( ( uint16_t ) 0x1 << 24 ) +#define portPIT_INT_ENABLE ( ( uint16_t ) 0x1 << 25 ) +/*-----------------------------------------------------------*/ + +/* Setup the PIT to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* The PIT interrupt handler - the RTOS tick. */ +static void vPortTickISR( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + #ifdef THUMB_INTERWORK + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + #endif + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +static __arm void vPortTickISR( void ) +{ +volatile uint32_t ulDummy; + + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Clear the PIT interrupt. */ + ulDummy = AT91C_BASE_PITC->PITC_PIVR; + + /* To remove compiler warning. */ + ( void ) ulDummy; + + /* The AIC is cleared in the asm wrapper, outside of this function. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulPeriodIn_uS = ( 1.0 / ( double ) configTICK_RATE_HZ ) * port1SECOND_IN_uS; + + /* Setup the PIT for the required frequency. */ + PIT_Init( ulPeriodIn_uS, BOARD_MCK / port1MHz_IN_Hz ); + + /* Setup the PIT interrupt. */ + AIC_DisableIT( AT91C_ID_SYS ); + AIC_ConfigureIT( AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, vPortTickISR ); + AIC_EnableIT( AT91C_ID_SYS ); + PIT_EnableIT(); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_irq(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_irq(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portasm.s79 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portasm.s79 new file mode 100644 index 0000000..f690566 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portasm.s79 @@ -0,0 +1,61 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + RSEG ICODE:CODE + CODE32 + + EXTERN vTaskSwitchContext + + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portmacro.h new file mode 100644 index 0000000..dec552e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portmacro.h @@ -0,0 +1,115 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortDisableInterruptsFromThumb( void ); +__arm __interwork void vPortEnableInterruptsFromThumb( void ); +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_irq() +#define portENABLE_INTERRUPTS() __enable_irq() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/ISR_Support.h new file mode 100644 index 0000000..9167d85 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/ISR_Support.h @@ -0,0 +1,106 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/port.c new file mode 100644 index 0000000..e96d003 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/port.c @@ -0,0 +1,318 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Philips ARM7 port. + *----------------------------------------------------------*/ + +/* + Changes from V3.2.2 + + + Bug fix - The prescale value for the timer setup is now written to T0PR + instead of T0PC. This bug would have had no effect unless a prescale + value was actually used. +*/ + +/* Standard includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to setup the PIT. */ +#define portPIT_CLOCK_DIVISOR ( ( uint32_t ) 16 ) +#define portPIT_COUNTER_VALUE ( ( ( configCPU_CLOCK_HZ / portPIT_CLOCK_DIVISOR ) / 1000UL ) * portTICK_PERIOD_MS ) + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + + +#define portINT_LEVEL_SENSITIVE 0 +#define portPIT_ENABLE ( ( uint16_t ) 0x1 << 24 ) +#define portPIT_INT_ENABLE ( ( uint16_t ) 0x1 << 25 ) + +/* Constants required to setup the VIC for the tick ISR. */ +#define portTIMER_VIC_CHANNEL ( ( uint32_t ) 0x0004 ) +#define portTIMER_VIC_CHANNEL_BIT ( ( uint32_t ) 0x0010 ) +#define portTIMER_VIC_ENABLE ( ( uint32_t ) 0x0020 ) + +/*-----------------------------------------------------------*/ + +/* Setup the PIT to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 0 + + /* The cooperative scheduler requires a normal IRQ service routine to + simply increment the system tick. */ + static __arm __irq void vPortNonPreemptiveTick( void ); + static __arm __irq void vPortNonPreemptiveTick( void ) + { + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + xTaskIncrementTick(); + + /* Ready for the next interrupt. */ + T0IR = portTIMER_MATCH_ISR_BIT; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + } + +#else + + /* This function is called from an asm wrapper, so does not require the __irq + keyword. */ + void vPortPreemptiveTick( void ); + void vPortPreemptiveTick( void ) + { + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* The new tick value might unblock a task. Ensure the highest task that + is ready to execute is the task that will execute when the tick ISR + exits. */ + vTaskSwitchContext(); + } + + /* Ready for the next interrupt. */ + T0IR = portTIMER_MATCH_ISR_BIT; + VICVectAddr = portCLEAR_VIC_INTERRUPT; + } + +#endif + +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; + + /* A 1ms tick does not require the use of the timer prescale. This is + defaulted to zero but can be used if necessary. */ + T0PR = portPRESCALE_VALUE; + + /* Calculate the match value required for our wanted tick rate. */ + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* Protect against divide by zero. Using an if() statement still results + in a warning - hence the #if. */ + #if portPRESCALE_VALUE != 0 + { + ulCompareMatch /= ( portPRESCALE_VALUE + 1 ); + } + #endif + + T0MR0 = ulCompareMatch; + + /* Generate tick with timer 0 compare match. */ + T0MCR = portRESET_COUNT_ON_MATCH | portINTERRUPT_ON_MATCH; + + /* Setup the VIC for the timer. */ + VICIntSelect &= ~( portTIMER_VIC_CHANNEL_BIT ); + VICIntEnable |= portTIMER_VIC_CHANNEL_BIT; + + /* The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + #if configUSE_PREEMPTION == 1 + { + extern void ( vPortPreemptiveTickEntry )( void ); + + VICVectAddr0 = ( uint32_t ) vPortPreemptiveTickEntry; + } + #else + { + extern void ( vNonPreemptiveTick )( void ); + + VICVectAddr0 = ( int32_t ) vPortNonPreemptiveTick; + } + #endif + + VICVectCntl0 = portTIMER_VIC_CHANNEL | portTIMER_VIC_ENABLE; + + /* Start the timer - interrupts are disabled when this function is called + so it is okay to do this here. */ + T0TCR = portENABLE_TIMER; +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_interrupt(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_interrupt(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portasm.s79 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portasm.s79 new file mode 100644 index 0000000..818ebf0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portasm.s79 @@ -0,0 +1,77 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + RSEG ICODE:CODE + CODE32 + + EXTERN vTaskSwitchContext + EXTERN vPortPreemptiveTick + + PUBLIC vPortPreemptiveTickEntry + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Preemptive context switch function. This will only ever get installed if +; portUSE_PREEMPTION is set to 1 in portmacro.h. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortPreemptiveTickEntry: +#if configUSE_PREEMPTION == 1 + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vPortPreemptiveTick; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. +#endif + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portmacro.h new file mode 100644 index 0000000..5c60cd1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portmacro.h @@ -0,0 +1,114 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortDisableInterruptsFromThumb( void ); +__arm __interwork void vPortEnableInterruptsFromThumb( void ); +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/port.c new file mode 100644 index 0000000..1035f76 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/port.c @@ -0,0 +1,174 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430 port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void vPortSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* The msp430 automatically pushes the PC then SR onto the stack before + executing an ISR. We want the stack to look just as if this has happened + so place a pointer to the start of the task on the stack first - followed + by the flags we want the task to use when it starts up. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next the general purpose registers. */ + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x7777; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R15. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xffff; + pxTopOfStack--; + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses timer 0 + * but could alternatively use the watchdog timer or timer 1. + */ +void vPortSetupTimerInterrupt( void ) +{ + /* Ensure the timer is stopped. */ + TACTL = 0; + + /* Run the timer of the ACLK. */ + TACTL = TASSEL_1; + + /* Clear everything to start with. */ + TACTL |= TACLR; + + /* Set the compare match value according to the tick rate we want. */ + TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ; + + /* Enable the interrupts. */ + TACCTL0 = CCIE; + + /* Start up clean. */ + TACTL |= TACLR; + + /* Up mode. */ + TACTL |= MC_1; +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portasm.h new file mode 100644 index 0000000..20822d5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portasm.h @@ -0,0 +1,85 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTASM_H +#define PORTASM_H + +portSAVE_CONTEXT macro + + IMPORT pxCurrentTCB + IMPORT usCriticalNesting + + /* Save the remaining registers. */ + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + mov.w &usCriticalNesting, r14 + push r14 + mov.w &pxCurrentTCB, r12 + mov.w r1, 0(r12) + endm +/*-----------------------------------------------------------*/ + +portRESTORE_CONTEXT macro + mov.w &pxCurrentTCB, r12 + mov.w @r12, r1 + pop r15 + mov.w r15, &usCriticalNesting + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + + /* The last thing on the stack will be the status register. + Ensure the power down bits are clear ready for the next + time this power down register is popped from the stack. */ + bic.w #0xf0,0(SP) + + reti + endm +/*-----------------------------------------------------------*/ + +#endif + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portext.s43 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portext.s43 new file mode 100644 index 0000000..b7aec91 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portext.s43 @@ -0,0 +1,107 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +#include "FreeRTOSConfig.h" +#include "portasm.h" + + IMPORT xTaskIncrementTick + IMPORT vTaskSwitchContext + IMPORT vPortSetupTimerInterrupt + + EXPORT vTickISR + EXPORT vPortYield + EXPORT xPortStartScheduler + + RSEG CODE + +/* + * The RTOS tick ISR. + * + * If the cooperative scheduler is in use this simply increments the tick + * count. + * + * If the preemptive scheduler is in use a context switch can also occur. + */ +vTickISR: + portSAVE_CONTEXT + + call #xTaskIncrementTick + cmp.w #0x0, R12 + jeq SkipContextSwitch + call #vTaskSwitchContext +SkipContextSwitch: + + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Manual context switch called by the portYIELD() macro. + */ +vPortYield: + + /* Mimic an interrupt by pushing the SR. */ + push SR + + /* Now the SR is stacked we can disable interrupts. */ + dint + + /* Save the context of the current task. */ + portSAVE_CONTEXT + + /* Switch to the highest priority task that is ready to run. */ + call #vTaskSwitchContext + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Start off the scheduler by initialising the RTOS tick timer, then restoring + * the context of the first task. + */ +xPortStartScheduler: + + /* Setup the hardware to generate the tick. Interrupts are disabled + when this function is called. */ + call #vPortSetupTimerInterrupt + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + + /* Install vTickISR as the timer A0 interrupt. */ + ASEG + ORG 0xFFE0 + TIMERA0_VECTOR + + _vTickISR_: DC16 vTickISR + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portmacro.h new file mode 100644 index 0000000..112e4dc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portmacro.h @@ -0,0 +1,134 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _DINT(); _NOP() +#define portENABLE_INTERRUPTS() _EINT(); _NOP() +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() +#define portPOINTER_SIZE_TYPE uint16_t +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#if configINTERRUPT_EXAMPLE_METHOD == 2 + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) do { if( x ) vTaskSwitchContext(); } while( 0 ) + +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/data_model.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/data_model.h new file mode 100644 index 0000000..dfbd64e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/data_model.h @@ -0,0 +1,64 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef DATA_MODEL_H +#define DATA_MODEL_H + +#if __DATA_MODEL__ == __DATA_MODEL_SMALL__ + #define pushm_x pushm.w + #define popm_x popm.w + #define push_x push.w + #define pop_x pop.w + #define mov_x mov.w + #define cmp_x cmp.w +#endif + +#if __DATA_MODEL__ == __DATA_MODEL_MEDIUM__ + #define pushm_x pushm.a + #define popm_x popm.a + #define push_x pushx.a + #define pop_x popx.a + #define mov_x mov.w + #define cmp_x cmp.w +#endif + +#if __DATA_MODEL__ == __DATA_MODEL_LARGE__ + #define pushm_x pushm.a + #define popm_x popm.a + #define push_x pushx.a + #define pop_x popx.a + #define mov_x movx.a + #define cmp_x cmpx.a +#endif + +#ifndef pushm_x + #error The assembler options must define one of the following symbols: __DATA_MODEL_SMALL__, __DATA_MODEL_MEDIUM__, or __DATA_MODEL_LARGE__ +#endif + +#endif /* DATA_MODEL_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/port.c new file mode 100644 index 0000000..5e07dc8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/port.c @@ -0,0 +1,183 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430X port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void vPortSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t *pusTopOfStack; +uint32_t *pulTopOfStack; + + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + */ + + /* StackType_t is either 16 bits or 32 bits depending on the data model. + Some stacked items do not change size depending on the data model so have + to be explicitly cast to the correct size so this function will work + whichever data model is being used. */ + if( sizeof( StackType_t ) == sizeof( uint16_t ) ) + { + /* Make room for a 20 bit value stored as a 32 bit value. */ + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + pusTopOfStack--; + pulTopOfStack = ( uint32_t * ) pusTopOfStack; + } + else + { + pulTopOfStack = ( uint32_t * ) pxTopOfStack; + } + *pulTopOfStack = ( uint32_t ) pxCode; + + pusTopOfStack = ( uint16_t * ) pulTopOfStack; + pusTopOfStack--; + *pusTopOfStack = portFLAGS_INT_ENABLED; + pusTopOfStack -= ( sizeof( StackType_t ) / 2 ); + + /* From here on the size of stacked items depends on the memory model. */ + pxTopOfStack = ( StackType_t * ) pusTopOfStack; + + /* Next the general purpose registers. */ + #ifdef PRELOAD_REGISTER_VALUES + *pxTopOfStack = ( StackType_t ) 0xffff; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + #else + pxTopOfStack -= 3; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack -= 9; + #endif + + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. + */ +void vPortSetupTimerInterrupt( void ) +{ + vApplicationSetupTimerInterrupt(); +} +/*-----------------------------------------------------------*/ + +#pragma vector=configTICK_VECTOR +__interrupt __raw void vTickISREntry( void ) +{ +extern void vPortTickISR( void ); + + __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); + vPortTickISR(); +} + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portext.s43 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portext.s43 new file mode 100644 index 0000000..35718f2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portext.s43 @@ -0,0 +1,139 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +#include "msp430.h" +#include "FreeRTOSConfig.h" +#include "data_model.h" + + IMPORT xTaskIncrementTick + IMPORT vTaskSwitchContext + IMPORT vPortSetupTimerInterrupt + IMPORT pxCurrentTCB + IMPORT usCriticalNesting + + EXPORT vPortTickISR + EXPORT vPortYield + EXPORT xPortStartScheduler + +portSAVE_CONTEXT macro + + /* Save the remaining registers. */ + pushm_x #12, r15 + mov.w &usCriticalNesting, r14 + push_x r14 + mov_x &pxCurrentTCB, r12 + mov_x sp, 0( r12 ) + endm +/*-----------------------------------------------------------*/ + +portRESTORE_CONTEXT macro + + mov_x &pxCurrentTCB, r12 + mov_x @r12, sp + pop_x r15 + mov.w r15, &usCriticalNesting + popm_x #12, r15 + nop + pop.w sr + nop + reta + endm +/*-----------------------------------------------------------*/ + + +/* + * The RTOS tick ISR. + * + * If the cooperative scheduler is in use this simply increments the tick + * count. + * + * If the preemptive scheduler is in use a context switch can also occur. + */ + + RSEG CODE + EVEN + +vPortTickISR: + + /* The sr is not saved in portSAVE_CONTEXT() because vPortYield() needs + to save it manually before it gets modified (interrupts get disabled). + Entering through this interrupt means the SR is already on the stack, but + this keeps the stack frames identical. */ + push.w sr + portSAVE_CONTEXT + + calla #xTaskIncrementTick + cmp.w #0x0, R12 + jeq SkipContextSwitch + calla #vTaskSwitchContext +SkipContextSwitch: + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by the portYIELD() macro. + */ + EVEN + +vPortYield: + + /* The sr needs saving before it is modified. */ + push.w sr + + /* Now the SR is stacked interrupts can be disabled. */ + dint + nop + + /* Save the context of the current task. */ + portSAVE_CONTEXT + + /* Select the next task to run. */ + calla #vTaskSwitchContext + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Start off the scheduler by initialising the RTOS tick timer, then restoring + * the context of the first task. + */ + EVEN + +xPortStartScheduler: + + /* Setup the hardware to generate the tick. Interrupts are disabled + when this function is called. */ + calla #vPortSetupTimerInterrupt + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portmacro.h new file mode 100644 index 0000000..ab705d1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portmacro.h @@ -0,0 +1,143 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Hardware includes. */ +#include "msp430.h" + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portBASE_TYPE short + +/* The stack type changes depending on the data model. */ +#if( __DATA_MODEL__ == __DATA_MODEL_SMALL__ ) + #define portSTACK_TYPE uint16_t + #define portPOINTER_SIZE_TYPE uint16_t +#else + #define portSTACK_TYPE uint32_t +#endif + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _DINT(); _NOP() +#define portENABLE_INTERRUPTS() _EINT(); _NOP() +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portYIELD_FROM_ISR( x ) do { if( x ) vPortYield(); } while( 0 ) + +void vApplicationSetupTimerInterrupt( void ); + +/* sizeof( int ) != sizeof( long ) so a full printf() library is required if +run time stats information is to be displayed. */ +#define portLU_PRINTF_SPECIFIER_REQUIRED + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/Documentation.url b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/Documentation.url new file mode 100644 index 0000000..5546f87 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/Documentation.url @@ -0,0 +1,5 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,11 +[InternetShortcut] +IDList= +URL=https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h new file mode 100644 index 0000000..5298580 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h @@ -0,0 +1,69 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ + + +#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ +#define __FREERTOS_RISC_V_EXTENSIONS_H__ + +#define portasmHAS_SIFIVE_CLINT 1 +#define portasmHAS_MTIME 1 +#define portasmADDITIONAL_CONTEXT_SIZE 0 /* Must be even number on 32-bit cores. */ + +portasmSAVE_ADDITIONAL_REGISTERS MACRO + /* No additional registers to save, so this macro does nothing. */ + ENDM + +portasmRESTORE_ADDITIONAL_REGISTERS MACRO + /* No additional registers to restore, so this macro does nothing. */ + ENDM + +#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/readme.txt new file mode 100644 index 0000000..b24c0b9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/readme.txt @@ -0,0 +1,23 @@ +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/port.c new file mode 100644 index 0000000..e151f27 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/port.c @@ -0,0 +1,241 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the RISC-V port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "portmacro.h" + +/* Standard includes. */ +#include "string.h" + +#ifdef configCLINT_BASE_ADDRESS + #warning The configCLINT_BASE_ADDRESS constant has been deprecated. configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS are currently being derived from the (possibly 0) configCLINT_BASE_ADDRESS setting. Please update to define configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS dirctly in place of configCLINT_BASE_ADDRESS. See https: /*www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html */ +#endif + +#ifndef configMTIME_BASE_ADDRESS + #warning configMTIME_BASE_ADDRESS must be defined in FreeRTOSConfig.h. If the target chip includes a memory-mapped mtime register then set configMTIME_BASE_ADDRESS to the mapped address. Otherwise set configMTIME_BASE_ADDRESS to 0. See https: /*www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html */ +#endif + +#ifndef configMTIMECMP_BASE_ADDRESS + #warning configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h. If the target chip includes a memory-mapped mtimecmp register then set configMTIMECMP_BASE_ADDRESS to the mapped address. Otherwise set configMTIMECMP_BASE_ADDRESS to 0. See https: /*www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html */ +#endif + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* The stack used by interrupt service routines. Set configISR_STACK_SIZE_WORDS + * to use a statically allocated array as the interrupt stack. Alternative leave + * configISR_STACK_SIZE_WORDS undefined and update the linker script so that a + * linker variable names __freertos_irq_stack_top has the same value as the top + * of the stack used by main. Using the linker script method will repurpose the + * stack that was used by main before the scheduler was started for use as the + * interrupt stack after the scheduler has started. */ +#ifdef configISR_STACK_SIZE_WORDS +static __attribute__( ( aligned( 16 ) ) ) StackType_t xISRStack[ configISR_STACK_SIZE_WORDS ] = { 0 }; +const StackType_t xISRStackTop = ( StackType_t ) &( xISRStack[ configISR_STACK_SIZE_WORDS & ~portBYTE_ALIGNMENT_MASK ] ); + +/* Don't use 0xa5 as the stack fill bytes as that is used by the kernerl for + * the task stacks, and so will legitimately appear in many positions within + * the ISR stack. */ + #define portISR_STACK_FILL_BYTE 0xee +#else + extern const uint32_t __freertos_irq_stack_top[]; + const StackType_t xISRStackTop = ( StackType_t ) __freertos_irq_stack_top; +#endif + +/** + * @brief Used to catch tasks that attempt to return from their implementing + * function. + */ +static void prvTaskExitError( void ); + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ) __attribute__( ( weak ) ); + +/*-----------------------------------------------------------*/ + +/* Used to program the machine timer compare register. */ +uint64_t ullNextTime = 0ULL; +const uint64_t * pullNextTime = &ullNextTime; +const size_t uxTimerIncrementsForOneTick = ( size_t ) ( ( configCPU_CLOCK_HZ ) / ( configTICK_RATE_HZ ) ); /* Assumes increment won't go over 32-bits. */ +uint32_t const ullMachineTimerCompareRegisterBase = configMTIMECMP_BASE_ADDRESS; +volatile uint64_t * pullMachineTimerCompareRegister = NULL; + +/* Holds the critical nesting value - deliberately non-zero at start up to + * ensure interrupts are not accidentally enabled before the scheduler starts. */ +size_t xCriticalNesting = ( size_t ) 0xaaaaaaaa; +size_t * pxCriticalNesting = &xCriticalNesting; + +/* Used to catch tasks that attempt to return from their implementing function. */ +size_t xTaskReturnAddress = ( size_t ) portTASK_RETURN_ADDRESS; + +/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task + * stack checking. A problem in the ISR stack will trigger an assert, not call + * the stack overflow hook function (because the stack overflow hook is specific + * to a task stack, not the ISR stack). */ +#if defined( configISR_STACK_SIZE_WORDS ) && ( configCHECK_FOR_STACK_OVERFLOW > 2 ) + #warning This path not tested, or even compiled yet. + + static const uint8_t ucExpectedStackBytes[] = + { + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE + }; \ + + #define portCHECK_ISR_STACK() configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) ) +#else /* if defined( configISR_STACK_SIZE_WORDS ) && ( configCHECK_FOR_STACK_OVERFLOW > 2 ) */ + /* Define the function away. */ + #define portCHECK_ISR_STACK() +#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + volatile uint32_t ulDummy = 0UL; + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, then stop here so + * application writers can catch the error. */ + configASSERT( xCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + while( ulDummy == 0 ) + { + /* This file calls prvTaskExitError() after the scheduler has been + * started to remove a compiler warning about the function being + * defined but never called. ulDummy is used purely to quieten other + * warnings about code appearing after this function is called - making + * ulDummy volatile makes the compiler think the function could return + * and therefore not output an 'unreachable code' warning for code that + * appears after it. */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) + + void vPortSetupTimerInterrupt( void ) + { + uint32_t ulCurrentTimeHigh, ulCurrentTimeLow; + volatile uint32_t * const pulTimeHigh = ( uint32_t * ) ( ( configMTIME_BASE_ADDRESS ) + 4UL ); /* 8-byte type so high 32-bit word is 4 bytes up. */ + volatile uint32_t * const pulTimeLow = ( uint32_t * ) ( configMTIME_BASE_ADDRESS ); + volatile uint32_t ulHartId; + + __asm volatile ( "csrr %0, 0xf14" : "=r" ( ulHartId ) ); /* 0xf14 is hartid. */ + + pullMachineTimerCompareRegister = ( volatile uint64_t * ) ( ullMachineTimerCompareRegisterBase + ( ulHartId * sizeof( uint64_t ) ) ); + + do + { + ulCurrentTimeHigh = *pulTimeHigh; + ulCurrentTimeLow = *pulTimeLow; + } while( ulCurrentTimeHigh != *pulTimeHigh ); + + ullNextTime = ( uint64_t ) ulCurrentTimeHigh; + ullNextTime <<= 32ULL; /* High 4-byte word is 32-bits up. */ + ullNextTime |= ( uint64_t ) ulCurrentTimeLow; + ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick; + *pullMachineTimerCompareRegister = ullNextTime; + + /* Prepare the time to use after the next tick interrupt. */ + ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick; + } + +#endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIME_BASE_ADDRESS != 0 ) */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + extern void xPortStartFirstTask( void ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Check alignment of the interrupt stack - which is the same as the + * stack that was being used by main() prior to the scheduler being + * started. */ + configASSERT( ( xISRStackTop & portBYTE_ALIGNMENT_MASK ) == 0 ); + + #ifdef configISR_STACK_SIZE_WORDS + { + memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) ); + } + #endif /* configISR_STACK_SIZE_WORDS */ + } + #endif /* configASSERT_DEFINED */ + + /* If there is a CLINT then it is ok to use the default implementation + * in this file, otherwise vPortSetupTimerInterrupt() must be implemented to + * configure whichever clock is to be used to generate the tick interrupt. */ + vPortSetupTimerInterrupt(); + + #if ( ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) ) + { + /* Enable mtime and external interrupts. 1<<7 for timer interrupt, + * 1<<11 for external interrupt. _RB_ What happens here when mtime is + * not present as with pulpino? */ + __asm volatile ( "csrs 0x304, %0" ::"r" ( 0x880 ) ); /* 0x304 is mie. */ + } + #endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) */ + + xPortStartFirstTask(); + + /* Should not get here as after calling xPortStartFirstTask() only tasks + * should be executing. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portASM.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portASM.s new file mode 100644 index 0000000..ca85249 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portASM.s @@ -0,0 +1,393 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code which tailors the port to a specific RISC-V chip: + * + * + The code that is common to all RISC-V chips is implemented in + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S. There is only one + * portASM.S file because the same file is used no matter which RISC-V chip is + * in use. + * + * + The code that tailors the kernel's RISC-V port to a specific RISC-V + * chip is implemented in freertos_risc_v_chip_specific_extensions.h. There + * is one freertos_risc_v_chip_specific_extensions.h that can be used with any + * RISC-V chip that both includes a standard CLINT and does not add to the + * base set of RISC-V registers. There are additional + * freertos_risc_v_chip_specific_extensions.h files for RISC-V implementations + * that do not include a standard CLINT or do add to the base set of RISC-V + * registers. + * + * CARE MUST BE TAKEN TO INCLDUE THE CORRECT + * freertos_risc_v_chip_specific_extensions.h HEADER FILE FOR THE CHIP + * IN USE. To include the correct freertos_risc_v_chip_specific_extensions.h + * header file ensure the path to the correct header file is in the assembler's + * include path. + * + * This freertos_risc_v_chip_specific_extensions.h is for use on RISC-V chips + * that include a standard CLINT and do not add to the base set of RISC-V + * registers. + * + */ + +#include "portContext.h" + +/* Check the freertos_risc_v_chip_specific_extensions.h and/or command line +definitions. */ +#if defined( portasmHAS_CLINT ) && defined( portasmHAS_MTIME ) + #error The portasmHAS_CLINT constant has been deprecated. Please replace it with portasmHAS_MTIME. portasmHAS_CLINT and portasmHAS_MTIME cannot both be defined at once. See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html +#endif + +#ifdef portasmHAS_CLINT + #warning The portasmHAS_CLINT constant has been deprecated. Please replace it with portasmHAS_MTIME and portasmHAS_SIFIVE_CLINT. For now portasmHAS_MTIME and portasmHAS_SIFIVE_CLINT are derived from portasmHAS_CLINT. See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html + #define portasmHAS_MTIME portasmHAS_CLINT + #define portasmHAS_SIFIVE_CLINT portasmHAS_CLINT +#endif + +#ifndef portasmHAS_MTIME + #error freertos_risc_v_chip_specific_extensions.h must define portasmHAS_MTIME to either 1 (MTIME clock present) or 0 (MTIME clock not present). See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html +#endif + +#ifndef portasmHAS_SIFIVE_CLINT + #define portasmHAS_SIFIVE_CLINT 0 +#endif + +/* CSR definitions. */ +#define CSR_MSTATUS 0x300 +#define CSR_MTVEC 0x305 +#define CSR_MEPC 0x341 +#define CSR_MCAUSE 0x342 + + PUBLIC xPortStartFirstTask + PUBLIC pxPortInitialiseStack + PUBLIC freertos_risc_v_trap_handler + PUBLIC freertos_risc_v_exception_handler + PUBLIC freertos_risc_v_interrupt_handler + PUBLIC freertos_risc_v_mtimer_interrupt_handler + + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + EXTERN pullMachineTimerCompareRegister + EXTERN pullNextTime + EXTERN uxTimerIncrementsForOneTick /* size_t type so 32-bit on 32-bit core and 64-bits on 64-bit core. */ + EXTERN xTaskReturnAddress + + PUBWEAK freertos_risc_v_application_exception_handler + PUBWEAK freertos_risc_v_application_interrupt_handler +/*-----------------------------------------------------------*/ + + SECTION `.text`:CODE:NOROOT(2) + CODE + +portUPDATE_MTIMER_COMPARE_REGISTER MACRO + load_x t0, pullMachineTimerCompareRegister /* Load address of compare register into t0. */ + load_x t1, pullNextTime /* Load the address of ullNextTime into t1. */ + + #if( __riscv_xlen == 32 ) + + /* Update the 64-bit mtimer compare match value in two 32-bit writes. */ + li t4, -1 + lw t2, 0(t1) /* Load the low word of ullNextTime into t2. */ + lw t3, 4(t1) /* Load the high word of ullNextTime into t3. */ + sw t4, 0(t0) /* Low word no smaller than old value to start with - will be overwritten below. */ + sw t3, 4(t0) /* Store high word of ullNextTime into compare register. No smaller than new value. */ + sw t2, 0(t0) /* Store low word of ullNextTime into compare register. */ + lw t0, uxTimerIncrementsForOneTick /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */ + add t4, t0, t2 /* Add the low word of ullNextTime to the timer increments for one tick (assumes timer increment for one tick fits in 32-bits). */ + sltu t5, t4, t2 /* See if the sum of low words overflowed (what about the zero case?). */ + add t6, t3, t5 /* Add overflow to high word of ullNextTime. */ + sw t4, 0(t1) /* Store new low word of ullNextTime. */ + sw t6, 4(t1) /* Store new high word of ullNextTime. */ + + #endif /* __riscv_xlen == 32 */ + + #if( __riscv_xlen == 64 ) + + /* Update the 64-bit mtimer compare match value. */ + ld t2, 0(t1) /* Load ullNextTime into t2. */ + sd t2, 0(t0) /* Store ullNextTime into compare register. */ + ld t0, uxTimerIncrementsForOneTick /* Load the value of ullTimerIncrementForOneTick into t0 (could this be optimized by storing in an array next to pullNextTime?). */ + add t4, t0, t2 /* Add ullNextTime to the timer increments for one tick. */ + sd t4, 0(t1) /* Store ullNextTime. */ + + #endif /* __riscv_xlen == 64 */ + ENDM +/*-----------------------------------------------------------*/ + +/* + * Unlike other ports pxPortInitialiseStack() is written in assembly code as it + * needs access to the portasmADDITIONAL_CONTEXT_SIZE constant. The prototype + * for the function is as per the other ports: + * StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ); + * + * As per the standard RISC-V ABI pxTopcOfStack is passed in in a0, pxCode in + * a1, and pvParameters in a2. The new top of stack is passed out in a0. + * + * RISC-V maps registers to ABI names as follows (X1 to X31 integer registers + * for the 'I' profile, X1 to X15 for the 'E' profile, currently I assumed). + * + * Register ABI Name Description Saver + * x0 zero Hard-wired zero - + * x1 ra Return address Caller + * x2 sp Stack pointer Callee + * x3 gp Global pointer - + * x4 tp Thread pointer - + * x5-7 t0-2 Temporaries Caller + * x8 s0/fp Saved register/Frame pointer Callee + * x9 s1 Saved register Callee + * x10-11 a0-1 Function Arguments/return values Caller + * x12-17 a2-7 Function arguments Caller + * x18-27 s2-11 Saved registers Callee + * x28-31 t3-6 Temporaries Caller + * + * The RISC-V context is saved t FreeRTOS tasks in the following stack frame, + * where the global and thread pointers are currently assumed to be constant so + * are not saved: + * + * mstatus + * xCriticalNesting + * x31 + * x30 + * x29 + * x28 + * x27 + * x26 + * x25 + * x24 + * x23 + * x22 + * x21 + * x20 + * x19 + * x18 + * x17 + * x16 + * x15 + * x14 + * x13 + * x12 + * x11 + * pvParameters + * x9 + * x8 + * x7 + * x6 + * x5 + * portTASK_RETURN_ADDRESS + * [chip specific registers go here] + * pxCode + */ +pxPortInitialiseStack: + csrr t0, CSR_MSTATUS /* Obtain current mstatus value. */ + andi t0, t0, ~0x8 /* Ensure interrupts are disabled when the stack is restored within an ISR. Required when a task is created after the schedulre has been started, otherwise interrupts would be disabled anyway. */ + addi t1, x0, 0x188 /* Generate the value 0x1880, which are the MPIE and MPP bits to set in mstatus. */ + slli t1, t1, 4 + or t0, t0, t1 /* Set MPIE and MPP bits in mstatus value. */ + + addi a0, a0, -portWORD_SIZE + store_x t0, 0(a0) /* mstatus onto the stack. */ + addi a0, a0, -portWORD_SIZE /* Space for critical nesting count. */ + store_x x0, 0(a0) /* Critical nesting count starts at 0 for every task. */ + addi a0, a0, -(22 * portWORD_SIZE) /* Space for registers x11-x31. */ + store_x a2, 0(a0) /* Task parameters (pvParameters parameter) goes into register X10/a0 on the stack. */ + addi a0, a0, -(6 * portWORD_SIZE) /* Space for registers x5-x9. */ + load_x t0, xTaskReturnAddress + store_x t0, 0(a0) /* Return address onto the stack. */ + addi t0, x0, portasmADDITIONAL_CONTEXT_SIZE /* The number of chip specific additional registers. */ +chip_specific_stack_frame: /* First add any chip specific registers to the stack frame being created. */ + beq t0, x0, no_more_regs /* No more chip specific registers to save. */ + addi a0, a0, -portWORD_SIZE /* Make space for chip specific register. */ + store_x x0, 0(a0) /* Give the chip specific register an initial value of zero. */ + addi t0, t0, -1 /* Decrement the count of chip specific registers remaining. */ + j chip_specific_stack_frame /* Until no more chip specific registers. */ +no_more_regs: + addi a0, a0, -portWORD_SIZE + store_x a1, 0(a0) /* mret value (pxCode parameter) onto the stack. */ + ret +/*-----------------------------------------------------------*/ + +xPortStartFirstTask: + load_x sp, pxCurrentTCB /* Load pxCurrentTCB. */ + load_x sp, 0( sp ) /* Read sp from first TCB member. */ + + load_x x1, 0( sp ) /* Note for starting the scheduler the exception return address is used as the function return address. */ + + portasmRESTORE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */ + + load_x x7, 4 * portWORD_SIZE( sp ) /* t2 */ + load_x x8, 5 * portWORD_SIZE( sp ) /* s0/fp */ + load_x x9, 6 * portWORD_SIZE( sp ) /* s1 */ + load_x x10, 7 * portWORD_SIZE( sp ) /* a0 */ + load_x x11, 8 * portWORD_SIZE( sp ) /* a1 */ + load_x x12, 9 * portWORD_SIZE( sp ) /* a2 */ + load_x x13, 10 * portWORD_SIZE( sp ) /* a3 */ + load_x x14, 11 * portWORD_SIZE( sp ) /* a4 */ + load_x x15, 12 * portWORD_SIZE( sp ) /* a5 */ + load_x x16, 13 * portWORD_SIZE( sp ) /* a6 */ + load_x x17, 14 * portWORD_SIZE( sp ) /* a7 */ + load_x x18, 15 * portWORD_SIZE( sp ) /* s2 */ + load_x x19, 16 * portWORD_SIZE( sp ) /* s3 */ + load_x x20, 17 * portWORD_SIZE( sp ) /* s4 */ + load_x x21, 18 * portWORD_SIZE( sp ) /* s5 */ + load_x x22, 19 * portWORD_SIZE( sp ) /* s6 */ + load_x x23, 20 * portWORD_SIZE( sp ) /* s7 */ + load_x x24, 21 * portWORD_SIZE( sp ) /* s8 */ + load_x x25, 22 * portWORD_SIZE( sp ) /* s9 */ + load_x x26, 23 * portWORD_SIZE( sp ) /* s10 */ + load_x x27, 24 * portWORD_SIZE( sp ) /* s11 */ + load_x x28, 25 * portWORD_SIZE( sp ) /* t3 */ + load_x x29, 26 * portWORD_SIZE( sp ) /* t4 */ + load_x x30, 27 * portWORD_SIZE( sp ) /* t5 */ + load_x x31, 28 * portWORD_SIZE( sp ) /* t6 */ + + load_x x5, 29 * portWORD_SIZE( sp ) /* Obtain xCriticalNesting value for this task from task's stack. */ + load_x x6, pxCriticalNesting /* Load the address of xCriticalNesting into x6. */ + store_x x5, 0( x6 ) /* Restore the critical nesting value for this task. */ + + load_x x5, 30 * portWORD_SIZE( sp ) /* Initial mstatus into x5 (t0). */ + addi x5, x5, 0x08 /* Set MIE bit so the first task starts with interrupts enabled - required as returns with ret not eret. */ + csrrw x0, CSR_MSTATUS, x5 /* Interrupts enabled from here! */ + + load_x x5, 2 * portWORD_SIZE( sp ) /* Initial x5 (t0) value. */ + load_x x6, 3 * portWORD_SIZE( sp ) /* Initial x6 (t1) value. */ + + addi sp, sp, portCONTEXT_SIZE + ret +/*-----------------------------------------------------------*/ + +freertos_risc_v_application_exception_handler: + csrr t0, CSR_MCAUSE /* For viewing in the debugger only. */ + csrr t1, CSR_MEPC /* For viewing in the debugger only */ + csrr t2, CSR_MSTATUS /* For viewing in the debugger only */ + j $ +/*-----------------------------------------------------------*/ + +freertos_risc_v_application_interrupt_handler: + csrr t0, CSR_MCAUSE /* For viewing in the debugger only. */ + csrr t1, CSR_MEPC /* For viewing in the debugger only */ + csrr t2, CSR_MSTATUS /* For viewing in the debugger only */ + j $ +/*-----------------------------------------------------------*/ + + SECTION `.text.freertos_risc_v_exception_handler`:CODE:NOROOT(2) + CODE + +freertos_risc_v_exception_handler: + portcontextSAVE_EXCEPTION_CONTEXT + /* a0 now contains mcause. */ + li t0, 11 /* 11 == environment call. */ + bne a0, t0, other_exception /* Not an M environment call, so some other exception. */ + call vTaskSwitchContext + portcontextRESTORE_CONTEXT + +other_exception: + call freertos_risc_v_application_exception_handler + portcontextRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + SECTION `.text.freertos_risc_v_interrupt_handler`:CODE:NOROOT(2) + CODE + +freertos_risc_v_interrupt_handler: + portcontextSAVE_INTERRUPT_CONTEXT + call freertos_risc_v_application_interrupt_handler + portcontextRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + SECTION `.text.freertos_risc_v_mtimer_interrupt_handler`:CODE:NOROOT(2) + CODE + +freertos_risc_v_mtimer_interrupt_handler: + portcontextSAVE_INTERRUPT_CONTEXT + portUPDATE_MTIMER_COMPARE_REGISTER + call xTaskIncrementTick + beqz a0, exit_without_context_switch /* Don't switch context if incrementing tick didn't unblock a task. */ + call vTaskSwitchContext +exit_without_context_switch: + portcontextRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + SECTION `.text.freertos_risc_v_trap_handler`:CODE:NOROOT(8) + CODE + +freertos_risc_v_trap_handler: + portcontextSAVE_CONTEXT_INTERNAL + + csrr a0, CSR_MCAUSE + csrr a1, CSR_MEPC + + bge a0, x0, synchronous_exception + +asynchronous_interrupt: + store_x a1, 0( sp ) /* Asynchronous interrupt so save unmodified exception return address. */ + load_x sp, xISRStackTop /* Switch to ISR stack. */ + j handle_interrupt + +synchronous_exception: + addi a1, a1, 4 /* Synchronous so update exception return address to the instruction after the instruction that generated the exeption. */ + store_x a1, 0( sp ) /* Save updated exception return address. */ + load_x sp, xISRStackTop /* Switch to ISR stack. */ + j handle_exception + +handle_interrupt: +#if( portasmHAS_MTIME != 0 ) + + test_if_mtimer: /* If there is a CLINT then the mtimer is used to generate the tick interrupt. */ + addi t0, x0, 1 + slli t0, t0, __riscv_xlen - 1 /* LSB is already set, shift into MSB. Shift 31 on 32-bit or 63 on 64-bit cores. */ + addi t1, t0, 7 /* 0x8000[]0007 == machine timer interrupt. */ + bne a0, t1, application_interrupt_handler + + portUPDATE_MTIMER_COMPARE_REGISTER + call xTaskIncrementTick + beqz a0, processed_source /* Don't switch context if incrementing tick didn't unblock a task. */ + call vTaskSwitchContext + j processed_source + +#endif /* portasmHAS_MTIME */ + +application_interrupt_handler: + call freertos_risc_v_application_interrupt_handler + j processed_source + +handle_exception: + /* a0 contains mcause. */ + li t0, 11 /* 11 == environment call. */ + bne a0, t0, application_exception_handler /* Not an M environment call, so some other exception. */ + call vTaskSwitchContext + j processed_source + +application_exception_handler: + call freertos_risc_v_application_exception_handler + j processed_source /* No other exceptions handled yet. */ + +processed_source: + portcontextRESTORE_CONTEXT +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portContext.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portContext.h new file mode 100644 index 0000000..adb883c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portContext.h @@ -0,0 +1,177 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTCONTEXT_H +#define PORTCONTEXT_H + +#if __riscv_xlen == 64 + #define portWORD_SIZE 8 + #define store_x sd + #define load_x ld +#elif __riscv_xlen == 32 + #define store_x sw + #define load_x lw + #define portWORD_SIZE 4 +#else + #error Assembler did not define __riscv_xlen +#endif + +#include "freertos_risc_v_chip_specific_extensions.h" + +/* Only the standard core registers are stored by default. Any additional + * registers must be saved by the portasmSAVE_ADDITIONAL_REGISTERS and + * portasmRESTORE_ADDITIONAL_REGISTERS macros - which can be defined in a chip + * specific version of freertos_risc_v_chip_specific_extensions.h. See the + * notes at the top of portASM.S file. */ +#define portCONTEXT_SIZE ( 31 * portWORD_SIZE ) + + EXTERN pxCurrentTCB + EXTERN xISRStackTop + EXTERN xCriticalNesting + EXTERN pxCriticalNesting + +/*-----------------------------------------------------------*/ + +portcontextSAVE_CONTEXT_INTERNAL MACRO + addi sp, sp, -portCONTEXT_SIZE + store_x x1, 1 * portWORD_SIZE( sp ) + store_x x5, 2 * portWORD_SIZE( sp ) + store_x x6, 3 * portWORD_SIZE( sp ) + store_x x7, 4 * portWORD_SIZE( sp ) + store_x x8, 5 * portWORD_SIZE( sp ) + store_x x9, 6 * portWORD_SIZE( sp ) + store_x x10, 7 * portWORD_SIZE( sp ) + store_x x11, 8 * portWORD_SIZE( sp ) + store_x x12, 9 * portWORD_SIZE( sp ) + store_x x13, 10 * portWORD_SIZE( sp ) + store_x x14, 11 * portWORD_SIZE( sp ) + store_x x15, 12 * portWORD_SIZE( sp ) + store_x x16, 13 * portWORD_SIZE( sp ) + store_x x17, 14 * portWORD_SIZE( sp ) + store_x x18, 15 * portWORD_SIZE( sp ) + store_x x19, 16 * portWORD_SIZE( sp ) + store_x x20, 17 * portWORD_SIZE( sp ) + store_x x21, 18 * portWORD_SIZE( sp ) + store_x x22, 19 * portWORD_SIZE( sp ) + store_x x23, 20 * portWORD_SIZE( sp ) + store_x x24, 21 * portWORD_SIZE( sp ) + store_x x25, 22 * portWORD_SIZE( sp ) + store_x x26, 23 * portWORD_SIZE( sp ) + store_x x27, 24 * portWORD_SIZE( sp ) + store_x x28, 25 * portWORD_SIZE( sp ) + store_x x29, 26 * portWORD_SIZE( sp ) + store_x x30, 27 * portWORD_SIZE( sp ) + store_x x31, 28 * portWORD_SIZE( sp ) + + load_x t0, xCriticalNesting /* Load the value of xCriticalNesting into t0. */ + store_x t0, 29 * portWORD_SIZE( sp ) /* Store the critical nesting value to the stack. */ + + csrr t0, mstatus /* Required for MPIE bit. */ + store_x t0, 30 * portWORD_SIZE( sp ) + + portasmSAVE_ADDITIONAL_REGISTERS /* Defined in freertos_risc_v_chip_specific_extensions.h to save any registers unique to the RISC-V implementation. */ + + load_x t0, pxCurrentTCB /* Load pxCurrentTCB. */ + store_x sp, 0( t0 ) /* Write sp to first TCB member. */ + + ENDM +/*-----------------------------------------------------------*/ + +portcontextSAVE_EXCEPTION_CONTEXT MACRO + portcontextSAVE_CONTEXT_INTERNAL + csrr a0, mcause + csrr a1, mepc + addi a1, a1, 4 /* Synchronous so update exception return address to the instruction after the instruction that generated the exception. */ + store_x a1, 0( sp ) /* Save updated exception return address. */ + load_x sp, xISRStackTop /* Switch to ISR stack. */ + ENDM +/*-----------------------------------------------------------*/ + +portcontextSAVE_INTERRUPT_CONTEXT MACRO + portcontextSAVE_CONTEXT_INTERNAL + csrr a0, mcause + csrr a1, mepc + store_x a1, 0( sp ) /* Asynchronous interrupt so save unmodified exception return address. */ + load_x sp, xISRStackTop /* Switch to ISR stack. */ + ENDM +/*-----------------------------------------------------------*/ + +portcontextRESTORE_CONTEXT MACRO + load_x t1, pxCurrentTCB /* Load pxCurrentTCB. */ + load_x sp, 0( t1 ) /* Read sp from first TCB member. */ + + /* Load mepc with the address of the instruction in the task to run next. */ + load_x t0, 0( sp ) + csrw mepc, t0 + + /* Defined in freertos_risc_v_chip_specific_extensions.h to restore any registers unique to the RISC-V implementation. */ + portasmRESTORE_ADDITIONAL_REGISTERS + + /* Load mstatus with the interrupt enable bits used by the task. */ + load_x t0, 30 * portWORD_SIZE( sp ) + csrw mstatus, t0 /* Required for MPIE bit. */ + + load_x t0, 29 * portWORD_SIZE( sp ) /* Obtain xCriticalNesting value for this task from task's stack. */ + load_x t1, pxCriticalNesting /* Load the address of xCriticalNesting into t1. */ + store_x t0, 0( t1 ) /* Restore the critical nesting value for this task. */ + + load_x x1, 1 * portWORD_SIZE( sp ) + load_x x5, 2 * portWORD_SIZE( sp ) + load_x x6, 3 * portWORD_SIZE( sp ) + load_x x7, 4 * portWORD_SIZE( sp ) + load_x x8, 5 * portWORD_SIZE( sp ) + load_x x9, 6 * portWORD_SIZE( sp ) + load_x x10, 7 * portWORD_SIZE( sp ) + load_x x11, 8 * portWORD_SIZE( sp ) + load_x x12, 9 * portWORD_SIZE( sp ) + load_x x13, 10 * portWORD_SIZE( sp ) + load_x x14, 11 * portWORD_SIZE( sp ) + load_x x15, 12 * portWORD_SIZE( sp ) + load_x x16, 13 * portWORD_SIZE( sp ) + load_x x17, 14 * portWORD_SIZE( sp ) + load_x x18, 15 * portWORD_SIZE( sp ) + load_x x19, 16 * portWORD_SIZE( sp ) + load_x x20, 17 * portWORD_SIZE( sp ) + load_x x21, 18 * portWORD_SIZE( sp ) + load_x x22, 19 * portWORD_SIZE( sp ) + load_x x23, 20 * portWORD_SIZE( sp ) + load_x x24, 21 * portWORD_SIZE( sp ) + load_x x25, 22 * portWORD_SIZE( sp ) + load_x x26, 23 * portWORD_SIZE( sp ) + load_x x27, 24 * portWORD_SIZE( sp ) + load_x x28, 25 * portWORD_SIZE( sp ) + load_x x29, 26 * portWORD_SIZE( sp ) + load_x x30, 27 * portWORD_SIZE( sp ) + load_x x31, 28 * portWORD_SIZE( sp ) + addi sp, sp, portCONTEXT_SIZE + + mret + ENDM +/*-----------------------------------------------------------*/ + +#endif /* PORTCONTEXT_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portmacro.h new file mode 100644 index 0000000..d85b774 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portmacro.h @@ -0,0 +1,179 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include "intrinsics.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#if __riscv_xlen == 64 + #define portSTACK_TYPE uint64_t + #define portBASE_TYPE int64_t + #define portUBASE_TYPE uint64_t + #define portMAX_DELAY ( TickType_t ) 0xffffffffffffffffUL + #define portPOINTER_SIZE_TYPE uint64_t +#elif __riscv_xlen == 32 + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE int32_t + #define portUBASE_TYPE uint32_t + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#else + #error Assembler did not define __riscv_xlen +#endif + +typedef portSTACK_TYPE StackType_t; +typedef portBASE_TYPE BaseType_t; +typedef portUBASE_TYPE UBaseType_t; +typedef portUBASE_TYPE TickType_t; + +/* Legacy type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ +#define portTICK_TYPE_IS_ATOMIC 1 +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 16 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +extern void vTaskSwitchContext( void ); +#define portYIELD() __asm volatile( "ecall" ); +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) vTaskSwitchContext(); } while( 0 ) +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portCRITICAL_NESTING_IN_TCB 0 + +#define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() + +extern size_t xCriticalNesting; +#define portENTER_CRITICAL() \ +{ \ + portDISABLE_INTERRUPTS(); \ + xCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ + xCriticalNesting--; \ + if( xCriticalNesting == 0 ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ +} + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#if( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 ) + + #error configUSE_PORT_OPTIMISED_TASK_SELECTION cannot yet be used in the IAR RISC-V port, the CLZ instruction needs to be emulated. + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo + * files (which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/*-----------------------------------------------------------*/ + +#define portNOP() __asm volatile( " nop " ) +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE inline __attribute__(( always_inline)) +#endif + +#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) +/*-----------------------------------------------------------*/ + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in + * the source code because to do so would cause other compilers to generate + * warnings. */ +#pragma diag_suppress=Pa082 + +/* configCLINT_BASE_ADDRESS is a legacy definition that was replaced by the + * configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS definitions. For + * backward compatibility derive the newer definitions from the old if the old + * definition is found. */ +#if defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS ) && ( configCLINT_BASE_ADDRESS == 0 ) + /* Legacy case where configCLINT_BASE_ADDRESS was defined as 0 to indicate + * there was no CLINT. Equivalent now is to set the MTIME and MTIMECMP + * addresses to 0. */ + #define configMTIME_BASE_ADDRESS ( 0 ) + #define configMTIMECMP_BASE_ADDRESS ( 0 ) +#elif defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS ) + /* Legacy case where configCLINT_BASE_ADDRESS was set to the base address of + * the CLINT. Equivalent now is to derive the MTIME and MTIMECMP addresses + * from the CLINT address. */ + #define configMTIME_BASE_ADDRESS ( ( configCLINT_BASE_ADDRESS ) + 0xBFF8UL ) + #define configMTIMECMP_BASE_ADDRESS ( ( configCLINT_BASE_ADDRESS ) + 0x4000UL ) +#elif !defined( configMTIME_BASE_ADDRESS ) || !defined( configMTIMECMP_BASE_ADDRESS ) + #error configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h. Set them to zero if there is no MTIME (machine time) clock. See https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/readme.txt new file mode 100644 index 0000000..b24c0b9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/readme.txt @@ -0,0 +1,23 @@ +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/port.c new file mode 100644 index 0000000..65e07e2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/port.c @@ -0,0 +1,210 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* The critical nesting value is initialised to a non zero value to ensure +interrupts don't accidentally become enabled before the scheduler is started. */ +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) + +/* Initial PSW value allocated to a newly created task. + * 1100011000000000 + * ||||||||-------------- Fill byte + * |||||||--------------- Carry Flag cleared + * |||||----------------- In-service priority Flags set to low level + * ||||------------------ Register bank Select 0 Flag cleared + * |||------------------- Auxiliary Carry Flag cleared + * ||-------------------- Register bank Select 1 Flag cleared + * |--------------------- Zero Flag set + * ---------------------- Global Interrupt Flag set (enabled) + */ +#define portPSW ( 0xc6UL ) + +/* The address of the pxCurrentTCB variable, but don't know or need to know its +type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each time +a critical section is entered the count is incremented. Each time a critical +section is exited the count is decremented - with interrupts only being +re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as that could cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; + +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. + */ +extern void vApplicationSetupTimerInterrupt( void ); + +/* + * Starts the scheduler by loading the context of the first Task to run. + * (implemented in portasm.s). + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t *pulLocal; + + /* With large code and large data sizeof( StackType_t ) == 2, and + sizeof( StackType_t * ) == 4. With small code and small data + sizeof( StackType_t ) == 2 and sizeof( StackType_t * ) == 2. */ + + #if __DATA_MODEL__ == __DATA_MODEL_FAR__ + { + /* Far pointer parameters are passed using the A:DE registers (24-bit). + Although they are stored in memory as a 32-bit value. Hence decrement + the stack pointer, so 2 bytes are left for the contents of A, before + storing the pvParameters value. */ + pxTopOfStack--; + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) pvParameters; + pxTopOfStack--; + + /* The return address is a 32-bit value. So decrement the stack pointer + in order to make extra room needed to store the correct value. See the + comments above the prvTaskExitError() prototype at the top of this file. */ + pxTopOfStack--; + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) prvTaskExitError; + pxTopOfStack--; + + /* The task function start address combined with the PSW is also stored + as a 32-bit value. So leave a space for the second two bytes. */ + pxTopOfStack--; + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* An initial value for the AX register. */ + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + } + #else + { + /* The return address, leaving space for the first two bytes of the + 32-bit value. See the comments above the prvTaskExitError() prototype + at the top of this file. */ + pxTopOfStack--; + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( uint32_t ) prvTaskExitError; + pxTopOfStack--; + + /* Task function. Again as it is written as a 32-bit value a space is + left on the stack for the second two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* The parameter is passed in AX. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + } + #endif + + /* An initial value for the HL register. */ + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + + /* CS and ES registers. */ + *pxTopOfStack = ( StackType_t ) 0x0F00; + pxTopOfStack--; + + /* The remaining general purpose registers DE and BC */ + *pxTopOfStack = ( StackType_t ) 0xDEDE; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBCBC; + pxTopOfStack--; + + /* Finally the critical section nesting count is set to zero when the task + first starts. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack that has been generated so + it can be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( usCriticalNesting == ~0U ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + vApplicationSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + vPortStartFirstTask(); + + /* Execution should not reach here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the RL78 port will get stopped. */ +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portasm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portasm.s new file mode 100644 index 0000000..91e12ed --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portasm.s @@ -0,0 +1,84 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + +#include "portmacro.h" + + EXTERN _vTaskSwitchContext + EXTERN _xTaskIncrementTick + + EXTERN _interrupt_vector_table + + PUBLIC _vPortYield + PUBLIC _vPortStartFirstTask + PUBLIC _vPortTickISR + +#if !defined(__IASMRL78__) || (__VER__ < 310) + #error "This port requires the IAR Assembler for RL78 version 3.10 or later." +#endif + +;------------------------------------------------------------------------------- +; FreeRTOS yield handler. This is installed as the BRK software interrupt +; handler. +;------------------------------------------------------------------------------- + SECTION `.text`:CODE:ROOT(1) +_vPortYield: + portSAVE_CONTEXT ; Save the context of the current task. + RCALL (_vTaskSwitchContext) ; Call the scheduler to select the next task. + portRESTORE_CONTEXT ; Restore the context of the next task to run. + RETB +;------------------------------------------------------------------------------- + + +;------------------------------------------------------------------------------- +; Starts the scheduler by restoring the context of the task that will execute +; first. +;------------------------------------------------------------------------------- + SECTION `.text`:CODE:ROOT(1) +_vPortStartFirstTask: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + RETI ; An interrupt stack frame is used so the + ; task is started using a RETI instruction. +;------------------------------------------------------------------------------- + + +;------------------------------------------------------------------------------- +; FreeRTOS Timer Tick handler. +; This is installed as the interval timer interrupt handler. +;------------------------------------------------------------------------------- + SECTION `.text`:CODE:ROOT(1) +_vPortTickISR: + portSAVE_CONTEXT ; Save the context of the current task. + RCALL (_xTaskIncrementTick) ; Call the timer tick function. + CMPW AX, #0x00 + SKZ + RCALL (_vTaskSwitchContext) ; Call the scheduler to select the next task. + portRESTORE_CONTEXT ; Restore the context of the next task to run. + RETI +;------------------------------------------------------------------------------- + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portmacro.h new file mode 100644 index 0000000..3b15440 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portmacro.h @@ -0,0 +1,228 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __IAR_SYSTEMS_ICC__ + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +#if __DATA_MODEL__ == __DATA_MODEL_FAR__ && __CODE_MODEL__ == __CODE_MODEL_NEAR__ + #warning This port has not been tested with your selected memory model combination. If a far data model is required it is recommended to also use a far code model. +#endif + +#if __DATA_MODEL__ == __DATA_MODEL_NEAR__ && __CODE_MODEL__ == __CODE_MODEL_FAR__ + #warning This port has not been tested with your selected memory model combination. If a far code model is required it is recommended to also use a far data model. +#endif + +/* Type definitions. */ + +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if __DATA_MODEL__ == __DATA_MODEL_FAR__ + #define portPOINTER_SIZE_TYPE uint32_t +#else + #define portPOINTER_SIZE_TYPE uint16_t +#endif + + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned int TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() __asm ( "DI" ) +#define portENABLE_INTERRUPTS() __asm ( "EI" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count when leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portNOP() __asm( "NOP" ) +#define portYIELD() __asm( "BRK" ) +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 ) +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __IAR_SYSTEMS_ICC__ */ + +;//----------------------------------------------------------------------------- +;// The macros below are processed for asm sources which include portmacro.h. +;//----------------------------------------------------------------------------- +#ifdef __IAR_SYSTEMS_ASM__ + +;/* Functions and variables used by this file. */ +;//----------------------------------------------------------------------------- + EXTERN _pxCurrentTCB + EXTERN _usCriticalNesting + +;/* Macro used to declutter calls, depends on the selected code model. */ +;//----------------------------------------------------------------------------- +#if __CODE_MODEL__ == __CODE_MODEL_FAR__ + #define RCALL(X) CALL F:X +#else + #define RCALL(X) CALL X +#endif + + +;/*----------------------------------------------------------------------------- +; * portSAVE_CONTEXT MACRO +; * Saves the context of the general purpose registers, CS and ES (only in __far +; * memory mode) registers the _usCriticalNesting value and the Stack Pointer +; * of the active Task onto the task stack. +; *---------------------------------------------------------------------------*/ +portSAVE_CONTEXT MACRO + PUSH AX ; // Save AX Register to stack. + PUSH HL +#if __CODE_MODEL__ == __CODE_MODEL_FAR__ + MOV A, CS ; // Save CS register. + XCH A, X + MOV A, ES ; // Save ES register. + PUSH AX +#else + MOV A, CS ; // Save CS register. + PUSH AX +#endif + PUSH DE ; // Save the remaining general purpose registers. + PUSH BC + MOVW AX, _usCriticalNesting ; // Save the _usCriticalNesting value. + PUSH AX + MOVW AX, _pxCurrentTCB ; // Save the Task stack pointer. + MOVW HL, AX + MOVW AX, SP + MOVW [HL], AX + ENDM +;//----------------------------------------------------------------------------- + + +;/*----------------------------------------------------------------------------- +; * portRESTORE_CONTEXT MACRO +; * Restores the task Stack Pointer then use this to restore _usCriticalNesting, +; * general purpose registers and the CS and ES (only in __far memory mode) +; * of the selected task from the task stack. +; *---------------------------------------------------------------------------*/ +portRESTORE_CONTEXT MACRO + MOVW AX, _pxCurrentTCB ; // Restore the Task stack pointer. + MOVW HL, AX + MOVW AX, [HL] + MOVW SP, AX + POP AX ; // Restore _usCriticalNesting value. + MOVW _usCriticalNesting, AX + POP BC ; // Restore the necessary general purpose registers. + POP DE +#if __CODE_MODEL__ == __CODE_MODEL_FAR__ + POP AX ; // Restore the ES register. + MOV ES, A + XCH A, X ; // Restore the CS register. + MOV CS, A +#else + POP AX + MOV CS, A ; // Restore CS register. +#endif + POP HL ; // Restore general purpose register HL. + POP AX ; // Restore AX. + ENDM +;//----------------------------------------------------------------------------- + +#endif /* __IAR_SYSTEMS_ASM__ */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port.c new file mode 100644 index 0000000..b463086 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port.c @@ -0,0 +1,517 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Standard C includes. */ +#include "limits.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "machine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/* The peripheral clock is divided by this value before being supplying the +CMT. */ +#if ( configUSE_TICKLESS_IDLE == 0 ) + /* If tickless idle is not used then the divisor can be fixed. */ + #define portCLOCK_DIVISOR 8UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 12000000 ) + #define portCLOCK_DIVISOR 512UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 6000000 ) + #define portCLOCK_DIVISOR 128UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 1000000 ) + #define portCLOCK_DIVISOR 32UL +#else + #define portCLOCK_DIVISOR 8UL +#endif + + +/* Keys required to lock and unlock access to certain system registers +respectively. */ +#define portUNLOCK_KEY 0xA50B +#define portLOCK_KEY 0xA500 + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +extern void prvStartFirstTask( void ); + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +__interrupt static void prvTickISR( void ); + +/* + * Sets up the periodic ISR used for the RTOS tick using the CMT. + * The application writer can define configSETUP_TICK_INTERRUPT() (in + * FreeRTOSConfig.h) such that their own tick interrupt configuration is used + * in place of prvSetupTimerInterrupt(). + */ +static void prvSetupTimerInterrupt( void ); +#ifndef configSETUP_TICK_INTERRUPT + /* The user has not provided their own tick interrupt configuration so use + the definition in this file (which uses the interval timer). */ + #define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt() +#endif /* configSETUP_TICK_INTERRUPT */ + +/* + * Called after the sleep mode registers have been configured, prvSleep() + * executes the pre and post sleep macros, and actually calls the wait + * instruction. + */ +#if configUSE_TICKLESS_IDLE == 1 + static void prvSleep( TickType_t xExpectedIdleTime ); +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* Calculate how many clock increments make up a single tick period. */ +static const uint32_t ulMatchValueForOneTick = ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + +#if configUSE_TICKLESS_IDLE == 1 + + /* Holds the maximum number of ticks that can be suppressed - which is + basically how far into the future an interrupt can be generated. Set + during initialisation. This is the maximum possible value that the + compare match register can hold divided by ulMatchValueForOneTick. */ + static const TickType_t xMaximumPossibleSuppressedTicks = USHRT_MAX / ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + + /* Flag set from the tick interrupt to allow the sleep processing to know if + sleep mode was exited because of a tick interrupt, or an interrupt + generated by something else. */ + static volatile uint32_t ulTickFlag = pdFALSE; + + /* The CMT counter is stopped temporarily each time it is re-programmed. + The following constant offsets the CMT counter match value by the number of + CMT counts that would typically be missed while the counter was stopped to + compensate for the lost time. The large difference between the divided CMT + clock and the CPU clock means it is likely ulStoppedTimerCompensation will + equal zero - and be optimised away. */ + static const uint32_t ulStoppedTimerCompensation = 100UL / ( configCPU_CLOCK_HZ / ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) ); + +#endif + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + /* Leave space for the registers that will get popped from the stack + when the task first starts executing. */ + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate + the tick interrupt. This way the application can decide which + peripheral to use. If tickless mode is used then the default + implementation defined in this file (which uses CMT0) should not be + overridden. */ + configSETUP_TICK_INTERRUPT(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Execution should not reach here as the tasks are now running! + prvSetupTimerInterrupt() is called here to prevent the compiler outputting + a warning about a statically declared function not being referenced in the + case that the application writer has provided their own tick interrupt + configuration routine (and defined configSETUP_TICK_INTERRUPT() such that + their own routine will be called in place of prvSetupTimerInterrupt()). */ + prvSetupTimerInterrupt(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma vector = configTICK_VECTOR +__interrupt static void prvTickISR( void ) +{ + /* Re-enable interrupts. */ + __enable_interrupt(); + + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY ); + + #if configUSE_TICKLESS_IDLE == 1 + { + /* The CPU woke because of a tick. */ + ulTickFlag = pdTRUE; + + /* If this is the first tick since exiting tickless mode then the CMT + compare match value needs resetting. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + } + #endif +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Unlock. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Enable CMT0. */ + MSTP( CMT0 ) = 0; + + /* Lock again. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Interrupt on compare match. */ + CMT0.CMCR.BIT.CMIE = 1; + + /* Set the compare match value. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + + /* Divide the PCLK. */ + #if portCLOCK_DIVISOR == 512 + { + CMT0.CMCR.BIT.CKS = 3; + } + #elif portCLOCK_DIVISOR == 128 + { + CMT0.CMCR.BIT.CKS = 2; + } + #elif portCLOCK_DIVISOR == 32 + { + CMT0.CMCR.BIT.CKS = 1; + } + #elif portCLOCK_DIVISOR == 8 + { + CMT0.CMCR.BIT.CKS = 0; + } + #else + { + #error Invalid portCLOCK_DIVISOR setting + } + #endif + + + /* Enable the interrupt... */ + _IEN( _CMT0_CMI0 ) = 1; + + /* ...and set its priority to the application defined kernel priority. */ + _IPR( _CMT0_CMI0 ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the timer. */ + CMT.CMSTR0.BIT.STR0 = 1; +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + static void prvSleep( TickType_t xExpectedIdleTime ) + { + /* Allow the application to define some pre-sleep processing. */ + configPRE_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING() + means the application defined code has already executed the WAIT + instruction. */ + if( xExpectedIdleTime > 0 ) + { + __wait_for_interrupt(); + } + + /* Allow the application to define some post sleep processing. */ + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulMatchValue, ulCompleteTickPeriods, ulCurrentCount; + eSleepModeStatus eSleepAction; + + /* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* Make sure the CMT reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Calculate the reload value required to wait xExpectedIdleTime tick + periods. */ + ulMatchValue = ulMatchValueForOneTick * xExpectedIdleTime; + if( ulMatchValue > ulStoppedTimerCompensation ) + { + /* Compensate for the fact that the CMT is going to be stopped + momentarily. */ + ulMatchValue -= ulStoppedTimerCompensation; + } + + /* Stop the CMT momentarily. The time the CMT is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + /* Critical section using the global interrupt bit as the i bit is + automatically reset by the WAIT instruction. */ + __disable_interrupt(); + + /* The tick flag is set to false before sleeping. If it is true when + sleep mode is exited then sleep mode was probably exited because the + tick was suppressed for the entire xExpectedIdleTime period. */ + ulTickFlag = pdFALSE; + + /* If a context switch is pending then abandon the low power entry as + the context switch might have been pended by an external interrupt that + requires processing. */ + eSleepAction = eTaskConfirmSleepModeStatus(); + if( eSleepAction == eAbortSleep ) + { + /* Restart tick. */ + CMT.CMSTR0.BIT.STR0 = 1; + __enable_interrupt(); + } + else if( eSleepAction == eNoTasksWaitingTimeout ) + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for software standby with all clocks stopped. */ + SYSTEM.SBYCR.BIT.SSBY = 1; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Restart the CMT. */ + CMT.CMSTR0.BIT.STR0 = 1; + } + else + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for deep sleep mode. */ + SYSTEM.MSTPCRC.BIT.DSLPE = 1; + SYSTEM.MSTPCRA.BIT.MSTPA28 = 1; + SYSTEM.SBYCR.BIT.SSBY = 0; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Adjust the match value to take into account that the current + time slice is already partially complete. */ + ulMatchValue -= ( uint32_t ) CMT0.CMCNT; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* Restart the CMT to count up to the new match value. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Stop CMT. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + ulCurrentCount = ( uint32_t ) CMT0.CMCNT; + + if( ulTickFlag != pdFALSE ) + { + /* The tick interrupt has already executed, although because + this function is called with the scheduler suspended the actual + tick processing will not occur until after this function has + exited. Reset the match value with whatever remains of this + tick period. */ + ulMatchValue = ulMatchValueForOneTick - ulCurrentCount; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent sleeping. The actual stepping of the tick appears + later in this function. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + How many complete tick periods passed while the processor was + sleeping? */ + ulCompleteTickPeriods = ulCurrentCount / ulMatchValueForOneTick; + + /* The match value is set to whatever fraction of a single tick + period remains. */ + ulMatchValue = ulCurrentCount - ( ulCompleteTickPeriods * ulMatchValueForOneTick ); + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + } + + /* Restart the CMT so it runs up to the match value. The match value + will get set to the value required to generate exactly one tick period + the next time the CMT interrupt executes. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Wind the tick forward by the number of tick periods that the CPU + remained in a low power state. */ + vTaskStepTick( ulCompleteTickPeriods ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port_asm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port_asm.s new file mode 100644 index 0000000..c886992 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port_asm.s @@ -0,0 +1,152 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "PriorityDefinitions.h" + + PUBLIC _prvStartFirstTask + PUBLIC ___interrupt_27 + + EXTERN _pxCurrentTCB + EXTERN _vTaskSwitchContext + + RSEG CODE:CODE(4) + +_prvStartFirstTask: + + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15 + + /* R1 to R15 - R0 is not included as it is the SP. */ + POPM R1-R15 + + /* This pops the remaining registers. */ + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + +/* The software interrupt - overwrite the default 'weak' definition. */ +___interrupt_27: + + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across, R15, then PC, then PSW. */ + MOV.L [ R0 ], [ R15 ] + MOV.L 4[ R0 ], 4[ R15 ] + MOV.L 8[ R0 ], 8[ R15 ] + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the accumulator. */ + MVFACHI R15 + PUSH.L R15 + + /* Middle word. */ + MVFACMI R15 + + /* Shifted left as it is restored to the low order word. */ + SHLL #16, R15 + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POPM R1-R15 + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/portmacro.h new file mode 100644 index 0000000..155eeab --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/portmacro.h @@ -0,0 +1,151 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() + +#define portYIELD() \ + __asm volatile \ + ( \ + "MOV.L #0x872E0, R15 \n" \ + "MOV.B #1, [R15] \n" \ + "MOV.L [R15], R15 \n" \ + ::: "R15" \ + ) + +#define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) { portYIELD(); } } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) ) + +/* Tickless idle/low power functionality. */ +#if configUSE_TICKLESS_IDLE == 1 + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prevent warnings of undefined behaviour: the order of volatile accesses is +undefined - all warnings have been manually checked and are not an issue, and +the warnings cannot be prevent by code changes without undesirable effects. */ +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port.c new file mode 100644 index 0000000..20a9cc2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port.c @@ -0,0 +1,194 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +extern void prvStartFirstTask( void ); + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +__interrupt void vTickISR( void ); + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma vector = configTICK_VECTOR +__interrupt void vTickISR( void ) +{ + /* Re-enable interrupts. */ + __enable_interrupt(); + + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port_asm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port_asm.s new file mode 100644 index 0000000..ffd8dcd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port_asm.s @@ -0,0 +1,160 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "PriorityDefinitions.h" + + PUBLIC _prvStartFirstTask + PUBLIC ___interrupt_27 + + EXTERN _pxCurrentTCB + EXTERN _vTaskSwitchContext + + RSEG CODE:CODE(4) + +_prvStartFirstTask: + + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15 + POP R15 + + /* Floating point status word. */ + MVTC R15, FPSW + + /* R1 to R15 - R0 is not included as it is the SP. */ + POPM R1-R15 + + /* This pops the remaining registers. */ + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + +/* The software interrupt - overwrite the default 'weak' definition. */ +___interrupt_27: + + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across, R15, then PC, then PSW. */ + MOV.L [ R0 ], [ R15 ] + MOV.L 4[ R0 ], 4[ R15 ] + MOV.L 8[ R0 ], 8[ R15 ] + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulator. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACHI R15 + PUSH.L R15 + + /* Middle word. */ + MVFACMI R15 + + /* Shifted left as it is restored to the low order word. */ + SHLL #16, R15 + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POP R15 + MVTC R15, FPSW + POPM R1-R15 + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/portmacro.h new file mode 100644 index 0000000..c77ce57 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/portmacro.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" +where portITU_SWINTR is the location of the software interrupt register +(0x000872E0). Don't rely on the assembler to select a register, so instead +save and restore clobbered registers manually. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n" \ + "MOV.L #0x872E0, R10 \n" \ + "MOV.B #0x1, [R10] \n" \ + "MOV.L [R10], R10 \n" \ + "POP R10 \n" \ + ) + +#define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) portYIELD(); } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/port.c new file mode 100644 index 0000000..38a8ac7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/port.c @@ -0,0 +1,568 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the RXv3 DPFPU port. +*----------------------------------------------------------*/ + +#warning Testing for DFPU support in this port is not yet complete + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + #include "platform.h" + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + #include "iodefine.h" + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore + * PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) +#define portINITIAL_DPSW ( ( StackType_t ) 0x00000100 ) +#define portINITIAL_DCMR ( ( StackType_t ) 0x00000000 ) +#define portINITIAL_DECNT ( ( StackType_t ) 0x00000001 ) + +/* Tasks are not created with a DPFPU context, but can be given a DPFPU context + * after they have been created. A variable is stored as part of the tasks context + * that holds portNO_DPFPU_CONTEXT if the task does not have a DPFPU context, or + * any other value if the task does have a DPFPU context. */ +#define portNO_DPFPU_CONTEXT ( ( StackType_t ) 0 ) +#define portHAS_DPFPU_CONTEXT ( ( StackType_t ) 1 ) + +/* The space on the stack required to hold the DPFPU data registers. This is 16 + * 64-bit registers. */ +#define portDPFPU_DATA_REGISTER_WORDS ( 16 * 2 ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +__interrupt void vSoftwareInterruptISR( void ); + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +__interrupt void vTickISR( void ); + +/*-----------------------------------------------------------*/ + +/* Saved as part of the task context. If ulPortTaskHasDPFPUContext is non-zero + * then a DPFPU context must be saved and restored for the task. */ +#if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + StackType_t ulPortTaskHasDPFPUContext = portNO_DPFPU_CONTEXT; + +#endif /* configUSE_TASK_DPFPU_SUPPORT */ + +/* This is accessed by the inline assembler functions so is file scope for + * convenience. */ +extern void * pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + * value. Otherwise code space can be saved by just setting the registers + * that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else /* ifdef USE_FULL_REGISTER_INITIALISATION */ + { + pxTopOfStack -= 15; + } + #endif /* ifdef USE_FULL_REGISTER_INITIALISATION */ + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 0. */ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + { + /* The task will start without a DPFPU context. A task that + * uses the DPFPU hardware must call vPortTaskUsesDPFPU() before + * executing any floating point instructions. */ + pxTopOfStack--; + *pxTopOfStack = portNO_DPFPU_CONTEXT; + } + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + { + /* The task will start with a DPFPU context. Leave enough + * space for the registers - and ensure they are initialised if desired. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1515.1515; /* DR15. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1414.1414; /* DR14. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1313.1313; /* DR13. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1212.1212; /* DR12. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1111.1111; /* DR11. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1010.1010; /* DR10. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 909.0909; /* DR9. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 808.0808; /* DR8. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 707.0707; /* DR7. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 606.0606; /* DR6. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 505.0505; /* DR5. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 404.0404; /* DR4. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 303.0303; /* DR3. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 202.0202; /* DR2. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 101.0101; /* DR1. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 9876.54321;/* DR0. */ + } + #else /* ifdef USE_FULL_REGISTER_INITIALISATION */ + { + pxTopOfStack -= portDPFPU_DATA_REGISTER_WORDS; + memset( pxTopOfStack, 0x00, portDPFPU_DATA_REGISTER_WORDS * sizeof( StackType_t ) ); + } + #endif /* ifdef USE_FULL_REGISTER_INITIALISATION */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_DECNT; /* DECNT. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_DCMR; /* DCMR. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_DPSW; /* DPSW. */ + } + #elif ( configUSE_TASK_DPFPU_SUPPORT == 0 ) + { + /* Omit DPFPU support. */ + } + #else /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + { + #error Invalid configUSE_TASK_DPFPU_SUPPORT setting - configUSE_TASK_DPFPU_SUPPORT must be set to 0, 1, 2, or left undefined. + } + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + void vPortTaskUsesDPFPU( void ) + { + /* A task is registering the fact that it needs a DPFPU context. Set the + * DPFPU flag (which is saved as part of the task context). */ + ulPortTaskHasDPFPUContext = portHAS_DPFPU_CONTEXT; + } + +#endif /* configUSE_TASK_DPFPU_SUPPORT */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + * tick interrupt. This way the application can decide which peripheral to + * use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + +static void prvStartFirstTask( void ) +{ + __asm volatile + ( + + /* When starting the scheduler there is nothing that needs moving to the + * interrupt stack because the function is not called from an interrupt. + * Just ensure the current stack is the user stack. */ + "SETPSW U \n"\ + + + /* Obtain the location of the stack associated with which ever task + * pxCurrentTCB is currently pointing to. */ + "MOV.L #_pxCurrentTCB, R15 \n"\ + "MOV.L [R15], R15 \n"\ + "MOV.L [R15], R0 \n"\ + + + /* Restore the registers from the stack of the task pointed to by + * pxCurrentTCB. */ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + /* The restored ulPortTaskHasDPFPUContext is to be zero here. + * So, it is never necessary to restore the DPFPU context here. */ + "POP R15 \n"\ + "MOV.L #_ulPortTaskHasDPFPUContext, R14 \n"\ + "MOV.L R15, [R14] \n"\ + + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + + /* Restore the DPFPU context. */ + "DPOPM.L DPSW-DECNT \n"\ + "DPOPM.D DR0-DR15 \n"\ + + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + "POP R15 \n"\ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n"\ + "POP R15 \n"\ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n"\ + "POP R15 \n"\ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n"\ + "POP R15 \n"\ + + /* Floating point status word. */ + "MVTC R15, FPSW \n"\ + + /* R1 to R15 - R0 is not included as it is the SP. */ + "POPM R1-R15 \n"\ + + /* This pops the remaining registers. */ + "RTE \n"\ + "NOP \n"\ + "NOP \n" + ); +} +/*-----------------------------------------------------------*/ + +#pragma vector = VECT( ICU, SWINT ) +__interrupt void vSoftwareInterruptISR( void ) +{ + __asm volatile + ( + /* Re-enable interrupts. */ + "SETPSW I \n"\ + + + /* Move the data that was automatically pushed onto the interrupt stack when + * the interrupt occurred from the interrupt stack to the user stack. + * + * R15 is saved before it is clobbered. */ + "PUSH.L R15 \n"\ + + /* Read the user stack pointer. */ + "MVFC USP, R15 \n"\ + + /* Move the address down to the data being moved. */ + "SUB #12, R15 \n"\ + "MVTC R15, USP \n"\ + + /* Copy the data across, R15, then PC, then PSW. */ + "MOV.L [ R0 ], [ R15 ] \n"\ + "MOV.L 4[ R0 ], 4[ R15 ] \n"\ + "MOV.L 8[ R0 ], 8[ R15 ] \n"\ + + /* Move the interrupt stack pointer to its new correct position. */ + "ADD #12, R0 \n"\ + + /* All the rest of the registers are saved directly to the user stack. */ + "SETPSW U \n"\ + + /* Save the rest of the general registers (R15 has been saved already). */ + "PUSHM R1-R14 \n"\ + + /* Save the FPSW and accumulators. */ + "MVFC FPSW, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACGU #0, A1, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACHI #0, A1, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACLO #0, A1, R15 \n" /* Low order word. */ \ + "PUSH.L R15 \n"\ + "MVFACGU #0, A0, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACHI #0, A0, R15 \n"\ + "PUSH.L R15 \n"\ + "MVFACLO #0, A0, R15 \n" /* Low order word. */ \ + "PUSH.L R15 \n"\ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + /* Does the task have a DPFPU context that needs saving? If + * ulPortTaskHasDPFPUContext is 0 then no. */ + "MOV.L #_ulPortTaskHasDPFPUContext, R15 \n"\ + "MOV.L [R15], R15 \n"\ + "CMP #0, R15 \n"\ + + /* Save the DPFPU context, if any. */ + "BEQ.B __lab1 \n"\ + "DPUSHM.D DR0-DR15 \n"\ + "DPUSHM.L DPSW-DECNT \n"\ + "__lab1: \n"\ + + /* Save ulPortTaskHasDPFPUContext itself. */ + "PUSH.L R15 \n"\ + + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + + /* Save the DPFPU context, always. */ + "DPUSHM.D DR0-DR15 \n"\ + "DPUSHM.L DPSW-DECNT \n"\ + + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + + /* Save the stack pointer to the TCB. */ + "MOV.L #_pxCurrentTCB, R15 \n"\ + "MOV.L [ R15 ], R15 \n"\ + "MOV.L R0, [ R15 ] \n"\ + + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + * structures are being accessed. */ + "MVTIPL %0 \n"\ + + /* Select the next task to run. */ + "BSR.A _vTaskSwitchContext \n"\ + + /* Reset the interrupt mask as no more data structure access is required. */ + "MVTIPL %1 \n"\ + + + /* Load the stack pointer of the task that is now selected as the Running + * state task from its TCB. */ + "MOV.L #_pxCurrentTCB,R15 \n"\ + "MOV.L [ R15 ], R15 \n"\ + "MOV.L [ R15 ], R0 \n"\ + + + /* Restore the context of the new task. The PSW (Program Status Word) and + * PC will be popped by the RTE instruction. */ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + /* Is there a DPFPU context to restore? If the restored + * ulPortTaskHasDPFPUContext is zero then no. */ + "POP R15 \n"\ + "MOV.L #_ulPortTaskHasDPFPUContext, R14 \n"\ + "MOV.L R15, [R14] \n"\ + "CMP #0, R15 \n"\ + + /* Restore the DPFPU context, if any. */ + "BEQ.B __lab2 \n"\ + "DPOPM.L DPSW-DECNT \n"\ + "DPOPM.D DR0-DR15 \n"\ + "__lab2: \n"\ + + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + + /* Restore the DPFPU context, always. */ + "DPOPM.L DPSW-DECNT \n"\ + "DPOPM.D DR0-DR15 \n"\ + + #endif /* if( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + "POP R15 \n"\ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator guard. */ + "MVTACGU R15, A0 \n"\ + "POP R15 \n"\ + + /* Accumulator low 32 bits. */ + "MVTACLO R15, A1 \n"\ + "POP R15 \n"\ + + /* Accumulator high 32 bits. */ + "MVTACHI R15, A1 \n"\ + "POP R15 \n"\ + + /* Accumulator guard. */ + "MVTACGU R15, A1 \n"\ + "POP R15 \n"\ + "MVTC R15, FPSW \n"\ + "POPM R1-R15 \n"\ + "RTE \n"\ + "NOP \n"\ + "NOP " + portCDT_NO_PARSE( :: ) "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ), "i" ( configKERNEL_INTERRUPT_PRIORITY ) + ); +} +/*-----------------------------------------------------------*/ + +#pragma vector = _VECT( configTICK_VECTOR ) +__interrupt void vTickISR( void ) +{ + /* Re-enable interrupts. */ + __enable_interrupt(); + + /* Increment the tick, and perform any processing the new tick value + * necessitates. Ensure IPL is at the max syscall value first. */ + __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/portmacro.h new file mode 100644 index 0000000..0ac86d7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/portmacro.h @@ -0,0 +1,196 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + +/* Hardware specifics. */ + #include + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* When the FIT configurator or the Smart Configurator is used, platform.h has to be + * used. */ + #ifndef configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H + #define configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H 0 + #endif + +/* If configUSE_TASK_DPFPU_SUPPORT is set to 1 (or undefined) then each task will + * be created without a DPFPU context, and a task must call vTaskUsesDPFPU() before + * making use of any DPFPU registers. If configUSE_TASK_DPFPU_SUPPORT is set to 2 then + * tasks are created with a DPFPU context by default, and calling vTaskUsesDPFPU() has + * no effect. If configUSE_TASK_DPFPU_SUPPORT is set to 0 then tasks never take care + * of any DPFPU context (even if DPFPU registers are used). */ + #ifndef configUSE_TASK_DPFPU_SUPPORT + #define configUSE_TASK_DPFPU_SUPPORT 1 + #endif + +/*-----------------------------------------------------------*/ + +/* Type definitions - these are a bit legacy and not really used now, other than + * portSTACK_TYPE and portBASE_TYPE. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ + #define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ + #define portSTACK_GROWTH -1 + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portNOP() __no_operation() + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" + * where portITU_SWINTR is the location of the software interrupt register + * (0x000872E0). Don't rely on the assembler to select a register, so instead + * save and restore clobbered registers manually. */ + #define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n"\ + "MOV.L #0x872E0, R10 \n"\ + "MOV.B #0x1, [R10] \n"\ + "CMP [R10].UB, R10 \n"\ + "POP R10 \n"\ + portCDT_NO_PARSE( ::: ) "cc"\ + ) + + #define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) portYIELD(); } while( 0 ) + +/* Workaround to reduce errors/warnings caused by e2 studio CDT's INDEXER and CODAN. */ + #ifdef __CDT_PARSER__ + #ifndef __asm + #define __asm asm + #endif + #ifndef __attribute__ + #define __attribute__( ... ) + #endif + #define portCDT_NO_PARSE( token ) + #else + #define portCDT_NO_PARSE( token ) token + #endif + +/* These macros should not be called directly, but through the + * taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is + * performed if configASSERT() is defined to ensure an assertion handler does not + * inadvertently attempt to lower the IPL when the call to assert was triggered + * because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY + * when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API + * functions are those that end in FromISR. FreeRTOS maintains a separate + * interrupt API to ensure API function and interrupt entry is as fast and as + * simple as possible. */ + #define portENABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) 0 ) + #ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) + #else + #define portDISABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) + #endif + +/* Critical nesting counts are stored in the TCB. */ + #define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ + extern void vTaskEnterCritical( void ); + extern void vTaskExitCritical( void ); + #define portENTER_CRITICAL() vTaskEnterCritical() + #define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ + #define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +/*-----------------------------------------------------------*/ + +/* If configUSE_TASK_DPFPU_SUPPORT is set to 1 (or left undefined) then tasks are + * created without a DPFPU context and must call vPortTaskUsesDPFPU() to give + * themselves a DPFPU context before using any DPFPU instructions. If + * configUSE_TASK_DPFPU_SUPPORT is set to 2 then all tasks will have a DPFPU context + * by default. */ + #if( configUSE_TASK_DPFPU_SUPPORT == 1 ) + void vPortTaskUsesDPFPU( void ); + #else +/* Each task has a DPFPU context already, so define this function away to + * nothing to prevent it being called accidentally. */ + #define vPortTaskUsesDPFPU() + #endif + #define portTASK_USES_DPFPU() vPortTaskUsesDPFPU() + +/* Definition to allow compatibility with existing FreeRTOS Demo using flop.c. */ + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesDPFPU() + +/* Prevent warnings of undefined behaviour: the order of volatile accesses is + * undefined - all warnings have been manually checked and are not an issue, and + * the warnings cannot be prevent by code changes without undesirable effects. */ + #pragma diag_suppress=Pa082 + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port.c new file mode 100644 index 0000000..fb9ab5c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port.c @@ -0,0 +1,202 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +extern void prvStartFirstTask( void ); + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +__interrupt void vTickISR( void ); + +/*-----------------------------------------------------------*/ + +extern void *pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 1. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma vector = configTICK_VECTOR +__interrupt void vTickISR( void ) +{ + /* Re-enable interrupts. */ + __enable_interrupt(); + + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + __set_interrupt_level( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + __set_interrupt_level( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port_asm.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port_asm.s new file mode 100644 index 0000000..59ce9e1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port_asm.s @@ -0,0 +1,201 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "PriorityDefinitions.h" + + PUBLIC _prvStartFirstTask + PUBLIC ___interrupt_27 + + EXTERN _pxCurrentTCB + EXTERN _vTaskSwitchContext + + RSEG CODE:CODE(4) + +_prvStartFirstTask: + + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A0 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A0 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A0 + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A1 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A1 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A1 + POP R15 + + /* Floating point status word. */ + MVTC R15, FPSW + + /* R1 to R15 - R0 is not included as it is the SP. */ + POPM R1-R15 + + /* This pops the remaining registers. */ + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + +/* The software interrupt - overwrite the default 'weak' definition. */ +___interrupt_27: + + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across, R15, then PC, then PSW. */ + MOV.L [ R0 ], [ R15 ] + MOV.L 4[ R0 ], 4[ R15 ] + MOV.L 8[ R0 ], 8[ R15 ] + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulator. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACGU #0, A1, R15 + PUSH.L R15 + MVFACHI #0, A1, R15 + PUSH.L R15 + /* Low order word. */ + MVFACLO #0, A1, R15 + PUSH.L R15 + MVFACGU #0, A0, R15 + PUSH.L R15 + MVFACHI #0, A0, R15 + PUSH.L R15 + /* Low order word. */ + MVFACLO #0, A0, R15 + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A0 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A0 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A0 + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A1 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A1 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A1 + POP R15 + MVTC R15, FPSW + POPM R1-R15 + RTE + NOP + NOP + +/*-----------------------------------------------------------*/ + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/portmacro.h new file mode 100644 index 0000000..9d7f2b4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/portmacro.h @@ -0,0 +1,145 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __no_operation() + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" +where portITU_SWINTR is the location of the software interrupt register +(0x000872E0). Don't rely on the assembler to select a register, so instead +save and restore clobbered registers manually. */ +#define portYIELD() \ + __asm volatile \ + ( \ + "PUSH.L R10 \n" \ + "MOV.L #0x872E0, R10 \n" \ + "MOV.B #0x1, [R10] \n" \ + "MOV.L [R10], R10 \n" \ + "POP R10 \n" \ + ) + +#define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) portYIELD(); } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( __get_interrupt_level() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( __get_interrupt_level() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() __set_interrupt_level( ( uint8_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() __get_interrupt_level(); portDISABLE_INTERRUPTS() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) __set_interrupt_level( ( uint8_t ) ( uxSavedInterruptStatus ) ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prevent warnings of undefined behaviour: the order of volatile accesses is +undefined - all warnings have been manually checked and are not an issue, and +the warnings cannot be prevent by code changes without undesirable effects. */ +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/ISR_Support.h new file mode 100644 index 0000000..9167d85 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/ISR_Support.h @@ -0,0 +1,106 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/port.c new file mode 100644 index 0000000..9527933 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/port.c @@ -0,0 +1,259 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ST STR71x ARM7 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include "wdg.h" +#include "eic.h" + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +#define portMICROS_PER_SECOND 1000000 + +/*-----------------------------------------------------------*/ + +/* Setup the watchdog to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/* Tick interrupt routines for cooperative and preemptive operation +respectively. The preemptive version is not defined as __irq as it is called +from an asm wrapper function. */ +__arm __irq void vPortNonPreemptiveTick( void ); +void vPortPreemptiveTick( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* The cooperative scheduler requires a normal IRQ service routine to +simply increment the system tick. */ +__arm __irq void vPortNonPreemptiveTick( void ) +{ + /* Increment the tick count - which may wake some tasks but as the + preemptive scheduler is not being used any woken task is not given + processor time no matter what its priority. */ + xTaskIncrementTick(); + + /* Clear the interrupt in the watchdog and EIC. */ + WDG->SR = 0x0000; + portCLEAR_EIC(); +} +/*-----------------------------------------------------------*/ + +/* This function is called from an asm wrapper, so does not require the __irq +keyword. */ +void vPortPreemptiveTick( void ) +{ + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Select a new task to execute. */ + vTaskSwitchContext(); + } + + /* Clear the interrupt in the watchdog and EIC. */ + WDG->SR = 0x0000; + portCLEAR_EIC(); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Set the watchdog up to generate a periodic tick. */ + WDG_ECITConfig( DISABLE ); + WDG_CntOnOffConfig( DISABLE ); + WDG_PeriodValueConfig( portMICROS_PER_SECOND / configTICK_RATE_HZ ); + + /* Setup the tick interrupt in the EIC. */ + EIC_IRQChannelPriorityConfig( WDG_IRQChannel, 1 ); + EIC_IRQChannelConfig( WDG_IRQChannel, ENABLE ); + EIC_IRQConfig( ENABLE ); + WDG_ECITConfig( ENABLE ); + + /* Start the timer - interrupts are actually disabled at this point so + it is safe to do this here. */ + WDG_CntOnOffConfig( ENABLE ); +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_interrupt(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_interrupt(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portasm.s79 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portasm.s79 new file mode 100644 index 0000000..781ee9b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portasm.s79 @@ -0,0 +1,77 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + RSEG ICODE:CODE + CODE32 + + EXTERN vPortPreemptiveTick + EXTERN vTaskSwitchContext + + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + PUBLIC vPortPreemptiveTickISR + +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Preemptive context switch function. This will only ever get used if +; portUSE_PREEMPTION is set to 1 in portmacro.h. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortPreemptiveTickISR: + portSAVE_CONTEXT ; Save the context of the current task. + + LDR R0, =vPortPreemptiveTick ; Increment the tick count - this may wake a task. + MOV lr, pc + BX R0 + + portRESTORE_CONTEXT ; Restore the context of the selected task. + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portmacro.h new file mode 100644 index 0000000..69d2c53 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portmacro.h @@ -0,0 +1,122 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortDisableInterruptsFromThumb( void ); +__arm __interwork void vPortEnableInterruptsFromThumb( void ); +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + +/* EIC utilities. */ +#define portEIC_CICR_ADDR *( ( uint32_t * ) 0xFFFFF804 ) +#define portEIC_IPR_ADDR *( ( uint32_t * ) 0xFFFFF840 ) +#define portCLEAR_EIC() portEIC_IPR_ADDR = 0x01 << portEIC_CICR_ADDR + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/ISR_Support.h new file mode 100644 index 0000000..9167d85 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/ISR_Support.h @@ -0,0 +1,106 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/port.c new file mode 100644 index 0000000..87cfbc8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/port.c @@ -0,0 +1,238 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ST STR75x ARM7 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include "75x_tb.h" +#include "75x_eic.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial stack. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* Prescale used on the timer clock when calculating the tick period. */ +#define portPRESCALE 20 + + +/*-----------------------------------------------------------*/ + +/* Setup the TB to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/* Tick interrupt routines for preemptive operation. */ +__arm void vPortPreemptiveTick( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +__arm void vPortPreemptiveTick( void ) +{ + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Select a new task to execute. */ + vTaskSwitchContext(); + } + + TB_ClearITPendingBit( TB_IT_Update ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +EIC_IRQInitTypeDef EIC_IRQInitStructure; +TB_InitTypeDef TB_InitStructure; + + /* Setup the EIC for the TB. */ + EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE; + EIC_IRQInitStructure.EIC_IRQChannel = TB_IRQChannel; + EIC_IRQInitStructure.EIC_IRQChannelPriority = 1; + EIC_IRQInit(&EIC_IRQInitStructure); + + /* Setup the TB for the generation of the tick interrupt. */ + TB_InitStructure.TB_Mode = TB_Mode_Timing; + TB_InitStructure.TB_CounterMode = TB_CounterMode_Down; + TB_InitStructure.TB_Prescaler = portPRESCALE - 1; + TB_InitStructure.TB_AutoReload = ( ( configCPU_CLOCK_HZ / portPRESCALE ) / configTICK_RATE_HZ ); + TB_Init(&TB_InitStructure); + + /* Enable TB Update interrupt */ + TB_ITConfig(TB_IT_Update, ENABLE); + + /* Clear TB Update interrupt pending bit */ + TB_ClearITPendingBit(TB_IT_Update); + + /* Enable TB */ + TB_Cmd(ENABLE); +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + __disable_interrupt(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + __enable_interrupt(); + } + } +} +/*-----------------------------------------------------------*/ + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portasm.s79 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portasm.s79 new file mode 100644 index 0000000..32cf338 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portasm.s79 @@ -0,0 +1,64 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + RSEG ICODE:CODE + CODE32 + + EXTERN vPortPreemptiveTick + EXTERN vTaskSwitchContext + + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + mov lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portmacro.h new file mode 100644 index 0000000..d2f0da1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portmacro.h @@ -0,0 +1,113 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/ISR_Support.h new file mode 100644 index 0000000..ece0680 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/ISR_Support.h @@ -0,0 +1,106 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + EXTERN pxCurrentTCB + EXTERN ulCriticalNesting + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + ; Push R0 as we are going to use the register. + STMDB SP!, {R0} + + ; Set R0 to point to the task stack pointer. + STMDB SP, {SP}^ + NOP + SUB SP, SP, #4 + LDMIA SP!, {R0} + + ; Push the return address onto the stack. + STMDB R0!, {LR} + + ; Now we have saved LR we can use it instead of R0. + MOV LR, R0 + + ; Pop R0 so we can save it onto the system mode stack. + LDMIA SP!, {R0} + + ; Push all the system mode registers onto the task stack. + STMDB LR, {R0-LR}^ + NOP + SUB LR, LR, #60 + + ; Push the SPSR onto the task stack. + MRS R0, SPSR + STMDB LR!, {R0} + + LDR R0, =ulCriticalNesting + LDR R0, [R0] + STMDB LR!, {R0} + + ; Store the new top of stack for the task. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + STR LR, [R0] + + ENDM + + +portRESTORE_CONTEXT MACRO + + ; Set the LR to the task stack. + LDR R1, =pxCurrentTCB + LDR R0, [R1] + LDR LR, [R0] + + ; The critical nesting depth is the first item on the stack. + ; Load it into the ulCriticalNesting variable. + LDR R0, =ulCriticalNesting + LDMFD LR!, {R1} + STR R1, [R0] + + ; Get the SPSR from the stack. + LDMFD LR!, {R0} + MSR SPSR_cxsf, R0 + + ; Restore all system mode registers for the task. + LDMFD LR, {R0-R14}^ + NOP + + ; Restore the return address. + LDR LR, [LR, #+60] + + ; And return - correcting the offset in the LR to obtain the + ; correct address. + SUBS PC, LR, #4 + + ENDM + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/port.c new file mode 100644 index 0000000..c5ea8ab --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/port.c @@ -0,0 +1,422 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ST STR91x ARM9 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include "91x_lib.h" + +/* Standard includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configUSE_WATCHDOG_TICK + #error configUSE_WATCHDOG_TICK must be set to either 1 or 0 in FreeRTOSConfig.h to use either the Watchdog or timer 2 to generate the tick interrupt respectively. +#endif + +/* Constants required to setup the initial stack. */ +#ifndef _RUN_TASK_IN_ARM_MODE_ + #define portINITIAL_SPSR ( ( StackType_t ) 0x3f ) /* System mode, THUMB mode, interrupts enabled. */ +#else + #define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#endif + +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) + +/* Constants required to handle critical sections. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +#ifndef abs + #define abs(x) ((x)>0 ? (x) : -(x)) +#endif + +/** + * Toggle a led using the following algorithm: + * if ( GPIO_ReadBit(GPIO9, GPIO_Pin_2) ) + * { + * GPIO_WriteBit( GPIO9, GPIO_Pin_2, Bit_RESET ); + * } + * else + * { + * GPIO_WriteBit( GPIO9, GPIO_Pin_2, Bit_RESET ); + * } + * + */ +#define TOGGLE_LED(port,pin) \ + if ( ((((port)->DR[(pin)<<2])) & (pin)) != Bit_RESET ) \ + { \ + (port)->DR[(pin) <<2] = 0x00; \ + } \ + else \ + { \ + (port)->DR[(pin) <<2] = (pin); \ + } + + +/*-----------------------------------------------------------*/ + +/* Setup the watchdog to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* ulCriticalNesting will get set to zero when the first task starts. It +cannot be initialised to 0 as this will cause interrupts to be enabled +during the kernel initialisation process. */ +uint32_t ulCriticalNesting = ( uint32_t ) 9999; + +/* Tick interrupt routines for cooperative and preemptive operation +respectively. The preemptive version is not defined as __irq as it is called +from an asm wrapper function. */ +void WDG_IRQHandler( void ); + +/* VIC interrupt default handler. */ +static void prvDefaultHandler( void ); + +#if configUSE_WATCHDOG_TICK == 0 + /* Used to update the OCR timer register */ + static u16 s_nPulseLength; +#endif + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + StackType_t *pxOriginalTOS; + + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. */ + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The status register is set for system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + pxTopOfStack--; + + /* Interrupt flags cannot always be stored on the stack and will + instead be stored in a variable, which is then saved as part of the + tasks context. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +/* This function is called from an asm wrapper, so does not require the __irq +keyword. */ +#if configUSE_WATCHDOG_TICK == 1 + + static void prvFindFactors(u32 n, u16 *a, u32 *b) + { + /* This function is copied from the ST STR7 library and is + copyright STMicroelectronics. Reproduced with permission. */ + + u32 b0; + u16 a0; + int32_t err, err_min=n; + + *a = a0 = ((n-1)/65536ul) + 1; + *b = b0 = n / *a; + + for (; *a <= 256; (*a)++) + { + *b = n / *a; + err = (int32_t)*a * (int32_t)*b - (int32_t)n; + if (abs(err) > (*a / 2)) + { + (*b)++; + err = (int32_t)*a * (int32_t)*b - (int32_t)n; + } + if (abs(err) < abs(err_min)) + { + err_min = err; + a0 = *a; + b0 = *b; + if (err == 0) break; + } + } + + *a = a0; + *b = b0; + } + /*-----------------------------------------------------------*/ + + static void prvSetupTimerInterrupt( void ) + { + WDG_InitTypeDef xWdg; + uint16_t a; + uint32_t n = configCPU_PERIPH_HZ / configTICK_RATE_HZ, b; + + /* Configure the watchdog as a free running timer that generates a + periodic interrupt. */ + + SCU_APBPeriphClockConfig( __WDG, ENABLE ); + WDG_DeInit(); + WDG_StructInit(&xWdg); + prvFindFactors( n, &a, &b ); + xWdg.WDG_Prescaler = a - 1; + xWdg.WDG_Preload = b - 1; + WDG_Init( &xWdg ); + WDG_ITConfig(ENABLE); + + /* Configure the VIC for the WDG interrupt. */ + VIC_Config( WDG_ITLine, VIC_IRQ, 10 ); + VIC_ITCmd( WDG_ITLine, ENABLE ); + + /* Install the default handlers for both VIC's. */ + VIC0->DVAR = ( uint32_t ) prvDefaultHandler; + VIC1->DVAR = ( uint32_t ) prvDefaultHandler; + + WDG_Cmd(ENABLE); + } + /*-----------------------------------------------------------*/ + + void WDG_IRQHandler( void ) + { + { + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Select a new task to execute. */ + vTaskSwitchContext(); + } + + /* Clear the interrupt in the watchdog. */ + WDG->SR &= ~0x0001; + } + } + +#else + + static void prvFindFactors(u32 n, u8 *a, u16 *b) + { + /* This function is copied from the ST STR7 library and is + copyright STMicroelectronics. Reproduced with permission. */ + + u16 b0; + u8 a0; + int32_t err, err_min=n; + + + *a = a0 = ((n-1)/256) + 1; + *b = b0 = n / *a; + + for (; *a <= 256; (*a)++) + { + *b = n / *a; + err = (int32_t)*a * (int32_t)*b - (int32_t)n; + if (abs(err) > (*a / 2)) + { + (*b)++; + err = (int32_t)*a * (int32_t)*b - (int32_t)n; + } + if (abs(err) < abs(err_min)) + { + err_min = err; + a0 = *a; + b0 = *b; + if (err == 0) break; + } + } + + *a = a0; + *b = b0; + } + /*-----------------------------------------------------------*/ + + static void prvSetupTimerInterrupt( void ) + { + uint8_t a; + uint16_t b; + uint32_t n = configCPU_PERIPH_HZ / configTICK_RATE_HZ; + + TIM_InitTypeDef timer; + + SCU_APBPeriphClockConfig( __TIM23, ENABLE ); + TIM_DeInit(TIM2); + TIM_StructInit(&timer); + prvFindFactors( n, &a, &b ); + + timer.TIM_Mode = TIM_OCM_CHANNEL_1; + timer.TIM_OC1_Modes = TIM_TIMING; + timer.TIM_Clock_Source = TIM_CLK_APB; + timer.TIM_Clock_Edge = TIM_CLK_EDGE_RISING; + timer.TIM_Prescaler = a-1; + timer.TIM_Pulse_Level_1 = TIM_HIGH; + timer.TIM_Pulse_Length_1 = s_nPulseLength = b-1; + + TIM_Init (TIM2, &timer); + TIM_ITConfig(TIM2, TIM_IT_OC1, ENABLE); + /* Configure the VIC for the WDG interrupt. */ + VIC_Config( TIM2_ITLine, VIC_IRQ, 10 ); + VIC_ITCmd( TIM2_ITLine, ENABLE ); + + /* Install the default handlers for both VIC's. */ + VIC0->DVAR = ( uint32_t ) prvDefaultHandler; + VIC1->DVAR = ( uint32_t ) prvDefaultHandler; + + TIM_CounterCmd(TIM2, TIM_CLEAR); + TIM_CounterCmd(TIM2, TIM_START); + } + /*-----------------------------------------------------------*/ + + void TIM2_IRQHandler( void ) + { + /* Reset the timer counter to avioid overflow. */ + TIM2->OC1R += s_nPulseLength; + + /* Increment the tick counter. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Select a new task to run. */ + vTaskSwitchContext(); + } + + /* Clear the interrupt in the watchdog. */ + TIM2->SR &= ~TIM_FLAG_OC1; + } + +#endif /* USE_WATCHDOG_TICK */ + +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortEnterCritical( void ) +{ + /* Disable interrupts first! */ + portDISABLE_INTERRUPTS(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +__arm __interwork void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + portENABLE_INTERRUPTS(); + } + } +} +/*-----------------------------------------------------------*/ + +static void prvDefaultHandler( void ) +{ +} + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portasm.s79 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portasm.s79 new file mode 100644 index 0000000..15a5410 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portasm.s79 @@ -0,0 +1,61 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + RSEG ICODE:CODE + CODE32 + + EXTERN vTaskSwitchContext + + PUBLIC vPortYieldProcessor + PUBLIC vPortStartFirstTask + +#include "ISR_Support.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is just a matter of restoring the context that +; was created by pxPortInitialiseStack(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask: + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Manual context switch function. This is the SWI hander. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortYieldProcessor: + ADD LR, LR, #4 ; Add 4 to the LR to make the LR appear exactly + ; as if the context was saved during and IRQ + ; handler. + + portSAVE_CONTEXT ; Save the context of the current task... + LDR R0, =vTaskSwitchContext ; before selecting the next task to execute. + MOV lr, pc + BX R0 + portRESTORE_CONTEXT ; Restore the context of the selected task. + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portmacro.h new file mode 100644 index 0000000..8d92eb6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portmacro.h @@ -0,0 +1,115 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portYIELD() asm ( "SWI 0" ) +#define portNOP() asm ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +__arm __interwork void vPortEnterCritical( void ); +__arm __interwork void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +#define portDISABLE_INTERRUPTS() __disable_interrupt() +#define portENABLE_INTERRUPTS() __enable_interrupt() + + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portEND_SWITCHING_ISR( xSwitchRequired ) \ +{ \ +extern void vTaskSwitchContext( void ); \ + \ + if( xSwitchRequired ) \ + { \ + vTaskSwitchContext(); \ + } \ +} +/*-----------------------------------------------------------*/ + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/ISR_Support.h new file mode 100644 index 0000000..b066786 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/ISR_Support.h @@ -0,0 +1,150 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +#include "FreeRTOSConfig.h" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Context save and restore macro definitions +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +portSAVE_CONTEXT MACRO + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack +#if configDATA_MODE == 1 ; Using the Tiny data model + prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers + sst.w r19,72[ep] + sst.w r18,68[ep] + sst.w r17,64[ep] + sst.w r16,60[ep] + sst.w r15,56[ep] + sst.w r14,52[ep] + sst.w r13,48[ep] + sst.w r12,44[ep] + sst.w r11,40[ep] + sst.w r10,36[ep] + sst.w r9,32[ep] + sst.w r8,28[ep] + sst.w r7,24[ep] + sst.w r6,20[ep] + sst.w r5,16[ep] + sst.w r4,12[ep] +#else ; Using the Small/Large data model + prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp ; save general purpose registers + sst.w r19,68[ep] + sst.w r18,64[ep] + sst.w r17,60[ep] + sst.w r16,56[ep] + sst.w r15,52[ep] + sst.w r14,48[ep] + sst.w r13,44[ep] + sst.w r12,40[ep] + sst.w r11,36[ep] + sst.w r10,32[ep] + sst.w r9,28[ep] + sst.w r8,24[ep] + sst.w r7,20[ep] + sst.w r6,16[ep] + sst.w r5,12[ep] +#endif /* configDATA_MODE */ + sst.w r2,8[ep] + sst.w r1,4[ep] + MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack + ld.w lw1(usCriticalNesting)[r1],r2 + sst.w r2,0[ep] + MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB + ld.w lw1(pxCurrentTCB)[r1],r2 + st.w sp,0[r2] + ENDM + + +portRESTORE_CONTEXT MACRO + + MOVHI hi1(pxCurrentTCB),r0,r1 ; get Stackpointer address + ld.w lw1(pxCurrentTCB)[r1],sp + MOV sp,r1 + ld.w 0[r1],sp ; load stackpointer + MOV sp,ep ; set stack pointer to element pointer + sld.w 0[ep],r1 ; load usCriticalNesting value from stack + MOVHI hi1(usCriticalNesting),r0,r2 + st.w r1,lw1(usCriticalNesting)[r2] + sld.w 4[ep],r1 ; restore general purpose registers + sld.w 8[ep],r2 +#if configDATA_MODE == 1 ; Using Tiny data model + sld.w 12[ep],r4 + sld.w 16[ep],r5 + sld.w 20[ep],r6 + sld.w 24[ep],r7 + sld.w 28[ep],r8 + sld.w 32[ep],r9 + sld.w 36[ep],r10 + sld.w 40[ep],r11 + sld.w 44[ep],r12 + sld.w 48[ep],r13 + sld.w 52[ep],r14 + sld.w 56[ep],r15 + sld.w 60[ep],r16 + sld.w 64[ep],r17 + sld.w 68[ep],r18 + sld.w 72[ep],r19 + dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30} +#else ; Using Small/Large data model + sld.w 12[ep],r5 + sld.w 16[ep],r6 + sld.w 20[ep],r7 + sld.w 24[ep],r8 + sld.w 28[ep],r9 + sld.w 32[ep],r10 + sld.w 36[ep],r11 + sld.w 40[ep],r12 + sld.w 44[ep],r13 + sld.w 48[ep],r14 + sld.w 52[ep],r15 + sld.w 56[ep],r16 + sld.w 60[ep],r17 + sld.w 64[ep],r18 + sld.w 68[ep],r19 + dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30} +#endif /* configDATA_MODE */ + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI + + ENDM diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/port.c new file mode 100644 index 0000000..2e5864e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/port.c @@ -0,0 +1,184 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Critical nesting should be initialised to a non zero value so interrupts don't +accidentally get enabled before the scheduler is started. */ +#define portINITIAL_CRITICAL_NESTING (( StackType_t ) 10) + +/* The PSW value assigned to tasks when they start to run for the first time. */ +#define portPSW (( StackType_t ) 0x00000000) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Keeps track of the nesting level of critical sections. */ +volatile StackType_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + +/* Sets up the timer to generate the tick interrupt. */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + *pxTopOfStack = ( StackType_t ) pxCode; /* Task function start address */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* Task function start address */ + pxTopOfStack--; + *pxTopOfStack = portPSW; /* Initial PSW value */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x20202020; /* Initial Value of R20 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x21212121; /* Initial Value of R21 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22222222; /* Initial Value of R22 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x23232323; /* Initial Value of R23 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x24242424; /* Initial Value of R24 */ + pxTopOfStack--; +#if (__DATA_MODEL__ == 0) || (__DATA_MODEL__ == 1) + *pxTopOfStack = ( StackType_t ) 0x25252525; /* Initial Value of R25 */ + pxTopOfStack--; +#endif /* configDATA_MODE */ + *pxTopOfStack = ( StackType_t ) 0x26262626; /* Initial Value of R26 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x27272727; /* Initial Value of R27 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x28282828; /* Initial Value of R28 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x29292929; /* Initial Value of R29 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x30303030; /* Initial Value of R30 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x19191919; /* Initial Value of R19 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x18181818; /* Initial Value of R18 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x17171717; /* Initial Value of R17 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x16161616; /* Initial Value of R16 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x15151515; /* Initial Value of R15 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x14141414; /* Initial Value of R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x13131313; /* Initial Value of R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* Initial Value of R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* Initial Value of R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* Initial Value of R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x99999999; /* Initial Value of R09 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x88888888; /* Initial Value of R08 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x77777777; /* Initial Value of R07 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x66666666; /* Initial Value of R06 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x55555555; /* Initial Value of R05 */ + pxTopOfStack--; +#if __DATA_MODEL__ == 0 || __DATA_MODEL__ == 1 + *pxTopOfStack = ( StackType_t ) 0x44444444; /* Initial Value of R04 */ + pxTopOfStack--; +#endif /* configDATA_MODE */ + *pxTopOfStack = ( StackType_t ) 0x22222222; /* Initial Value of R02 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 is expected to hold the function parameter*/ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* + * Return a pointer to the top of the stack we have generated so this can + * be stored in the task control block for the task. + */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + vPortStart(); + + /* Should not get here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the V850ES/Fx3 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses + */ +static void prvSetupTimerInterrupt( void ) +{ + TM0CE = 0; /* TMM0 operation disable */ + TM0EQMK0 = 1; /* INTTM0EQ0 interrupt disable */ + TM0EQIF0 = 0; /* clear INTTM0EQ0 interrupt flag */ + + #ifdef __IAR_V850ES_Fx3__ + { + TM0CMP0 = (((configCPU_CLOCK_HZ / configTICK_RATE_HZ) / 2)-1); /* divided by 2 because peripherals only run at CPU_CLOCK/2 */ + } + #else + { + TM0CMP0 = (configCPU_CLOCK_HZ / configTICK_RATE_HZ); + } + #endif + + TM0EQIC0 &= 0xF8; + TM0CTL0 = 0x00; + TM0EQIF0 = 0; /* clear INTTM0EQ0 interrupt flag */ + TM0EQMK0 = 0; /* INTTM0EQ0 interrupt enable */ + TM0CE = 1; /* TMM0 operation enable */ +} +/*-----------------------------------------------------------*/ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm.s85 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm.s85 new file mode 100644 index 0000000..470ccbc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm.s85 @@ -0,0 +1,316 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ +; Note: Select the correct include files for the device used by the application. +#include "FreeRTOSConfig.h" +;------------------------------------------------------------------------------ + +; Functions used by scheduler +;------------------------------------------------------------------------------ + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +; Functions implemented in this file +;------------------------------------------------------------------------------ + PUBLIC vPortYield + PUBLIC vPortStart + +; Security ID definition +;------------------------------------------------------------------------------ +#define CG_SECURITY0 0FFH +#define CG_SECURITY1 0FFH +#define CG_SECURITY2 0FFH +#define CG_SECURITY3 0FFH +#define CG_SECURITY4 0FFH +#define CG_SECURITY5 0FFH +#define CG_SECURITY6 0FFH +#define CG_SECURITY7 0FFH +#define CG_SECURITY8 0FFH +#define CG_SECURITY9 0FFH + +; Tick ISR Prototype +;------------------------------------------------------------------------------ + PUBWEAK `??MD_INTTM0EQ0??INTVEC 640` + PUBLIC MD_INTTM0EQ0 + +MD_INTTM0EQ0 SYMBOL "MD_INTTM0EQ0" +`??MD_INTTM0EQ0??INTVEC 640` SYMBOL "??INTVEC 640", MD_INTTM0EQ0 + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the remaining general purpose registers +; and the usCriticalNesting Value of the active Task onto the task stack +; saves stack pointer to the TCB +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO +#if configDATA_MODE == 1 ; Using the Tiny data model + prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers + sst.w r19,72[ep] + sst.w r18,68[ep] + sst.w r17,64[ep] + sst.w r16,60[ep] + sst.w r15,56[ep] + sst.w r14,52[ep] + sst.w r13,48[ep] + sst.w r12,44[ep] + sst.w r11,40[ep] + sst.w r10,36[ep] + sst.w r9,32[ep] + sst.w r8,28[ep] + sst.w r7,24[ep] + sst.w r6,20[ep] + sst.w r5,16[ep] + sst.w r4,12[ep] +#else ; Using the Small/Large data model + prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp ; save general purpose registers + sst.w r19,68[ep] + sst.w r18,64[ep] + sst.w r17,60[ep] + sst.w r16,56[ep] + sst.w r15,52[ep] + sst.w r14,48[ep] + sst.w r13,44[ep] + sst.w r12,40[ep] + sst.w r11,36[ep] + sst.w r10,32[ep] + sst.w r9,28[ep] + sst.w r8,24[ep] + sst.w r7,20[ep] + sst.w r6,16[ep] + sst.w r5,12[ep] +#endif /* configDATA_MODE */ + sst.w r2,8[ep] + sst.w r1,4[ep] + MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack + ld.w lw1(usCriticalNesting)[r1],r2 + sst.w r2,0[ep] + MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB + ld.w lw1(pxCurrentTCB)[r1],r2 + st.w sp,0[r2] + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Gets stack pointer from the current TCB +; Restores the context of the usCriticalNesting value and general purpose +; registers of the selected task from the task stack +;------------------------------------------------------------------------------ +portRESTORE_CONTEXT MACRO + MOVHI hi1(pxCurrentTCB),r0,r1 ; get Stackpointer address + ld.w lw1(pxCurrentTCB)[r1],sp + MOV sp,r1 + ld.w 0[r1],sp ; load stackpointer + MOV sp,ep ; set stack pointer to element pointer + sld.w 0[ep],r1 ; load usCriticalNesting value from stack + MOVHI hi1(usCriticalNesting),r0,r2 + st.w r1,lw1(usCriticalNesting)[r2] + sld.w 4[ep],r1 ; restore general purpose registers + sld.w 8[ep],r2 +#if configDATA_MODE == 1 ; Using Tiny data model + sld.w 12[ep],r4 + sld.w 16[ep],r5 + sld.w 20[ep],r6 + sld.w 24[ep],r7 + sld.w 28[ep],r8 + sld.w 32[ep],r9 + sld.w 36[ep],r10 + sld.w 40[ep],r11 + sld.w 44[ep],r12 + sld.w 48[ep],r13 + sld.w 52[ep],r14 + sld.w 56[ep],r15 + sld.w 60[ep],r16 + sld.w 64[ep],r17 + sld.w 68[ep],r18 + sld.w 72[ep],r19 + dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30} +#else ; Using Small/Large data model + sld.w 12[ep],r5 + sld.w 16[ep],r6 + sld.w 20[ep],r7 + sld.w 24[ep],r8 + sld.w 28[ep],r9 + sld.w 32[ep],r10 + sld.w 36[ep],r11 + sld.w 40[ep],r12 + sld.w 44[ep],r13 + sld.w 48[ep],r14 + sld.w 52[ep],r15 + sld.w 56[ep],r16 + sld.w 60[ep],r17 + sld.w 64[ep],r18 + sld.w 68[ep],r19 + dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30} +#endif /* configDATA_MODE */ + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Restore the context of the first task that is going to run. +; +; Input: NONE +; +; Call: CALL vPortStart +; +; Output: NONE +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortStart: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ld.w 0[sp],lp + ldsr lp,5 ; restore PSW + DI + ld.w 4[sp],lp ; restore LP + ld.w 8[sp],lp ; restore LP + ADD 0x0C,sp ; set SP to right position + EI + jmp [lp] +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Port Yield function to check for a Task switch in the cooperative and +; preemptive mode +; +; Input: NONE +; +; Call: CALL vPortYield +; +; Output: NONE +;------------------------------------------------------------------------------ + + RSEG CODE:CODE +vPortYield: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI + +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Perform the necessary steps of the Tick Count Increment and Task Switch +; depending on the chosen kernel configuration +; +; Input: NONE +; +; Call: ISR +; +; Output: NONE +;------------------------------------------------------------------------------ +#if configUSE_PREEMPTION == 1 ; use preemptive kernel mode + +MD_INTTM0EQ0: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl xTaskIncrementTick,lp ; Call the timer tick function. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI +;------------------------------------------------------------------------------ +#else ; use cooperative kernel mode + +MD_INTTM0EQ0: + prepare {lp,ep},8,sp + sst.w r1,4[ep] + sst.w r5,0[ep] + jarl xTaskIncrementTick,lp ; Call the timer tick function. + sld.w 0[ep],r5 + sld.w 4[ep],r1 + dispose 8,{lp,ep} + RETI +#endif /* configUSE_PREEMPTION */ + +;------------------------------------------------------------------------------ + COMMON INTVEC:CODE:ROOT(2) + ORG 640 +`??MD_INTTM0EQ0??INTVEC 640`: + JR MD_INTTM0EQ0 + + RSEG NEAR_ID:CONST:SORT:NOROOT(2) +`?`: + DW 10 + + COMMON INTVEC:CODE:ROOT(2) + ORG 40H +`??vPortYield??INTVEC 40`: + JR vPortYield + +;------------------------------------------------------------------------------ +; set microcontroller security ID + + COMMON INTVEC:CODE:ROOT(2) + ORG 70H +`SECUID`: + DB CG_SECURITY0 + DB CG_SECURITY1 + DB CG_SECURITY2 + DB CG_SECURITY3 + DB CG_SECURITY4 + DB CG_SECURITY5 + DB CG_SECURITY6 + DB CG_SECURITY7 + DB CG_SECURITY8 + DB CG_SECURITY9 + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Fx3.s85 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Fx3.s85 new file mode 100644 index 0000000..a6495ca --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Fx3.s85 @@ -0,0 +1,336 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ +; Note: Select the correct include files for the device used by the application. +#include "FreeRTOSConfig.h" +;------------------------------------------------------------------------------ + +; Functions used by scheduler +;------------------------------------------------------------------------------ + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +; Functions implemented in this file +;------------------------------------------------------------------------------ + PUBLIC vPortYield + PUBLIC vPortStart + +; Security ID definition +;------------------------------------------------------------------------------ +#define CG_SECURITY0 0FFH +#define CG_SECURITY1 0FFH +#define CG_SECURITY2 0FFH +#define CG_SECURITY3 0FFH +#define CG_SECURITY4 0FFH +#define CG_SECURITY5 0FFH +#define CG_SECURITY6 0FFH +#define CG_SECURITY7 0FFH +#define CG_SECURITY8 0FFH +#define CG_SECURITY9 0FFH + +; Option Byte definitions +;------------------------------------------------------------------------------ +#define CG_OPTION7A 0x00 +#define CG_OPTION7B 0x04 +#define OPT7C 0x00 +#define OPT7D 0x00 +#define OPT7E 0x00 +#define OPT7F 0x00 + +; Tick ISR Prototype +;------------------------------------------------------------------------------ + PUBWEAK `??MD_INTTM0EQ0??INTVEC 608` + PUBLIC MD_INTTM0EQ0 + +MD_INTTM0EQ0 SYMBOL "MD_INTTM0EQ0" +`??MD_INTTM0EQ0??INTVEC 608` SYMBOL "??INTVEC 608", MD_INTTM0EQ0 + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the remaining general purpose registers +; and the usCriticalNesting Value of the active Task onto the task stack +; saves stack pointer to the TCB +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO +#if configDATA_MODE == 1 ; Using the Tiny data model + prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers + sst.w r19,72[ep] + sst.w r18,68[ep] + sst.w r17,64[ep] + sst.w r16,60[ep] + sst.w r15,56[ep] + sst.w r14,52[ep] + sst.w r13,48[ep] + sst.w r12,44[ep] + sst.w r11,40[ep] + sst.w r10,36[ep] + sst.w r9,32[ep] + sst.w r8,28[ep] + sst.w r7,24[ep] + sst.w r6,20[ep] + sst.w r5,16[ep] + sst.w r4,12[ep] +#else ; Using the Small/Large data model + prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp ; save general purpose registers + sst.w r19,68[ep] + sst.w r18,64[ep] + sst.w r17,60[ep] + sst.w r16,56[ep] + sst.w r15,52[ep] + sst.w r14,48[ep] + sst.w r13,44[ep] + sst.w r12,40[ep] + sst.w r11,36[ep] + sst.w r10,32[ep] + sst.w r9,28[ep] + sst.w r8,24[ep] + sst.w r7,20[ep] + sst.w r6,16[ep] + sst.w r5,12[ep] +#endif /* configDATA_MODE */ + sst.w r2,8[ep] + sst.w r1,4[ep] + MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack + ld.w lw1(usCriticalNesting)[r1],r2 + sst.w r2,0[ep] + MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB + ld.w lw1(pxCurrentTCB)[r1],r2 + st.w sp,0[r2] + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Gets stack pointer from the current TCB +; Restores the context of the usCriticalNesting value and general purpose +; registers of the selected task from the task stack +;------------------------------------------------------------------------------ +portRESTORE_CONTEXT MACRO + MOVHI hi1(pxCurrentTCB),r0,r1 ; get Stackpointer address + ld.w lw1(pxCurrentTCB)[r1],sp + MOV sp,r1 + ld.w 0[r1],sp ; load stackpointer + MOV sp,ep ; set stack pointer to element pointer + sld.w 0[ep],r1 ; load usCriticalNesting value from stack + MOVHI hi1(usCriticalNesting),r0,r2 + st.w r1,lw1(usCriticalNesting)[r2] + sld.w 4[ep],r1 ; restore general purpose registers + sld.w 8[ep],r2 +#if configDATA_MODE == 1 ; Using Tiny data model + sld.w 12[ep],r4 + sld.w 16[ep],r5 + sld.w 20[ep],r6 + sld.w 24[ep],r7 + sld.w 28[ep],r8 + sld.w 32[ep],r9 + sld.w 36[ep],r10 + sld.w 40[ep],r11 + sld.w 44[ep],r12 + sld.w 48[ep],r13 + sld.w 52[ep],r14 + sld.w 56[ep],r15 + sld.w 60[ep],r16 + sld.w 64[ep],r17 + sld.w 68[ep],r18 + sld.w 72[ep],r19 + dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30} +#else ; Using Small/Large data model + sld.w 12[ep],r5 + sld.w 16[ep],r6 + sld.w 20[ep],r7 + sld.w 24[ep],r8 + sld.w 28[ep],r9 + sld.w 32[ep],r10 + sld.w 36[ep],r11 + sld.w 40[ep],r12 + sld.w 44[ep],r13 + sld.w 48[ep],r14 + sld.w 52[ep],r15 + sld.w 56[ep],r16 + sld.w 60[ep],r17 + sld.w 64[ep],r18 + sld.w 68[ep],r19 + dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30} +#endif /* configDATA_MODE */ + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Restore the context of the first task that is going to run. +; +; Input: NONE +; +; Call: CALL vPortStart +; +; Output: NONE +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortStart: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ld.w 0[sp],lp + ldsr lp,5 ; restore PSW + DI + ld.w 4[sp],lp ; restore LP + ld.w 8[sp],lp ; restore LP + ADD 0x0C,sp ; set SP to right position + EI + jmp [lp] +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Port Yield function to check for a Task switch in the cooperative and +; preemptive mode +; +; Input: NONE +; +; Call: CALL vPortYield +; +; Output: NONE +;------------------------------------------------------------------------------ + + RSEG CODE:CODE +vPortYield: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI + +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Perform the necessary steps of the Tick Count Increment and Task Switch +; depending on the chosen kernel configuration +; +; Input: NONE +; +; Call: ISR +; +; Output: NONE +;------------------------------------------------------------------------------ +#if configUSE_PREEMPTION == 1 ; use preemptive kernel mode + +MD_INTTM0EQ0: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl xTaskIncrementTick,lp ; Call the timer tick function. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI +;------------------------------------------------------------------------------ +#else ; use cooperative kernel mode + +MD_INTTM0EQ0: + prepare {lp,ep},8,sp + sst.w r1,4[ep] + sst.w r5,0[ep] + jarl xTaskIncrementTick,lp ; Call the timer tick function. + sld.w 0[ep],r5 + sld.w 4[ep],r1 + dispose 8,{lp,ep} + RETI +#endif /* configUSE_PREEMPTION */ + +;------------------------------------------------------------------------------ + COMMON INTVEC:CODE:ROOT(2) + ORG 608 +`??MD_INTTM0EQ0??INTVEC 608`: + JR MD_INTTM0EQ0 + + RSEG NEAR_ID:CONST:SORT:NOROOT(2) +`?`: + DW 10 + + COMMON INTVEC:CODE:ROOT(2) + ORG 40H +`??vPortYield??INTVEC 40`: + JR vPortYield + +;------------------------------------------------------------------------------ +; set microcontroller security ID + + COMMON INTVEC:CODE:ROOT(2) + ORG 70H +`SECUID`: + DB CG_SECURITY0 + DB CG_SECURITY1 + DB CG_SECURITY2 + DB CG_SECURITY3 + DB CG_SECURITY4 + DB CG_SECURITY5 + DB CG_SECURITY6 + DB CG_SECURITY7 + DB CG_SECURITY8 + DB CG_SECURITY9 + +;------------------------------------------------------------------------------ +; set microcontroller option bytes + + COMMON INTVEC:CODE:ROOT(2) + ORG 7AH +`OPTBYTES`: + DB CG_OPTION7A + DB CG_OPTION7B + DB OPT7C + DB OPT7D + DB OPT7E + DB OPT7F + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Hx2.s85 b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Hx2.s85 new file mode 100644 index 0000000..e660ebc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Hx2.s85 @@ -0,0 +1,351 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ +; Note: Select the correct include files for the device used by the application. +#include "FreeRTOSConfig.h" +;------------------------------------------------------------------------------ + +; Functions used by scheduler +;------------------------------------------------------------------------------ + EXTERN vTaskSwitchContext + EXTERN xTaskIncrementTick + +; Variables used by scheduler +;------------------------------------------------------------------------------ + EXTERN pxCurrentTCB + EXTERN usCriticalNesting + +; Functions implemented in this file +;------------------------------------------------------------------------------ + PUBLIC vPortYield + PUBLIC vPortStart + +; Security ID definition +;------------------------------------------------------------------------------ +#define CG_SECURITY0 0FFH +#define CG_SECURITY1 0FFH +#define CG_SECURITY2 0FFH +#define CG_SECURITY3 0FFH +#define CG_SECURITY4 0FFH +#define CG_SECURITY5 0FFH +#define CG_SECURITY6 0FFH +#define CG_SECURITY7 0FFH +#define CG_SECURITY8 0FFH +#define CG_SECURITY9 0FFH + +; Tick ISR Prototype +;------------------------------------------------------------------------------ + PUBWEAK `??MD_INTTM0EQ0??INTVEC 544` + PUBLIC MD_INTTM0EQ0 + +MD_INTTM0EQ0 SYMBOL "MD_INTTM0EQ0" +`??MD_INTTM0EQ0??INTVEC 544` SYMBOL "??INTVEC 544", MD_INTTM0EQ0 + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT MACRO +; Saves the context of the remaining general purpose registers +; and the usCriticalNesting Value of the active Task onto the task stack +; saves stack pointer to the TCB +;------------------------------------------------------------------------------ +portSAVE_CONTEXT MACRO +#if configDATA_MODE == 1 ; Using the Tiny data model + prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers + sst.w r19,72[ep] + sst.w r18,68[ep] + sst.w r17,64[ep] + sst.w r16,60[ep] + sst.w r15,56[ep] + sst.w r14,52[ep] + sst.w r13,48[ep] + sst.w r12,44[ep] + sst.w r11,40[ep] + sst.w r10,36[ep] + sst.w r9,32[ep] + sst.w r8,28[ep] + sst.w r7,24[ep] + sst.w r6,20[ep] + sst.w r5,16[ep] + sst.w r4,12[ep] +#else ; Using the Small/Large data model + prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp ; save general purpose registers + sst.w r19,68[ep] + sst.w r18,64[ep] + sst.w r17,60[ep] + sst.w r16,56[ep] + sst.w r15,52[ep] + sst.w r14,48[ep] + sst.w r13,44[ep] + sst.w r12,40[ep] + sst.w r11,36[ep] + sst.w r10,32[ep] + sst.w r9,28[ep] + sst.w r8,24[ep] + sst.w r7,20[ep] + sst.w r6,16[ep] + sst.w r5,12[ep] +#endif /* configDATA_MODE */ + sst.w r2,8[ep] + sst.w r1,4[ep] + MOVHI hi1(usCriticalNesting),r0,r1 ; save usCriticalNesting value to stack + ld.w lw1(usCriticalNesting)[r1],r2 + sst.w r2,0[ep] + MOVHI hi1(pxCurrentTCB),r0,r1 ; save SP to top of current TCB + ld.w lw1(pxCurrentTCB)[r1],r2 + st.w sp,0[r2] + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Gets stack pointer from the current TCB +; Restores the context of the usCriticalNesting value and general purpose +; registers of the selected task from the task stack +;------------------------------------------------------------------------------ +portRESTORE_CONTEXT MACRO + MOVHI hi1(pxCurrentTCB),r0,r1 ; get Stackpointer address + ld.w lw1(pxCurrentTCB)[r1],sp + MOV sp,r1 + ld.w 0[r1],sp ; load stackpointer + MOV sp,ep ; set stack pointer to element pointer + sld.w 0[ep],r1 ; load usCriticalNesting value from stack + MOVHI hi1(usCriticalNesting),r0,r2 + st.w r1,lw1(usCriticalNesting)[r2] + sld.w 4[ep],r1 ; restore general purpose registers + sld.w 8[ep],r2 +#if configDATA_MODE == 1 ; Using Tiny data model + sld.w 12[ep],r4 + sld.w 16[ep],r5 + sld.w 20[ep],r6 + sld.w 24[ep],r7 + sld.w 28[ep],r8 + sld.w 32[ep],r9 + sld.w 36[ep],r10 + sld.w 40[ep],r11 + sld.w 44[ep],r12 + sld.w 48[ep],r13 + sld.w 52[ep],r14 + sld.w 56[ep],r15 + sld.w 60[ep],r16 + sld.w 64[ep],r17 + sld.w 68[ep],r18 + sld.w 72[ep],r19 + dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30} +#else ; Using Small/Large data model + sld.w 12[ep],r5 + sld.w 16[ep],r6 + sld.w 20[ep],r7 + sld.w 24[ep],r8 + sld.w 28[ep],r9 + sld.w 32[ep],r10 + sld.w 36[ep],r11 + sld.w 40[ep],r12 + sld.w 44[ep],r13 + sld.w 48[ep],r14 + sld.w 52[ep],r15 + sld.w 56[ep],r16 + sld.w 60[ep],r17 + sld.w 64[ep],r18 + sld.w 68[ep],r19 + dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30} +#endif /* configDATA_MODE */ + ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Restore the context of the first task that is going to run. +; +; Input: NONE +; +; Call: CALL vPortStart +; +; Output: NONE +;------------------------------------------------------------------------------ + RSEG CODE:CODE +vPortStart: + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ld.w 0[sp],lp + ldsr lp,5 ; restore PSW + DI + ld.w 4[sp],lp ; restore LP + ld.w 8[sp],lp ; restore LP + ADD 0x0C,sp ; set SP to right position + EI + jmp [lp] +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Port Yield function to check for a Task switch in the cooperative and +; preemptive mode +; +; Input: NONE +; +; Call: CALL vPortYield +; +; Output: NONE +;------------------------------------------------------------------------------ + + RSEG CODE:CODE +vPortYield: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI + +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; Perform the necessary steps of the Tick Count Increment and Task Switch +; depending on the chosen kernel configuration +; +; Input: NONE +; +; Call: ISR +; +; Output: NONE +;------------------------------------------------------------------------------ +#if configUSE_PREEMPTION == 1 ; use preemptive kernel mode + +MD_INTTM0EQ0: + + add -0x0C,sp ; prepare stack to save necessary values + st.w lp,8[sp] ; store LP to stack + stsr 0,r31 + st.w lp,4[sp] ; store EIPC to stack + stsr 1,lp + st.w lp,0[sp] ; store EIPSW to stack + portSAVE_CONTEXT ; Save the context of the current task. + jarl xTaskIncrementTick,lp ; Call the timer tick function. + jarl vTaskSwitchContext,lp ; Call the scheduler. + portRESTORE_CONTEXT ; Restore the context of whichever task the ... + ; ... scheduler decided should run. + ld.w 0[sp],lp ; restore EIPSW from stack + ldsr lp,1 + ld.w 4[sp],lp ; restore EIPC from stack + ldsr lp,0 + ld.w 8[sp],lp ; restore LP from stack + add 0x0C,sp ; set SP to right position + + RETI +;------------------------------------------------------------------------------ +#else ; use cooperative kernel mode + +MD_INTTM0EQ0: + prepare {lp,ep},8,sp + sst.w r1,4[ep] + sst.w r5,0[ep] + jarl xTaskIncrementTick,lp ; Call the timer tick function. + sld.w 0[ep],r5 + sld.w 4[ep],r1 + dispose 8,{lp,ep} + RETI +#endif /* configUSE_PREEMPTION */ + +;------------------------------------------------------------------------------ + COMMON INTVEC:CODE:ROOT(2) + ORG 544 +`??MD_INTTM0EQ0??INTVEC 544`: + JR MD_INTTM0EQ0 + + RSEG NEAR_ID:CONST:SORT:NOROOT(2) +`?`: + DW 10 + + COMMON INTVEC:CODE:ROOT(2) + ORG 40H +`??vPortYield??INTVEC 40`: + JR vPortYield + +;------------------------------------------------------------------------------ +; set microcontroller security ID + + COMMON INTVEC:CODE:ROOT(2) + ORG 70H +`SECUID`: + DB CG_SECURITY0 + DB CG_SECURITY1 + DB CG_SECURITY2 + DB CG_SECURITY3 + DB CG_SECURITY4 + DB CG_SECURITY5 + DB CG_SECURITY6 + DB CG_SECURITY7 + DB CG_SECURITY8 + DB CG_SECURITY9 + + +; set microcontroller Option bytes + + COMMON INTVEC:CODE:ROOT(2) + ORG 122 +`OPTBYTES`: + DB 0xFD + DB 0xFF + DB 0xFF + DB 0xFF + DB 0xFF + DB 0xFF + +#if configOCD_USAGE == 1 + + COMMON INTVEC:CODE:ROOT(4) + ORG 0x230 + PUBLIC ROM_INT2 +ROM_INT2: + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + + + COMMON INTVEC:CODE:ROOT(4) + ORG 0x60 + PUBLIC ROM_INT +ROM_INT: + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + DB 0xff, 0xff, 0xff, 0xff + +#endif /* configOCD_USAGE */ + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portmacro.h new file mode 100644 index 0000000..a3877d3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portmacro.h @@ -0,0 +1,136 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned int +#define portBASE_TYPE int + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if (configUSE_16_BIT_TICKS==1) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() __asm ( "DI" ) +#define portENABLE_INTERRUPTS() __asm ( "EI" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( UBaseType_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile /*uint16_t*/ portSTACK_TYPE usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile /*uint16_t*/ portSTACK_TYPE usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortYield( void ); +extern void vPortStart( void ); +extern void portSAVE_CONTEXT( void ); +extern void portRESTORE_CONTEXT( void ); +#define portYIELD() __asm ( "trap 0" ) +#define portNOP() __asm ( "NOP" ) +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 ) + +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#define portBYTE_ALIGNMENT 4 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Keil/See-also-the-RVDS-directory.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Keil/See-also-the-RVDS-directory.txt new file mode 100644 index 0000000..bd7fab7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Keil/See-also-the-RVDS-directory.txt @@ -0,0 +1 @@ +Nothing to see here. \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/port.c new file mode 100644 index 0000000..6f91655 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/port.c @@ -0,0 +1,616 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes between V1.2.4 and V1.2.5 + + + Introduced portGLOBAL_INTERRUPT_FLAG definition to test the global + interrupt flag setting. Using the two bits defined within + portINITAL_INTERRUPT_STATE was causing the w register to get clobbered + before the test was performed. + +Changes from V1.2.5 + + + Set the interrupt vector address to 0x08. Previously it was at the + incorrect address for compatibility mode of 0x18. + +Changes from V2.1.1 + + + PCLATU and PCLATH are now saved as part of the context. This allows + function pointers to be used within tasks. Thanks to Javier Espeche + for the enhancement. + +Changes from V2.3.1 + + + TABLAT is now saved as part of the task context. + +Changes from V3.2.0 + + + TBLPTRU is now initialised to zero as the MPLAB compiler expects this + value and does not write to the register. +*/ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* MPLAB library include file. */ +#include "timers.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC port. + *----------------------------------------------------------*/ + +/* Hardware setup for tick. */ +#define portTIMER_FOSC_SCALE ( ( uint32_t ) 4 ) + +/* Initial interrupt enable state for newly created tasks. This value is +copied into INTCON when a task switches in for the first time. */ +#define portINITAL_INTERRUPT_STATE 0xc0 + +/* Just the bit within INTCON for the global interrupt flag. */ +#define portGLOBAL_INTERRUPT_FLAG 0x80 + +/* Constant used for context switch macro when we require the interrupt +enable state to be unchanged when the interrupted task is switched back in. */ +#define portINTERRUPTS_UNCHANGED 0x00 + +/* Some memory areas get saved as part of the task context. These memory +area's get used by the compiler for temporary storage, especially when +performing mathematical operations, or when using 32bit data types. This +constant defines the size of memory area which must be saved. */ +#define portCOMPILER_MANAGED_MEMORY_SIZE ( ( uint8_t ) 0x13 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* IO port constants. */ +#define portBIT_SET ( ( uint8_t ) 1 ) +#define portBIT_CLEAR ( ( uint8_t ) 0 ) + +/* + * The serial port ISR's are defined in serial.c, but are called from portable + * as they use the same vector as the tick ISR. + */ +void vSerialTxISR( void ); +void vSerialRxISR( void ); + +/* + * Perform hardware setup to enable ticks. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * ISR to maintain the tick, and perform tick context switches if the + * preemptive scheduler is being used. + */ +static void prvTickISR( void ); + +/* + * ISR placed on the low priority vector. This calls the appropriate ISR for + * the actual interrupt. + */ +static void prvLowInterrupt( void ); + +/* + * Macro that pushes all the registers that make up the context of a task onto + * the stack, then saves the new top of stack into the TCB. + * + * If this is called from an ISR then the interrupt enable bits must have been + * set for the ISR to ever get called. Therefore we want to save the INTCON + * register with the enable bits forced to be set - and ucForcedInterruptFlags + * must contain these bit settings. This means the interrupts will again be + * enabled when the interrupted task is switched back in. + * + * If this is called from a manual context switch (i.e. from a call to yield), + * then we want to save the INTCON so it is restored with its current state, + * and ucForcedInterruptFlags must be 0. This allows a yield from within + * a critical section. + * + * The compiler uses some locations at the bottom of the memory for temporary + * storage during math and other computations. This is especially true if + * 32bit data types are utilised (as they are by the scheduler). The .tmpdata + * and MATH_DATA sections have to be stored in there entirety as part of a task + * context. This macro stores from data address 0x00 to + * portCOMPILER_MANAGED_MEMORY_SIZE. This is sufficient for the demo + * applications but you should check the map file for your project to ensure + * this is sufficient for your needs. It is not clear whether this size is + * fixed for all compilations or has the potential to be program specific. + */ +#define portSAVE_CONTEXT( ucForcedInterruptFlags ) \ +{ \ + _asm \ + /* Save the status and WREG registers first, as these will get modified \ + by the operations below. */ \ + MOVFF WREG, PREINC1 \ + MOVFF STATUS, PREINC1 \ + /* Save the INTCON register with the appropriate bits forced if \ + necessary - as described above. */ \ + MOVFF INTCON, WREG \ + IORLW ucForcedInterruptFlags \ + MOVFF WREG, PREINC1 \ + _endasm \ + \ + portDISABLE_INTERRUPTS(); \ + \ + _asm \ + /* Store the necessary registers to the stack. */ \ + MOVFF BSR, PREINC1 \ + MOVFF FSR2L, PREINC1 \ + MOVFF FSR2H, PREINC1 \ + MOVFF FSR0L, PREINC1 \ + MOVFF FSR0H, PREINC1 \ + MOVFF TABLAT, PREINC1 \ + MOVFF TBLPTRU, PREINC1 \ + MOVFF TBLPTRH, PREINC1 \ + MOVFF TBLPTRL, PREINC1 \ + MOVFF PRODH, PREINC1 \ + MOVFF PRODL, PREINC1 \ + MOVFF PCLATU, PREINC1 \ + MOVFF PCLATH, PREINC1 \ + /* Store the .tempdata and MATH_DATA areas as described above. */ \ + CLRF FSR0L, 0 \ + CLRF FSR0H, 0 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF POSTINC0, PREINC1 \ + MOVFF INDF0, PREINC1 \ + MOVFF FSR0L, PREINC1 \ + MOVFF FSR0H, PREINC1 \ + /* Store the hardware stack pointer in a temp register before we \ + modify it. */ \ + MOVFF STKPTR, FSR0L \ + _endasm \ + \ + /* Store each address from the hardware stack. */ \ + while( STKPTR > ( uint8_t ) 0 ) \ + { \ + _asm \ + MOVFF TOSL, PREINC1 \ + MOVFF TOSH, PREINC1 \ + MOVFF TOSU, PREINC1 \ + POP \ + _endasm \ + } \ + \ + _asm \ + /* Store the number of addresses on the hardware stack (from the \ + temporary register). */ \ + MOVFF FSR0L, PREINC1 \ + MOVF PREINC1, 1, 0 \ + _endasm \ + \ + /* Save the new top of the software stack in the TCB. */ \ + _asm \ + MOVFF pxCurrentTCB, FSR0L \ + MOVFF pxCurrentTCB + 1, FSR0H \ + MOVFF FSR1L, POSTINC0 \ + MOVFF FSR1H, POSTINC0 \ + _endasm \ +} +/*-----------------------------------------------------------*/ + +/* + * This is the reverse of portSAVE_CONTEXT. See portSAVE_CONTEXT for more + * details. + */ +#define portRESTORE_CONTEXT() \ +{ \ + _asm \ + /* Set FSR0 to point to pxCurrentTCB->pxTopOfStack. */ \ + MOVFF pxCurrentTCB, FSR0L \ + MOVFF pxCurrentTCB + 1, FSR0H \ + \ + /* De-reference FSR0 to set the address it holds into FSR1. \ + (i.e. *( pxCurrentTCB->pxTopOfStack ) ). */ \ + MOVFF POSTINC0, FSR1L \ + MOVFF POSTINC0, FSR1H \ + \ + /* How many return addresses are there on the hardware stack? Discard \ + the first byte as we are pointing to the next free space. */ \ + MOVFF POSTDEC1, FSR0L \ + MOVFF POSTDEC1, FSR0L \ + _endasm \ + \ + /* Fill the hardware stack from our software stack. */ \ + STKPTR = 0; \ + \ + while( STKPTR < FSR0L ) \ + { \ + _asm \ + PUSH \ + MOVF POSTDEC1, 0, 0 \ + MOVWF TOSU, 0 \ + MOVF POSTDEC1, 0, 0 \ + MOVWF TOSH, 0 \ + MOVF POSTDEC1, 0, 0 \ + MOVWF TOSL, 0 \ + _endasm \ + } \ + \ + _asm \ + /* Restore the .tmpdata and MATH_DATA memory. */ \ + MOVFF POSTDEC1, FSR0H \ + MOVFF POSTDEC1, FSR0L \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, POSTDEC0 \ + MOVFF POSTDEC1, INDF0 \ + /* Restore the other registers forming the tasks context. */ \ + MOVFF POSTDEC1, PCLATH \ + MOVFF POSTDEC1, PCLATU \ + MOVFF POSTDEC1, PRODL \ + MOVFF POSTDEC1, PRODH \ + MOVFF POSTDEC1, TBLPTRL \ + MOVFF POSTDEC1, TBLPTRH \ + MOVFF POSTDEC1, TBLPTRU \ + MOVFF POSTDEC1, TABLAT \ + MOVFF POSTDEC1, FSR0H \ + MOVFF POSTDEC1, FSR0L \ + MOVFF POSTDEC1, FSR2H \ + MOVFF POSTDEC1, FSR2L \ + MOVFF POSTDEC1, BSR \ + /* The next byte is the INTCON register. Read this into WREG as some \ + manipulation is required. */ \ + MOVFF POSTDEC1, WREG \ + _endasm \ + \ + /* From the INTCON register, only the interrupt enable bits form part \ + of the tasks context. It is perfectly legitimate for another task to \ + have modified any other bits. We therefore only restore the top two bits. \ + */ \ + if( WREG & portGLOBAL_INTERRUPT_FLAG ) \ + { \ + _asm \ + MOVFF POSTDEC1, STATUS \ + MOVFF POSTDEC1, WREG \ + /* Return enabling interrupts. */ \ + RETFIE 0 \ + _endasm \ + } \ + else \ + { \ + _asm \ + MOVFF POSTDEC1, STATUS \ + MOVFF POSTDEC1, WREG \ + /* Return without effecting interrupts. The context may have \ + been saved from a critical region. */ \ + RETURN 0 \ + _endasm \ + } \ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t ulAddress; +uint8_t ucBlock; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x11; + pxTopOfStack++; + *pxTopOfStack = 0x22; + pxTopOfStack++; + *pxTopOfStack = 0x33; + pxTopOfStack++; + + + /* Simulate how the stack would look after a call to vPortYield() generated + by the compiler. + + First store the function parameters. This is where the task will expect to + find them when it starts running. */ + ulAddress = ( uint32_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + + ulAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + + /* Next we just leave a space. When a context is saved the stack pointer + is incremented before it is used so as not to corrupt whatever the stack + pointer is actually pointing to. This is especially necessary during + function epilogue code generated by the compiler. */ + *pxTopOfStack = 0x44; + pxTopOfStack++; + + /* Next are all the registers that form part of the task context. */ + + *pxTopOfStack = ( StackType_t ) 0x66; /* WREG. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0xcc; /* Status. */ + pxTopOfStack++; + + /* INTCON is saved with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITAL_INTERRUPT_STATE; /* INTCON */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x11; /* BSR. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x22; /* FSR2L. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x33; /* FSR2H. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x44; /* FSR0L. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x55; /* FSR0H. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x66; /* TABLAT. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x00; /* TBLPTRU. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x88; /* TBLPTRUH. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x99; /* TBLPTRUL. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0xaa; /* PRODH. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0xbb; /* PRODL. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x00; /* PCLATU. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x00; /* PCLATH. */ + pxTopOfStack++; + + /* Next the .tmpdata and MATH_DATA sections. */ + for( ucBlock = 0; ucBlock <= portCOMPILER_MANAGED_MEMORY_SIZE; ucBlock++ ) + { + *pxTopOfStack = ( StackType_t ) ucBlock; + *pxTopOfStack++; + } + + /* Store the top of the global data section. */ + *pxTopOfStack = ( StackType_t ) portCOMPILER_MANAGED_MEMORY_SIZE; /* Low. */ + pxTopOfStack++; + + *pxTopOfStack = ( StackType_t ) 0x00; /* High. */ + pxTopOfStack++; + + /* The only function return address so far is the address of the + task. */ + ulAddress = ( uint32_t ) pxCode; + + /* TOS low. */ + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + ulAddress >>= 8; + + /* TOS high. */ + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + ulAddress >>= 8; + + /* TOS even higher. */ + *pxTopOfStack = ( StackType_t ) ( ulAddress & ( uint32_t ) 0x00ff ); + pxTopOfStack++; + + /* Store the number of return addresses on the hardware stack - so far only + the address of the task entry point. */ + *pxTopOfStack = ( StackType_t ) 1; + pxTopOfStack++; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup a timer for the tick ISR is using the preemptive scheduler. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task to run. */ + portRESTORE_CONTEXT(); + + /* Should not get here. Use the function name to stop compiler warnings. */ + ( void ) prvLowInterrupt; + ( void ) prvTickISR; + + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the scheduler for the PIC port will get stopped + once running. If required disable the tick interrupt here, then return + to xPortStartScheduler(). */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. This is similar to the tick context switch, + * but does not increment the tick count. It must be identical to the + * tick context switch in how it stores the stack of a task. + */ +void vPortYield( void ) +{ + /* This can get called with interrupts either enabled or disabled. We + will save the INTCON register with the interrupt enable bits unmodified. */ + portSAVE_CONTEXT( portINTERRUPTS_UNCHANGED ); + + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Start executing the task we have just switched to. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Vector for ISR. Nothing here must alter any registers! + */ +#pragma code high_vector=0x08 +static void prvLowInterrupt( void ) +{ + /* Was the interrupt the tick? */ + if( PIR1bits.CCP1IF ) + { + _asm + goto prvTickISR + _endasm + } + + /* Was the interrupt a byte being received? */ + if( PIR1bits.RCIF ) + { + _asm + goto vSerialRxISR + _endasm + } + + /* Was the interrupt the Tx register becoming empty? */ + if( PIR1bits.TXIF ) + { + if( PIE1bits.TXIE ) + { + _asm + goto vSerialTxISR + _endasm + } + } +} +#pragma code + +/*-----------------------------------------------------------*/ + +/* + * ISR for the tick. + * This increments the tick count and, if using the preemptive scheduler, + * performs a context switch. This must be identical to the manual + * context switch in how it stores the context of a task. + */ +static void prvTickISR( void ) +{ + /* Interrupts must have been enabled for the ISR to fire, so we have to + save the context with interrupts enabled. */ + portSAVE_CONTEXT( portGLOBAL_INTERRUPT_FLAG ); + PIR1bits.CCP1IF = 0; + + /* Maintain the tick count. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + } + + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. + */ +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulConstCompareValue = ( ( configCPU_CLOCK_HZ / portTIMER_FOSC_SCALE ) / configTICK_RATE_HZ ); +uint32_t ulCompareValue; +uint8_t ucByte; + + /* Interrupts are disabled when this function is called. + + Setup CCP1 to provide the tick interrupt using a compare match on timer + 1. + + Clear the time count then setup timer. */ + TMR1H = ( uint8_t ) 0x00; + TMR1L = ( uint8_t ) 0x00; + + /* Set the compare match value. */ + ulCompareValue = ulConstCompareValue; + CCPR1L = ( uint8_t ) ( ulCompareValue & ( uint32_t ) 0xff ); + ulCompareValue >>= ( uint32_t ) 8; + CCPR1H = ( uint8_t ) ( ulCompareValue & ( uint32_t ) 0xff ); + + CCP1CONbits.CCP1M0 = portBIT_SET; /*< Compare match mode. */ + CCP1CONbits.CCP1M1 = portBIT_SET; /*< Compare match mode. */ + CCP1CONbits.CCP1M2 = portBIT_CLEAR; /*< Compare match mode. */ + CCP1CONbits.CCP1M3 = portBIT_SET; /*< Compare match mode. */ + PIE1bits.CCP1IE = portBIT_SET; /*< Interrupt enable. */ + + /* We are only going to use the global interrupt bit, so set the peripheral + bit to true. */ + INTCONbits.GIEL = portBIT_SET; + + /* Provided library function for setting up the timer that will produce the + tick. */ + OpenTimer1( T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_1 & T1_CCP1_T3_CCP2 ); +} + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/portmacro.h new file mode 100644 index 0000000..070b63d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/portmacro.h @@ -0,0 +1,113 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 1 +#define portGLOBAL_INT_ENABLE_BIT 0x80 +#define portSTACK_GROWTH 1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() INTCONbits.GIEH = 0; +#define portENABLE_INTERRUPTS() INTCONbits.GIEH = 1; + +/* Push the INTCON register onto the stack, then disable interrupts. */ +#define portENTER_CRITICAL() POSTINC1 = INTCON; \ + INTCONbits.GIEH = 0; + +/* Retrieve the INTCON register from the stack, and enable interrupts +if they were saved as being enabled. Don't modify any other bits +within the INTCON register as these may have lagitimately have been +modified within the critical region. */ +#define portEXIT_CRITICAL() _asm \ + MOVF POSTDEC1, 1, 0 \ + _endasm \ + if( INDF1 & portGLOBAL_INT_ENABLE_BIT ) \ + { \ + portENABLE_INTERRUPTS(); \ + } +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + + +#define portNOP() _asm \ + NOP \ + _endasm + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/stdio.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/stdio.h new file mode 100644 index 0000000..e69de29 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/port.c new file mode 100644 index 0000000..9b7c612 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/port.c @@ -0,0 +1,334 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + Changes from V4.2.1 + + + Introduced the configKERNEL_INTERRUPT_PRIORITY definition. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC24 port. + *----------------------------------------------------------*/ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware specifics. */ +#define portBIT_SET 1 +#define portTIMER_PRESCALE 8 +#define portINITIAL_SR 0 + +/* Defined for backward compatability with project created prior to +FreeRTOS.org V4.3.0. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 1 +#endif + +/* Use _T1Interrupt as the interrupt handler name if the application writer has +not provided their own. */ +#ifndef configTICK_INTERRUPT_HANDLER + #define configTICK_INTERRUPT_HANDLER _T1Interrupt +#endif /* configTICK_INTERRUPT_HANDLER */ + +/* The program counter is only 23 bits. */ +#define portUNUSED_PR_BITS 0x7f + +/* Records the nesting depth of calls to portENTER_CRITICAL(). */ +UBaseType_t uxCriticalNesting = 0xef; + +#if configKERNEL_INTERRUPT_PRIORITY != 1 + #error If configKERNEL_INTERRUPT_PRIORITY is not 1 then the #32 in the following macros needs changing to equal the portINTERRUPT_BITS value, which is ( configKERNEL_INTERRUPT_PRIORITY << 5 ) +#endif + +#if defined( __PIC24E__ ) || defined ( __PIC24F__ ) || defined( __PIC24FK__ ) || defined( __PIC24H__ ) + + #ifdef __HAS_EDS__ + #define portRESTORE_CONTEXT() \ + asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \ + "MOV [W0], W15 \n" \ + "POP W0 \n" /* Restore the critical nesting counter for the task. */ \ + "MOV W0, _uxCriticalNesting \n" \ + "POP DSWPAG \n" \ + "POP DSRPAG \n" \ + "POP CORCON \n" \ + "POP TBLPAG \n" \ + "POP RCOUNT \n" /* Restore the registers from the stack. */ \ + "POP W14 \n" \ + "POP.D W12 \n" \ + "POP.D W10 \n" \ + "POP.D W8 \n" \ + "POP.D W6 \n" \ + "POP.D W4 \n" \ + "POP.D W2 \n" \ + "POP.D W0 \n" \ + "POP SR " ); + #else /* __HAS_EDS__ */ + #define portRESTORE_CONTEXT() \ + asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \ + "MOV [W0], W15 \n" \ + "POP W0 \n" /* Restore the critical nesting counter for the task. */ \ + "MOV W0, _uxCriticalNesting \n" \ + "POP PSVPAG \n" \ + "POP CORCON \n" \ + "POP TBLPAG \n" \ + "POP RCOUNT \n" /* Restore the registers from the stack. */ \ + "POP W14 \n" \ + "POP.D W12 \n" \ + "POP.D W10 \n" \ + "POP.D W8 \n" \ + "POP.D W6 \n" \ + "POP.D W4 \n" \ + "POP.D W2 \n" \ + "POP.D W0 \n" \ + "POP SR " ); + #endif /* __HAS_EDS__ */ +#endif /* defined( __PIC24E__ ) || defined ( __PIC24F__ ) || defined( __PIC24FK__ ) || defined( __PIC24H__ ) */ + +#if defined( __dsPIC30F__ ) || defined( __dsPIC33F__ ) + + #define portRESTORE_CONTEXT() \ + asm volatile( "MOV _pxCurrentTCB, W0 \n" /* Restore the stack pointer for the task. */ \ + "MOV [W0], W15 \n" \ + "POP W0 \n" /* Restore the critical nesting counter for the task. */ \ + "MOV W0, _uxCriticalNesting \n" \ + "POP PSVPAG \n" \ + "POP CORCON \n" \ + "POP DOENDH \n" \ + "POP DOENDL \n" \ + "POP DOSTARTH \n" \ + "POP DOSTARTL \n" \ + "POP DCOUNT \n" \ + "POP ACCBU \n" \ + "POP ACCBH \n" \ + "POP ACCBL \n" \ + "POP ACCAU \n" \ + "POP ACCAH \n" \ + "POP ACCAL \n" \ + "POP TBLPAG \n" \ + "POP RCOUNT \n" /* Restore the registers from the stack. */ \ + "POP W14 \n" \ + "POP.D W12 \n" \ + "POP.D W10 \n" \ + "POP.D W8 \n" \ + "POP.D W6 \n" \ + "POP.D W4 \n" \ + "POP.D W2 \n" \ + "POP.D W0 \n" \ + "POP SR " ); + +#endif /* defined( __dsPIC30F__ ) || defined( __dsPIC33F__ ) */ + +#ifndef portRESTORE_CONTEXT + #error Unrecognised device selected + + /* Note: dsPIC parts with EDS are not supported as there is no easy way to + recover the hardware stacked copies for DOCOUNT, DOHIGH, DOLOW. */ +#endif + +/* + * Setup the timer used to generate the tick interrupt. + */ +void vApplicationSetupTickTimerInterrupt( void ); + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t usCode; +UBaseType_t i; + +const StackType_t xInitialStack[] = +{ + 0x1111, /* W1 */ + 0x2222, /* W2 */ + 0x3333, /* W3 */ + 0x4444, /* W4 */ + 0x5555, /* W5 */ + 0x6666, /* W6 */ + 0x7777, /* W7 */ + 0x8888, /* W8 */ + 0x9999, /* W9 */ + 0xaaaa, /* W10 */ + 0xbbbb, /* W11 */ + 0xcccc, /* W12 */ + 0xdddd, /* W13 */ + 0xeeee, /* W14 */ + 0xcdce, /* RCOUNT */ + 0xabac, /* TBLPAG */ + + /* dsPIC specific registers. */ + #if defined( __dsPIC30F__ ) || defined( __dsPIC33F__ ) + 0x0202, /* ACCAL */ + 0x0303, /* ACCAH */ + 0x0404, /* ACCAU */ + 0x0505, /* ACCBL */ + 0x0606, /* ACCBH */ + 0x0707, /* ACCBU */ + 0x0808, /* DCOUNT */ + 0x090a, /* DOSTARTL */ + 0x1010, /* DOSTARTH */ + 0x1110, /* DOENDL */ + 0x1212, /* DOENDH */ + #endif +}; + + /* Setup the stack as if a yield had occurred. + + Save the low bytes of the program counter. */ + usCode = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) usCode; + pxTopOfStack++; + + /* Save the high byte of the program counter. This will always be zero + here as it is passed in a 16bit pointer. If the address is greater than + 16 bits then the pointer will point to a jump table. */ + *pxTopOfStack = ( StackType_t ) 0; + pxTopOfStack++; + + /* Status register with interrupts enabled. */ + *pxTopOfStack = portINITIAL_SR; + pxTopOfStack++; + + /* Parameters are passed in W0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack++; + + for( i = 0; i < ( sizeof( xInitialStack ) / sizeof( StackType_t ) ); i++ ) + { + *pxTopOfStack = xInitialStack[ i ]; + pxTopOfStack++; + } + + *pxTopOfStack = CORCON; + pxTopOfStack++; + + #if defined(__HAS_EDS__) + *pxTopOfStack = DSRPAG; + pxTopOfStack++; + *pxTopOfStack = DSWPAG; + pxTopOfStack++; + #else /* __HAS_EDS__ */ + *pxTopOfStack = PSVPAG; + pxTopOfStack++; + #endif /* __HAS_EDS__ */ + + /* Finally the critical nesting depth. */ + *pxTopOfStack = 0x00; + pxTopOfStack++; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup a timer for the tick ISR. */ + vApplicationSetupTickTimerInterrupt(); + + /* Restore the context of the first task to run. */ + portRESTORE_CONTEXT(); + + /* Simulate the end of the yield function. */ + asm volatile ( "return" ); + + /* Should not reach here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. + */ +__attribute__(( weak )) void vApplicationSetupTickTimerInterrupt( void ) +{ +const uint32_t ulCompareMatch = ( ( configCPU_CLOCK_HZ / portTIMER_PRESCALE ) / configTICK_RATE_HZ ) - 1; + + /* Prescale of 8. */ + T1CON = 0; + TMR1 = 0; + + PR1 = ( uint16_t ) ulCompareMatch; + + /* Setup timer 1 interrupt priority. */ + IPC0bits.T1IP = configKERNEL_INTERRUPT_PRIORITY; + + /* Clear the interrupt as a starting condition. */ + IFS0bits.T1IF = 0; + + /* Enable the interrupt. */ + IEC0bits.T1IE = 1; + + /* Setup the prescale value. */ + T1CONbits.TCKPS0 = 1; + T1CONbits.TCKPS1 = 0; + + /* Start the timer. */ + T1CONbits.TON = 1; +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void __attribute__((__interrupt__, auto_psv)) configTICK_INTERRUPT_HANDLER( void ) +{ + /* Clear the timer interrupt. */ + IFS0bits.T1IF = 0; + + if( xTaskIncrementTick() != pdFALSE ) + { + portYIELD(); + } +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S new file mode 100644 index 0000000..c33086d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S @@ -0,0 +1,93 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#if defined( __PIC24E__ ) || defined ( __PIC24F__ ) || defined( __PIC24FK__ ) || defined( __PIC24H__ ) + + .global _vPortYield + .extern _vTaskSwitchContext + .extern uxCriticalNesting + +_vPortYield: + + PUSH SR /* Save the SR used by the task.... */ + PUSH W0 /* ....then disable interrupts. */ + MOV #32, W0 + MOV W0, SR + PUSH W1 /* Save registers to the stack. */ + PUSH.D W2 + PUSH.D W4 + PUSH.D W6 + PUSH.D W8 + PUSH.D W10 + PUSH.D W12 + PUSH W14 + PUSH RCOUNT + PUSH TBLPAG + + PUSH CORCON + #ifdef __HAS_EDS__ + PUSH DSRPAG + PUSH DSWPAG + #else + PUSH PSVPAG + #endif /* __HAS_EDS__ */ + MOV _uxCriticalNesting, W0 /* Save the critical nesting counter for the task. */ + PUSH W0 + MOV _pxCurrentTCB, W0 /* Save the new top of stack into the TCB. */ + MOV W15, [W0] + + call _vTaskSwitchContext + + MOV _pxCurrentTCB, W0 /* Restore the stack pointer for the task. */ + MOV [W0], W15 + POP W0 /* Restore the critical nesting counter for the task. */ + MOV W0, _uxCriticalNesting + #ifdef __HAS_EDS__ + POP DSWPAG + POP DSRPAG + #else + POP PSVPAG + #endif /* __HAS_EDS__ */ + POP CORCON + POP TBLPAG + POP RCOUNT /* Restore the registers from the stack. */ + POP W14 + POP.D W12 + POP.D W10 + POP.D W8 + POP.D W6 + POP.D W4 + POP.D W2 + POP.D W0 + POP SR + + return + + .end + +#endif /* defined( __PIC24E__ ) || defined ( __PIC24F__ ) || defined( __PIC24FK__ ) || defined( __PIC24H__ ) */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S new file mode 100644 index 0000000..ba0ebb1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S @@ -0,0 +1,107 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#if defined( __dsPIC30F__ ) || defined( __dsPIC33F__ ) + + .global _vPortYield + .extern _vTaskSwitchContext + .extern uxCriticalNesting + +_vPortYield: + + PUSH SR /* Save the SR used by the task.... */ + PUSH W0 /* ....then disable interrupts. */ + MOV #32, W0 + MOV W0, SR + PUSH W1 /* Save registers to the stack. */ + PUSH.D W2 + PUSH.D W4 + PUSH.D W6 + PUSH.D W8 + PUSH.D W10 + PUSH.D W12 + PUSH W14 + PUSH RCOUNT + PUSH TBLPAG + PUSH ACCAL + PUSH ACCAH + PUSH ACCAU + PUSH ACCBL + PUSH ACCBH + PUSH ACCBU + PUSH DCOUNT + PUSH DOSTARTL + PUSH DOSTARTH + PUSH DOENDL + PUSH DOENDH + + + PUSH CORCON + PUSH PSVPAG + MOV _uxCriticalNesting, W0 /* Save the critical nesting counter for the task. */ + PUSH W0 + MOV _pxCurrentTCB, W0 /* Save the new top of stack into the TCB. */ + MOV W15, [W0] + + call _vTaskSwitchContext + + MOV _pxCurrentTCB, W0 /* Restore the stack pointer for the task. */ + MOV [W0], W15 + POP W0 /* Restore the critical nesting counter for the task. */ + MOV W0, _uxCriticalNesting + POP PSVPAG + POP CORCON + POP DOENDH + POP DOENDL + POP DOSTARTH + POP DOSTARTL + POP DCOUNT + POP ACCBU + POP ACCBH + POP ACCBL + POP ACCAU + POP ACCAH + POP ACCAL + POP TBLPAG + POP RCOUNT /* Restore the registers from the stack. */ + POP W14 + POP.D W12 + POP.D W10 + POP.D W8 + POP.D W6 + POP.D W4 + POP.D W2 + POP.D W0 + POP SR + + return + + .end + +#endif /* defined( __dsPIC30F__ ) || defined( __dsPIC33F__ ) */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portmacro.h new file mode 100644 index 0000000..ed2a2f0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portmacro.h @@ -0,0 +1,112 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +/* 16-bit tick type on a 16-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH 1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() SET_CPU_IPL( configKERNEL_INTERRUPT_PRIORITY ); __asm volatile ( "NOP" ) +#define portENABLE_INTERRUPTS() SET_CPU_IPL( 0 ) + +/* Note that exiting a critical sectino will set the IPL bits to 0, nomatter +what their value was prior to entering the critical section. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortYield( void ); +#define portYIELD() asm volatile ( "CALL _vPortYield \n" \ + "NOP " ); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + +#define portNOP() asm volatile ( "NOP" ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/ISR_Support.h new file mode 100644 index 0000000..22503d2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/ISR_Support.h @@ -0,0 +1,215 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOSConfig.h" + +#define portCONTEXT_SIZE 132 +#define portEPC_STACK_LOCATION 124 +#define portSTATUS_STACK_LOCATION 128 + +#ifdef __LANGUAGE_ASSEMBLY__ + +/******************************************************************/ +.macro portSAVE_CONTEXT + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so their original values are + captured. */ + mfc0 k0, _CP0_CAUSE + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to enable interrupts above the current priority. + k0 = k0 >> 10. Moves RIPL[17:10] to [7:0] */ + srl k0, k0, 0xa + + /* Insert bit field. 7 bits k0[6:0] to k1[16:10] */ + ins k1, k0, 10, 7 + + /* Sets CP0.Status.IPL = CP0.Cause.RIPL + Copy the MSB of the IPL, but it would be an error if it was set anyway. */ + srl k0, k0, 0x7 + + /* MSB of IPL is bit[18] of CP0.Status */ + ins k1, k0, 18, 1 + + /* CP0.Status[5:1] = 0 b[5]=Rsvd, b[4]=UM, + b[3]=Rsvd, b[2]=ERL, b[1]=EXL + Setting EXL=0 allows higher priority interrupts + to preempt this handler */ + ins k1, zero, 1, 4 + + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Check the nesting count value. */ + la k0, uxInterruptNesting + lw s6, (k0) + + /* If the nesting count is 0 then swap to the the system stack, otherwise + the system stack is already being used. */ + bne s6, zero, 1f + nop + + /* Swap to the system stack. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Increment and save the nesting count. */ +1: addiu s6, s6, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved after interrupts are re-enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. No other s registers need be + saved. */ + sw ra, 120(s5) /* Return address (RA=R31) */ + sw s8, 116(s5) /* Frame Pointer (FP=R30) */ + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s6, portEPC_STACK_LOCATION(s5) + sw $1, 16(s5) + + /* MEC14xx does not have DSP, removed 7 words */ + mfhi s6 + sw s6, 12(s5) + mflo s6 + sw s6, 8(s5) + + /* Update the task stack pointer value if nesting is zero. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + + /* Save the stack pointer. */ + la s6, uxSavedTaskStackPointer + sw s5, (s6) +1: + .endm + +/******************************************************************/ +.macro portRESTORE_CONTEXT + + /* Restore the stack pointer from the TCB. This is only done if the + nesting count is 1. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + la s6, uxSavedTaskStackPointer + lw s5, (s6) + + /* Restore the context. + MCHP MEC14xx does not include DSP */ +1: + lw s6, 8(s5) + mtlo s6 + lw s6, 12(s5) + mthi s6 + lw $1, 16(s5) + + /* s6 is loaded as it was used as a scratch register and therefore saved + as part of the interrupt context. */ + lw s6, 44(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Decrement the nesting count. */ + la k0, uxInterruptNesting + lw k1, (k0) + addiu k1, k1, -1 + sw k1, 0(k0) + + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + addiu sp, sp, portCONTEXT_SIZE + + mtc0 k0, _CP0_STATUS + mtc0 k1, _CP0_EPC + ehb + eret + nop + + .endm + +#endif /* #ifdef __LANGUAGE_ASSEMBLY__ */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port.c new file mode 100644 index 0000000..bf2dab6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port.c @@ -0,0 +1,346 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC32MEC14xx port. + *----------------------------------------------------------*/ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Microchip includes. */ +#include +#include + +#if !defined(__MEC__) + #error This port is designed to work with XC32 on MEC14xx. Please update your C compiler version or settings. +#endif + +#if( ( configMAX_SYSCALL_INTERRUPT_PRIORITY >= 0x7 ) || ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must be less than 7 and greater than 0 +#endif + +/* Bits within various registers. */ +#define portIE_BIT ( 0x00000001 ) +#define portEXL_BIT ( 0x00000002 ) + +/* The EXL bit is set to ensure interrupts do not occur while the context of +the first task is being restored. MEC14xx does not have DSP HW. */ +#define portINITIAL_SR ( portIE_BIT | portEXL_BIT ) + +/* MEC14xx RTOS Timer MMCR's. */ +#define portMMCR_RTMR_PRELOAD *((volatile uint32_t *)(0xA0007404ul)) +#define portMMCR_RTMR_CONTROL *((volatile uint32_t *)(0xA0007408ul)) + +/* MEC14xx JTVIC external interrupt controller is mapped to M14K closely-coupled +peripheral space. */ +#define portGIRQ23_RTOS_TIMER_BITPOS ( 4 ) +#define portGIRQ23_RTOS_TIMER_MASK ( 1ul << ( portGIRQ23_RTOS_TIMER_BITPOS ) ) +#define portMMCR_JTVIC_GIRQ23_SRC *((volatile uint32_t *)(0xBFFFC0F0ul)) +#define portMMCR_JTVIC_GIRQ23_SETEN *((volatile uint32_t *)(0xBFFFC0F4ul)) +#define portMMCR_JTVIC_GIRQ23_PRIA *((volatile uint32_t *)(0xBFFFC3F0ul)) + +/* MIPS Software Interrupts are routed through JTVIC GIRQ24 */ +#define portGIRQ24_M14K_SOFTIRQ0_BITPOS ( 1 ) +#define portGIRQ24_M14K_SOFTIRQ0_MASK ( 1ul << ( portGIRQ24_M14K_SOFTIRQ0_BITPOS ) ) +#define portMMCR_JTVIC_GIRQ24_SRC *((volatile uint32_t *)(0xBFFFC100ul)) +#define portMMCR_JTVIC_GIRQ24_SETEN *((volatile uint32_t *)(0xBFFFC104ul)) +#define portMMCR_JTVIC_GIRQ24_PRIA *((volatile uint32_t *)(0xBFFFC400ul)) + +/* +By default port.c generates its tick interrupt from the RTOS timer. The user +can override this behaviour by: + 1: Providing their own implementation of vApplicationSetupTickTimerInterrupt(), + which is the function that configures the timer. The function is defined + as a weak symbol in this file so if the same function name is used in the + application code then the version in the application code will be linked + into the application in preference to the version defined in this file. + 2: Provide a vector implementation in port_asm.S that overrides the default + behaviour for the specified interrupt vector. + 3: Specify the correct bit to clear the interrupt during the timer interrupt + handler. +*/ +#ifndef configTICK_INTERRUPT_VECTOR + #define configTICK_INTERRUPT_VECTOR girq23_b4 + #define configCLEAR_TICK_TIMER_INTERRUPT() portMMCR_JTVIC_GIRQ23_SRC = portGIRQ23_RTOS_TIMER_MASK +#else + #ifndef configCLEAR_TICK_TIMER_INTERRUPT + #error If configTICK_INTERRUPT_VECTOR is defined in application code then configCLEAR_TICK_TIMER_INTERRUPT must also be defined in application code. + #endif +#endif + +/* Let the user override the pre-loading of the initial RA with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the debugger - +in which case configTASK_RETURN_ADDRESS can be defined as 0 (NULL). */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task +stack checking. A problem in the ISR stack will trigger an assert, not call the +stack overflow hook function (because the stack overflow hook is specific to a +task stack, not the ISR stack). */ +#if( configCHECK_FOR_STACK_OVERFLOW > 2 ) + + /* Don't use 0xa5 as the stack fill bytes as that is used by the kernel for + the task stacks, and so will legitimately appear in many positions within + the ISR stack. */ + #define portISR_STACK_FILL_BYTE 0xee + + static const uint8_t ucExpectedStackBytes[] = { + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE }; \ + + #define portCHECK_ISR_STACK() configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) ) +#else + /* Define the function away. */ + #define portCHECK_ISR_STACK() +#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + + +/*-----------------------------------------------------------*/ + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Records the interrupt nesting depth. This is initialised to one as it is +decremented to 0 when the first task starts. */ +volatile UBaseType_t uxInterruptNesting = 0x01; + +/* Stores the task stack pointer when a switch is made to use the system stack. */ +UBaseType_t uxSavedTaskStackPointer = 0; + +/* The stack used by interrupt service routines that cause a context switch. */ +StackType_t xISRStack[ configISR_STACK_SIZE ] = { 0 }; + +/* The top of stack value ensures there is enough space to store 6 registers on +the callers stack, as some functions seem to want to do this. */ +const StackType_t * const xISRStackTop = &( xISRStack[ configISR_STACK_SIZE - 7 ] ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Ensure byte alignment is maintained when leaving this function. */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0x12345678; /* Word to which the stack pointer will be left pointing after context restore. */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) ulPortGetCP0Cause(); + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portINITIAL_SR; /* CP0_STATUS */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) pxCode; /* CP0_EPC */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portTASK_RETURN_ADDRESS; /* ra */ + pxTopOfStack -= 15; + + *pxTopOfStack = (StackType_t) pvParameters; /* Parameters to pass in. */ + pxTopOfStack -= 15; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static __inline uint32_t prvDisableInterrupt( void ) +{ +uint32_t prev_state; + + __asm volatile( "di %0; ehb" : "=r" ( prev_state ) :: "memory" ); + return prev_state; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxSavedTaskStackPointer == 0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. This function uses the RTOS timer. + * The function is declared weak so an application writer can use a different + * timer by redefining this implementation. If a different timer is used then + * configTICK_INTERRUPT_VECTOR must also be defined in FreeRTOSConfig.h to + * ensure the RTOS provided tick interrupt handler is installed on the correct + * vector number. + */ +__attribute__(( weak )) void vApplicationSetupTickTimerInterrupt( void ) +{ +/* MEC14xx RTOS Timer whose input clock is 32KHz. */ +const uint32_t ulPreload = ( 32768ul / ( configTICK_RATE_HZ ) ); + + configASSERT( ulPreload != 0UL ); + + /* Configure the RTOS timer. */ + portMMCR_RTMR_CONTROL = 0ul; + portMMCR_RTMR_PRELOAD = ulPreload; + + /* Configure interrupts from the RTOS timer. */ + portMMCR_JTVIC_GIRQ23_SRC = ( portGIRQ23_RTOS_TIMER_MASK ); + portMMCR_JTVIC_GIRQ23_PRIA &= ~( 0x0Ful << 16 ); + portMMCR_JTVIC_GIRQ23_PRIA |= ( ( portIPL_TO_CODE( configKERNEL_INTERRUPT_PRIORITY ) ) << 16 ); + portMMCR_JTVIC_GIRQ23_SETEN = ( portGIRQ23_RTOS_TIMER_MASK ); + + /* Enable the RTOS timer. */ + portMMCR_RTMR_CONTROL = 0x0Fu; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler(void) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxInterruptNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); +extern void *pxCurrentTCB; + + #if ( configCHECK_FOR_STACK_OVERFLOW > 2 ) + { + /* Fill the ISR stack to make it easy to asses how much is being used. */ + memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) ); + } + #endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + + /* Clear the software interrupt flag. */ + portMMCR_JTVIC_GIRQ24_SRC = (portGIRQ24_M14K_SOFTIRQ0_MASK); + + /* Set software timer priority. Each GIRQn has one nibble containing its + priority */ + portMMCR_JTVIC_GIRQ24_PRIA &= ~(0xF0ul); + portMMCR_JTVIC_GIRQ24_PRIA |= ( portIPL_TO_CODE( configKERNEL_INTERRUPT_PRIORITY ) << 4 ); + + /* Enable software interrupt. */ + portMMCR_JTVIC_GIRQ24_SETEN = ( portGIRQ24_M14K_SOFTIRQ0_MASK ); + + /* Setup the timer to generate the tick. Interrupts will have been disabled + by the time we get here. */ + vApplicationSetupTickTimerInterrupt(); + + /* Start the highest priority task that has been created so far. Its stack + location is loaded into uxSavedTaskStackPointer. */ + uxSavedTaskStackPointer = *( UBaseType_t * ) pxCurrentTCB; + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortIncrementTick( void ) +{ +UBaseType_t uxSavedStatus; +uint32_t ulCause; + + uxSavedStatus = uxPortSetInterruptMaskFromISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + ulCause = ulPortGetCP0Cause(); + ulCause |= ( 1ul << 8UL ); + vPortSetCP0Cause( ulCause ); + } + } + vPortClearInterruptMaskFromISR( uxSavedStatus ); + + /* Look for the ISR stack getting near or past its limit. */ + portCHECK_ISR_STACK(); + + /* Clear timer interrupt. */ + configCLEAR_TICK_TIMER_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxPortSetInterruptMaskFromISR( void ) +{ +UBaseType_t uxSavedStatusRegister; + + prvDisableInterrupt(); + uxSavedStatusRegister = ulPortGetCP0Status() | 0x01; + + /* This clears the IPL bits, then sets them to + configMAX_SYSCALL_INTERRUPT_PRIORITY. This function should not be called + from an interrupt that has a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY so, when used correctly, the action + can only result in the IPL being unchanged or raised, and therefore never + lowered. */ + vPortSetCP0Status( ( ( uxSavedStatusRegister & ( ~portALL_IPL_BITS ) ) ) | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ); + + return uxSavedStatusRegister; +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMaskFromISR( UBaseType_t uxSavedStatusRegister ) +{ + vPortSetCP0Status( uxSavedStatusRegister ); +} +/*-----------------------------------------------------------*/ + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port_asm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port_asm.S new file mode 100644 index 0000000..20bd418 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port_asm.S @@ -0,0 +1,349 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* FreeRTOS includes. */ +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + +/* Microchip includes. */ +#include +#include + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vPortIncrementTick + .extern xISRStackTop + + PORT_CPP_JTVIC_BASE = 0xBFFFC000 + PORT_CCP_JTVIC_GIRQ24_SRC = 0xBFFFC100 + + .global vPortStartFirstTask .text + .global vPortYieldISR .text + .global vPortTickInterruptHandler .text + + +/******************************************************************/ + + +/*************************************************************** +* The following is needed to locate the +* vPortTickInterruptHandler function into the correct vector +* MEC14xx - This ISR will only be used if HW timers' interrupts +* in GIRQ23 are disaggregated. +* +***************************************************************/ + + .set noreorder + .set noat + .set micromips + + .section .text, code + .ent vPortTickInterruptHandler + +#if configTIMERS_DISAGGREGATED_ISRS == 0 + + .globl girq23_isr + +girq23_isr: +vPortTickInterruptHandler: + + portSAVE_CONTEXT + + jal girq23_handler + nop + + portRESTORE_CONTEXT + +.end vPortTickInterruptHandler + +#else + + .globl girq23_b4 + +girq23_b4: +vPortTickInterruptHandler: + + portSAVE_CONTEXT + + jal vPortIncrementTick + nop + + portRESTORE_CONTEXT + +.end vPortTickInterruptHandler + +#endif /* #if configTIMERS_DISAGGREGATED_ISRS == 0 */ + +/******************************************************************/ + + .set micromips + .set noreorder + .set noat + + .section .text, code + .ent vPortStartFirstTask + +vPortStartFirstTask: + + /* Simply restore the context of the highest priority task that has + been created so far. */ + portRESTORE_CONTEXT + +.end vPortStartFirstTask + + + +/*******************************************************************/ + +/*************************************************************** +* The following is needed to locate the vPortYieldISR function into the correct +* vector. +***************************************************************/ + + .set micromips + .set noreorder + .set noat + + .section .text, code + + .global vPortYieldISR + + +#if configCPU_DISAGGREGATED_ISRS == 0 + .global girq24_isr + .ent girq24_isr +girq24_isr: + la k0, PORT_CPP_JTVIC_BASE + lw k0, 0x10C(k0) + andi k1, k0, 0x2 + bgtz k1, vPortYieldISR + nop + + portSAVE_CONTEXT + + jal girq24_b_0_2 + + portRESTORE_CONTEXT + + .end girq24_isr + +#else + .global girq24_b1 +girq24_b1: +#endif + .ent vPortYieldISR +vPortYieldISR: + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so thier original values + are captured. */ + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to re-enable interrupts above the kernel priority. */ + ins k1, zero, 10, 7 /* Clear IPL bits 0:6. */ + ins k1, zero, 18, 1 /* Clear IPL bit 7 */ + ori k1, k1, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) + ins k1, zero, 1, 4 /* Clear EXL, ERL and UM. */ + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Swap to the system stack. This is not conditional on the nesting + count as this interrupt is always the lowest priority and therefore + the nesting is always 0. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Set the nesting count. */ + la k0, uxInterruptNesting + addiu s6, zero, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved with the rest of the context + after interrupts are enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts above configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s7, 48(s5) + sw s6, portEPC_STACK_LOCATION(s5) + /* s5 and s6 has already been saved. */ + sw s4, 36(s5) + sw s3, 32(s5) + sw s2, 28(s5) + sw s1, 24(s5) + sw s0, 20(s5) + sw $1, 16(s5) + + /* s7 is used as a scratch register as this should always be saved acro ss + nesting interrupts. */ + mfhi s7 + sw s7, 12(s5) + mflo s7 + sw s7, 8(s5) + + /* Save the stack pointer to the task. */ + la s7, pxCurrentTCB + lw s7, (s7) + sw s5, (s7) + + /* Set the interrupt mask to the max priority that can use the API. + The yield handler will only be called at configKERNEL_INTERRUPT_PRIORITY + which is below configMAX_SYSCALL_INTERRUPT_PRIORITY - so this can only + ever raise the IPL value and never lower it. */ + di + ehb + mfc0 s7, _CP0_STATUS + ins s7, zero, 10, 7 + ins s7, zero, 18, 1 + ori s6, s7, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) | 1 + + /* This mtc0 re-enables interrupts, but only above + configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 s6, _CP0_STATUS + ehb + + /* Clear the software interrupt in the core. */ + mfc0 s6, _CP0_CAUSE + ins s6, zero, 8, 1 + mtc0 s6, _CP0_CAUSE + ehb + + /* Clear the interrupt in the interrupt controller. + MEC14xx GIRQ24 Source bit[1] = 1 to clear */ + la s6, PORT_CCP_JTVIC_GIRQ24_SRC + addiu s4, zero, 2 + sw s4, (s6) + jal vTaskSwitchContext + nop + + /* Clear the interrupt mask again. The saved status value is still in s7 */ + mtc0 s7, _CP0_STATUS + ehb + + /* Restore the stack pointer from the TCB. */ + la s0, pxCurrentTCB + lw s0, (s0) + lw s5, (s0) + + /* Restore the rest of the context. */ + lw s0, 8(s5) + mtlo s0 + lw s0, 12(s5) + mthi s0 + + lw $1, 16(s5) + lw s0, 20(s5) + lw s1, 24(s5) + lw s2, 28(s5) + lw s3, 32(s5) + lw s4, 36(s5) + + /* s5 is loaded later. */ + lw s6, 44(s5) + lw s7, 48(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Set nesting back to zero. As the lowest priority interrupt this + interrupt cannot have nested. */ + la k0, uxInterruptNesting + sw zero, 0(k0) + + /* Switch back to use the real stack pointer. */ + add sp, zero, s5 + + /* Restore the real s5 value. */ + lw s5, 40(sp) + + /* Pop the status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + + /* Remove stack frame. */ + addiu sp, sp, portCONTEXT_SIZE + + mtc0 k1, _CP0_STATUS + mtc0 k0, _CP0_EPC + ehb + eret + nop + +.end vPortYieldISR + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/portmacro.h new file mode 100644 index 0000000..fcb1920 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/portmacro.h @@ -0,0 +1,250 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portIPL_SHIFT ( 10UL ) +/* Don't straddle the CEE bit. Interrupts calling FreeRTOS functions should +never have higher IPL bits set anyway. */ +#define portALL_IPL_BITS ( 0x7FUL << portIPL_SHIFT ) +#define portSW0_BIT ( 0x01 << 8 ) + +/* Interrupt priority conversion */ +#define portIPL_TO_CODE( iplNumber ) ( ( iplNumber >> 1 ) & 0x03ul ) +#define portCODE_TO_IPL( iplCode ) ( ( iplCode << 1 ) | 0x01ul ) + +/*-----------------------------------------------------------*/ + +static inline uint32_t ulPortGetCP0Status( void ) +{ +uint32_t rv; + + __asm volatile( + "\n\t" + "mfc0 %0,$12,0 \n\t" + : "=r" ( rv ) :: ); + + return rv; +} +/*-----------------------------------------------------------*/ + +static inline void vPortSetCP0Status( uint32_t new_status) +{ + ( void ) new_status; + + __asm__ __volatile__( + "\n\t" + "mtc0 %0,$12,0 \n\t" + "ehb \n\t" + : + :"r" ( new_status ) : ); +} +/*-----------------------------------------------------------*/ + +static inline uint32_t ulPortGetCP0Cause( void ) +{ +uint32_t rv; + + __asm volatile( + "\n\t" + "mfc0 %0,$13,0 \n\t" + : "=r" ( rv ) :: ); + + return rv; +} +/*-----------------------------------------------------------*/ + +static inline void vPortSetCP0Cause( uint32_t new_cause ) +{ + ( void ) new_cause; + + __asm__ __volatile__( + "\n\t" + "mtc0 %0,$13,0 \n\t" + "ehb \n\t" + : + :"r" ( new_cause ) : ); +} +/*-----------------------------------------------------------*/ + +/* This clears the IPL bits, then sets them to +configMAX_SYSCALL_INTERRUPT_PRIORITY. An extra check is performed if +configASSERT() is defined to ensure an assertion handler does not inadvertently +attempt to lower the IPL when the call to assert was triggered because the IPL +value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY when an ISR +safe FreeRTOS API function was executed. ISR safe FreeRTOS API functions are +those that end in FromISR. FreeRTOS maintains a separate interrupt API to +ensure API function and interrupt entry is as fast and as simple as possible. */ +#ifdef configASSERT + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = ulPortGetCP0Status(); \ + /* Is the current IPL below configMAX_SYSCALL_INTERRUPT_PRIORITY? */ \ + if( ( ( ulStatus & portALL_IPL_BITS ) >> portIPL_SHIFT ) < configMAX_SYSCALL_INTERRUPT_PRIORITY ) \ + { \ + ulStatus &= ~portALL_IPL_BITS; \ + vPortSetCP0Status( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } \ + } +#else /* configASSERT */ + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = ulPortGetCP0Status(); \ + ulStatus &= ~portALL_IPL_BITS; \ + vPortSetCP0Status( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } +#endif /* configASSERT */ + +#define portENABLE_INTERRUPTS() \ +{ \ +uint32_t ulStatus; \ + /* Unmask all interrupts. */ \ + ulStatus = ulPortGetCP0Status(); \ + ulStatus &= ~portALL_IPL_BITS; \ + vPortSetCP0Status( ulStatus ); \ +} + + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portCRITICAL_NESTING_IN_TCB 1 +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR(); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) vPortClearInterruptMaskFromISR( uxSavedStatusRegister ) + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - _clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portYIELD() \ +{ \ +uint32_t ulCause; \ + /* Trigger software interrupt. */ \ + ulCause = ulPortGetCP0Cause(); \ + ulCause |= portSW0_BIT; \ + vPortSetCP0Cause( ulCause ); \ +} + +extern volatile UBaseType_t uxInterruptNesting; +#define portASSERT_IF_IN_ISR() configASSERT( uxInterruptNesting == 0 ) + +#define portNOP() __asm volatile ( "nop" ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) { portYIELD(); } } while( 0 ) + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/ISR_Support.h new file mode 100644 index 0000000..924171b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/ISR_Support.h @@ -0,0 +1,192 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOSConfig.h" + +#define portCONTEXT_SIZE 132 +#define portEPC_STACK_LOCATION 124 +#define portSTATUS_STACK_LOCATION 128 + +/******************************************************************/ +.macro portSAVE_CONTEXT + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so their original values are + captured. */ + mfc0 k0, _CP0_CAUSE + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to enable interrupts above the current priority. */ + srl k0, k0, 0xa + ins k1, k0, 10, 6 + ins k1, zero, 1, 4 + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Check the nesting count value. */ + la k0, uxInterruptNesting + lw s6, (k0) + + /* If the nesting count is 0 then swap to the the system stack, otherwise + the system stack is already being used. */ + bne s6, zero, 1f + nop + + /* Swap to the system stack. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Increment and save the nesting count. */ +1: addiu s6, s6, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved after interrupts are re-enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. No other s registers need be + saved. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s6, portEPC_STACK_LOCATION(s5) + sw $1, 16(s5) + + /* s6 is used as a scratch register. */ + mfhi s6 + sw s6, 12(s5) + mflo s6 + sw s6, 8(s5) + + /* Update the task stack pointer value if nesting is zero. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + + /* Save the stack pointer. */ + la s6, uxSavedTaskStackPointer + sw s5, (s6) +1: + .endm + +/******************************************************************/ +.macro portRESTORE_CONTEXT + + /* Restore the stack pointer from the TCB. This is only done if the + nesting count is 1. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + la s6, uxSavedTaskStackPointer + lw s5, (s6) + + /* Restore the context. */ +1: lw s6, 8(s5) + mtlo s6 + lw s6, 12(s5) + mthi s6 + lw $1, 16(s5) + /* s6 is loaded as it was used as a scratch register and therefore saved + as part of the interrupt context. */ + lw s6, 44(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Decrement the nesting count. */ + la k0, uxInterruptNesting + lw k1, (k0) + addiu k1, k1, -1 + sw k1, 0(k0) + + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + addiu sp, sp, portCONTEXT_SIZE + + mtc0 k0, _CP0_STATUS + mtc0 k1, _CP0_EPC + ehb + eret + nop + + .endm + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port.c new file mode 100644 index 0000000..a2fa818 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port.c @@ -0,0 +1,335 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC32MX port. + *----------------------------------------------------------*/ + +#ifndef __XC + #error This port is designed to work with XC32. Please update your C compiler version. +#endif + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Hardware specifics. */ +#define portTIMER_PRESCALE 8 +#define portPRESCALE_BITS 1 + +/* Bits within various registers. */ +#define portIE_BIT ( 0x00000001 ) +#define portEXL_BIT ( 0x00000002 ) + +/* Bits within the CAUSE register. */ +#define portCORE_SW_0 ( 0x00000100 ) +#define portCORE_SW_1 ( 0x00000200 ) + +/* The EXL bit is set to ensure interrupts do not occur while the context of +the first task is being restored. */ +#define portINITIAL_SR ( portIE_BIT | portEXL_BIT ) + +/* +By default port.c generates its tick interrupt from TIMER1. The user can +override this behaviour by: + 1: Providing their own implementation of vApplicationSetupTickTimerInterrupt(), + which is the function that configures the timer. The function is defined + as a weak symbol in this file so if the same function name is used in the + application code then the version in the application code will be linked + into the application in preference to the version defined in this file. + 2: Define configTICK_INTERRUPT_VECTOR to the vector number of the timer used + to generate the tick interrupt. For example, when timer 1 is used then + configTICK_INTERRUPT_VECTOR is set to _TIMER_1_VECTOR. + configTICK_INTERRUPT_VECTOR should be defined in FreeRTOSConfig.h. + 3: Define configCLEAR_TICK_TIMER_INTERRUPT() to clear the interrupt in the + timer used to generate the tick interrupt. For example, when timer 1 is + used configCLEAR_TICK_TIMER_INTERRUPT() is defined to + IFS0CLR = _IFS0_T1IF_MASK. +*/ +#ifndef configTICK_INTERRUPT_VECTOR + #define configTICK_INTERRUPT_VECTOR _TIMER_1_VECTOR + #define configCLEAR_TICK_TIMER_INTERRUPT() IFS0CLR = _IFS0_T1IF_MASK +#else + #ifndef configCLEAR_TICK_TIMER_INTERRUPT + #error If configTICK_INTERRUPT_VECTOR is defined in application code then configCLEAR_TICK_TIMER_INTERRUPT must also be defined in application code. + #endif +#endif + +/* Let the user override the pre-loading of the initial RA with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger - in which case configTASK_RETURN_ADDRESS can be defined as 0 (NULL). */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task +stack checking. A problem in the ISR stack will trigger an assert, not call the +stack overflow hook function (because the stack overflow hook is specific to a +task stack, not the ISR stack). */ +#if( configCHECK_FOR_STACK_OVERFLOW > 2 ) + + /* Don't use 0xa5 as the stack fill bytes as that is used by the kernerl for + the task stacks, and so will legitimately appear in many positions within + the ISR stack. */ + #define portISR_STACK_FILL_BYTE 0xee + + static const uint8_t ucExpectedStackBytes[] = { + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE }; \ + + #define portCHECK_ISR_STACK() configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) ) +#else + /* Define the function away. */ + #define portCHECK_ISR_STACK() +#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + +/*-----------------------------------------------------------*/ + + +/* + * Place the prototype here to ensure the interrupt vector is correctly installed. + * Note that because the interrupt is written in assembly, the IPL setting in the + * following line of code has no effect. The interrupt priority is set by the + * call to ConfigIntTimer1() in vApplicationSetupTickTimerInterrupt(). + */ +extern void __attribute__( (interrupt(IPL1AUTO), vector( configTICK_INTERRUPT_VECTOR ))) vPortTickInterruptHandler( void ); + +/* + * The software interrupt handler that performs the yield. Note that, because + * the interrupt is written in assembly, the IPL setting in the following line of + * code has no effect. The interrupt priority is set by the call to + * mConfigIntCoreSW0() in xPortStartScheduler(). + */ +void __attribute__( (interrupt(IPL1AUTO), vector(_CORE_SOFTWARE_0_VECTOR))) vPortYieldISR( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Records the interrupt nesting depth. This is initialised to one as it is +decremented to 0 when the first task starts. */ +volatile UBaseType_t uxInterruptNesting = 0x01; + +/* Stores the task stack pointer when a switch is made to use the system stack. */ +UBaseType_t uxSavedTaskStackPointer = 0; + +/* The stack used by interrupt service routines that cause a context switch. */ +__attribute__ ((aligned(8))) StackType_t xISRStack[ configISR_STACK_SIZE ] = { 0 }; + +/* The top of stack value ensures there is enough space to store 6 registers on +the callers stack, as some functions seem to want to do this. */ +const StackType_t * const xISRStackTop = &( xISRStack[ ( configISR_STACK_SIZE & ~portBYTE_ALIGNMENT_MASK ) - 8 ] ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Ensure 8 byte alignment is maintained when the context is popped from + * stack. The size of the context is 33 words (132 bytes). */ + pxTopOfStack--; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0x12345678; /* Word to which the stack pointer will be left pointing after context restore. */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) _CP0_GET_CAUSE(); + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portINITIAL_SR;/* CP0_STATUS */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) pxCode; /* CP0_EPC */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portTASK_RETURN_ADDRESS; /* ra */ + pxTopOfStack -= 15; + + *pxTopOfStack = (StackType_t) pvParameters; /* Parameters to pass in. */ + pxTopOfStack -= 15; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxSavedTaskStackPointer == 0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. This function uses peripheral timer 1. + * The function is declared weak so an application writer can use a different + * timer by redefining this implementation. If a different timer is used then + * configTICK_INTERRUPT_VECTOR must also be defined in FreeRTOSConfig.h to + * ensure the RTOS provided tick interrupt handler is installed on the correct + * vector number. When Timer 1 is used the vector number is defined as + * _TIMER_1_VECTOR. + */ +__attribute__(( weak )) void vApplicationSetupTickTimerInterrupt( void ) +{ +const uint32_t ulCompareMatch = ( (configPERIPHERAL_CLOCK_HZ / portTIMER_PRESCALE) / configTICK_RATE_HZ ) - 1; + + T1CON = 0x0000; + T1CONbits.TCKPS = portPRESCALE_BITS; + PR1 = ulCompareMatch; + IPC1bits.T1IP = configKERNEL_INTERRUPT_PRIORITY; + + /* Clear the interrupt as a starting condition. */ + IFS0bits.T1IF = 0; + + /* Enable the interrupt. */ + IEC0bits.T1IE = 1; + + /* Start the timer. */ + T1CONbits.TON = 1; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler(void) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxInterruptNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); +extern void *pxCurrentTCB; + + #if ( configCHECK_FOR_STACK_OVERFLOW > 2 ) + { + /* Fill the ISR stack to make it easy to asses how much is being used. */ + memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) ); + } + #endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + + /* Clear the software interrupt flag. */ + IFS0CLR = _IFS0_CS0IF_MASK; + + /* Set software timer priority. */ + IPC0CLR = _IPC0_CS0IP_MASK; + IPC0SET = ( configKERNEL_INTERRUPT_PRIORITY << _IPC0_CS0IP_POSITION ); + + /* Enable software interrupt. */ + IEC0CLR = _IEC0_CS0IE_MASK; + IEC0SET = 1 << _IEC0_CS0IE_POSITION; + + /* Setup the timer to generate the tick. Interrupts will have been + disabled by the time we get here. */ + vApplicationSetupTickTimerInterrupt(); + + /* Kick off the highest priority task that has been created so far. + Its stack location is loaded into uxSavedTaskStackPointer. */ + uxSavedTaskStackPointer = *( UBaseType_t * ) pxCurrentTCB; + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortIncrementTick( void ) +{ +UBaseType_t uxSavedStatus; + + uxSavedStatus = uxPortSetInterruptMaskFromISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + _CP0_BIS_CAUSE( portCORE_SW_0 ); + } + } + vPortClearInterruptMaskFromISR( uxSavedStatus ); + + /* Look for the ISR stack getting near or past its limit. */ + portCHECK_ISR_STACK(); + + /* Clear timer interrupt. */ + configCLEAR_TICK_TIMER_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxPortSetInterruptMaskFromISR( void ) +{ +UBaseType_t uxSavedStatusRegister; + + __builtin_disable_interrupts(); + uxSavedStatusRegister = _CP0_GET_STATUS() | 0x01; + /* This clears the IPL bits, then sets them to + configMAX_SYSCALL_INTERRUPT_PRIORITY. This function should not be called + from an interrupt that has a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY so, when used correctly, the action + can only result in the IPL being unchanged or raised, and therefore never + lowered. */ + _CP0_SET_STATUS( ( ( uxSavedStatusRegister & ( ~portALL_IPL_BITS ) ) ) | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ); + + return uxSavedStatusRegister; +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMaskFromISR( UBaseType_t uxSavedStatusRegister ) +{ + _CP0_SET_STATUS( uxSavedStatusRegister ); +} +/*-----------------------------------------------------------*/ + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port_asm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port_asm.S new file mode 100644 index 0000000..cc4026a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port_asm.S @@ -0,0 +1,269 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include +#include +#include "ISR_Support.h" + + + .set nomips16 + .set noreorder + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vPortIncrementTick + .extern xISRStackTop + + .global vPortStartFirstTask + .global vPortYieldISR + .global vPortTickInterruptHandler + + +/******************************************************************/ + + .set noreorder + .set noat + .ent vPortTickInterruptHandler + +vPortTickInterruptHandler: + + portSAVE_CONTEXT + + jal vPortIncrementTick + nop + + portRESTORE_CONTEXT + + .end vPortTickInterruptHandler + +/******************************************************************/ + + .set noreorder + .set noat + .ent vPortStartFirstTask + +vPortStartFirstTask: + + /* Simply restore the context of the highest priority task that has been + created so far. */ + portRESTORE_CONTEXT + + .end vPortStartFirstTask + + + +/*******************************************************************/ + + .set noreorder + .set noat + .ent vPortYieldISR + +vPortYieldISR: + + /* Make room for the context. First save the current status so it can be + manipulated. */ + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to re-enabled interrupt above the kernel priority. */ + ins k1, zero, 10, 6 + ori k1, k1, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) + ins k1, zero, 1, 4 + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Swap to the system stack. This is not conditional on the nesting + count as this interrupt is always the lowest priority and therefore + the nesting is always 0. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Set the nesting count. */ + la k0, uxInterruptNesting + addiu s6, zero, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved with the rest of the context + after interrupts are enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts above configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s7, 48(s5) + sw s6, portEPC_STACK_LOCATION(s5) + /* s5 and s6 has already been saved. */ + sw s4, 36(s5) + sw s3, 32(s5) + sw s2, 28(s5) + sw s1, 24(s5) + sw s0, 20(s5) + sw $1, 16(s5) + + /* s7 is used as a scratch register as this should always be saved across + nesting interrupts. */ + mfhi s7 + sw s7, 12(s5) + mflo s7 + sw s7, 8(s5) + + /* Save the stack pointer to the task. */ + la s7, pxCurrentTCB + lw s7, (s7) + sw s5, (s7) + + /* Set the interrupt mask to the max priority that can use the API. The + yield handler will only be called at configKERNEL_INTERRUPT_PRIORITY which + is below configMAX_SYSCALL_INTERRUPT_PRIORITY - so this can only ever + raise the IPL value and never lower it. */ + di + ehb + mfc0 s7, _CP0_STATUS + ins s7, zero, 10, 6 + ori s6, s7, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) | 1 + + /* This mtc0 re-enables interrupts, but only above + configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 s6, _CP0_STATUS + ehb + + /* Clear the software interrupt in the core. */ + mfc0 s6, _CP0_CAUSE + ins s6, zero, 8, 1 + mtc0 s6, _CP0_CAUSE + ehb + + /* Clear the interrupt in the interrupt controller. */ + la s6, IFS0CLR + addiu s4, zero, 2 + sw s4, (s6) + + jal vTaskSwitchContext + nop + + /* Clear the interrupt mask again. The saved status value is still in s7. */ + mtc0 s7, _CP0_STATUS + ehb + + /* Restore the stack pointer from the TCB. */ + la s0, pxCurrentTCB + lw s0, (s0) + lw s5, (s0) + + /* Restore the rest of the context. */ + lw s0, 8(s5) + mtlo s0 + lw s0, 12(s5) + mthi s0 + lw $1, 16(s5) + lw s0, 20(s5) + lw s1, 24(s5) + lw s2, 28(s5) + lw s3, 32(s5) + lw s4, 36(s5) + /* s5 is loaded later. */ + lw s6, 44(s5) + lw s7, 48(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Set nesting back to zero. As the lowest priority interrupt this + interrupt cannot have nested. */ + la k0, uxInterruptNesting + sw zero, 0(k0) + + /* Switch back to use the real stack pointer. */ + add sp, zero, s5 + + /* Restore the real s5 value. */ + lw s5, 40(sp) + + /* Pop the status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + + /* Remove stack frame. */ + addiu sp, sp, portCONTEXT_SIZE + + mtc0 k1, _CP0_STATUS + mtc0 k0, _CP0_EPC + ehb + eret + nop + + .end vPortYieldISR + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/portmacro.h new file mode 100644 index 0000000..f67e51c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/portmacro.h @@ -0,0 +1,202 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* System include files */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portIPL_SHIFT ( 10UL ) +#define portALL_IPL_BITS ( 0x3fUL << portIPL_SHIFT ) +#define portSW0_BIT ( 0x01 << 8 ) + +/* This clears the IPL bits, then sets them to +configMAX_SYSCALL_INTERRUPT_PRIORITY. An extra check is performed if +configASSERT() is defined to ensure an assertion handler does not inadvertently +attempt to lower the IPL when the call to assert was triggered because the IPL +value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY when an ISR +safe FreeRTOS API function was executed. ISR safe FreeRTOS API functions are +those that end in FromISR. FreeRTOS maintains a separate interrupt API to +ensure API function and interrupt entry is as fast and as simple as possible. */ +#ifdef configASSERT + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = _CP0_GET_STATUS(); \ + \ + /* Is the current IPL below configMAX_SYSCALL_INTERRUPT_PRIORITY? */ \ + if( ( ( ulStatus & portALL_IPL_BITS ) >> portIPL_SHIFT ) < configMAX_SYSCALL_INTERRUPT_PRIORITY ) \ + { \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } \ + } +#else /* configASSERT */ + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = _CP0_GET_STATUS(); \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } +#endif /* configASSERT */ + +#define portENABLE_INTERRUPTS() \ +{ \ +uint32_t ulStatus; \ + \ + /* Unmask all interrupts. */ \ + ulStatus = _CP0_GET_STATUS(); \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ulStatus ); \ +} + + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portCRITICAL_NESTING_IN_TCB 1 +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR(); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) vPortClearInterruptMaskFromISR( uxSavedStatusRegister ) + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - _clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portYIELD() \ +{ \ +uint32_t ulCause; \ + \ + /* Trigger software interrupt. */ \ + ulCause = _CP0_GET_CAUSE(); \ + ulCause |= portSW0_BIT; \ + _CP0_SET_CAUSE( ulCause ); \ +} + +extern volatile UBaseType_t uxInterruptNesting; +#define portASSERT_IF_IN_ISR() configASSERT( uxInterruptNesting == 0 ) + +#define portNOP() __asm volatile ( "nop" ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) { portYIELD(); } } while( 0 ) + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/ISR_Support.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/ISR_Support.h new file mode 100644 index 0000000..9bee93b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/ISR_Support.h @@ -0,0 +1,433 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOSConfig.h" + +#define portCONTEXT_SIZE 160 +#define portEPC_STACK_LOCATION 152 +#define portSTATUS_STACK_LOCATION 156 +#define portFPCSR_STACK_LOCATION 0 +#define portTASK_HAS_FPU_STACK_LOCATION 0 +#define portFPU_CONTEXT_SIZE 264 + +/******************************************************************/ +.macro portSAVE_FPU_REGS offset, base + /* Macro to assist with saving just the FPU registers to the + * specified address and base offset, + * offset is a constant, base is the base pointer register */ + + sdc1 $f31, \offset + 248(\base) + sdc1 $f30, \offset + 240(\base) + sdc1 $f29, \offset + 232(\base) + sdc1 $f28, \offset + 224(\base) + sdc1 $f27, \offset + 216(\base) + sdc1 $f26, \offset + 208(\base) + sdc1 $f25, \offset + 200(\base) + sdc1 $f24, \offset + 192(\base) + sdc1 $f23, \offset + 184(\base) + sdc1 $f22, \offset + 176(\base) + sdc1 $f21, \offset + 168(\base) + sdc1 $f20, \offset + 160(\base) + sdc1 $f19, \offset + 152(\base) + sdc1 $f18, \offset + 144(\base) + sdc1 $f17, \offset + 136(\base) + sdc1 $f16, \offset + 128(\base) + sdc1 $f15, \offset + 120(\base) + sdc1 $f14, \offset + 112(\base) + sdc1 $f13, \offset + 104(\base) + sdc1 $f12, \offset + 96(\base) + sdc1 $f11, \offset + 88(\base) + sdc1 $f10, \offset + 80(\base) + sdc1 $f9, \offset + 72(\base) + sdc1 $f8, \offset + 64(\base) + sdc1 $f7, \offset + 56(\base) + sdc1 $f6, \offset + 48(\base) + sdc1 $f5, \offset + 40(\base) + sdc1 $f4, \offset + 32(\base) + sdc1 $f3, \offset + 24(\base) + sdc1 $f2, \offset + 16(\base) + sdc1 $f1, \offset + 8(\base) + sdc1 $f0, \offset + 0(\base) + + .endm + +/******************************************************************/ +.macro portLOAD_FPU_REGS offset, base + /* Macro to assist with loading just the FPU registers from the + * specified address and base offset, offset is a constant, + * base is the base pointer register */ + + ldc1 $f0, \offset + 0(\base) + ldc1 $f1, \offset + 8(\base) + ldc1 $f2, \offset + 16(\base) + ldc1 $f3, \offset + 24(\base) + ldc1 $f4, \offset + 32(\base) + ldc1 $f5, \offset + 40(\base) + ldc1 $f6, \offset + 48(\base) + ldc1 $f7, \offset + 56(\base) + ldc1 $f8, \offset + 64(\base) + ldc1 $f9, \offset + 72(\base) + ldc1 $f10, \offset + 80(\base) + ldc1 $f11, \offset + 88(\base) + ldc1 $f12, \offset + 96(\base) + ldc1 $f13, \offset + 104(\base) + ldc1 $f14, \offset + 112(\base) + ldc1 $f15, \offset + 120(\base) + ldc1 $f16, \offset + 128(\base) + ldc1 $f17, \offset + 136(\base) + ldc1 $f18, \offset + 144(\base) + ldc1 $f19, \offset + 152(\base) + ldc1 $f20, \offset + 160(\base) + ldc1 $f21, \offset + 168(\base) + ldc1 $f22, \offset + 176(\base) + ldc1 $f23, \offset + 184(\base) + ldc1 $f24, \offset + 192(\base) + ldc1 $f25, \offset + 200(\base) + ldc1 $f26, \offset + 208(\base) + ldc1 $f27, \offset + 216(\base) + ldc1 $f28, \offset + 224(\base) + ldc1 $f29, \offset + 232(\base) + ldc1 $f30, \offset + 240(\base) + ldc1 $f31, \offset + 248(\base) + + .endm + +/******************************************************************/ +.macro portSAVE_CONTEXT + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so their original values are + captured. */ + mfc0 k0, _CP0_CAUSE + addiu sp, sp, -portCONTEXT_SIZE + + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + /* Test if we are already using the system stack. Only tasks may use the + FPU so if we are already in a nested interrupt then the FPU context does + not require saving. */ + la k1, uxInterruptNesting + lw k1, 0(k1) + bne k1, zero, 2f + nop + + /* Test if the current task needs the FPU context saving. */ + la k1, ulTaskHasFPUContext + lw k1, 0(k1) + beq k1, zero, 1f + nop + + /* Adjust the stack to account for the additional FPU context.*/ + addiu sp, sp, -portFPU_CONTEXT_SIZE + + 1: + /* Save the ulTaskHasFPUContext flag. */ + sw k1, portTASK_HAS_FPU_STACK_LOCATION(sp) + + 2: + #endif + + mfc0 k1, _CP0_STATUS + + /* Also save s7, s6 and s5 so they can be used. Any nesting interrupts + should maintain the values of these registers across the ISR. */ + sw s7, 48(sp) + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to enable interrupts above the current priority. */ + srl k0, k0, 0xa + ins k1, k0, 10, 7 + srl k0, k0, 0x7 /* This copies the MSB of the IPL, but it would be an error if it was set anyway. */ + ins k1, k0, 18, 1 + ins k1, zero, 1, 4 + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Check the nesting count value. */ + la k0, uxInterruptNesting + lw s6, (k0) + + /* If the nesting count is 0 then swap to the the system stack, otherwise + the system stack is already being used. */ + bne s6, zero, 1f + nop + + /* Swap to the system stack. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Increment and save the nesting count. */ +1: addiu s6, s6, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved after interrupts are re-enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. No other s registers need be + saved. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s6, portEPC_STACK_LOCATION(s5) + sw $1, 16(s5) + + /* Save the AC0, AC1, AC2, AC3 registers from the DSP. s6 is used as a + scratch register. */ + mfhi s6, $ac1 + sw s6, 128(s5) + mflo s6, $ac1 + sw s6, 124(s5) + + mfhi s6, $ac2 + sw s6, 136(s5) + mflo s6, $ac2 + sw s6, 132(s5) + + mfhi s6, $ac3 + sw s6, 144(s5) + mflo s6, $ac3 + sw s6, 140(s5) + + /* Save the DSP Control register */ + rddsp s6 + sw s6, 148(s5) + + /* ac0 is done separately to match the MX port. */ + mfhi s6, $ac0 + sw s6, 12(s5) + mflo s6, $ac0 + sw s6, 8(s5) + + /* Save the FPU context if the nesting count was zero. */ + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + la s6, uxInterruptNesting + lw s6, 0(s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + + /* Test if the current task needs the FPU context saving. */ + lw s6, portTASK_HAS_FPU_STACK_LOCATION(s5) + beq s6, zero, 1f + nop + + /* Save the FPU registers. */ + portSAVE_FPU_REGS ( portCONTEXT_SIZE + 8 ), s5 + + /* Save the FPU status register */ + cfc1 s6, $f31 + sw s6, (portCONTEXT_SIZE + portFPCSR_STACK_LOCATION)(s5) + + 1: + #endif + + /* Update the task stack pointer value if nesting is zero. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + + /* Save the stack pointer. */ + la s6, uxSavedTaskStackPointer + sw s5, (s6) +1: + .endm + +/******************************************************************/ +.macro portRESTORE_CONTEXT + + /* Restore the stack pointer from the TCB. This is only done if the + nesting count is 1. */ + la s6, uxInterruptNesting + lw s6, (s6) + addiu s6, s6, -1 + bne s6, zero, 1f + nop + la s6, uxSavedTaskStackPointer + lw s5, (s6) + + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + /* Restore the FPU context if required. */ + lw s6, portTASK_HAS_FPU_STACK_LOCATION(s5) + beq s6, zero, 1f + nop + + /* Restore the FPU registers. */ + portLOAD_FPU_REGS ( portCONTEXT_SIZE + 8 ), s5 + + /* Restore the FPU status register. */ + lw s6, ( portCONTEXT_SIZE + portFPCSR_STACK_LOCATION )(s5) + ctc1 s6, $f31 + #endif + +1: + + /* Restore the context. */ + lw s6, 128(s5) + mthi s6, $ac1 + lw s6, 124(s5) + mtlo s6, $ac1 + + lw s6, 136(s5) + mthi s6, $ac2 + lw s6, 132(s5) + mtlo s6, $ac2 + + lw s6, 144(s5) + mthi s6, $ac3 + lw s6, 140(s5) + mtlo s6, $ac3 + + /* Restore DSPControl. */ + lw s6, 148(s5) + wrdsp s6 + + lw s6, 8(s5) + mtlo s6, $ac0 + lw s6, 12(s5) + mthi s6, $ac0 + lw $1, 16(s5) + + /* s6 is loaded as it was used as a scratch register and therefore saved + as part of the interrupt context. */ + lw s7, 48(s5) + lw s6, 44(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Decrement the nesting count. */ + la k0, uxInterruptNesting + lw k1, (k0) + addiu k1, k1, -1 + sw k1, 0(k0) + + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + /* If the nesting count is now zero then the FPU context may be restored. */ + bne k1, zero, 1f + nop + + /* Restore the value of ulTaskHasFPUContext */ + la k0, ulTaskHasFPUContext + lw k1, 0(s5) + sw k1, 0(k0) + + /* If the task does not have an FPU context then adjust the stack normally. */ + beq k1, zero, 1f + nop + + /* Restore the STATUS and EPC registers */ + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + + /* Adjust the stack pointer to remove the FPU context */ + addiu sp, sp, portFPU_CONTEXT_SIZE + beq zero, zero, 2f + nop + + 1: /* Restore the STATUS and EPC registers */ + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + + 2: /* Adjust the stack pointer */ + addiu sp, sp, portCONTEXT_SIZE + + #else + + /* Restore the frame when there is no hardware FP support. */ + lw k0, portSTATUS_STACK_LOCATION(s5) + lw k1, portEPC_STACK_LOCATION(s5) + + /* Leave the stack in its original state. First load sp from s5, then + restore s5 from the stack. */ + add sp, zero, s5 + lw s5, 40(sp) + + addiu sp, sp, portCONTEXT_SIZE + + #endif // ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + + mtc0 k0, _CP0_STATUS + mtc0 k1, _CP0_EPC + ehb + eret + nop + + .endm + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port.c new file mode 100644 index 0000000..46d5c8d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port.c @@ -0,0 +1,373 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the PIC32MZ port. + *----------------------------------------------------------*/ + +/* Microchip specific headers. */ +#include + +/* Standard headers. */ +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +#if !defined(__PIC32MZ__) + #error This port is designed to work with XC32 on PIC32MZ MCUs. Please update your C compiler version or settings. +#endif + +#if( ( configMAX_SYSCALL_INTERRUPT_PRIORITY >= 0x7 ) || ( configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 ) ) + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must be less than 7 and greater than 0 +#endif + +/* Hardware specifics. */ +#define portTIMER_PRESCALE 8 +#define portPRESCALE_BITS 1 + +/* Bits within various registers. */ +#define portIE_BIT ( 0x00000001 ) +#define portEXL_BIT ( 0x00000002 ) +#define portMX_BIT ( 0x01000000 ) /* Allow access to DSP instructions. */ +#define portCU1_BIT ( 0x20000000 ) /* enable CP1 for parts with hardware. */ +#define portFR_BIT ( 0x04000000 ) /* Enable 64 bit floating point registers. */ + +/* Bits within the CAUSE register. */ +#define portCORE_SW_0 ( 0x00000100 ) +#define portCORE_SW_1 ( 0x00000200 ) + +/* The EXL bit is set to ensure interrupts do not occur while the context of +the first task is being restored. */ +#if ( __mips_hard_float == 1 ) + #define portINITIAL_SR ( portIE_BIT | portEXL_BIT | portMX_BIT | portFR_BIT | portCU1_BIT ) +#else + #define portINITIAL_SR ( portIE_BIT | portEXL_BIT | portMX_BIT ) +#endif + +/* The initial value to store into the FPU status and control register. This is + only used on parts that support a hardware FPU. */ +#define portINITIAL_FPSCR (0x1000000) /* High perf on denormal ops */ + + +/* +By default port.c generates its tick interrupt from TIMER1. The user can +override this behaviour by: + 1: Providing their own implementation of vApplicationSetupTickTimerInterrupt(), + which is the function that configures the timer. The function is defined + as a weak symbol in this file so if the same function name is used in the + application code then the version in the application code will be linked + into the application in preference to the version defined in this file. + 2: Define configTICK_INTERRUPT_VECTOR to the vector number of the timer used + to generate the tick interrupt. For example, when timer 1 is used then + configTICK_INTERRUPT_VECTOR is set to _TIMER_1_VECTOR. + configTICK_INTERRUPT_VECTOR should be defined in FreeRTOSConfig.h. + 3: Define configCLEAR_TICK_TIMER_INTERRUPT() to clear the interrupt in the + timer used to generate the tick interrupt. For example, when timer 1 is + used configCLEAR_TICK_TIMER_INTERRUPT() is defined to + IFS0CLR = _IFS0_T1IF_MASK. +*/ +#ifndef configTICK_INTERRUPT_VECTOR + #define configTICK_INTERRUPT_VECTOR _TIMER_1_VECTOR + #define configCLEAR_TICK_TIMER_INTERRUPT() IFS0CLR = _IFS0_T1IF_MASK +#else + #ifndef configCLEAR_TICK_TIMER_INTERRUPT + #error If configTICK_INTERRUPT_VECTOR is defined in application code then configCLEAR_TICK_TIMER_INTERRUPT must also be defined in application code. + #endif +#endif + +/* Let the user override the pre-loading of the initial RA with the address of +prvTaskExitError() in case it messes up unwinding of the stack in the +debugger - in which case configTASK_RETURN_ADDRESS can be defined as 0 (NULL). */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task +stack checking. A problem in the ISR stack will trigger an assert, not call the +stack overflow hook function (because the stack overflow hook is specific to a +task stack, not the ISR stack). */ +#if( configCHECK_FOR_STACK_OVERFLOW > 2 ) + + /* Don't use 0xa5 as the stack fill bytes as that is used by the kernerl for + the task stacks, and so will legitimately appear in many positions within + the ISR stack. */ + #define portISR_STACK_FILL_BYTE 0xee + + static const uint8_t ucExpectedStackBytes[] = { + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, \ + portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE, portISR_STACK_FILL_BYTE }; \ + + #define portCHECK_ISR_STACK() configASSERT( ( memcmp( ( void * ) xISRStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) == 0 ) ) +#else + /* Define the function away. */ + #define portCHECK_ISR_STACK() +#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + +/*-----------------------------------------------------------*/ + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Records the interrupt nesting depth. This is initialised to one as it is +decremented to 0 when the first task starts. */ +volatile UBaseType_t uxInterruptNesting = 0x01; + +/* Stores the task stack pointer when a switch is made to use the system stack. */ +UBaseType_t uxSavedTaskStackPointer = 0; + +/* The stack used by interrupt service routines that cause a context switch. */ +__attribute__ ((aligned(8))) StackType_t xISRStack[ configISR_STACK_SIZE ] = { 0 }; + +/* The top of stack value ensures there is enough space to store 6 registers on +the callers stack, as some functions seem to want to do this. 8 byte alignment +is required to allow double word floating point stack pushes generated by the +compiler. */ +const StackType_t * const xISRStackTop = &( xISRStack[ ( configISR_STACK_SIZE & ~portBYTE_ALIGNMENT_MASK ) - 8 ] ); + +/* Saved as part of the task context. Set to pdFALSE if the task does not + require an FPU context. */ +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + uint32_t ulTaskHasFPUContext = 0; +#endif + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Ensure 8 byte alignment is maintained when leaving this function. */ + pxTopOfStack--; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0xDEADBEEF; + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0x12345678; /* Word to which the stack pointer will be left pointing after context restore. */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) _CP0_GET_CAUSE(); + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) portINITIAL_SR;/* CP0_STATUS */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) pxCode; /* CP0_EPC */ + pxTopOfStack--; + + *pxTopOfStack = (StackType_t) 0x00000000; /* DSPControl */ + pxTopOfStack -= 7; /* Includes space for AC1 - AC3. */ + + *pxTopOfStack = (StackType_t) portTASK_RETURN_ADDRESS; /* ra */ + pxTopOfStack -= 15; + + *pxTopOfStack = (StackType_t) pvParameters; /* Parameters to pass in. */ + pxTopOfStack -= 15; + + *pxTopOfStack = (StackType_t) pdFALSE; /*by default disable FPU context save on parts with FPU */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxSavedTaskStackPointer == 0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. This function uses peripheral timer 1. + * The function is declared weak so an application writer can use a different + * timer by redefining this implementation. If a different timer is used then + * configTICK_INTERRUPT_VECTOR must also be defined in FreeRTOSConfig.h to + * ensure the RTOS provided tick interrupt handler is installed on the correct + * vector number. When Timer 1 is used the vector number is defined as + * _TIMER_1_VECTOR. + */ +__attribute__(( weak )) void vApplicationSetupTickTimerInterrupt( void ) +{ +const uint32_t ulCompareMatch = ( (configPERIPHERAL_CLOCK_HZ / portTIMER_PRESCALE) / configTICK_RATE_HZ ) - 1UL; + + T1CON = 0x0000; + T1CONbits.TCKPS = portPRESCALE_BITS; + PR1 = ulCompareMatch; + IPC1bits.T1IP = configKERNEL_INTERRUPT_PRIORITY; + + /* Clear the interrupt as a starting condition. */ + IFS0bits.T1IF = 0; + + /* Enable the interrupt. */ + IEC0bits.T1IE = 1; + + /* Start the timer. */ + T1CONbits.TON = 1; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler(void) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( uxInterruptNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vPortStartFirstTask( void ); +extern void *pxCurrentTCB; + + #if ( configCHECK_FOR_STACK_OVERFLOW > 2 ) + { + /* Fill the ISR stack to make it easy to asses how much is being used. */ + memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) ); + } + #endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */ + + /* Clear the software interrupt flag. */ + IFS0CLR = _IFS0_CS0IF_MASK; + + /* Set software timer priority. */ + IPC0CLR = _IPC0_CS0IP_MASK; + IPC0SET = ( configKERNEL_INTERRUPT_PRIORITY << _IPC0_CS0IP_POSITION ); + + /* Enable software interrupt. */ + IEC0CLR = _IEC0_CS0IE_MASK; + IEC0SET = 1 << _IEC0_CS0IE_POSITION; + + /* Setup the timer to generate the tick. Interrupts will have been + disabled by the time we get here. */ + vApplicationSetupTickTimerInterrupt(); + + /* Kick off the highest priority task that has been created so far. + Its stack location is loaded into uxSavedTaskStackPointer. */ + uxSavedTaskStackPointer = *( UBaseType_t * ) pxCurrentTCB; + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortIncrementTick( void ) +{ +UBaseType_t uxSavedStatus; + + uxSavedStatus = uxPortSetInterruptMaskFromISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + _CP0_BIS_CAUSE( portCORE_SW_0 ); + } + } + vPortClearInterruptMaskFromISR( uxSavedStatus ); + + /* Look for the ISR stack getting near or past its limit. */ + portCHECK_ISR_STACK(); + + /* Clear timer interrupt. */ + configCLEAR_TICK_TIMER_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxPortSetInterruptMaskFromISR( void ) +{ +UBaseType_t uxSavedStatusRegister; + + __builtin_disable_interrupts(); + uxSavedStatusRegister = _CP0_GET_STATUS() | 0x01; + /* This clears the IPL bits, then sets them to + configMAX_SYSCALL_INTERRUPT_PRIORITY. This function should not be called + from an interrupt that has a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY so, when used correctly, the action + can only result in the IPL being unchanged or raised, and therefore never + lowered. */ + _CP0_SET_STATUS( ( ( uxSavedStatusRegister & ( ~portALL_IPL_BITS ) ) ) | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ); + + return uxSavedStatusRegister; +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMaskFromISR( UBaseType_t uxSavedStatusRegister ) +{ + _CP0_SET_STATUS( uxSavedStatusRegister ); +} +/*-----------------------------------------------------------*/ + +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + + void vPortTaskUsesFPU(void) + { + extern void vPortInitialiseFPSCR( uint32_t uxFPSCRInit ); + + portENTER_CRITICAL(); + + /* Initialise the floating point status register. */ + vPortInitialiseFPSCR(portINITIAL_FPSCR); + + /* A task is registering the fact that it needs a FPU context. Set the + FPU flag (saved as part of the task context). */ + ulTaskHasFPUContext = pdTRUE; + + portEXIT_CRITICAL(); + } + +#endif /* __mips_hard_float == 1 */ + +/*-----------------------------------------------------------*/ + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port_asm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port_asm.S new file mode 100644 index 0000000..283b8c0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port_asm.S @@ -0,0 +1,769 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include +#include +#include "FreeRTOSConfig.h" +#include "ISR_Support.h" + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern vPortIncrementTick + .extern xISRStackTop + .extern ulTaskHasFPUContext + + .global vPortStartFirstTask + .global vPortYieldISR + .global vPortTickInterruptHandler + .global vPortInitialiseFPSCR + + +/******************************************************************/ + + .set nomips16 + .set nomicromips + .set noreorder + .set noat + + /*************************************************************** + * The following is needed to locate the + * vPortTickInterruptHandler function into the correct vector + ***************************************************************/ + #ifdef configTICK_INTERRUPT_VECTOR + #if (configTICK_INTERRUPT_VECTOR == _CORE_TIMER_VECTOR) + .equ __vector_dispatch_0, vPortTickInterruptHandler + .global __vector_dispatch_0 + .section .vector_0, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_1_VECTOR) + .equ __vector_dispatch_4, vPortTickInterruptHandler + .global __vector_dispatch_4 + .section .vector_4, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_2_VECTOR) + .equ __vector_dispatch_9, vPortTickInterruptHandler + .global __vector_dispatch_9 + .section .vector_9, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_3_VECTOR) + .equ __vector_dispatch_14, vPortTickInterruptHandler + .global __vector_dispatch_14 + .section .vector_14, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_4_VECTOR) + .equ __vector_dispatch_19, vPortTickInterruptHandler + .global __vector_dispatch_19 + .section .vector_19, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_5_VECTOR) + .equ __vector_dispatch_24, vPortTickInterruptHandler + .global __vector_dispatch_24 + .section .vector_24, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_6_VECTOR) + .equ __vector_dispatch_28, vPortTickInterruptHandler + .global __vector_dispatch_28 + .section .vector_28, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_7_VECTOR) + .equ __vector_dispatch_32, vPortTickInterruptHandler + .global __vector_dispatch_32 + .section .vector_32, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_8_VECTOR) + .equ __vector_dispatch_36, vPortTickInterruptHandler + .global __vector_dispatch_36 + .section .vector_36, code, keep + #elif (configTICK_INTERRUPT_VECTOR == _TIMER_9_VECTOR) + .equ __vector_dispatch_40, vPortTickInterruptHandler + .global __vector_dispatch_40 + .section .vector_40, code, keep + #endif + #else + .equ __vector_dispatch_4, vPortTickInterruptHandler + .global __vector_dispatch_4 + .section .vector_4, code, keep + #endif + + .ent vPortTickInterruptHandler + +vPortTickInterruptHandler: + + portSAVE_CONTEXT + + jal vPortIncrementTick + nop + + portRESTORE_CONTEXT + + .end vPortTickInterruptHandler + +/******************************************************************/ + + .set noreorder + .set noat + .section .text, code + .ent vPortStartFirstTask + +vPortStartFirstTask: + + /* Simply restore the context of the highest priority task that has been + created so far. */ + portRESTORE_CONTEXT + + .end vPortStartFirstTask + + + +/*******************************************************************/ + + .set nomips16 + .set nomicromips + .set noreorder + .set noat + /*************************************************************** + * The following is needed to locate the vPortYieldISR function + * into the correct vector + ***************************************************************/ + .equ __vector_dispatch_1, vPortYieldISR + .global __vector_dispatch_1 + .section .vector_1, code + + .ent vPortYieldISR +vPortYieldISR: + + #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + /* Code sequence for FPU support, the context save requires advance + knowledge of the stack frame size and if the current task actually uses the + FPU. */ + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so their original values are + captured. */ + la k0, ulTaskHasFPUContext + lw k0, 0(k0) + beq k0, zero, 1f + addiu sp, sp, -portCONTEXT_SIZE /* always reserve space for the context. */ + addiu sp, sp, -portFPU_CONTEXT_SIZE /* reserve additional space for the FPU context. */ + 1: + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + sw k0, portTASK_HAS_FPU_STACK_LOCATION(sp) + + /* Prepare to re-enabled interrupts above the kernel priority. */ + ins k1, zero, 10, 7 /* Clear IPL bits 0:6. */ + ins k1, zero, 18, 1 /* Clear IPL bit 7. It would be an error here if this bit were set anyway. */ + ori k1, k1, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) + ins k1, zero, 1, 4 /* Clear EXL, ERL and UM. */ + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Swap to the system stack. This is not conditional on the nesting + count as this interrupt is always the lowest priority and therefore + the nesting is always 0. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Set the nesting count. */ + la k0, uxInterruptNesting + addiu s6, zero, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved with the rest of the context + after interrupts are enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts above configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s7, 48(s5) + sw s6, portEPC_STACK_LOCATION(s5) + /* s5 and s6 has already been saved. */ + sw s4, 36(s5) + sw s3, 32(s5) + sw s2, 28(s5) + sw s1, 24(s5) + sw s0, 20(s5) + sw $1, 16(s5) + + /* s7 is used as a scratch register as this should always be saved across + nesting interrupts. */ + + /* Save the AC0, AC1, AC2 and AC3. */ + mfhi s7, $ac1 + sw s7, 128(s5) + mflo s7, $ac1 + sw s7, 124(s5) + + mfhi s7, $ac2 + sw s7, 136(s5) + mflo s7, $ac2 + sw s7, 132(s5) + + mfhi s7, $ac3 + sw s7, 144(s5) + mflo s7, $ac3 + sw s7, 140(s5) + + rddsp s7 + sw s7, 148(s5) + + mfhi s7, $ac0 + sw s7, 12(s5) + mflo s7, $ac0 + sw s7, 8(s5) + + /* Test if FPU context save is required. */ + lw s7, portTASK_HAS_FPU_STACK_LOCATION(s5) + beq s7, zero, 1f + nop + + /* Save the FPU registers above the normal context. */ + portSAVE_FPU_REGS (portCONTEXT_SIZE + 8), s5 + + /* Save the FPU status register */ + cfc1 s7, $f31 + sw s7, ( portCONTEXT_SIZE + portFPCSR_STACK_LOCATION )(s5) + + 1: + /* Save the stack pointer to the task. */ + la s7, pxCurrentTCB + lw s7, (s7) + sw s5, (s7) + + /* Set the interrupt mask to the max priority that can use the API. The + yield handler will only be called at configKERNEL_INTERRUPT_PRIORITY which + is below configMAX_SYSCALL_INTERRUPT_PRIORITY - so this can only ever + raise the IPL value and never lower it. */ + di + ehb + mfc0 s7, _CP0_STATUS + ins s7, zero, 10, 7 + ins s7, zero, 18, 1 + ori s6, s7, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) | 1 + + /* This mtc0 re-enables interrupts, but only above + configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 s6, _CP0_STATUS + ehb + + /* Clear the software interrupt in the core. */ + mfc0 s6, _CP0_CAUSE + ins s6, zero, 8, 1 + mtc0 s6, _CP0_CAUSE + ehb + + /* Clear the interrupt in the interrupt controller. */ + la s6, IFS0CLR + addiu s4, zero, 2 + sw s4, (s6) + + jal vTaskSwitchContext + nop + + /* Clear the interrupt mask again. The saved status value is still in s7. */ + mtc0 s7, _CP0_STATUS + ehb + + /* Restore the stack pointer from the TCB. */ + la s0, pxCurrentTCB + lw s0, (s0) + lw s5, (s0) + + /* Test if the FPU context needs restoring. */ + lw s0, portTASK_HAS_FPU_STACK_LOCATION(s5) + beq s0, zero, 1f + nop + + /* Restore the FPU status register. */ + lw s0, ( portCONTEXT_SIZE + portFPCSR_STACK_LOCATION )(s5) + ctc1 s0, $f31 + + /* Restore the FPU registers. */ + portLOAD_FPU_REGS ( portCONTEXT_SIZE + 8 ), s5 + + 1: + /* Restore the rest of the context. */ + lw s0, 128(s5) + mthi s0, $ac1 + lw s0, 124(s5) + mtlo s0, $ac1 + + lw s0, 136(s5) + mthi s0, $ac2 + lw s0, 132(s5) + mtlo s0, $ac2 + + lw s0, 144(s5) + mthi s0, $ac3 + lw s0, 140(s5) + mtlo s0, $ac3 + + lw s0, 148(s5) + wrdsp s0 + + lw s0, 8(s5) + mtlo s0, $ac0 + lw s0, 12(s5) + mthi s0, $ac0 + + lw $1, 16(s5) + lw s0, 20(s5) + lw s1, 24(s5) + lw s2, 28(s5) + lw s3, 32(s5) + lw s4, 36(s5) + + /* s5 is loaded later. */ + lw s6, 44(s5) + lw s7, 48(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Set nesting back to zero. As the lowest priority interrupt this + interrupt cannot have nested. */ + la k0, uxInterruptNesting + sw zero, 0(k0) + + /* Switch back to use the real stack pointer. */ + add sp, zero, s5 + + /* Restore the real s5 value. */ + lw s5, 40(sp) + + /* Pop the FPU context value from the stack */ + lw k0, portTASK_HAS_FPU_STACK_LOCATION(sp) + la k1, ulTaskHasFPUContext + sw k0, 0(k1) + beq k0, zero, 1f + nop + + /* task has FPU context so adjust the stack frame after popping the + status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + addiu sp, sp, portFPU_CONTEXT_SIZE + beq zero, zero, 2f + nop + + 1: + /* Pop the status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + + 2: + /* Remove stack frame. */ + addiu sp, sp, portCONTEXT_SIZE + + #else + /* Code sequence for no FPU support, the context save requires advance + knowledge of the stack frame size when no FPU is being used */ + + /* Make room for the context. First save the current status so it can be + manipulated, and the cause and EPC registers so thier original values are + captured. */ + addiu sp, sp, -portCONTEXT_SIZE + mfc0 k1, _CP0_STATUS + + /* Also save s6 and s5 so they can be used. Any nesting interrupts should + maintain the values of these registers across the ISR. */ + sw s6, 44(sp) + sw s5, 40(sp) + sw k1, portSTATUS_STACK_LOCATION(sp) + + /* Prepare to re-enabled interrupts above the kernel priority. */ + ins k1, zero, 10, 7 /* Clear IPL bits 0:6. */ + ins k1, zero, 18, 1 /* Clear IPL bit 7. It would be an error here if this bit were set anyway. */ + ori k1, k1, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) + ins k1, zero, 1, 4 /* Clear EXL, ERL and UM. */ + + /* s5 is used as the frame pointer. */ + add s5, zero, sp + + /* Swap to the system stack. This is not conditional on the nesting + count as this interrupt is always the lowest priority and therefore + the nesting is always 0. */ + la sp, xISRStackTop + lw sp, (sp) + + /* Set the nesting count. */ + la k0, uxInterruptNesting + addiu s6, zero, 1 + sw s6, 0(k0) + + /* s6 holds the EPC value, this is saved with the rest of the context + after interrupts are enabled. */ + mfc0 s6, _CP0_EPC + + /* Re-enable interrupts above configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 k1, _CP0_STATUS + + /* Save the context into the space just created. s6 is saved again + here as it now contains the EPC value. */ + sw ra, 120(s5) + sw s8, 116(s5) + sw t9, 112(s5) + sw t8, 108(s5) + sw t7, 104(s5) + sw t6, 100(s5) + sw t5, 96(s5) + sw t4, 92(s5) + sw t3, 88(s5) + sw t2, 84(s5) + sw t1, 80(s5) + sw t0, 76(s5) + sw a3, 72(s5) + sw a2, 68(s5) + sw a1, 64(s5) + sw a0, 60(s5) + sw v1, 56(s5) + sw v0, 52(s5) + sw s7, 48(s5) + sw s6, portEPC_STACK_LOCATION(s5) + /* s5 and s6 has already been saved. */ + sw s4, 36(s5) + sw s3, 32(s5) + sw s2, 28(s5) + sw s1, 24(s5) + sw s0, 20(s5) + sw $1, 16(s5) + + /* s7 is used as a scratch register as this should always be saved across + nesting interrupts. */ + + /* Save the AC0, AC1, AC2 and AC3. */ + mfhi s7, $ac1 + sw s7, 128(s5) + mflo s7, $ac1 + sw s7, 124(s5) + + mfhi s7, $ac2 + sw s7, 136(s5) + mflo s7, $ac2 + sw s7, 132(s5) + + mfhi s7, $ac3 + sw s7, 144(s5) + mflo s7, $ac3 + sw s7, 140(s5) + + rddsp s7 + sw s7, 148(s5) + + mfhi s7, $ac0 + sw s7, 12(s5) + mflo s7, $ac0 + sw s7, 8(s5) + + /* Save the stack pointer to the task. */ + la s7, pxCurrentTCB + lw s7, (s7) + sw s5, (s7) + + /* Set the interrupt mask to the max priority that can use the API. The + yield handler will only be called at configKERNEL_INTERRUPT_PRIORITY which + is below configMAX_SYSCALL_INTERRUPT_PRIORITY - so this can only ever + raise the IPL value and never lower it. */ + di + ehb + mfc0 s7, _CP0_STATUS + ins s7, zero, 10, 7 + ins s7, zero, 18, 1 + ori s6, s7, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) | 1 + + /* This mtc0 re-enables interrupts, but only above + configMAX_SYSCALL_INTERRUPT_PRIORITY. */ + mtc0 s6, _CP0_STATUS + ehb + + /* Clear the software interrupt in the core. */ + mfc0 s6, _CP0_CAUSE + ins s6, zero, 8, 1 + mtc0 s6, _CP0_CAUSE + ehb + + /* Clear the interrupt in the interrupt controller. */ + la s6, IFS0CLR + addiu s4, zero, 2 + sw s4, (s6) + + jal vTaskSwitchContext + nop + + /* Clear the interrupt mask again. The saved status value is still in s7. */ + mtc0 s7, _CP0_STATUS + ehb + + /* Restore the stack pointer from the TCB. */ + la s0, pxCurrentTCB + lw s0, (s0) + lw s5, (s0) + + /* Restore the rest of the context. */ + lw s0, 128(s5) + mthi s0, $ac1 + lw s0, 124(s5) + mtlo s0, $ac1 + + lw s0, 136(s5) + mthi s0, $ac2 + lw s0, 132(s5) + mtlo s0, $ac2 + + lw s0, 144(s5) + mthi s0, $ac3 + lw s0, 140(s5) + mtlo s0, $ac3 + + lw s0, 148(s5) + wrdsp s0 + + lw s0, 8(s5) + mtlo s0, $ac0 + lw s0, 12(s5) + mthi s0, $ac0 + + lw $1, 16(s5) + lw s0, 20(s5) + lw s1, 24(s5) + lw s2, 28(s5) + lw s3, 32(s5) + lw s4, 36(s5) + + /* s5 is loaded later. */ + lw s6, 44(s5) + lw s7, 48(s5) + lw v0, 52(s5) + lw v1, 56(s5) + lw a0, 60(s5) + lw a1, 64(s5) + lw a2, 68(s5) + lw a3, 72(s5) + lw t0, 76(s5) + lw t1, 80(s5) + lw t2, 84(s5) + lw t3, 88(s5) + lw t4, 92(s5) + lw t5, 96(s5) + lw t6, 100(s5) + lw t7, 104(s5) + lw t8, 108(s5) + lw t9, 112(s5) + lw s8, 116(s5) + lw ra, 120(s5) + + /* Protect access to the k registers, and others. */ + di + ehb + + /* Set nesting back to zero. As the lowest priority interrupt this + interrupt cannot have nested. */ + la k0, uxInterruptNesting + sw zero, 0(k0) + + /* Switch back to use the real stack pointer. */ + add sp, zero, s5 + + /* Restore the real s5 value. */ + lw s5, 40(sp) + + /* Pop the status and epc values. */ + lw k1, portSTATUS_STACK_LOCATION(sp) + lw k0, portEPC_STACK_LOCATION(sp) + + /* Remove stack frame. */ + addiu sp, sp, portCONTEXT_SIZE + + #endif /* ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) */ + + /* Restore the status and EPC registers and return */ + mtc0 k1, _CP0_STATUS + mtc0 k0, _CP0_EPC + ehb + eret + nop + + .end vPortYieldISR + +/******************************************************************/ + +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + + .macro portFPUSetAndInc reg, dest + mtc1 \reg, \dest + cvt.d.w \dest, \dest + addiu \reg, \reg, 1 + .endm + + .set noreorder + .set noat + .section .text, code + .ent vPortInitialiseFPSCR + +vPortInitialiseFPSCR: + + /* Initialize the floating point status register in CP1. The initial + value is passed in a0. */ + ctc1 a0, $f31 + + /* Clear the FPU registers */ + addiu a0, zero, 0x0000 + portFPUSetAndInc a0, $f0 + portFPUSetAndInc a0, $f1 + portFPUSetAndInc a0, $f2 + portFPUSetAndInc a0, $f3 + portFPUSetAndInc a0, $f4 + portFPUSetAndInc a0, $f5 + portFPUSetAndInc a0, $f6 + portFPUSetAndInc a0, $f7 + portFPUSetAndInc a0, $f8 + portFPUSetAndInc a0, $f9 + portFPUSetAndInc a0, $f10 + portFPUSetAndInc a0, $f11 + portFPUSetAndInc a0, $f12 + portFPUSetAndInc a0, $f13 + portFPUSetAndInc a0, $f14 + portFPUSetAndInc a0, $f15 + portFPUSetAndInc a0, $f16 + portFPUSetAndInc a0, $f17 + portFPUSetAndInc a0, $f18 + portFPUSetAndInc a0, $f19 + portFPUSetAndInc a0, $f20 + portFPUSetAndInc a0, $f21 + portFPUSetAndInc a0, $f22 + portFPUSetAndInc a0, $f23 + portFPUSetAndInc a0, $f24 + portFPUSetAndInc a0, $f25 + portFPUSetAndInc a0, $f26 + portFPUSetAndInc a0, $f27 + portFPUSetAndInc a0, $f28 + portFPUSetAndInc a0, $f29 + portFPUSetAndInc a0, $f30 + portFPUSetAndInc a0, $f31 + + jr ra + nop + + .end vPortInitialiseFPSCR + +#endif /* ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) */ + +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + + /**********************************************************************/ + /* Test read back */ + /* a0 = address to store registers */ + + .set noreorder + .set noat + .section .text, code + .ent vPortFPUReadback + .global vPortFPUReadback + +vPortFPUReadback: + sdc1 $f0, 0(a0) + sdc1 $f1, 8(a0) + sdc1 $f2, 16(a0) + sdc1 $f3, 24(a0) + sdc1 $f4, 32(a0) + sdc1 $f5, 40(a0) + sdc1 $f6, 48(a0) + sdc1 $f7, 56(a0) + sdc1 $f8, 64(a0) + sdc1 $f9, 72(a0) + sdc1 $f10, 80(a0) + sdc1 $f11, 88(a0) + sdc1 $f12, 96(a0) + sdc1 $f13, 104(a0) + sdc1 $f14, 112(a0) + sdc1 $f15, 120(a0) + sdc1 $f16, 128(a0) + sdc1 $f17, 136(a0) + sdc1 $f18, 144(a0) + sdc1 $f19, 152(a0) + sdc1 $f20, 160(a0) + sdc1 $f21, 168(a0) + sdc1 $f22, 176(a0) + sdc1 $f23, 184(a0) + sdc1 $f24, 192(a0) + sdc1 $f25, 200(a0) + sdc1 $f26, 208(a0) + sdc1 $f27, 216(a0) + sdc1 $f28, 224(a0) + sdc1 $f29, 232(a0) + sdc1 $f30, 240(a0) + sdc1 $f31, 248(a0) + + jr ra + nop + + .end vPortFPUReadback + +#endif /* ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) */ + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/portmacro.h new file mode 100644 index 0000000..0630428 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/portmacro.h @@ -0,0 +1,213 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* System include files */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portIPL_SHIFT ( 10UL ) +/* Don't straddle the CEE bit. Interrupts calling FreeRTOS functions should +never have higher IPL bits set anyway. */ +#define portALL_IPL_BITS ( 0x7FUL << portIPL_SHIFT ) +#define portSW0_BIT ( 0x01 << 8 ) + +/* This clears the IPL bits, then sets them to +configMAX_SYSCALL_INTERRUPT_PRIORITY. An extra check is performed if +configASSERT() is defined to ensure an assertion handler does not inadvertently +attempt to lower the IPL when the call to assert was triggered because the IPL +value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY when an ISR +safe FreeRTOS API function was executed. ISR safe FreeRTOS API functions are +those that end in FromISR. FreeRTOS maintains a separate interrupt API to +ensure API function and interrupt entry is as fast and as simple as possible. */ +#ifdef configASSERT + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = _CP0_GET_STATUS(); \ + \ + /* Is the current IPL below configMAX_SYSCALL_INTERRUPT_PRIORITY? */ \ + if( ( ( ulStatus & portALL_IPL_BITS ) >> portIPL_SHIFT ) < configMAX_SYSCALL_INTERRUPT_PRIORITY ) \ + { \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } \ + } +#else /* configASSERT */ + #define portDISABLE_INTERRUPTS() \ + { \ + uint32_t ulStatus; \ + \ + /* Mask interrupts at and below the kernel interrupt priority. */ \ + ulStatus = _CP0_GET_STATUS(); \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ( ulStatus | ( configMAX_SYSCALL_INTERRUPT_PRIORITY << portIPL_SHIFT ) ) ); \ + } +#endif /* configASSERT */ + +#define portENABLE_INTERRUPTS() \ +{ \ +uint32_t ulStatus; \ + \ + /* Unmask all interrupts. */ \ + ulStatus = _CP0_GET_STATUS(); \ + ulStatus &= ~portALL_IPL_BITS; \ + _CP0_SET_STATUS( ulStatus ); \ +} + + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portCRITICAL_NESTING_IN_TCB 1 +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +extern UBaseType_t uxPortSetInterruptMaskFromISR(); +extern void vPortClearInterruptMaskFromISR( UBaseType_t ); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMaskFromISR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusRegister ) vPortClearInterruptMaskFromISR( uxSavedStatusRegister ) + +#if ( __mips_hard_float == 0 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + #error configUSE_TASK_FPU_SUPPORT can only be set to 1 when the part supports a hardware FPU module. +#endif + +#if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 ) + void vPortTaskUsesFPU( void ); + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() +#endif + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - _clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +#define portYIELD() \ +{ \ +uint32_t ulCause; \ + \ + /* Trigger software interrupt. */ \ + ulCause = _CP0_GET_CAUSE(); \ + ulCause |= portSW0_BIT; \ + _CP0_SET_CAUSE( ulCause ); \ +} + +extern volatile UBaseType_t uxInterruptNesting; +#define portASSERT_IF_IN_ISR() configASSERT( uxInterruptNesting == 0 ) + +#define portNOP() __asm volatile ( "nop" ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) { portYIELD(); } } while( 0 ) + +/* Required by the kernel aware debugger. */ +#ifdef __DEBUG + #define portREMOVE_STATIC_QUALIFIER +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/port.c new file mode 100644 index 0000000..6ea10b7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/port.c @@ -0,0 +1,700 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifdef __GNUC__ + #include "mmsystem.h" +#else + #pragma comment(lib, "winmm.lib") +#endif + +#define portMAX_INTERRUPTS ( ( uint32_t ) sizeof( uint32_t ) * 8UL ) /* The number of bits in an uint32_t. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* The priorities at which the various components of the simulation execute. */ +#define portDELETE_SELF_THREAD_PRIORITY THREAD_PRIORITY_TIME_CRITICAL /* Must be highest. */ +#define portSIMULATED_INTERRUPTS_THREAD_PRIORITY THREAD_PRIORITY_TIME_CRITICAL +#define portSIMULATED_TIMER_THREAD_PRIORITY THREAD_PRIORITY_HIGHEST +#define portTASK_THREAD_PRIORITY THREAD_PRIORITY_ABOVE_NORMAL + +/* + * Created as a high priority thread, this function uses a timer to simulate + * a tick interrupt being generated on an embedded target. In this Windows + * environment the timer does not achieve anything approaching real time + * performance though. + */ +static DWORD WINAPI prvSimulatedPeripheralTimer( LPVOID lpParameter ); + +/* + * Process all the simulated interrupts - each represented by a bit in + * ulPendingInterrupts variable. + */ +static void prvProcessSimulatedInterrupts( void ); + +/* + * Interrupt handlers used by the kernel itself. These are executed from the + * simulated interrupt handler thread. + */ +static uint32_t prvProcessYieldInterrupt( void ); +static uint32_t prvProcessTickInterrupt( void ); + +/* + * Exiting a critical section will cause the calling task to block on yield + * event to wait for an interrupt to process if an interrupt was pended while + * inside the critical section. This variable protects against a recursive + * attempt to obtain pvInterruptEventMutex if a critical section is used inside + * an interrupt handler itself. + */ +volatile BaseType_t xInsideInterrupt = pdFALSE; + +/* + * Called when the process exits to let Windows know the high timer resolution + * is no longer required. + */ +static BOOL WINAPI prvEndProcess( DWORD dwCtrlType ); + +/*-----------------------------------------------------------*/ + +/* The WIN32 simulator runs each task in a thread. The context switching is +managed by the threads, so the task stack does not have to be managed directly, +although the task stack is still used to hold an xThreadState structure this is +the only thing it will ever hold. The structure indirectly maps the task handle +to a thread handle. */ +typedef struct +{ + /* Handle of the thread that executes the task. */ + void *pvThread; + + /* Event used to make sure the thread does not execute past a yield point + between the call to SuspendThread() to suspend the thread and the + asynchronous SuspendThread() operation actually being performed. */ + void *pvYieldEvent; +} ThreadState_t; + +/* Simulated interrupts waiting to be processed. This is a bit mask where each +bit represents one interrupt, so a maximum of 32 interrupts can be simulated. */ +static volatile uint32_t ulPendingInterrupts = 0UL; + +/* An event used to inform the simulated interrupt processing thread (a high +priority thread that simulated interrupt processing) that an interrupt is +pending. */ +static void *pvInterruptEvent = NULL; + +/* Mutex used to protect all the simulated interrupt variables that are accessed +by multiple threads. */ +static void *pvInterruptEventMutex = NULL; + +/* The critical nesting count for the currently executing task. This is +initialised to a non-zero value so interrupts do not become enabled during +the initialisation phase. As each task has its own critical nesting value +ulCriticalNesting will get set to zero when the first task runs. This +initialisation is probably not critical in this simulated environment as the +simulated interrupt handlers do not get created until the FreeRTOS scheduler is +started anyway. */ +static volatile uint32_t ulCriticalNesting = 9999UL; + +/* Handlers for all the simulated software interrupts. The first two positions +are used for the Yield and Tick interrupts so are handled slightly differently, +all the other interrupts can be user defined. */ +static uint32_t (*ulIsrHandler[ portMAX_INTERRUPTS ])( void ) = { 0 }; + +/* Pointer to the TCB of the currently executing task. */ +extern void * volatile pxCurrentTCB; + +/* Used to ensure nothing is processed during the startup sequence. */ +static BaseType_t xPortRunning = pdFALSE; + +/*-----------------------------------------------------------*/ + +static DWORD WINAPI prvSimulatedPeripheralTimer( LPVOID lpParameter ) +{ +TickType_t xMinimumWindowsBlockTime; +TIMECAPS xTimeCaps; + + /* Set the timer resolution to the maximum possible. */ + if( timeGetDevCaps( &xTimeCaps, sizeof( xTimeCaps ) ) == MMSYSERR_NOERROR ) + { + xMinimumWindowsBlockTime = ( TickType_t ) xTimeCaps.wPeriodMin; + timeBeginPeriod( xTimeCaps.wPeriodMin ); + + /* Register an exit handler so the timeBeginPeriod() function can be + matched with a timeEndPeriod() when the application exits. */ + SetConsoleCtrlHandler( prvEndProcess, TRUE ); + } + else + { + xMinimumWindowsBlockTime = ( TickType_t ) 20; + } + + /* Just to prevent compiler warnings. */ + ( void ) lpParameter; + + for( ;; ) + { + /* Wait until the timer expires and we can access the simulated interrupt + variables. *NOTE* this is not a 'real time' way of generating tick + events as the next wake time should be relative to the previous wake + time, not the time that Sleep() is called. It is done this way to + prevent overruns in this very non real time simulated/emulated + environment. */ + if( portTICK_PERIOD_MS < xMinimumWindowsBlockTime ) + { + Sleep( xMinimumWindowsBlockTime ); + } + else + { + Sleep( portTICK_PERIOD_MS ); + } + + configASSERT( xPortRunning ); + + /* Can't proceed if in a critical section as pvInterruptEventMutex won't + be available. */ + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + + /* The timer has expired, generate the simulated tick event. */ + ulPendingInterrupts |= ( 1 << portINTERRUPT_TICK ); + + /* The interrupt is now pending - notify the simulated interrupt + handler thread. Must be outside of a critical section to get here so + the handler thread can execute immediately pvInterruptEventMutex is + released. */ + configASSERT( ulCriticalNesting == 0UL ); + SetEvent( pvInterruptEvent ); + + /* Give back the mutex so the simulated interrupt handler unblocks + and can access the interrupt handler variables. */ + ReleaseMutex( pvInterruptEventMutex ); + } + + #ifdef __GNUC__ + /* Should never reach here - MingW complains if you leave this line out, + MSVC complains if you put it in. */ + return 0; + #endif +} +/*-----------------------------------------------------------*/ + +static BOOL WINAPI prvEndProcess( DWORD dwCtrlType ) +{ +TIMECAPS xTimeCaps; + + ( void ) dwCtrlType; + + if( timeGetDevCaps( &xTimeCaps, sizeof( xTimeCaps ) ) == MMSYSERR_NOERROR ) + { + /* Match the call to timeBeginPeriod( xTimeCaps.wPeriodMin ) made when + the process started with a timeEndPeriod() as the process exits. */ + timeEndPeriod( xTimeCaps.wPeriodMin ); + } + + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +ThreadState_t *pxThreadState = NULL; +int8_t *pcTopOfStack = ( int8_t * ) pxTopOfStack; +const SIZE_T xStackSize = 1024; /* Set the size to a small number which will get rounded up to the minimum possible. */ + + /* In this simulated case a stack is not initialised, but instead a thread + is created that will execute the task being created. The thread handles + the context switching itself. The ThreadState_t object is placed onto + the stack that was created for the task - so the stack buffer is still + used, just not in the conventional way. It will not be used for anything + other than holding this structure. */ + pxThreadState = ( ThreadState_t * ) ( pcTopOfStack - sizeof( ThreadState_t ) ); + + /* Create the event used to prevent the thread from executing past its yield + point if the SuspendThread() call that suspends the thread does not take + effect immediately (it is an asynchronous call). */ + pxThreadState->pvYieldEvent = CreateEvent( NULL, /* Default security attributes. */ + FALSE, /* Auto reset. */ + FALSE, /* Start not signalled. */ + NULL );/* No name. */ + + /* Create the thread itself. */ + pxThreadState->pvThread = CreateThread( NULL, xStackSize, ( LPTHREAD_START_ROUTINE ) pxCode, pvParameters, CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION, NULL ); + configASSERT( pxThreadState->pvThread ); /* See comment where TerminateThread() is called. */ + SetThreadAffinityMask( pxThreadState->pvThread, 0x01 ); + SetThreadPriorityBoost( pxThreadState->pvThread, TRUE ); + SetThreadPriority( pxThreadState->pvThread, portTASK_THREAD_PRIORITY ); + + return ( StackType_t * ) pxThreadState; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +void *pvHandle = NULL; +int32_t lSuccess; +ThreadState_t *pxThreadState = NULL; +SYSTEM_INFO xSystemInfo; + + /* This port runs windows threads with extremely high priority. All the + threads execute on the same core - to prevent locking up the host only start + if the host has multiple cores. */ + GetSystemInfo( &xSystemInfo ); + if( xSystemInfo.dwNumberOfProcessors <= 1 ) + { + printf( "This version of the FreeRTOS Windows port can only be used on multi-core hosts.\r\n" ); + lSuccess = pdFAIL; + } + else + { + lSuccess = pdPASS; + + /* The highest priority class is used to [try to] prevent other Windows + activity interfering with FreeRTOS timing too much. */ + if( SetPriorityClass( GetCurrentProcess(), REALTIME_PRIORITY_CLASS ) == 0 ) + { + printf( "SetPriorityClass() failed\r\n" ); + } + + /* Install the interrupt handlers used by the scheduler itself. */ + vPortSetInterruptHandler( portINTERRUPT_YIELD, prvProcessYieldInterrupt ); + vPortSetInterruptHandler( portINTERRUPT_TICK, prvProcessTickInterrupt ); + + /* Create the events and mutexes that are used to synchronise all the + threads. */ + pvInterruptEventMutex = CreateMutex( NULL, FALSE, NULL ); + pvInterruptEvent = CreateEvent( NULL, FALSE, FALSE, NULL ); + + if( ( pvInterruptEventMutex == NULL ) || ( pvInterruptEvent == NULL ) ) + { + lSuccess = pdFAIL; + } + + /* Set the priority of this thread such that it is above the priority of + the threads that run tasks. This higher priority is required to ensure + simulated interrupts take priority over tasks. */ + pvHandle = GetCurrentThread(); + if( pvHandle == NULL ) + { + lSuccess = pdFAIL; + } + } + + if( lSuccess == pdPASS ) + { + if( SetThreadPriority( pvHandle, portSIMULATED_INTERRUPTS_THREAD_PRIORITY ) == 0 ) + { + lSuccess = pdFAIL; + } + SetThreadPriorityBoost( pvHandle, TRUE ); + SetThreadAffinityMask( pvHandle, 0x01 ); + } + + if( lSuccess == pdPASS ) + { + /* Start the thread that simulates the timer peripheral to generate + tick interrupts. The priority is set below that of the simulated + interrupt handler so the interrupt event mutex is used for the + handshake / overrun protection. */ + pvHandle = CreateThread( NULL, 0, prvSimulatedPeripheralTimer, NULL, CREATE_SUSPENDED, NULL ); + if( pvHandle != NULL ) + { + SetThreadPriority( pvHandle, portSIMULATED_TIMER_THREAD_PRIORITY ); + SetThreadPriorityBoost( pvHandle, TRUE ); + SetThreadAffinityMask( pvHandle, 0x01 ); + ResumeThread( pvHandle ); + } + + /* Start the highest priority task by obtaining its associated thread + state structure, in which is stored the thread handle. */ + pxThreadState = ( ThreadState_t * ) *( ( size_t * ) pxCurrentTCB ); + ulCriticalNesting = portNO_CRITICAL_NESTING; + + /* Start the first task. */ + ResumeThread( pxThreadState->pvThread ); + + /* Handle all simulated interrupts - including yield requests and + simulated ticks. */ + prvProcessSimulatedInterrupts(); + } + + /* Would not expect to return from prvProcessSimulatedInterrupts(), so should + not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +static uint32_t prvProcessYieldInterrupt( void ) +{ + /* Always return true as this is a yield. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +static uint32_t prvProcessTickInterrupt( void ) +{ +uint32_t ulSwitchRequired; + + /* Process the tick itself. */ + configASSERT( xPortRunning ); + ulSwitchRequired = ( uint32_t ) xTaskIncrementTick(); + + return ulSwitchRequired; +} +/*-----------------------------------------------------------*/ + +static void prvProcessSimulatedInterrupts( void ) +{ +uint32_t ulSwitchRequired, i; +ThreadState_t *pxThreadState; +void *pvObjectList[ 2 ]; +CONTEXT xContext; + + /* Going to block on the mutex that ensured exclusive access to the simulated + interrupt objects, and the event that signals that a simulated interrupt + should be processed. */ + pvObjectList[ 0 ] = pvInterruptEventMutex; + pvObjectList[ 1 ] = pvInterruptEvent; + + /* Create a pending tick to ensure the first task is started as soon as + this thread pends. */ + ulPendingInterrupts |= ( 1 << portINTERRUPT_TICK ); + SetEvent( pvInterruptEvent ); + + xPortRunning = pdTRUE; + + for(;;) + { + xInsideInterrupt = pdFALSE; + WaitForMultipleObjects( sizeof( pvObjectList ) / sizeof( void * ), pvObjectList, TRUE, INFINITE ); + + /* Cannot be in a critical section to get here. Tasks that exit a + critical section will block on a yield mutex to wait for an interrupt to + process if an interrupt was set pending while the task was inside the + critical section. xInsideInterrupt prevents interrupts that contain + critical sections from doing the same. */ + xInsideInterrupt = pdTRUE; + + /* Used to indicate whether the simulated interrupt processing has + necessitated a context switch to another task/thread. */ + ulSwitchRequired = pdFALSE; + + /* For each interrupt we are interested in processing, each of which is + represented by a bit in the 32bit ulPendingInterrupts variable. */ + for( i = 0; i < portMAX_INTERRUPTS; i++ ) + { + /* Is the simulated interrupt pending? */ + if( ( ulPendingInterrupts & ( 1UL << i ) ) != 0 ) + { + /* Is a handler installed? */ + if( ulIsrHandler[ i ] != NULL ) + { + /* Run the actual handler. Handlers return pdTRUE if they + necessitate a context switch. */ + if( ulIsrHandler[ i ]() != pdFALSE ) + { + /* A bit mask is used purely to help debugging. */ + ulSwitchRequired |= ( 1 << i ); + } + } + + /* Clear the interrupt pending bit. */ + ulPendingInterrupts &= ~( 1UL << i ); + } + } + + if( ulSwitchRequired != pdFALSE ) + { + void *pvOldCurrentTCB; + + pvOldCurrentTCB = pxCurrentTCB; + + /* Select the next task to run. */ + vTaskSwitchContext(); + + /* If the task selected to enter the running state is not the task + that is already in the running state. */ + if( pvOldCurrentTCB != pxCurrentTCB ) + { + /* Suspend the old thread. In the cases where the (simulated) + interrupt is asynchronous (tick event swapping a task out rather + than a task blocking or yielding) it doesn't matter if the + 'suspend' operation doesn't take effect immediately - if it + doesn't it would just be like the interrupt occurring slightly + later. In cases where the yield was caused by a task blocking + or yielding then the task will block on a yield event after the + yield operation in case the 'suspend' operation doesn't take + effect immediately. */ + pxThreadState = ( ThreadState_t *) *( ( size_t * ) pvOldCurrentTCB ); + SuspendThread( pxThreadState->pvThread ); + + /* Ensure the thread is actually suspended by performing a + synchronous operation that can only complete when the thread is + actually suspended. The below code asks for dummy register + data. Experimentation shows that these two lines don't appear + to do anything now, but according to + https://devblogs.microsoft.com/oldnewthing/20150205-00/?p=44743 + they do - so as they do not harm (slight run-time hit). */ + xContext.ContextFlags = CONTEXT_INTEGER; + ( void ) GetThreadContext( pxThreadState->pvThread, &xContext ); + + /* Obtain the state of the task now selected to enter the + Running state. */ + pxThreadState = ( ThreadState_t * ) ( *( size_t *) pxCurrentTCB ); + + /* pxThreadState->pvThread can be NULL if the task deleted + itself - but a deleted task should never be resumed here. */ + configASSERT( pxThreadState->pvThread != NULL ); + ResumeThread( pxThreadState->pvThread ); + } + } + + /* If the thread that is about to be resumed stopped running + because it yielded then it will wait on an event when it resumed + (to ensure it does not continue running after the call to + SuspendThread() above as SuspendThread() is asynchronous). + Signal the event to ensure the thread can proceed now it is + valid for it to do so. Signaling the event is benign in the case that + the task was switched out asynchronously by an interrupt as the event + is reset before the task blocks on it. */ + pxThreadState = ( ThreadState_t * ) ( *( size_t *) pxCurrentTCB ); + SetEvent( pxThreadState->pvYieldEvent ); + ReleaseMutex( pvInterruptEventMutex ); + } +} +/*-----------------------------------------------------------*/ + +void vPortDeleteThread( void *pvTaskToDelete ) +{ +ThreadState_t *pxThreadState; +uint32_t ulErrorCode; + + /* Remove compiler warnings if configASSERT() is not defined. */ + ( void ) ulErrorCode; + + /* Find the handle of the thread being deleted. */ + pxThreadState = ( ThreadState_t * ) ( *( size_t *) pvTaskToDelete ); + + /* Check that the thread is still valid, it might have been closed by + vPortCloseRunningThread() - which will be the case if the task associated + with the thread originally deleted itself rather than being deleted by a + different task. */ + if( pxThreadState->pvThread != NULL ) + { + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + + /* !!! This is not a nice way to terminate a thread, and will eventually + result in resources being depleted if tasks frequently delete other + tasks (rather than deleting themselves) as the task stacks will not be + freed. */ + ulErrorCode = TerminateThread( pxThreadState->pvThread, 0 ); + configASSERT( ulErrorCode ); + + ulErrorCode = CloseHandle( pxThreadState->pvThread ); + configASSERT( ulErrorCode ); + + ReleaseMutex( pvInterruptEventMutex ); + } +} +/*-----------------------------------------------------------*/ + +void vPortCloseRunningThread( void *pvTaskToDelete, volatile BaseType_t *pxPendYield ) +{ +ThreadState_t *pxThreadState; +void *pvThread; +uint32_t ulErrorCode; + + /* Remove compiler warnings if configASSERT() is not defined. */ + ( void ) ulErrorCode; + + /* Find the handle of the thread being deleted. */ + pxThreadState = ( ThreadState_t * ) ( *( size_t *) pvTaskToDelete ); + pvThread = pxThreadState->pvThread; + + /* Raise the Windows priority of the thread to ensure the FreeRTOS scheduler + does not run and swap it out before it is closed. If that were to happen + the thread would never run again and effectively be a thread handle and + memory leak. */ + SetThreadPriority( pvThread, portDELETE_SELF_THREAD_PRIORITY ); + + /* This function will not return, therefore a yield is set as pending to + ensure a context switch occurs away from this thread on the next tick. */ + *pxPendYield = pdTRUE; + + /* Mark the thread associated with this task as invalid so + vPortDeleteThread() does not try to terminate it. */ + pxThreadState->pvThread = NULL; + + /* Close the thread. */ + ulErrorCode = CloseHandle( pvThread ); + configASSERT( ulErrorCode ); + + /* This is called from a critical section, which must be exited before the + thread stops. */ + taskEXIT_CRITICAL(); + CloseHandle( pxThreadState->pvYieldEvent ); + ExitThread( 0 ); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + exit( 0 ); +} +/*-----------------------------------------------------------*/ + +void vPortGenerateSimulatedInterrupt( uint32_t ulInterruptNumber ) +{ +ThreadState_t *pxThreadState = ( ThreadState_t *) *( ( size_t * ) pxCurrentTCB ); + + configASSERT( xPortRunning ); + + if( ( ulInterruptNumber < portMAX_INTERRUPTS ) && ( pvInterruptEventMutex != NULL ) ) + { + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + ulPendingInterrupts |= ( 1 << ulInterruptNumber ); + + /* The simulated interrupt is now held pending, but don't actually + process it yet if this call is within a critical section. It is + possible for this to be in a critical section as calls to wait for + mutexes are accumulative. If in a critical section then the event + will get set when the critical section nesting count is wound back + down to zero. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + SetEvent( pvInterruptEvent ); + + /* Going to wait for an event - make sure the event is not already + signaled. */ + ResetEvent( pxThreadState->pvYieldEvent ); + } + + ReleaseMutex( pvInterruptEventMutex ); + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* An interrupt was pended so ensure to block to allow it to + execute. In most cases the (simulated) interrupt will have + executed before the next line is reached - so this is just to make + sure. */ + WaitForSingleObject( pxThreadState->pvYieldEvent, INFINITE ); + } + } +} +/*-----------------------------------------------------------*/ + +void vPortSetInterruptHandler( uint32_t ulInterruptNumber, uint32_t (*pvHandler)( void ) ) +{ + if( ulInterruptNumber < portMAX_INTERRUPTS ) + { + if( pvInterruptEventMutex != NULL ) + { + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + ulIsrHandler[ ulInterruptNumber ] = pvHandler; + ReleaseMutex( pvInterruptEventMutex ); + } + else + { + ulIsrHandler[ ulInterruptNumber ] = pvHandler; + } + } +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( xPortRunning == pdTRUE ) + { + /* The interrupt event mutex is held for the entire critical section, + effectively disabling (simulated) interrupts. */ + WaitForSingleObject( pvInterruptEventMutex, INFINITE ); + } + + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +int32_t lMutexNeedsReleasing; + + /* The interrupt event mutex should already be held by this thread as it was + obtained on entry to the critical section. */ + lMutexNeedsReleasing = pdTRUE; + + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + ulCriticalNesting--; + + /* Don't need to wait for any pending interrupts to execute if the + critical section was exited from inside an interrupt. */ + if( ( ulCriticalNesting == portNO_CRITICAL_NESTING ) && ( xInsideInterrupt == pdFALSE ) ) + { + /* Were any interrupts set to pending while interrupts were + (simulated) disabled? */ + if( ulPendingInterrupts != 0UL ) + { + ThreadState_t *pxThreadState = ( ThreadState_t *) *( ( size_t * ) pxCurrentTCB ); + + configASSERT( xPortRunning ); + + /* The interrupt won't actually executed until + pvInterruptEventMutex is released as it waits on both + pvInterruptEventMutex and pvInterruptEvent. + pvInterruptEvent is only set when the simulated + interrupt is pended if the interrupt is pended + from outside a critical section - hence it is set + here. */ + SetEvent( pvInterruptEvent ); + /* The calling task is going to wait for an event to ensure the + interrupt that is pending executes immediately after the + critical section is exited - so make sure the event is not + already signaled. */ + ResetEvent( pxThreadState->pvYieldEvent ); + + /* Mutex will be released now so the (simulated) interrupt can + execute, so does not require releasing on function exit. */ + lMutexNeedsReleasing = pdFALSE; + ReleaseMutex( pvInterruptEventMutex ); + WaitForSingleObject( pxThreadState->pvYieldEvent, INFINITE ); + } + } + } + + if( pvInterruptEventMutex != NULL ) + { + if( lMutexNeedsReleasing == pdTRUE ) + { + configASSERT( xPortRunning ); + ReleaseMutex( pvInterruptEventMutex ); + } + } +} +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/portmacro.h new file mode 100644 index 0000000..fbd4001 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/portmacro.h @@ -0,0 +1,163 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include +#include + +/****************************************************************************** + Defines +******************************************************************************/ +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE size_t +#define portBASE_TYPE long +#define portPOINTER_SIZE_TYPE size_t + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32/64-bit tick type on a 32/64-bit architecture, so reads of the tick + count do not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portINLINE __inline + +#if defined( __x86_64__) || defined( _M_X64 ) + #define portBYTE_ALIGNMENT 8 +#else + #define portBYTE_ALIGNMENT 4 +#endif + +#define portYIELD() vPortGenerateSimulatedInterrupt( portINTERRUPT_YIELD ) + + +extern volatile BaseType_t xInsideInterrupt; +#define portSOFTWARE_BARRIER() while( xInsideInterrupt != pdFALSE ) + + +/* Simulated interrupts return pdFALSE if no context switch should be performed, +or a non-zero number if a context switch should be performed. */ +#define portYIELD_FROM_ISR( x ) ( void ) x +#define portEND_SWITCHING_ISR( x ) portYIELD_FROM_ISR( ( x ) ) + +void vPortCloseRunningThread( void *pvTaskToDelete, volatile BaseType_t *pxPendYield ); +void vPortDeleteThread( void *pvThreadToDelete ); +#define portCLEAN_UP_TCB( pxTCB ) vPortDeleteThread( pxTCB ) +#define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxPendYield ) vPortCloseRunningThread( ( pvTaskToDelete ), ( pxPendYield ) ) +#define portDISABLE_INTERRUPTS() vPortEnterCritical() +#define portENABLE_INTERRUPTS() vPortExitCritical() + +/* Critical section handling. */ +void vPortEnterCritical( void ); +void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + + /*-----------------------------------------------------------*/ + + #ifdef __GNUC__ + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) \ + __asm volatile( "bsr %1, %0\n\t" \ + :"=r"(uxTopPriority) : "rm"(uxReadyPriorities) : "cc" ) + #else + /* BitScanReverse returns the bit position of the most significant '1' + in the word. */ + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) _BitScanReverse( ( DWORD * ) &( uxTopPriority ), ( uxReadyPriorities ) ) + #endif /* __GNUC__ */ + +#endif /* taskRECORD_READY_PRIORITY */ + +#ifndef __GNUC__ + __pragma( warning( disable:4211 ) ) /* Nonstandard extension used, as extern is only nonstandard to MSVC. */ +#endif + + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#define portINTERRUPT_YIELD ( 0UL ) +#define portINTERRUPT_TICK ( 1UL ) + +/* + * Raise a simulated interrupt represented by the bit mask in ulInterruptMask. + * Each bit can be used to represent an individual interrupt - with the first + * two bits being used for the Yield and Tick interrupts respectively. +*/ +void vPortGenerateSimulatedInterrupt( uint32_t ulInterruptNumber ); + +/* + * Install an interrupt handler to be called by the simulated interrupt handler + * thread. The interrupt number must be above any used by the kernel itself + * (at the time of writing the kernel was using interrupt numbers 0, 1, and 2 + * as defined above). The number must also be lower than 32. + * + * Interrupt handler functions must return a non-zero value if executing the + * handler resulted in a task switch being required. + */ +void vPortSetInterruptHandler( uint32_t ulInterruptNumber, uint32_t (*pvHandler)( void ) ); + +#endif + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/ReadMe.url b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/ReadMe.url new file mode 100644 index 0000000..28c9937 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/ReadMe.url @@ -0,0 +1,5 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,2 +[InternetShortcut] +URL=https://www.FreeRTOS.org/a00111.html +IDList= diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_1.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_1.c new file mode 100644 index 0000000..43a55f9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_1.c @@ -0,0 +1,152 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/* Index into the ucHeap array. */ +static size_t xNextFreeByte = ( size_t ) 0; + +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + void * pvReturn = NULL; + static uint8_t * pucAlignedHeap = NULL; + + /* Ensure that blocks are always aligned. */ + #if ( portBYTE_ALIGNMENT != 1 ) + { + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. Check for overflow. */ + if( ( xWantedSize + ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ) ) > xWantedSize ) + { + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + else + { + xWantedSize = 0; + } + } + } + #endif /* if ( portBYTE_ALIGNMENT != 1 ) */ + + vTaskSuspendAll(); + { + if( pucAlignedHeap == NULL ) + { + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) & ucHeap[ portBYTE_ALIGNMENT - 1 ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + } + + /* Check there is enough room left for the allocation and. */ + if( ( xWantedSize > 0 ) && /* valid size */ + ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) ) /* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + * block. */ + pvReturn = pucAlignedHeap + xNextFreeByte; + xNextFreeByte += xWantedSize; + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and + * heap_4.c for alternative implementations, and the memory management pages of + * https://www.FreeRTOS.org for more information. */ + ( void ) pv; + + /* Force an assert as it is invalid to call this function. */ + configASSERT( pv == NULL ); +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return( configADJUSTED_HEAP_SIZE - xNextFreeByte ); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_2.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_2.c new file mode 100644 index 0000000..497295d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_2.c @@ -0,0 +1,362 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that permits + * allocated blocks to be freed, but does not combine adjacent free blocks + * into a single larger block (and so will fragment memory). See heap_4.c for + * an equivalent that does combine adjacent blocks into single larger blocks. + * + * See heap_1.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +#ifndef configHEAP_CLEAR_MEMORY_ON_FREE + #define configHEAP_CLEAR_MEMORY_ON_FREE 0 +#endif + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Max value that fits in a size_t type. */ +#define heapSIZE_MAX ( ~( ( size_t ) 0 ) ) + +/* Check if multiplying a and b will result in overflow. */ +#define heapMULTIPLY_WILL_OVERFLOW( a, b ) ( ( ( a ) > 0 ) && ( ( b ) > ( heapSIZE_MAX / ( a ) ) ) ) + +/* Check if adding a and b will result in overflow. */ +#define heapADD_WILL_OVERFLOW( a, b ) ( ( a ) > ( heapSIZE_MAX - ( b ) ) ) + +/* MSB of the xBlockSize member of an BlockLink_t structure is used to track + * the allocation status of a block. When MSB of the xBlockSize member of + * an BlockLink_t structure is set then the block belongs to the application. + * When the bit is free the block is still part of the free heap space. */ +#define heapBLOCK_ALLOCATED_BITMASK ( ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ) ) +#define heapBLOCK_SIZE_IS_VALID( xBlockSize ) ( ( ( xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) == 0 ) +#define heapBLOCK_IS_ALLOCATED( pxBlock ) ( ( ( pxBlock->xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) != 0 ) +#define heapALLOCATE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) |= heapBLOCK_ALLOCATED_BITMASK ) +#define heapFREE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) &= ~heapBLOCK_ALLOCATED_BITMASK ) + +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + PRIVILEGED_DATA static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + + +/* Define the linked list structure. This is used to link free blocks in order + * of their size. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + + +static const uint16_t heapSTRUCT_SIZE = ( ( sizeof( BlockLink_t ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ) ); +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) ) + +/* Create a couple of list links to mark the start and end of the list. */ +PRIVILEGED_DATA static BlockLink_t xStart, xEnd; + +/* Keeps track of the number of free bytes remaining, but says nothing about + * fragmentation. */ +PRIVILEGED_DATA static size_t xFreeBytesRemaining = configADJUSTED_HEAP_SIZE; + +/*-----------------------------------------------------------*/ + +/* + * Initialises the heap structures before their first use. + */ +static void prvHeapInit( void ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ + +/* + * Insert a block into the list of free blocks - which is ordered by size of + * the block. Small blocks at the start of the list and large blocks at the end + * of the list. + */ +#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ + { \ + BlockLink_t * pxIterator; \ + size_t xBlockSize; \ + \ + xBlockSize = pxBlockToInsert->xBlockSize; \ + \ + /* Iterate through the list until a block is found that has a larger size */ \ + /* than the block we are inserting. */ \ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \ + { \ + /* There is nothing to do here - just iterate to the correct position. */ \ + } \ + \ + /* Update the list to include the block being inserted in the correct */ \ + /* position. */ \ + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \ + pxIterator->pxNextFreeBlock = pxBlockToInsert; \ + } +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + PRIVILEGED_DATA static BaseType_t xHeapHasBeenInitialised = pdFALSE; + void * pvReturn = NULL; + size_t xAdditionalRequiredSize; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( xHeapHasBeenInitialised == pdFALSE ) + { + prvHeapInit(); + xHeapHasBeenInitialised = pdTRUE; + } + + if( xWantedSize > 0 ) + { + /* The wanted size must be increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. Some + * additional increment may also be needed for alignment. */ + xAdditionalRequiredSize = heapSTRUCT_SIZE + portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ); + + if( heapADD_WILL_OVERFLOW( xWantedSize, xAdditionalRequiredSize ) == 0 ) + { + xWantedSize += xAdditionalRequiredSize; + } + else + { + xWantedSize = 0; + } + } + + /* Check the block size we are trying to allocate is not so large that the + * top bit is set. The top bit of the block size member of the BlockLink_t + * structure is used to determine who owns the block - the application or + * the kernel, so it must be free. */ + if( heapBLOCK_SIZE_IS_VALID( xWantedSize ) != 0 ) + { + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Blocks are stored in byte order - traverse the list from the start + * (smallest) block until one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If we found the end marker then a block of adequate size was not found. */ + if( pxBlock != &xEnd ) + { + /* Return the memory space - jumping over the BlockLink_t structure + * at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); + + /* This block is being returned for use so must be taken out of the + * list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new block + * following the number of bytes requested. The void cast is + * used to prevent byte alignment warnings from the compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the single + * block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + /* The block is being returned - it is allocated and owned + * by the application and has no "next" block. */ + heapALLOCATE_BLOCK( pxBlock ); + pxBlock->pxNextFreeBlock = NULL; + } + } + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= heapSTRUCT_SIZE; + + /* This unexpected casting is to keep some compilers from issuing + * byte alignment warnings. */ + pxLink = ( void * ) puc; + + configASSERT( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + heapFREE_BLOCK( pxLink ); + #if ( configHEAP_CLEAR_MEMORY_ON_FREE == 1 ) + { + ( void ) memset( puc + heapSTRUCT_SIZE, 0, pxLink->xBlockSize - heapSTRUCT_SIZE ); + } + #endif + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + } + ( void ) xTaskResumeAll(); + } + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +void * pvPortCalloc( size_t xNum, + size_t xSize ) +{ + void * pv = NULL; + + if( heapMULTIPLY_WILL_OVERFLOW( xNum, xSize ) == 0 ) + { + pv = pvPortMalloc( xNum * xSize ); + + if( pv != NULL ) + { + ( void ) memset( pv, 0, xNum * xSize ); + } + } + + return pv; +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) & ucHeap[ portBYTE_ALIGNMENT - 1 ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* xEnd is used to mark the end of the list of free blocks. */ + xEnd.xBlockSize = configADJUSTED_HEAP_SIZE; + xEnd.pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space. */ + pxFirstFreeBlock = ( BlockLink_t * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = configADJUSTED_HEAP_SIZE; + pxFirstFreeBlock->pxNextFreeBlock = &xEnd; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_3.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_3.c new file mode 100644 index 0000000..89c011a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_3.c @@ -0,0 +1,94 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* + * Implementation of pvPortMalloc() and vPortFree() that relies on the + * compilers own malloc() and free() implementations. + * + * This file can only be used if the linker is configured to to generate + * a heap memory area. + * + * See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ + +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + void * pvReturn; + + vTaskSuspendAll(); + { + pvReturn = malloc( xWantedSize ); + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + if( pv != NULL ) + { + vTaskSuspendAll(); + { + free( pv ); + traceFREE( pv, 0 ); + } + ( void ) xTaskResumeAll(); + } +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_4.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_4.c new file mode 100644 index 0000000..7748f50 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_4.c @@ -0,0 +1,537 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that combines + * (coalescences) adjacent memory blocks as they are freed, and in so doing + * limits memory fragmentation. + * + * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the + * memory management pages of https://www.FreeRTOS.org for more information. + */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +#ifndef configHEAP_CLEAR_MEMORY_ON_FREE + #define configHEAP_CLEAR_MEMORY_ON_FREE 0 +#endif + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Max value that fits in a size_t type. */ +#define heapSIZE_MAX ( ~( ( size_t ) 0 ) ) + +/* Check if multiplying a and b will result in overflow. */ +#define heapMULTIPLY_WILL_OVERFLOW( a, b ) ( ( ( a ) > 0 ) && ( ( b ) > ( heapSIZE_MAX / ( a ) ) ) ) + +/* Check if adding a and b will result in overflow. */ +#define heapADD_WILL_OVERFLOW( a, b ) ( ( a ) > ( heapSIZE_MAX - ( b ) ) ) + +/* MSB of the xBlockSize member of an BlockLink_t structure is used to track + * the allocation status of a block. When MSB of the xBlockSize member of + * an BlockLink_t structure is set then the block belongs to the application. + * When the bit is free the block is still part of the free heap space. */ +#define heapBLOCK_ALLOCATED_BITMASK ( ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ) ) +#define heapBLOCK_SIZE_IS_VALID( xBlockSize ) ( ( ( xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) == 0 ) +#define heapBLOCK_IS_ALLOCATED( pxBlock ) ( ( ( pxBlock->xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) != 0 ) +#define heapALLOCATE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) |= heapBLOCK_ALLOCATED_BITMASK ) +#define heapFREE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) &= ~heapBLOCK_ALLOCATED_BITMASK ) + +/*-----------------------------------------------------------*/ + +/* Allocate the memory for the heap. */ +#if ( configAPPLICATION_ALLOCATED_HEAP == 1 ) + +/* The application writer has already defined the array used for the RTOS +* heap - probably so it can be placed in a special segment or address. */ + extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#else + PRIVILEGED_DATA static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]; +#endif /* configAPPLICATION_ALLOCATED_HEAP */ + +/* Define the linked list structure. This is used to link free blocks in order + * of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) PRIVILEGED_FUNCTION; + +/* + * Called automatically to setup the required heap structures the first time + * pvPortMalloc() is called. + */ +static void prvHeapInit( void ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory + * block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +PRIVILEGED_DATA static BlockLink_t xStart; +PRIVILEGED_DATA static BlockLink_t * pxEnd = NULL; + +/* Keeps track of the number of calls to allocate and free memory as well as the + * number of free bytes remaining, but says nothing about fragmentation. */ +PRIVILEGED_DATA static size_t xFreeBytesRemaining = 0U; +PRIVILEGED_DATA static size_t xMinimumEverFreeBytesRemaining = 0U; +PRIVILEGED_DATA static size_t xNumberOfSuccessfulAllocations = 0; +PRIVILEGED_DATA static size_t xNumberOfSuccessfulFrees = 0; + +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + size_t xAdditionalRequiredSize; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + * initialisation to setup the list of free blocks. */ + if( pxEnd == NULL ) + { + prvHeapInit(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xWantedSize > 0 ) + { + /* The wanted size must be increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. Some + * additional increment may also be needed for alignment. */ + xAdditionalRequiredSize = xHeapStructSize + portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ); + + if( heapADD_WILL_OVERFLOW( xWantedSize, xAdditionalRequiredSize ) == 0 ) + { + xWantedSize += xAdditionalRequiredSize; + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the block size we are trying to allocate is not so large that the + * top bit is set. The top bit of the block size member of the BlockLink_t + * structure is used to determine who owns the block - the application or + * the kernel, so it must be free. */ + if( heapBLOCK_SIZE_IS_VALID( xWantedSize ) != 0 ) + { + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + * was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); + + /* Calculate the sizes of two blocks split from the + * single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( pxNewBlockLink ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + * by the application and has no "next" block. */ + heapALLOCATE_BLOCK( pxBlock ); + pxBlock->pxNextFreeBlock = NULL; + xNumberOfSuccessfulAllocations++; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */ + + configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 ); + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + configASSERT( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + heapFREE_BLOCK( pxLink ); + #if ( configHEAP_CLEAR_MEMORY_ON_FREE == 1 ) + { + ( void ) memset( puc + xHeapStructSize, 0, pxLink->xBlockSize - xHeapStructSize ); + } + #endif + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xNumberOfSuccessfulFrees++; + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +void * pvPortCalloc( size_t xNum, + size_t xSize ) +{ + void * pv = NULL; + + if( heapMULTIPLY_WILL_OVERFLOW( xNum, xSize ) == 0 ) + { + pv = pvPortMalloc( xNum * xSize ); + + if( pv != NULL ) + { + ( void ) memset( pv, 0, xNum * xSize ); + } + } + + return pv; +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxFirstFreeBlock; + uint8_t * pucAlignedHeap; + portPOINTER_SIZE_TYPE uxAddress; + size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; + + /* Ensure the heap starts on a correctly aligned boundary. */ + uxAddress = ( portPOINTER_SIZE_TYPE ) ucHeap; + + if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + uxAddress += ( portBYTE_ALIGNMENT - 1 ); + uxAddress &= ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ); + xTotalHeapSize -= uxAddress - ( portPOINTER_SIZE_TYPE ) ucHeap; + } + + pucAlignedHeap = ( uint8_t * ) uxAddress; + + /* xStart is used to hold a pointer to the first item in the list of free + * blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* pxEnd is used to mark the end of the list of free blocks and is inserted + * at the end of the heap space. */ + uxAddress = ( ( portPOINTER_SIZE_TYPE ) pucAlignedHeap ) + xTotalHeapSize; + uxAddress -= xHeapStructSize; + uxAddress &= ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ); + pxEnd = ( BlockLink_t * ) uxAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + * entire heap space, minus the space taken by pxEnd. */ + pxFirstFreeBlock = ( BlockLink_t * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = ( size_t ) ( uxAddress - ( portPOINTER_SIZE_TYPE ) pxFirstFreeBlock ); + pxFirstFreeBlock->pxNextFreeBlock = pxEnd; + + /* Only one block exists - and it covers the entire usable heap space. */ + xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; + xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) /* PRIVILEGED_FUNCTION */ +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortGetHeapStats( HeapStats_t * pxHeapStats ) +{ + BlockLink_t * pxBlock; + size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */ + + vTaskSuspendAll(); + { + pxBlock = xStart.pxNextFreeBlock; + + /* pxBlock will be NULL if the heap has not been initialised. The heap + * is initialised automatically when the first allocation is made. */ + if( pxBlock != NULL ) + { + while( pxBlock != pxEnd ) + { + /* Increment the number of blocks and record the largest block seen + * so far. */ + xBlocks++; + + if( pxBlock->xBlockSize > xMaxSize ) + { + xMaxSize = pxBlock->xBlockSize; + } + + if( pxBlock->xBlockSize < xMinSize ) + { + xMinSize = pxBlock->xBlockSize; + } + + /* Move to the next block in the chain until the last block is + * reached. */ + pxBlock = pxBlock->pxNextFreeBlock; + } + } + } + ( void ) xTaskResumeAll(); + + pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize; + pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize; + pxHeapStats->xNumberOfFreeBlocks = xBlocks; + + taskENTER_CRITICAL(); + { + pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining; + pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations; + pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees; + pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_5.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_5.c new file mode 100644 index 0000000..5c95925 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_5.c @@ -0,0 +1,594 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * A sample implementation of pvPortMalloc() that allows the heap to be defined + * across multiple non-contigous blocks and combines (coalescences) adjacent + * memory blocks as they are freed. + * + * See heap_1.c, heap_2.c, heap_3.c and heap_4.c for alternative + * implementations, and the memory management pages of https://www.FreeRTOS.org + * for more information. + * + * Usage notes: + * + * vPortDefineHeapRegions() ***must*** be called before pvPortMalloc(). + * pvPortMalloc() will be called if any task objects (tasks, queues, event + * groups, etc.) are created, therefore vPortDefineHeapRegions() ***must*** be + * called before any other objects are defined. + * + * vPortDefineHeapRegions() takes a single parameter. The parameter is an array + * of HeapRegion_t structures. HeapRegion_t is defined in portable.h as + * + * typedef struct HeapRegion + * { + * uint8_t *pucStartAddress; << Start address of a block of memory that will be part of the heap. + * size_t xSizeInBytes; << Size of the block of memory. + * } HeapRegion_t; + * + * The array is terminated using a NULL zero sized region definition, and the + * memory regions defined in the array ***must*** appear in address order from + * low address to high address. So the following is a valid example of how + * to use the function. + * + * HeapRegion_t xHeapRegions[] = + * { + * { ( uint8_t * ) 0x80000000UL, 0x10000 }, << Defines a block of 0x10000 bytes starting at address 0x80000000 + * { ( uint8_t * ) 0x90000000UL, 0xa0000 }, << Defines a block of 0xa0000 bytes starting at address of 0x90000000 + * { NULL, 0 } << Terminates the array. + * }; + * + * vPortDefineHeapRegions( xHeapRegions ); << Pass the array into vPortDefineHeapRegions(). + * + * Note 0x80000000 is the lower address so appears in the array first. + * + */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0 +#endif + +#ifndef configHEAP_CLEAR_MEMORY_ON_FREE + #define configHEAP_CLEAR_MEMORY_ON_FREE 0 +#endif + +/* Block sizes must not get too small. */ +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( xHeapStructSize << 1 ) ) + +/* Assumes 8bit bytes! */ +#define heapBITS_PER_BYTE ( ( size_t ) 8 ) + +/* Max value that fits in a size_t type. */ +#define heapSIZE_MAX ( ~( ( size_t ) 0 ) ) + +/* Check if multiplying a and b will result in overflow. */ +#define heapMULTIPLY_WILL_OVERFLOW( a, b ) ( ( ( a ) > 0 ) && ( ( b ) > ( heapSIZE_MAX / ( a ) ) ) ) + +/* Check if adding a and b will result in overflow. */ +#define heapADD_WILL_OVERFLOW( a, b ) ( ( a ) > ( heapSIZE_MAX - ( b ) ) ) + +/* MSB of the xBlockSize member of an BlockLink_t structure is used to track + * the allocation status of a block. When MSB of the xBlockSize member of + * an BlockLink_t structure is set then the block belongs to the application. + * When the bit is free the block is still part of the free heap space. */ +#define heapBLOCK_ALLOCATED_BITMASK ( ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ) ) +#define heapBLOCK_SIZE_IS_VALID( xBlockSize ) ( ( ( xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) == 0 ) +#define heapBLOCK_IS_ALLOCATED( pxBlock ) ( ( ( pxBlock->xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) != 0 ) +#define heapALLOCATE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) |= heapBLOCK_ALLOCATED_BITMASK ) +#define heapFREE_BLOCK( pxBlock ) ( ( pxBlock->xBlockSize ) &= ~heapBLOCK_ALLOCATED_BITMASK ) + +/*-----------------------------------------------------------*/ + +/* Define the linked list structure. This is used to link free blocks in order + * of their memory address. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK * pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} BlockLink_t; + +/*-----------------------------------------------------------*/ + +/* + * Inserts a block of memory that is being freed into the correct position in + * the list of free memory blocks. The block being freed will be merged with + * the block in front it and/or the block behind it if the memory blocks are + * adjacent to each other. + */ +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ); + +/*-----------------------------------------------------------*/ + +/* The size of the structure placed at the beginning of each allocated memory + * block must by correctly byte aligned. */ +static const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + +/* Create a couple of list links to mark the start and end of the list. */ +static BlockLink_t xStart; +static BlockLink_t * pxEnd = NULL; + +/* Keeps track of the number of calls to allocate and free memory as well as the + * number of free bytes remaining, but says nothing about fragmentation. */ +static size_t xFreeBytesRemaining = 0U; +static size_t xMinimumEverFreeBytesRemaining = 0U; +static size_t xNumberOfSuccessfulAllocations = 0; +static size_t xNumberOfSuccessfulFrees = 0; + +/*-----------------------------------------------------------*/ + +void * pvPortMalloc( size_t xWantedSize ) +{ + BlockLink_t * pxBlock; + BlockLink_t * pxPreviousBlock; + BlockLink_t * pxNewBlockLink; + void * pvReturn = NULL; + size_t xAdditionalRequiredSize; + + /* The heap must be initialised before the first call to + * prvPortMalloc(). */ + configASSERT( pxEnd ); + + vTaskSuspendAll(); + { + if( xWantedSize > 0 ) + { + /* The wanted size must be increased so it can contain a BlockLink_t + * structure in addition to the requested amount of bytes. Some + * additional increment may also be needed for alignment. */ + xAdditionalRequiredSize = xHeapStructSize + portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ); + + if( heapADD_WILL_OVERFLOW( xWantedSize, xAdditionalRequiredSize ) == 0 ) + { + xWantedSize += xAdditionalRequiredSize; + } + else + { + xWantedSize = 0; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Check the block size we are trying to allocate is not so large that the + * top bit is set. The top bit of the block size member of the BlockLink_t + * structure is used to determine who owns the block - the application or + * the kernel, so it must be free. */ + if( heapBLOCK_SIZE_IS_VALID( xWantedSize ) != 0 ) + { + if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) + { + /* Traverse the list from the start (lowest address) block until + * one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If the end marker was reached then a block of adequate size + * was not found. */ + if( pxBlock != pxEnd ) + { + /* Return the memory space pointed to - jumping over the + * BlockLink_t structure at its start. */ + pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); + + /* This block is being returned for use so must be taken out + * of the list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into + * two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new + * block following the number of bytes requested. The void + * cast is used to prevent byte alignment warnings from the + * compiler. */ + pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the + * single block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + + if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) + { + xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The block is being returned - it is allocated and owned + * by the application and has no "next" block. */ + heapALLOCATE_BLOCK( pxBlock ); + pxBlock->pxNextFreeBlock = NULL; + xNumberOfSuccessfulAllocations++; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceMALLOC( pvReturn, xWantedSize ); + } + ( void ) xTaskResumeAll(); + + #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + vApplicationMallocFailedHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */ + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void * pv ) +{ + uint8_t * puc = ( uint8_t * ) pv; + BlockLink_t * pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an BlockLink_t structure immediately + * before it. */ + puc -= xHeapStructSize; + + /* This casting is to keep the compiler from issuing warnings. */ + pxLink = ( void * ) puc; + + configASSERT( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ); + configASSERT( pxLink->pxNextFreeBlock == NULL ); + + if( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 ) + { + if( pxLink->pxNextFreeBlock == NULL ) + { + /* The block is being returned to the heap - it is no longer + * allocated. */ + heapFREE_BLOCK( pxLink ); + #if ( configHEAP_CLEAR_MEMORY_ON_FREE == 1 ) + { + ( void ) memset( puc + xHeapStructSize, 0, pxLink->xBlockSize - xHeapStructSize ); + } + #endif + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); + xNumberOfSuccessfulFrees++; + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetMinimumEverFreeHeapSize( void ) +{ + return xMinimumEverFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void * pvPortCalloc( size_t xNum, + size_t xSize ) +{ + void * pv = NULL; + + if( heapMULTIPLY_WILL_OVERFLOW( xNum, xSize ) == 0 ) + { + pv = pvPortMalloc( xNum * xSize ); + + if( pv != NULL ) + { + ( void ) memset( pv, 0, xNum * xSize ); + } + } + + return pv; +} +/*-----------------------------------------------------------*/ + +static void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) +{ + BlockLink_t * pxIterator; + uint8_t * puc; + + /* Iterate through the list until a block is found that has a higher address + * than the block being inserted. */ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) + { + /* Nothing to do here, just iterate to the right position. */ + } + + /* Do the block being inserted, and the block it is being inserted after + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxIterator; + + if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) + { + pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; + pxBlockToInsert = pxIterator; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Do the block being inserted, and the block it is being inserted before + * make a contiguous block of memory? */ + puc = ( uint8_t * ) pxBlockToInsert; + + if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) + { + if( pxIterator->pxNextFreeBlock != pxEnd ) + { + /* Form one big block from the two blocks. */ + pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxEnd; + } + } + else + { + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; + } + + /* If the block being inserted plugged a gab, so was merged with the block + * before and the block after, then it's pxNextFreeBlock pointer will have + * already been set, and should not be set here as that would make it point + * to itself. */ + if( pxIterator != pxBlockToInsert ) + { + pxIterator->pxNextFreeBlock = pxBlockToInsert; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) +{ + BlockLink_t * pxFirstFreeBlockInRegion = NULL; + BlockLink_t * pxPreviousFreeBlock; + portPOINTER_SIZE_TYPE xAlignedHeap; + size_t xTotalRegionSize, xTotalHeapSize = 0; + BaseType_t xDefinedRegions = 0; + portPOINTER_SIZE_TYPE xAddress; + const HeapRegion_t * pxHeapRegion; + + /* Can only call once! */ + configASSERT( pxEnd == NULL ); + + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + + while( pxHeapRegion->xSizeInBytes > 0 ) + { + xTotalRegionSize = pxHeapRegion->xSizeInBytes; + + /* Ensure the heap region starts on a correctly aligned boundary. */ + xAddress = ( portPOINTER_SIZE_TYPE ) pxHeapRegion->pucStartAddress; + + if( ( xAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + xAddress += ( portBYTE_ALIGNMENT - 1 ); + xAddress &= ~portBYTE_ALIGNMENT_MASK; + + /* Adjust the size for the bytes lost to alignment. */ + xTotalRegionSize -= ( size_t ) ( xAddress - ( portPOINTER_SIZE_TYPE ) pxHeapRegion->pucStartAddress ); + } + + xAlignedHeap = xAddress; + + /* Set xStart if it has not already been set. */ + if( xDefinedRegions == 0 ) + { + /* xStart is used to hold a pointer to the first item in the list of + * free blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( BlockLink_t * ) xAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + } + else + { + /* Should only get here if one region has already been added to the + * heap. */ + configASSERT( pxEnd != NULL ); + + /* Check blocks are passed in with increasing start addresses. */ + configASSERT( xAddress > ( size_t ) pxEnd ); + } + + /* Remember the location of the end marker in the previous region, if + * any. */ + pxPreviousFreeBlock = pxEnd; + + /* pxEnd is used to mark the end of the list of free blocks and is + * inserted at the end of the region space. */ + xAddress = xAlignedHeap + xTotalRegionSize; + xAddress -= xHeapStructSize; + xAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); + pxEnd = ( BlockLink_t * ) xAddress; + pxEnd->xBlockSize = 0; + pxEnd->pxNextFreeBlock = NULL; + + /* To start with there is a single free block in this region that is + * sized to take up the entire heap region minus the space taken by the + * free block structure. */ + pxFirstFreeBlockInRegion = ( BlockLink_t * ) xAlignedHeap; + pxFirstFreeBlockInRegion->xBlockSize = ( size_t ) ( xAddress - ( portPOINTER_SIZE_TYPE ) pxFirstFreeBlockInRegion ); + pxFirstFreeBlockInRegion->pxNextFreeBlock = pxEnd; + + /* If this is not the first region that makes up the entire heap space + * then link the previous region to this region. */ + if( pxPreviousFreeBlock != NULL ) + { + pxPreviousFreeBlock->pxNextFreeBlock = pxFirstFreeBlockInRegion; + } + + xTotalHeapSize += pxFirstFreeBlockInRegion->xBlockSize; + + /* Move onto the next HeapRegion_t structure. */ + xDefinedRegions++; + pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] ); + } + + xMinimumEverFreeBytesRemaining = xTotalHeapSize; + xFreeBytesRemaining = xTotalHeapSize; + + /* Check something was actually defined before it is accessed. */ + configASSERT( xTotalHeapSize ); +} +/*-----------------------------------------------------------*/ + +void vPortGetHeapStats( HeapStats_t * pxHeapStats ) +{ + BlockLink_t * pxBlock; + size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */ + + vTaskSuspendAll(); + { + pxBlock = xStart.pxNextFreeBlock; + + /* pxBlock will be NULL if the heap has not been initialised. The heap + * is initialised automatically when the first allocation is made. */ + if( pxBlock != NULL ) + { + while( pxBlock != pxEnd ) + { + /* Increment the number of blocks and record the largest block seen + * so far. */ + xBlocks++; + + if( pxBlock->xBlockSize > xMaxSize ) + { + xMaxSize = pxBlock->xBlockSize; + } + + /* Heap five will have a zero sized block at the end of each + * each region - the block is only used to link to the next + * heap region so it not a real block. */ + if( pxBlock->xBlockSize != 0 ) + { + if( pxBlock->xBlockSize < xMinSize ) + { + xMinSize = pxBlock->xBlockSize; + } + } + + /* Move to the next block in the chain until the last block is + * reached. */ + pxBlock = pxBlock->pxNextFreeBlock; + } + } + } + ( void ) xTaskResumeAll(); + + pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize; + pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize; + pxHeapStats->xNumberOfFreeBlocks = xBlocks; + + taskENTER_CRITICAL(); + { + pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining; + pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations; + pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees; + pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/port.c new file mode 100644 index 0000000..ef99333 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/port.c @@ -0,0 +1,894 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Cannot find a weak linkage attribute, so the + * configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if the + * application writer wants to provide their own implementation of + * vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION + * is defined. */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Manual definition of missing asm names. */ +#define psp 9 +#define basepri 17 +#define msp 8 +#define ipsr 5 +#define control 20 + +/* From port.c. */ +extern void * pxCurrentTCB; + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ); + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + /* Sometimes the parameters are loaded from the stack. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) iv IVT_INT_SVCall ics ICS_OFF +{ + __asm { +/* *INDENT-OFF* */ + ldr r3, =_pxCurrentTCB /* Restore the context. */ + ldr r1, [ r3 ] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ + ldm r0 !, ( r4 - r11, r14 ) /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + msr psp, r0 /* Restore the task stack pointer. */ + isb + mov r0, #0 + msr basepri, r0 + bx r14 +/* *INDENT-ON* */ + }; +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm { +/* *INDENT-OFF* */ + ldr r0, =0xE000ED08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [ r0 ] + ldr r0, [ r0 ] + msr msp, r0 /* Set the msp back to the start of the stack. */ + + /* Clear the bit that indicates the FPU is in use in case the FPU was used + * before the scheduler was started - which would otherwise result in the + * unnecessary leaving of space in the SVC stack for lazy saving of FPU + * registers. */ + mov r0, #0 + msr control, r0 + cpsie i /* Globally enable interrupts. */ + cpsie f + dsb + isb + svc #0 /* System call to start first task. */ + nop +/* *INDENT-ON* */ + }; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + * priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +const uint8_t ucMaxSyscallInterruptPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY; +void xPortPendSVHandler( void ) iv IVT_INT_PendSV ics ICS_OFF +{ + __asm { + #ifdef HW_DEBUG +/* *INDENT-OFF* */ + + /* The function is not truly naked, so add back the 4 bytes subtracted + * from the stack pointer by the function prologue. */ + add sp, sp, # 4 + #endif + mrs r0, psp + isb + + ldr r3, =_pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [ r3 ] + + tst r14, #0x10 /* Is the task using the FPU context? If so, push high vfp registers. */ + it eq + vstmdbeq r0 !, ( s16 - s31 ) + + stmdb r0 !, ( r4 - r11, r14 ) /* Save the core registers. */ + + str r0, [ r2 ] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp !, ( r0, r3 ) + ldr r0, = _ucMaxSyscallInterruptPriority + ldr r1, [ r0 ] + msr basepri, r1 + dsb + isb + bl _vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldm sp !, ( r0, r3 ) + + ldr r1, [ r3 ] /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r0, [ r1 ] + + ldm r0 !, ( r4 - r11, r14 ) /* Pop the core registers. */ + + tst r14, #0x10 /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + it eq + vldmiaeq r0 !, ( s16 - s31 ) + + msr psp, r0 + isb + bx r14 +/* *INDENT-ON* */ + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) iv IVT_INT_SysTick ics ICS_AUTO +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known - therefore the slightly faster portDISABLE_INTERRUPTS() function is + * used in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + portDISABLE_INTERRUPTS(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + + #if ( ( configUSE_TICKLESS_IDLE == 1 ) && ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) ) + + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm { + "cpsid i" + }; + __asm { + "dsb" + }; + __asm { + "isb" + }; + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the cpsid instruction + * above. */ + __asm { + "cpsie i" + }; + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm { + "dsb" + }; + __asm { + "wfi" + }; + __asm { + "isb" + }; + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the cpsid instruction above. */ + __asm { + "cpsie i" + }; + __asm { + "dsb" + }; + __asm { + "isb" + }; + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm { + "cpsid i" + }; + __asm { + "dsb" + }; + __asm { + "isb" + }; + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __asm { + "cpsie i" + }; + } + } + + #endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ + #if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Reset SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + + #endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm { +/* *INDENT-OFF* */ + ldr r0, =0xE000ED88 /* The FPU enable bits are in the CPACR. */ + ldr r1, [ r0 ] + + orr r1, r1, #0xF00000 /* Enable CP10 and CP11 coprocessors, then save back. */ + str r1, [ r0 ] + bx r14 +/* *INDENT-ON* */ + }; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortIsInsideInterrupt( void ) +{ + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + if( CPU_REG_GET( CPU_IPSR ) == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + + #if ( configASSERT_DEFINED == 1 ) + +/* Limitations in the MikroC inline asm means ulCurrentInterrupt has to be + * global - which makes vPortValidateInterruptPriority() non re-entrant. + * However that should not matter as an interrupt can only itself be + * interrupted by a higher priority interrupt. That means if + * ulCurrentInterrupt, so ulCurrentInterrupt getting corrupted cannot lead to + * an invalid interrupt priority being missed. */ + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + void vPortValidateInterruptPriority( void ) + { + /* Obtain the number of the currently executing interrupt. */ + __asm { +/* *INDENT-OFF* */ + push( r0, r1 ) + mrs r0, ipsr + ldr r1, =_ulCurrentInterrupt + str r0, [ r1 ] + pop( r0, r1 ) +/* *INDENT-ON* */ + }; + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = *( ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + ulCurrentInterrupt ) ); + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + + #endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..2df81ca --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/portmacro.h @@ -0,0 +1,190 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* The compiler needs to be told functions that are only referenced by pointer + * are to be included in the build. NOTE: Omitting these lines will result in a + * run-time crash, not a linker error! */ + #pragma funcall vTaskStartScheduler prvIdleTask + #pragma funcall xTimerCreateTimerTask prvTimerTask + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __asm{ dsb }; \ + __asm{ isb }; \ + } + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portDISABLE_INTERRUPTS() CPU_REG_SET( CPU_BASEPRI, configMAX_SYSCALL_INTERRUPT_PRIORITY ); __asm{ dsb }; __asm{ isb } + #define portENABLE_INTERRUPTS() CPU_REG_SET( CPU_BASEPRI, 0 ); + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) CPU_REG_SET( CPU_BASEPRI, x ); /* Barrier instructions not used as this is only used to lower the basepri. */ + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) + { + uint8_t ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + + return ucReturn; + } + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + BaseType_t xPortIsInsideInterrupt( void ); + +/*-----------------------------------------------------------*/ + + static inline uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulOriginalBASEPRI; + + ulOriginalBASEPRI = CPU_REG_GET( CPU_BASEPRI ); + CPU_REG_SET( CPU_BASEPRI, configMAX_SYSCALL_INTERRUPT_PRIORITY ); + __asm{ dsb }; + __asm{ isb }; + return ulOriginalBASEPRI; + } +/*-----------------------------------------------------------*/ + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/port.c new file mode 100644 index 0000000..7c13b32 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/port.c @@ -0,0 +1,240 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Tern EE 186 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/* The timer increments every four clocks, hence the divide by 4. */ +#define portTIMER_COMPARE ( uint16_t ) ( ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) / ( uint32_t ) 4 ) + +/* From the RDC data sheet. */ +#define portENABLE_TIMER_AND_INTERRUPT ( uint16_t ) 0xe001 + +/* Interrupt control. */ +#define portEIO_REGISTER 0xff22 +#define portCLEAR_INTERRUPT 0x0008 + +/* Setup the hardware to generate the required tick frequency. */ +static void prvSetupTimerInterrupt( void ); + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/* The timer initialisation functions leave interrupts enabled, +which is not what we want. This ISR is installed temporarily in case +the timer fires before we get a change to disable interrupts again. */ +static void __interrupt __far prvDummyISR( void ); + +/*-----------------------------------------------------------*/ +/* See header file for description. */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t DS_Reg = 0; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + + /* We are going to start the scheduler using a return from interrupt + instruction to load the program counter, so first there would be the + function call with parameters preamble. */ + + *pxTopOfStack = FP_SEG( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* Next the status register and interrupt return address. */ + *pxTopOfStack = portINITIAL_SW; + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* The remaining registers would be pushed on the stack by our context + switch function. These are loaded with values simply to make debugging + easier. */ + *pxTopOfStack = ( StackType_t ) 0xAAAA; /* AX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xCCCC; /* CX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xEEEE; /* ES */ + pxTopOfStack--; + + /* We need the true data segment. */ + __asm{ MOV DS_Reg, DS }; + + *pxTopOfStack = DS_Reg; /* DS */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0123; /* SI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BP */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* This is called with interrupts already disabled. */ + + /* Put our manual switch (yield) function on a known + vector. */ + setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + /* Setup the tick interrupt. */ + prvSetupTimerInterrupt(); + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvDummyISR( void ) +{ + /* The timer initialisation functions leave interrupts enabled, + which is not what we want. This ISR is installed temporarily in case + the timer fires before we get a change to disable interrupts again. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset interrupt. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + + /* Reset interrupt. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +const uint16_t usTimerACompare = portTIMER_COMPARE, usTimerAMode = portENABLE_TIMER_AND_INTERRUPT; +const uint16_t usT2_IRQ = 0x13; + + /* Configure the timer, the dummy handler is used here as the init + function leaves interrupts enabled. */ + t2_init( usTimerAMode, usTimerACompare, prvDummyISR ); + + /* Disable interrupts again before installing the real handlers. */ + portDISABLE_INTERRUPTS(); + + #if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + setvect( usT2_IRQ, prvPreemptiveTick ); + #else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + setvect( usT2_IRQ, prvNonPreemptiveTick ); + #endif +} + + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portasm.h new file mode 100644 index 0000000..0d9f1de --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portasm.h @@ -0,0 +1,77 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/* + * Saves the stack pointer for one task into its TCB, calls + * vTaskSwitchContext() to update the TCB being used, then restores the stack + * from the new TCB read to run the task. + */ +void portSWITCH_CONTEXT( void ); + +/* + * Load the stack pointer from the TCB of the task which is going to be first + * to execute. Then force an IRET so the registers and IP are popped off the + * stack. + */ +void portFIRST_CONTEXT( void ); + +#define portSWITCH_CONTEXT() \ + asm { mov ax, seg pxCurrentTCB } \ + asm { mov ds, ax } \ + asm { les bx, pxCurrentTCB } /* Save the stack pointer into the TCB. */ \ + asm { mov es:0x2[ bx ], ss } \ + asm { mov es:[ bx ], sp } \ + asm { call far ptr vTaskSwitchContext } /* Perform the switch. */ \ + asm { mov ax, seg pxCurrentTCB } /* Restore the stack pointer from the TCB. */ \ + asm { mov ds, ax } \ + asm { les bx, dword ptr pxCurrentTCB } \ + asm { mov ss, es:[ bx + 2 ] } \ + asm { mov sp, es:[ bx ] } + +#define portFIRST_CONTEXT() \ + asm { mov ax, seg pxCurrentTCB } \ + asm { mov ds, ax } \ + asm { les bx, dword ptr pxCurrentTCB } \ + asm { mov ss, es:[ bx + 2 ] } \ + asm { mov sp, es:[ bx ] } \ + asm { pop bp } \ + asm { pop di } \ + asm { pop si } \ + asm { pop ds } \ + asm { pop es } \ + asm { pop dx } \ + asm { pop cx } \ + asm { pop bx } \ + asm { pop ax } \ + asm { iret } + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portmacro.h new file mode 100644 index 0000000..0f84106 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portmacro.h @@ -0,0 +1,107 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portINPUT_WORD( xAddr ) inpw( xAddr ) +#define portOUTPUT_WORD( xAddr, usValue ) outpw( xAddr, usValue ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/port.c new file mode 100644 index 0000000..ecd23b3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/port.c @@ -0,0 +1,220 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Tern EE 186 + * port. + *----------------------------------------------------------*/ + +/* Library includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/* The timer increments every four clocks, hence the divide by 4. */ +#define portPRESCALE_VALUE ( 16 ) +#define portTIMER_COMPARE ( configCPU_CLOCK_HZ / ( configTICK_RATE_HZ * 4UL ) ) + +/* From the RDC data sheet. */ +#define portENABLE_TIMER_AND_INTERRUPT ( uint16_t ) 0xe00b +#define portENABLE_TIMER ( uint16_t ) 0xC001 + +/* Interrupt control. */ +#define portEIO_REGISTER 0xff22 +#define portCLEAR_INTERRUPT 0x0008 + +/* Setup the hardware to generate the required tick frequency. */ +static void prvSetupTimerInterrupt( void ); + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/*-----------------------------------------------------------*/ +/* See header file for description. */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t DS_Reg = 0; + + /* We need the true data segment. */ + __asm{ MOV DS_Reg, DS }; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + + /* We are going to start the scheduler using a return from interrupt + instruction to load the program counter, so first there would be the + function call with parameters preamble. */ + + *pxTopOfStack = FP_OFF( pvParameters ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* Next the status register and interrupt return address. */ + *pxTopOfStack = portINITIAL_SW; + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* The remaining registers would be pushed on the stack by our context + switch function. These are loaded with values simply to make debugging + easier. */ + *pxTopOfStack = ( StackType_t ) 0xAAAA; /* AX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xCCCC; /* CX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xEEEE; /* ES */ + pxTopOfStack--; + + *pxTopOfStack = DS_Reg; /* DS */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0123; /* SI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BP */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* This is called with interrupts already disabled. */ + + /* Put our manual switch (yield) function on a known + vector. */ + setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + /* Setup the tick interrupt. */ + prvSetupTimerInterrupt(); + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + + /* Should not get here! */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +/* The ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if( configUSE_PREEMPTION == 1 ) + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portEND_SWITCHING_ISR(); + } + + /* Reset interrupt. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + + /* Reset interrupt. */ + outport( portEIO_REGISTER, portCLEAR_INTERRUPT ); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portEND_SWITCHING_ISR(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +const uint32_t ulCompareValue = portTIMER_COMPARE; +uint16_t usTimerCompare; + + usTimerCompare = ( uint16_t ) ( ulCompareValue >> 4 ); + t2_init( portENABLE_TIMER, portPRESCALE_VALUE, NULL ); + + #if( configUSE_PREEMPTION == 1 ) + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + t1_init( portENABLE_TIMER_AND_INTERRUPT, usTimerCompare, usTimerCompare, prvPreemptiveTick ); + #else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + t1_init( portENABLE_TIMER_AND_INTERRUPT, usTimerCompare, usTimerCompare, prvNonPreemptiveTick ); + #endif +} + + + + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portasm.h new file mode 100644 index 0000000..82b23f1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portasm.h @@ -0,0 +1,73 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORT_ASM_H +#define PORT_ASM_H + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/* + * Saves the stack pointer for one task into its TCB, calls + * vTaskSwitchContext() to update the TCB being used, then restores the stack + * from the new TCB read to run the task. + */ +void portEND_SWITCHING_ISR( void ); + +/* + * Load the stack pointer from the TCB of the task which is going to be first + * to execute. Then force an IRET so the registers and IP are popped off the + * stack. + */ +void portFIRST_CONTEXT( void ); + +#define portEND_SWITCHING_ISR() \ + asm { mov bx, [pxCurrentTCB] } \ + asm { mov word ptr [bx], sp } \ + asm { call far ptr vTaskSwitchContext } \ + asm { mov bx, [pxCurrentTCB] } \ + asm { mov sp, [bx] } + +#define portFIRST_CONTEXT() \ + asm { mov bx, [pxCurrentTCB] } \ + asm { mov sp, [bx] } \ + asm { pop bp } \ + asm { pop di } \ + asm { pop si } \ + asm { pop ds } \ + asm { pop es } \ + asm { pop dx } \ + asm { pop cx } \ + asm { pop bx } \ + asm { pop ax } \ + asm { iret } + + +#endif + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portmacro.h new file mode 100644 index 0000000..6ba512e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portmacro.h @@ -0,0 +1,108 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +typedef void ( __interrupt __far *pxISR )(); + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#define portENTER_CRITICAL() __asm{ pushf } \ + __asm{ cli } \ + +#define portEXIT_CRITICAL() __asm{ popf } + +#define portDISABLE_INTERRUPTS() __asm{ cli } + +#define portENABLE_INTERRUPTS() __asm{ sti } +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portNOP() __asm{ nop } +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portINPUT_WORD( xAddr ) inpw( xAddr ) +#define portOUTPUT_WORD( xAddr, usValue ) outpw( xAddr, usValue ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, vParameters ) void vTaskFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/port.c new file mode 100644 index 0000000..87ac4b6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/port.c @@ -0,0 +1,292 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portINSTRUCTION_SIZE ( ( StackType_t ) 4 ) +#define portNO_CRITICAL_SECTION_NESTING ( ( StackType_t ) 0 ) + +/* Constants required to setup the tick ISR. */ +#define portENABLE_TIMER ( ( uint8_t ) 0x01 ) +#define portPRESCALE_VALUE 0x00 +#define portINTERRUPT_ON_MATCH ( ( uint32_t ) 0x01 ) +#define portRESET_COUNT_ON_MATCH ( ( uint32_t ) 0x02 ) + +/* Constants required to setup the VIC for the tick ISR. */ +#define portTIMER_VIC_CHANNEL ( ( uint32_t ) 0x0004 ) +#define portTIMER_VIC_CHANNEL_BIT ( ( uint32_t ) 0x0010 ) +#define portTIMER_VIC_ENABLE ( ( uint32_t ) 0x0020 ) + +/* Constants required to handle interrupts. */ +#define portTIMER_MATCH_ISR_BIT ( ( uint8_t ) 0x01 ) +#define portCLEAR_VIC_INTERRUPT ( ( uint32_t ) 0 ) + +/*-----------------------------------------------------------*/ + +/* The code generated by the Keil compiler does not maintain separate +stack and frame pointers. The portENTER_CRITICAL macro cannot therefore +use the stack as per other ports. Instead a variable is used to keep +track of the critical section nesting. This variable has to be stored +as part of the task context and must be initialised to a non zero value. */ + +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +volatile uint32_t ulCriticalNesting = 9999UL; + +/*-----------------------------------------------------------*/ + +/* Setup the timer to generate the tick interrupts. */ +static void prvSetupTimerInterrupt( void ); + +/* + * The scheduler can only be started from ARM mode, so + * vPortStartFirstSTask() is defined in portISR.c. + */ +extern __asm void vPortStartFirstTask( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t *pxOriginalTOS; + + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + Remember where the top of the (simulated) stack is before we place + anything on it. */ + pxOriginalTOS = pxTopOfStack; + + /* To ensure asserts in tasks.c don't fail, although in this case the assert + is not really required. */ + pxTopOfStack--; + + /* First on the stack is the return address - which in this case is the + start of the task. The offset is added to make the return address appear + as it would within an IRQ ISR. */ + *pxTopOfStack = ( StackType_t ) pxCode + portINSTRUCTION_SIZE; + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0xaaaaaaaa; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The last thing onto the stack is the status register, which is set for + system mode, with interrupts enabled. */ + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & 0x01UL ) != 0x00UL ) + { + /* We want the task to start in thumb mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* The code generated by the Keil compiler does not maintain separate + stack and frame pointers. The portENTER_CRITICAL macro cannot therefore + use the stack as per other ports. Instead a variable is used to keep + track of the critical section nesting. This variable has to be stored + as part of the task context and is initially set to zero. */ + *pxTopOfStack = portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. */ + prvSetupTimerInterrupt(); + + /* Start the first task. This is done from portISR.c as ARM mode must be + used. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ARM port will require this function as there + is nothing to return to. If this is required - stop the tick ISR then + return back to main. */ +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 0 + + /* + * The cooperative scheduler requires a normal IRQ service routine to + * simply increment the system tick. + */ + void vNonPreemptiveTick( void ) __irq; + void vNonPreemptiveTick( void ) __irq + { + /* Increment the tick count - this may make a delaying task ready + to run - but a context switch is not performed. */ + xTaskIncrementTick(); + + T0IR = portTIMER_MATCH_ISR_BIT; /* Clear the timer event */ + VICVectAddr = portCLEAR_VIC_INTERRUPT; /* Acknowledge the Interrupt */ + } + + #else + + /* + ************************************************************************** + * The preemptive scheduler ISR is written in assembler and can be found + * in the portASM.s file. This will only get used if portUSE_PREEMPTION + * is set to 1 in portmacro.h + ************************************************************************** + */ + + void vPreemptiveTick( void ); + +#endif +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; + + /* A 1ms tick does not require the use of the timer prescale. This is + defaulted to zero but can be used if necessary. */ + T0PR = portPRESCALE_VALUE; + + /* Calculate the match value required for our wanted tick rate. */ + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* Protect against divide by zero. Using an if() statement still results + in a warning - hence the #if. */ + #if portPRESCALE_VALUE != 0 + { + ulCompareMatch /= ( portPRESCALE_VALUE + 1 ); + } + #endif + + T0MR0 = ulCompareMatch; + + /* Generate tick with timer 0 compare match. */ + T0MCR = portRESET_COUNT_ON_MATCH | portINTERRUPT_ON_MATCH; + + /* Setup the VIC for the timer. */ + VICIntSelect &= ~( portTIMER_VIC_CHANNEL_BIT ); + VICIntEnable |= portTIMER_VIC_CHANNEL_BIT; + + /* The ISR installed depends on whether the preemptive or cooperative + scheduler is being used. */ + #if configUSE_PREEMPTION == 1 + { + VICVectAddr0 = ( uint32_t ) vPreemptiveTick; + } + #else + { + VICVectAddr0 = ( uint32_t ) vNonPreemptiveTick; + } + #endif + + VICVectCntl0 = portTIMER_VIC_CHANNEL | portTIMER_VIC_ENABLE; + + /* Start the timer - interrupts are disabled when this function is called + so it is okay to do this here. */ + T0TCR = portENABLE_TIMER; +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + __disable_irq(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as we are leaving a critical section. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then interrupts should be + re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Enable interrupts as per portEXIT_CRITICAL(). */ + __enable_irq(); + } + } +} +/*-----------------------------------------------------------*/ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portASM.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portASM.s new file mode 100644 index 0000000..c8471e6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portASM.s @@ -0,0 +1,125 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + INCLUDE portmacro.inc + + IMPORT vTaskSwitchContext + IMPORT xTaskIncrementTick + + EXPORT vPortYieldProcessor + EXPORT vPortStartFirstTask + EXPORT vPreemptiveTick + EXPORT vPortYield + + +VICVECTADDR EQU 0xFFFFF030 +T0IR EQU 0xE0004000 +T0MATCHBIT EQU 0x00000001 + + ARM + AREA PORT_ASM, CODE, READONLY + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Starting the first task is done by just restoring the context +; setup by pxPortInitialiseStack +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortStartFirstTask + + PRESERVE8 + + portRESTORE_CONTEXT + +vPortYield + + PRESERVE8 + + SVC 0 + bx lr + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Interrupt service routine for the SWI interrupt. The vector table is +; configured in the startup.s file. +; +; vPortYieldProcessor() is used to manually force a context switch. The +; SWI interrupt is generated by a call to taskYIELD() or portYIELD(). +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +vPortYieldProcessor + + PRESERVE8 + + ; Within an IRQ ISR the link register has an offset from the true return + ; address, but an SWI ISR does not. Add the offset manually so the same + ; ISR return code can be used in both cases. + ADD LR, LR, #4 + + ; Perform the context switch. + portSAVE_CONTEXT ; Save current task context + LDR R0, =vTaskSwitchContext ; Get the address of the context switch function + MOV LR, PC ; Store the return address + BX R0 ; Call the contedxt switch function + portRESTORE_CONTEXT ; restore the context of the selected task + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Interrupt service routine for preemptive scheduler tick timer +; Only used if portUSE_PREEMPTION is set to 1 in portmacro.h +; +; Uses timer 0 of LPC21XX Family +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +vPreemptiveTick + + PRESERVE8 + + portSAVE_CONTEXT ; Save the context of the current task. + + LDR R0, =xTaskIncrementTick ; Increment the tick count. + MOV LR, PC ; This may make a delayed task ready + BX R0 ; to run. + + CMP R0, #0 + BEQ SkipContextSwitch + LDR R0, =vTaskSwitchContext ; Find the highest priority task that + MOV LR, PC ; is ready to run. + BX R0 +SkipContextSwitch + MOV R0, #T0MATCHBIT ; Clear the timer event + LDR R1, =T0IR + STR R0, [R1] + + LDR R0, =VICVECTADDR ; Acknowledge the interrupt + STR R0,[R0] + + portRESTORE_CONTEXT ; Restore the context of the highest + ; priority task that is ready to run. + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.h new file mode 100644 index 0000000..9574158 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.h @@ -0,0 +1,151 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/*----------------------------------------------------------- + * ISR entry and exit macros. These are only required if a task switch + * is required from an ISR. + *----------------------------------------------------------*/ + +/* If a switch is required then we just need to call */ +/* vTaskSwitchContext() as the context has already been */ +/* saved. */ + +#define portEXIT_SWITCHING_ISR(SwitchRequired) \ +{ \ +extern void vTaskSwitchContext(void); \ + \ + if(SwitchRequired) \ + { \ + vTaskSwitchContext(); \ + } \ +} \ + +extern void vPortYield( void ); +#define portYIELD() vPortYield() + + +/* Critical section management. */ + +/* + ****************************************************************** + * We don't need to worry about whether we're in ARM or + * THUMB mode with the Keil Real View compiler when enabling + * or disabling interrupts as the compiler's intrinsic functions + * take care of that for us. + ******************************************************************* + */ +#define portDISABLE_INTERRUPTS() __disable_irq() +#define portENABLE_INTERRUPTS() __enable_irq() + + +/*----------------------------------------------------------- + * Critical section control + * + * The code generated by the Keil compiler does not maintain separate + * stack and frame pointers. The portENTER_CRITICAL macro cannot therefore + * use the stack as per other ports. Instead a variable is used to keep + * track of the critical section nesting. This necessitates the use of a + * function in place of the macro. + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define inline +#define register +#define portNOP() __asm{ NOP } +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.inc b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.inc new file mode 100644 index 0000000..59c4548 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.inc @@ -0,0 +1,92 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + IMPORT ulCriticalNesting ; + IMPORT pxCurrentTCB ; + + + MACRO + portRESTORE_CONTEXT + + + LDR R0, =pxCurrentTCB ; Set the LR to the task stack. The location was... + LDR R0, [R0] ; ... stored in pxCurrentTCB + LDR LR, [R0] + + LDR R0, =ulCriticalNesting ; The critical nesting depth is the first item on... + LDMFD LR!, {R1} ; ...the stack. Load it into the ulCriticalNesting var. + STR R1, [R0] ; + + LDMFD LR!, {R0} ; Get the SPSR from the stack. + MSR SPSR_cxsf, R0 ; + + LDMFD LR, {R0-R14}^ ; Restore all system mode registers for the task. + NOP ; + + LDR LR, [LR, #+60] ; Restore the return address + + ; And return - correcting the offset in the LR to obtain ... + SUBS PC, LR, #4 ; ...the correct address. + + MEND + +; /**********************************************************************/ + + MACRO + portSAVE_CONTEXT + + + STMDB SP!, {R0} ; Store R0 first as we need to use it. + + STMDB SP,{SP}^ ; Set R0 to point to the task stack pointer. + NOP ; + SUB SP, SP, #4 ; + LDMIA SP!,{R0} ; + + STMDB R0!, {LR} ; Push the return address onto the stack. + MOV LR, R0 ; Now we have saved LR we can use it instead of R0. + LDMIA SP!, {R0} ; Pop R0 so we can save it onto the system mode stack. + + STMDB LR,{R0-LR}^ ; Push all the system mode registers onto the task stack. + NOP ; + SUB LR, LR, #60 ; + + MRS R0, SPSR ; Push the SPSR onto the task stack. + STMDB LR!, {R0} ; + + LDR R0, =ulCriticalNesting ; + LDR R0, [R0] ; + STMDB LR!, {R0} ; + + LDR R0, =pxCurrentTCB ; Store the new top of stack for the task. + LDR R1, [R0] ; + STR LR, [R1] ; + + MEND + + END diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/port.c new file mode 100644 index 0000000..a1f49da --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/port.c @@ -0,0 +1,481 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configINTERRUPT_CONTROLLER_BASE_ADDRESS + #error configINTERRUPT_CONTROLLER_BASE_ADDRESS must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET + #error configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configUNIQUE_INTERRUPT_PRIORITIES + #error configUNIQUE_INTERRUPT_PRIORITIES must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#ifndef configSETUP_TICK_INTERRUPT + #error configSETUP_TICK_INTERRUPT() must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif /* configSETUP_TICK_INTERRUPT */ + +#ifndef configMAX_API_CALL_INTERRUPT_PRIORITY + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be defined. See https://www.FreeRTOS.org/Using-FreeRTOS-on-Cortex-A-Embedded-Processors.html +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY == 0 + #error configMAX_API_CALL_INTERRUPT_PRIORITY must not be set to 0 +#endif + +#if configMAX_API_CALL_INTERRUPT_PRIORITY > configUNIQUE_INTERRUPT_PRIORITIES + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be less than or equal to configUNIQUE_INTERRUPT_PRIORITIES as the lower the numeric priority value the higher the logical interrupt priority +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* In case security extensions are implemented. */ +#if configMAX_API_CALL_INTERRUPT_PRIORITY <= ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) + #error configMAX_API_CALL_INTERRUPT_PRIORITY must be greater than ( configUNIQUE_INTERRUPT_PRIORITIES / 2 ) +#endif + +#ifndef configCLEAR_TICK_INTERRUPT + #define configCLEAR_TICK_INTERRUPT() +#endif + +/* The number of bits to shift for an interrupt priority is dependent on the +number of bits implemented by the interrupt controller. */ +#if configUNIQUE_INTERRUPT_PRIORITIES == 16 + #define portPRIORITY_SHIFT 4 + #define portMAX_BINARY_POINT_VALUE 3 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 32 + #define portPRIORITY_SHIFT 3 + #define portMAX_BINARY_POINT_VALUE 2 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 64 + #define portPRIORITY_SHIFT 2 + #define portMAX_BINARY_POINT_VALUE 1 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 128 + #define portPRIORITY_SHIFT 1 + #define portMAX_BINARY_POINT_VALUE 0 +#elif configUNIQUE_INTERRUPT_PRIORITIES == 256 + #define portPRIORITY_SHIFT 0 + #define portMAX_BINARY_POINT_VALUE 0 +#else + #error Invalid configUNIQUE_INTERRUPT_PRIORITIES setting. configUNIQUE_INTERRUPT_PRIORITIES must be set to the number of unique priorities implemented by the target hardware +#endif + +/* A critical section is exited when the critical section nesting count reaches +this value. */ +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + +/* In all GICs 255 can be written to the priority mask register to unmask all +(but the lowest) interrupt priority. */ +#define portUNMASK_VALUE ( 0xFFUL ) + +/* Tasks are not created with a floating point context, but can be given a +floating point context after they have been created. A variable is stored as +part of the tasks context that holds portNO_FLOATING_POINT_CONTEXT if the task +does not have an FPU context, or any other value if the task does have an FPU +context. */ +#define portNO_FLOATING_POINT_CONTEXT ( ( StackType_t ) 0 ) + +/* Interrupt controller access addresses. */ +#define portICCPMR_PRIORITY_MASK_OFFSET ( 0x04 ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ( 0x0C ) +#define portICCEOIR_END_OF_INTERRUPT_OFFSET ( 0x10 ) +#define portICCBPR_BINARY_POINT_OFFSET ( 0x08 ) +#define portICCRPR_RUNNING_PRIORITY_OFFSET ( 0x14 ) +#define portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS ( configINTERRUPT_CONTROLLER_BASE_ADDRESS + configINTERRUPT_CONTROLLER_CPU_INTERFACE_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER ( *( ( volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) ) ) +#define portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCIAR_INTERRUPT_ACKNOWLEDGE_OFFSET ) +#define portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCEOIR_END_OF_INTERRUPT_OFFSET ) +#define portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCPMR_PRIORITY_MASK_OFFSET ) +#define portICCBPR_BINARY_POINT_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCBPR_BINARY_POINT_OFFSET ) ) ) +#define portICCRPR_RUNNING_PRIORITY_REGISTER ( *( ( const volatile uint32_t * ) ( portINTERRUPT_CONTROLLER_CPU_INTERFACE_ADDRESS + portICCRPR_RUNNING_PRIORITY_OFFSET ) ) ) + +/* Used by portASSERT_IF_INTERRUPT_PRIORITY_INVALID() when ensuring the binary +point is zero. */ +#define portBINARY_POINT_BITS ( ( uint8_t ) 0x03 ) + +/* Constants required to setup the initial task context. */ +#define portINITIAL_SPSR ( ( StackType_t ) 0x1f ) /* System mode, ARM mode, interrupts enabled. */ +#define portTHUMB_MODE_BIT ( ( StackType_t ) 0x20 ) +#define portTHUMB_MODE_ADDRESS ( 0x01UL ) + +/* Masks all bits in the APSR other than the mode bits. */ +#define portAPSR_MODE_BITS_MASK ( 0x1F ) + +/* The value of the mode bits in the APSR when the CPU is executing in user +mode. */ +#define portAPSR_USER_MODE ( 0x10 ) + +/* Macro to unmask all interrupt priorities. */ +#define portCLEAR_INTERRUPT_MASK() \ +{ \ + __disable_irq(); \ + portICCPMR_PRIORITY_MASK_REGISTER = portUNMASK_VALUE; \ + __asm( "DSB \n" \ + "ISB \n" ); \ + __enable_irq(); \ +} + +/*-----------------------------------------------------------*/ + +/* + * Starts the first task executing. This function is necessarily written in + * assembly code so is implemented in portASM.s. + */ +extern void vPortRestoreTaskContext( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* A variable is used to keep track of the critical section nesting. This +variable has to be stored as part of the task context and must be initialised to +a non zero value to ensure interrupts don't inadvertently become unmasked before +the scheduler starts. As it is stored as part of the task context it will +automatically be set to 0 when the first task is started. */ +volatile uint32_t ulCriticalNesting = 9999UL; + +/* Used to pass constants into the ASM code. The address at which variables are +placed is the constant value so indirect loads in the asm code are not +required. */ +uint32_t ulICCIAR __attribute__( ( at( portICCIAR_INTERRUPT_ACKNOWLEDGE_REGISTER_ADDRESS ) ) ); +uint32_t ulICCEOIR __attribute__( ( at( portICCEOIR_END_OF_INTERRUPT_REGISTER_ADDRESS ) ) ); +uint32_t ulICCPMR __attribute__( ( at( portICCPMR_PRIORITY_MASK_REGISTER_ADDRESS ) ) ); +uint32_t ulAsmAPIPriorityMask __attribute__( ( at( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) ); + +/* Saved as part of the task context. If ulPortTaskHasFPUContext is non-zero then +a floating point context must be saved and restored for the task. */ +uint32_t ulPortTaskHasFPUContext = pdFALSE; + +/* Set to 1 to pend a context switch from an ISR. */ +uint32_t ulPortYieldRequired = pdFALSE; + +/* Counts the interrupt nesting depth. A context switch is only performed if +if the nesting depth is 0. */ +uint32_t ulPortInterruptNesting = 0UL; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Setup the initial stack of the task. The stack is set exactly as + expected by the portRESTORE_CONTEXT() macro. + + The fist real value on the stack is the status register, which is set for + system mode, with interrupts enabled. A few NULLs are added first to ensure + GDB does not try decoding a non-existent return address. */ + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = NULL; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portINITIAL_SPSR; + + if( ( ( uint32_t ) pxCode & portTHUMB_MODE_ADDRESS ) != 0x00UL ) + { + /* The task will start in THUMB mode. */ + *pxTopOfStack |= portTHUMB_MODE_BIT; + } + + pxTopOfStack--; + + /* Next the return address, which in this case is the start of the task. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + + /* Next all the registers other than the stack pointer. */ + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x12121212; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11111111; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x10101010; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x09090909; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x08080808; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x07070707; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x06060606; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x05050505; /* R5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x04040404; /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x03030303; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x02020202; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x01010101; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack--; + + /* The task will start with a critical nesting count of 0 as interrupts are + enabled. */ + *pxTopOfStack = portNO_CRITICAL_NESTING; + pxTopOfStack--; + + /* The task will start without a floating point context. A task that uses + the floating point hardware must call vPortTaskUsesFPU() before executing + any floating point instructions. */ + *pxTopOfStack = portNO_FLOATING_POINT_CONTEXT; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( ulPortInterruptNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +uint32_t ulAPSR; + + /* Only continue if the CPU is not in User mode. The CPU must be in a + Privileged mode for the scheduler to start. */ + __asm( "MRS ulAPSR, APSR" ); + ulAPSR &= portAPSR_MODE_BITS_MASK; + configASSERT( ulAPSR != portAPSR_USER_MODE ); + + if( ulAPSR != portAPSR_USER_MODE ) + { + /* Only continue if the binary point value is set to its lowest possible + setting. See the comments in vPortValidateInterruptPriority() below for + more information. */ + configASSERT( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ); + + if( ( portICCBPR_BINARY_POINT_REGISTER & portBINARY_POINT_BITS ) <= portMAX_BINARY_POINT_VALUE ) + { + /* Start the timer that generates the tick ISR. */ + configSETUP_TICK_INTERRUPT(); + + __enable_irq(); + vPortRestoreTaskContext(); + } + } + + /* Will only get here if vTaskStartScheduler() was called with the CPU in + a non-privileged mode or the binary point register was not set to its lowest + possible value. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + /* Disable interrupts as per portDISABLE_INTERRUPTS(); */ + ulPortSetInterruptMask(); + + /* Now interrupts are disabled ulCriticalNesting can be accessed + directly. Increment ulCriticalNesting to keep a count of how many times + portENTER_CRITICAL() has been called. */ + ulCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + assert() if it is being called from an interrupt context. Only API + functions that end in "FromISR" can be used in an interrupt. Only assert if + the critical nesting count is 1 to protect against recursive calls if the + assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ulPortInterruptNesting == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) + { + /* Decrement the nesting count as the critical section is being + exited. */ + ulCriticalNesting--; + + /* If the nesting level has reached zero then all interrupt + priorities must be re-enabled. */ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) + { + /* Critical nesting has reached zero so all interrupt priorities + should be unmasked. */ + portCLEAR_INTERRUPT_MASK(); + } + } +} +/*-----------------------------------------------------------*/ + +void FreeRTOS_Tick_Handler( void ) +{ + /* Set interrupt mask before altering scheduler structures. The tick + handler runs at the lowest priority, so interrupts cannot already be masked, + so there is no need to save and restore the current mask value. */ + __disable_irq(); + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm( "DSB \n" + "ISB \n" ); + __enable_irq(); + + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + ulPortYieldRequired = pdTRUE; + } + + /* Ensure all interrupt priorities are active again. */ + portCLEAR_INTERRUPT_MASK(); + configCLEAR_TICK_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void vPortTaskUsesFPU( void ) +{ +uint32_t ulInitialFPSCR = 0; + + /* A task is registering the fact that it needs an FPU context. Set the + FPU flag (which is saved as part of the task context). */ + ulPortTaskHasFPUContext = pdTRUE; + + /* Initialise the floating point status register. */ + __asm( "FMXR FPSCR, ulInitialFPSCR" ); +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( uint32_t ulNewMaskValue ) +{ + if( ulNewMaskValue == pdFALSE ) + { + portCLEAR_INTERRUPT_MASK(); + } +} +/*-----------------------------------------------------------*/ + +uint32_t ulPortSetInterruptMask( void ) +{ +uint32_t ulReturn; + + __disable_irq(); + if( portICCPMR_PRIORITY_MASK_REGISTER == ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ) + { + /* Interrupts were already masked. */ + ulReturn = pdTRUE; + } + else + { + ulReturn = pdFALSE; + portICCPMR_PRIORITY_MASK_REGISTER = ( uint32_t ) ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ); + __asm( "DSB \n" + "ISB \n" ); + } + __enable_irq(); + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( portICCRPR_RUNNING_PRIORITY_REGISTER >= ( configMAX_API_CALL_INTERRUPT_PRIORITY << portPRIORITY_SHIFT ) ); + + /* Priority grouping: The interrupt controller (GIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + The priority grouping is configured by the GIC's binary point register + (ICCBPR). Writting 0 to ICCBPR will ensure it is set to its lowest + possible value (which may be above 0). */ + configASSERT( portICCBPR_BINARY_POINT_REGISTER <= portMAX_BINARY_POINT_VALUE ); + } + +#endif /* configASSERT_DEFINED */ + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portASM.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portASM.s new file mode 100644 index 0000000..3cb246e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portASM.s @@ -0,0 +1,175 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + INCLUDE portmacro.inc + + IMPORT vApplicationIRQHandler + IMPORT vTaskSwitchContext + IMPORT ulPortYieldRequired + IMPORT ulPortInterruptNesting + IMPORT vTaskSwitchContext + IMPORT ulICCIAR + IMPORT ulICCEOIR + + EXPORT FreeRTOS_SWI_Handler + EXPORT FreeRTOS_IRQ_Handler + EXPORT vPortRestoreTaskContext + + ARM + AREA PORT_ASM, CODE, READONLY + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; SVC handler is used to yield a task. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_SWI_Handler + + PRESERVE8 + + ; Save the context of the current task and select a new task to run. + portSAVE_CONTEXT + LDR R0, =vTaskSwitchContext + BLX R0 + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; vPortRestoreTaskContext is used to start the scheduler. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +vPortRestoreTaskContext + ; Switch to system mode + CPS #SYS_MODE + portRESTORE_CONTEXT + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; PL390 GIC interrupt handler +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +FreeRTOS_IRQ_Handler + + ; Return to the interrupted instruction. + SUB lr, lr, #4 + + ; Push the return address and SPSR + PUSH {lr} + MRS lr, SPSR + PUSH {lr} + + ; Change to supervisor mode to allow reentry. + CPS #SVC_MODE + + ; Push used registers. + PUSH {r0-r4, r12} + + ; Increment nesting count. r3 holds the address of ulPortInterruptNesting + ; for future use. r1 holds the original ulPortInterruptNesting value for + ; future use. + LDR r3, =ulPortInterruptNesting + LDR r1, [r3] + ADD r4, r1, #1 + STR r4, [r3] + + ; Read value from the interrupt acknowledge register, which is stored in r0 + ; for future parameter and interrupt clearing use. + LDR r2, =ulICCIAR + LDR r0, [r2] + + ; Ensure bit 2 of the stack pointer is clear. r2 holds the bit 2 value for + ; future use. _RB_ Does this ever actually need to be done provided the + ; start of the stack is 8-byte aligned? + MOV r2, sp + AND r2, r2, #4 + SUB sp, sp, r2 + + ; Call the interrupt handler. r4 is pushed to maintain alignment. + PUSH {r0-r4, lr} + LDR r1, =vApplicationIRQHandler + BLX r1 + POP {r0-r4, lr} + ADD sp, sp, r2 + + CPSID i + + ; Write the value read from ICCIAR to ICCEOIR + LDR r4, =ulICCEOIR + STR r0, [r4] + + ; Restore the old nesting count + STR r1, [r3] + + ; A context switch is never performed if the nesting count is not 0 + CMP r1, #0 + BNE exit_without_switch + + ; Did the interrupt request a context switch? r1 holds the address of + ; ulPortYieldRequired and r0 the value of ulPortYieldRequired for future + ; use. + LDR r1, =ulPortYieldRequired + LDR r0, [r1] + CMP r0, #0 + BNE switch_before_exit + +exit_without_switch + ; No context switch. Restore used registers, LR_irq and SPSR before + ; returning. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + MOVS PC, LR + +switch_before_exit + ; A context swtich is to be performed. Clear the context switch pending + ; flag. + MOV r0, #0 + STR r0, [r1] + + ; Restore used registers, LR-irq and SPSR before saving the context + ; to the task stack. + POP {r0-r4, r12} + CPS #IRQ_MODE + POP {LR} + MSR SPSR_cxsf, LR + POP {LR} + portSAVE_CONTEXT + + ; Call the function that selects the new task to execute. + ; vTaskSwitchContext() if vTaskSwitchContext() uses LDRD or STRD + ; instructions, or 8 byte aligned stack allocated data. LR does not need + ; saving as a new LR will be loaded by portRESTORE_CONTEXT anyway. + LDR r0, =vTaskSwitchContext + BLX r0 + + ; Restore the context of, and branch to, the task selected to execute next. + portRESTORE_CONTEXT + + + END + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.h new file mode 100644 index 0000000..9393263 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.h @@ -0,0 +1,164 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the given hardware + * and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* Called at the end of an ISR that can cause a context switch. */ +#define portEND_SWITCHING_ISR( xSwitchRequired )\ +{ \ +extern uint32_t ulPortYieldRequired; \ + \ + if( xSwitchRequired != pdFALSE ) \ + { \ + ulPortYieldRequired = pdTRUE; \ + } \ +} + +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +#define portYIELD() __asm( "SWI 0" ); + + +/*----------------------------------------------------------- + * Critical section control + *----------------------------------------------------------*/ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern uint32_t ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( uint32_t ulNewMaskValue ); + +/* These macros do not globally disable/enable interrupts. They do mask off +interrupts that have a priority below configMAX_API_CALL_INTERRUPT_PRIORITY. */ +#define portENTER_CRITICAL() vPortEnterCritical(); +#define portEXIT_CRITICAL() vPortExitCritical(); +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not required for this port but included in case common demo code that uses these +macros is used. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +/* Prototype of the FreeRTOS tick handler. This must be installed as the +handler for whichever peripheral is used to generate the RTOS tick. */ +void FreeRTOS_Tick_Handler( void ); + +/* Any task that uses the floating point unit MUST call vPortTaskUsesFPU() +before any floating point instructions are executed. */ +void vPortTaskUsesFPU( void ); +#define portTASK_USES_FLOATING_POINT() vPortTaskUsesFPU() + +#define portLOWEST_INTERRUPT_PRIORITY ( ( ( uint32_t ) configUNIQUE_INTERRUPT_PRIORITIES ) - 1UL ) +#define portLOWEST_USABLE_INTERRUPT_PRIORITY ( portLOWEST_INTERRUPT_PRIORITY - 1UL ) + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( uxReadyPriorities ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +#define portNOP() __nop() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.inc b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.inc new file mode 100644 index 0000000..a893f83 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.inc @@ -0,0 +1,121 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + +SYS_MODE EQU 0x1f +SVC_MODE EQU 0x13 +IRQ_MODE EQU 0x12 + + IMPORT ulCriticalNesting + IMPORT pxCurrentTCB + IMPORT ulPortTaskHasFPUContext + IMPORT ulAsmAPIPriorityMask + IMPORT ulICCPMR + + + MACRO + portSAVE_CONTEXT + + ; Save the LR and SPSR onto the system mode stack before switching to + ; system mode to save the remaining system mode registers + SRSDB sp!, #SYS_MODE + CPS #SYS_MODE + PUSH {R0-R12, R14} + + ; Push the critical nesting count + LDR R2, =ulCriticalNesting + LDR R1, [R2] + PUSH {R1} + + ; Does the task have a floating point context that needs saving? If + ; ulPortTaskHasFPUContext is 0 then no. + LDR R2, =ulPortTaskHasFPUContext + LDR R3, [R2] + CMP R3, #0 + + ; Save the floating point context, if any + FMRXNE R1, FPSCR + VPUSHNE {D0-D15} + VPUSHNE {D16-D31} + PUSHNE {R1} + + ; Save ulPortTaskHasFPUContext itself + PUSH {R3} + + ; Save the stack pointer in the TCB + LDR R0, =pxCurrentTCB + LDR R1, [R0] + STR SP, [R1] + + MEND + +; /**********************************************************************/ + + MACRO + portRESTORE_CONTEXT + + ; Set the SP to point to the stack of the task being restored. + LDR R0, =pxCurrentTCB + LDR R1, [R0] + LDR SP, [R1] + + ; Is there a floating point context to restore? If the restored + ; ulPortTaskHasFPUContext is zero then no. + LDR R0, =ulPortTaskHasFPUContext + POP {R1} + STR R1, [R0] + CMP R1, #0 + + ; Restore the floating point context, if any + POPNE {R0} + VPOPNE {D16-D31} + VPOPNE {D0-D15} + VMSRNE FPSCR, R0 + + ; Restore the critical section nesting depth + LDR R0, =ulCriticalNesting + POP {R1} + STR R1, [R0] + + ; Ensure the priority mask is correct for the critical nesting depth + LDR R2, =ulICCPMR + CMP R1, #0 + MOVEQ R4, #255 + LDRNE R4, =ulAsmAPIPriorityMask + STR R4, [r2] + + ; Restore all system mode registers other than the SP (which is already + ; being used) + POP {R0-R12, R14} + + ; Return to the task code, loading CPSR on the way. + RFEIA sp! + + MEND + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/port.c new file mode 100644 index 0000000..d82e33b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/port.c @@ -0,0 +1,616 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM0 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#ifndef portMISSED_COUNTS_FACTOR + #define portMISSED_COUNTS_FACTOR ( 94UL ) +#endif + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* Legacy macro for backward compatibility only. This macro used to be used to + * replace the function that configures the clock used to generate the tick + * interrupt (prvSetupTimerInterrupt()), but now the function is declared weak so + * the application writer can override it by simply defining a function of the + * same name (vApplicationSetupTickInterrupt()). */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* The number of SysTick increments that make up one tick period. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* This function is no longer used, but retained for backward + * compatibility. */ +} +/*-----------------------------------------------------------*/ + +__asm void prvPortStartFirstTask( void ) +{ + extern pxCurrentTCB; + + PRESERVE8 + + /* The MSP stack is not reset as, unlike on M3/4 parts, there is no vector + * table offset register that can be used to locate the initial stack value. + * Not all M0 parts have the application vector table at address 0. */ +/* *INDENT-OFF* */ + + ldr r3, = pxCurrentTCB /* Obtain location of pxCurrentTCB. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, # 32 /* Discard everything up to r0. */ + msr psp, r0 /* This is now the new top of stack to use in the task. */ + movs r0, # 2 /* Switch to the psp stack. */ + msr CONTROL, r0 + isb + pop { r0 - r5 } /* Pop the registers that are saved automatically. */ + mov lr, r5 /* lr is now in r5. */ + pop { r3 } /* The return address is now in r3. */ + pop { r2 } /* Pop and discard the XPSR. */ + cpsie i /* The first task has its context and interrupts can be enabled. */ + bx r3 /* Finally, jump to the user defined task code. */ + + ALIGN +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + * within the specified behaviour for the architecture. */ + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm uint32_t ulSetInterruptMaskFromISR( void ) +{ +/* *INDENT-OFF* */ + mrs r0, PRIMASK + cpsid i + bx lr +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void vClearInterruptMaskFromISR( uint32_t ulMask ) +{ +/* *INDENT-OFF* */ + msr PRIMASK, r0 + bx lr +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern vTaskSwitchContext + extern pxCurrentTCB + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + + ldr r3, = pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [ r3 ] + + subs r0, # 32 /* Make space for the remaining low registers. */ + str r0, [ r2 ] /* Save the new top of stack. */ + stmia r0 !, { r4 - r7 } /* Store the low registers that are not saved automatically. */ + mov r4, r8 /* Store the high registers. */ + mov r5, r9 + mov r6, r10 + mov r7, r11 + stmia r0 !, { r4 - r7 } + + push { r3, r14 } + cpsid i + bl vTaskSwitchContext + cpsie i + pop { r2, r3 } /* lr goes in r3. r2 now holds tcb pointer. */ + + ldr r1, [ r2 ] + ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ + adds r0, # 16 /* Move to the high registers. */ + ldmia r0 !, { r4 - r7 } /* Pop the high registers. */ + mov r8, r4 + mov r9, r5 + mov r10, r6 + mov r11, r7 + + msr psp, r0 /* Remember the new top of stack for the task. */ + + subs r0, # 32 /* Go back for the low registers that are not automatically restored. */ + ldmia r0 !, { r4 - r7 } /* Pop low registers. */ + + bx r3 + ALIGN +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +#if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + __weak void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the __disable_irq() + * call above. */ + __enable_irq(); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the __disable_irq() call above. */ + __enable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __enable_irq(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/portmacro.h new file mode 100644 index 0000000..8b4c0c4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/portmacro.h @@ -0,0 +1,125 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + extern void vPortYield( void ); + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portYIELD() vPortYield() + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + extern uint32_t ulSetInterruptMaskFromISR( void ); + extern void vClearInterruptMaskFromISR( uint32_t ulMask ); + + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMaskFromISR( x ) + #define portDISABLE_INTERRUPTS() __disable_irq() + #define portENABLE_INTERRUPTS() __enable_irq() + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + + #define portNOP() + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/port.c new file mode 100644 index 0000000..167ce78 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/port.c @@ -0,0 +1,772 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM3 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +/* Legacy macro for backward compatibility only. This macro used to be used to + * replace the function that configures the clock used to generate the tick + * interrupt (prvSetupTimerInterrupt()), but now the function is declared weak so + * the application writer can override it by simply defining a function of the + * same name (vApplicationSetupTickInterrupt()). */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + ldr r3, = pxCurrentTCB /* Restore the context. */ + ldr r1, [ r3 ] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0 !, { r4 - r11 } /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + msr psp, r0 /* Restore the task stack pointer. */ + isb + mov r0, # 0 + msr basepri, r0 + orr r14, # 0xd + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [ r0 ] + ldr r0, [ r0 ] + + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + /* Call SVC to start the first task. */ + svc 0 + nop + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + * priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + isb + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [ r3 ] + + stmdb r0 !, { r4 - r11 } /* Save the remaining registers. */ + str r0, [ r2 ] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp !, { r3, r14 } + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp !, { r3, r14 } + + ldr r1, [ r3 ] + ldr r0, [ r1 ] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0 !, { r4 - r11 } /* Pop the registers and the critical nesting count. */ + msr psp, r0 + isb + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known - therefore the slightly faster vPortRaiseBASEPRI() function is used + * in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + vPortRaiseBASEPRI(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + + vPortClearBASEPRIFromISR(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the __disable_irq() + * call above. */ + __enable_irq(); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the __disable_irq() call above. */ + __enable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __enable_irq(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + __weak void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm uint32_t vPortGetIPSR( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, ipsr + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/portmacro.h new file mode 100644 index 0000000..db1c44e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/portmacro.h @@ -0,0 +1,266 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ + #define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ + } +/*-----------------------------------------------------------*/ + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + + #endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline + #endif + +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) + { + __asm + { + /* Barrier instructions are not used as this function is only used to + * lower the BASEPRI value. */ +/* *INDENT-OFF* */ + msr basepri, ulBASEPRI +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) + { + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + * used to lower the mask in an interrupt, so memory barriers are not + * used. */ +/* *INDENT-OFF* */ + msr basepri, # 0 +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + mrs ulReturn, basepri + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } + + return ulReturn; + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { +/* *INDENT-OFF* */ + mrs ulCurrentInterrupt, ipsr +/* *INDENT-ON* */ + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/port.c new file mode 100644 index 0000000..9c0892a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/port.c @@ -0,0 +1,864 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +/* Legacy macro for backward compatibility only. This macro used to be used to + * replace the function that configures the clock used to generate the tick + * interrupt (prvSetupTimerInterrupt()), but now the function is declared weak so + * the application writer can override it by simply defining a function of the + * same name (vApplicationSetupTickInterrupt()). */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +/* Constants used to detect a Cortex-M7 r0p1 core, which should use the ARM_CM7 + * r0p1 port. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Functions defined in portasm.s to enable the VFP. + */ +static void prvEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [ r3 ] + ldr r0, [ r1 ] + /* Pop the core registers. */ + ldmia r0!, {r4-r11,r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [ r0 ] + ldr r0, [ r0 ] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + + /* Clear the bit that indicates the FPU is in use in case the FPU was used + * before the scheduler was started - which would otherwise result in the + * unnecessary leaving of space in the SVC stack for lazy saving of FPU + * registers. */ + mov r0, #0 + msr control, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + /* Call SVC to start the first task. */ + svc 0 + nop + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvEnableVFP( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [ r0 ] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [ r0 ] + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* This port can be used on all revisions of the Cortex-M7 core other than + * the r0p1 parts. r0p1 parts should use the port from the + * /source/portable/GCC/ARM_CM7/r0p1 directory. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + * priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + prvEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [ r3 ] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [ r2 ] + + stmdb sp!, {r0, r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + dsb + isb + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + * too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + nop + #endif + #endif + + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known - therefore the slightly faster vPortRaiseBASEPRI() function is used + * in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + vPortRaiseBASEPRI(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + + vPortClearBASEPRIFromISR(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the __disable_irq() + * call above. */ + __enable_irq(); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the __disable_irq() call above. */ + __enable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __enable_irq(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + __weak void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm uint32_t vPortGetIPSR( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, ipsr + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..21ac481 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/portmacro.h @@ -0,0 +1,265 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ + #define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ + } +/*-----------------------------------------------------------*/ + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + + #endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline + #endif + +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) + { + __asm + { + /* Barrier instructions are not used as this function is only used to + * lower the BASEPRI value. */ +/* *INDENT-OFF* */ + msr basepri, ulBASEPRI +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) + { + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + * used to lower the mask in an interrupt, so memory barriers are not + * used. */ +/* *INDENT-OFF* */ + msr basepri, # 0 +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + mrs ulReturn, basepri + msr basepri, ulNewBASEPRI + dsb + isb +/* *INDENT-ON* */ + } + + return ulReturn; + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { +/* *INDENT-OFF* */ + mrs ulCurrentInterrupt, ipsr +/* *INDENT-ON* */ + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/port.c new file mode 100644 index 0000000..d9dbf66 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/port.c @@ -0,0 +1,1043 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4 MPU port. +*----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#ifndef configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS + #warning "configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS is not defined. We recommend defining it to 0 in FreeRTOSConfig.h for better security." + #define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 +#endif + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SHPR2_REG ( *( ( volatile uint32_t * ) 0xe000ed1c ) ) +#define portNVIC_SYS_CTRL_STATE_REG ( *( ( volatile uint32_t * ) 0xe000ed24 ) ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants used to detect Cortex-M7 r0p0 and r0p1 cores, and ensure + * that a work around is active for errata 837070. */ +#define portCPUID ( *( ( volatile uint32_t * ) 0xE000ed00 ) ) +#define portCORTEX_M7_r0p1_ID ( 0x410FC271UL ) +#define portCORTEX_M7_r0p0_ID ( 0x410FC270UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE_REG ( *( ( volatile uint32_t * ) 0xe000ed90 ) ) +#define portMPU_REGION_BASE_ADDRESS_REG ( *( ( volatile uint32_t * ) 0xe000ed9C ) ) +#define portMPU_REGION_ATTRIBUTE_REG ( *( ( volatile uint32_t * ) 0xe000edA0 ) ) +#define portMPU_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed94 ) ) +#define portEXPECTED_MPU_TYPE_VALUE ( configTOTAL_MPU_REGIONS << 8UL ) +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_CLK ( 0x00000004UL ) +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( uint32_t ) configMAX_SYSCALL_INTERRUPT_PRIORITY - 1UL ) << 24UL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34UL ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) +#define portINITIAL_EXC_RETURN ( 0xfffffffdUL ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Each task maintains its own interrupt status in the critical nesting + * variable. Note this is not saved as part of the task context as context + * switches can only occur when uxCriticalNesting is zero. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +void vSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +void prvSVCHandler( uint32_t * pulRegisters ) __attribute__( ( used ) ) PRIVILEGED_FUNCTION; + +/* + * Function to enable the VFP. + */ +static void vPortEnableVFP( void ); + +/* + * Utility function. + */ +static uint32_t prvPortGetIPSR( void ); + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +BaseType_t xIsPrivileged( void ); + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + * + * Bit 0 of the CONTROL register defines the privilege level of Thread Mode. + * Bit[0] = 0 --> The processor is running privileged + * Bit[0] = 1 --> The processor is running unprivileged. + */ +void vResetPrivilege( void ); + +/** + * @brief Enter critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortEnterCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortEnterCritical( void ) PRIVILEGED_FUNCTION; +#endif + +/** + * @brief Exit from critical section. + */ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + void vPortExitCritical( void ) FREERTOS_SYSTEM_CALL; +#else + void vPortExitCritical( void ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void prvSVCHandler( uint32_t * pulParam ) +{ + uint8_t ucSVCNumber; + uint32_t ulReg, ulPC; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + extern uint32_t __syscalls_flash_start__; + extern uint32_t __syscalls_flash_end__; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + /* The stack contains: r0, r1, r2, r3, r12, LR, PC and xPSR. The first + * argument (r0) is pulParam[ 0 ]. */ + ulPC = pulParam[ portOFFSET_TO_PC ]; + ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ]; + + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER: + portNVIC_SHPR2_REG |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD: + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required + * but do ensure the code is completely + * within the specified behaviour for the + * architecture. */ + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + break; + + #if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) + case portSVC_RAISE_PRIVILEGE: /* Only raise the privilege, if the + * svc was raised from any of the + * system calls. */ + + if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) && + ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) ) + { + __asm + { +/* *INDENT-OFF* */ + mrs ulReg, control /* Obtain current control value. */ + bic ulReg, # 1 /* Set privilege bit. */ + msr control, ulReg /* Write back new control value. */ +/* *INDENT-ON* */ + } + } + + break; + #else /* if ( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + case portSVC_RAISE_PRIVILEGE: + __asm + { +/* *INDENT-OFF* */ + mrs ulReg, control /* Obtain current control value. */ + bic ulReg, # 1 /* Set privilege bit. */ + msr control, ulReg /* Write back new control value. */ +/* *INDENT-ON* */ + } + break; + #endif /* #if( configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY == 1 ) */ + + default: /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ + extern prvSVCHandler + +/* *INDENT-OFF* */ + PRESERVE8 + + /* Assumes psp was in use. */ + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + tst lr, # 4 + ite eq + mrseq r0, msp + mrsne r0, psp + #else + mrs r0, psp + #endif + + b prvSVCHandler +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvRestoreContextOfFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + ldr r0, =0xE000ED08 /* Use the NVIC offset register to locate the stack. */ + ldr r0, [ r0 ] + ldr r0, [ r0 ] + msr msp, r0 /* Set the msp back to the start of the stack. */ + ldr r3, =pxCurrentTCB /* Restore the context. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] /* The first item in the TCB is the task top of stack. */ + add r1, r1, #4 /* Move onto the second item in the TCB... */ + + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [ r2 ] /* Read the value of MPU_CTRL. */ + bic r3, r3, # 1 /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + str r3, [ r2 ] /* Disable MPU. */ + + ldr r2, =0xe000ed9c /* Region Base Address register. */ + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + + #if ( configTOTAL_MPU_REGIONS == 16 ) + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + #endif /* configTOTAL_MPU_REGIONS == 16. */ + + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [ r2 ] /* Read the value of MPU_CTRL. */ + orr r3, r3, #1 /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + str r3, [ r2 ] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + + ldmia r0 !, { r3 - r11, r14 } /* Pop the registers that are not automatically saved on exception entry. */ + msr control, r3 + msr psp, r0 /* Restore the task stack pointer. */ + mov r0, #0 + msr basepri, r0 + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* Errata 837070 workaround must only be enabled on Cortex-M7 r0p0 + * and r0p1 cores. */ + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + configASSERT( ( portCPUID == portCORTEX_M7_r0p1_ID ) || ( portCPUID == portCORTEX_M7_r0p0_ID ) ); + #else + /* When using this port on a Cortex-M7 r0p0 or r0p1 core, define + * configENABLE_ERRATA_837070_WORKAROUND to 1 in your + * FreeRTOSConfig.h. */ + configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); + configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); + #endif + + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the same priority as the kernel, and the SVC + * handler higher priority so it can be used to exit a critical section (where + * lower priorities are masked). */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [ r0 ] + ldr r0, [ r0 ] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + + /* Clear the bit that indicates the FPU is in use in case the FPU was used + * before the scheduler was started - which would otherwise result in the + * unnecessary leaving of space in the SVC stack for lazy saving of FPU + * registers. */ + mov r0, #0 + msr control, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + svc portSVC_START_SCHEDULER /* System call to start first task. */ + nop + nop +/* *INDENT-ON* */ +} + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + } +#else + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +#endif +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +#if( configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS == 1 ) + if( portIS_PRIVILEGED() == pdFALSE ) + { + portRAISE_PRIVILEGE(); + portMEMORY_BARRIER(); + + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + portMEMORY_BARRIER(); + + portRESET_PRIVILEGE(); + portMEMORY_BARRIER(); + } + else + { + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + } +#else + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +#endif +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [ r3 ] + + tst r14, #0x10 /* Is the task using the FPU context? If so, push high vfp registers. */ + it eq + vstmdbeq r0 !, { s16 - s31 } + + mrs r1, control + stmdb r0 !, { r1, r4 - r11, r14 } /* Save the remaining registers. */ + str r0, [ r2 ] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp !, { r0, r3 } + mov r0, # configMAX_SYSCALL_INTERRUPT_PRIORITY + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + cpsid i /* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + msr basepri, r0 + dsb + isb + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + cpsie i /* ARM Cortex-M7 r0p1 Errata 837070 workaround. */ + #endif + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp !, { r0, r3 } + /* Restore the context. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] /* The first item in the TCB is the task top of stack. */ + add r1, r1, #4 /* Move onto the second item in the TCB... */ + + dmb /* Complete outstanding transfers before disabling MPU. */ + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [ r2 ] /* Read the value of MPU_CTRL. */ + bic r3, r3, #1 /* r3 = r3 & ~1 i.e. Clear the bit 0 in r3. */ + str r3, [ r2 ] /* Disable MPU. */ + + ldr r2, =0xe000ed9c /* Region Base Address register. */ + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 4 - 7]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers [MPU Region # 4 - 7]. */ + + #if ( configTOTAL_MPU_REGIONS == 16 ) + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 8 - 11]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers. [MPU Region # 8 - 11]. */ + ldmia r1 !, { r4 - r11 } /* Read 4 sets of MPU registers [MPU Region # 12 - 15]. */ + stmia r2, { r4 - r11 } /* Write 4 sets of MPU registers. [MPU Region # 12 - 15]. */ + #endif /* configTOTAL_MPU_REGIONS == 16. */ + + ldr r2, =0xe000ed94 /* MPU_CTRL register. */ + ldr r3, [ r2 ] /* Read the value of MPU_CTRL. */ + orr r3, r3, #1 /* r3 = r3 | 1 i.e. Set the bit 0 in r3. */ + str r3, [ r2 ] /* Enable MPU. */ + dsb /* Force memory writes before continuing. */ + + ldmia r0 !, { r3 - r11, r14 } /* Pop the registers that are not automatically saved on exception entry. */ + msr control, r3 + + tst r14, #0x10 /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + it eq + vldmiaeq r0 !, { s16 - s31 } + + msr psp, r0 + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vSetupTimerInterrupt( void ) +{ + /* Reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + +__asm void vPortSwitchToUserMode( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, control + orr r0, #1 + msr control, r0 + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void vPortEnableVFP( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + ldr.w r0, =0xE000ED88 /* The FPU enable bits are in the CPACR. */ + ldr r1, [ r0 ] + + orr r1, r1, #( 0xf << 20 ) /* Enable CP10 and CP11 coprocessors, then save back. */ + str r1, [ r0 ] + bx r14 + nop + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ + extern uint32_t __privileged_functions_start__; + extern uint32_t __privileged_functions_end__; + extern uint32_t __FLASH_segment_start__; + extern uint32_t __FLASH_segment_end__; + extern uint32_t __privileged_data_start__; + extern uint32_t __privileged_data_end__; + + /* The only permitted number of regions are 8 or 16. */ + configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) ); + + /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */ + configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ); + + /* Check the expected MPU is present. */ + if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the unprivileged flash for unprivileged read only access. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __FLASH_segment_end__ - ( uint32_t ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged flash for privileged only access. This is where + * the kernel code is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_functions_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( ( configTEX_S_C_B_FLASH & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_functions_end__ - ( uint32_t ) __privileged_functions_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + * is placed. */ + portMPU_REGION_BASE_ADDRESS_REG = ( ( uint32_t ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + prvGetMPURegionSizeSetting( ( uint32_t ) __privileged_data_end__ - ( uint32_t ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + * system peripherals and registers are protected. */ + portMPU_REGION_BASE_ADDRESS_REG = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + portMPU_REGION_ATTRIBUTE_REG = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + portNVIC_SYS_CTRL_STATE_REG |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + portMPU_CTRL_REG |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static uint32_t prvGetMPURegionSizeSetting( uint32_t ulActualSizeInBytes ) +{ + uint32_t ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + * ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + * into the the correct bit position of the attribute register. */ + return( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +__asm BaseType_t xIsPrivileged( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, control /* r0 = CONTROL. */ + tst r0, #1 /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */ + ite ne + movne r0, #0 /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */ + moveq r0, #1 /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */ + bx lr /* Return. */ +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void vResetPrivilege( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, control /* r0 = CONTROL. */ + orrs r0, #1 /* r0 = r0 | 1. */ + msr control, r0 /* CONTROL = r0. */ + bx lr /* Return. */ +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) +{ + extern uint32_t __SRAM_segment_start__; + extern uint32_t __SRAM_segment_end__; + extern uint32_t __privileged_data_start__; + extern uint32_t __privileged_data_end__; + + + int32_t lIndex; + uint32_t ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( prvGetMPURegionSizeSetting( ( uint32_t ) __SRAM_segment_end__ - ( uint32_t ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate user configurable regions. */ + for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID ); + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + * which case the stack region parameters will be valid. At all other + * times the stack parameters will not be valid and it is assumed that the + * stack region has already been configured. */ + if( ulStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( uint32_t ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) ) | + ( ( configTEX_S_C_B_SRAM & portMPU_RASR_TEX_S_C_B_MASK ) << portMPU_RASR_TEX_S_C_B_LOCATION ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1UL; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + * xRegions into the CM4 specific MPU settings that are then + * stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( ul - 1UL ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( ( ul - 1UL ) | portMPU_REGION_VALID ); + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +__asm uint32_t prvPortGetIPSR( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, ipsr + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = prvPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/portmacro.h new file mode 100644 index 0000000..c9c942e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/portmacro.h @@ -0,0 +1,427 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif + +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE_UNPRIV_READ_ONLY ( 0x02UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +/* Location of the TEX,S,C,B bits in the MPU Region Attribute and Size + * Register (RASR). */ +#define portMPU_RASR_TEX_S_C_B_LOCATION ( 16UL ) +#define portMPU_RASR_TEX_S_C_B_MASK ( 0x3FUL ) + +/* MPU settings that can be overriden in FreeRTOSConfig.h. */ +#ifndef configTOTAL_MPU_REGIONS + /* Define to 8 for backward compatibility. */ + #define configTOTAL_MPU_REGIONS ( 8UL ) +#endif + +/* + * The TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits define the + * memory type, and where necessary the cacheable and shareable properties + * of the memory region. + * + * The TEX, C, and B bits together indicate the memory type of the region, + * and: + * - For Normal memory, the cacheable properties of the region. + * - For Device memory, whether the region is shareable. + * + * For Normal memory regions, the S bit indicates whether the region is + * shareable. For Strongly-ordered and Device memory, the S bit is ignored. + * + * See the following two tables for setting TEX, S, C and B bits for + * unprivileged flash, privileged flash and privileged RAM regions. + * + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | TEX | C | B | Memory type | Description or Normal region cacheability | Shareable? | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 0 | Strongly-ordered | Strongly ordered | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 0 | 1 | Device | Shared device | Shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 0 | Normal | Outer and inner write-through; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 000 | 1 | 1 | Normal | Outer and inner write-back; no write allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 0 | Normal | Outer and inner Non-cacheable | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 0 | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | IMPLEMENTATION DEFINED | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 001 | 1 | 1 | Normal | Outer and inner write-back; write and read allocate | S bit | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 0 | Device | Non-shared device | Not shareable | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 0 | 1 | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 010 | 1 | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 011 | X | X | Reserved | Reserved | Reserved | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | 1BB | A | A | Normal | Cached memory, with AA and BB indicating the inner and | Reserved | + | | | | | outer cacheability rules that must be exported on the | | + | | | | | bus. See the table below for the cacheability policy | | + | | | | | encoding. memory, BB=Outer policy, AA=Inner policy. | | + +-----+---+---+------------------------+--------------------------------------------------------+-------------------------+ + | + +-----------------------------------------+----------------------------------------+ + | AA or BB subfield of {TEX,C,B} encoding | Cacheability policy | + +-----------------------------------------+----------------------------------------+ + | 00 | Non-cacheable | + +-----------------------------------------+----------------------------------------+ + | 01 | Write-back, write and read allocate | + +-----------------------------------------+----------------------------------------+ + | 10 | Write-through, no write allocate | + +-----------------------------------------+----------------------------------------+ + | 11 | Write-back, no write allocate | + +-----------------------------------------+----------------------------------------+ + */ + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for Flash + * region. */ +#ifndef configTEX_S_C_B_FLASH + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_FLASH ( 0x07UL ) +#endif + +/* TEX, Shareable (S), Cacheable (C) and Bufferable (B) bits for SRAM + * region. */ +#ifndef configTEX_S_C_B_SRAM + /* Default to TEX=000, S=1, C=1, B=1 for backward compatibility. */ + #define configTEX_S_C_B_SRAM ( 0x07UL ) +#endif + +#define portGENERAL_PERIPHERALS_REGION ( configTOTAL_MPU_REGIONS - 5UL ) +#define portSTACK_REGION ( configTOTAL_MPU_REGIONS - 4UL ) +#define portUNPRIVILEGED_FLASH_REGION ( configTOTAL_MPU_REGIONS - 3UL ) +#define portPRIVILEGED_FLASH_REGION ( configTOTAL_MPU_REGIONS - 2UL ) +#define portPRIVILEGED_RAM_REGION ( configTOTAL_MPU_REGIONS - 1UL ) +#define portFIRST_CONFIGURABLE_REGION ( 0UL ) +#define portLAST_CONFIGURABLE_REGION ( configTOTAL_MPU_REGIONS - 6UL ) +#define portNUM_CONFIGURABLE_REGIONS ( configTOTAL_MPU_REGIONS - 5UL ) +#define portTOTAL_NUM_REGIONS_IN_TCB ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus 1 to create space for the stack region. */ + +void vPortSwitchToUserMode( void ); +#define portSWITCH_TO_USER_MODE() vPortSwitchToUserMode() + +typedef struct MPU_REGION_REGISTERS +{ + uint32_t ulRegionBaseAddress; + uint32_t ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS_IN_TCB ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm{ SVC portSVC_YIELD } +#define portYIELD_WITHIN_API() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ + } +/*-----------------------------------------------------------*/ + +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; } while( 0 ) +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() +#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#define portINLINE __inline + +#ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline +#endif +/*-----------------------------------------------------------*/ + +extern BaseType_t xIsPrivileged( void ); +extern void vResetPrivilege( void ); + +/** + * @brief Checks whether or not the processor is privileged. + * + * @return 1 if the processor is already privileged, 0 otherwise. + */ +#define portIS_PRIVILEGED() xIsPrivileged() + +/** + * @brief Raise an SVC request to raise privilege. + */ +#define portRAISE_PRIVILEGE() __asm { svc portSVC_RAISE_PRIVILEGE } + +/** + * @brief Lowers the privilege level by setting the bit 0 of the CONTROL + * register. + */ +#define portRESET_PRIVILEGE() vResetPrivilege() +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) +{ + __asm + { + /* Barrier instructions are not used as this function is only used to + * lower the BASEPRI value. */ +/* *INDENT-OFF* */ + msr basepri, ulBASEPRI +/* *INDENT-ON* */ + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortRaiseBASEPRI( void ) +{ + uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + cpsid i + #endif + msr basepri, ulNewBASEPRI + dsb + isb + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + cpsie i + #endif +/* *INDENT-ON* */ + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) +{ + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + * used to lower the mask in an interrupt, so memory barriers are not + * used. */ +/* *INDENT-OFF* */ + msr basepri, # 0 +/* *INDENT-ON* */ + } +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) +{ + uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + mrs ulReturn, basepri + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + cpsid i + #endif + msr basepri, ulNewBASEPRI + dsb + isb + #if ( configENABLE_ERRATA_837070_WORKAROUND == 1 ) + cpsie i + #endif +/* *INDENT-ON* */ + } + + return ulReturn; +} +/*-----------------------------------------------------------*/ + +static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) +{ + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { + mrs ulCurrentInterrupt, ipsr + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#ifndef configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY + #warning "configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY is not defined. We recommend defining it to 1 in FreeRTOSConfig.h for better security. https://www.FreeRTOS.org/FreeRTOS-V10.3.x.html" + #define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 0 +#endif +/*-----------------------------------------------------------*/ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/ReadMe.txt new file mode 100644 index 0000000..0a2e7fd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/ReadMe.txt @@ -0,0 +1,18 @@ +There are two options for running FreeRTOS on ARM Cortex-M7 microcontrollers. +The best option depends on the revision of the ARM Cortex-M7 core in use. The +revision is specified by an 'r' number, and a 'p' number, so will look something +like 'r0p1'. Check the documentation for the microcontroller in use to find the +revision of the Cortex-M7 core used in that microcontroller. If in doubt, use +the FreeRTOS port provided specifically for r0p1 revisions, as that can be used +with all core revisions. + +The first option is to use the ARM Cortex-M4F port, and the second option is to +use the Cortex-M7 r0p1 port - the latter containing a minor errata workaround. + +If the revision of the ARM Cortex-M7 core is not r0p1 then either option can be +used, but it is recommended to use the FreeRTOS ARM Cortex-M4F port located in +the /FreeRTOS/Source/portable/RVDS/ARM_CM4F directory. + +If the revision of the ARM Cortex-M7 core is r0p1 then use the FreeRTOS ARM +Cortex-M7 r0p1 port located in the /FreeRTOS/Source/portable/RVDS/ARM_CM7/r0p1 +directory. \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/port.c new file mode 100644 index 0000000..9796035 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/port.c @@ -0,0 +1,850 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM7 port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http: /*www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ +#endif + +/* The __weak attribute does not work as you might expect with the Keil tools + * so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if + * the application writer wants to provide their own implementation of + * vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION + * is defined. */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_SET_BIT ( 1UL << 26UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( *( ( volatile uint32_t * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( uint8_t ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( uint8_t ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( uint8_t ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#define portMISSED_COUNTS_FACTOR ( 94UL ) + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* Let the user override the default SysTick clock rate. If defined by the + * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the + * configuration register. */ +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ ( configCPU_CLOCK_HZ ) + /* Ensure the SysTick is clocked at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( portNVIC_SYSTICK_CLK_BIT ) +#else + /* Select the option to clock SysTick not at the same frequency as the core. */ + #define portNVIC_SYSTICK_CLK_BIT_CONFIG ( 0 ) +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Functions defined in portasm.s to enable the VFP. + */ +static void prvEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static UBaseType_t uxCriticalNesting = 0xaaaaaaaa; + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static uint8_t ucMaxSysCallPriority = 0; + static uint32_t ulMaxPRIGROUPValue = 0; + static const volatile uint8_t * const pcInterruptPriorityRegisters = ( uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [ r3 ] + ldr r0, [ r1 ] + /* Pop the core registers. */ + ldmia r0!, { r4-r11, r14 } + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [ r0 ] + ldr r0, [ r0 ] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + + /* Clear the bit that indicates the FPU is in use in case the FPU was used + * before the scheduler was started - which would otherwise result in the + * unnecessary leaving of space in the SVC stack for lazy saving of FPU + * registers. */ + mov r0, #0 + msr control, r0 + /* Globally enable interrupts. */ + cpsie i + cpsie f + dsb + isb + /* Call SVC to start the first task. */ + svc 0 + nop + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +__asm void prvEnableVFP( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [ r0 ] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [ r0 ] + bx r14 + nop +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + #if ( configASSERT_DEFINED == 1 ) + { + volatile uint32_t ulOriginalPriority; + volatile uint8_t * const pucFirstUserPriorityRegister = ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile uint8_t ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + * functions can be called. ISR safe functions are those that end in + * "FromISR". FreeRTOS maintains separate thread and ISR API functions to + * ensure interrupt entry is as fast and simple as possible. + * + * Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pucFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + * possible bits. */ + *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pucFirstUserPriorityRegister; + + /* The kernel interrupt priority should be set to the lowest + * priority. */ + configASSERT( ucMaxPriorityValue == ( configKERNEL_INTERRUPT_PRIORITY & ucMaxPriorityValue ) ); + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + * of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( uint8_t ) 0x01; + } + + #ifdef __NVIC_PRIO_BITS + { + /* Check the CMSIS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == __NVIC_PRIO_BITS ); + } + #endif + + #ifdef configPRIO_BITS + { + /* Check the FreeRTOS configuration that defines the number of + * priority bits matches the number of priority bits actually queried + * from the hardware. */ + configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); + } + #endif + + /* Shift the priority group value back to its position within the AIRCR + * register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + * value. */ + *pucFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* configASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + prvEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( uxCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( uxCriticalNesting == 1 ) + { + configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, psp + isb + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [ r3 ] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14 } + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [ r2 ] + + stmdb sp!, { r0, r3 } + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + cpsid i + msr basepri, r0 + dsb + isb + cpsie i + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, { r0, r3 } + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [ r3 ] + ldr r0, [ r1 ] + + /* Pop the core registers. */ + ldmia r0!, { r4-r11, r14 } + + /* Is the task using the FPU context? If so, pop the high vfp registers + * too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, { s16-s31 } + + msr psp, r0 + isb + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + nop + #endif + #endif + + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + * executes all interrupts must be unmasked. There is therefore no need to + * save and then restore the interrupt mask value as its value is already + * known - therefore the slightly faster vPortRaiseBASEPRI() function is used + * in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ + vPortRaiseBASEPRI(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + * the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + + vPortClearBASEPRIFromISR(); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __weak void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Re-enable interrupts - see comments above the __disable_irq() + * call above. */ + __enable_irq(); + } + else + { + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Use the SysTick current-value register to determine the number of + * SysTick decrements remaining until the next tick interrupt. If the + * current-value register is zero, then there are actually + * ulTimerCountsForOneTick decrements remaining, not zero, because the + * SysTick requests the interrupt when decrementing from 1 to 0. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulTimerCountsForOneTick; + } + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code normally executes part + * way through the first tick period. But if the SysTick IRQ is now + * pending, then clear the IRQ, suppressing the first tick, and correct + * the reload value to reflect that the second tick period is already + * underway. The expected idle time is always at least two ticks. */ + ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 ) + { + portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT; + ulReloadValue -= ulTimerCountsForOneTick; + } + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. See comments above + * the __disable_irq() call above. */ + __enable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __disable_irq(); + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT ); + + /* Determine whether the SysTick has already counted to zero. */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt ended the sleep (or is now pending), and + * a new tick period has started. Reset portNVIC_SYSTICK_LOAD_REG + * with whatever remains of the new tick period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long or because the SysTick current-value register + * is zero. */ + if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. */ + + /* Use the SysTick current-value register to determine the + * number of SysTick decrements remaining until the expected idle + * time would have ended. */ + ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT ) + { + /* If the SysTick is not using the core clock, the current- + * value register might still be zero here. In that case, the + * SysTick didn't load from the reload register, and there are + * ulReloadValue decrements remaining in the expected idle + * time, not zero. */ + if( ulSysTickDecrementsLeft == 0 ) + { + ulSysTickDecrementsLeft = ulReloadValue; + } + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again, + * then set portNVIC_SYSTICK_LOAD_REG back to its standard value. If + * the SysTick is not using the core clock, temporarily configure it to + * use the core clock. This configuration forces the SysTick to load + * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next + * cycle of the other clock. Then portNVIC_SYSTICK_LOAD_REG is ready + * to receive the standard value immediately. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT ) + { + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + #else + { + /* The temporary usage of the core clock has served its purpose, + * as described above. Resume usage of the other clock. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + /* The partial tick period already ended. Be sure the SysTick + * counts it only once. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0; + } + + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */ + + /* Step the tick to account for any tick periods that elapsed. */ + vTaskStepTick( ulCompleteTickPeriods ); + + /* Exit with interrupts enabled. */ + __enable_irq(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if ( configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 ) + + __weak void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and clear the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm uint32_t vPortGetIPSR( void ) +{ +/* *INDENT-OFF* */ + PRESERVE8 + + mrs r0, ipsr + bx r14 +/* *INDENT-ON* */ +} +/*-----------------------------------------------------------*/ + +#if ( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + uint32_t ulCurrentInterrupt; + uint8_t ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + * an interrupt that has been assigned a priority above + * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + * function. ISR safe FreeRTOS API functions must *only* be called + * from interrupts that have been assigned a priority at or below + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Numerically low interrupt priority numbers represent logically high + * interrupt priorities, therefore the priority of the interrupt must + * be set to a value equal to or numerically *higher* than + * configMAX_SYSCALL_INTERRUPT_PRIORITY. + * + * Interrupts that use the FreeRTOS API must not be left at their + * default priority of zero as that is the highest possible priority, + * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + * and therefore also guaranteed to be invalid. + * + * FreeRTOS maintains separate thread and ISR API functions to ensure + * interrupt entry is as fast and simple as possible. + * + * The following links provide detailed information: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + * https://www.FreeRTOS.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + * that define each interrupt's priority to be split between bits that + * define the interrupt's pre-emption priority bits and bits that define + * the interrupt's sub-priority. For simplicity all bits must be defined + * to be pre-emption priority bits. The following assertion will fail if + * this is not the case (if some bits represent a sub-priority). + * + * If the application only uses CMSIS libraries for interrupt + * configuration then the correct setting can be achieved on all Cortex-M + * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + * scheduler. Note however that some vendor specific peripheral libraries + * assume a non-zero priority group setting, in which cases using a value + * of zero will result in unpredictable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/portmacro.h new file mode 100644 index 0000000..b1d9a98 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/portmacro.h @@ -0,0 +1,269 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + +/* Constants used with memory barrier intrinsics. */ + #define portSY_FULL_READ_WRITE ( 15 ) + +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ + #define portYIELD() \ + { \ + /* Set a PendSV to request a context switch. */ \ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \ + \ + /* Barriers are normally not required but do ensure the code is completely \ + * within the specified behaviour for the architecture. */ \ + __dsb( portSY_FULL_READ_WRITE ); \ + __isb( portSY_FULL_READ_WRITE ); \ + } +/*-----------------------------------------------------------*/ + + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portEND_SWITCHING_ISR( xSwitchRequired ) do { if( xSwitchRequired != pdFALSE ) portYIELD(); } while( 0 ) + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() vPortRaiseBASEPRI() + #define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 ) + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortRaiseBASEPRI() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortSetBASEPRI( x ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ + #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + #endif + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + +/* Check the configuration. */ + #if ( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + +/* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + +/*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31UL - ( uint32_t ) __clz( ( uxReadyPriorities ) ) ) + + #endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are + * not necessary for to use this port. They are defined so the common demo files + * (which build with all the ports) will build. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) +/*-----------------------------------------------------------*/ + + #ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() + #endif + +/* portNOP() is not required by this port. */ + #define portNOP() + + #define portINLINE __inline + + #ifndef portFORCE_INLINE + #define portFORCE_INLINE __forceinline + #endif + +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) + { + __asm + { + /* Barrier instructions are not used as this function is only used to + * lower the BASEPRI value. */ +/* *INDENT-OFF* */ + msr basepri, ulBASEPRI +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortRaiseBASEPRI( void ) + { + uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + cpsid i + msr basepri, ulNewBASEPRI + dsb + isb + cpsie i +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE void vPortClearBASEPRIFromISR( void ) + { + __asm + { + /* Set BASEPRI to 0 so no interrupts are masked. This function is only + * used to lower the mask in an interrupt, so memory barriers are not + * used. */ +/* *INDENT-OFF* */ + msr basepri, # 0 +/* *INDENT-ON* */ + } + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE uint32_t ulPortRaiseBASEPRI( void ) + { + uint32_t ulReturn, ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; + + __asm + { + /* Set BASEPRI to the max syscall priority to effect a critical + * section. */ +/* *INDENT-OFF* */ + mrs ulReturn, basepri + cpsid i + msr basepri, ulNewBASEPRI + dsb + isb + cpsie i +/* *INDENT-ON* */ + } + + return ulReturn; + } +/*-----------------------------------------------------------*/ + + static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void ) + { + uint32_t ulCurrentInterrupt; + BaseType_t xReturn; + + /* Obtain the number of the currently executing interrupt. */ + __asm + { +/* *INDENT-OFF* */ + mrs ulCurrentInterrupt, ipsr +/* *INDENT-ON* */ + } + + if( ulCurrentInterrupt == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; + } + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port.c new file mode 100644 index 0000000..82bdc8a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port.c @@ -0,0 +1,647 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX100 port. + *----------------------------------------------------------*/ + +/* Standard C includes. */ +#include "limits.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/* The peripheral clock is divided by this value before being supplying the +CMT. */ +#if ( configUSE_TICKLESS_IDLE == 0 ) + /* If tickless idle is not used then the divisor can be fixed. */ + #define portCLOCK_DIVISOR 8UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 12000000 ) + #define portCLOCK_DIVISOR 512UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 6000000 ) + #define portCLOCK_DIVISOR 128UL +#elif ( configPERIPHERAL_CLOCK_HZ >= 1000000 ) + #define portCLOCK_DIVISOR 32UL +#else + #define portCLOCK_DIVISOR 8UL +#endif + + +/* Keys required to lock and unlock access to certain system registers +respectively. */ +#define portUNLOCK_KEY 0xA50B +#define portLOCK_KEY 0xA500 + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/* + * Sets up the periodic ISR used for the RTOS tick using the CMT. + * The application writer can define configSETUP_TICK_INTERRUPT() (in + * FreeRTOSConfig.h) such that their own tick interrupt configuration is used + * in place of prvSetupTimerInterrupt(). + */ +static void prvSetupTimerInterrupt( void ); +#ifndef configSETUP_TICK_INTERRUPT + /* The user has not provided their own tick interrupt configuration so use + the definition in this file (which uses the interval timer). */ + #define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt() +#endif /* configSETUP_TICK_INTERRUPT */ + +/* + * Called after the sleep mode registers have been configured, prvSleep() + * executes the pre and post sleep macros, and actually calls the wait + * instruction. + */ +#if configUSE_TICKLESS_IDLE == 1 + static void prvSleep( TickType_t xExpectedIdleTime ); +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* These is accessed by the inline assembler functions. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* Calculate how many clock increments make up a single tick period. */ +static const uint32_t ulMatchValueForOneTick = ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + +#if configUSE_TICKLESS_IDLE == 1 + + /* Holds the maximum number of ticks that can be suppressed - which is + basically how far into the future an interrupt can be generated. Set + during initialisation. This is the maximum possible value that the + compare match register can hold divided by ulMatchValueForOneTick. */ + static const TickType_t xMaximumPossibleSuppressedTicks = USHRT_MAX / ( ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) / configTICK_RATE_HZ ); + + /* Flag set from the tick interrupt to allow the sleep processing to know if + sleep mode was exited because of a tick interrupt, or an interrupt + generated by something else. */ + static volatile uint32_t ulTickFlag = pdFALSE; + + /* The CMT counter is stopped temporarily each time it is re-programmed. + The following constant offsets the CMT counter match value by the number of + CMT counts that would typically be missed while the counter was stopped to + compensate for the lost time. The large difference between the divided CMT + clock and the CPU clock means it is likely ulStoppedTimerCompensation will + equal zero - and be optimised away. */ + static const uint32_t ulStoppedTimerCompensation = 100UL / ( configCPU_CLOCK_HZ / ( configPERIPHERAL_CLOCK_HZ / portCLOCK_DIVISOR ) ); + +#endif + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + /* Leave space for the registers that will get popped from the stack + when the task first starts executing. */ + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate + the tick interrupt. This way the application can decide which + peripheral to use. If tickless mode is used then the default + implementation defined in this file (which uses CMT0) should not be + overridden. */ + configSETUP_TICK_INTERRUPT(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Execution should not reach here as the tasks are now running! + prvSetupTimerInterrupt() is called here to prevent the compiler outputting + a warning about a statically declared function not being referenced in the + case that the application writer has provided their own tick interrupt + configuration routine (and defined configSETUP_TICK_INTERRUPT() such that + their own routine will be called in place of prvSetupTimerInterrupt()). */ + prvSetupTimerInterrupt(); + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15 /* Accumulator high 32 bits. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( prvTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void prvTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); + + #if configUSE_TICKLESS_IDLE == 1 + { + /* The CPU woke because of a tick. */ + ulTickFlag = pdTRUE; + + /* If this is the first tick since exiting tickless mode then the CMT + compare match value needs resetting. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + } + #endif +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack + when the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the accumulator. */ + MVFACHI R15 + PUSH.L R15 + MVFACMI R15 ; Middle order word. + SHLL #16, R15 ; Shifted left as it is restored to the low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the + kernel structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is + required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + /* Unlock. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Enable CMT0. */ + MSTP( CMT0 ) = 0; + + /* Lock again. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Interrupt on compare match. */ + CMT0.CMCR.BIT.CMIE = 1; + + /* Set the compare match value. */ + CMT0.CMCOR = ( uint16_t ) ulMatchValueForOneTick; + + /* Divide the PCLK. */ + #if portCLOCK_DIVISOR == 512 + { + CMT0.CMCR.BIT.CKS = 3; + } + #elif portCLOCK_DIVISOR == 128 + { + CMT0.CMCR.BIT.CKS = 2; + } + #elif portCLOCK_DIVISOR == 32 + { + CMT0.CMCR.BIT.CKS = 1; + } + #elif portCLOCK_DIVISOR == 8 + { + CMT0.CMCR.BIT.CKS = 0; + } + #else + { + #error Invalid portCLOCK_DIVISOR setting + } + #endif + + + /* Enable the interrupt... */ + _IEN( _CMT0_CMI0 ) = 1; + + /* ...and set its priority to the application defined kernel priority. */ + _IPR( _CMT0_CMI0 ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the timer. */ + CMT.CMSTR0.BIT.STR0 = 1; +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + static void prvSleep( TickType_t xExpectedIdleTime ) + { + /* Allow the application to define some pre-sleep processing. */ + configPRE_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* xExpectedIdleTime being set to 0 by configPRE_SLEEP_PROCESSING() + means the application defined code has already executed the WAIT + instruction. */ + if( xExpectedIdleTime > 0 ) + { + wait(); + } + + /* Allow the application to define some post sleep processing. */ + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulMatchValue, ulCompleteTickPeriods, ulCurrentCount; + eSleepModeStatus eSleepAction; + + /* THIS FUNCTION IS CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* Make sure the CMT reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Calculate the reload value required to wait xExpectedIdleTime tick + periods. */ + ulMatchValue = ulMatchValueForOneTick * xExpectedIdleTime; + if( ulMatchValue > ulStoppedTimerCompensation ) + { + /* Compensate for the fact that the CMT is going to be stopped + momentarily. */ + ulMatchValue -= ulStoppedTimerCompensation; + } + + /* Stop the CMT momentarily. The time the CMT is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + /* Critical section using the global interrupt bit as the i bit is + automatically reset by the WAIT instruction. */ + clrpsw_i(); + + /* The tick flag is set to false before sleeping. If it is true when + sleep mode is exited then sleep mode was probably exited because the + tick was suppressed for the entire xExpectedIdleTime period. */ + ulTickFlag = pdFALSE; + + /* If a context switch is pending then abandon the low power entry as + the context switch might have been pended by an external interrupt that + requires processing. */ + eSleepAction = eTaskConfirmSleepModeStatus(); + if( eSleepAction == eAbortSleep ) + { + /* Restart tick. */ + CMT.CMSTR0.BIT.STR0 = 1; + setpsw_i(); + } + else if( eSleepAction == eNoTasksWaitingTimeout ) + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for software standby with all clocks stopped. */ + SYSTEM.SBYCR.BIT.SSBY = 1; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Restart the CMT. */ + CMT.CMSTR0.BIT.STR0 = 1; + } + else + { + /* Protection off. */ + SYSTEM.PRCR.WORD = portUNLOCK_KEY; + + /* Ready for deep sleep mode. */ + SYSTEM.MSTPCRC.BIT.DSLPE = 1; + SYSTEM.MSTPCRA.BIT.MSTPA28 = 1; + SYSTEM.SBYCR.BIT.SSBY = 0; + + /* Protection on. */ + SYSTEM.PRCR.WORD = portLOCK_KEY; + + /* Adjust the match value to take into account that the current + time slice is already partially complete. */ + ulMatchValue -= ( uint32_t ) CMT0.CMCNT; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* Restart the CMT to count up to the new match value. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Sleep until something happens. Calling prvSleep() will + automatically reset the i bit in the PSW. */ + prvSleep( xExpectedIdleTime ); + + /* Stop CMT. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + CMT.CMSTR0.BIT.STR0 = 0; + while( CMT.CMSTR0.BIT.STR0 == 1 ) + { + /* Nothing to do here. */ + } + + ulCurrentCount = ( uint32_t ) CMT0.CMCNT; + + if( ulTickFlag != pdFALSE ) + { + /* The tick interrupt has already executed, although because + this function is called with the scheduler suspended the actual + tick processing will not occur until after this function has + exited. Reset the match value with whatever remains of this + tick period. */ + ulMatchValue = ulMatchValueForOneTick - ulCurrentCount; + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent sleeping. The actual stepping of the tick appears + later in this function. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + How many complete tick periods passed while the processor was + sleeping? */ + ulCompleteTickPeriods = ulCurrentCount / ulMatchValueForOneTick; + + /* The match value is set to whatever fraction of a single tick + period remains. */ + ulMatchValue = ulCurrentCount - ( ulCompleteTickPeriods * ulMatchValueForOneTick ); + CMT0.CMCOR = ( uint16_t ) ulMatchValue; + } + + /* Restart the CMT so it runs up to the match value. The match value + will get set to the value required to generate exactly one tick period + the next time the CMT interrupt executes. */ + CMT0.CMCNT = 0; + CMT.CMSTR0.BIT.STR0 = 1; + + /* Wind the tick forward by the number of tick periods that the CPU + remained in a low power state. */ + vTaskStepTick( ulCompleteTickPeriods ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port_asm.src b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port_asm.src new file mode 100644 index 0000000..119ba14 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port_asm.src @@ -0,0 +1,42 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/portmacro.h new file mode 100644 index 0000000..76d4d68 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/portmacro.h @@ -0,0 +1,152 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other +than portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #872E0H, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) { portYIELD(); } } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() ( UBaseType_t ) get_ipl(); set_ipl( ( signed long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( signed long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#if configUSE_TICKLESS_IDLE == 1 + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port.c new file mode 100644 index 0000000..622dbe6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port.c @@ -0,0 +1,325 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX200 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/*-----------------------------------------------------------*/ + +/* This is accessed by the inline assembler functions so is file scope for +convenience. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Offset to end up on 8 byte boundary. */ + pxTopOfStack--; + + /* R0 is not included as it is the stack pointer. */ + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xaaaabbbb; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15 /* Accumulator high 32 bits. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the accumulator. */ + MVFACHI R15 + PUSH.L R15 + MVFACMI R15 ; Middle order word. + SHLL #16, R15 ; Shifted left as it is restored to the low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port_asm.src b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port_asm.src new file mode 100644 index 0000000..119ba14 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port_asm.src @@ -0,0 +1,42 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/portmacro.h new file mode 100644 index 0000000..ea06305 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/portmacro.h @@ -0,0 +1,142 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #553696, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) portYIELD(); } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port.c new file mode 100644 index 0000000..7246a39 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port.c @@ -0,0 +1,330 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX600 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#include "iodefine.h" + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/*-----------------------------------------------------------*/ + +/* This is accessed by the inline assembler functions so is file scope for +convenience. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x12345678; /* Accumulator. */ + pxTopOfStack--; + *pxTopOfStack = 0x87654321; /* Accumulator. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15 /* Accumulator high 32 bits. */ + POP R15 + MVTC R15,FPSW /* Floating point status word. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulator. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACHI R15 + PUSH.L R15 + MVFACMI R15 ; Middle order word. + SHLL #16, R15 ; Shifted left as it is restored to the low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15 + POP R15 + MVTACHI R15 + POP R15 + MVTC R15,FPSW + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port_asm.src b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port_asm.src new file mode 100644 index 0000000..119ba14 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port_asm.src @@ -0,0 +1,42 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/portmacro.h new file mode 100644 index 0000000..abf11a4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/portmacro.h @@ -0,0 +1,143 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #553696, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) portYIELD(); } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port.c new file mode 100644 index 0000000..88a6892 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port.c @@ -0,0 +1,365 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the RX600 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#if defined( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H ) && ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + #include "platform.h" +#else + #include "iodefine.h" +#endif + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore +PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + and therefore installed in the vector table, when the FreeRTOS code is built +as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/*-----------------------------------------------------------*/ + +/* This is accessed by the inline assembler functions so is file scope for +convenience. */ +extern void *pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + value. Otherwise code space can be saved by just setting the registers + that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else + { + pxTopOfStack -= 15; + } + #endif + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 1. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ + /* When starting the scheduler there is nothing that needs moving to the + interrupt stack because the function is not called from an interrupt. + Just ensure the current stack is the user stack. */ + SETPSW U + + /* Obtain the location of the stack associated with which ever task + pxCurrentTCB is currently pointing to. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [R15], R15 + MOV.L [R15], R0 + + /* Restore the registers from the stack of the task pointed to by + pxCurrentTCB. */ + POP R15 + MVTACLO R15, A0 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A0 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A0 /* Accumulator guard. */ + POP R15 + MVTACLO R15, A1 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A1 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A1 /* Accumulator guard. */ + POP R15 + MVTC R15,FPSW /* Floating point status word. */ + POPM R1-R15 /* R1 to R15 - R0 is not included as it is the SP. */ + RTE /* This pops the remaining registers. */ + NOP + NOP +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + necessitates. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ + /* Re-enable interrupts. */ + SETPSW I + + /* Move the data that was automatically pushed onto the interrupt stack when + the interrupt occurred from the interrupt stack to the user stack. + + R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB #12, R15 + MVTC R15, USP + + /* Copy the data across. */ + MOV.L [ R0 ], [ R15 ] ; R15 + MOV.L 4[ R0 ], 4[ R15 ] ; PC + MOV.L 8[ R0 ], 8[ R15 ] ; PSW + + /* Move the interrupt stack pointer to its new correct position. */ + ADD #12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulators. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACGU #0, A1, R15 + PUSH.L R15 + MVFACHI #0, A1, R15 + PUSH.L R15 + MVFACLO #0, A1, R15 ; Low order word. + PUSH.L R15 + MVFACGU #0, A0, R15 + PUSH.L R15 + MVFACHI #0, A0, R15 + PUSH.L R15 + MVFACLO #0, A0, R15 ; Low order word. + PUSH.L R15 + + /* Save the stack pointer to the TCB. */ + MOV.L #_pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + structures are being accessed. */ + MVTIPL #configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL #configKERNEL_INTERRUPT_PRIORITY + + /* Load the stack pointer of the task that is now selected as the Running + state task from its TCB. */ + MOV.L #_pxCurrentTCB,R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + /* Restore the context of the new task. The PSW (Program Status Word) and + PC will be popped by the RTE instruction. */ + POP R15 + MVTACLO R15, A0 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A0 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A0 /* Accumulator guard. */ + POP R15 + MVTACLO R15, A1 /* Accumulator low 32 bits. */ + POP R15 + MVTACHI R15, A1 /* Accumulator high 32 bits. */ + POP R15 + MVTACGU R15, A1 /* Accumulator guard. */ + POP R15 + MVTC R15,FPSW + POPM R1-R15 + RTE + NOP + NOP +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port_asm.src b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port_asm.src new file mode 100644 index 0000000..c22977d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port_asm.src @@ -0,0 +1,42 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/portmacro.h new file mode 100644 index 0000000..0674d98 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/portmacro.h @@ -0,0 +1,143 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Hardware specifics. */ +#include "machine.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() + + +#pragma inline_asm vPortYield +static void vPortYield( void ) +{ + /* Save clobbered register - may not actually be necessary if inline asm + functions are considered to use the same rules as function calls by the + compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L #553696, R5 + MOV.B #1, [R5] + /* Read back to ensure the value is taken before proceeding. */ + MOV.L [R5], R5 + /* Restore clobbered register to its previous value. */ + POP R5 +} +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) portYIELD(); } while( 0 ) + +/* These macros should not be called directly, but through the +taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is +performed if configASSERT() is defined to ensure an assertion handler does not +inadvertently attempt to lower the IPL when the call to assert was triggered +because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY +when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API +functions are those that end in FromISR. FreeRTOS maintains a separate +interrupt API to ensure API function and interrupt entry is as fast and as +simple as possible. */ +#define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) +#ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#endif + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ +#define portSET_INTERRUPT_MASK_FROM_ISR() ( UBaseType_t ) get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port.c new file mode 100644 index 0000000..8120c9b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port.c @@ -0,0 +1,591 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the RXv3 DPFPU port. +*----------------------------------------------------------*/ + +#warning Testing for DFPU support in this port is not yet complete + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/* Hardware specifics. */ +#if ( configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H == 1 ) + + #include "platform.h" + +#else /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + + #include "iodefine.h" + +#endif /* configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H */ + +/*-----------------------------------------------------------*/ + +/* Tasks should start with interrupts enabled and in Supervisor mode, therefore + * PSW is set with U and I set, and PM and IPL clear. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00030000 ) +#define portINITIAL_FPSW ( ( StackType_t ) 0x00000100 ) +#define portINITIAL_DPSW ( ( StackType_t ) 0x00000100 ) +#define portINITIAL_DCMR ( ( StackType_t ) 0x00000000 ) +#define portINITIAL_DECNT ( ( StackType_t ) 0x00000001 ) + +/* Tasks are not created with a DPFPU context, but can be given a DPFPU context + * after they have been created. A variable is stored as part of the tasks context + * that holds portNO_DPFPU_CONTEXT if the task does not have a DPFPU context, or + * any other value if the task does have a DPFPU context. */ +#define portNO_DPFPU_CONTEXT ( ( StackType_t ) 0 ) +#define portHAS_DPFPU_CONTEXT ( ( StackType_t ) 1 ) + +/* The space on the stack required to hold the DPFPU data registers. This is 16 + * 64-bit registers. */ +#define portDPFPU_DATA_REGISTER_WORDS ( 16 * 2 ) + +/*-----------------------------------------------------------*/ + +/* The following lines are to ensure vSoftwareInterruptEntry can be referenced, + * and therefore installed in the vector table, when the FreeRTOS code is built + * as a library. */ +extern BaseType_t vSoftwareInterruptEntry; +const BaseType_t * p_vSoftwareInterruptEntry = &vSoftwareInterruptEntry; + +/*-----------------------------------------------------------*/ + +/* + * Function to start the first task executing - written in asm code as direct + * access to registers is required. + */ +static void prvStartFirstTask( void ); + +/* + * Software interrupt handler. Performs the actual context switch (saving and + * restoring of registers). Written in asm code as direct register access is + * required. + */ +static void prvYieldHandler( void ); + +/* + * The entry point for the software interrupt handler. This is the function + * that calls the inline asm function prvYieldHandler(). It is installed in + * the vector table, but the code that installs it is in prvYieldHandler rather + * than using a #pragma. + */ +void vSoftwareInterruptISR( void ); + +/* + * The tick ISR handler. The peripheral used is configured by the application + * via a hook/callback function. + */ +void vTickISR( void ); + +/*-----------------------------------------------------------*/ + +/* Saved as part of the task context. If ulPortTaskHasDPFPUContext is non-zero + * then a DPFPU context must be saved and restored for the task. */ +#if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + StackType_t ulPortTaskHasDPFPUContext = portNO_DPFPU_CONTEXT; + +#endif /* configUSE_TASK_DPFPU_SUPPORT */ + +/* This is accessed by the inline assembler functions so is file scope for + * convenience. */ +extern void * pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* R0 is not included as it is the stack pointer. */ + + *pxTopOfStack = 0x00; + pxTopOfStack--; + *pxTopOfStack = portINITIAL_PSW; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; + + /* When debugging it can be useful if every register is set to a known + * value. Otherwise code space can be saved by just setting the registers + * that need to be set. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack--; + *pxTopOfStack = 0xffffffff; /* r15. */ + pxTopOfStack--; + *pxTopOfStack = 0xeeeeeeee; + pxTopOfStack--; + *pxTopOfStack = 0xdddddddd; + pxTopOfStack--; + *pxTopOfStack = 0xcccccccc; + pxTopOfStack--; + *pxTopOfStack = 0xbbbbbbbb; + pxTopOfStack--; + *pxTopOfStack = 0xaaaaaaaa; + pxTopOfStack--; + *pxTopOfStack = 0x99999999; + pxTopOfStack--; + *pxTopOfStack = 0x88888888; + pxTopOfStack--; + *pxTopOfStack = 0x77777777; + pxTopOfStack--; + *pxTopOfStack = 0x66666666; + pxTopOfStack--; + *pxTopOfStack = 0x55555555; + pxTopOfStack--; + *pxTopOfStack = 0x44444444; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + } + #else /* ifdef USE_FULL_REGISTER_INITIALISATION */ + { + pxTopOfStack -= 15; + } + #endif /* ifdef USE_FULL_REGISTER_INITIALISATION */ + + *pxTopOfStack = ( StackType_t ) pvParameters; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_FPSW; + pxTopOfStack--; + *pxTopOfStack = 0x11111111; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x22222222; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x33333333; /* Accumulator 1. */ + pxTopOfStack--; + *pxTopOfStack = 0x44444444; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x55555555; /* Accumulator 0. */ + pxTopOfStack--; + *pxTopOfStack = 0x66666666; /* Accumulator 0. */ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + { + /* The task will start without a DPFPU context. A task that + * uses the DPFPU hardware must call vPortTaskUsesDPFPU() before + * executing any floating point instructions. */ + pxTopOfStack--; + *pxTopOfStack = portNO_DPFPU_CONTEXT; + } + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + { + /* The task will start with a DPFPU context. Leave enough + * space for the registers - and ensure they are initialised if desired. */ + #ifdef USE_FULL_REGISTER_INITIALISATION + { + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1515.1515; /* DR15. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1414.1414; /* DR14. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1313.1313; /* DR13. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1212.1212; /* DR12. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1111.1111; /* DR11. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 1010.1010; /* DR10. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 909.0909; /* DR9. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 808.0808; /* DR8. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 707.0707; /* DR7. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 606.0606; /* DR6. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 505.0505; /* DR5. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 404.0404; /* DR4. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 303.0303; /* DR3. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 202.0202; /* DR2. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 101.0101; /* DR1. */ + pxTopOfStack -= 2; + *(double *)pxTopOfStack = 9876.54321;/* DR0. */ + } + #else /* ifdef USE_FULL_REGISTER_INITIALISATION */ + { + pxTopOfStack -= portDPFPU_DATA_REGISTER_WORDS; + memset( pxTopOfStack, 0x00, portDPFPU_DATA_REGISTER_WORDS * sizeof( StackType_t ) ); + } + #endif /* ifdef USE_FULL_REGISTER_INITIALISATION */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_DECNT; /* DECNT. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_DCMR; /* DCMR. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_DPSW; /* DPSW. */ + } + #elif ( configUSE_TASK_DPFPU_SUPPORT == 0 ) + { + /* Omit DPFPU support. */ + } + #else /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + { + #error Invalid configUSE_TASK_DPFPU_SUPPORT setting - configUSE_TASK_DPFPU_SUPPORT must be set to 0, 1, 2, or left undefined. + } + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + void vPortTaskUsesDPFPU( void ) + { + /* A task is registering the fact that it needs a DPFPU context. Set the + * DPFPU flag (which is saved as part of the task context). */ + ulPortTaskHasDPFPUContext = portHAS_DPFPU_CONTEXT; + } + +#endif /* configUSE_TASK_DPFPU_SUPPORT */ +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + extern void vApplicationSetupTimerInterrupt( void ); + + /* Use pxCurrentTCB just so it does not get optimised away. */ + if( pxCurrentTCB != NULL ) + { + /* Call an application function to set up the timer that will generate the + * tick interrupt. This way the application can decide which peripheral to + * use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Enable the software interrupt. */ + _IEN( _ICU_SWINT ) = 1; + + /* Ensure the software interrupt is clear. */ + _IR( _ICU_SWINT ) = 0; + + /* Ensure the software interrupt is set to the kernel priority. */ + _IPR( _ICU_SWINT ) = configKERNEL_INTERRUPT_PRIORITY; + + /* Start the first task. */ + prvStartFirstTask(); + } + + /* Just to make sure the function is not optimised away. */ + ( void ) vSoftwareInterruptISR(); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( pxCurrentTCB == NULL ); + + /* The following line is just to prevent the symbol getting optimised away. */ + ( void ) vTaskSwitchContext(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvStartFirstTask +static void prvStartFirstTask( void ) +{ +#ifndef __CDT_PARSER__ + + /* When starting the scheduler there is nothing that needs moving to the + * interrupt stack because the function is not called from an interrupt. + * Just ensure the current stack is the user stack. */ + SETPSW U + + + /* Obtain the location of the stack associated with which ever task + * pxCurrentTCB is currently pointing to. */ + MOV.L # _pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + + /* Restore the registers from the stack of the task pointed to by + * pxCurrentTCB. */ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + /* The restored ulPortTaskHasDPFPUContext is to be zero here. + * So, it is never necessary to restore the DPFPU context here. */ + POP R15 + MOV.L # _ulPortTaskHasDPFPUContext, R14 + MOV.L R15, [ R14 ] + + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + + /* Restore the DPFPU context. */ + DPOPM.L DPSW-DECNT + DPOPM.D DR0-DR15 + + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A0 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A0 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A0 + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A1 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A1 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A1 + POP R15 + + /* Floating point status word. */ + MVTC R15, FPSW + + /* R1 to R15 - R0 is not included as it is the SP. */ + POPM R1-R15 + + /* This pops the remaining registers. */ + RTE + NOP + NOP + +#endif /* ifndef __CDT_PARSER__ */ +} +/*-----------------------------------------------------------*/ + +void vSoftwareInterruptISR( void ) +{ + prvYieldHandler(); +} +/*-----------------------------------------------------------*/ + +#pragma inline_asm prvYieldHandler +static void prvYieldHandler( void ) +{ +#ifndef __CDT_PARSER__ + + /* Re-enable interrupts. */ + SETPSW I + + + /* Move the data that was automatically pushed onto the interrupt stack when + * the interrupt occurred from the interrupt stack to the user stack. + * + * R15 is saved before it is clobbered. */ + PUSH.L R15 + + /* Read the user stack pointer. */ + MVFC USP, R15 + + /* Move the address down to the data being moved. */ + SUB # 12, R15 + MVTC R15, USP + + /* Copy the data across, R15, then PC, then PSW. */ + MOV.L [ R0 ], [ R15 ] + MOV.L 4[ R0 ], 4[ R15 ] + MOV.L 8[ R0 ], 8[ R15 ] + + /* Move the interrupt stack pointer to its new correct position. */ + ADD # 12, R0 + + /* All the rest of the registers are saved directly to the user stack. */ + SETPSW U + + /* Save the rest of the general registers (R15 has been saved already). */ + PUSHM R1-R14 + + /* Save the FPSW and accumulators. */ + MVFC FPSW, R15 + PUSH.L R15 + MVFACGU # 0, A1, R15 + PUSH.L R15 + MVFACHI # 0, A1, R15 + PUSH.L R15 + MVFACLO # 0, A1, R15 /* Low order word. */ + PUSH.L R15 + MVFACGU # 0, A0, R15 + PUSH.L R15 + MVFACHI # 0, A0, R15 + PUSH.L R15 + MVFACLO # 0, A0, R15 /* Low order word. */ + PUSH.L R15 + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + /* Does the task have a DPFPU context that needs saving? If + * ulPortTaskHasDPFPUContext is 0 then no. */ + MOV.L # _ulPortTaskHasDPFPUContext, R15 + MOV.L [ R15 ], R15 + CMP # 0, R15 + + /* Save the DPFPU context, if any. */ + BEQ.B ?+ + DPUSHM.D DR0-DR15 + DPUSHM.L DPSW-DECNT + ?: + + /* Save ulPortTaskHasDPFPUContext itself. */ + PUSH.L R15 + + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + + /* Save the DPFPU context, always. */ + DPUSHM.D DR0-DR15 + DPUSHM.L DPSW-DECNT + + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + + /* Save the stack pointer to the TCB. */ + MOV.L # _pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L R0, [ R15 ] + + + /* Ensure the interrupt mask is set to the syscall priority while the kernel + * structures are being accessed. */ + MVTIPL # configMAX_SYSCALL_INTERRUPT_PRIORITY + + /* Select the next task to run. */ + BSR.A _vTaskSwitchContext + + /* Reset the interrupt mask as no more data structure access is required. */ + MVTIPL # configKERNEL_INTERRUPT_PRIORITY + + + /* Load the stack pointer of the task that is now selected as the Running + * state task from its TCB. */ + MOV.L # _pxCurrentTCB, R15 + MOV.L [ R15 ], R15 + MOV.L [ R15 ], R0 + + + /* Restore the context of the new task. The PSW (Program Status Word) and + * PC will be popped by the RTE instruction. */ + + #if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) + + /* Is there a DPFPU context to restore? If the restored + * ulPortTaskHasDPFPUContext is zero then no. */ + POP R15 + MOV.L # _ulPortTaskHasDPFPUContext, R14 + MOV.L R15, [ R14 ] + CMP # 0, R15 + + /* Restore the DPFPU context, if any. */ + BEQ.B ?+ + DPOPM.L DPSW-DECNT + DPOPM.D DR0-DR15 + ?: + + #elif ( configUSE_TASK_DPFPU_SUPPORT == 2 ) + + /* Restore the DPFPU context, always. */ + DPOPM.L DPSW-DECNT + DPOPM.D DR0-DR15 + + #endif /* if ( configUSE_TASK_DPFPU_SUPPORT == 1 ) */ + + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A0 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A0 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A0 + POP R15 + + /* Accumulator low 32 bits. */ + MVTACLO R15, A1 + POP R15 + + /* Accumulator high 32 bits. */ + MVTACHI R15, A1 + POP R15 + + /* Accumulator guard. */ + MVTACGU R15, A1 + POP R15 + MVTC R15, FPSW + POPM R1-R15 + RTE + NOP + NOP + +#endif /* ifndef __CDT_PARSER__ */ +} +/*-----------------------------------------------------------*/ + +#pragma interrupt ( vTickISR( vect = _VECT( configTICK_VECTOR ), enable ) ) +void vTickISR( void ) +{ + /* Increment the tick, and perform any processing the new tick value + * necessitates. Ensure IPL is at the max syscall value first. */ + set_ipl( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + { + if( xTaskIncrementTick() != pdFALSE ) + { + taskYIELD(); + } + } + set_ipl( configKERNEL_INTERRUPT_PRIORITY ); +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port_asm.src b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port_asm.src new file mode 100644 index 0000000..c22977d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port_asm.src @@ -0,0 +1,42 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + .GLB _vSoftwareInterruptISR + .GLB _vSoftwareInterruptEntry + + .SECTION P,CODE + +_vSoftwareInterruptEntry: + + BRA _vSoftwareInterruptISR + + .RVECTOR 27, _vSoftwareInterruptEntry + + .END + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/portmacro.h new file mode 100644 index 0000000..a6878cd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/portmacro.h @@ -0,0 +1,186 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/* Hardware specifics. */ + #include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* When the FIT configurator or the Smart Configurator is used, platform.h has to be + * used. */ + #ifndef configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H + #define configINCLUDE_PLATFORM_H_INSTEAD_OF_IODEFINE_H 0 + #endif + +/* If configUSE_TASK_DPFPU_SUPPORT is set to 1 (or undefined) then each task will + * be created without a DPFPU context, and a task must call vTaskUsesDPFPU() before + * making use of any DPFPU registers. If configUSE_TASK_DPFPU_SUPPORT is set to 2 then + * tasks are created with a DPFPU context by default, and calling vTaskUsesDPFPU() has + * no effect. If configUSE_TASK_DPFPU_SUPPORT is set to 0 then tasks never take care + * of any DPFPU context (even if DPFPU registers are used). */ + #ifndef configUSE_TASK_DPFPU_SUPPORT + #define configUSE_TASK_DPFPU_SUPPORT 1 + #endif + +/*-----------------------------------------------------------*/ + +/* Type definitions - these are a bit legacy and not really used now, other than + * portSTACK_TYPE and portBASE_TYPE. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif + +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ + #define portBYTE_ALIGNMENT 8 /* Could make four, according to manual. */ + #define portSTACK_GROWTH -1 + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portNOP() nop() + +/* Yield equivalent to "*portITU_SWINTR = 0x01; ( void ) *portITU_SWINTR;" + * where portITU_SWINTR is the location of the software interrupt register + * (0x000872E0). Don't rely on the assembler to select a register, so instead + * save and restore clobbered registers manually. */ + #pragma inline_asm vPortYield + static void vPortYield( void ) + { + #ifndef __CDT_PARSER__ + /* Save clobbered register - may not actually be necessary if inline asm + * functions are considered to use the same rules as function calls by the + * compiler. */ + PUSH.L R5 + /* Set ITU SWINTR. */ + MOV.L # 000872E0H, R5 + MOV.B # 1, [ R5 ] + /* Read back to ensure the value is taken before proceeding. */ + CMP [ R5 ].UB, R5 + /* Restore clobbered register to its previous value. */ + POP R5 + #endif + } + + #define portYIELD() vPortYield() + #define portYIELD_FROM_ISR( x ) do { if( ( x ) != pdFALSE ) portYIELD(); } while( 0 ) + +/* These macros should not be called directly, but through the + * taskENTER_CRITICAL() and taskEXIT_CRITICAL() macros. An extra check is + * performed if configASSERT() is defined to ensure an assertion handler does not + * inadvertently attempt to lower the IPL when the call to assert was triggered + * because the IPL value was found to be above configMAX_SYSCALL_INTERRUPT_PRIORITY + * when an ISR safe FreeRTOS API function was executed. ISR safe FreeRTOS API + * functions are those that end in FromISR. FreeRTOS maintains a separate + * interrupt API to ensure API function and interrupt entry is as fast and as + * simple as possible. */ + #define portENABLE_INTERRUPTS() set_ipl( ( long ) 0 ) + #ifdef configASSERT + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() configASSERT( ( get_ipl() <= configMAX_SYSCALL_INTERRUPT_PRIORITY ) ) + #define portDISABLE_INTERRUPTS() if( get_ipl() < configMAX_SYSCALL_INTERRUPT_PRIORITY ) set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) + #else + #define portDISABLE_INTERRUPTS() set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) + #endif + +/* Critical nesting counts are stored in the TCB. */ + #define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ + extern void vTaskEnterCritical( void ); + extern void vTaskExitCritical( void ); + #define portENTER_CRITICAL() vTaskEnterCritical() + #define portEXIT_CRITICAL() vTaskExitCritical() + +/* As this port allows interrupt nesting... */ + #define portSET_INTERRUPT_MASK_FROM_ISR() ( UBaseType_t ) get_ipl(); set_ipl( ( long ) configMAX_SYSCALL_INTERRUPT_PRIORITY ) + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ) set_ipl( ( long ) uxSavedInterruptStatus ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +/*-----------------------------------------------------------*/ + +/* If configUSE_TASK_DPFPU_SUPPORT is set to 1 (or left undefined) then tasks are + * created without a DPFPU context and must call vPortTaskUsesDPFPU() to give + * themselves a DPFPU context before using any DPFPU instructions. If + * configUSE_TASK_DPFPU_SUPPORT is set to 2 then all tasks will have a DPFPU context + * by default. */ + #if( configUSE_TASK_DPFPU_SUPPORT == 1 ) + void vPortTaskUsesDPFPU( void ); + #else +/* Each task has a DPFPU context already, so define this function away to + * nothing to prevent it being called accidentally. */ + #define vPortTaskUsesDPFPU() + #endif + #define portTASK_USES_DPFPU() vPortTaskUsesDPFPU() + +/* Definition to allow compatibility with existing FreeRTOS Demo using flop.c. */ + #define portTASK_USES_FLOATING_POINT() vPortTaskUsesDPFPU() + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/readme.txt new file mode 100644 index 0000000..9e89a09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/readme.txt @@ -0,0 +1,72 @@ +The following table shows which port is recommended to be used. + + +RX MCU Group CPU FPU FPU Port Layer + Core (Single (Double CC-RX GNURX ICCRX (*6) + Type Precision) Precision) + +RX110 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX111 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX113 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX130 RXv1 No --- Renesas/RX100 (*1,*2) GCC/RX100 (*1,*2) IAR/RX100 (*1,*2) +RX13T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 + +RX210 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX21A RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX220 RXv1 No --- Renesas/RX200 (*3) N/A (*3) N/A (*3) +RX230,RX231 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23E-A RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23W RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX23T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24T RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX24U RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 + +RX610 RXv1 Yes --- N/A (*4) N/A (*4) N/A (*4) +RX62N,RX621 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX630 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX634 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63N,RX631 RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX64M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX65N,RX651 RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX66N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX62T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX62G RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX63T RXv1 Yes --- Renesas/RX600 GCC/RX600 IAR/RX600 +RX66T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +RX71M RXv2 Yes --- Renesas/RX600v2 GCC/RX600v2 IAR/RXv2 +RX72M RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72N RXv3 Yes Yes Renesas/RX700v3_DPFPU GCC/RX700v3_DPFPU IAR/RX700v3_DPFPU +RX72T RXv3 Yes No Renesas/RX600v2 (*5) GCC/RX600v2 (*5) IAR/RXv2 (*5) + +Notes: + +*1: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is not used, please define configSETUP_TICK_INTERRUPT() (in FreeRTOSConfig.h) and provide +the configuration function. Please be aware that port.c is hard coded to use CMT0 though it seems to be +configured to use any CMTn according to the definition of configTICK_VECTOR (in FreeRTOSConfig.h). + +*2: If the application writer wants to use their own tick interrupt configuration when tickless idle +functionality is used, please modify port.c for the configuration. Please be aware that port.c is +hard coded to use CMT0 though it seems to be configured to use any CMTn according to the definition of +configTICK_VECTOR (in FreeRTOSConfig.h). + +*3: RX100 ports are also available. + +*4: RX600 ports use MVTIPL instruction but RX610 MCUs don't support this instruction. + +*5: RX700v3_DPFPU ports are also available with the following definition in FreeRTOSConfig.h. + +#define configUSE_TASK_DPFPU_SUPPORT 0 + +*6: PriorityDefinitions.h has to be provided for port_asm.s in case of other than RX700v3_DPFPU port. +It contains two definitions of interrupt priority like the following. + +#define configKERNEL_INTERRUPT_PRIORITY 1 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4 + + +For more information about Renesas RX MCUs, please visit the following URL: + +https://www.renesas.com/products/microcontrollers-microprocessors/rx.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/ISR_Support.inc b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/ISR_Support.inc new file mode 100644 index 0000000..7f61460 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/ISR_Support.inc @@ -0,0 +1,75 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + .macro portSAVE_CONTEXT + + ; Save r0 to r14 and pr. + movml.l r15, @-r15 + + ; Save mac1, mach and gbr + sts.l macl, @-r15 + sts.l mach, @-r15 + stc.l gbr, @-r15 + + ; Get the address of pxCurrentTCB + mov.l #_pxCurrentTCB, r0 + + ; Get the address of pxTopOfStack from the TCB. + mov.l @r0, r0 + + ; Save the stack pointer in pxTopOfStack. + mov.l r15, @r0 + + .endm + +;----------------------------------------------------------- + + .macro portRESTORE_CONTEXT + + ; Get the address of the pxCurrentTCB variable. + mov.l #_pxCurrentTCB, r0 + + ; Get the address of the task stack from pxCurrentTCB. + mov.l @r0, r0 + + ; Get the task stack itself into the stack pointer. + mov.l @r0, r15 + + ; Restore system registers. + ldc.l @r15+, gbr + lds.l @r15+, mach + lds.l @r15+, macl + + ; Restore r0 to r14 and PR + movml.l @r15+, r15 + + ; Pop the SR and PC to jump to the start of the task. + rte + nop + + .endm +;----------------------------------------------------------- diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/port.c new file mode 100644 index 0000000..ed431ac --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/port.c @@ -0,0 +1,272 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the SH2A port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Library includes. */ +#include "string.h" + +/*-----------------------------------------------------------*/ + +/* The SR assigned to a newly created task. The only important thing in this +value is for all interrupts to be enabled. */ +#define portINITIAL_SR ( 0UL ) + +/* Dimensions the array into which the floating point context is saved. +Allocate enough space for FPR0 to FPR15, FPUL and FPSCR, each of which is 4 +bytes big. If this number is changed then the 72 in portasm.src also needs +changing. */ +#define portFLOP_REGISTERS_TO_STORE ( 18 ) +#define portFLOP_STORAGE_SIZE ( portFLOP_REGISTERS_TO_STORE * 4 ) + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) + #error configSUPPORT_DYNAMIC_ALLOCATION must be 1 to use this port. +#endif + +/*-----------------------------------------------------------*/ + +/* + * The TRAPA handler used to force a context switch. + */ +void vPortYield( void ); + +/* + * Function to start the first task executing - defined in portasm.src. + */ +extern void vPortStartFirstTask( void ); + +/* + * Obtains the current GBR value - defined in portasm.src. + */ +extern uint32_t ulPortGetGBR( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Mark the end of the stack - used for debugging only and can be removed. */ + *pxTopOfStack = 0x11111111UL; + pxTopOfStack--; + *pxTopOfStack = 0x22222222UL; + pxTopOfStack--; + *pxTopOfStack = 0x33333333UL; + pxTopOfStack--; + + /* SR. */ + *pxTopOfStack = portINITIAL_SR; + pxTopOfStack--; + + /* PC. */ + *pxTopOfStack = ( uint32_t ) pxCode; + pxTopOfStack--; + + /* PR. */ + *pxTopOfStack = 15; + pxTopOfStack--; + + /* 14. */ + *pxTopOfStack = 14; + pxTopOfStack--; + + /* R13. */ + *pxTopOfStack = 13; + pxTopOfStack--; + + /* R12. */ + *pxTopOfStack = 12; + pxTopOfStack--; + + /* R11. */ + *pxTopOfStack = 11; + pxTopOfStack--; + + /* R10. */ + *pxTopOfStack = 10; + pxTopOfStack--; + + /* R9. */ + *pxTopOfStack = 9; + pxTopOfStack--; + + /* R8. */ + *pxTopOfStack = 8; + pxTopOfStack--; + + /* R7. */ + *pxTopOfStack = 7; + pxTopOfStack--; + + /* R6. */ + *pxTopOfStack = 6; + pxTopOfStack--; + + /* R5. */ + *pxTopOfStack = 5; + pxTopOfStack--; + + /* R4. */ + *pxTopOfStack = ( uint32_t ) pvParameters; + pxTopOfStack--; + + /* R3. */ + *pxTopOfStack = 3; + pxTopOfStack--; + + /* R2. */ + *pxTopOfStack = 2; + pxTopOfStack--; + + /* R1. */ + *pxTopOfStack = 1; + pxTopOfStack--; + + /* R0 */ + *pxTopOfStack = 0; + pxTopOfStack--; + + /* MACL. */ + *pxTopOfStack = 16; + pxTopOfStack--; + + /* MACH. */ + *pxTopOfStack = 17; + pxTopOfStack--; + + /* GBR. */ + *pxTopOfStack = ulPortGetGBR(); + + /* GBR = global base register. + VBR = vector base register. + TBR = jump table base register. + R15 is the stack pointer. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ +extern void vApplicationSetupTimerInterrupt( void ); + + /* Call an application function to set up the timer that will generate the + tick interrupt. This way the application can decide which peripheral to + use. A demo application is provided to show a suitable example. */ + vApplicationSetupTimerInterrupt(); + + /* Start the first task. This will only restore the standard registers and + not the flop registers. This does not really matter though because the only + flop register that is initialised to a particular value is fpscr, and it is + only initialised to the current value, which will still be the current value + when the first task starts executing. */ + trapa( portSTART_SCHEDULER_TRAP_NO ); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ +int32_t lInterruptMask; + + /* Ensure the yield trap runs at the same priority as the other interrupts + that can cause a context switch. */ + lInterruptMask = get_imask(); + + /* taskYIELD() can only be called from a task, not an interrupt, so the + current interrupt mask can only be 0 or portKERNEL_INTERRUPT_PRIORITY and + the mask can be set without risk of accidentally lowering the mask value. */ + set_imask( portKERNEL_INTERRUPT_PRIORITY ); + + trapa( portYIELD_TRAP_NO ); + + /* Restore the interrupt mask to whatever it was previously (when the + function was entered). */ + set_imask( ( int ) lInterruptMask ); +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortUsesFloatingPoint( TaskHandle_t xTask ) +{ +uint32_t *pulFlopBuffer; +BaseType_t xReturn; +extern void * volatile pxCurrentTCB; + + /* This function tells the kernel that the task referenced by xTask is + going to use the floating point registers and therefore requires the + floating point registers saved as part of its context. */ + + /* Passing NULL as xTask is used to indicate that the calling task is the + subject task - so pxCurrentTCB is the task handle. */ + if( xTask == NULL ) + { + xTask = ( TaskHandle_t ) pxCurrentTCB; + } + + /* Allocate a buffer large enough to hold all the flop registers. */ + pulFlopBuffer = ( uint32_t * ) pvPortMalloc( portFLOP_STORAGE_SIZE ); + + if( pulFlopBuffer != NULL ) + { + /* Start with the registers in a benign state. */ + memset( ( void * ) pulFlopBuffer, 0x00, portFLOP_STORAGE_SIZE ); + + /* The first thing to get saved in the buffer is the FPSCR value - + initialise this to the current FPSCR value. */ + *pulFlopBuffer = get_fpscr(); + + /* Use the task tag to point to the flop buffer. Pass pointer to just + above the buffer because the flop save routine uses a pre-decrement. */ + vTaskSetApplicationTaskTag( xTask, ( void * ) ( pulFlopBuffer + portFLOP_REGISTERS_TO_STORE ) ); + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portasm.src b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portasm.src new file mode 100644 index 0000000..9b532c7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portasm.src @@ -0,0 +1,151 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + .import _pxCurrentTCB + .import _vTaskSwitchContext + .import _xTaskIncrementTick + + .export _vPortStartFirstTask + .export _ulPortGetGBR + .export _vPortYieldHandler + .export _vPortPreemptiveTick + .export _vPortCooperativeTick + .export _vPortSaveFlopRegisters + .export _vPortRestoreFlopRegisters + + .section P + + .INCLUDE "ISR_Support.inc" + +_vPortStartFirstTask: + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_vPortYieldHandler: + + portSAVE_CONTEXT + + mov.l #_vTaskSwitchContext, r0 + jsr @r0 + nop + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_vPortPreemptiveTick + + portSAVE_CONTEXT + + mov.l #_xTaskIncrementTick, r0 + jsr @r0 + nop + + mov.l #_vTaskSwitchContext, r0 + jsr @r0 + nop + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_vPortCooperativeTick + + portSAVE_CONTEXT + + mov.l #_xTaskIncrementTick, r0 + jsr @r0 + nop + + portRESTORE_CONTEXT + +;----------------------------------------------------------- + +_ulPortGetGBR: + + stc.l gbr, r0 + rts + nop + +;----------------------------------------------------------- + +_vPortSaveFlopRegisters: + + fmov.s fr0, @-r4 + fmov.s fr1, @-r4 + fmov.s fr2, @-r4 + fmov.s fr3, @-r4 + fmov.s fr4, @-r4 + fmov.s fr5, @-r4 + fmov.s fr6, @-r4 + fmov.s fr7, @-r4 + fmov.s fr8, @-r4 + fmov.s fr9, @-r4 + fmov.s fr10, @-r4 + fmov.s fr11, @-r4 + fmov.s fr12, @-r4 + fmov.s fr13, @-r4 + fmov.s fr14, @-r4 + fmov.s fr15, @-r4 + sts.l fpul, @-r4 + sts.l fpscr, @-r4 + + rts + nop + +;----------------------------------------------------------- + +_vPortRestoreFlopRegisters: + + add.l #-72, r4 + lds.l @r4+, fpscr + lds.l @r4+, fpul + fmov.s @r4+, fr15 + fmov.s @r4+, fr14 + fmov.s @r4+, fr13 + fmov.s @r4+, fr12 + fmov.s @r4+, fr11 + fmov.s @r4+, fr10 + fmov.s @r4+, fr9 + fmov.s @r4+, fr8 + fmov.s @r4+, fr7 + fmov.s @r4+, fr6 + fmov.s @r4+, fr5 + fmov.s @r4+, fr4 + fmov.s @r4+, fr3 + fmov.s @r4+, fr2 + fmov.s @r4+, fr1 + fmov.s @r4+, fr0 + + rts + nop + + .end + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portmacro.h new file mode 100644 index 0000000..45a4f80 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portmacro.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions - these are a bit legacy and not really used now, other than +portSTACK_TYPE and portBASE_TYPE. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() nop() +#define portSTART_SCHEDULER_TRAP_NO ( 32 ) +#define portYIELD_TRAP_NO ( 33 ) +#define portKERNEL_INTERRUPT_PRIORITY ( 1 ) + +void vPortYield( void ); +#define portYIELD() vPortYield() + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) vTaskSwitchContext(); } while( 0 ) + +/* + * This function tells the kernel that the task referenced by xTask is going to + * use the floating point registers and therefore requires the floating point + * registers saved as part of its context. + */ +BaseType_t xPortUsesFloatingPoint( void* xTask ); + +/* + * The flop save and restore functions are defined in portasm.src and called by + * the trace "task switched in" and "trace task switched out" macros. + */ +void vPortSaveFlopRegisters( void *pulBuffer ); +void vPortRestoreFlopRegisters( void *pulBuffer ); + +/* + * pxTaskTag is used to point to the buffer into which the floating point + * context should be saved. If pxTaskTag is NULL then the task does not use + * a floating point context. + */ +#define traceTASK_SWITCHED_OUT() do { if( pxCurrentTCB->pxTaskTag != NULL ) vPortSaveFlopRegisters( pxCurrentTCB->pxTaskTag ); } while( 0 ) +#define traceTASK_SWITCHED_IN() do { if( pxCurrentTCB->pxTaskTag != NULL ) vPortRestoreFlopRegisters( pxCurrentTCB->pxTaskTag ); } while( 0 ) + +/* + * These macros should be called directly, but through the taskENTER_CRITICAL() + * and taskEXIT_CRITICAL() macros. + */ +#define portENABLE_INTERRUPTS() set_imask( 0x00 ) +#define portDISABLE_INTERRUPTS() set_imask( portKERNEL_INTERRUPT_PRIORITY ) + +/* Critical nesting counts are stored in the TCB. */ +#define portCRITICAL_NESTING_IN_TCB ( 1 ) + +/* The critical nesting functions defined within tasks.c. */ +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical(); +#define portEXIT_CRITICAL() vTaskExitCritical(); + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/ARM7/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/ARM7/readme.txt new file mode 100644 index 0000000..8d3e87f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/ARM7/readme.txt @@ -0,0 +1 @@ +The Rowley ARM7 demo uses the GCC ARM7 port files. \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/port.c new file mode 100644 index 0000000..473d052 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/port.c @@ -0,0 +1,173 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430 port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each +time a critical section is entered the count is incremented. Each time a +critical section is exited the count is decremented - with interrupts only +being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* The msp430 automatically pushes the PC then SR onto the stack before + executing an ISR. We want the stack to look just as if this has happened + so place a pointer to the start of the task on the stack first - followed + by the flags we want the task to use when it starts up. */ + *pxTopOfStack = ( StackType_t ) pxCode; + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + + /* Next the general purpose registers. */ + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x7777; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xcccc; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + + /* When the task starts is will expect to find the function parameter in + R15. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses timer 0 + * but could alternatively use the watchdog timer or timer 1. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Ensure the timer is stopped. */ + TACTL = 0; + + /* Run the timer of the ACLK. */ + TACTL = TASSEL_1; + + /* Clear everything to start with. */ + TACTL |= TACLR; + + /* Set the compare match value according to the tick rate we want. */ + TACCR0 = portACLK_FREQUENCY_HZ / configTICK_RATE_HZ; + + /* Enable the interrupts. */ + TACCTL0 = CCIE; + + /* Start up clean. */ + TACTL |= TACLR; + + /* Up mode. */ + TACTL |= MC_1; +} +/*-----------------------------------------------------------*/ + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portasm.h new file mode 100644 index 0000000..9d2a38b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portasm.h @@ -0,0 +1,81 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORT_ASM_H +#define PORT_ASM_H + +portSAVE_CONTEXT macro + /* Save the remaining registers. */ + push r4 + push r5 + push r6 + push r7 + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + mov.w &_usCriticalNesting, r14 + push r14 + mov.w &_pxCurrentTCB, r12 + mov.w r1, @r12 + endm +/*-----------------------------------------------------------*/ + +portRESTORE_CONTEXT macro + mov.w &_pxCurrentTCB, r12 + mov.w @r12, r1 + pop r15 + mov.w r15, &_usCriticalNesting + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + pop r7 + pop r6 + pop r5 + pop r4 + + /* The last thing on the stack will be the status register. + Ensure the power down bits are clear ready for the next + time this power down register is popped from the stack. */ + bic.w #0xf0,0(SP) + + reti + endm +/*-----------------------------------------------------------*/ + +#endif + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portext.asm b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portext.asm new file mode 100644 index 0000000..36cd350 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portext.asm @@ -0,0 +1,103 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOSConfig.h" +#include "portasm.h" + + +.CODE + +/* + * The RTOS tick ISR. + * + * If the cooperative scheduler is in use this simply increments the tick + * count. + * + * If the preemptive scheduler is in use a context switch can also occur. + */ +_vTickISR: + portSAVE_CONTEXT + + call #_xTaskIncrementTick + cmp.w #0x00, r15 + jeq _SkipContextSwitch + call #_vTaskSwitchContext +_SkipContextSwitch: + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Manual context switch called by the portYIELD() macro. + */ +_vPortYield:: + + /* Mimic an interrupt by pushing the SR. */ + push SR + + /* Now the SR is stacked we can disable interrupts. */ + dint + + /* Save the context of the current task. */ + portSAVE_CONTEXT + + /* Switch to the highest priority task that is ready to run. */ + call #_vTaskSwitchContext + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + +/* + * Start off the scheduler by initialising the RTOS tick timer, then restoring + * the context of the first task. + */ +_xPortStartScheduler:: + + /* Setup the hardware to generate the tick. Interrupts are disabled + when this function is called. */ + call #_prvSetupTimerInterrupt + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT +/*-----------------------------------------------------------*/ + + + /* Place the tick ISR in the correct vector. */ + .VECTORS + + .KEEP + + ORG TIMERA0_VECTOR + DW _vTickISR + + + + END + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portmacro.h new file mode 100644 index 0000000..472799a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portmacro.h @@ -0,0 +1,133 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() _DINT(); _NOP() +#define portENABLE_INTERRUPTS() _EINT(); +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled usCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ + +/* + * Manual context switch called by portYIELD or taskYIELD. + */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) __toplevel + +#if configINTERRUPT_EXAMPLE_METHOD == 2 + +extern void vTaskSwitchContext( void ); +#define portYIELD_FROM_ISR( x ) do { if( x ) vTaskSwitchContext(); } while( 0 ) + +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/port.c new file mode 100644 index 0000000..bcc9263 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/port.c @@ -0,0 +1,425 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Cygnal port. + *----------------------------------------------------------*/ + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to setup timer 2 to produce the RTOS tick. */ +#define portCLOCK_DIVISOR ( ( uint32_t ) 12 ) +#define portMAX_TIMER_VALUE ( ( uint32_t ) 0xffff ) +#define portENABLE_TIMER ( ( uint8_t ) 0x04 ) +#define portTIMER_2_INTERRUPT_ENABLE ( ( uint8_t ) 0x20 ) + +/* The value used in the IE register when a task first starts. */ +#define portGLOBAL_INTERRUPT_BIT ( ( StackType_t ) 0x80 ) + +/* The value used in the PSW register when a task first starts. */ +#define portINITIAL_PSW ( ( StackType_t ) 0x00 ) + +/* Macro to clear the timer 2 interrupt flag. */ +#define portCLEAR_INTERRUPT_FLAG() TMR2CN &= ~0x80; + +/* Used during a context switch to store the size of the stack being copied +to or from XRAM. */ +data static uint8_t ucStackBytes; + +/* Used during a context switch to point to the next byte in XRAM from/to which +a RAM byte is to be copied. */ +xdata static StackType_t * data pxXRAMStack; + +/* Used during a context switch to point to the next byte in RAM from/to which +an XRAM byte is to be copied. */ +data static StackType_t * data pxRAMStack; + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* + * Setup the hardware to generate an interrupt off timer 2 at the required + * frequency. + */ +static void prvSetupTimerInterrupt( void ); + +/*-----------------------------------------------------------*/ +/* + * Macro that copies the current stack from internal RAM to XRAM. This is + * required as the 8051 only contains enough internal RAM for a single stack, + * but we have a stack for every task. + */ +#define portCOPY_STACK_TO_XRAM() \ +{ \ + /* pxCurrentTCB points to a TCB which itself points to the location into \ + which the first stack byte should be copied. Set pxXRAMStack to point \ + to the location into which the first stack byte is to be copied. */ \ + pxXRAMStack = ( xdata StackType_t * ) *( ( xdata StackType_t ** ) pxCurrentTCB ); \ + \ + /* Set pxRAMStack to point to the first byte to be coped from the stack. */ \ + pxRAMStack = ( data StackType_t * data ) configSTACK_START; \ + \ + /* Calculate the size of the stack we are about to copy from the current \ + stack pointer value. */ \ + ucStackBytes = SP - ( configSTACK_START - 1 ); \ + \ + /* Before starting to copy the stack, store the calculated stack size so \ + the stack can be restored when the task is resumed. */ \ + *pxXRAMStack = ucStackBytes; \ + \ + /* Copy each stack byte in turn. pxXRAMStack is incremented first as we \ + have already stored the stack size into XRAM. */ \ + while( ucStackBytes ) \ + { \ + pxXRAMStack++; \ + *pxXRAMStack = *pxRAMStack; \ + pxRAMStack++; \ + ucStackBytes--; \ + } \ +} +/*-----------------------------------------------------------*/ + +/* + * Macro that copies the stack of the task being resumed from XRAM into + * internal RAM. + */ +#define portCOPY_XRAM_TO_STACK() \ +{ \ + /* Setup the pointers as per portCOPY_STACK_TO_XRAM(), but this time to \ + copy the data back out of XRAM and into the stack. */ \ + pxXRAMStack = ( xdata StackType_t * ) *( ( xdata StackType_t ** ) pxCurrentTCB ); \ + pxRAMStack = ( data StackType_t * data ) ( configSTACK_START - 1 ); \ + \ + /* The first value stored in XRAM was the size of the stack - i.e. the \ + number of bytes we need to copy back. */ \ + ucStackBytes = pxXRAMStack[ 0 ]; \ + \ + /* Copy the required number of bytes back into the stack. */ \ + do \ + { \ + pxXRAMStack++; \ + pxRAMStack++; \ + *pxRAMStack = *pxXRAMStack; \ + ucStackBytes--; \ + } while( ucStackBytes ); \ + \ + /* Restore the stack pointer ready to use the restored stack. */ \ + SP = ( uint8_t ) pxRAMStack; \ +} +/*-----------------------------------------------------------*/ + +/* + * Macro to push the current execution context onto the stack, before the stack + * is moved to XRAM. + */ +#define portSAVE_CONTEXT() \ +{ \ + _asm \ + /* Push ACC first, as when restoring the context it must be restored \ + last (it is used to set the IE register). */ \ + push ACC \ + /* Store the IE register then disable interrupts. */ \ + push IE \ + clr _EA \ + push DPL \ + push DPH \ + push b \ + push ar2 \ + push ar3 \ + push ar4 \ + push ar5 \ + push ar6 \ + push ar7 \ + push ar0 \ + push ar1 \ + push PSW \ + _endasm; \ + PSW = 0; \ + _asm \ + push _bp \ + _endasm; \ +} +/*-----------------------------------------------------------*/ + +/* + * Macro that restores the execution context from the stack. The execution + * context was saved into the stack before the stack was copied into XRAM. + */ +#define portRESTORE_CONTEXT() \ +{ \ + _asm \ + pop _bp \ + pop PSW \ + pop ar1 \ + pop ar0 \ + pop ar7 \ + pop ar6 \ + pop ar5 \ + pop ar4 \ + pop ar3 \ + pop ar2 \ + pop b \ + pop DPH \ + pop DPL \ + /* The next byte of the stack is the IE register. Only the global \ + enable bit forms part of the task context. Pop off the IE then set \ + the global enable bit to match that of the stored IE register. */ \ + pop ACC \ + JB ACC.7,0098$ \ + CLR IE.7 \ + LJMP 0099$ \ + 0098$: \ + SETB IE.7 \ + 0099$: \ + /* Finally pop off the ACC, which was the first register saved. */ \ + pop ACC \ + reti \ + _endasm; \ +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t ulAddress; +StackType_t *pxStartOfStack; + + /* Leave space to write the size of the stack as the first byte. */ + pxStartOfStack = pxTopOfStack; + pxTopOfStack++; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be uncommented if required. + *pxTopOfStack = 0x11; + pxTopOfStack++; + *pxTopOfStack = 0x22; + pxTopOfStack++; + *pxTopOfStack = 0x33; + pxTopOfStack++; + */ + + /* Simulate how the stack would look after a call to the scheduler tick + ISR. + + The return address that would have been pushed by the MCU. */ + ulAddress = ( uint32_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ulAddress; + ulAddress >>= 8; + pxTopOfStack++; + *pxTopOfStack = ( StackType_t ) ( ulAddress ); + pxTopOfStack++; + + /* Next all the registers will have been pushed by portSAVE_CONTEXT(). */ + *pxTopOfStack = 0xaa; /* acc */ + pxTopOfStack++; + + /* We want tasks to start with interrupts enabled. */ + *pxTopOfStack = portGLOBAL_INTERRUPT_BIT; + pxTopOfStack++; + + /* The function parameters will be passed in the DPTR and B register as + a three byte generic pointer is used. */ + ulAddress = ( uint32_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ulAddress; /* DPL */ + ulAddress >>= 8; + *pxTopOfStack++; + *pxTopOfStack = ( StackType_t ) ulAddress; /* DPH */ + ulAddress >>= 8; + pxTopOfStack++; + *pxTopOfStack = ( StackType_t ) ulAddress; /* b */ + pxTopOfStack++; + + /* The remaining registers are straight forward. */ + *pxTopOfStack = 0x02; /* R2 */ + pxTopOfStack++; + *pxTopOfStack = 0x03; /* R3 */ + pxTopOfStack++; + *pxTopOfStack = 0x04; /* R4 */ + pxTopOfStack++; + *pxTopOfStack = 0x05; /* R5 */ + pxTopOfStack++; + *pxTopOfStack = 0x06; /* R6 */ + pxTopOfStack++; + *pxTopOfStack = 0x07; /* R7 */ + pxTopOfStack++; + *pxTopOfStack = 0x00; /* R0 */ + pxTopOfStack++; + *pxTopOfStack = 0x01; /* R1 */ + pxTopOfStack++; + *pxTopOfStack = 0x00; /* PSW */ + pxTopOfStack++; + *pxTopOfStack = 0xbb; /* BP */ + + /* Dont increment the stack size here as we don't want to include + the stack size byte as part of the stack size count. + + Finally we place the stack size at the beginning. */ + *pxStartOfStack = ( StackType_t ) ( pxTopOfStack - pxStartOfStack ); + + /* Unlike most ports, we return the start of the stack as this is where the + size of the stack is stored. */ + return pxStartOfStack; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Setup timer 2 to generate the RTOS tick. */ + prvSetupTimerInterrupt(); + + /* Make sure we start with the expected SFR page. This line should not + really be required. */ + SFRPAGE = 0; + + /* Copy the stack for the first task to execute from XRAM into the stack, + restore the task context from the new stack, then start running the task. */ + portCOPY_XRAM_TO_STACK(); + portRESTORE_CONTEXT(); + + /* Should never get here! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented for this port. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. The first thing we do is save the registers so we + * can use a naked attribute. + */ +void vPortYield( void ) _naked +{ + /* Save the execution context onto the stack, then copy the entire stack + to XRAM. This is necessary as the internal RAM is only large enough to + hold one stack, and we want one per task. + + PERFORMANCE COULD BE IMPROVED BY ONLY COPYING TO XRAM IF A TASK SWITCH + IS REQUIRED. */ + portSAVE_CONTEXT(); + portCOPY_STACK_TO_XRAM(); + + /* Call the standard scheduler context switch function. */ + vTaskSwitchContext(); + + /* Copy the stack of the task about to execute from XRAM into RAM and + restore it's context ready to run on exiting. */ + portCOPY_XRAM_TO_STACK(); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + void vTimer2ISR( void ) interrupt 5 _naked + { + /* Preemptive context switch function triggered by the timer 2 ISR. + This does the same as vPortYield() (see above) with the addition + of incrementing the RTOS tick count. */ + + portSAVE_CONTEXT(); + portCOPY_STACK_TO_XRAM(); + + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + portCLEAR_INTERRUPT_FLAG(); + portCOPY_XRAM_TO_STACK(); + portRESTORE_CONTEXT(); + } +#else + void vTimer2ISR( void ) interrupt 5 + { + /* When using the cooperative scheduler the timer 2 ISR is only + required to increment the RTOS tick count. */ + + xTaskIncrementTick(); + portCLEAR_INTERRUPT_FLAG(); + } +#endif +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +uint8_t ucOriginalSFRPage; + +/* Constants calculated to give the required timer capture values. */ +const uint32_t ulTicksPerSecond = configCPU_CLOCK_HZ / portCLOCK_DIVISOR; +const uint32_t ulCaptureTime = ulTicksPerSecond / configTICK_RATE_HZ; +const uint32_t ulCaptureValue = portMAX_TIMER_VALUE - ulCaptureTime; +const uint8_t ucLowCaptureByte = ( uint8_t ) ( ulCaptureValue & ( uint32_t ) 0xff ); +const uint8_t ucHighCaptureByte = ( uint8_t ) ( ulCaptureValue >> ( uint32_t ) 8 ); + + /* NOTE: This uses a timer only present on 8052 architecture. */ + + /* Remember the current SFR page so we can restore it at the end of the + function. */ + ucOriginalSFRPage = SFRPAGE; + SFRPAGE = 0; + + /* TMR2CF can be left in its default state. */ + TMR2CF = ( uint8_t ) 0; + + /* Setup the overflow reload value. */ + RCAP2L = ucLowCaptureByte; + RCAP2H = ucHighCaptureByte; + + /* The initial load is performed manually. */ + TMR2L = ucLowCaptureByte; + TMR2H = ucHighCaptureByte; + + /* Enable the timer 2 interrupts. */ + IE |= portTIMER_2_INTERRUPT_ENABLE; + + /* Interrupts are disabled when this is called so the timer can be started + here. */ + TMR2CN = portENABLE_TIMER; + + /* Restore the original SFR page. */ + SFRPAGE = ucOriginalSFRPage; +} + + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/portmacro.h new file mode 100644 index 0000000..b6e72b2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/portmacro.h @@ -0,0 +1,116 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#if configUSE_PREEMPTION == 0 + void vTimer2ISR( void ) interrupt 5; +#else + void vTimer2ISR( void ) interrupt 5 _naked; +#endif + +void vSerialISR( void ) interrupt 4; + + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE float +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portENTER_CRITICAL() _asm \ + push ACC \ + push IE \ + _endasm; \ + EA = 0; + +#define portEXIT_CRITICAL() _asm \ + pop ACC \ + _endasm; \ + ACC &= 0x80; \ + IE |= ACC; \ + _asm \ + pop ACC \ + _endasm; + +#define portDISABLE_INTERRUPTS() EA = 0; +#define portENABLE_INTERRUPTS() EA = 1; +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 1 +#define portSTACK_GROWTH ( 1 ) +#define portTICK_PERIOD_MS ( ( uint32_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +void vPortYield( void ) _naked; +#define portYIELD() vPortYield(); +/*-----------------------------------------------------------*/ + +#define portNOP() _asm \ + nop \ + _endasm; + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/__STD_LIB_sbrk.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/__STD_LIB_sbrk.c new file mode 100644 index 0000000..df5cff6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/__STD_LIB_sbrk.c @@ -0,0 +1,55 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */ +/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */ +/* ELIGIBILITY FOR ANY PURPOSES. */ +/* (C) Fujitsu Microelectronics Europe GmbH */ +/*--------------------------------------------------------------------------- + __STD_LIB_sbrk.C + - Used by heap_3.c for memory accocation and deletion. + +/*---------------------------------------------------------------------------*/ + +#include "FreeRTOSConfig.h" +#include + + static long brk_siz = 0; + typedef int _heep_t; + #define ROUNDUP(s) (((s)+sizeof(_heep_t)-1)&~(sizeof(_heep_t)-1)) + static _heep_t _heep[ROUNDUP(configTOTAL_HEAP_SIZE)/sizeof(_heep_t)]; + #define _heep_size ROUNDUP(configTOTAL_HEAP_SIZE) + + extern char *sbrk(int size) + { + if (brk_siz + size > _heep_size || brk_siz + size < 0) + + return((char*)-1); + brk_siz += size; + return( (char*)_heep + brk_siz - size); + } diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/port.c new file mode 100644 index 0000000..19b256c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/port.c @@ -0,0 +1,322 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOS.h" +#include "task.h" +#include "mb91467d.h" + +/*-----------------------------------------------------------*/ + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +#pragma asm +#macro SaveContext + ORCCR #0x20 ;Switch to user stack + ST RP,@-R15 ;Store RP + STM0 (R7,R6,R5,R4,R3,R2,R1,R0) ;Store R7-R0 + STM1 (R14,R13,R12,R11,R10,R9,R8) ;Store R14-R8 + ST MDH, @-R15 ;Store MDH + ST MDL, @-R15 ;Store MDL + + ANDCCR #0xDF ;Switch back to system stack + LD @R15+,R0 ;Store PC to R0 + ORCCR #0x20 ;Switch to user stack + ST R0,@-R15 ;Store PC to User stack + + ANDCCR #0xDF ;Switch back to system stack + LD @R15+,R0 ;Store PS to R0 + ORCCR #0x20 ;Switch to user stack + ST R0,@-R15 ;Store PS to User stack + + LDI #_pxCurrentTCB, R0 ;Get pxCurrentTCB address + LD @R0, R0 ;Get the pxCurrentTCB->pxTopOfStack address + ST R15,@R0 ;Store USP to pxCurrentTCB->pxTopOfStack + + ANDCCR #0xDF ;Switch back to system stack for the rest of tick ISR +#endm + +#macro RestoreContext + LDI #_pxCurrentTCB, R0 ;Get pxCurrentTCB address + LD @R0, R0 ;Get the pxCurrentTCB->pxTopOfStack address + ORCCR #0x20 ;Switch to user stack + LD @R0, R15 ;Restore USP from pxCurrentTCB->pxTopOfStack + + LD @R15+,R0 ;Store PS to R0 + ANDCCR #0xDF ;Switch to system stack + ST R0,@-R15 ;Store PS to system stack + + ORCCR #0x20 ;Switch to user stack + LD @R15+,R0 ;Store PC to R0 + ANDCCR #0xDF ;Switch to system stack + ST R0,@-R15 ;Store PC to system stack + + ORCCR #0x20 ;Switch back to retrieve the remaining context + + LD @R15+, MDL ;Restore MDL + LD @R15+, MDH ;Restore MDH + LDM1 (R14,R13,R12,R11,R10,R9,R8) ;Restore R14-R8 + LDM0 (R7,R6,R5,R4,R3,R2,R1,R0) ;Restore R7-R0 + LD @R15+, RP ;Restore RP + + ANDCCR #0xDF ;Switch back to system stack for the rest of tick ISR +#endm +#pragma endasm + +/*-----------------------------------------------------------*/ + +/* + * Perform hardware setup to enable ticks from timer 1, + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x11111111; + pxTopOfStack--; + *pxTopOfStack = 0x22222222; + pxTopOfStack--; + *pxTopOfStack = 0x33333333; + pxTopOfStack--; + + /* This is a redundant push to the stack, it may be required if + in some implementations of the compiler the parameter to the task + is passed on to the stack rather than in R4 register. */ + *pxTopOfStack = (StackType_t)(pvParameters); + pxTopOfStack--; + + *pxTopOfStack = ( StackType_t ) 0x00000000; /* RP */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00007777; /* R7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00006666; /* R6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00005555; /* R5 */ + pxTopOfStack--; + + /* In the current implementation of the compiler the first + parameter to the task (or function) is passed via R4 parameter + to the task, hence the pvParameters pointer is copied into the R4 + register. See compiler manual section 4.6.2 for more information. */ + *pxTopOfStack = ( StackType_t ) (pvParameters); /* R4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00003333; /* R3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00002222; /* R2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00001111; /* R1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00000001; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000EEEE; /* R14 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000DDDD; /* R13 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000CCCC; /* R12 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000BBBB; /* R11 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0000AAAA; /* R10 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00009999; /* R9 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x00008888; /* R8 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x11110000; /* MDH */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x22220000; /* MDL */ + pxTopOfStack--; + + /* The start of the task code. */ + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + + /* PS - User Mode, USP, ILM=31, Interrupts enabled */ + *pxTopOfStack = ( StackType_t ) 0x001F0030; /* PS */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + #pragma asm + RestoreContext + #pragma endasm + + /* Simulate a function call end as generated by the compiler. We will now + jump to the start of the task the context of which we have just restored. */ + __asm(" reti "); + + /* Should not get here. */ + return pdFAIL; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented - unlikely to ever be required as there is nothing to + return to. */ +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ +/* The peripheral clock divided by 32 is used by the timer. */ +const uint16_t usReloadValue = ( uint16_t ) ( ( ( configPER_CLOCK_HZ / configTICK_RATE_HZ ) / 32UL ) - 1UL ); + + /* Setup RLT0 to generate a tick interrupt. */ + + TMCSR0_CNTE = 0; /* Count Disable */ + TMCSR0_CSL = 0x2; /* CLKP/32 */ + TMCSR0_MOD = 0; /* Software trigger */ + TMCSR0_RELD = 1; /* Reload */ + + TMCSR0_UF = 0; /* Clear underflow flag */ + TMRLR0 = usReloadValue; + TMCSR0_INTE = 1; /* Interrupt Enable */ + TMCSR0_CNTE = 1; /* Count Enable */ + TMCSR0_TRG = 1; /* Trigger */ + + PORTEN = 0x3; /* Port Enable */ +} +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. The tick count is incremented + * after the context is saved. Then the context is switched if required, + * and last the context of the task which is to be resumed is restored. + */ + + #pragma asm + + .global _ReloadTimer0_IRQHandler + _ReloadTimer0_IRQHandler: + + ANDCCR #0xEF ;Disable Interrupts + SaveContext ;Save context + ORCCR #0x10 ;Re-enable Interrupts + + LDI #0xFFFB,R1 + LDI #_tmcsr0, R0 + AND R1,@R0 ;Clear RLT0 interrupt flag + + CALL32 _xTaskIncrementTick,R12 ;Increment Tick + CALL32 _vTaskSwitchContext,R12 ;Switch context if required + + ANDCCR #0xEF ;Disable Interrupts + RestoreContext ;Restore context + ORCCR #0x10 ;Re-enable Interrupts + + RETI + + #pragma endasm + +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + __interrupt void ReloadTimer0_IRQHandler( void ) + { + /* Clear RLT0 interrupt flag */ + TMCSR0_UF = 0; + xTaskIncrementTick(); + } + +#endif + +/* + * Manual context switch. We can use a __nosavereg attribute as the context + * would be saved by PortSAVE_CONTEXT(). The context is switched and then + * the context of the new task is restored saved. + */ +#pragma asm + + .global _vPortYieldDelayed + _vPortYieldDelayed: + + ANDCCR #0xEF ;Disable Interrupts + SaveContext ;Save context + ORCCR #0x10 ;Re-enable Interrupts + + LDI #_dicr, R0 + BANDL #0x0E, @R0 ;Clear Delayed interrupt flag + + CALL32 _vTaskSwitchContext,R12 ;Switch context if required + + ANDCCR #0xEF ;Disable Interrupts + RestoreContext ;Restore context + ORCCR #0x10 ;Re-enable Interrupts + + RETI + +#pragma endasm +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. We can use a __nosavereg attribute as the context + * would be saved by PortSAVE_CONTEXT(). The context is switched and then + * the context of the new task is restored saved. + */ +#pragma asm + + .global _vPortYield + _vPortYield: + + SaveContext ;Save context + CALL32 _vTaskSwitchContext,R12 ;Switch context if required + RestoreContext ;Restore context + + RETI + +#pragma endasm +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/portmacro.h new file mode 100644 index 0000000..5b61a58 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/portmacro.h @@ -0,0 +1,110 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* Hardware specific includes. */ +#include "mb91467d.h" + +/* Standard includes. */ +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#if configKERNEL_INTERRUPT_PRIORITY != 30 + #error configKERNEL_INTERRUPT_PRIORITY (set in FreeRTOSConfig.h) must match the ILM value set in the following line - 30 (1Eh) being the default. +#endif +#define portDISABLE_INTERRUPTS() __asm(" STILM #1Eh ") +#define portENABLE_INTERRUPTS() __asm(" STILM #1Fh ") + +#define portENTER_CRITICAL() \ + __asm(" ST PS,@-R15 "); \ + __asm(" ANDCCR #0xef "); \ + + +#define portEXIT_CRITICAL() \ + __asm(" LD @R15+,PS "); \ + +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() __asm( " nop " ); +/*-----------------------------------------------------------*/ + +/* portYIELD() uses a SW interrupt */ +#define portYIELD() __asm( " INT #40H " ); + +/* portYIELD_FROM_ISR() uses delayed interrupt */ +#define portYIELD_FROM_ISR() DICR_DLYI = 1 +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portMINIMAL_STACK_SIZE configMINIMAL_STACK_SIZE + + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/__STD_LIB_sbrk.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/__STD_LIB_sbrk.c new file mode 100644 index 0000000..df5cff6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/__STD_LIB_sbrk.c @@ -0,0 +1,55 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */ +/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */ +/* ELIGIBILITY FOR ANY PURPOSES. */ +/* (C) Fujitsu Microelectronics Europe GmbH */ +/*--------------------------------------------------------------------------- + __STD_LIB_sbrk.C + - Used by heap_3.c for memory accocation and deletion. + +/*---------------------------------------------------------------------------*/ + +#include "FreeRTOSConfig.h" +#include + + static long brk_siz = 0; + typedef int _heep_t; + #define ROUNDUP(s) (((s)+sizeof(_heep_t)-1)&~(sizeof(_heep_t)-1)) + static _heep_t _heep[ROUNDUP(configTOTAL_HEAP_SIZE)/sizeof(_heep_t)]; + #define _heep_size ROUNDUP(configTOTAL_HEAP_SIZE) + + extern char *sbrk(int size) + { + if (brk_siz + size > _heep_size || brk_siz + size < 0) + + return((char*)-1); + brk_siz += size; + return( (char*)_heep + brk_siz - size); + } diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/port.c new file mode 100644 index 0000000..6abbbf0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/port.c @@ -0,0 +1,510 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the 16FX port. + *----------------------------------------------------------*/ + +/* + * Get current value of DPR and ADB registers + */ +StackType_t xGet_DPR_ADB_bank( void ); + +/* + * Get current value of DTB and PCB registers + */ +StackType_t xGet_DTB_PCB_bank( void ); + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses RLT0, but + * can be done using any given RLT. + */ +static void prvSetupRLT0Interrupt( void ); + +/*-----------------------------------------------------------*/ + +/* + * We require the address of the pxCurrentTCB variable, but don't want to know + * any details of its type. + */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * Macro to save a task context to the task stack. This macro copies the + * saved context (AH:AL, DPR:ADB, DTB:PCB , PC and PS) from the system + * stack to task stack pointed by user stack pointer ( USP for SMALL and + * MEDIUM memory model amd USB:USP for COMPACT and LARGE memory model ), + * then it pushes the general purpose registers RW0-RW7 on to the task + * stack. Finally the resultant stack pointer value is saved into the + * task control block so it can be retrieved the next time the task + * executes. + */ +#if( ( configMEMMODEL == portSMALL ) || ( configMEMMODEL == portMEDIUM ) ) + + #define portSAVE_CONTEXT() \ + { __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" PUSHW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) "); \ + __asm(" MOVW A, _pxCurrentTCB "); \ + __asm(" MOVW A, SP "); \ + __asm(" SWAPW "); \ + __asm(" MOVW @AL, AH "); \ + __asm(" OR CCR,#H'20 "); \ + } + +/* + * Macro to restore a task context from the task stack. This is effecti- + * vely the reverse of SAVE_CONTEXT(). First the stack pointer value + * (USP for SMALL and MEDIUM memory model amd USB:USP for COMPACT and + * LARGE memory model ) is loaded from the task control block. Next the + * value of all the general purpose registers RW0-RW7 is retrieved. Fina- + * lly it copies of the context ( AH:AL, DPR:ADB, DTB:PCB, PC and PS) of + * the task to be executed upon RETI from user stack to system stack. + */ + + #define portRESTORE_CONTEXT() \ + { __asm(" MOVW A, _pxCurrentTCB "); \ + __asm(" MOVW A, @A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" MOVW SP, A "); \ + __asm(" POPW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + } + +#elif( ( configMEMMODEL == portCOMPACT ) || ( configMEMMODEL == portLARGE ) ) + + #define portSAVE_CONTEXT() \ + { __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" POPW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" PUSHW A "); \ + __asm(" PUSHW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) "); \ + __asm(" MOVL A, _pxCurrentTCB "); \ + __asm(" MOVL RL2, A "); \ + __asm(" MOVW A, SP "); \ + __asm(" MOVW @RL2+0, A "); \ + __asm(" MOV A, USB "); \ + __asm(" MOV @RL2+2, A "); \ + } + + #define portRESTORE_CONTEXT() \ + { __asm(" MOVL A, _pxCurrentTCB "); \ + __asm(" MOVL RL2, A "); \ + __asm(" MOVW A, @RL2+0 "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" MOVW SP, A "); \ + __asm(" MOV A, @RL2+2 "); \ + __asm(" MOV USB, A "); \ + __asm(" POPW (RW0,RW1,RW2,RW3,RW4,RW5,RW6,RW7) "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + __asm(" AND CCR,#H'DF "); \ + __asm(" POPW A "); \ + __asm(" OR CCR,#H'20 "); \ + __asm(" PUSHW A "); \ + } +#endif + +/*-----------------------------------------------------------*/ + +/* + * Functions for obtaining the current value of DPR:ADB, DTB:PCB bank registers + */ + +#pragma asm + + .GLOBAL _xGet_DPR_ADB_bank + .GLOBAL _xGet_DTB_PCB_bank + .SECTION CODE, CODE, ALIGN=1 + +_xGet_DPR_ADB_bank: + + MOV A, DPR + SWAP + MOV A, ADB + ORW A + #if configMEMMODEL == portMEDIUM || configMEMMODEL == portLARGE + RETP + #elif configMEMMODEL == portSMALL || configMEMMODEL == portCOMPACT + RET + #endif + + +_xGet_DTB_PCB_bank: + + MOV A, DTB + SWAP + MOV A, PCB + ORW A + #if configMEMMODEL == portMEDIUM || configMEMMODEL == portLARGE + RETP + #elif configMEMMODEL == portSMALL || configMEMMODEL == portCOMPACT + RET + #endif + +#pragma endasm +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + + /* Once the task is called the task would push the pointer to the + parameter onto the stack. Hence here the pointer would be copied to the stack + first. When using the COMPACT or LARGE memory model the pointer would be 24 + bits, and when using the SMALL or MEDIUM memory model the pointer would be 16 + bits. */ + #if( ( configMEMMODEL == portCOMPACT ) || ( configMEMMODEL == portLARGE ) ) + { + *pxTopOfStack = ( StackType_t ) ( ( uint32_t ) ( pvParameters ) >> 16 ); + pxTopOfStack--; + } + #endif + + *pxTopOfStack = ( StackType_t ) ( pvParameters ); + pxTopOfStack--; + + /* This is redundant push to the stack. This is required in order to introduce + an offset so that the task accesses a parameter correctly that is passed on to + the task stack. */ + #if( ( configMEMMODEL == portMEDIUM ) || ( configMEMMODEL == portLARGE ) ) + { + *pxTopOfStack = ( xGet_DTB_PCB_bank() & 0xff00 ) | ( ( ( int32_t ) ( pxCode ) >> 16 ) & 0xff ); + pxTopOfStack--; + } + #endif + + /* This is redundant push to the stack. This is required in order to introduce + an offset so the task correctly accesses the parameter passed on the task stack. */ + *pxTopOfStack = ( StackType_t ) ( pxCode ); + pxTopOfStack--; + + /* PS - User Mode, ILM=7, RB=0, Interrupts enabled,USP */ + *pxTopOfStack = 0xE0C0; + pxTopOfStack--; + + /* PC */ + *pxTopOfStack = ( StackType_t ) ( pxCode ); + pxTopOfStack--; + + /* DTB | PCB */ + #if configMEMMODEL == portSMALL || configMEMMODEL == portCOMPACT + { + *pxTopOfStack = xGet_DTB_PCB_bank(); + pxTopOfStack--; + } + #endif + + /* DTB | PCB, in case of MEDIUM and LARGE memory models, PCB would be used + along with PC to indicate the start address of the function. */ + #if( ( configMEMMODEL == portMEDIUM ) || ( configMEMMODEL == portLARGE ) ) + { + *pxTopOfStack = ( xGet_DTB_PCB_bank() & 0xff00 ) | ( ( ( int32_t ) ( pxCode ) >> 16 ) & 0xff ); + pxTopOfStack--; + } + #endif + + /* DPR | ADB */ + *pxTopOfStack = xGet_DPR_ADB_bank(); + pxTopOfStack--; + + /* AL */ + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + + /* AH */ + *pxTopOfStack = ( StackType_t ) 0xAAAA; + pxTopOfStack--; + + /* Next the general purpose registers. */ + *pxTopOfStack = ( StackType_t ) 0x7777; /* RW7 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; /* RW6 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; /* RW5 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x4444; /* RW4 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; /* RW3 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; /* RW2 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x1111; /* RW1 */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; /* RW0 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvSetupRLT0Interrupt( void ) +{ +/* The peripheral clock divided by 16 is used by the timer. */ +const uint16_t usReloadValue = ( uint16_t ) ( ( ( configCLKP1_CLOCK_HZ / configTICK_RATE_HZ ) / 16UL ) - 1UL ); + + /* set reload value = 34999+1, TICK Interrupt after 10 ms @ 56MHz of CLKP1 */ + TMRLR0 = usReloadValue; + + /* prescaler 1:16, reload, interrupt enable, count enable, trigger */ + TMCSR0 = 0x041B; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupRLT0Interrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Simulate a function call end as generated by the compiler. We will now + jump to the start of the task the context of which we have just restored. */ + __asm(" reti "); + + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented - unlikely to ever be required as there is nothing to + return to. */ +} + +/*-----------------------------------------------------------*/ + +/* + * The interrupt service routine used depends on whether the pre-emptive + * scheduler is being used or not. + */ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. We can use a __nosavereg attribute + * as the context is to be saved by the portSAVE_CONTEXT() macro, not the + * compiler generated code. The tick count is incremented after the context + * is saved. + */ + __nosavereg __interrupt void prvRLT0_TICKISR( void ) + { + /* Disable interrupts so that portSAVE_CONTEXT() is not interrupted */ + __DI(); + + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Enable interrupts */ + __EI(); + + /* Clear RLT0 interrupt flag */ + TMCSR0_UF = 0; + + /* Increment the tick count then switch to the highest priority task + that is ready to run. */ + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + /* Disable interrupts so that portRESTORE_CONTEXT() is not interrupted */ + __DI(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + + /* Enable interrupts */ + __EI(); + } + +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + __interrupt void prvRLT0_TICKISR( void ) + { + /* Clear RLT0 interrupt flag */ + TMCSR0_UF = 0; + + xTaskIncrementTick(); + } + +#endif + +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. We can use a __nosavereg attribute as the context + * is to be saved by the portSAVE_CONTEXT() macro, not the compiler generated + * code. + */ +__nosavereg __interrupt void vPortYield( void ) +{ + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +__nosavereg __interrupt void vPortYieldDelayed( void ) +{ + /* Disable interrupts so that portSAVE_CONTEXT() is not interrupted */ + __DI(); + + /* Save the context of the interrupted task. */ + portSAVE_CONTEXT(); + + /* Enable interrupts */ + __EI(); + + /* Clear delayed interrupt flag */ + __asm (" CLRB 03A4H:0 "); + + /* Switch to the highest priority task that is ready to run. */ + vTaskSwitchContext(); + + /* Disable interrupts so that portSAVE_CONTEXT() is not interrupted */ + __DI(); + + /* Restore the context of the new task. */ + portRESTORE_CONTEXT(); + + /* Enable interrupts */ + __EI(); +} +/*-----------------------------------------------------------*/ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/portmacro.h new file mode 100644 index 0000000..e86e6e0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/portmacro.h @@ -0,0 +1,117 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* Standard includes. */ +#include + +/* Constants denoting the available memory models. These are used within +FreeRTOSConfig.h to set the configMEMMODEL value. */ +#define portSMALL 0 +#define portMEDIUM 1 +#define portCOMPACT 2 +#define portLARGE 3 + + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section handling. */ +#if configKERNEL_INTERRUPT_PRIORITY != 6 + #error configKERNEL_INTERRUPT_PRIORITY (set in FreeRTOSConfig.h) must match the ILM value set in the following line - #06H being the default. +#endif +#define portDISABLE_INTERRUPTS() __asm(" MOV ILM, #06h ") +#define portENABLE_INTERRUPTS() __asm(" MOV ILM, #07h ") + +#define portENTER_CRITICAL() \ + { __asm(" PUSHW PS "); \ + portDISABLE_INTERRUPTS(); \ + } + +#define portEXIT_CRITICAL() \ + { __asm(" POPW PS "); \ + } + +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portNOP() __asm( " NOP " ); +/*-----------------------------------------------------------*/ + +/* portYIELD() uses SW interrupt */ +#define portYIELD() __asm( " INT #122 " ); + +/* portYIELD_FROM_ISR() uses delayed interrupt */ +#define portYIELD_FROM_ISR() __asm( " SETB 03A4H:0 " ); +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portMINIMAL_STACK_SIZE configMINIMAL_STACK_SIZE + + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port.c new file mode 100644 index 0000000..7e2dade --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port.c @@ -0,0 +1,269 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the ARM CM4F port. +*----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL ( ( volatile uint32_t * ) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile uint32_t * ) 0xe000e014 ) +#define portNVIC_SHPR3_REG ( ( volatile uint32_t * ) 0xe000ed20 ) +#define portNVIC_SYSTICK_CLK 0x00000004 +#define portNVIC_SYSTICK_INT 0x00000002 +#define portNVIC_SYSTICK_ENABLE 0x00000001 +#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16 ) +#define portNVIC_SYSTICK_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24 ) + +/* Masks off all bits but the VECTACTIVE bits in the ICSR register. */ +#define portVECTACTIVE_MASK ( 0xFFUL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile uint32_t * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXC_RETURN ( 0xfffffffd ) + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* For strict compliance with the Cortex-M spec the task start address should + * have bit-0 clear, as it is loaded into the PC on exit from an ISR. */ +#define portSTART_ADDRESS_MASK ( ( StackType_t ) 0xfffffffeUL ) + +/* The priority used by the kernel is assigned to a variable to make access + * from inline assembler easier. */ +const uint32_t ulKernelPriority = configKERNEL_INTERRUPT_PRIORITY; + +/* Each task maintains its own interrupt status in the critical nesting + * variable. */ +static uint32_t ulCriticalNesting = 0xaaaaaaaaUL; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void SysTick_Handler( void ); + +/* + * Functions defined in port_asm.asm. + */ +extern void vPortEnableVFP( void ); +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/* This exists purely to allow the const to be used from within the + * port_asm.asm assembly file. */ +const uint32_t ulMaxSyscallInterruptPriorityConst = configMAX_SYSCALL_INTERRUPT_PRIORITY; + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + * of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + * own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). + * + * Artificially force an assert() to be triggered if configASSERT() is + * defined, then stop here so application writers can catch the error. */ + configASSERT( ulCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + + for( ; ; ) + { + } +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + /* Make PendSV and SysTick the lowest priority interrupts. */ + *( portNVIC_SHPR3_REG ) |= portNVIC_PENDSV_PRI; + *( portNVIC_SHPR3_REG ) |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + ulCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. + * Artificially force an assert. */ + configASSERT( ulCriticalNesting == 1000UL ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET; + + /* Barriers are normally not required but do ensure the code is completely + * within the specified behaviour for the architecture. */ + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; + __DSB(); + __ISB(); + + /* This is not the interrupt safe version of the enter critical function so + * assert() if it is being called from an interrupt context. Only API + * functions that end in "FromISR" can be used in an interrupt. Only assert if + * the critical nesting count is 1 to protect against recursive calls if the + * assert function also uses a critical section. */ + if( ulCriticalNesting == 1 ) + { + configASSERT( ( ( *( portNVIC_INT_CTRL ) ) & portVECTACTIVE_MASK ) == 0 ); + } +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( ulCriticalNesting ); + ulCriticalNesting--; + + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void SysTick_Handler( void ) +{ + uint32_t ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + *( portNVIC_SYSTICK_LOAD ) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *( portNVIC_SYSTICK_CTRL ) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port_asm.asm b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port_asm.asm new file mode 100644 index 0000000..b0f436c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port_asm.asm @@ -0,0 +1,237 @@ +;/* +; * FreeRTOS Kernel V10.5.1 +; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. +; * +; * SPDX-License-Identifier: MIT +; * +; * Permission is hereby granted, free of charge, to any person obtaining a copy of +; * this software and associated documentation files (the "Software"), to deal in +; * the Software without restriction, including without limitation the rights to +; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +; * the Software, and to permit persons to whom the Software is furnished to do so, +; * subject to the following conditions: +; * +; * The above copyright notice and this permission notice shall be included in all +; * copies or substantial portions of the Software. +; * +; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +; * +; * https://www.FreeRTOS.org +; * https://github.com/FreeRTOS +; * +; */ + + + .extern pxCurrentTCB + .extern vTaskSwitchContext + .extern ulMaxSyscallInterruptPriorityConst + + .global _vector_14 + .global _lc_ref__vector_pp_14 + .global SVC_Handler + .global vPortStartFirstTask + .global vPortEnableVFP + .global ulPortSetInterruptMask + .global vPortClearInterruptMask + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +_vector_14: .type func + + mrs r0, psp + isb + + ;Get the location of the current TCB. + ldr.w r3, =pxCurrentTCB + ldr r2, [r3] + + ;Is the task using the FPU context? If so, push high vfp registers. + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + ;Save the core registers. + stmdb r0!, {r4-r11, r14} + + ;Save the new top of stack into the first member of the TCB. + str r0, [r2] + + stmdb sp!, {r0, r3} + ldr.w r0, =ulMaxSyscallInterruptPriorityConst + ldr r0, [r0] + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r0, r3} + + ;The first item in pxCurrentTCB is the task top of stack. + ldr r1, [r3] + ldr r0, [r1] + + ;Pop the core registers. + ldmia r0!, {r4-r11, r14} + + ;Is the task using the FPU context? If so, pop the high vfp registers too. + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + bx r14 + + .size _vector_14, $-_vector_14 + .endsec + +;----------------------------------------------------------- + +; This function is an XMC4000 silicon errata workaround. It will get used when +; the SILICON_BUG_PMC_CM_001 linker macro is defined. + .section .text + .thumb + .align 4 +_lc_ref__vector_pp_14: .type func + + mrs r0, psp + isb + + ;Get the location of the current TCB. + ldr.w r3, =pxCurrentTCB + ldr r2, [r3] + + ;Is the task using the FPU context? If so, push high vfp registers. + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + ;Save the core registers. + stmdb r0!, {r4-r11, r14} + + ;Save the new top of stack into the first member of the TCB. + str r0, [r2] + + stmdb sp!, {r3} + ldr.w r0, =ulMaxSyscallInterruptPriorityConst + ldr r0, [r0] + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + ;The first item in pxCurrentTCB is the task top of stack. + ldr r1, [r3] + ldr r0, [r1] + + ;Pop the core registers. + ldmia r0!, {r4-r11, r14} + + ;Is the task using the FPU context? If so, pop the high vfp registers too. + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + isb + push { lr } + pop { pc } ; XMC4000 specific errata workaround. Do not used "bx lr" here. + + .size _lc_ref__vector_pp_14, $-_lc_ref__vector_pp_14 + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +SVC_Handler: .type func + ;Get the location of the current TCB. + ldr.w r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + ;Pop the core registers. + ldmia r0!, {r4-r11, r14} + msr psp, r0 + isb + mov r0, #0 + msr basepri, r0 + bx r14 + .size SVC_Handler, $-SVC_Handler + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +vPortStartFirstTask .type func + ;Use the NVIC offset register to locate the stack. + ldr.w r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + ;Set the msp back to the start of the stack. + msr msp, r0 + ;Call SVC to start the first task. + cpsie i + cpsie f + dsb + isb + svc 0 + .size vPortStartFirstTask, $-vPortStartFirstTask + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +vPortEnableVFP .type func + ;The FPU enable bits are in the CPACR. + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + ;Enable CP10 and CP11 coprocessors, then save back. + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + .size vPortEnableVFP, $-vPortEnableVFP + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +ulPortSetInterruptMask: + mrs r0, basepri + ldr.w r1, =ulMaxSyscallInterruptPriorityConst + ldr r1, [r1] + msr basepri, r1 + bx r14 + .size ulPortSetInterruptMask, $-ulPortSetInterruptMask + .endsec + +;----------------------------------------------------------- + + .section .text + .thumb + .align 4 +vPortClearInterruptMask: + msr basepri, r0 + bx r14 + .size vPortClearInterruptMask, $-vPortClearInterruptMask + .endsec + +;----------------------------------------------------------- + + .end + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..edc5b0e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/portmacro.h @@ -0,0 +1,133 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + extern void vPortYield( void ); + #define portNVIC_INT_CTRL ( ( volatile uint32_t * ) 0xe000ed04 ) + #define portNVIC_PENDSVSET 0x10000000 + #define portYIELD() vPortYield() + + #define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) *( portNVIC_INT_CTRL ) = portNVIC_PENDSVSET + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * Set basepri to portMAX_SYSCALL_INTERRUPT_PRIORITY without effecting other + * registers. r0 is clobbered. + */ + #define portSET_INTERRUPT_MASK() __set_BASEPRI( configMAX_SYSCALL_INTERRUPT_PRIORITY ) + +/* + * Set basepri back to 0 without effective other registers. + * r0 is clobbered. FAQ: Setting BASEPRI to 0 is not a bug. Please see + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html before disagreeing. + */ + #define portCLEAR_INTERRUPT_MASK() __set_BASEPRI( 0 ) + + extern uint32_t ulPortSetInterruptMask( void ); + extern void vPortClearInterruptMask( uint32_t ulNewMask ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vPortClearInterruptMask( x ) + + + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + + #define portDISABLE_INTERRUPTS() portSET_INTERRUPT_MASK() + #define portENABLE_INTERRUPTS() portCLEAR_INTERRUPT_MASK() + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + + #define portNOP() + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/port.c new file mode 100644 index 0000000..964ddd9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/port.c @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +extern void vPortStartTask(void); + +/* Used to keep track of the number of nested calls to taskENTER_CRITICAL(). This +will be set to 0 prior to the first task being started. */ +portLONG ulCriticalNesting = 0x9999UL; + +/* Used to record one tack want to swtich task after enter critical area, we need know it + * and implement task switch after exit critical area */ +portLONG pendsvflag = 0; + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + StackType_t *stk = NULL; + + stk = pxTopOfStack; + + *(--stk) = (uint32_t)pxCode; /* Entry Point */ + *(--stk) = (uint32_t)0xE0000140L; /* PSR */ + *(--stk) = (uint32_t)0xFFFFFFFEL; /* R15 (LR) (init value will cause fault if ever used) */ + *(--stk) = (uint32_t)0x13131313L; /* R13 */ + *(--stk) = (uint32_t)0x12121212L; /* R12 */ + *(--stk) = (uint32_t)0x11111111L; /* R11 */ + *(--stk) = (uint32_t)0x10101010L; /* R10 */ + *(--stk) = (uint32_t)0x09090909L; /* R9 */ + *(--stk) = (uint32_t)0x08080808L; /* R8 */ + *(--stk) = (uint32_t)0x07070707L; /* R7 */ + *(--stk) = (uint32_t)0x06060606L; /* R6 */ + *(--stk) = (uint32_t)0x05050505L; /* R5 */ + *(--stk) = (uint32_t)0x04040404L; /* R4 */ + *(--stk) = (uint32_t)0x03030303L; /* R3 */ + *(--stk) = (uint32_t)0x02020202L; /* R2 */ + *(--stk) = (uint32_t)0x01010101L; /* R1 */ + *(--stk) = (uint32_t)pvParameters; /* R0 : argument */ + + return stk; +} + +BaseType_t xPortStartScheduler( void ) +{ + ulCriticalNesting = 0UL; + + vPortStartTask(); + + return pdFALSE; +} + + +void vPortEndScheduler( void ) +{ + /* Not implemented as there is nothing to return to. */ +} + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting ++; +} + +void vPortExitCritical( void ) +{ + if (ulCriticalNesting == 0) { + while(1); + } + + ulCriticalNesting --; + if (ulCriticalNesting == 0) + { + portENABLE_INTERRUPTS(); + + if (pendsvflag) + { + pendsvflag = 0; + portYIELD(); + } + } +} + +#if configUSE_PREEMPTION == 0 +void xPortSysTickHandler( void ) +{ + portLONG ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + xTaskIncrementTick(); + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} + +#else +void xPortSysTickHandler( void ) +{ + portLONG ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if (xTaskIncrementTick() != pdFALSE) + { + portYIELD_FROM_ISR(pdTRUE); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +#endif + +void vPortYieldHandler( void ) +{ + uint32_t ulSavedInterruptMask; + + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + + vTaskSwitchContext(); + + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); +} + +__attribute__((weak)) void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName ) +{ + for(;;); +} + +__attribute__((weak)) void vApplicationMallocFailedHook( void ) +{ + for(;;); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S new file mode 100644 index 0000000..7396b50 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +//#include + +/******************************************************************** + * Functions: vPortStartTask + * + ********************************************************************/ +.global vPortStartTask +.type vPortStartTask, %function +vPortStartTask: + psrclr ie + lrw r4, pxCurrentTCB + ld.w r4, (r4) // the current task stack pointer is the first member + ld.w sp, (r4) + + ldw r0, (sp, 64) + mtcr r0, epc + ldw r0, (sp, 60) + mtcr r0, epsr + ldw r15, (sp, 56) + ldm r0-r13, (sp) + addi sp, 68 + rte + +/******************************************************************** + * Functions: vPortYield + * + ********************************************************************/ +.global vPortYield +.type vPortYield, %function +vPortYield: + psrclr ee + subi sp, 68 + stm r0-r13, (sp) + stw r15, (sp, 56) + mfcr r0, psr + bseti r0, 8 + stw r0, (sp, 60) + stw r15, (sp, 64) + + lrw r2, pxCurrentTCB + ld.w r3, (r2) + st.w sp, (r3) + + jbsr vTaskSwitchContext + lrw r4, pxCurrentTCB + ld.w r4, (r4) + ld.w sp, (r4) + + ldw r0, (sp, 64) + mtcr r0, epc + ldw r0, (sp, 60) + mtcr r0, epsr + ldw r15, (sp, 56) + ldm r0-r13, (sp) + addi sp, 68 + + rte + +/******************************************************************** + * Functions: NOVIC_IRQ_Default_Handler + * + ********************************************************************/ +.global NOVIC_IRQ_Default_Handler +.type NOVIC_IRQ_Default_Handler, %function +NOVIC_IRQ_Default_Handler: + psrset ee + subi sp, 68 + stm r0-r13, (sp) + stw r15, (sp, 56) + mfcr r0, epsr + stw r0, (sp, 60) + mfcr r0, epc + stw r0, (sp, 64) + + lrw r7, pxCurrentTCB + ldw r7, (r7) + stw sp, (r7) + + lrw sp, g_top_irqstack + + lrw r1, g_irqvector + mfcr r0, psr + lsri r0, 16 + sextb r0 + subi r0, 32 + lsli r0, 2 + add r1, r0 + ldw r1, (r1) + lsri r0, 2 + jsr r1 + + lrw r7, pxCurrentTCB + ldw r7, (r7) + ldw sp, (r7) + + ldw r0, (sp, 64) + mtcr r0, epc + ldw r0, (sp, 60) + mtcr r0, epsr + ldm r0-r13, (sp) + ldw r15, (sp, 56) + addi sp, 68 + rte diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h new file mode 100644 index 0000000..61b652e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#include +#include +#include + +extern void vPortYield(void); +#ifdef __cplusplus +class vPortYield; +extern "C" { +#endif + + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; +typedef void (*portvectorfunc)(void); + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 8 +#define portSTACK_GROWTH -1 +#define portMS_PERIOD_TICK 10 +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + + +static inline void vPortEnableInterrupt( void ) +{ + __enable_irq(); +} + +static inline void vPortDisableInterrupt( void ) +{ + __disable_irq(); +} + +static inline portLONG GetCurrentPSR (void) +{ + return __get_PSR(); +} + +static inline portLONG SaveLocalPSR (void) +{ + portLONG flags = __get_PSR(); + __disable_irq(); + return flags; +} + +static inline void RestoreLocalPSR (portLONG newMask) +{ + __asm__ __volatile__( + "mtcr %0, psr \n" + : + :"r" (newMask) + :"memory" + ); +} + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern __attribute__((naked)) void cpu_yeild(void); + +#define portDISABLE_INTERRUPTS() vPortDisableInterrupt() +#define portENABLE_INTERRUPTS() vPortEnableInterrupt() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() SaveLocalPSR() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(a) RestoreLocalPSR(a) + +#define portNOP() asm("nop") + +extern portLONG ulCriticalNesting; +extern portLONG pendsvflag; + +#define portYIELD() if (ulCriticalNesting == 0) \ + { \ + vPortYield(); \ + } \ + else \ + { \ + pendsvflag = 1; \ + } \ + portNOP();portNOP() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__((noreturn)) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#define portEND_SWITCHING_ISR( xSwitchRequired ) do { \ + if( xSwitchRequired != pdFALSE ) \ + { \ + portYIELD(); \ + } \ + }while(0) + +#define portYIELD_FROM_ISR( a ) vTaskSwitchContext() + + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..5b627cf --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,4 @@ +## Code of Conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +opensource-codeofconduct@amazon.com with any additional questions or comments. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md new file mode 100644 index 0000000..f885cee --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md @@ -0,0 +1,70 @@ +# Contribution guidelines + +Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, code, or +documentation, we welcome our community to be involved in this project. + +Please read through this document before submitting any issues or pull requests to ensure we are able to help you and all members of the community as effectively as possible. + +## Code of conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +opensource-codeofconduct@amazon.com with any additional questions or comments. + + +## Security issue notifications +If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. + + +## Submitting a bugs/feature request +Have a bug to report or feature to request? Follow these steps: +1. Search on the [FreeRTOS Community Support Forums](https://forums.freertos.org/) and [GitHub issue tracker](https://github.com/FreeRTOS/FreeRTOS/issues?utf8=%E2%9C%93&q=is%3Aissue) to be sure this hasn't been already reported or discussed. +2. If your search turns up empty, create a new topic in the [forums](https://forums.freertos.org/) and work with the community to help clarify issues or refine the idea. Include as many of the details listed below. +3. Once the community has had time to discuss and digest, we welcome you to create an [issue](https://github.com/FreeRTOS/FreeRTOS/issues) to report bugs or suggest features. + +When creating a new topic on the forums or filing an issue, please include as many relevant details as possible. Examples include: + +* A clear description of the situation — what you observe, what you expect, and your view on how the two differ. +* A reproducible test case or sequence of steps. +* The version of our code being used. +* Any modifications you've made relevant to the bug. +* Details of your environment or deployment. Highlight anything unusual. + + +## Contributing via pull request +Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: + +1. You are working against the latest source on the *master* branch. +2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. +3. You open an issue to discuss any significant work - we would hate for your time to be wasted. + +To send us a pull request, please: + +1. Fork the repository. +2. Modify the source; focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. +3. Follow the [coding style guide](https://www.freertos.org/FreeRTOS-Coding-Standard-and-Style-Guide.html). +4. Commit to your fork using clear commit messages. +5. Send us a pull request, answering any default questions in the pull request interface. + NOTE: Please make sure the default option (Allow edits from maintainers) is left checked. +6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. + +GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and +[creating a pull request](https://help.github.com/articles/creating-a-pull-request/). + +## Coding style +* Please ensure that your code complies to the [FreeRTOS coding style guidelines](https://www.freertos.org/FreeRTOS-Coding-Standard-and-Style-Guide.html). + + +## Getting your pull request merged +All pull requests must be approved by our review team before it can be merged in. We appreciate your patience while pull requests are reviewed. The time it takes to review will depend on complexity and consideration of wider implications. + + +## Finding contributions to work on +Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), tackling open 'help wanted' issues is a great place to start. + + +## Licensing +The FreeRTOS kernel is released under the MIT open source license, the text of which can be found [here](https://github.com/FreeRTOS/FreeRTOS/blob/master/FreeRTOS/License/license.txt) + +Additional license files can be found in the folders containing any supplementary libraries licensed by their respective copyright owners where applicable. + +We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md new file mode 100644 index 0000000..5fbf6fc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md @@ -0,0 +1,5 @@ +## Reporting a Vulnerability + +If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security +via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/) or directly via email to aws-security@amazon.com. +Please do **not** create a public github issue. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md new file mode 100644 index 0000000..c3c8607 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md @@ -0,0 +1,16 @@ + + +Description +----------- + + +Test Steps +----------- + + +Related Issue +----------- + + + +By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md new file mode 100644 index 0000000..78256a0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md @@ -0,0 +1,19 @@ + +OVERVIEW + +This directory contains FreeRTOS port for Texas Instruments C28x based microcontrollers. + +The standard demo project to test this port is added at following location: +FreeRTOS-Community-Supported-Demos\C2000_F2838x_C28x_CCS\freertos_ex1_c28x_port_val + +This port is distributed under MIT open source license. + +KNOWN ISSUES: +Support for "fpu64" is not added yet to the port. The examples should specify "fpu32" as option for floating point. + +TOOL CHAIN SUPPORT: +Code Composer Studio™ IDE (CCS) v11.1.0 or newer +C2000 Compiler v20.2.1.LTS or newer +C2000Ware_3_01_00_00 or newer +FreeRTOSv202112.00 + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c new file mode 100644 index 0000000..5755132 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c @@ -0,0 +1,172 @@ +//------------------------------------------------------------------------------------------------- +// Author: Ivan Zaitsev, ivan.zaitsev@gmail.com +// +// This file follows the FreeRTOS distribution license. +// +// FreeRTOS is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License (version 2) as published by the +// Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. +// +// *************************************************************************** +// >>! NOTE: The modification to the GPL is included to allow you to !<< +// >>! distribute a combined work that includes FreeRTOS without being !<< +// >>! obliged to provide the source code for proprietary components !<< +// >>! outside of the FreeRTOS kernel. !<< +// *************************************************************************** +// +// FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. Full license text is available on the following +// link: http://www.freertos.org/a00114.html +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +// Scheduler includes. +//------------------------------------------------------------------------------------------------- +#include "FreeRTOS.h" +#include "task.h" + +//------------------------------------------------------------------------------------------------- +// Implementation of functions defined in portable.h for the C28x port. +//------------------------------------------------------------------------------------------------- + +// Constants required for hardware setup. +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) +#if defined(__TMS320C28XX_FPU32__) +# define AUX_REGISTERS_TO_SAVE 19 // XAR + FPU registers +# define XAR4_REGISTER_POSITION 6 // XAR4 position in AUX registers array +# define STF_REGISTER_POSITION 10 // STF position in AUX registers array +#else +# define AUX_REGISTERS_TO_SAVE 9 // XAR registers only +# define XAR4_REGISTER_POSITION 5 // XAR4 position in AUX registers array +#endif + +extern uint32_t getSTF( void ); +extern void vApplicationSetupTimerInterrupt( void ); + +// Each task maintains a count of the critical section nesting depth. Each +// time a critical section is entered the count is incremented. Each time a +// critical section is exited the count is decremented - with interrupts only +// being re-enabled if the count is zero. +// +// ulCriticalNesting will get set to zero when the scheduler starts, but must +// not be initialised to zero as this will cause problems during the startup +// sequence. +// ulCriticalNesting should be 32 bit value to keep stack alignment unchanged. +volatile uint32_t ulCriticalNesting = portINITIAL_CRITICAL_NESTING; +volatile uint16_t bYield = 0; +volatile uint16_t bPreemptive = 0; + +//------------------------------------------------------------------------------------------------- +// Initialise the stack of a task to look exactly as if +// timer interrupt was executed. +//------------------------------------------------------------------------------------------------- +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + uint16_t i; + uint16_t base = 0; + + pxTopOfStack[base++] = 0x0080; // ST0. PSM = 0(No shift) + pxTopOfStack[base++] = 0x0000; // T + pxTopOfStack[base++] = 0x0000; // AL + pxTopOfStack[base++] = 0x0000; // AH + pxTopOfStack[base++] = 0xFFFF; // PL + pxTopOfStack[base++] = 0xFFFF; // PH + pxTopOfStack[base++] = 0xFFFF; // AR0 + pxTopOfStack[base++] = 0xFFFF; // AR1 + pxTopOfStack[base++] = 0x8A08; // ST1 + pxTopOfStack[base++] = 0x0000; // DP + pxTopOfStack[base++] = 0x0000; // IER + pxTopOfStack[base++] = 0x0000; // DBGSTAT + pxTopOfStack[base++] = ((uint32_t)pxCode) & 0xFFFFU; // PCL + pxTopOfStack[base++] = ((uint32_t)pxCode >> 16) & 0x00FFU; // PCH + pxTopOfStack[base++] = 0xAAAA; // Alignment + pxTopOfStack[base++] = 0xBBBB; // Alignment + + // Fill the rest of the registers with dummy values. + for(i = 0; i < (2 * AUX_REGISTERS_TO_SAVE); i++) + { + uint16_t low = 0x0000; + uint16_t high = 0x0000; + + if(i == (2 * XAR4_REGISTER_POSITION)) + { + low = ((uint32_t)pvParameters) & 0xFFFFU; + high = ((uint32_t)pvParameters >> 16) & 0xFFFFU; + } + +#if defined(__TMS320C28XX_FPU32__) + if(i == (2 * STF_REGISTER_POSITION)) + { + uint32_t stf = getSTF(); + + low = stf & 0xFFFFU; + high = (stf >> 16) & 0xFFFFU; + } +#endif + + pxTopOfStack[base + i] = low; + i++; + pxTopOfStack[base + i] = high; + } + + base += i; + + // Reserve place for ST1 which will be used in context switch + // to set correct SPA bit ASAP. + pxTopOfStack[base++] = 0x8A18; // ST1 with SPA bit set + pxTopOfStack[base++] = 0x0000; // DP + pxTopOfStack[base++] = 0x0000; // placeholder for 32 bit ulCriticalNesting + pxTopOfStack[base++] = 0x0000; + + // Return a pointer to the top of the stack we have generated so this can + // be stored in the task control block for the task. + return pxTopOfStack + base; +} + +//------------------------------------------------------------------------------------------------- +void vPortEndScheduler( void ) +{ + // It is unlikely that the TMS320 port will get stopped. + // If required simply disable the tick interrupt here. +} + +//------------------------------------------------------------------------------------------------- +// See header file for description. +//------------------------------------------------------------------------------------------------- +BaseType_t xPortStartScheduler(void) +{ + vApplicationSetupTimerInterrupt(); + + ulCriticalNesting = 0; + +#if(configUSE_PREEMPTION == 1) + bPreemptive = 1; +#else + bPreemptive = 0; +#endif + + portENABLE_INTERRUPTS(); + portRESTORE_FIRST_CONTEXT(); + + // Should not get here! + return pdFAIL; +} + +//------------------------------------------------------------------------------------------------- +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + ulCriticalNesting++; +} + +//------------------------------------------------------------------------------------------------- +void vPortExitCritical( void ) +{ + ulCriticalNesting--; + if( ulCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm new file mode 100644 index 0000000..35c13ae --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm @@ -0,0 +1,316 @@ +;------------------------------------------------------------------------------------------------- +; Author: Ivan Zaitsev, ivan.zaitsev@gmail.com +; +; This file follows the FreeRTOS distribution license. +; +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. +; +; *************************************************************************** +; >>! NOTE: The modification to the GPL is included to allow you to !<< +; >>! distribute a combined work that includes FreeRTOS without being !<< +; >>! obliged to provide the source code for proprietary components !<< +; >>! outside of the FreeRTOS kernel. !<< +; *************************************************************************** +; +; FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY +; WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +; FOR A PARTICULAR PURPOSE. Full license text is available on the following +; link: http://www.freertos.org/a00114.html +;------------------------------------------------------------------------------------------------- + + .if __TI_EABI__ + .asg pxCurrentTCB, _pxCurrentTCB + .asg bYield, _bYield + .asg bPreemptive, _bPreemptive + .asg ulCriticalNesting, _ulCriticalNesting + .asg xTaskIncrementTick, _xTaskIncrementTick + .asg vTaskSwitchContext, _vTaskSwitchContext + .asg portTICK_ISR, _portTICK_ISR + .asg portRESTORE_FIRST_CONTEXT, _portRESTORE_FIRST_CONTEXT + .asg getSTF, _getSTF + .endif + + .ref _pxCurrentTCB + .ref _bYield + .ref _bPreemptive + .ref _ulCriticalNesting + .ref _xTaskIncrementTick + .ref _vTaskSwitchContext + + .def _portTICK_ISR + .def _portRESTORE_FIRST_CONTEXT + + .if .TMS320C2800_FPU32 = 1 + + .def _getSTF + +_getSTF: + MOV32 *SP++, STF + POP ACC + LRETR + +_portRESTORE_FIRST_CONTEXT: +; Restore stack pointer from new task control block. + MOVL XAR0, #_pxCurrentTCB + MOVL XAR0, *XAR0 + MOVL XAR0, *XAR0 + MOV @SP, AR0 + +; Restore XAR4 and RPC from saved task stack. +; and return to main task function. +; SP should be set to stack start plus 2 before LRETR. + SUBB SP, #28 + POP XAR4 + SUBB SP, #14 + POP RPC + SUBB SP, #10 + LRETR + +_portTICK_ISR: +; Save context + ASP + PUSH RB + PUSH AR1H:AR0H + PUSH RPC + MOVL *SP++, XT + MOVL *SP++, XAR2 + MOVL *SP++, XAR3 + MOVL *SP++, XAR4 + MOVL *SP++, XAR5 + MOVL *SP++, XAR6 + MOVL *SP++, XAR7 + MOV32 *SP++, STF + MOV32 *SP++, R0H + MOV32 *SP++, R1H + MOV32 *SP++, R2H + MOV32 *SP++, R3H + MOV32 *SP++, R4H + MOV32 *SP++, R5H + MOV32 *SP++, R6H + MOV32 *SP++, R7H + PUSH DP:ST1 + +; Save critical section nesting counter + MOVL XAR0, #_ulCriticalNesting + MOVL ACC, *XAR0 + PUSH ACC + +; Save stack pointer in the task control block. + MOVL XAR0, #_pxCurrentTCB + MOVL XAR0, *XAR0 + MOVL XAR6, #0 ;set to 0 XAR6 before move the new value of pxTopOfStack + MOV AR6, @SP + MOVL *XAR0, XAR6 + +; Save IER on stack to avoid corruption. +; Depending on stack alignment bit IER can be found in two locations. + PUSH ST1 + POP AL + TBIT AL, #4 + SB SPA_BIT_SET, TC + MOV AR7, *-SP[46] + SB SAVE_IER, UNC +SPA_BIT_SET: + MOV AR7, *-SP[48] +SAVE_IER: + MOVL *SP++, XAR7 + +; Increment tick counter if timer tick is executed. +; Don't increment if explicitly yielded. + MOVL XAR0, #_bYield + MOV ACC, *XAR0 + SB RESET_YIELD_FLAG, NEQ + LCR _xTaskIncrementTick + +RESET_YIELD_FLAG: +; Save bYield in AR1 and clear it in memory. + MOV AR1, ACC + MOV ACC, #0 + MOV *XAR0, ACC + +; Do context switch if bYield=1 or bPreemptive=1 + MOVL XAR0, #_bPreemptive + MOV ACC, *XAR0 + CMPB AL, #0x1 + SB CONTEXT_SWITCH, EQ + MOV ACC, AR1 + CMPB AL, #0x1 + SB SKIP_CONTEXT_SWITCH, NEQ + +CONTEXT_SWITCH: + LCR _vTaskSwitchContext + +SKIP_CONTEXT_SWITCH: +; Restore IER value from stack. + MOVL XAR7, *--SP + +; Restore stack pointer from new task control block. + MOVL XAR0, #_pxCurrentTCB + MOVL XAR0, *XAR0 + MOVL XAR0, *XAR0 + MOV @SP, AR0 + +; Restore critical section nesting counter + MOVL XAR0, #_ulCriticalNesting + POP ACC + MOVL *XAR0, ACC + +; Update IER value in target context. +; Depending on stack alignment bit IER can be found in two locations. + POP DP:ST1 + PUSH ST1 + POP AL + TBIT AL, #4 + SB SPA_BIT_SET_RESTORE, TC + MOV *-SP[42], AR7 + SB RESTORE_CONTEXT, UNC +SPA_BIT_SET_RESTORE: + MOV *-SP[44], AR7 + +RESTORE_CONTEXT: + MOV32 R7H, *--SP + MOV32 R6H, *--SP + MOV32 R5H, *--SP + MOV32 R4H, *--SP + MOV32 R3H, *--SP + MOV32 R2H, *--SP + MOV32 R1H, *--SP + MOV32 R0H, *--SP + MOV32 STF, *--SP + MOVL XAR7, *--SP + MOVL XAR6, *--SP + MOVL XAR5, *--SP + MOVL XAR4, *--SP + MOVL XAR3, *--SP + MOVL XAR2, *--SP + MOVL XT, *--SP + POP RPC + POP AR1H:AR0H + POP RB + NASP + IRET + + .else + +_portRESTORE_FIRST_CONTEXT: +; Restore stack pointer from new task control block. + MOVL XAR0, #_pxCurrentTCB + MOVL XAR0, *XAR0 + MOVL XAR0, *XAR0 + MOV @SP, AR0 + +; Restore XAR4 and RPC from saved task stack. +; and return to main task function. +; SP should be set to stack start plus 2 before LRETR. + SUBB SP, #10 + POP XAR4 + SUBB SP, #12 + POP RPC + SUBB SP, #10 + LRETR + +_portTICK_ISR: +; Save context + ASP + PUSH AR1H:AR0H + PUSH RPC + MOVL *SP++, XT + MOVL *SP++, XAR2 + MOVL *SP++, XAR3 + MOVL *SP++, XAR4 + MOVL *SP++, XAR5 + MOVL *SP++, XAR6 + MOVL *SP++, XAR7 + PUSH DP:ST1 + +; Save critical section nesting counter + MOVL XAR0, #_ulCriticalNesting + MOVL ACC, *XAR0 + PUSH ACC + +; Save stack pointer in the task control block. + MOVL XAR0, #_pxCurrentTCB + MOVL XAR0, *XAR0 + MOVL XAR6, #0 ;set to 0 XAR6 before move the new value of pxTopOfStack + MOV AR6, @SP + MOVL *XAR0, XAR6 + +; Save IER on stack to avoid corruption. + PUSH ST1 + POP AL + TBIT AL, #4 + SB SPA_BIT_SET, TC + MOV AR7, *-SP[26] + SB SAVE_IER, UNC +SPA_BIT_SET: + MOV AR7, *-SP[28] +SAVE_IER: + MOVL *SP++, XAR7 + +; Increment tick counter if timer tick is executed. +; Don't increment if explicitly yielded. + MOVL XAR0, #_bYield + MOV ACC, *XAR0 + SB RESET_YIELD_FLAG, NEQ + LCR _xTaskIncrementTick + +RESET_YIELD_FLAG: +; Save bYield in AR1 and clear it in memory. + MOV AR1, ACC + MOV ACC, #0 + MOV *XAR0, ACC + +; Do context switch if bYield=1 or bPreemptive=1 + MOVL XAR0, #_bPreemptive + MOV ACC, *XAR0 + CMPB AL, #0x1 + SB CONTEXT_SWITCH, EQ + MOV ACC, AR1 + CMPB AL, #0x1 + SB SKIP_CONTEXT_SWITCH, NEQ + +CONTEXT_SWITCH: + LCR _vTaskSwitchContext + +SKIP_CONTEXT_SWITCH: +; Restore IER value from stack. + MOVL XAR7, *--SP + +; Restore stack pointer from new task control block. + MOVL XAR0, #_pxCurrentTCB + MOVL XAR0, *XAR0 + MOVL XAR0, *XAR0 + MOV @SP, AR0 + +; Restore critical section nesting counter + MOVL XAR0, #_ulCriticalNesting + POP ACC + MOVL *XAR0, ACC + +; Update IER value in target context. + POP DP:ST1 + PUSH ST1 + POP AL + TBIT AL, #4 + SB SPA_BIT_SET_RESTORE, TC + MOV *-SP[22], AR7 + SB RESTORE_CONTEXT, UNC +SPA_BIT_SET_RESTORE: + MOV *-SP[24], AR7 + +RESTORE_CONTEXT: + MOVL XAR7, *--SP + MOVL XAR6, *--SP + MOVL XAR5, *--SP + MOVL XAR4, *--SP + MOVL XAR3, *--SP + MOVL XAR2, *--SP + MOVL XT, *--SP + POP RPC + POP AR1H:AR0H + NASP + IRET + + .endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h new file mode 100644 index 0000000..90908b9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------------------------- +// Author: Ivan Zaitsev, ivan.zaitsev@gmail.com +// +// This file follows the FreeRTOS distribution license. +// +// FreeRTOS is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License (version 2) as published by the +// Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception. +// +// *************************************************************************** +// >>! NOTE: The modification to the GPL is included to allow you to !<< +// >>! distribute a combined work that includes FreeRTOS without being !<< +// >>! obliged to provide the source code for proprietary components !<< +// >>! outside of the FreeRTOS kernel. !<< +// *************************************************************************** +// +// FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. Full license text is available on the following +// link: http://www.freertos.org/a00114.html +//------------------------------------------------------------------------------------------------- + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +//------------------------------------------------------------------------------------------------- +// Port specific definitions. +// +// The settings in this file configure FreeRTOS correctly for the +// given hardware and compiler. +// +// These settings should not be altered. +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +// Hardware includes +//------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------- +// Type definitions. +//------------------------------------------------------------------------------------------------- +#define portCHAR uint16_t +#define portFLOAT float +#define portDOUBLE double +#define portLONG uint32_t +#define portSHORT uint16_t +#define portBASE_TYPE uint16_t +#define uint8_t uint16_t +#define int8_t int16_t +#define portSTACK_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef int16_t BaseType_t; +typedef uint16_t UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +//------------------------------------------------------------------------------------------------- +// Interrupt control macros. +//------------------------------------------------------------------------------------------------- +#define portDISABLE_INTERRUPTS() __asm(" setc INTM") +#define portENABLE_INTERRUPTS() __asm(" clrc INTM") + +//------------------------------------------------------------------------------------------------- +// Critical section control macros. +//------------------------------------------------------------------------------------------------- +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +//------------------------------------------------------------------------------------------------- +// Task utilities. +//------------------------------------------------------------------------------------------------- +#define portYIELD() do{bYield = 1; __asm(" INTR INT14");}while(0) +#define portYIELD_FROM_ISR( x ) do{if(x == pdTRUE){bYield = 1; __asm(" OR IFR, #0x2000");}}while(0) + +extern void portTICK_ISR( void ); +extern void portRESTORE_FIRST_CONTEXT( void ); +extern void vTaskSwitchContext( void ); +extern volatile uint16_t bYield; + +//------------------------------------------------------------------------------------------------- +// Hardware specifics. +//------------------------------------------------------------------------------------------------- +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( 1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portNOP() __asm(" NOP") + +//------------------------------------------------------------------------------------------------- +// Task function macros as described on the FreeRTOS.org WEB site. +//------------------------------------------------------------------------------------------------- +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c new file mode 100644 index 0000000..556bb77 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c @@ -0,0 +1,317 @@ +/* + * FreeRTOS Kernel V10.4.2 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the MSP430 port. + *----------------------------------------------------------*/ + +/* Constants required for hardware setup. The tick ISR runs off the ACLK, +not the MCLK. */ +#define portACLK_FREQUENCY_HZ ( ( TickType_t ) 32768 ) +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x08 ) + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* Most ports implement critical sections by placing the interrupt flags on +the stack before disabling interrupts. Exiting the critical section is then +simply a case of popping the flags from the stack. As mspgcc does not use +a frame pointer this cannot be done as modifying the stack will clobber all +the stack variables. Instead each task maintains a count of the critical +section nesting depth. Each time a critical section is entered the count is +incremented. Each time a critical section is left the count is decremented - +with interrupts only being re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as this will cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; +/*-----------------------------------------------------------*/ + +/* + * Macro to save a task context to the task stack. This simply pushes all the + * general purpose msp430 registers onto the stack, followed by the + * usCriticalNesting value used by the task. Finally the resultant stack + * pointer value is saved into the task control block so it can be retrieved + * the next time the task executes. + */ +#ifdef __LARGE_DATA_MODEL__ +#define portSAVE_CONTEXT() \ + asm volatile ( "pushm.a #12, r15 \n\t" \ + "movx.w &usCriticalNesting, r14 \n\t" \ + "pushm.a #1, r14 \n\t" \ + "movx.a &pxCurrentTCB, r12 \n\t" \ + "movx.a sp, 0(r12) \n\t" \ + ); +#else +#define portSAVE_CONTEXT() \ + asm volatile ( "pushm.w #12, r15 \n\t" \ + "mov.w &usCriticalNesting, r14 \n\t" \ + "push.w r14 \n\t" \ + "mov.w &pxCurrentTCB, r12 \n\t" \ + "mov.w sp, 0(r12) \r\t" \ + ); +#endif + +/* + * Macro to restore a task context from the task stack. This is effectively + * the reverse of portSAVE_CONTEXT(). First the stack pointer value is + * loaded from the task control block. Next the value for usCriticalNesting + * used by the task is retrieved from the stack - followed by the value of all + * the general purpose msp430 registers. + * + */ +#ifdef __LARGE_DATA_MODEL__ +#define portRESTORE_CONTEXT() \ + asm volatile ( "movx.a &pxCurrentTCB, r12 \n\t" \ + "movx.a @r12, sp \n\t" \ + "popm.a #1, r15 \n\t" \ + "movx.w r15, &usCriticalNesting \n\t" \ + "popm.a #12, r15 \n\t" \ + "nop \n\t" \ + "pop.w sr \n\t" \ + "nop \n\t" \ + "reta \n\t" \ + ); +#else +#define portRESTORE_CONTEXT() \ + asm volatile ( "mov.w &pxCurrentTCB, r12 \n\t" \ + "mov.w @r12, sp \n\t" \ + "pop.w r15 \n\t" \ + "mov.w r15, &usCriticalNesting \n\t" \ + "popm.w #12, r15 \n\t" \ + "nop \n\t" \ + "pop.w sr \n\t" \ + "nop \n\t" \ + "ret \n\t" \ + ); +#endif +/*-----------------------------------------------------------*/ + +/* + * Sets up the periodic ISR used for the RTOS tick. This uses timer 0, but + * could have alternatively used the watchdog timer or timer 1. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ + +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + uint16_t *pusTopOfStack; + uint32_t *pulTopOfStack, ulTemp; + + /* + Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging and can be included if required. + + *pxTopOfStack = ( StackType_t ) 0x1111; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x3333; + pxTopOfStack--; + */ + + /* Data types are need either 16 bits or 32 bits depending on the data + and code model used. */ + if( sizeof( pxCode ) == sizeof( uint16_t ) ) + { + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + ulTemp = ( uint32_t ) pxCode; + *pusTopOfStack = ( uint16_t ) ulTemp; + } + else + { + /* Make room for a 20 bit value stored as a 32 bit value. */ + pusTopOfStack = ( uint16_t * ) pxTopOfStack; + pusTopOfStack--; + pulTopOfStack = ( uint32_t * ) pusTopOfStack; + *pulTopOfStack = ( uint32_t ) pxCode; + } + + pusTopOfStack--; + *pusTopOfStack = portFLAGS_INT_ENABLED; + pusTopOfStack -= ( sizeof( StackType_t ) / 2 ); + + /* From here on the size of stacked items depends on the memory model. */ + pxTopOfStack = ( StackType_t * ) pusTopOfStack; + + /* Next the general purpose registers. */ + #ifdef PRELOAD_REGISTER_VALUES + *pxTopOfStack = ( StackType_t ) 0xffff; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xeeee; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xdddd; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xbbbb; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xaaaa; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x9999; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x8888; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x7777; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x6666; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x5555; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x4444; + pxTopOfStack--; + #else + pxTopOfStack -= 3; + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack -= 9; + #endif + + /* A variable is used to keep track of the critical section nesting. + This variable has to be stored as part of the task context and is + initially set to zero. */ + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + /* Return a pointer to the top of the stack we have generated so this can + be stored in the task control block for the task. */ + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. Interrupts are disabled when + this function is called. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Should not get here as the tasks are now running! */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the MSP430 port will get stopped. If required simply + disable the tick interrupt here. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch called by portYIELD or taskYIELD. + * + * The first thing we do is save the registers so we can use a naked attribute. + */ + +void vPortYield( void ) __attribute__ ( ( naked ) ); +void vPortYield( void ) +{ + asm volatile ( "push.w sr" ); + + portDISABLE_INTERRUPTS(); + portSAVE_CONTEXT(); + + vTaskSwitchContext(); + + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Hardware initialisation to generate the RTOS tick. This uses timer 0 + * but could alternatively use the watchdog timer or timer 1. + */ +static void prvSetupTimerInterrupt( void ) +{ + vApplicationSetupTimerInterrupt(); +} +/*-----------------------------------------------------------*/ + +/* + * The interrupt service routine used depends on whether the pre-emptive + * scheduler is being used or not. + */ + +#if configUSE_PREEMPTION == 1 +void vPortPreemptiveTickISR(void) +{ + asm volatile("push.w sr"); + portSAVE_CONTEXT(); + + if(xTaskIncrementTick() != pdFALSE) + { + vTaskSwitchContext(); + } + + portRESTORE_CONTEXT(); +} + +__attribute__((interrupt(configTICK_VECTOR))) void prvTickISR(void) +{ + __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); + vPortPreemptiveTickISR(); +} +#else +void vPortCooperativeTickISR(void) +{ + asm volatile("push.w sr"); + portSAVE_CONTEXT(); + + xTaskIncrementTick(); + + portRESTORE_CONTEXT(); +} + +__attribute__((interrupt(configTICK_VECTOR))) void prvTickISR(void) +{ + __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF ); + + vPortCooperativeTickISR(); +} +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h new file mode 100644 index 0000000..a7ad8a9 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h @@ -0,0 +1,132 @@ +/* + * FreeRTOS Kernel V10.4.2 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Hardware includes. */ +#include + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portBASE_TYPE short + +/* The stack type changes depending on the data model. */ +#ifdef __LARGE_DATA_MODEL__ + #define portSTACK_TYPE uint32_t +#else + #define portSTACK_TYPE uint16_t + #define portPOINTER_SIZE_TYPE uint16_t +#endif + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() asm volatile ( "NOP" ); asm volatile ( "DINT" ); asm volatile ( "NOP" ) +#define portENABLE_INTERRUPTS() asm volatile ( "NOP" ); asm volatile ( "EINT" ); asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 ) + +#define portENTER_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + portDISABLE_INTERRUPTS(); \ + \ + /* Now interrupts are disabled ulCriticalNesting can be accessed */ \ + /* directly. Increment ulCriticalNesting to keep a count of how many */ \ + /* times portENTER_CRITICAL() has been called. */ \ + usCriticalNesting++; \ +} + +#define portEXIT_CRITICAL() \ +{ \ +extern volatile uint16_t usCriticalNesting; \ + \ + if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ + { \ + /* Decrement the nesting count as we are leaving a critical section. */ \ + usCriticalNesting--; \ + \ + /* If the nesting level has reached zero then interrupts should be */ \ + /* re-enabled. */ \ + if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +extern void vPortYield( void ) __attribute__ ( ( naked ) ); +#define portYIELD() vPortYield() +#define portNOP() asm volatile ( "NOP" ) +/*-----------------------------------------------------------*/ + +/* Hardware specifics. */ +#define portBYTE_ALIGNMENT 2 +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +extern void vTaskSwitchContext(void); +#define portYIELD_FROM_ISR( x ) if( x ) vPortYield() +void vApplicationSetupTimerInterrupt( void ); + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h new file mode 100644 index 0000000..fbdcfcb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h @@ -0,0 +1,210 @@ +/* + * FreeRTOS Kernel V10.4.0 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + * 1 tab == 4 spaces! + */ + +/* + * The FreeRTOS kernel's RISC-V port is split between the the code that is + * common across all currently supported RISC-V chips (implementations of the + * RISC-V ISA), and code that tailors the port to a specific RISC-V chip: + * + * + FreeRTOS\Source\portable\GCC\RISC-V-RV32\portASM.S contains the code that + * is common to all currently supported RISC-V chips. There is only one + * portASM.S file because the same file is built for all RISC-V target chips. + * + * + Header files called freertos_risc_v_chip_specific_extensions.h contain the + * code that tailors the FreeRTOS kernel's RISC-V port to a specific RISC-V + * chip. There are multiple freertos_risc_v_chip_specific_extensions.h files + * as there are multiple RISC-V chip implementations. + * + * !!!NOTE!!! + * TAKE CARE TO INCLUDE THE CORRECT freertos_risc_v_chip_specific_extensions.h + * HEADER FILE FOR THE CHIP IN USE. This is done using the assembler's (not the + * compiler's!) include path. For example, if the chip in use includes a core + * local interrupter (CLINT) and does not include any chip specific register + * extensions then add the path below to the assembler's include path: + * FreeRTOS\Source\portable\GCC\RISC-V-RV32\chip_specific_extensions\RV32I_CLINT_no_extensions + * + */ + + +#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__ +#define __FREERTOS_RISC_V_EXTENSIONS_H__ + +#define portasmHANDLE_INTERRUPT Default_IRQHandler +#define portasmHAS_SIFIVE_CLINT 1 +#define portasmHAS_MTIME 0 +#define portasmADDITIONAL_CONTEXT_SIZE 0 /* Must be even number on 32-bit cores. */ + +.macro portasmSAVE_ADDITIONAL_REGISTERS + /* save float registers */ +#if __riscv_flen == 64 + addi sp, sp, -(128+128) + + fsd f31, (0 + 0 )(sp) + fsd f30, (4 + 4 )(sp) + fsd f29, (8 + 8 )(sp) + fsd f28, (12 + 12)(sp) + fsd f27, (16 + 16)(sp) + fsd f26, (20 + 20)(sp) + fsd f25, (24 + 24)(sp) + fsd f24, (28 + 28)(sp) + fsd f23, (32 + 32)(sp) + fsd f22, (36 + 36)(sp) + fsd f21, (40 + 40)(sp) + fsd f20, (44 + 44)(sp) + fsd f19, (48 + 48)(sp) + fsd f18, (52 + 52)(sp) + fsd f17, (56 + 56)(sp) + fsd f16, (60 + 60)(sp) + fsd f15, (64 + 64)(sp) + fsd f14, (68 + 68)(sp) + fsd f13, (72 + 72)(sp) + fsd f12, (76 + 76)(sp) + fsd f11, (80 + 80)(sp) + fsd f10, (84 + 84)(sp) + fsd f9, (88 + 88)(sp) + fsd f8, (92 + 92)(sp) + fsd f7, (96 + 96)(sp) + fsd f6, (100+100)(sp) + fsd f5, (104+104)(sp) + fsd f4, (108+108)(sp) + fsd f3, (112+112)(sp) + fsd f2, (116+116)(sp) + fsd f1, (120+120)(sp) + fsd f0, (124+124)(sp) +#elif __riscv_flen == 32 + addi sp, sp, -(128) + + fsw f31, (0 )(sp) + fsw f30, (4 )(sp) + fsw f29, (8 )(sp) + fsw f28, (12 )(sp) + fsw f27, (16 )(sp) + fsw f26, (20 )(sp) + fsw f25, (24 )(sp) + fsw f24, (28 )(sp) + fsw f23, (32 )(sp) + fsw f22, (36 )(sp) + fsw f21, (40 )(sp) + fsw f20, (44 )(sp) + fsw f19, (48 )(sp) + fsw f18, (52 )(sp) + fsw f17, (56 )(sp) + fsw f16, (60 )(sp) + fsw f15, (64 )(sp) + fsw f14, (68 )(sp) + fsw f13, (72 )(sp) + fsw f12, (76 )(sp) + fsw f11, (80 )(sp) + fsw f10, (84 )(sp) + fsw f9, (88 )(sp) + fsw f8, (92 )(sp) + fsw f7, (96 )(sp) + fsw f6, (100)(sp) + fsw f5, (104)(sp) + fsw f4, (108)(sp) + fsw f3, (112)(sp) + fsw f2, (116)(sp) + fsw f1, (120)(sp) + fsw f0, (124)(sp) +#endif + .endm + +.macro portasmRESTORE_ADDITIONAL_REGISTERS + /* load float registers */ +#if __riscv_flen == 64 + fld f31, (0 + 0 )(sp) + fld f30, (4 + 4 )(sp) + fld f29, (8 + 8 )(sp) + fld f28, (12 + 12)(sp) + fld f27, (16 + 16)(sp) + fld f26, (20 + 20)(sp) + fld f25, (24 + 24)(sp) + fld f24, (28 + 28)(sp) + fld f23, (32 + 32)(sp) + fld f22, (36 + 36)(sp) + fld f21, (40 + 40)(sp) + fld f20, (44 + 44)(sp) + fld f19, (48 + 48)(sp) + fld f18, (52 + 52)(sp) + fld f17, (56 + 56)(sp) + fld f16, (60 + 60)(sp) + fld f15, (64 + 64)(sp) + fld f14, (68 + 68)(sp) + fld f13, (72 + 72)(sp) + fld f12, (76 + 76)(sp) + fld f11, (80 + 80)(sp) + fld f10, (84 + 84)(sp) + fld f9, (88 + 88)(sp) + fld f8, (92 + 92)(sp) + fld f7, (96 + 96)(sp) + fld f6, (100+100)(sp) + fld f5, (104+104)(sp) + fld f4, (108+108)(sp) + fld f3, (112+112)(sp) + fld f2, (116+116)(sp) + fld f1, (120+120)(sp) + fld f0, (124+124)(sp) + + addi sp, sp, (128+128) +#elif __riscv_flen == 32 + flw f31, (0 )(sp) + flw f30, (4 )(sp) + flw f29, (8 )(sp) + flw f28, (12 )(sp) + flw f27, (16 )(sp) + flw f26, (20 )(sp) + flw f25, (24 )(sp) + flw f24, (28 )(sp) + flw f23, (32 )(sp) + flw f22, (36 )(sp) + flw f21, (40 )(sp) + flw f20, (44 )(sp) + flw f19, (48 )(sp) + flw f18, (52 )(sp) + flw f17, (56 )(sp) + flw f16, (60 )(sp) + flw f15, (64 )(sp) + flw f14, (68 )(sp) + flw f13, (72 )(sp) + flw f12, (76 )(sp) + flw f11, (80 )(sp) + flw f10, (84 )(sp) + flw f9, (88 )(sp) + flw f8, (92 )(sp) + flw f7, (96 )(sp) + flw f6, (100)(sp) + flw f5, (104)(sp) + flw f4, (108)(sp) + flw f3, (112)(sp) + flw f2, (116)(sp) + flw f1, (120)(sp) + flw f0, (124)(sp) + + addi sp, sp, (128) +#endif + .endm +#endif /* __FREERTOS_RISC_V_EXTENSIONS_H__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c new file mode 100644 index 0000000..51b6b05 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c @@ -0,0 +1,573 @@ +/* + * FreeRTOS Kernel V10.4.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + * 1 tab == 4 spaces! + */ + +#include "port.h" + +/* Standard includes. */ +#include +#include + +/* TriCore specific includes. */ +#include +#include +#include +#include +#include +#include "interrupts.h" + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "list.h" + +#if configCHECK_FOR_STACK_OVERFLOW > 0 + #error "Stack checking cannot be used with this port, as, unlike most ports, the pxTopOfStack member of the TCB is consumed CSA. CSA starvation, loosely equivalent to stack overflow, will result in a trap exception." + /* The stack pointer is accessible using portCSA_TO_ADDRESS( portCSA_TO_ADDRESS( pxCurrentTCB->pxTopOfStack )[ 0 ] )[ 2 ]; */ +#endif /* configCHECK_FOR_STACK_OVERFLOW */ + +#define CPU_ID (_mfcr(CPU_CORE_ID) & 0x0f) + +static volatile Ifx_STM* STMs[4] = {&MODULE_STM0, &MODULE_STM1, &MODULE_STM2, &MODULE_STM3}; +static const unsigned short STM_SRCs[4] = {SRC_ID_STM0SR0, SRC_ID_STM1SR0, SRC_ID_STM2SR0, SRC_ID_STM3SR0}; +static volatile Ifx_INT_SRB* SRBs[4] = {&INT_SRB0, &INT_SRB1, &INT_SRB2, &INT_SRB3}; +static const unsigned short GPSRs[4] = {SRC_ID_GPSR00, SRC_ID_GPSR10, SRC_ID_GPSR20, SRC_ID_GPSR30}; + +typedef struct +{ + unsigned int PCXI, PSW, A10, A11, D8, D9, D10, D11, A12, A13, A14, A15, D12, D13, D14, D15; +} UPPER_CONTEXT; + +/*-----------------------------------------------------------*/ + +/* System register Definitions. */ +#define portSYSTEM_PROGRAM_STATUS_WORD ( 0x000008FFUL ) /* Supervisor Mode, MPU Register Set 0 and Call Depth Counting disabled. */ +#define portINITIAL_PRIVILEGED_PROGRAM_STATUS_WORD ( 0x000014FFUL ) /* IO Level 1, MPU Register Set 1 and Call Depth Counting disabled. */ +#define portINITIAL_UNPRIVILEGED_PROGRAM_STATUS_WORD ( 0x000010FFUL ) /* IO Level 0, MPU Register Set 1 and Call Depth Counting disabled. */ +//#define portINITIAL_PCXI_UPPER_CONTEXT_WORD ( 0x00C00000UL ) /* The lower 20 bits identify the CSA address. */ +//#define portINITIAL_PCXI_UPPER_CONTEXT_WORD ( 0x10300000UL ) // ATENlower 20 bits identify the CSA address. */ +#define portINITIAL_PCXI_UPPER_CONTEXT_WORD ( 0x00300000UL ) // ATEN, default value as read from the CPU after init +#define portINITIAL_SYSCON ( 0x00000000UL ) /* MPU Disable. */ + +/* CSA manipulation macros. */ +#define portCSA_FCX_MASK ( 0x000FFFFFUL ) + +/* OS Interrupt and Trap mechanisms. */ +#define portRESTORE_PSW_MASK ( ~( 0x000000FFUL ) ) +#define portSYSCALL_TRAP ( 6 ) + +/* Each CSA contains 16 words of data. */ +#define portNUM_WORDS_IN_CSA ( 16 ) + +/* The interrupt enable bit in the PCP_SRC register. */ +#define portENABLE_CPU_INTERRUPT ( 1U << 12U ) +/*-----------------------------------------------------------*/ + +/* + * Perform any hardware configuration necessary to generate the tick interrupt. + */ +static void prvSystemTickHandler( int ) __attribute__((longcall)); +static void prvERUISRHandler( int ) __attribute__((longcall)); +static void prvSetupTimerInterrupt( void ); + +#define ERUInterruptCoreID 0 +static void prvSetupERUInterrupt(void); + +/* + * Priority 1 interrupt handler for yields pended from an interrupt. + */ +static void prvInterruptYield( int iTrapIdentification ); + +/*-----------------------------------------------------------*/ + +/* This reference is required by the save/restore context macros. */ +extern volatile uint32_t *pxCurrentTCB; + +extern TaskHandle_t xTaskHandle0[E_TASKS_CPU0_SIZE]; + +/* Precalculate the compare match value at compile time. */ +static const uint32_t ulCompareMatchValue = ( configPERIPHERAL_CLOCK_HZ / configTICK_RATE_HZ ); + +/*-----------------------------------------------------------*/ + +StackType_t *pxPortInitialiseStack( StackType_t * pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint32_t *pulUpperCSA = NULL; +uint32_t *pulLowerCSA = NULL; + + /* 16 Address Registers (4 Address registers are global), 16 Data + Registers, and 3 System Registers. + + There are 3 registers that track the CSAs. + FCX points to the head of globally free set of CSAs. + PCX for the task needs to point to Lower->Upper->NULL arrangement. + LCX points to the last free CSA so that corrective action can be taken. + + Need two CSAs to store the context of a task. + The upper context contains D8-D15, A10-A15, PSW and PCXI->NULL. + The lower context contains D0-D7, A2-A7, A11 and PCXI->UpperContext. + The pxCurrentTCB->pxTopOfStack points to the Lower Context RSLCX matching the initial BISR. + The Lower Context points to the Upper Context ready for the return from the interrupt handler. + + The Real stack pointer for the task is stored in the A10 which is restored + with the upper context. */ + + /* Have to disable interrupts here because the CSAs are going to be + manipulated. */ + portENTER_CRITICAL(); + { + /* DSync to ensure that buffering is not a problem. */ + _dsync(); + + /* Consume two free CSAs. */ + pulLowerCSA = portCSA_TO_ADDRESS( __MFCR( $FCX ) ); + if( NULL != pulLowerCSA ) + { + /* The Lower Links to the Upper. */ + pulUpperCSA = portCSA_TO_ADDRESS( pulLowerCSA[ 0 ] ); + } + + /* Check that we have successfully reserved two CSAs. */ + if( ( NULL != pulLowerCSA ) && ( NULL != pulUpperCSA ) ) + { + /* Remove the two consumed CSAs from the free CSA list. */ + _disable(); + _dsync(); + _mtcr( $FCX, pulUpperCSA[ 0 ] ); + _isync(); + _enable(); + } + else + { + /* Simply trigger a context list depletion trap. */ + _svlcx(); + } + } + portEXIT_CRITICAL(); + + /* Clear the upper CSA. */ + memset( pulUpperCSA, 0, portNUM_WORDS_IN_CSA * sizeof( uint32_t ) ); + + /* Upper Context. */ + pulUpperCSA[ 2 ] = ( uint32_t )pxTopOfStack; /* A10; Stack Return aka Stack Pointer */ + pulUpperCSA[ 1 ] = portSYSTEM_PROGRAM_STATUS_WORD; /* PSW */ + + /* Clear the lower CSA. */ + memset( pulLowerCSA, 0, portNUM_WORDS_IN_CSA * sizeof( uint32_t ) ); + + /* Lower Context. */ + pulLowerCSA[ 8 ] = ( uint32_t ) pvParameters; /* A4; Address Type Parameter Register */ + pulLowerCSA[ 1 ] = ( uint32_t ) pxCode; /* A11; Return Address aka RA */ + + /* PCXI pointing to the Upper context. */ + pulLowerCSA[ 0 ] = ( portINITIAL_PCXI_UPPER_CONTEXT_WORD | ( uint32_t ) portADDRESS_TO_CSA( pulUpperCSA ) ); + + /* Save the link to the CSA in the top of stack. */ + pxTopOfStack = (uint32_t * ) portADDRESS_TO_CSA( pulLowerCSA ); + + /* DSync to ensure that buffering is not a problem. */ + _dsync(); + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +int32_t xPortStartScheduler( void ) +{ + extern void vTrapInstallHandlers( void ); + uint32_t ulMFCR = 0UL; + uint32_t *pulUpperCSA = NULL; + uint32_t *pulLowerCSA = NULL; + + /* prevent compiler warnings */ + (void)pulUpperCSA; + + /* Interrupts at or below configMAX_SYSCALL_INTERRUPT_PRIORITY are disable + when this function is called. */ + + /* Set-up the ERU interrupt. */ + prvSetupERUInterrupt(); + + /* Set-up the timer interrupt. */ + prvSetupTimerInterrupt(); + + /* Install the Trap Handlers. */ + // vTrapInstallHandlers(); + + /* Install the Syscall Handler for yield calls. */ + // if( 0 == _install_trap_handler( portSYSCALL_TRAP, prvTrapYield ) ) + // { + // /* Failed to install the yield handler, force an assert. */ + // configASSERT( ( ( volatile void * ) NULL ) ); + // } + + /* Enable and install the priority 1 interrupt for pending context switches from an ISR. */ + InterruptInstall(GPSRs[CPU_ID], prvInterruptYield, configKERNEL_YIELD_PRIORITY, 0); //ATEN + + _disable(); + + /* Load the initial SYSCON. */ + _mtcr( $SYSCON, portINITIAL_SYSCON ); + _isync(); + + /* ENDINIT has already been applied in the 'cstart.c' code. */ + + /* Clear the PSW.CDC to enable the use of an RFE without it generating an + exception because this code is not genuinely in an exception. */ + ulMFCR = __MFCR( $PSW ); + ulMFCR &= portRESTORE_PSW_MASK; + _dsync(); + _mtcr( $PSW, ulMFCR ); + _isync(); + + /* Finally, perform the equivalent of a portRESTORE_CONTEXT() */ + pulLowerCSA = portCSA_TO_ADDRESS( ( *pxCurrentTCB ) ); + pulUpperCSA = portCSA_TO_ADDRESS( pulLowerCSA[0] ); + + _dsync(); + _mtcr( $PCXI, *pxCurrentTCB ); + _isync(); + _nop(); + _rslcx(); + _nop(); + + + /* Return to the first task selected to execute. */ + __asm volatile( "rfe" ); + + /* Will not get here. */ + return 0; +} +/*-----------------------------------------------------------*/ + +static void prvSetupTimerInterrupt( void ) +{ + unsigned short cpuid = CPU_ID; + + // Install handler for timer interrupt & reset interrupt flag + STMs[cpuid]->ISCR.U = 1; + InterruptInstall(STM_SRCs[cpuid], prvSystemTickHandler, configKERNEL_INTERRUPT_PRIORITY, 0); + + // prepare compare register for first interrupt + STMs[cpuid]->CMP[0].U = STMs[cpuid]->TIM0.U + ulCompareMatchValue; + STMs[cpuid]->CMCON.U = 31; + STMs[cpuid]->OCS.B.SUS = 2; + STMs[cpuid]->ICR.B.CMP0EN = 1; + +} +/*-----------------------------------------------------------*/ + +/*****************************************************************/ +static void prvSetupERUInterrupt(void) +{ + unsigned short cpuid = CPU_ID; + + if(cpuid == ERUInterruptCoreID) + { + SCU_FMR.B.FC0 = 1; //Clear the interrupt flag + InterruptInstall(SRC_ID_SCUERU0, prvERUISRHandler, 3, 0); //Load the interrupt routine and priortiy + } +} + +/*****************************************************************/ + +static void prvSystemTickHandler( int iArg ) +{ +uint32_t ulSavedInterruptMask; +uint32_t *pxUpperCSA = NULL; +uint32_t xUpperCSA = 0UL; +extern volatile uint32_t *pxCurrentTCB; +int32_t lYieldRequired; +unsigned short cpuid = CPU_ID; + + /* Just to avoid compiler warnings about unused parameters. */ + ( void ) iArg; + + /* Clear the interrupt source. */ + //STM_ISRR.reg = 1UL; //ATEN + + /* Reload the Compare Match register for X ticks into the future. + + If critical section or interrupt nesting budgets are exceeded, then + it is possible that the calculated next compare match value is in the + past. If this occurs (unlikely), it is possible that the resulting + time slippage will exceed a single tick period. Any adverse effect of + this is time bounded by the fact that only the first n bits of the 56 bit + STM timer are being used for a compare match, so another compare match + will occur after an overflow in just those n bits (not the entire 56 bits). + As an example, if the peripheral clock is 75MHz, and the tick rate is 1KHz, + a missed tick could result in the next tick interrupt occurring within a + time that is 1.7 times the desired period. The fact that this is greater + than a single tick period is an effect of using a timer that cannot be + automatically reset, in hardware, by the occurrence of a tick interrupt. + Changing the tick source to a timer that has an automatic reset on compare + match (such as a GPTA timer) will reduce the maximum possible additional + period to exactly 1 times the desired period. */ + + STMs[cpuid]->CMP[0].U = STMs[cpuid]->TIM0.U + ulCompareMatchValue; //ATEN + STMs[cpuid]->ISCR.B.CMP0IRR = 1; + //STM_CMP0.reg += ulCompareMatchValue; + + /* Kernel API calls require Critical Sections. */ + ulSavedInterruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the Tick. */ + lYieldRequired = xTaskIncrementTick(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulSavedInterruptMask ); + + if( lYieldRequired != pdFALSE ) + { + /* Save the context of a task. + The upper context is automatically saved when entering a trap or interrupt. + Need to save the lower context as well and copy the PCXI CSA ID into + pxCurrentTCB->pxTopOfStack. Only Lower Context CSA IDs may be saved to the + TCB of a task. + + Call vTaskSwitchContext to select the next task, note that this changes the + value of pxCurrentTCB so that it needs to be reloaded. + + Call vPortSetMPURegisterSetOne to change the MPU mapping for the task + that has just been switched in. + + Load the context of the task. + Need to restore the lower context by loading the CSA from + pxCurrentTCB->pxTopOfStack into PCXI (effectively changing the call stack). + In the Interrupt handler post-amble, RSLCX will restore the lower context + of the task. RFE will restore the upper context of the task, jump to the + return address and restore the previous state of interrupts being + enabled/disabled. */ + _disable(); + _dsync(); + xUpperCSA = __MFCR( $PCXI ); + pxUpperCSA = portCSA_TO_ADDRESS( xUpperCSA ); + *pxCurrentTCB = pxUpperCSA[ 0 ]; + vTaskSwitchContext(); + pxUpperCSA[ 0 ] = *pxCurrentTCB; + SRBs[cpuid]->B.TRIG0 = 0; //ATEN + //CPU_SRC0.bits.SETR = 0; + _isync(); + } +} +/*-----------------------------------------------------------*/ + +static void prvERUISRHandler( int iArg ) +{ + BaseType_t checkIfYieldRequired; + /* Just to avoid compiler warnings about unused parameters. */ + ( void ) iArg; + + SCU_FMR.B.FC0 = 1; //Clear the interrupt flag + + checkIfYieldRequired = xTaskResumeFromISR(xTaskHandle0[E_FPGA_TASK]); //Check the state of the FPGA task + portYIELD_FROM_ISR(checkIfYieldRequired); //Yield the FPGA task if it was suspended +} + +/* + * When a task is deleted, it is yielded permanently until the IDLE task + * has an opportunity to reclaim the memory that that task was using. + * Typically, the memory used by a task is the TCB and Stack but in the + * TriCore this includes the CSAs that were consumed as part of the Call + * Stack. These CSAs can only be returned to the Globally Free Pool when + * they are not part of the current Call Stack, hence, delaying the + * reclamation until the IDLE task is freeing the task's other resources. + * This function uses the head of the linked list of CSAs (from when the + * task yielded for the last time) and finds the tail (the very bottom of + * the call stack) and inserts this list at the head of the Free list, + * attaching the existing Free List to the tail of the reclaimed call stack. + * + * NOTE: the IDLE task needs processing time to complete this function + * and in heavily loaded systems, the Free CSAs may be consumed faster + * than they can be freed assuming that tasks are being spawned and + * deleted frequently. + */ +void vPortReclaimCSA( uint32_t *pxTCB ) +{ +uint32_t pxHeadCSA, pxTailCSA, pxFreeCSA; +uint32_t *pulNextCSA; + + /* A pointer to the first CSA in the list of CSAs consumed by the task is + stored in the first element of the tasks TCB structure (where the stack + pointer would be on a traditional stack based architecture). */ + pxHeadCSA = ( *pxTCB ) & portCSA_FCX_MASK; + + /* Mask off everything in the CSA link field other than the address. If + the address is NULL, then the CSA is not linking anywhere and there is + nothing to do. */ + pxTailCSA = pxHeadCSA; + + /* Convert the link value to contain just a raw address and store this + in a local variable. */ + pulNextCSA = portCSA_TO_ADDRESS( pxTailCSA ); + + /* Iterate over the CSAs that were consumed as part of the task. The + first field in the CSA is the pointer to then next CSA. Mask off + everything in the pointer to the next CSA, other than the link address. + If this is NULL, then the CSA currently being pointed to is the last in + the chain. */ + while( 0UL != ( pulNextCSA[ 0 ] & portCSA_FCX_MASK ) ) + { + /* Clear all bits of the pointer to the next in the chain, other + than the address bits themselves. */ + pulNextCSA[ 0 ] = pulNextCSA[ 0 ] & portCSA_FCX_MASK; + + /* Move the pointer to point to the next CSA in the list. */ + pxTailCSA = pulNextCSA[ 0 ]; + + /* Update the local pointer to the CSA. */ + pulNextCSA = portCSA_TO_ADDRESS( pxTailCSA ); + } + + _disable(); + { + /* Look up the current free CSA head. */ + _dsync(); + pxFreeCSA = __MFCR( $FCX ); + + /* Join the current Free onto the Tail of what is being reclaimed. */ + portCSA_TO_ADDRESS( pxTailCSA )[ 0 ] = pxFreeCSA; + + /* Move the head of the reclaimed into the Free. */ + _dsync(); + _mtcr( $FCX, pxHeadCSA ); + _isync(); + } + _enable(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Nothing to do. Unlikely to want to end. */ +} +/*-----------------------------------------------------------*/ + +void vTrapSysCallYield( int iTrapIdentification ) +{ +uint32_t *pxUpperCSA = NULL; +uint32_t xUpperCSA = 0UL; + +extern volatile uint32_t *pxCurrentTCB; + + switch( iTrapIdentification ) + { + case portSYSCALL_TASK_YIELD: + /* Save the context of a task. + The upper context is automatically saved when entering a trap or interrupt. + Need to save the lower context as well and copy the PCXI CSA ID into + pxCurrentTCB->pxTopOfStack. Only Lower Context CSA IDs may be saved to the + TCB of a task. + + Call vTaskSwitchContext to select the next task, note that this changes the + value of pxCurrentTCB so that it needs to be reloaded. + + Call vPortSetMPURegisterSetOne to change the MPU mapping for the task + that has just been switched in. + + Load the context of the task. + Need to restore the lower context by loading the CSA from + pxCurrentTCB->pxTopOfStack into PCXI (effectively changing the call stack). + In the Interrupt handler post-amble, RSLCX will restore the lower context + of the task. RFE will restore the upper context of the task, jump to the + return address and restore the previous state of interrupts being + enabled/disabled. */ + _disable(); + _dsync(); + xUpperCSA = __MFCR( $PCXI ); + pxUpperCSA = portCSA_TO_ADDRESS( xUpperCSA ); + *pxCurrentTCB = pxUpperCSA[ 0 ]; + vTaskSwitchContext(); + pxUpperCSA[ 0 ] = *pxCurrentTCB; + SRBs[CPU_ID]->B.TRIG0 = 0; //ATEN + // CPU_SRC0.bits.SETR = 0; + _isync(); + break; + + default: + /* Unimplemented trap called. */ + configASSERT( ( ( volatile void * ) NULL ) ); + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvInterruptYield( int iId ) +{ +uint32_t *pxUpperCSA = NULL; +uint32_t xUpperCSA = 0UL; +extern volatile uint32_t *pxCurrentTCB; + + /* Just to remove compiler warnings. */ + ( void ) iId; + + /* Save the context of a task. + The upper context is automatically saved when entering a trap or interrupt. + Need to save the lower context as well and copy the PCXI CSA ID into + pxCurrentTCB->pxTopOfStack. Only Lower Context CSA IDs may be saved to the + TCB of a task. + + Call vTaskSwitchContext to select the next task, note that this changes the + value of pxCurrentTCB so that it needs to be reloaded. + + Call vPortSetMPURegisterSetOne to change the MPU mapping for the task + that has just been switched in. + + Load the context of the task. + Need to restore the lower context by loading the CSA from + pxCurrentTCB->pxTopOfStack into PCXI (effectively changing the call stack). + In the Interrupt handler post-amble, RSLCX will restore the lower context + of the task. RFE will restore the upper context of the task, jump to the + return address and restore the previous state of interrupts being + enabled/disabled. */ + _disable(); + _dsync(); + xUpperCSA = __MFCR( $PCXI ); + pxUpperCSA = portCSA_TO_ADDRESS( xUpperCSA ); + *pxCurrentTCB = pxUpperCSA[ 0 ]; + vTaskSwitchContext(); + pxUpperCSA[ 0 ] = *pxCurrentTCB; + SRBs[CPU_ID]->B.TRIG0 = 0; //ATEN + //CPU_SRC0.bits.SETR = 0; + _isync(); +} +/*-----------------------------------------------------------*/ + +uint32_t uxPortSetInterruptMaskFromISR( void ) +{ +uint32_t uxReturn = 0UL; + + _disable(); + uxReturn = __MFCR( $ICR ); + _mtcr( $ICR, ( ( uxReturn & ~portCCPN_MASK ) | configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + _isync(); + _enable(); + + /* Return just the interrupt mask bits. */ + return ( uxReturn & portCCPN_MASK ); +} +/*-----------------------------------------------------------*/ + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h new file mode 100644 index 0000000..9bb99de --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h @@ -0,0 +1,42 @@ +/* + * FreeRTOS Kernel V10.4.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + * 1 tab == 4 spaces! + */ + +#ifndef _PORTABLE_GCC_TRICORE_PORT_H_ +#define _PORTABLE_GCC_TRICORE_PORT_H_ + +//These definitions seem to be missing within the TC3xx include files +//Compile the project with the "-fdollars-in-identifiers" option!! + +#define $FCX 0xFE38 +#define $ICR 0xFE2C +#define $PCXI 0xFE00 +#define $PSW 0xFE04 +#define $SYSCON 0xFE14 + +extern void vTrapSysCallYield( int iTrapIdentification ); + +#endif /* _PORTABLE_GCC_TRICORE_PORT_H_ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h new file mode 100644 index 0000000..b2c4ebc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h @@ -0,0 +1,175 @@ +/* + * FreeRTOS Kernel V10.4.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + * 1 tab == 4 spaces! + */ + +#ifndef _PORTABLE_GCC_TRICORE_PORTMACRO_H_ +#define _PORTABLE_GCC_TRICORE_PORTMACRO_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "port.h" + +/* System Includes. */ +#include +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE unsigned long + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + + /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 +#endif +/*---------------------------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() __asm volatile( " nop " ) +#define portCRITICAL_NESTING_IN_TCB 1 +#define portRESTORE_FIRST_TASK_PRIORITY_LEVEL 1 + + +/*---------------------------------------------------------------------------*/ + +typedef struct MPU_SETTINGS { uint32_t ulNotUsed; } xMPU_SETTINGS; + +/* Define away the instruction from the Restore Context Macro. */ +#define portPRIVILEGE_BIT 0x0UL + +#define portCCPN_MASK ( 0x000000FFUL ) + +extern void vTaskEnterCritical( void ); +extern void vTaskExitCritical( void ); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() +/*---------------------------------------------------------------------------*/ + +/* CSA Manipulation. */ +#define portCSA_TO_ADDRESS( pCSA ) ( ( uint32_t * )( ( ( ( pCSA ) & 0x000F0000 ) << 12 ) | ( ( ( pCSA ) & 0x0000FFFF ) << 6 ) ) ) +#define portADDRESS_TO_CSA( pAddress ) ( ( uint32_t )( ( ( ( (uint32_t)( pAddress ) ) & 0xF0000000 ) >> 12 ) | ( ( ( uint32_t )( pAddress ) & 0x003FFFC0 ) >> 6 ) ) ) +/*---------------------------------------------------------------------------*/ + +#define portYIELD() _syscall( 0 ) +/* Port Restore is implicit in the platform when the function is returned from the original PSW is automatically replaced. */ +#define portSYSCALL_TASK_YIELD 0 +#define portSYSCALL_RAISE_PRIORITY 1 +/*---------------------------------------------------------------------------*/ + +/* Critical section management. */ + +/* Set ICR.CCPN to configMAX_SYSCALL_INTERRUPT_PRIORITY. */ +#define portDISABLE_INTERRUPTS() { \ + uint32_t ulICR; \ + _disable(); \ + ulICR = __MFCR( $ICR ); /* Get current ICR value. */ \ + ulICR &= ~portCCPN_MASK; /* Clear down mask bits. */ \ + ulICR |= configMAX_SYSCALL_INTERRUPT_PRIORITY; /* Set mask bits to required priority mask. */ \ + _mtcr( $ICR, ulICR ); /* Write back updated ICR. */ \ + _isync(); \ + _enable(); \ + } + +/* Clear ICR.CCPN to allow all interrupt priorities. */ +#define portENABLE_INTERRUPTS() { \ + uint32_t ulICR; \ + _disable(); \ + ulICR = __MFCR( $ICR ); /* Get current ICR value. */ \ + ulICR &= ~portCCPN_MASK; /* Clear down mask bits. */ \ + _mtcr( $ICR, ulICR ); /* Write back updated ICR. */ \ + _isync(); \ + _enable(); \ + } + +/* Set ICR.CCPN to uxSavedMaskValue. */ +#define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedMaskValue ) { \ + uint32_t ulICR; \ + _disable(); \ + ulICR = __MFCR( $ICR ); /* Get current ICR value. */ \ + ulICR &= ~portCCPN_MASK; /* Clear down mask bits. */ \ + ulICR |= uxSavedMaskValue; /* Set mask bits to previously saved mask value. */ \ + _mtcr( $ICR, ulICR ); /* Write back updated ICR. */ \ + _isync(); \ + _enable(); \ + } + + +/* Set ICR.CCPN to configMAX_SYSCALL_INTERRUPT_PRIORITY */ +extern uint32_t uxPortSetInterruptMaskFromISR( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() uxPortSetInterruptMaskFromISR() + +/* Pend a priority 1 interrupt, which will take care of the context switch. */ +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) if( xHigherPriorityTaskWoken != pdFALSE ) { _isync(); } + +/*---------------------------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*---------------------------------------------------------------------------*/ + +/* + * Port specific clean up macro required to free the CSAs that were consumed by + * a task that has since been deleted. + */ +void vPortReclaimCSA( uint32_t *pxTCB ); +#define portCLEAN_UP_TCB( pxTCB ) vPortReclaimCSA( ( uint32_t * ) ( pxTCB ) ) + +#ifdef __cplusplus +} +#endif + +#endif /* _PORTABLE_GCC_TRICORE_PORTMACRO_H_ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c new file mode 100644 index 0000000..fcfec4e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c @@ -0,0 +1,281 @@ +/* + * FreeRTOS Kernel V10.4.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + * 1 tab == 4 spaces! + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" + +/* Machine includes */ +#include +#include +#include +/*---------------------------------------------------------------------------*/ + +/* + * This reference is required by the Save/Restore Context Macros. + */ +extern volatile uint32_t *pxCurrentTCB; +/*-----------------------------------------------------------*/ + +/* + * This file contains base definitions for all of the possible traps in the system. + * It is suggested to provide implementations for all of the traps but for + * the time being they simply trigger a DEBUG instruction so that it is easy + * to see what caused a particular trap. + * + * Trap Class 6, the SYSCALL, is used exclusively by the operating system. + */ + +/* The Trap Classes. */ +#define portMMU_TRAP 0 +#define portIPT_TRAP 1 +#define portIE_TRAP 2 +#define portCM_TRAP 3 +#define portSBP_TRAP 4 +#define portASSERT_TRAP 5 +#define portNMI_TRAP 7 + +/* MMU Trap Identifications. */ +#define portTIN_MMU_VIRTUAL_ADDRESS_FILL 0 +#define portTIN_MMU_VIRTUAL_ADDRESS_PROTECTION 1 + +/* Internal Protection Trap Identifications. */ +#define portTIN_IPT_PRIVILIGED_INSTRUCTION 1 +#define portTIN_IPT_MEMORY_PROTECTION_READ 2 +#define portTIN_IPT_MEMORY_PROTECTION_WRITE 3 +#define portTIN_IPT_MEMORY_PROTECTION_EXECUTION 4 +#define portTIN_IPT_MEMORY_PROTECTION_PERIPHERAL_ACCESS 5 +#define portTIN_IPT_MEMORY_PROTECTION_NULL_ADDRESS 6 +#define portTIN_IPT_MEMORY_PROTECTION_GLOBAL_REGISTER_WRITE_PROTECTION 7 + +/* Instruction Error Trap Identifications. */ +#define portTIN_IE_ILLEGAL_OPCODE 1 +#define portTIN_IE_UNIMPLEMENTED_OPCODE 2 +#define portTIN_IE_INVALID_OPERAND 3 +#define portTIN_IE_DATA_ADDRESS_ALIGNMENT 4 +#define portTIN_IE_INVALID_LOCAL_MEMORY_ADDRESS 5 + +/* Context Management Trap Identifications. */ +#define portTIN_CM_FREE_CONTEXT_LIST_DEPLETION 1 +#define portTIN_CM_CALL_DEPTH_OVERFLOW 2 +#define portTIN_CM_CALL_DEPTH_UNDEFLOW 3 +#define portTIN_CM_FREE_CONTEXT_LIST_UNDERFLOW 4 +#define portTIN_CM_CALL_STACK_UNDERFLOW 5 +#define portTIN_CM_CONTEXT_TYPE 6 +#define portTIN_CM_NESTING_ERROR 7 + +/* System Bus and Peripherals Trap Identifications. */ +#define portTIN_SBP_PROGRAM_FETCH_SYNCHRONOUS_ERROR 1 +#define portTIN_SBP_DATA_ACCESS_SYNCHRONOUS_ERROR 2 +#define portTIN_SBP_DATA_ACCESS_ASYNCHRONOUS_ERROR 3 +#define portTIN_SBP_COPROCESSOR_TRAP_ASYNCHRONOUS_ERROR 4 +#define portTIN_SBP_PROGRAM_MEMORY_INTEGRITY_ERROR 5 +#define portTIN_SBP_DATA_MEMORY_INTEGRITY_ERROR 6 + +/* Assertion Trap Identifications. */ +#define portTIN_ASSERT_ARITHMETIC_OVERFLOW 1 +#define portTIN_ASSERT_STICKY_ARITHMETIC_OVERFLOW 2 + +/* Non-maskable Interrupt Trap Identifications. */ +#define portTIN_NMI_NON_MASKABLE_INTERRUPT 0 +/*---------------------------------------------------------------------------*/ + +void vMMUTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vInternalProtectionTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vInstructionErrorTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vContextManagementTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vSystemBusAndPeripheralsTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vAssertionTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +void vNonMaskableInterruptTrap( int iTrapIdentification ) __attribute__( ( longcall, weak ) ); +/*---------------------------------------------------------------------------*/ + +void vTrapInstallHandlers( void ) +{ + if( 0 == _install_trap_handler ( portMMU_TRAP, vMMUTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portIPT_TRAP, vInternalProtectionTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portIE_TRAP, vInstructionErrorTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portCM_TRAP, vContextManagementTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portSBP_TRAP, vSystemBusAndPeripheralsTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portASSERT_TRAP, vAssertionTrap ) ) + { + _debug(); + } + + if( 0 == _install_trap_handler ( portNMI_TRAP, vNonMaskableInterruptTrap ) ) + { + _debug(); + } +} +/*-----------------------------------------------------------*/ + +void vMMUTrap( int iTrapIdentification ) +{ + switch( iTrapIdentification ) + { + case portTIN_MMU_VIRTUAL_ADDRESS_FILL: + case portTIN_MMU_VIRTUAL_ADDRESS_PROTECTION: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vInternalProtectionTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_IPT_PRIVILIGED_INSTRUCTION: + /* Instruction is not allowed at current execution level, eg DISABLE at User-0. */ + + case portTIN_IPT_MEMORY_PROTECTION_READ: + /* Load word using invalid address. */ + + case portTIN_IPT_MEMORY_PROTECTION_WRITE: + /* Store Word using invalid address. */ + + case portTIN_IPT_MEMORY_PROTECTION_EXECUTION: + /* PC jumped to an address outside of the valid range. */ + + case portTIN_IPT_MEMORY_PROTECTION_PERIPHERAL_ACCESS: + /* Access to a peripheral denied at current execution level. */ + + case portTIN_IPT_MEMORY_PROTECTION_NULL_ADDRESS: + /* NULL Pointer. */ + + case portTIN_IPT_MEMORY_PROTECTION_GLOBAL_REGISTER_WRITE_PROTECTION: + /* Tried to modify a global address pointer register. */ + + default: + + pxCurrentTCB[ 0 ] = __MFCR( $PCXI ); + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vInstructionErrorTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_IE_ILLEGAL_OPCODE: + case portTIN_IE_UNIMPLEMENTED_OPCODE: + case portTIN_IE_INVALID_OPERAND: + case portTIN_IE_DATA_ADDRESS_ALIGNMENT: + case portTIN_IE_INVALID_LOCAL_MEMORY_ADDRESS: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vContextManagementTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_CM_FREE_CONTEXT_LIST_DEPLETION: + case portTIN_CM_CALL_DEPTH_OVERFLOW: + case portTIN_CM_CALL_DEPTH_UNDEFLOW: + case portTIN_CM_FREE_CONTEXT_LIST_UNDERFLOW: + case portTIN_CM_CALL_STACK_UNDERFLOW: + case portTIN_CM_CONTEXT_TYPE: + case portTIN_CM_NESTING_ERROR: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vSystemBusAndPeripheralsTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_SBP_PROGRAM_FETCH_SYNCHRONOUS_ERROR: + case portTIN_SBP_DATA_ACCESS_SYNCHRONOUS_ERROR: + case portTIN_SBP_DATA_ACCESS_ASYNCHRONOUS_ERROR: + case portTIN_SBP_COPROCESSOR_TRAP_ASYNCHRONOUS_ERROR: + case portTIN_SBP_PROGRAM_MEMORY_INTEGRITY_ERROR: + case portTIN_SBP_DATA_MEMORY_INTEGRITY_ERROR: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vAssertionTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_ASSERT_ARITHMETIC_OVERFLOW: + case portTIN_ASSERT_STICKY_ARITHMETIC_OVERFLOW: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ + +void vNonMaskableInterruptTrap( int iTrapIdentification ) +{ + /* Deliberate fall through to default. */ + switch( iTrapIdentification ) + { + case portTIN_NMI_NON_MASKABLE_INTERRUPT: + default: + _debug(); + break; + } +} +/*---------------------------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt new file mode 100644 index 0000000..c3276fc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt @@ -0,0 +1 @@ +Compile the project with the "-fdollars-in-identifiers" option!! diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/LICENSE b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/LICENSE new file mode 100644 index 0000000..2724b4f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/LICENSE @@ -0,0 +1 @@ +This repository contains multiple directories, each individually licensed. Please see the LICENSE file in each directory. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/README.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/README.md new file mode 100644 index 0000000..209ffc3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/README.md @@ -0,0 +1,19 @@ +## FreeRTOS Community Supported Ports + +This repository contains FreeRTOS ports supported by FreeRTOS community members. +Follow the steps below to contribute a FreeRTOS port to this repository: + +1. Write FreeRTOS port for your Compiler and Architecture. +2. *[Optional]* Create a project in the [FreeRTOS Community Supported Demos Repository](https://github.com/FreeRTOS/FreeRTOS-Community-Supported-Demos/tree/main) + for your hardware for running tests as mentioned [here](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS/Demo/ThirdParty/Template/README.md). +3. *[Optional]* Make sure all the tests pass. Add the test results in the Pull Request description. +4. Add a README file with the following information: + 1. How to use this port? + 2. *[Optional]* Link to the test project created in Step 2. + 3. Any other relevant information. +5. Raise a pull request to merge the port. +6. *[Optional]* Raise another PR to merge the test project in the [FreeRTOS Partner Supported Demos Repository](https://github.com/FreeRTOS/FreeRTOS-Partner-Supported-Demos/tree/main). + +## License + +This repository contains multiple directories, each individually licensed. Please see the LICENSE file in each directory. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c new file mode 100644 index 0000000..59a815f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c @@ -0,0 +1,283 @@ +/* + * FreeRTOS Kernel V10.4.3 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#include + +#include "include/FreeRTOS.h" + +#if __SDCC +#include "include/sdcc/task.h" +#elif __SCCZ80 +#include "include/sccz80/task.h" +#endif + +/*-----------------------------------------------------------*/ + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +/*-----------------------------------------------------------*/ + +/* + * Macro to save all the general purpose registers, the save the stack pointer + * into the TCB. + * + * The first thing we do is save the flags then disable interrupts. This is to + * guard our stack against having a context switch interrupt after we have already + * pushed the registers onto the stack. + * + * The interrupts will have been disabled during the call to portSAVE_CONTEXT() + * so we need not worry about reading/writing to the stack pointer. + */ + +#define configTICK_RATE_HZ (256) /* Timer configured */ +#define configISR_ORG ASMPC /* ISR relocation */ +#define configISR_IVT 0xFFE6 /* PRT1 address */ + +#ifdef __SCCZ80 + +#define configSETUP_TIMER_INTERRUPT() \ + do{ \ + asm( \ + "EXTERN __CPU_CLOCK \n" \ + "EXTERN RLDR1L, RLDR1H \n" \ + "EXTERN TCR, TCR_TIE1, TCR_TDE1 \n" \ + "ld de,_timer_isr \n" \ + "ld hl,"string(configISR_IVT)" ; PRT1 address \n" \ + "ld (hl),e \n" \ + "inc hl \n" \ + "ld (hl),d \n" \ + "; we do configTICK_RATE_HZ ticks per second \n" \ + "ld hl,__CPU_CLOCK/"string(configTICK_RATE_HZ)"/20-1 \n" \ + "out0(RLDR1L),l \n" \ + "out0(RLDR1H),h \n" \ + "in0 a,(TCR) \n" \ + "or TCR_TIE1|TCR_TDE1 \n" \ + "out0 (TCR),a \n" \ + ); \ + }while(0) + +#define configRESET_TIMER_INTERRUPT() \ + do{ \ + asm( \ + "EXTERN TCR, TMDR1L \n" \ + "in0 a,(TCR) \n" \ + "in0 a,(TMDR1L) \n" \ + ); \ + }while(0) + +#define configSTOP_TIMER_INTERRUPT() \ + do{ \ + asm( \ + "EXTERN TCR, TCR_TIE1, TCR_TDE1 \n" \ + "; disable down counting and interrupts for PRT1\n" \ + "in0 a,(TCR) \n" \ + "xor TCR_TIE1|TCR_TDE1 \n" \ + "out0 (TCR),a \n" \ + ); \ + }while(0) + +#endif + +#ifdef __SDCC + +#define configSETUP_TIMER_INTERRUPT() \ + do{ \ + __asm \ + EXTERN __CPU_CLOCK \ + EXTERN RLDR1L, RLDR1H \ + EXTERN TCR, TCR_TIE1, TCR_TDE1 \ + ; address of ISR \ + ld de,_timer_isr \ + ld hl,configISR_IVT ; PRT1 address \ + ld (hl),e \ + inc hl \ + ld (hl),d \ + ; we do configTICK_RATE_HZ ticks per second \ + ld hl,__CPU_CLOCK/configTICK_RATE_HZ/20-1 \ + out0(RLDR1L),l \ + out0(RLDR1H),h \ + ; enable down counting and interrupts for PRT1 \ + in0 a,(TCR) \ + or TCR_TIE1|TCR_TDE1 \ + out0 (TCR),a \ + __endasm; \ + }while(0) + +#define configRESET_TIMER_INTERRUPT() \ + do{ \ + __asm \ + EXTERN TCR, TMDR1L \ + ; reset interrupt for PRT1 \ + in0 a,(TCR) \ + in0 a,(TMDR1L) \ + __endasm; \ + }while(0) + +#define configSTOP_TIMER_INTERRUPT() \ + do{ \ + __asm \ + EXTERN TCR, TCR_TIE1, TCR_TDE1 \ + ; disable down counting and interrupts for PRT1 \ + in0 a,(TCR) \ + xor TCR_TIE1|TCR_TDE1 \ + out0 (TCR),a \ + __endasm; \ + }while(0) + +#endif + +/*-----------------------------------------------------------*/ + +/* + * Perform hardware setup to enable ticks from Timer. + */ +static void prvSetupTimerInterrupt( void ) __preserves_regs(iyh,iyl); +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ + /* Place the parameter on the stack in the expected location. */ + *pxTopOfStack-- = ( StackType_t ) pvParameters; + + /* Place the task return address on stack. Not used */ + *pxTopOfStack-- = ( StackType_t ) 0; + + /* The start of the task code will be popped off the stack last, so place + it on first. */ + *pxTopOfStack-- = ( StackType_t ) pxCode; + + /* Now the registers. */ + *pxTopOfStack-- = ( StackType_t ) 0xAFAF; /* AF */ + *pxTopOfStack-- = ( StackType_t ) 0x0404; /* IF */ + *pxTopOfStack-- = ( StackType_t ) 0xBCBC; /* BC */ + *pxTopOfStack-- = ( StackType_t ) 0xDEDE; /* DE */ + *pxTopOfStack-- = ( StackType_t ) 0xEFEF; /* HL */ + *pxTopOfStack-- = ( StackType_t ) 0xFAFA; /* AF' */ + *pxTopOfStack-- = ( StackType_t ) 0xCBCB; /* BC' */ + *pxTopOfStack-- = ( StackType_t ) 0xEDED; /* DE' */ + *pxTopOfStack-- = ( StackType_t ) 0xFEFE; /* HL' */ + *pxTopOfStack-- = ( StackType_t ) 0xCEFA; /* IX */ + *pxTopOfStack = ( StackType_t ) 0xADDE; /* IY */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) __preserves_regs(a,b,c,d,e,iyh,iyl) __naked +{ + /* Setup the relevant timer hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Should not get here. */ + return pdFALSE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) __preserves_regs(b,c,d,e,h,l,iyh,iyl) +{ + /* + * It is unlikely that the Z80 port will get stopped. + * If required simply disable the tick interrupt here. + */ + configSTOP_TIMER_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. The first thing we do is save the registers so we + * can use a naked attribute. This is called by the application, so we don't have + * to check which bank is loaded. + */ +void vPortYield( void ) __preserves_regs(a,b,c,d,e,h,l,iyh,iyl) __naked +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch callable from ISRs. The first thing we do is save + * the registers so we can use a naked attribute. + */ +void vPortYieldFromISR(void) __preserves_regs(a,b,c,d,e,h,l,iyh,iyl) __naked +void vPortYieldFromISR(void) +{ + portSAVE_CONTEXT_IN_ISR(); + vTaskSwitchContext(); + portRESTORE_CONTEXT_IN_ISR(); +} +/*-----------------------------------------------------------*/ + +/* + * Initialize Timer (PRT1 for YAZ180, and SCZ180 HBIOS). + */ +void prvSetupTimerInterrupt( void ) __preserves_regs(iyh,iyl) +{ + configSETUP_TIMER_INTERRUPT(); +} +/*-----------------------------------------------------------*/ + +void timer_isr(void) __preserves_regs(a,b,c,d,e,h,l,iyh,iyl) __naked +{ +#if configUSE_PREEMPTION == 1 + /* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of timer_isr(). The tick + * count is incremented after the context is saved. + * + * Context switch function used by the tick. This must be identical to + * vPortYield() from the call to vTaskSwitchContext() onwards. The only + * difference from vPortYield() is the tick count is incremented as the + * call comes from the tick ISR. + */ + portSAVE_CONTEXT_IN_ISR(); + configRESET_TIMER_INTERRUPT(); + xTaskIncrementTick(); + vTaskSwitchContext(); + portRESTORE_CONTEXT_IN_ISR(); +#else + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + portSAVE_CONTEXT_IN_ISR(); + configRESET_TIMER_INTERRUPT(); + xTaskIncrementTick(); + portRESTORE_CONTEXT_IN_ISR(); +#endif +} // configUSE_PREEMPTION diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h new file mode 100644 index 0000000..f8f2f02 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h @@ -0,0 +1,431 @@ +/* + * FreeRTOS Kernel V10.4.3 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given Z80 (Z180, Z80N) hardware and SCCZ80 or SDCC compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int + +typedef uint16_t StackType_t; +typedef int8_t BaseType_t; +typedef uint8_t UBaseType_t; + +#if configUSE_16_BIT_TICKS == 1 + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* General purpose stringify macros. */ + +#define string(a) __string(a) +#define __string(a) #a +/*-----------------------------------------------------------*/ + +/* Critical section management using sccz80 compiler. */ + +#ifdef __SCCZ80 + +#define portENTER_CRITICAL() \ + do{ \ + asm( \ + "ld a,i \n" \ + "di \n" \ + "push af \n" \ + ); \ + }while(0) + +#define portEXIT_CRITICAL() \ + do{ \ + asm( \ + "pop af \n" \ + "; di ; unneeded \n" \ + "jp PO,ASMPC+4 \n" \ + "ei \n" \ + ); \ + }while(0) + +#define portDISABLE_INTERRUPTS() \ + do{ \ + asm( \ + "di \n" \ + ); \ + }while(0) + +#define portENABLE_INTERRUPTS() \ + do{ \ + asm( \ + "ei \n" \ + ); \ + }while(0) + +#define portNOP() \ + do{ \ + asm( \ + "nop \n" \ + ); \ + }while(0) + +/* + * Macros to save all the registers, and save the stack pointer into the TCB. + */ + +#define portSAVE_CONTEXT() \ + do{ \ + asm( \ + "push af \n" \ + "ld a,i \n" \ + "di \n" \ + "push af ; iff1:iff2\n" \ + "push bc \n" \ + "push de \n" \ + "push hl \n" \ + "exx \n" \ + "ex af,af \n" \ + "push af \n" \ + "push bc \n" \ + "push de \n" \ + "push hl \n" \ + "push ix \n" \ + "push iy \n" \ + "ld hl,0 \n" \ + "add hl,sp \n" \ + "ld de,(_pxCurrentTCB) \n"\ + "ex de,hl \n" \ + "ld (hl),e \n" \ + "inc hl \n" \ + "ld (hl),d \n" \ + ); \ + }while(0) + +#define portRESTORE_CONTEXT() \ + do{ \ + asm( \ + "ld hl,(_pxCurrentTCB) \n" \ + "ld e,(hl) \n" \ + "inc hl \n" \ + "ld d,(hl) \n" \ + "ex de,hl \n" \ + "ld sp,hl \n" \ + "pop iy \n" \ + "pop ix \n" \ + "pop hl \n" \ + "pop de \n" \ + "pop bc \n" \ + "pop af \n" \ + "ex af,af \n" \ + "exx \n" \ + "pop hl \n" \ + "pop de \n" \ + "pop bc \n" \ + "pop af ; iff1:iff2\n" \ + "; di ; unneeded \n" \ + "jp PO,ASMPC+4 \n" \ + "ei \n" \ + "pop af \n" \ + "ret \n" \ + ); \ + }while(0) + +#define portSAVE_CONTEXT_IN_ISR() \ + do{ \ + asm( \ + "PHASE "string(configISR_ORG)" \n" \ + "._timer_isr_start \n" \ + "push af \n" \ + "ld a,0x7F \n" \ + "inc a ; set PE \n" \ + "push af ; iff1:iff2\n" \ + "push bc \n" \ + "push de \n" \ + "push hl \n" \ + "exx \n" \ + "ex af,af \n" \ + "push af \n" \ + "push bc \n" \ + "push de \n" \ + "push hl \n" \ + "push ix \n" \ + "push iy \n" \ + "ld hl,0 \n" \ + "add hl,sp \n" \ + "ld de,(_pxCurrentTCB) \n" \ + "ex de,hl \n" \ + "ld (hl),e \n" \ + "inc hl \n" \ + "ld (hl),d \n" \ + ); \ + }while(0) + +#define portRESTORE_CONTEXT_IN_ISR()\ + do{ \ + asm( \ + "ld hl,(_pxCurrentTCB) \n" \ + "ld e,(hl) \n" \ + "inc hl \n" \ + "ld d,(hl) \n" \ + "ex de,hl \n" \ + "ld sp,hl \n" \ + "pop iy \n" \ + "pop ix \n" \ + "pop hl \n" \ + "pop de \n" \ + "pop bc \n" \ + "pop af \n" \ + "ex af,af \n" \ + "exx \n" \ + "pop hl \n" \ + "pop de \n" \ + "pop bc \n" \ + "pop af ; iff1:iff2\n" \ + "; di ; unneeded \n" \ + "jp PO,ASMPC+4 \n" \ + "ei \n" \ + "pop af \n" \ + "reti \n" \ + "._timer_isr_end \n" \ + "DEPHASE \n" \ + ); \ + }while(0) + +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management using sdcc compiler. */ + +#ifdef __SDCC + +#define portENTER_CRITICAL() \ + do{ \ + __asm \ + ld a,i \ + di \ + push af \ + __endasm; \ + }while(0) + +#define portEXIT_CRITICAL() \ + do{ \ + __asm \ + pop af \ + ; di ; unneeded \ + jp PO,ASMPC+4 \ + ei \ + __endasm; \ + }while(0) + +#define portDISABLE_INTERRUPTS() \ + do{ \ + __asm \ + di \ + __endasm; \ + }while(0) + +#define portENABLE_INTERRUPTS() \ + do{ \ + __asm \ + ei \ + __endasm; \ + }while(0) + +#define portNOP() \ + do{ \ + __asm \ + nop \ + __endasm; \ + }while(0) + +/* + * Macros to save all the registers, and save the stack pointer into the TCB. + */ + +#define portSAVE_CONTEXT() \ + do{ \ + __asm \ + push af \ + ld a,i \ + di \ + push af ; iff1:iff2 \ + push bc \ + push de \ + push hl \ + exx \ + ex af,af \ + push af \ + push bc \ + push de \ + push hl \ + push ix \ + push iy \ + ld hl,0 \ + add hl,sp \ + ld de,(_pxCurrentTCB) \ + ex de,hl \ + ld (hl),e \ + inc hl \ + ld (hl),d \ + __endasm; \ + }while(0) + +#define portRESTORE_CONTEXT() \ + do{ \ + __asm \ + ld hl,(_pxCurrentTCB) \ + ld e,(hl) \ + inc hl \ + ld d,(hl) \ + ex de,hl \ + ld sp,hl \ + pop iy \ + pop ix \ + pop hl \ + pop de \ + pop bc \ + pop af \ + ex af,af \ + exx \ + pop hl \ + pop de \ + pop bc \ + pop af ; iff1:iff2 \ + ; di ; unneeded \ + jp PO,ASMPC+4 \ + ei \ + pop af \ + ret \ + __endasm; \ + }while(0) + +#define portSAVE_CONTEXT_IN_ISR() \ + do{ \ + __asm \ + PHASE configISR_ORG \ + _timer_isr_start: \ + push af \ + ld a,0x7F \ + inc a ; set PE \ + push af ; iff1:iff2 \ + push bc \ + push de \ + push hl \ + exx \ + ex af,af \ + push af \ + push bc \ + push de \ + push hl \ + push ix \ + push iy \ + ld hl,0 \ + add hl,sp \ + ld de,(_pxCurrentTCB) \ + ex de,hl \ + ld (hl),e \ + inc hl \ + ld (hl),d \ + __endasm; \ + }while(0) + +#define portRESTORE_CONTEXT_IN_ISR()\ + do{ \ + __asm \ + ld hl,(_pxCurrentTCB) \ + ld e,(hl) \ + inc hl \ + ld d,(hl) \ + ex de,hl \ + ld sp,hl \ + pop iy \ + pop ix \ + pop hl \ + pop de \ + pop bc \ + pop af \ + ex af,af \ + exx \ + pop hl \ + pop de \ + pop bc \ + pop af ; iff1:iff2 \ + ; di ; unneeded \ + jp PO,ASMPC+4 \ + ei \ + pop af \ + reti \ + _timer_isr_end: \ + DEPHASE \ + __endasm; \ + }while(0) + +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 1 +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +extern void vPortYield( void ); +#define portYIELD() vPortYield() + +extern void vPortYieldFromISR( void ); +#define portYIELD_FROM_ISR() vPortYieldFromISR() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md new file mode 100644 index 0000000..89af17a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md @@ -0,0 +1,13 @@ +

    z180 support

    + +Description +----------- +This PR establishes support for a Zilog z180 port, using the Programmable Reload Timer 1, configured at 256 Hz. + +Because of the generality of the z180, the address of the Interrupt Vector for PRT1 is configurable, and must be configured by the `crt0.asm` outside of this port. A configuration assumption has been made. + +The two compilers ([used by the z88dk](https://github.com/z88dk/z88dk)) are supported. The sccz80 compiler and the sdcc compiler. The PR is located under Z88dk. + +Background +----------- +This PR is based on running code for the [SC130](https://smallcomputercentral.wordpress.com/sc130-z180-motherboard/)/[SC131](https://smallcomputercentral.wordpress.com/sc131-z180-pocket-computer/) and [YAZ180](https://github.com/feilipu/yaz180) platforms, and is maintained by the z88dk team in this [z88dk-libraries](https://github.com/feilipu/z88dk-libraries/tree/master/freertos) repository. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c new file mode 100644 index 0000000..8ffe40b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c @@ -0,0 +1,52 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * \file + * \brief exception processing for freertos + */ + +/* #include "embARC.h" */ + +#include "arc_freertos_exceptions.h" + +#ifdef __GNU__ + extern void gnu_printf_setup( void ); +#endif + +/** + * \brief freertos related cpu exception initialization, all the interrupts handled by freertos must be not + * fast irqs. If fiq is needed, please install the default firq_exc_entry or your own fast irq entry into + * the specific interrupt exception. + */ +void freertos_exc_init( void ) +{ + #ifdef __GNU__ + gnu_printf_setup(); + #endif +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h new file mode 100644 index 0000000..b4335db --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h @@ -0,0 +1,46 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef ARC_FREERTOS_EXCEPTIONS_H +#define ARC_FREERTOS_EXCEPTIONS_H + +/* + * here, all arc cpu exceptions share the same entry, also for all interrupt + * exceptions + */ +extern void exc_entry_cpu( void ); /* cpu exception entry for freertos */ +extern void exc_entry_int( void ); /* int exception entry for freertos */ + +/* task dispatch functions in .s */ +extern void start_r( void ); +extern void start_dispatch(); +extern void dispatch(); + +extern void freertos_exc_init( void ); + +#endif /* ARC_FREERTOS_EXCEPTIONS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s new file mode 100644 index 0000000..bb47c8e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s @@ -0,0 +1,522 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * \file + * \ingroup OS_FREERTOS + * \brief freertos support for arc processor + * like task dispatcher, interrupt handler + */ +/** @cond OS_FREERTOS_ASM_ARC_SUPPORT */ + +/* + * core-dependent part in assemble language (for arc) + */ +#define __ASSEMBLY__ +#include "arc/arc.h" +#include "arc/arc_asm_common.h" + +/* + * task dispatcher + * + */ + .text + .align 4 + .global dispatch +dispatch: +/* + * the pre-conditions of this routine are task context, CPU is + * locked, dispatch is enabled. + */ + SAVE_NONSCRATCH_REGS /* save callee save registers */ + mov r1, dispatch_r + PUSH r1 /* save return address */ + ld r0, [pxCurrentTCB] + bl dispatcher + +/* return routine when task dispatch happened in task context */ +dispatch_r: + RESTORE_NONSCRATCH_REGS /* recover registers */ + j [blink] + +/* + * start dispatch + */ + .global start_dispatch + .align 4 +start_dispatch: +/* + * this routine is called in the non-task context during the startup of the kernel + * , and all the interrupts are locked. + * + * when the dispatcher is called, the cpu is locked, no nest exception (CPU exception/interrupt). + * In target_initialize, all interrupt priority mask should be cleared, cpu should be + * locked, the interrupts outside the kernel such as fiq can be + * enabled. + */ + clri + mov r0, 0 + st r0, [exc_nest_count] + b dispatcher_0 +/* + * dispatcher + */ +dispatcher: + ld r1, [ulCriticalNesting] + PUSH r1 /* save critical nesting */ + st sp, [r0] /* save stack pointer of current task, r0->pxCurrentTCB */ + jl vTaskSwitchContext /* change the value of pxCurrentTCB */ +/* + * before dispatcher is called, task context | cpu locked | dispatch enabled + * should be satisfied. In this routine, the processor will jump + * into the entry of next to run task + * + * i.e. kernel mode, IRQ disabled, dispatch enabled + */ +dispatcher_0: + ld r1, [pxCurrentTCB] + ld sp, [r1] /* recover task stack */ +#if ARC_FEATURE_STACK_CHECK +#if ARC_FEATURE_SEC_PRESENT + lr r0, [AUX_SEC_STAT] + bclr r0, r0, AUX_SEC_STAT_BIT_SSC + sflag r0 +#else + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_SC + kflag r0 +#endif + jl vPortSetStackCheck +#if ARC_FEATURE_SEC_PRESENT + lr r0, [AUX_SEC_STAT] + bset r0, r0, AUX_SEC_STAT_BIT_SSC + sflag r0 +#else + lr r0, [AUX_STATUS32] + bset r0, r0, AUX_STATUS_BIT_SC + kflag r0 +#endif +#endif + POP r0 /* get critical nesting */ + st r0, [ulCriticalNesting] + POP r0 /* get return address */ + j [r0] + +/* + * task startup routine + * + */ + .text + .global start_r + .align 4 +start_r: + seti /* unlock cpu */ + mov blink, vPortEndTask /* set return address */ + POP r1 /* get task function body */ + POP r0 /* get task parameters */ + j [r1] + +/****** exceptions and interrupts handing ******/ +/****** entry for exception handling ******/ + .global exc_entry_cpu + .align 4 +exc_entry_cpu: + + EXCEPTION_PROLOGUE + + mov blink, sp + mov r3, sp /* as exception handler's para(p_excinfo) */ + + ld r0, [exc_nest_count] + add r1, r0, 1 + st r1, [exc_nest_count] + brne r0, 0, exc_handler_1 +/* change to exception stack if interrupt happened in task context */ + mov sp, _e_stack +exc_handler_1: + PUSH blink + + lr r0, [AUX_ECR] + lsr r0, r0, 16 + mov r1, exc_int_handler_table + ld.as r2, [r1, r0] + + mov r0, r3 + jl [r2] /* !!!!jump to exception handler where interrupts are not allowed! */ + +/* interrupts are not allowed */ +ret_exc: + POP sp + mov r1, exc_nest_count + ld r0, [r1] + sub r0, r0, 1 + st r0, [r1] + brne r0, 0, ret_exc_1 /* nest exception case */ + lr r1, [AUX_IRQ_ACT] /* nest interrupt case */ + brne r1, 0, ret_exc_1 + + ld r0, [context_switch_reqflg] + brne r0, 0, ret_exc_2 +ret_exc_1: /* return from non-task context, interrupts or exceptions are nested */ + + EXCEPTION_EPILOGUE + rtie + +/* there is a dispatch request */ +ret_exc_2: + /* clear dispatch request */ + mov r0, 0 + st r0, [context_switch_reqflg] + + ld r0, [pxCurrentTCB] + breq r0, 0, ret_exc_1 + + SAVE_CALLEE_REGS /* save callee save registers */ + + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_AE /* clear exception bit */ + kflag r0 + + mov r1, ret_exc_r /* save return address */ + PUSH r1 + + bl dispatcher /* r0->pxCurrentTCB */ + +ret_exc_r: + /* recover exception status */ + lr r0, [AUX_STATUS32] + bset r0, r0, AUX_STATUS_BIT_AE + kflag r0 + + RESTORE_CALLEE_REGS /* recover registers */ + EXCEPTION_EPILOGUE + rtie + +/****** entry for normal interrupt exception handling ******/ + .global exc_entry_int /* entry for interrupt handling */ + .align 4 +exc_entry_int: +#if ARC_FEATURE_FIRQ == 1 +#if ARC_FEATURE_RGF_NUM_BANKS > 1 + lr r0, [AUX_IRQ_ACT] /* check whether it is P0 interrupt */ + btst r0, 0 + jnz exc_entry_firq +#else + PUSH r10 + lr r10, [AUX_IRQ_ACT] + btst r10, 0 + POP r10 + jnz exc_entry_firq +#endif +#endif + INTERRUPT_PROLOGUE + + mov blink, sp + + clri /* disable interrupt */ + ld r3, [exc_nest_count] + add r2, r3, 1 + st r2, [exc_nest_count] + seti /* enable higher priority interrupt */ + + brne r3, 0, irq_handler_1 +/* change to exception stack if interrupt happened in task context */ + mov sp, _e_stack +#if ARC_FEATURE_STACK_CHECK +#if ARC_FEATURE_SEC_PRESENT + lr r0, [AUX_SEC_STAT] + bclr r0, r0, AUX_SEC_STAT_BIT_SSC + sflag r0 +#else + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_SC + kflag r0 +#endif +#endif +irq_handler_1: + PUSH blink + + lr r0, [AUX_IRQ_CAUSE] + mov r1, exc_int_handler_table + ld.as r2, [r1, r0] /* r2 = exc_int_handler_table + irqno *4 */ +/* handle software triggered interrupt */ + lr r3, [AUX_IRQ_HINT] + cmp r3, r0 + bne.d irq_hint_handled + xor r3, r3, r3 + sr r3, [AUX_IRQ_HINT] +irq_hint_handled: + + jl [r2] /* jump to interrupt handler */ +/* no interrupts are allowed from here */ +ret_int: + clri /* disable interrupt */ + + POP sp + mov r1, exc_nest_count + ld r0, [r1] + sub r0, r0, 1 + st r0, [r1] +/* if there are multi-bits set in IRQ_ACT, it's still in nest interrupt */ + lr r0, [AUX_IRQ_CAUSE] + sr r0, [AUX_IRQ_SELECT] + lr r3, [AUX_IRQ_PRIORITY] + lr r1, [AUX_IRQ_ACT] + bclr r2, r1, r3 + brne r2, 0, ret_int_1 + + ld r0, [context_switch_reqflg] + brne r0, 0, ret_int_2 +ret_int_1: /* return from non-task context */ + INTERRUPT_EPILOGUE + rtie +/* there is a dispatch request */ +ret_int_2: + /* clear dispatch request */ + mov r0, 0 + st r0, [context_switch_reqflg] + + ld r0, [pxCurrentTCB] + breq r0, 0, ret_int_1 + +/* r1 has old AUX_IRQ_ACT */ + PUSH r1 +/* clear related bits in IRQ_ACT manually to simulate a irq return */ + sr r2, [AUX_IRQ_ACT] + + SAVE_CALLEE_REGS /* save callee save registers */ + mov r1, ret_int_r /* save return address */ + PUSH r1 + + bl dispatcher /* r0->pxCurrentTCB */ + +ret_int_r: + RESTORE_CALLEE_REGS /* recover registers */ + POPAX AUX_IRQ_ACT + INTERRUPT_EPILOGUE + rtie + +#if ARC_FEATURE_FIRQ == 1 + .global exc_entry_firq + .align 4 +exc_entry_firq: +#if ARC_FEATURE_STACK_CHECK && ARC_FEATURE_RGF_NUM_BANKS > 1 +#if ARC_FEATURE_SEC_PRESENT + lr r0, [AUX_SEC_STAT] + bclr r0, r0, AUX_SEC_STAT_BIT_SSC + sflag r0 +#else + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_SC + kflag r0 +#endif +#endif + SAVE_FIQ_EXC_REGS + + mov blink, sp + + ld r3, [exc_nest_count] + add r2, r3, 1 + st r2, [exc_nest_count] + + brne r3, 0, firq_handler_1 +#if ARC_FEATURE_STACK_CHECK && ARC_FEATURE_RGF_NUM_BANKS == 1 +#if ARC_FEATURE_SEC_PRESENT + lr r0, [AUX_SEC_STAT] + bclr r0, r0, AUX_SEC_STAT_BIT_SSC + sflag r0 +#else + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_SC + kflag r0 +#endif +#endif +/* change to exception stack if interrupt happened in task context */ + mov sp, _e_stack +firq_handler_1: + PUSH blink + + lr r0, [AUX_IRQ_CAUSE] + mov r1, exc_int_handler_table + ld.as r2, [r1, r0] /* r2 = exc_int_handler_table + irqno *4 */ +/* handle software triggered interrupt */ + lr r3, [AUX_IRQ_HINT] + brne r3, r0, firq_hint_handled + xor r3, r3, r3 + sr r3, [AUX_IRQ_HINT] +firq_hint_handled: + + jl [r2] /* jump to interrupt handler */ +/* no interrupts are allowed from here */ +ret_firq: + clri + POP sp + + mov r1, exc_nest_count + ld r0, [r1] + sub r0, r0, 1 + st r0, [r1] +/* if there are multi-bits set in IRQ_ACT, it's still in nest interrupt */ + lr r1, [AUX_IRQ_ACT] + bclr r1, r1, 0 + brne r1, 0, ret_firq_1 + + ld r0, [context_switch_reqflg] + brne r0, 0, ret_firq_2 +ret_firq_1: /* return from non-task context */ + RESTORE_FIQ_EXC_REGS + rtie +/* there is a dispatch request */ +ret_firq_2: + /* clear dispatch request */ + mov r0, 0 + st r0, [context_switch_reqflg] + + ld r0, [pxCurrentTCB] + breq r0, 0, ret_firq_1 + +/* reconstruct the interruptted context + * When ARC_FEATURE_RGF_BANKED_REGS >= 16 (16, 32), sp is banked + * so need to restore the fast irq stack. + */ +#if ARC_FEATURE_RGF_BANKED_REGS >= 16 + RESTORE_LP_REGS +#if ARC_FEATURE_CODE_DENSITY + RESTORE_CODE_DENSITY +#endif + RESTORE_R58_R59 +#endif + +/* when BANKED_REGS == 16, r4-r9 wiil be also saved in fast irq stack + * so pop them out + */ +#if ARC_FEATURE_RGF_BANKED_REGS == 16 && !defined(ARC_FEATURE_RF16) + POP r9 + POP r8 + POP r7 + POP r6 + POP r5 + POP r4 +#endif + +/* for other cases, unbanked regs are already in interrupted context's stack, + * so just need to save and pop the banked regs + */ + +/* save the interruptted context */ +#if ARC_FEATURE_RGF_BANKED_REGS > 0 +/* switch back to bank0 */ + lr r0, [AUX_STATUS32] + bic r0, r0, 0x70000 + kflag r0 +#endif + +#if ARC_FEATURE_RGF_BANKED_REGS == 4 +/* r4 - r12, gp, fp, r30, blink already saved */ + PUSH r0 + PUSH r1 + PUSH r2 + PUSH r3 +#elif ARC_FEATURE_RGF_BANKED_REGS == 8 +/* r4 - r9, r0, r11 gp, fp, r30, blink already saved */ + PUSH r0 + PUSH r1 + PUSH r2 + PUSH r3 + PUSH r12 +#elif ARC_FEATURE_RGF_BANKED_REGS >= 16 +/* nothing is saved, */ + SAVE_R0_TO_R12 + + SAVE_R58_R59 + PUSH gp + PUSH fp + PUSH r30 /* general purpose */ + PUSH blink + +#if ARC_FEATURE_CODE_DENSITY + SAVE_CODE_DENSITY +#endif + SAVE_LP_REGS +#endif + PUSH ilink + lr r0, [AUX_STATUS32_P0] + PUSH r0 + lr r0, [AUX_IRQ_ACT] + PUSH r0 + bclr r0, r0, 0 + sr r0, [AUX_IRQ_ACT] + + SAVE_CALLEE_REGS /* save callee save registers */ + + mov r1, ret_firq_r /* save return address */ + PUSH r1 + ld r0, [pxCurrentTCB] + bl dispatcher /* r0->pxCurrentTCB */ + +ret_firq_r: + RESTORE_CALLEE_REGS /* recover registers */ + POPAX AUX_IRQ_ACT + POPAX AUX_STATUS32_P0 + POP ilink + +#if ARC_FEATURE_RGF_NUM_BANKS > 1 +#if ARC_FEATURE_RGF_BANKED_REGS == 4 +/* r4 - r12, gp, fp, r30, blink already saved */ + POP r3 + POP r2 + POP r1 + POP r0 + RESTORE_FIQ_EXC_REGS +#elif ARC_FEATURE_RGF_BANKED_REGS == 8 +/* r4 - r9, gp, fp, r30, blink already saved */ + POP r12 + POP r3 + POP r2 + POP r1 + POP r0 + RESTORE_FIQ_EXC_REGS +#elif ARC_FEATURE_RGF_BANKED_REGS >= 16 + RESTORE_LP_REGS +#if ARC_FEATURE_CODE_DENSITY + RESTORE_CODE_DENSITY +#endif + POP blink + POP r30 + POP fp + POP gp + + RESTORE_R58_R59 + RESTORE_R0_TO_R12 +#endif /* ARC_FEATURE_RGF_BANKED_REGS */ +#else + RESTORE_FIQ_EXC_REGS +#endif /* ARC_FEATURE_RGF_NUM_BANKS */ + rtie +#endif +/** @endcond */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c new file mode 100644 index 0000000..b7d7442 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c @@ -0,0 +1,240 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#if defined( __MW__ ) + + #include + #include + #include + + #include "FreeRTOS.h" + + #include "queue.h" + #include "semphr.h" + #include "task.h" + + #include "arc/arc_exception.h" + #include "embARC_toolchain.h" + #include "embARC_debug.h" + + #ifdef ENABLE_FREERTOS_TLS_DEBUG + #define TLS_DEBUG( fmt, ... ) EMBARC_PRINTF( fmt, ## __VA_ARGS__ ) + #else + #define TLS_DEBUG( fmt, ... ) + #endif + +/* + * Runtime routines to execute constructors and + * destructors for task local storage. + */ + extern void __mw_run_tls_dtor(); + extern void __mw_run_tls_ctor(); + + extern uint32_t exc_nest_count; + +/* + * Linker generated symbols to mark .tls section addresses + * first byte .. last byte + */ + extern char _ftls[], _etls[]; + #pragma weak _ftls + #pragma weak _etls + + void executable_requires_tls_section( void ) + { + #if _ARC + for( ; ; ) + { + _flag( 1 ); + _nop(); + _nop(); + _nop(); + _nop(); + _nop(); + } + #endif + } + #pragma off_inline(executable_requires_tls_section); + #pragma alias(executable_requires_tls_section, "executable_requires_.tls_section"); + + static void * init_task_tls( void ) + { + uint32_t len = ( uint32_t ) ( _etls - _ftls ); + void * tls = NULL; + + #if FREERTOS_HEAP_SEL == 3 + #warning "FreeRTOS TLS support is not compatible with heap 3 solution(FREERTOS_HEAP_SEL=3)!" + #warning "You can change FREERTOS_HEAP_SEL in freertos.mk to select other heap solution." + #else + tls = pvPortMalloc( len ); + #endif + + if( tls ) + { + TLS_DEBUG( "Malloc task tls:%dbytes\r\n", len ); + memcpy( tls, _ftls, len ); + __mw_run_tls_ctor(); /* Run constructors */ + } + + return tls; + } + + static void free_task_tls( void * pxTCB ) + { + TaskHandle_t task2free = ( TaskHandle_t ) pxTCB; + + if( task2free != NULL ) + { + void * tls = pvTaskGetThreadLocalStoragePointer( task2free, 0 ); + + if( tls ) + { + TLS_DEBUG( "Free task tls\r\n" ); + __mw_run_tls_dtor(); + vPortFree( tls ); + vTaskSetThreadLocalStoragePointer( task2free, 0, NULL ); + } + } + } + + void task_end_hook( void * pxTCB ) + { + free_task_tls( pxTCB ); + } + + static void * get_isr_tls( void ) + { + /* In an ISR */ + static int first = 1; + + if( _Rarely( first ) ) + { + first = 0; + __mw_run_tls_ctor(); /* Run constructors */ + } + + return ( void * ) _ftls; + } + #pragma off_inline(get_isr_tls) + + static void * get_task_tls( void ) + { + TaskHandle_t cur_task; + + cur_task = xTaskGetCurrentTaskHandle(); + + if( cur_task == NULL ) + { + return get_isr_tls(); + } + + void * tls = pvTaskGetThreadLocalStoragePointer( cur_task, 0 ); + + if( tls == NULL ) + { + tls = init_task_tls(); + + if( tls ) + { + vTaskSetThreadLocalStoragePointer( cur_task, 0, tls ); + } + else + { + tls = get_isr_tls(); + } + } + + return tls; + } + #pragma off_inline(get_task_tls) + + #if _ARC /* for ARC XCALLs need to preserve flags */ + extern void * _Preserve_flags _mwget_tls( void ); + #endif + +/* + * Back end gens calls to find local data for this task + */ + void * _mwget_tls( void ) + { + if( _ftls == ( char * ) 0 ) + { + executable_requires_tls_section(); + } + + if( exc_nest_count > 0 ) /* In ISR */ + { + return get_isr_tls(); + } + else /* In Task */ + { + return get_task_tls(); + } + } + + +/* simple interface of thread safe */ + typedef xSemaphoreHandle _lock_t; + #if configUSE_RECURSIVE_MUTEXES != 1 + #error "configUSE_RECURSIVE_MUTEXES in FreeRTOSConfig.h need to 1" + #endif + + void _mwmutex_create( _lock_t * mutex_ptr ) + { + *mutex_ptr = xSemaphoreCreateRecursiveMutex(); + } + + void _mwmutex_delete( _lock_t * mutex_ptr ) + { + if( ( *mutex_ptr ) != NULL ) + { + vSemaphoreDelete( *mutex_ptr ); + } + } + + void _mwmutex_lock( _lock_t mutex ) + { + if( ( mutex ) != NULL ) + { + while( xSemaphoreTakeRecursive( mutex, portMAX_DELAY ) != pdTRUE ) + { + } + } + } + + void _mwmutex_unlock( _lock_t mutex ) + { + if( ( mutex ) != NULL ) + { + xSemaphoreGiveRecursive( mutex ); + } + } + +#else /* if defined( __MW__ ) */ + +#endif /* __MW__ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/port.c new file mode 100644 index 0000000..a68fd47 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/port.c @@ -0,0 +1,301 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Implementation of functions defined in portable.h + */ + +#include "FreeRTOS.h" +#include "task.h" +#include "FreeRTOSConfig.h" + +#include "arc/arc_exception.h" +#include "arc/arc_timer.h" +#include "board.h" + +#include "arc_freertos_exceptions.h" + +volatile unsigned int ulCriticalNesting = 999UL; +volatile unsigned int context_switch_reqflg; /* task context switch request flag in exceptions and interrupts handling */ + +/** + * \var exc_nest_count + * \brief the counter for exc/int processing, =0 no int/exc + * >1 in int/exc processing + * @} + */ +uint32_t exc_nest_count; +/* --------------------------------------------------------------------------*/ + +/** + * @brief kernel tick interrupt handler of freertos + */ +/* ----------------------------------------------------------------------------*/ +static void vKernelTick( void * ptr ) +{ + /* clear timer interrupt */ + arc_timer_int_clear( BOARD_OS_TIMER_ID ); + board_timer_update( configTICK_RATE_HZ ); + + if( xTaskIncrementTick() ) + { + portYIELD_FROM_ISR(); /* need to make task switch */ + } +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief setup freertos kernel tick + */ +/* ----------------------------------------------------------------------------*/ +static void prvSetupTimerInterrupt( void ) +{ + unsigned int cyc = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + int_disable( BOARD_OS_TIMER_INTNO ); /* disable os timer interrupt */ + arc_timer_stop( BOARD_OS_TIMER_ID ); + arc_timer_start( BOARD_OS_TIMER_ID, TIMER_CTRL_IE | TIMER_CTRL_NH, cyc ); + + int_handler_install( BOARD_OS_TIMER_INTNO, ( INT_HANDLER_T ) vKernelTick ); + int_pri_set( BOARD_OS_TIMER_INTNO, INT_PRI_MIN ); + int_enable( BOARD_OS_TIMER_INTNO ); +} + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + * For ARC, task context switch is implemented with the help of SWI exception + * It's not efficient but simple. + * + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* To ensure asserts in tasks.c don't fail, although in this case the assert + * is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + * expected by the portRESTORE_CONTEXT() macro. */ + + /* When the task starts is will expect to find the function parameter in + * R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* function body */ + + /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) start_r; /* dispatch return address */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_NESTING; + return pxTopOfStack; +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief start the freertos scheduler, go to the first task + * + * @returns + */ +/* ----------------------------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. */ + prvSetupTimerInterrupt(); + start_dispatch(); + + /* Should not get here! */ + return 0; +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief + */ +/* ----------------------------------------------------------------------------*/ +void vPortEndScheduler( void ) +{ +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief generate a task switch request in ISR + */ +/* ----------------------------------------------------------------------------*/ +void vPortYieldFromIsr( void ) +{ + unsigned int status32; + + status32 = cpu_lock_save(); + context_switch_reqflg = true; + cpu_unlock_restore( status32 ); +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief + */ +/* ----------------------------------------------------------------------------*/ +void vPortYield( void ) +{ + unsigned int status32; + + status32 = cpu_lock_save(); + dispatch(); + cpu_unlock_restore( status32 ); +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief + */ +/* ----------------------------------------------------------------------------*/ +void vPortEndTask( void ) +{ + #if ( INCLUDE_vTaskDelete == 1 ) + vTaskDelete( NULL ); /* Delete task itself */ + #endif + + while( 1 ) /* Yield to other task */ + { + vPortYield(); + } +} + +#if ARC_FEATURE_STACK_CHECK + +/* + * !!! Note !!! + * This a trick!!! + * It's a copy from task.c. We need to konw the definition of TCB for the purpose of hardware + * stack check. Pls don't forget to update it when FreeRTOS is updated. + */ + typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */ + { + volatile StackType_t * pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif + + ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + StackType_t * pxStack; /*< Points to the start of the stack. */ + char pcTaskName[ configMAX_TASK_NAME_LEN ]; /*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + StackType_t * pxEndOfStack; /*< Points to the highest valid address for the stack. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + #endif + + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t pxTaskTag; + #endif + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + + /* Allocate a Newlib reent structure that is specific to this task. + * Note Newlib support has been included by popular demand, but is not + * used by the FreeRTOS maintainers themselves. FreeRTOS is not + * responsible for resulting newlib operation. User must be familiar with + * newlib and must provide system-wide implementations of the necessary + * stubs. Be warned that (at the time of writing) the current newlib design + * implements a system-wide malloc() that must be provided with locks. */ + struct _reent xNewLib_reent; + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue; + volatile uint8_t ucNotifyState; + #endif + + /* See the comments above the definition of + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDelayAborted; + #endif + + #if ( configUSE_POSIX_ERRNO == 1 ) + int iTaskErrno; + #endif + } tskTCB; + + + void vPortSetStackCheck( TaskHandle_t old, + TaskHandle_t new ) + { + if( new != NULL ) + { + #if ARC_FEATURE_SEC_PRESENT + arc_aux_write( AUX_S_KSTACK_BASE, ( uint32_t ) ( new->pxEndOfStack ) ); + arc_aux_write( AUX_S_KSTACK_TOP, ( uint32_t ) ( new->pxStack ) ); + #else + arc_aux_write( AUX_KSTACK_BASE, ( uint32_t ) ( new->pxEndOfStack ) ); + arc_aux_write( AUX_KSTACK_TOP, ( uint32_t ) ( new->pxStack ) ); + #endif + } + } +#endif /* if ARC_FEATURE_STACK_CHECK */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h new file mode 100644 index 0000000..996dc8f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h @@ -0,0 +1,158 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +/* record stack high address for stack check */ +#ifndef configRECORD_STACK_HIGH_ADDRESS + #define configRECORD_STACK_HIGH_ADDRESS 1 +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned int +#define portBASE_TYPE portLONG + +#ifndef Asm + #define Asm __asm__ volatile +#endif + +/* + * normal constants + */ +#ifndef NULL + #define NULL 0 /* invalid pointer */ +#endif /* NULL */ + +#ifndef true + #define true 1 /* true */ +#endif /* true */ + +#ifndef false + #define false 0 /* false */ +#endif /* false */ + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef unsigned int TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif + +#define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +#define portNOP() Asm( "nop_s" ); +#define IPM_ENABLE_ALL 1 + +#define portYIELD_FROM_ISR() vPortYieldFromIsr() +#define portYIELD() vPortYield() + +/* Critical section management. */ +#define portDISABLE_INTERRUPTS() \ + { \ + Asm( "clri" ); \ + Asm( "" ::: "memory" ); \ + } \ + +#define portENABLE_INTERRUPTS() \ + { \ + Asm( "" ::: "memory" ); \ + Asm( "seti" ); \ + } \ + +extern volatile unsigned int ulCriticalNesting; + +#define portENTER_CRITICAL() \ + { \ + portDISABLE_INTERRUPTS() \ + ulCriticalNesting++; \ + } + + +#define portEXIT_CRITICAL() \ + { \ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) \ + { \ + ulCriticalNesting--; \ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) \ + { \ + portENABLE_INTERRUPTS() \ + } \ + } \ + } + + +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() do {} while( 0 ) /* we use the timer */ +#define portALT_GET_RUN_TIME_COUNTER_VALUE( dest ) ( dest = xTickCount ) + +#if defined( __MW__ ) + extern void task_end_hook( void * pxTCB ); + #define portCLEAN_UP_TCB( pxTCB ) task_end_hook( ( void * ) pxTCB ) +#endif + +void vPortYield( void ); +void vPortYieldFromIsr( void ); + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c new file mode 100644 index 0000000..8ffe40b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c @@ -0,0 +1,52 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * \file + * \brief exception processing for freertos + */ + +/* #include "embARC.h" */ + +#include "arc_freertos_exceptions.h" + +#ifdef __GNU__ + extern void gnu_printf_setup( void ); +#endif + +/** + * \brief freertos related cpu exception initialization, all the interrupts handled by freertos must be not + * fast irqs. If fiq is needed, please install the default firq_exc_entry or your own fast irq entry into + * the specific interrupt exception. + */ +void freertos_exc_init( void ) +{ + #ifdef __GNU__ + gnu_printf_setup(); + #endif +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h new file mode 100644 index 0000000..b4335db --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h @@ -0,0 +1,46 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef ARC_FREERTOS_EXCEPTIONS_H +#define ARC_FREERTOS_EXCEPTIONS_H + +/* + * here, all arc cpu exceptions share the same entry, also for all interrupt + * exceptions + */ +extern void exc_entry_cpu( void ); /* cpu exception entry for freertos */ +extern void exc_entry_int( void ); /* int exception entry for freertos */ + +/* task dispatch functions in .s */ +extern void start_r( void ); +extern void start_dispatch(); +extern void dispatch(); + +extern void freertos_exc_init( void ); + +#endif /* ARC_FREERTOS_EXCEPTIONS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_support.s b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_support.s new file mode 100644 index 0000000..0c1b0d0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_support.s @@ -0,0 +1,322 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * \file + * \ingroup OS_FREERTOS + * \brief freertos support for arc processor + * like task dispatcher, interrupt handler + */ +/** @cond OS_FREERTOS_ASM_ARC_SUPPORT */ + +/* + * core-dependent part in assemble language (for arc) + */ +#define __ASSEMBLY__ +#include "arc/arc.h" +#include "arc/arc_asm_common.h" + +/* + * task dispatcher + * + */ + .text + .align 4 + .global dispatch +dispatch: +/* + * the pre-conditions of this routine are task context, CPU is + * locked, dispatch is enabled. + */ + SAVE_NONSCRATCH_REGS /* save callee save registers */ + mov r1, dispatch_r + PUSH r1 /* save return address */ + ld r0, [pxCurrentTCB] + bl dispatcher + +/* return routine when task dispatch happened in task context */ +dispatch_r: + RESTORE_NONSCRATCH_REGS /* recover registers */ + j [blink] + +/* + * start dispatch + */ + .global start_dispatch + .align 4 +start_dispatch: +/* + * this routine is called in the non-task context during the startup of the kernel + * , and all the interrupts are locked. + * + * when the dispatcher is called, the cpu is locked, no nest exception (CPU exception/interrupt). + * In target_initialize, all interrupt priority mask should be cleared, cpu should be + * locked, the interrupts outside the kernel such as fiq can be + * enabled. + */ + clri + mov r0, 0 + st r0, [exc_nest_count] + b dispatcher_0 +/* + * dispatcher + */ +dispatcher: + ld r1, [ulCriticalNesting] + PUSH r1 /* save critical nesting */ + st sp, [r0] /* save stack pointer of current task, r0->pxCurrentTCB */ + jl vTaskSwitchContext /* change the value of pxCurrentTCB */ +/* + * before dispatcher is called, task context | cpu locked | dispatch enabled + * should be satisfied. In this routine, the processor will jump + * into the entry of next to run task + * + * i.e. kernel mode, IRQ disabled, dispatch enabled + */ +dispatcher_0: + ld r1, [pxCurrentTCB] + ld sp, [r1] /* recover task stack */ +#if ARC_FEATURE_STACK_CHECK + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_SC + flag r0 + jl vPortSetStackCheck + lr r0, [AUX_STATUS32] + bset r0, r0, AUX_STATUS_BIT_SC + flag r0 +#endif + POP r0 /* get critical nesting */ + st r0, [ulCriticalNesting] + POP r0 /* get return address */ + j [r0] + +/* + * task startup routine + * + */ + .text + .global start_r + .align 4 +start_r: + seti /* unlock cpu */ + mov blink, vPortEndTask /* set return address */ + POP r1 /* get task function body */ + POP r0 /* get task parameters */ + j [r1] + +/****** exceptions and interrupts handing ******/ +/****** entry for exception handling ******/ + .global exc_entry_cpu + .align 4 +exc_entry_cpu: + + EXCEPTION_PROLOGUE + + + mov blink, sp + mov r3, sp /* as exception handler's para(p_excinfo) */ + + ld r1, [exc_nest_count] + add r1, r1, 1 + st r1, [exc_nest_count] + brne r1, 0, exc_handler_1 +/* change to exception stack if interrupt happened in task context */ + mov sp, _e_stack +exc_handler_1: + PUSH blink + +/* find the exception cause */ +#if ARC_FEATURE_CORE_700 + lr r0, [AUX_ECR] + lsr r0, r0, 16 + bmsk r0, r0, 7 +#endif + mov r1, exc_int_handler_table + ld.as r2, [r1, r0] + + mov r0, r3 + jl [r2] /* !!!!jump to exception handler where interrupts are not allowed! */ + +/* interrupts are not allowed */ +ret_exc: + POP sp + mov r1, exc_nest_count + ld r0, [r1] + sub r0, r0, 1 + st r0, [r1] + brne r0, 0, ret_exc_1 /* nested exception case */ + lr r1, [AUX_IRQ_LV12] + brne r1, 0, ret_exc_1 /* nested or pending interrupt case */ + + ld r0, [context_switch_reqflg] + brne r0, 0, ret_exc_2 +ret_exc_1: /* return from non-task context, interrupts or exceptions are nested */ + + EXCEPTION_EPILOGUE +#if ARC_FEATURE_CORE_600 + rtie ilink2 +#else + rtie +#endif + +/* there is a dispatch request */ +ret_exc_2: + /* clear dispatch request */ + mov r0, 0 + st r0, [context_switch_reqflg] + + ld r0, [pxCurrentTCB] + breq r0, 0, ret_exc_1 + + SAVE_CALLEE_REGS /* save callee save registers */ + + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_AE /* clear exception bit */ + flag r0 + + mov r1, ret_exc_r /* save return address */ + PUSH r1 + + bl dispatcher /* r0->pxCurrentTCB */ + +ret_exc_r: + /* recover exception status */ + lr r0, [AUX_STATUS32] + bset r0, r0, AUX_STATUS_BIT_AE + flag r0 + + RESTORE_CALLEE_REGS /* recover registers */ + EXCEPTION_EPILOGUE +#if ARC_FEATURE_CORE_600 + rtie ilink2 +#else + rtie +#endif + +/****** entry for normal interrupt exception handling ******/ + .global exc_entry_int /* entry for interrupt handling */ + .align 4 +exc_entry_int: + + INTERRUPT_PROLOGUE + + mov blink, sp + + /* disable interrupt */ + push r0 + lr r0, [AUX_STATUS32] + push r0 + bclr r0, r0, AUX_STATUS_BIT_E1 + bclr r0, r0, AUX_STATUS_BIT_E2 + flag r0 + ld r3, [exc_nest_count] + add r2, r3, 1 + st r2, [exc_nest_count] + /* enable interrupt */ + pop r0 + flag r0 + pop r0 + + brne r3, 0, irq_handler_1 +/* change to exception stack if interrupt happened in task context */ + mov sp, _e_stack +#if ARC_FEATURE_STACK_CHECK + lr r0, [AUX_STATUS32] + bclr r0, r0, AUX_STATUS_BIT_SC + flag r0 +#endif +irq_handler_1: + PUSH blink + +/* critical area */ +#if ARC_FEATURE_CORE_700 + lr r0, [AUX_IRQ_CAUSE1] +#endif + mov r1, exc_int_handler_table + ld.as r2, [r1, r0] /* r2 = exc_int_handler_table + irqno *4 */ +/* handle software triggered interrupt */ + lr r3, [AUX_IRQ_HINT] + cmp r3, r0 + bne.d irq_hint_handled + xor r3, r3, r3 + sr r3, [AUX_IRQ_HINT] +irq_hint_handled: + + jl [r2] /* jump to interrupt handler */ +/* no interrupts are allowed from here */ +ret_int: + clri /* disable interrupt */ + + POP sp + mov r1, exc_nest_count + ld r0, [r1] + sub r0, r0, 1 + st r0, [r1] +/* if there are multi-bits set in IRQ_LV12, it's still in nest interrupt */ + lr r1, [AUX_IRQ_LV12] + + ld r0, [context_switch_reqflg] + brne r0, 0, ret_int_2 +ret_int_1: /* return from non-task context */ + INTERRUPT_EPILOGUE +#if ARC_FEATURE_CORE_600 +/* TODO: series 600 IRQ6 and IRQ7 uses ilink2 */ + rtie ilink1 +#else + rtie +#endif +/* there is a dispatch request */ +ret_int_2: + /* clear dispatch request */ + mov r0, 0 + st r0, [context_switch_reqflg] + + ld r0, [pxCurrentTCB] + breq r0, 0, ret_int_1 + +/* r1 has old AUX_IRQ_LV12 */ + PUSH r1 +/* clear related bits in IRQ_ACT manually to simulate a irq return */ + + SAVE_CALLEE_REGS /* save callee save registers */ + mov r1, ret_int_r /* save return address */ + PUSH r1 + + bl dispatcher /* r0->pxCurrentTCB */ + +ret_int_r: + RESTORE_CALLEE_REGS /* recover registers */ + POPAX AUX_IRQ_LV12 + INTERRUPT_EPILOGUE +#if ARC_FEATURE_CORE_600 + rtie ilink1 +#else + rtie +#endif + +/** @endcond */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/port.c new file mode 100644 index 0000000..841695f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/port.c @@ -0,0 +1,296 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Implementation of functions defined in portable.h + */ + +#include "FreeRTOS.h" +#include "task.h" +#include "FreeRTOSConfig.h" + +#include "arc/arc_exception.h" +#include "arc/arc_timer.h" +#include "board.h" + +#include "arc_freertos_exceptions.h" + +volatile unsigned int ulCriticalNesting = 999UL; +volatile unsigned int context_switch_reqflg; /* task context switch request flag in exceptions and interrupts handling */ + +/** + * \var exc_nest_count + * \brief the counter for exc/int processing, =0 no int/exc + * >1 in int/exc processing + * @} + */ +uint32_t exc_nest_count; +/* --------------------------------------------------------------------------*/ + +/** + * @brief kernel tick interrupt handler of freertos + */ +/* ----------------------------------------------------------------------------*/ +static void vKernelTick( void * ptr ) +{ + /* clear timer interrupt */ + arc_timer_int_clear( BOARD_OS_TIMER_ID ); + board_timer_update( configTICK_RATE_HZ ); + + if( xTaskIncrementTick() ) + { + portYIELD_FROM_ISR(); /* need to make task switch */ + } +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief setup freertos kernel tick + */ +/* ----------------------------------------------------------------------------*/ +static void prvSetupTimerInterrupt( void ) +{ + unsigned int cyc = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + int_disable( BOARD_OS_TIMER_INTNO ); /* disable os timer interrupt */ + arc_timer_stop( BOARD_OS_TIMER_ID ); + arc_timer_start( BOARD_OS_TIMER_ID, TIMER_CTRL_IE | TIMER_CTRL_NH, cyc ); + + int_handler_install( BOARD_OS_TIMER_INTNO, ( INT_HANDLER_T ) vKernelTick ); + int_pri_set( BOARD_OS_TIMER_INTNO, INT_PRI_MIN ); + int_enable( BOARD_OS_TIMER_INTNO ); +} + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + * For ARC, task context switch is implemented with the help of SWI exception + * It's not efficient but simple. + * + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* To ensure asserts in tasks.c don't fail, although in this case the assert + * is not really required. */ + pxTopOfStack--; + + /* Setup the initial stack of the task. The stack is set exactly as + * expected by the portRESTORE_CONTEXT() macro. */ + + /* When the task starts is will expect to find the function parameter in + * R0. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* function body */ + + /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) start_r; /* dispatch return address */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_NESTING; + return pxTopOfStack; +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief start the freertos scheduler, go to the first task + * + * @returns + */ +/* ----------------------------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ + /* Start the timer that generates the tick ISR. */ + prvSetupTimerInterrupt(); + start_dispatch(); + + /* Should not get here! */ + return 0; +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief + */ +/* ----------------------------------------------------------------------------*/ +void vPortEndScheduler( void ) +{ +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief generate a task switch request in ISR + */ +/* ----------------------------------------------------------------------------*/ +void vPortYieldFromIsr( void ) +{ + unsigned int status32; + + status32 = cpu_lock_save(); + context_switch_reqflg = true; + cpu_unlock_restore( status32 ); +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief + */ +/* ----------------------------------------------------------------------------*/ +void vPortYield( void ) +{ + unsigned int status32; + + status32 = cpu_lock_save(); + dispatch(); + cpu_unlock_restore( status32 ); +} + +/* --------------------------------------------------------------------------*/ + +/** + * @brief + */ +/* ----------------------------------------------------------------------------*/ +void vPortEndTask( void ) +{ + #if ( INCLUDE_vTaskDelete == 1 ) + vTaskDelete( NULL ); /* Delete task itself */ + #endif + + while( 1 ) /* Yield to other task */ + { + vPortYield(); + } +} + +#if ARC_FEATURE_STACK_CHECK + +/* + * !!! Note !!! + * This a trick!!! + * It's a copy from task.c. We need to konw the definition of TCB for the purpose of hardware + * stack check. Pls don't forget to update it when FreeRTOS is updated. + */ + typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */ + { + volatile StackType_t * pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif + + ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + StackType_t * pxStack; /*< Points to the start of the stack. */ + char pcTaskName[ configMAX_TASK_NAME_LEN ]; /*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + StackType_t * pxEndOfStack; /*< Points to the highest valid address for the stack. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + #endif + + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t pxTaskTag; + #endif + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + + /* Allocate a Newlib reent structure that is specific to this task. + * Note Newlib support has been included by popular demand, but is not + * used by the FreeRTOS maintainers themselves. FreeRTOS is not + * responsible for resulting newlib operation. User must be familiar with + * newlib and must provide system-wide implementations of the necessary + * stubs. Be warned that (at the time of writing) the current newlib design + * implements a system-wide malloc() that must be provided with locks. */ + struct _reent xNewLib_reent; + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue; + volatile uint8_t ucNotifyState; + #endif + + /* See the comments above the definition of + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDelayAborted; + #endif + + #if ( configUSE_POSIX_ERRNO == 1 ) + int iTaskErrno; + #endif + } tskTCB; + + + void vPortSetStackCheck( TaskHandle_t old, + TaskHandle_t new ) + { + if( new != NULL ) + { + arc_aux_write( AUX_USTACK_BASE, ( uint32_t ) ( new->pxEndOfStack ) ); + arc_aux_write( AUX_USTACK_TOP, ( uint32_t ) ( new->pxStack ) ); + } + } +#endif /* if ARC_FEATURE_STACK_CHECK */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/portmacro.h new file mode 100644 index 0000000..56bf3b8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/portmacro.h @@ -0,0 +1,148 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Synopsys, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H + #define PORTMACRO_H + #include "embARC.h" + + #ifdef __cplusplus + extern "C" { + #endif + +/* record stack high address for stack check */ + #ifndef configRECORD_STACK_HIGH_ADDRESS + #define configRECORD_STACK_HIGH_ADDRESS 1 + #endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE unsigned int + #define portBASE_TYPE portLONG + + #ifndef Asm + #define Asm __asm__ volatile + #endif + +/* + * normal constants + */ + #ifndef NULL + #define NULL 0 /* invalid pointer */ + #endif /* NULL */ + + #ifndef true + #define true 1 /* true */ + #endif /* true */ + + #ifndef false + #define false 0 /* false */ + #endif /* false */ + + typedef portSTACK_TYPE StackType_t; + typedef long BaseType_t; + typedef unsigned long UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef unsigned int TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + #endif + + #define portNO_CRITICAL_NESTING ( ( uint32_t ) 0 ) + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portNOP() Asm( "nop_s" ); + #define IPM_ENABLE_ALL 1 + + #define portYIELD_FROM_ISR() vPortYieldFromIsr() + #define portYIELD() vPortYield() + +/* Critical section management. */ + #define portDISABLE_INTERRUPTS() \ + { \ + arc_lock(); \ + } \ + + #define portENABLE_INTERRUPTS() \ + { \ + arc_unlock(); \ + } \ + + extern volatile unsigned int ulCriticalNesting; + + #define portENTER_CRITICAL() \ + { \ + portDISABLE_INTERRUPTS() \ + ulCriticalNesting++; \ + } + + + #define portEXIT_CRITICAL() \ + { \ + if( ulCriticalNesting > portNO_CRITICAL_NESTING ) \ + { \ + ulCriticalNesting--; \ + if( ulCriticalNesting == portNO_CRITICAL_NESTING ) \ + { \ + portENABLE_INTERRUPTS() \ + } \ + } \ + } + + + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() do {} while( 0 ) /* we use the timer */ + #define portALT_GET_RUN_TIME_COUNTER_VALUE( dest ) ( dest = xTickCount ) + + void vPortYield( void ); + void vPortYieldFromIsr( void ); + + #ifdef __cplusplus +} + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/README.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/README.md new file mode 100644 index 0000000..310d21b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/README.md @@ -0,0 +1,80 @@ +# Target of this port + +This port adds the support that FreeRTOS applications can call the secure +services in Trusted Firmware M(TF-M) through Platform Security Architecture +(PSA) API based on the ARM Cortex-M23, Cortex-M33, Cortex-M55 and Cortex-M85 +platform. + +The Platform Security Architecture (PSA) makes it quicker, easier and cheaper +to design security into a device from the ground up. PSA is made up of four key +stages: analyze, architect, implement, and certify. See [PSA Resource Page](https://developer.arm.com/architectures/security-architectures/platform-security-architecture). + +TF-M is an open source project. It provides a reference implementation of PSA +for Arm M-profile architecture. Please get the details from this [link](https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git/about/). + +# Derivation of the source code + +* ```os_wrapper_freertos.c``` + The implementation of APIs which are defined in ```\ns_interface\os_wrapper\mutex.h``` by tf-m-tests + (tag: TF-Mv1.5.0 & TF-Mv1.6.0). The implementation is based on FreeRTOS mutex type semaphore. + +# Usage notes + +To build a project based on this port: +* Step 1: build the secure image. Please follow the **Build the Secure Side** section for details. +* Step 2: build the nonsecure image. Please follow the **Build the Non-Secure Side** for details. + +## Build the Secure Side + +### Get the TF-M source code + +See the [link](https://git.trustedfirmware.org/TF-M/trusted-firmware-m.git/) to get the source code. This port is supported by TF-M version **tag: TF-Mv1.5.0** & **tag: TF-Mv1.6.0**. + +### Build TF-M + +Please refer to this [link](https://tf-m-user-guide.trustedfirmware.org/docs/technical_references/instructions/tfm_build_instruction.html) to build the secure side. +_**Note:** ```TFM_NS_MANAGE_NSID``` must be configured as "OFF" when building TF-M_. + +## Build the Non-Secure Side + +Please copy all the files in ```freertos_kernel\portable\GCC\ARM_CM[23|33|55|85]_NTZ``` into the ```freertos_kernel\portable\ThirdParty\GCC\ARM_TFM``` folder before using this port. Note that TrustZone is enabled in this port. The TF-M runs in the Secure Side. + +Please call the API ```tfm_ns_interface_init()``` which is defined in ```\app\tfm_ns_interface.c``` by tf-m-tests +(tag: TF-Mv1.5.0 & TF-Mv1.6.0) at the very beginning of your application. Otherwise, it will always fail when calling a TF-M service in the Nonsecure Side. + +### Configuration in FreeRTOS kernel + +* ```configRUN_FREERTOS_SECURE_ONLY``` +This macro should be configured as 0. In this port, TF-M runs in the Secure Side while FreeRTOS +Kernel runs in the Non-Secure Side. + +* ```configENABLE_FPU``` +The setting of this macro is decided by the setting in Secure Side which is platform-specific. +If the Secure Side enables Non-Secure access to FPU, then this macro can be configured as 0 or 1. Otherwise, this macro can only be configured as 0. +Please note that Cortex-M23 does not support FPU. +Please refer to [TF-M documentation](https://tf-m-user-guide.trustedfirmware.org/integration_guide/tfm_fpu_support.html) for FPU usage on the Non-Secure side. + +* ```configENABLE_MVE``` +The setting of this macro is decided by the setting in Secure Side which is platform-specific. +If the Secure Side enables Non-Secure access to MVE, then this macro can be configured as 0 or 1. Otherwise, this macro can only be configured as 0. +Please note that only Cortex-M55 and Cortex-M85 support MVE. +Please refer to [TF-M documentation](https://tf-m-user-guide.trustedfirmware.org/integration_guide/tfm_fpu_support.html) for MVE usage on the Non-Secure side. + +* ```configENABLE_TRUSTZONE``` +This macro should be configured as 0 because TF-M doesn't use the secure context management function of FreeRTOS. New secure context management might be introduced when TF-M supports multiple secure context. + + +### Integrate TF-M Non-Secure interface with FreeRTOS project + +To enable calling TF-M services by the Non-Secure Side, the files below should be included in the FreeRTOS project and built together. +* files in ```trusted-firmware-m\build\install\interface\src``` + These files contain the implementation of PSA Functional Developer APIs which can be called by Non-Secure Side directly and PSA Firmware Framework APIs in the IPC model. These files should be taken as part of the Non-Secure source code. +* files in ```trusted-firmware-m\build\install\interface\include``` + These files are the necessary header files to call TF-M services. +* ```trusted-firmware-m\build\install\interface\lib\s_veneers.o``` + This object file contains all the Non-Secure callable functions exported by + TF-M and it should be linked when generating the Non-Secure image. + + + +*Copyright (c) 2020-2022, Arm Limited. All rights reserved.* diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c new file mode 100644 index 0000000..01183fb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2019-2020, Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/* + * This file contains the implementation of APIs which are defined in + * os_wrapper/mutex.h by TF-M(tag: TF-Mv1.1). The implementation is based + * on FreeRTOS mutex type semaphore. + */ + +#include "os_wrapper/mutex.h" + +#include "FreeRTOS.h" +#include "semphr.h" +#include "mpu_wrappers.h" + +#if( configSUPPORT_STATIC_ALLOCATION == 1 ) + /* + * In the static allocation, the RAM is required to hold the semaphore's + * state. + */ + StaticSemaphore_t xSecureMutexBuffer; +#endif + +void * os_wrapper_mutex_create( void ) +{ +SemaphoreHandle_t xMutexHandle = NULL; + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + xMutexHandle = xSemaphoreCreateMutex(); +#elif( configSUPPORT_STATIC_ALLOCATION == 1 ) + xMutexHandle = xSemaphoreCreateMutexStatic( &xSecureMutexBuffer ); +#endif + return ( void * ) xMutexHandle; +} +/*-----------------------------------------------------------*/ + +uint32_t os_wrapper_mutex_acquire( void * handle, uint32_t timeout ) +{ +BaseType_t xRet; + + if( ! handle ) + return OS_WRAPPER_ERROR; + + xRet = xSemaphoreTake( ( SemaphoreHandle_t ) handle, + ( timeout == OS_WRAPPER_WAIT_FOREVER ) ? + portMAX_DELAY : ( TickType_t ) timeout ); + + if( xRet != pdPASS ) + return OS_WRAPPER_ERROR; + else + return OS_WRAPPER_SUCCESS; +} +/*-----------------------------------------------------------*/ + +uint32_t os_wrapper_mutex_release( void * handle ) +{ +BaseType_t xRet; + + if( !handle ) + return OS_WRAPPER_ERROR; + + xRet = xSemaphoreGive( ( SemaphoreHandle_t ) handle ); + + if( xRet != pdPASS ) + return OS_WRAPPER_ERROR; + else + return OS_WRAPPER_SUCCESS; +} +/*-----------------------------------------------------------*/ + +uint32_t os_wrapper_mutex_delete( void * handle ) +{ + vSemaphoreDelete( ( SemaphoreHandle_t ) handle ); + + return OS_WRAPPER_SUCCESS; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/port.c new file mode 100644 index 0000000..d5dfc8c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/port.c @@ -0,0 +1,768 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#include + +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the AVR port. + *----------------------------------------------------------*/ + +/* Start tasks with interrupts enabled. */ +#define portFLAGS_INT_ENABLED ( (StackType_t) 0x80 ) + +#if defined( portUSE_WDTO) + #warning "Watchdog Timer used for scheduler." + #define portSCHEDULER_ISR WDT_vect + +#elif defined( portUSE_TIMER0 ) +/* Hardware constants for Timer0. */ + #warning "Timer0 used for scheduler." + #define portSCHEDULER_ISR TIMER0_COMPA_vect + #define portCLEAR_COUNTER_ON_MATCH ( (uint8_t) _BV(WGM01) ) + #define portPRESCALE_1024 ( (uint8_t) (_BV(CS02)|_BV(CS00)) ) + #define portCLOCK_PRESCALER ( (uint32_t) 1024 ) + #define portCOMPARE_MATCH_A_INTERRUPT_ENABLE ( (uint8_t) _BV(OCIE0A) ) + #define portOCRL OCR0A + #define portTCCRa TCCR0A + #define portTCCRb TCCR0B + #define portTIMSK TIMSK0 + #define portTIFR TIFR0 + +#else + #error "No Timer defined for scheduler" +#endif + +/*-----------------------------------------------------------*/ + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/** + Enable the watchdog timer, configuring it for expire after + (value) timeout (which is a combination of the WDP0 + through WDP3 bits). + + This function is derived from but enables only + the interrupt bit (WDIE), rather than the reset bit (WDE). + + Can't find it documented but the WDT, once enabled, + rolls over and fires a new interrupt each time. + + See also the symbolic constants WDTO_15MS et al. + + Updated to match avr-libc 2.0.0 +*/ + +#if defined( portUSE_WDTO) + +static __inline__ +__attribute__ ((__always_inline__)) +void wdt_interrupt_enable (const uint8_t value) +{ + if (_SFR_IO_REG_P (_WD_CONTROL_REG)) + { + __asm__ __volatile__ ( + "in __tmp_reg__,__SREG__" "\n\t" + "cli" "\n\t" + "wdr" "\n\t" + "out %0, %1" "\n\t" + "out __SREG__,__tmp_reg__" "\n\t" + "out %0, %2" "\n\t" + : /* no outputs */ + : "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), + "r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))), + "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | + _BV(WDIF) | _BV(WDIE) | (value & 0x07)) ) + : "r0" + ); + } + else + { + __asm__ __volatile__ ( + "in __tmp_reg__,__SREG__" "\n\t" + "cli" "\n\t" + "wdr" "\n\t" + "sts %0, %1" "\n\t" + "out __SREG__,__tmp_reg__" "\n\t" + "sts %0, %2" "\n\t" + : /* no outputs */ + : "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), + "r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))), + "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | + _BV(WDIF) | _BV(WDIE) | (value & 0x07)) ) + : "r0" + ); + } +} +#endif + +/*-----------------------------------------------------------*/ +/** + Enable the watchdog timer, configuring it for expire after + (value) timeout (which is a combination of the WDP0 + through WDP3 bits). + + This function is derived from but enables both + the reset bit (WDE), and the interrupt bit (WDIE). + + This will ensure that if the interrupt is not serviced + before the second timeout, the AVR will reset. + + Servicing the interrupt automatically clears it, + and ensures the AVR does not reset. + + Can't find it documented but the WDT, once enabled, + rolls over and fires a new interrupt each time. + + See also the symbolic constants WDTO_15MS et al. + + Updated to match avr-libc 2.0.0 +*/ + +#if defined( portUSE_WDTO) + +static __inline__ +__attribute__ ((__always_inline__)) +void wdt_interrupt_reset_enable (const uint8_t value) +{ + if (_SFR_IO_REG_P (_WD_CONTROL_REG)) + { + __asm__ __volatile__ ( + "in __tmp_reg__,__SREG__" "\n\t" + "cli" "\n\t" + "wdr" "\n\t" + "out %0, %1" "\n\t" + "out __SREG__,__tmp_reg__" "\n\t" + "out %0, %2" "\n\t" + : /* no outputs */ + : "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), + "r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))), + "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | + _BV(WDIF) | _BV(WDIE) | _BV(WDE) | (value & 0x07)) ) + : "r0" + ); + } + else + { + __asm__ __volatile__ ( + "in __tmp_reg__,__SREG__" "\n\t" + "cli" "\n\t" + "wdr" "\n\t" + "sts %0, %1" "\n\t" + "out __SREG__,__tmp_reg__" "\n\t" + "sts %0, %2" "\n\t" + : /* no outputs */ + : "n" (_SFR_MEM_ADDR(_WD_CONTROL_REG)), + "r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))), + "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | + _BV(WDIF) | _BV(WDIE) | _BV(WDE) | (value & 0x07)) ) + : "r0" + ); + } +} +#endif + +/*-----------------------------------------------------------*/ + +/* + * Macro to save all the general purpose registers, the save the stack pointer + * into the TCB. + * + * The first thing we do is save the flags then disable interrupts. This is to + * guard our stack against having a context switch interrupt after we have already + * pushed the registers onto the stack - causing the 32 registers to be on the + * stack twice. + * + * r1 is set to zero (__zero_reg__) as the compiler expects it to be thus, however + * some of the math routines make use of R1. + * + * r0 is set to __tmp_reg__ as the compiler expects it to be thus. + * + * #if defined(__AVR_HAVE_RAMPZ__) + * #define __RAMPZ__ 0x3B + * #endif + * + * #if defined(__AVR_3_BYTE_PC__) + * #define __EIND__ 0x3C + * #endif + * + * The interrupts will have been disabled during the call to portSAVE_CONTEXT() + * so we need not worry about reading/writing to the stack pointer. + */ +#if defined(__AVR_3_BYTE_PC__) && defined(__AVR_HAVE_RAMPZ__) +/* 3-Byte PC Save with RAMPZ */ +#define portSAVE_CONTEXT() \ + __asm__ __volatile__ ( "push __tmp_reg__ \n\t" \ + "in __tmp_reg__, __SREG__ \n\t" \ + "cli \n\t" \ + "push __tmp_reg__ \n\t" \ + "in __tmp_reg__, 0x3B \n\t" \ + "push __tmp_reg__ \n\t" \ + "in __tmp_reg__, 0x3C \n\t" \ + "push __tmp_reg__ \n\t" \ + "push __zero_reg__ \n\t" \ + "clr __zero_reg__ \n\t" \ + "push r2 \n\t" \ + "push r3 \n\t" \ + "push r4 \n\t" \ + "push r5 \n\t" \ + "push r6 \n\t" \ + "push r7 \n\t" \ + "push r8 \n\t" \ + "push r9 \n\t" \ + "push r10 \n\t" \ + "push r11 \n\t" \ + "push r12 \n\t" \ + "push r13 \n\t" \ + "push r14 \n\t" \ + "push r15 \n\t" \ + "push r16 \n\t" \ + "push r17 \n\t" \ + "push r18 \n\t" \ + "push r19 \n\t" \ + "push r20 \n\t" \ + "push r21 \n\t" \ + "push r22 \n\t" \ + "push r23 \n\t" \ + "push r24 \n\t" \ + "push r25 \n\t" \ + "push r26 \n\t" \ + "push r27 \n\t" \ + "push r28 \n\t" \ + "push r29 \n\t" \ + "push r30 \n\t" \ + "push r31 \n\t" \ + "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "in __tmp_reg__, __SP_L__ \n\t" \ + "st x+, __tmp_reg__ \n\t" \ + "in __tmp_reg__, __SP_H__ \n\t" \ + "st x+, __tmp_reg__ \n\t" \ + ); +#elif defined(__AVR_HAVE_RAMPZ__) +/* 2-Byte PC Save with RAMPZ */ +#define portSAVE_CONTEXT() \ + __asm__ __volatile__ ( "push __tmp_reg__ \n\t" \ + "in __tmp_reg__, __SREG__ \n\t" \ + "cli \n\t" \ + "push __tmp_reg__ \n\t" \ + "in __tmp_reg__, 0x3B \n\t" \ + "push __tmp_reg__ \n\t" \ + "push __zero_reg__ \n\t" \ + "clr __zero_reg__ \n\t" \ + "push r2 \n\t" \ + "push r3 \n\t" \ + "push r4 \n\t" \ + "push r5 \n\t" \ + "push r6 \n\t" \ + "push r7 \n\t" \ + "push r8 \n\t" \ + "push r9 \n\t" \ + "push r10 \n\t" \ + "push r11 \n\t" \ + "push r12 \n\t" \ + "push r13 \n\t" \ + "push r14 \n\t" \ + "push r15 \n\t" \ + "push r16 \n\t" \ + "push r17 \n\t" \ + "push r18 \n\t" \ + "push r19 \n\t" \ + "push r20 \n\t" \ + "push r21 \n\t" \ + "push r22 \n\t" \ + "push r23 \n\t" \ + "push r24 \n\t" \ + "push r25 \n\t" \ + "push r26 \n\t" \ + "push r27 \n\t" \ + "push r28 \n\t" \ + "push r29 \n\t" \ + "push r30 \n\t" \ + "push r31 \n\t" \ + "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "in __tmp_reg__, __SP_L__ \n\t" \ + "st x+, __tmp_reg__ \n\t" \ + "in __tmp_reg__, __SP_H__ \n\t" \ + "st x+, __tmp_reg__ \n\t" \ + ); +#else +/* 2-Byte PC Save */ +#define portSAVE_CONTEXT() \ + __asm__ __volatile__ ( "push __tmp_reg__ \n\t" \ + "in __tmp_reg__, __SREG__ \n\t" \ + "cli \n\t" \ + "push __tmp_reg__ \n\t" \ + "push __zero_reg__ \n\t" \ + "clr __zero_reg__ \n\t" \ + "push r2 \n\t" \ + "push r3 \n\t" \ + "push r4 \n\t" \ + "push r5 \n\t" \ + "push r6 \n\t" \ + "push r7 \n\t" \ + "push r8 \n\t" \ + "push r9 \n\t" \ + "push r10 \n\t" \ + "push r11 \n\t" \ + "push r12 \n\t" \ + "push r13 \n\t" \ + "push r14 \n\t" \ + "push r15 \n\t" \ + "push r16 \n\t" \ + "push r17 \n\t" \ + "push r18 \n\t" \ + "push r19 \n\t" \ + "push r20 \n\t" \ + "push r21 \n\t" \ + "push r22 \n\t" \ + "push r23 \n\t" \ + "push r24 \n\t" \ + "push r25 \n\t" \ + "push r26 \n\t" \ + "push r27 \n\t" \ + "push r28 \n\t" \ + "push r29 \n\t" \ + "push r30 \n\t" \ + "push r31 \n\t" \ + "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "in __tmp_reg__, __SP_L__ \n\t" \ + "st x+, __tmp_reg__ \n\t" \ + "in __tmp_reg__, __SP_H__ \n\t" \ + "st x+, __tmp_reg__ \n\t" \ + ); +#endif + +/* + * Opposite to portSAVE_CONTEXT(). Interrupts will have been disabled during + * the context save so we can write to the stack pointer. + */ +#if defined(__AVR_3_BYTE_PC__) && defined(__AVR_HAVE_RAMPZ__) +/* 3-Byte PC Restore with RAMPZ */ +#define portRESTORE_CONTEXT() \ + __asm__ __volatile__ ( "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "ld r28, x+ \n\t" \ + "out __SP_L__, r28 \n\t" \ + "ld r29, x+ \n\t" \ + "out __SP_H__, r29 \n\t" \ + "pop r31 \n\t" \ + "pop r30 \n\t" \ + "pop r29 \n\t" \ + "pop r28 \n\t" \ + "pop r27 \n\t" \ + "pop r26 \n\t" \ + "pop r25 \n\t" \ + "pop r24 \n\t" \ + "pop r23 \n\t" \ + "pop r22 \n\t" \ + "pop r21 \n\t" \ + "pop r20 \n\t" \ + "pop r19 \n\t" \ + "pop r18 \n\t" \ + "pop r17 \n\t" \ + "pop r16 \n\t" \ + "pop r15 \n\t" \ + "pop r14 \n\t" \ + "pop r13 \n\t" \ + "pop r12 \n\t" \ + "pop r11 \n\t" \ + "pop r10 \n\t" \ + "pop r9 \n\t" \ + "pop r8 \n\t" \ + "pop r7 \n\t" \ + "pop r6 \n\t" \ + "pop r5 \n\t" \ + "pop r4 \n\t" \ + "pop r3 \n\t" \ + "pop r2 \n\t" \ + "pop __zero_reg__ \n\t" \ + "pop __tmp_reg__ \n\t" \ + "out 0x3C, __tmp_reg__ \n\t" \ + "pop __tmp_reg__ \n\t" \ + "out 0x3B, __tmp_reg__ \n\t" \ + "pop __tmp_reg__ \n\t" \ + "out __SREG__, __tmp_reg__ \n\t" \ + "pop __tmp_reg__ \n\t" \ + ); +#elif defined(__AVR_HAVE_RAMPZ__) +/* 2-Byte PC Restore with RAMPZ */ +#define portRESTORE_CONTEXT() \ + __asm__ __volatile__ ( "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "ld r28, x+ \n\t" \ + "out __SP_L__, r28 \n\t" \ + "ld r29, x+ \n\t" \ + "out __SP_H__, r29 \n\t" \ + "pop r31 \n\t" \ + "pop r30 \n\t" \ + "pop r29 \n\t" \ + "pop r28 \n\t" \ + "pop r27 \n\t" \ + "pop r26 \n\t" \ + "pop r25 \n\t" \ + "pop r24 \n\t" \ + "pop r23 \n\t" \ + "pop r22 \n\t" \ + "pop r21 \n\t" \ + "pop r20 \n\t" \ + "pop r19 \n\t" \ + "pop r18 \n\t" \ + "pop r17 \n\t" \ + "pop r16 \n\t" \ + "pop r15 \n\t" \ + "pop r14 \n\t" \ + "pop r13 \n\t" \ + "pop r12 \n\t" \ + "pop r11 \n\t" \ + "pop r10 \n\t" \ + "pop r9 \n\t" \ + "pop r8 \n\t" \ + "pop r7 \n\t" \ + "pop r6 \n\t" \ + "pop r5 \n\t" \ + "pop r4 \n\t" \ + "pop r3 \n\t" \ + "pop r2 \n\t" \ + "pop __zero_reg__ \n\t" \ + "pop __tmp_reg__ \n\t" \ + "out 0x3B, __tmp_reg__ \n\t" \ + "pop __tmp_reg__ \n\t" \ + "out __SREG__, __tmp_reg__ \n\t" \ + "pop __tmp_reg__ \n\t" \ + ); +#else +/* 2-Byte PC Restore */ +#define portRESTORE_CONTEXT() \ + __asm__ __volatile__ ( "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "ld r28, x+ \n\t" \ + "out __SP_L__, r28 \n\t" \ + "ld r29, x+ \n\t" \ + "out __SP_H__, r29 \n\t" \ + "pop r31 \n\t" \ + "pop r30 \n\t" \ + "pop r29 \n\t" \ + "pop r28 \n\t" \ + "pop r27 \n\t" \ + "pop r26 \n\t" \ + "pop r25 \n\t" \ + "pop r24 \n\t" \ + "pop r23 \n\t" \ + "pop r22 \n\t" \ + "pop r21 \n\t" \ + "pop r20 \n\t" \ + "pop r19 \n\t" \ + "pop r18 \n\t" \ + "pop r17 \n\t" \ + "pop r16 \n\t" \ + "pop r15 \n\t" \ + "pop r14 \n\t" \ + "pop r13 \n\t" \ + "pop r12 \n\t" \ + "pop r11 \n\t" \ + "pop r10 \n\t" \ + "pop r9 \n\t" \ + "pop r8 \n\t" \ + "pop r7 \n\t" \ + "pop r6 \n\t" \ + "pop r5 \n\t" \ + "pop r4 \n\t" \ + "pop r3 \n\t" \ + "pop r2 \n\t" \ + "pop __zero_reg__ \n\t" \ + "pop __tmp_reg__ \n\t" \ + "out __SREG__, __tmp_reg__ \n\t" \ + "pop __tmp_reg__ \n\t" \ + ); +#endif +/*-----------------------------------------------------------*/ + +/* + * Perform hardware setup to enable ticks from relevant Timer. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint16_t usAddress; + /* Simulate how the stack would look after a call to vPortYield() generated by + the compiler. */ + + /* The start of the task code will be popped off the stack last, so place + it on first. */ + usAddress = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + +#if defined(__AVR_3_BYTE_PC__) + /* The AVR ATmega2560/ATmega2561 have 256KBytes of program memory and a 17-bit + * program counter. When a code address is stored on the stack, it takes 3 bytes + * instead of 2 for the other ATmega* chips. + * + * Store 0 as the top byte since we force all task routines to the bottom 128K + * of flash. We do this by using the .lowtext label in the linker script. + * + * In order to do this properly, we would need to get a full 3-byte pointer to + * pxCode. That requires a change to GCC. Not likely to happen any time soon. + */ + *pxTopOfStack = 0; + pxTopOfStack--; +#endif + + /* Next simulate the stack as if after a call to portSAVE_CONTEXT(). + portSAVE_CONTEXT places the flags on the stack immediately after r0 + to ensure the interrupts get disabled as soon as possible, and so ensuring + the stack use is minimal should a context switch interrupt occur. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; + +#if defined(__AVR_3_BYTE_PC__) + /* If we have an ATmega256x, we are also saving the EIND register. + * We should default to 0. + */ + *pxTopOfStack = ( StackType_t ) 0x00; /* EIND */ + pxTopOfStack--; +#endif + +#if defined(__AVR_HAVE_RAMPZ__) + /* We are saving the RAMPZ register. + * We should default to 0. + */ + *pxTopOfStack = ( StackType_t ) 0x00; /* RAMPZ */ + pxTopOfStack--; +#endif + + /* Now the remaining registers. The compiler expects R1 to be 0. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R1 */ + + /* Leave R2 - R23 untouched */ + pxTopOfStack -= 23; + + /* Place the parameter on the stack in the expected location. */ + usAddress = ( uint16_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + + /* Leave register R26 - R31 untouched */ + pxTopOfStack -= 7; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the relevant timer hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Simulate a function call end as generated by the compiler. We will now + jump to the start of the task the context of which we have just restored. */ + __asm__ __volatile__ ( "ret" ); + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the ATmega port will get stopped. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. The first thing we do is save the registers so we + * can use a naked attribute. + */ +void vPortYield( void ) __attribute__ ( ( hot, flatten, naked ) ); +void vPortYield( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + + __asm__ __volatile__ ( "ret" ); +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch callable from ISRs. The first thing we do is save + * the registers so we can use a naked attribute. + */ +void vPortYieldFromISR(void) __attribute__ ( ( hot, flatten, naked ) ); +void vPortYieldFromISR(void) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + + __asm__ __volatile__ ( "reti" ); +} +/*-----------------------------------------------------------*/ + +/* + * Context switch function used by the tick. This must be identical to + * vPortYield() from the call to vTaskSwitchContext() onwards. The only + * difference from vPortYield() is the tick count is incremented as the + * call comes from the tick ISR. + */ +void vPortYieldFromTick( void ) __attribute__ ( ( hot, flatten, naked ) ); +void vPortYieldFromTick( void ) +{ + portSAVE_CONTEXT(); + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + portRESTORE_CONTEXT(); + + __asm__ __volatile__ ( "ret" ); +} +/*-----------------------------------------------------------*/ + +#if defined(portUSE_WDTO) +/* + * Setup WDT to generate a tick interrupt. + */ +void prvSetupTimerInterrupt( void ) +{ + /* reset watchdog */ + wdt_reset(); + + /* set up WDT Interrupt (rather than the WDT Reset). */ + wdt_interrupt_enable( portUSE_WDTO ); +} + +#elif defined (portUSE_TIMER0) +/* + * Setup Timer0 compare match A to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ +uint32_t ulCompareMatch; +uint8_t ucLowByte; + + /* Using 8bit Timer0 to generate the tick. Correct fuses must be + selected for the configCPU_CLOCK_HZ clock.*/ + + ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ; + + /* We only have 8 bits so have to scale 1024 to get our required tick rate. */ + ulCompareMatch /= portCLOCK_PRESCALER; + + /* Adjust for correct value. */ + ulCompareMatch -= ( uint32_t ) 1; + + /* Setup compare match value for compare match A. Interrupts are disabled + before this is called so we need not worry here. */ + ucLowByte = ( uint8_t ) ( ulCompareMatch & ( uint32_t ) 0xff ); + portOCRL = ucLowByte; + + /* Setup clock source and compare match behaviour. */ + portTCCRa = portCLEAR_COUNTER_ON_MATCH; + portTCCRb = portPRESCALE_1024; + + + /* Enable the interrupt - this is okay as interrupt are currently globally disabled. */ + ucLowByte = portTIMSK; + ucLowByte |= portCOMPARE_MATCH_A_INTERRUPT_ENABLE; + portTIMSK = ucLowByte; +} + +#endif + +/*-----------------------------------------------------------*/ + +#if configUSE_PREEMPTION == 1 + + /* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + * + * use ISR_NOBLOCK where there is an important timer running, that should preempt the scheduler. + * + */ + ISR(portSCHEDULER_ISR, ISR_NAKED) __attribute__ ((hot, flatten)); +/* ISR(portSCHEDULER_ISR, ISR_NAKED ISR_NOBLOCK) __attribute__ ((hot, flatten)); + */ + ISR(portSCHEDULER_ISR) + { + vPortYieldFromTick(); + __asm__ __volatile__ ( "reti" ); + } +#else + + /* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + * + * use ISR_NOBLOCK where there is an important timer running, that should preempt the scheduler. + */ + ISR(portSCHEDULER_ISR) __attribute__ ((hot, flatten)); +/* ISR(portSCHEDULER_ISR, ISR_NOBLOCK) __attribute__ ((hot, flatten)); + */ + ISR(portSCHEDULER_ISR) + { + xTaskIncrementTick(); + } +#endif + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/portmacro.h new file mode 100644 index 0000000..6529028 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/portmacro.h @@ -0,0 +1,157 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * +*/ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +#include + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int + +typedef uint8_t StackType_t; +typedef int8_t BaseType_t; +typedef uint8_t UBaseType_t; + +#if configUSE_16_BIT_TICKS == 1 + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + +#define portENTER_CRITICAL() __asm__ __volatile__ ( \ + "in __tmp_reg__, __SREG__" "\n\t" \ + "cli" "\n\t" \ + "push __tmp_reg__" "\n\t" \ + ::: "memory" \ + ) + + +#define portEXIT_CRITICAL() __asm__ __volatile__ ( \ + "pop __tmp_reg__" "\n\t" \ + "out __SREG__, __tmp_reg__" "\n\t" \ + ::: "memory" \ + ) + + +#define portDISABLE_INTERRUPTS() __asm__ __volatile__ ( "cli" ::: "memory") +#define portENABLE_INTERRUPTS() __asm__ __volatile__ ( "sei" ::: "memory") +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + +/* System Tick - Scheduler timer + * Prefer to use the enhanced Watchdog Timer, but also Timer0 is ok. + */ + +#if defined(WDIE) && defined(WDIF) /* If Enhanced WDT with interrupt capability is available */ + +#define portUSE_WDTO WDTO_15MS /* use the Watchdog Timer for xTaskIncrementTick */ + +/* Watchdog period options: WDTO_15MS + WDTO_30MS + WDTO_60MS + WDTO_120MS + WDTO_250MS + WDTO_500MS + WDTO_1S + WDTO_2S +*/ + +#else + +#define portUSE_TIMER0 /* use the 8-bit Timer0 for xTaskIncrementTick */ + +#endif + +#define portSTACK_GROWTH ( -1 ) + +/* Timing for the scheduler. + * Watchdog Timer is 128kHz nominal, + * but 120 kHz at 5V DC and 25 degrees is actually more accurate, + * from data sheet. + */ +#if defined( portUSE_WDTO ) +#define portTICK_PERIOD_MS ( (TickType_t) _BV( portUSE_WDTO + 4 ) ) +#else +#define portTICK_PERIOD_MS ( (TickType_t) 1000 / configTICK_RATE_HZ ) +#endif + +#define portBYTE_ALIGNMENT 1 +#define portNOP() __asm__ __volatile__ ( "nop" ); +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +extern void vPortYield( void ) __attribute__ ( ( naked ) ); +#define portYIELD() vPortYield() + +extern void vPortYieldFromISR( void ) __attribute__ ( ( naked ) ); +#define portYIELD_FROM_ISR() vPortYieldFromISR() +/*-----------------------------------------------------------*/ + +#if defined(__AVR_3_BYTE_PC__) +/* Task function macros as described on the FreeRTOS.org WEB site. */ + +/* Add .lowtext tag from the avr linker script avr6.x for ATmega2560 and ATmega2561 + * to make sure functions are loaded in low memory. + */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) __attribute__ ((section (".lowtext"))) +#else +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#endif + +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/readme.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/readme.md new file mode 100644 index 0000000..4afb4fe --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/readme.md @@ -0,0 +1,86 @@ +

    ATmegaxxxx

    + +__Port for generalised Microchip ATmega architecture__ + +

    Description

    + +This port provides a basis for supporting all modern ATmega devices using either the Enhanced Watchdog Timer, or Timer0 (an 8-bit Timer generally available across the whole range). + +This initial commit contains the information required to build with System Tick being generated by either the: +- Watchdog Timer, or +- Timer0 - an 8-bit Timer, or +- TimerN - a 16-bit Timer which will be configured by the user. + +Further commits can add support for 16-bit Timers available on many relevant devices. The availability of these 16-bit Timers is somewhat device specific, and these complex and highly configurable Timers are often used to generate phase correct PWM timing (for example) and they would be wasted as a simple System Tick. + +The port also provides support for the 3 byte program counter devices __ATmega2560__ and __ATmega2561__. Specific to these two devices the `EIND` register need to be preserved during a context switch. Also, due to a limitation in GCC, the scheduler needs to reside in the lower 128kB of flash for both of these devices. This is achieved by adding the `.lowtext` section attribute to the function prototype. + +To build generic Microchip (AVR) ATmega support the similarities across the family must be considered, and differences respected. Some comments on the strategy follow. + +

    System Tick

    + +The Microchip (AVR) ATmega family has limited Timer and Pin capabilities, and is designed to be used in physical applications, controlling hardware with PWM and recognising level and edge voltage changes. It does this mainly through the use of 16-bit Timers (for generating phase correct PWM by up/down counting), and Pins attached to Interrupts. The 8-bit Timers are also attached to Pins, and they can be used for more simple timing tasks, requiring only a single counting direction. + +The Timers not attached to Pins (and therefore not impacting the application of the device) are some 16-bit Timers (very device dependent, eg Timer3 on 1284p), The RTC Timer, and the Watch Dog Timer. + +The Watch Dog Timer is configured identically across most of the ATmega devices. It comes in two variants. 1. Old style (eg ATmega32) which does not have an Interrupt capability, and hence on these old devices cannot be used as the System Tick. and 2. New style enhanced WDT, which can generate an Interrupt, and is available on every relevant device. + +Using the Watch Dog Timer (WDT) to generate the System Tick does not impact its use as a watch dog. It can be configured to generate a System Tick interrupt, and then one period later to Reset the device if the interrupt is not serviced. + +Configuration and usage of the WDT is covered in `` which was revised in avr-libc 2.0.0. + +Two additional WDT functions are provided in `port.c`, which extend avr-libc functions to enable the WDT Interrupt without enabling Reset `wdt_interrupt_enable()`, and to enable both the Interrupt and the Reset `wdt_interrupt_reset_enable()`. + +

    3 Byte PC Devices

    + +The ATtiny, ATmega, ATxmega families can optionally support both 3 byte PC and 3 byte RAM addresses. However, focusing on just the ATmega family only two devices have a large Flash requiring them to use 3 byte PC. These are the __ATmega2560__ and __ATmega2561__. This PR provides support for these two devices in two ways. + + - providing `portSAVE_CONTEXT()` and `portRESTORE_CONTEXT` saving both the __RAMPZ__ and __EIND__ registers. + - providing a `portTASK_FUNCTION_PROTO()` with the linker attribute `.lowtext` which is used to ensure that the scheduler and relevant functions remain in the lower 128kB of Flash. + +For devices which can support __XRAM__ and have the __RAMPZ__ register, this register is also preserved during the context switch. + +

    Interrupt Nesting

    + +The ATmega family does not support interrupt nesting, having only one interrupt priority. This means that when the Scheduler is running, interrupts are normally disabled. + +When a very time critical process is running, based on microsecond timing generated by one of the Timers, it is important to re-enable interrupts as early as possible in processing a Yield. Fortunately, this is supported through the use of the `NO_BLOCK` decorator when defining the Interrupt Service Routine. + +The `NO_BLOCK` decorator will enable the global interrupt early in the handling of an ISR (in this case for the Scheduler), and enable interrupts to be nested. Using this method, I've been able to successfully implement an [Audio Synthesiser](https://feilipu.me/2015/06/02/goldilocks-analogue-synthesizer/) with less than 83 microseconds for each cycle, whilst still running the Scheduler to handle display and input. + +Using `NO_BLOCK` is optional, and should only be done if a critical Timer should interrupt the Scheduler. + +

    Heap Management

    + +Most users of FreeRTOS will choose to manage their own heap using one of the pre-allocated heap management algorithms, but for those that choose to use `heap_3.c`, the wrappered `malloc()` method, there is an issue that needs to be addressed. + +The avr-libc library assumes that the stack will always be above the heap, and does a check for this when responding to a `malloc()` request. This is not the case when Tasks are running, as their stack is located in the early allocated heap address ranges which will be below free heap memory, and so the `malloc()` request will fail even though heap space is available. + +To avoid this issue causing `pvPort_Malloc()` to failing, the user needs to issue this tuning statement BEFORE they use the heap, or use the `xTaskCreate()` API. + +```c +if( __malloc_heap_end == 0 ) + __malloc_heap_end = (char *)(RAMEND - __malloc_margin); +``` +Unfortunately in the repository there is nowhere sensible to include this statement as it should be included early in the `main()` function. + +For devices which can support __XRAM__ the user will need to tune the location of stack and heap according to their own requirements. + +

    Supported Devices

    + +ATmega devices with __ENHANCED WDT__ Interrupt capability - will use WDT. + + - ATmega8U2/16U2/32U2 -> 2kB RAM + - ATmega16U4/32U4 - Arduino Leonardo -> 2.5kB RAM + - ATmega48PB/88PB/168PB/328PB - Arduino Uno -> 2kB RAM + - ATmega164PA/324PA/644PA/1284P - Goldilocks -> __16kB RAM__ + - ATmega324PB -> 2kB RAM + - ATmega640/1280/2560/1281/2561 - Arduino Mega -> __8kB RAM + XRAM__ + +ATmega devices without enhanced __WDT__ Interrupt capability - will use a 8-bit or 16-bit Timer. + + - ATmega8A/16A/32A/64A/128A -> 4kB RAM + - ATmega165A/165PA/325A/325PA/3250A/3250PA/645A/645P/6450A/6450P -> 4kB RAM + - ATmega169A/169PA/329A/329PA/3290A/3290PA/649A/649P/6490A/6490P -> 4kB RAM + - ATmega808/809/1608/1609/3208/3209/4808/4809 - megaAVR 0-Series -> 6kB RAM + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url new file mode 100644 index 0000000..84cc36d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url @@ -0,0 +1,5 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,11 +[InternetShortcut] +IDList= +URL=https://www.freertos.org/FreeRTOS-simulator-for-Linux.html diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/port.c new file mode 100644 index 0000000..40162cd --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/port.c @@ -0,0 +1,583 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Cambridge Consultants Ltd. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the Posix port. +* +* Each task has a pthread which eases use of standard debuggers +* (allowing backtraces of tasks etc). Threads for tasks that are not +* running are blocked in sigwait(). +* +* Task switch is done by resuming the thread for the next task by +* signaling the condition variable and then waiting on a condition variable +* with the current thread. +* +* The timer interrupt uses SIGALRM and care is taken to ensure that +* the signal handler runs only on the thread for the current task. +* +* Use of part of the standard C library requires care as some +* functions can take pthread mutexes internally which can result in +* deadlocks as the FreeRTOS kernel can switch tasks while they're +* holding a pthread mutex. +* +* stdio (printf() and friends) should be called from a single task +* only or serialized with a FreeRTOS primitive such as a binary +* semaphore or mutex. +*----------------------------------------------------------*/ +#include "portmacro.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "utils/wait_for_event.h" +/*-----------------------------------------------------------*/ + +#define SIG_RESUME SIGUSR1 + +typedef struct THREAD +{ + pthread_t pthread; + pdTASK_CODE pxCode; + void * pvParams; + BaseType_t xDying; + struct event * ev; +} Thread_t; + +/* + * The additional per-thread data is stored at the beginning of the + * task's stack. + */ +static inline Thread_t * prvGetThreadFromTask( TaskHandle_t xTask ) +{ + StackType_t * pxTopOfStack = *( StackType_t ** ) xTask; + + return ( Thread_t * ) ( pxTopOfStack + 1 ); +} + +/*-----------------------------------------------------------*/ + +static pthread_once_t hSigSetupThread = PTHREAD_ONCE_INIT; +static sigset_t xAllSignals; +static sigset_t xSchedulerOriginalSignalMask; +static pthread_t hMainThread = ( pthread_t ) NULL; +static volatile portBASE_TYPE uxCriticalNesting; +/*-----------------------------------------------------------*/ + +static portBASE_TYPE xSchedulerEnd = pdFALSE; +/*-----------------------------------------------------------*/ + +static void prvSetupSignalsAndSchedulerPolicy( void ); +static void prvSetupTimerInterrupt( void ); +static void * prvWaitForStart( void * pvParams ); +static void prvSwitchThread( Thread_t * xThreadToResume, + Thread_t * xThreadToSuspend ); +static void prvSuspendSelf( Thread_t * thread ); +static void prvResumeThread( Thread_t * xThreadId ); +static void vPortSystemTickHandler( int sig ); +static void vPortStartFirstTask( void ); +static void prvPortYieldFromISR( void ); +/*-----------------------------------------------------------*/ + +static void prvFatalError( const char * pcCall, + int iErrno ) +{ + fprintf( stderr, "%s: %s\n", pcCall, strerror( iErrno ) ); + abort(); +} + +/* + * See header file for description. + */ +portSTACK_TYPE * pxPortInitialiseStack( portSTACK_TYPE * pxTopOfStack, + portSTACK_TYPE * pxEndOfStack, + pdTASK_CODE pxCode, + void * pvParameters ) +{ + Thread_t * thread; + pthread_attr_t xThreadAttributes; + size_t ulStackSize; + int iRet; + + ( void ) pthread_once( &hSigSetupThread, prvSetupSignalsAndSchedulerPolicy ); + + /* + * Store the additional thread data at the start of the stack. + */ + thread = ( Thread_t * ) ( pxTopOfStack + 1 ) - 1; + pxTopOfStack = ( portSTACK_TYPE * ) thread - 1; + ulStackSize = ( pxTopOfStack + 1 - pxEndOfStack ) * sizeof( *pxTopOfStack ); + + thread->pxCode = pxCode; + thread->pvParams = pvParameters; + thread->xDying = pdFALSE; + + pthread_attr_init( &xThreadAttributes ); + iRet = pthread_attr_setstack( &xThreadAttributes, pxEndOfStack, ulStackSize ); + if( iRet != 0 ) + { + fprintf( stderr, "[WARN] pthread_attr_setstack failed with return value: %d. Default stack will be used.\n", iRet ); + fprintf( stderr, "[WARN] Increase the stack size to PTHREAD_STACK_MIN.\n" ); + } + + thread->ev = event_create(); + + vPortEnterCritical(); + + iRet = pthread_create( &thread->pthread, &xThreadAttributes, + prvWaitForStart, thread ); + + if( iRet != 0 ) + { + prvFatalError( "pthread_create", iRet ); + } + + vPortExitCritical(); + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortStartFirstTask( void ) +{ + Thread_t * pxFirstThread = prvGetThreadFromTask( xTaskGetCurrentTaskHandle() ); + + /* Start the first task. */ + prvResumeThread( pxFirstThread ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + int iSignal; + sigset_t xSignals; + + hMainThread = pthread_self(); + + /* Start the timer that generates the tick ISR(SIGALRM). + * Interrupts are disabled here already. */ + prvSetupTimerInterrupt(); + + /* + * Block SIG_RESUME before starting any tasks so the main thread can sigwait on it. + * To sigwait on an unblocked signal is undefined. + * https://pubs.opengroup.org/onlinepubs/009604499/functions/sigwait.html + */ + sigemptyset( &xSignals ); + sigaddset( &xSignals, SIG_RESUME ); + ( void ) pthread_sigmask( SIG_BLOCK, &xSignals, NULL ); + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Wait until signaled by vPortEndScheduler(). */ + while( xSchedulerEnd != pdTRUE ) + { + sigwait( &xSignals, &iSignal ); + } + + /* Cancel the Idle task and free its resources */ + #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + vPortCancelThread( xTaskGetIdleTaskHandle() ); + #endif + + #if ( configUSE_TIMERS == 1 ) + /* Cancel the Timer task and free its resources */ + vPortCancelThread( xTimerGetTimerDaemonTaskHandle() ); + #endif /* configUSE_TIMERS */ + + /* Restore original signal mask. */ + ( void ) pthread_sigmask( SIG_SETMASK, &xSchedulerOriginalSignalMask, NULL ); + + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + struct itimerval itimer; + struct sigaction sigtick; + Thread_t * xCurrentThread; + + /* Stop the timer and ignore any pending SIGALRMs that would end + * up running on the main thread when it is resumed. */ + itimer.it_value.tv_sec = 0; + itimer.it_value.tv_usec = 0; + + itimer.it_interval.tv_sec = 0; + itimer.it_interval.tv_usec = 0; + ( void ) setitimer( ITIMER_REAL, &itimer, NULL ); + + sigtick.sa_flags = 0; + sigtick.sa_handler = SIG_IGN; + sigemptyset( &sigtick.sa_mask ); + sigaction( SIGALRM, &sigtick, NULL ); + + /* Signal the scheduler to exit its loop. */ + xSchedulerEnd = pdTRUE; + ( void ) pthread_kill( hMainThread, SIG_RESUME ); + + xCurrentThread = prvGetThreadFromTask( xTaskGetCurrentTaskHandle() ); + prvSuspendSelf( xCurrentThread ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + if( uxCriticalNesting == 0 ) + { + vPortDisableInterrupts(); + } + + uxCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + + /* If we have reached 0 then re-enable the interrupts. */ + if( uxCriticalNesting == 0 ) + { + vPortEnableInterrupts(); + } +} +/*-----------------------------------------------------------*/ + +static void prvPortYieldFromISR( void ) +{ + Thread_t * xThreadToSuspend; + Thread_t * xThreadToResume; + + xThreadToSuspend = prvGetThreadFromTask( xTaskGetCurrentTaskHandle() ); + + vTaskSwitchContext(); + + xThreadToResume = prvGetThreadFromTask( xTaskGetCurrentTaskHandle() ); + + prvSwitchThread( xThreadToResume, xThreadToSuspend ); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + vPortEnterCritical(); + + prvPortYieldFromISR(); + + vPortExitCritical(); +} +/*-----------------------------------------------------------*/ + +void vPortDisableInterrupts( void ) +{ + pthread_sigmask( SIG_BLOCK, &xAllSignals, NULL ); +} +/*-----------------------------------------------------------*/ + +void vPortEnableInterrupts( void ) +{ + pthread_sigmask( SIG_UNBLOCK, &xAllSignals, NULL ); +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xPortSetInterruptMask( void ) +{ + /* Interrupts are always disabled inside ISRs (signals + * handlers). */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortClearInterruptMask( portBASE_TYPE xMask ) +{ + ( void ) xMask; +} +/*-----------------------------------------------------------*/ + +static uint64_t prvGetTimeNs( void ) +{ + struct timespec t; + + clock_gettime( CLOCK_MONOTONIC, &t ); + + return t.tv_sec * 1000000000ULL + t.tv_nsec; +} + +static uint64_t prvStartTimeNs; + +/* commented as part of the code below in vPortSystemTickHandler, + * to adjust timing according to full demo requirements */ +/* static uint64_t prvTickCount; */ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + struct itimerval itimer; + int iRet; + + /* Initialise the structure with the current timer information. */ + iRet = getitimer( ITIMER_REAL, &itimer ); + + if( iRet == -1 ) + { + prvFatalError( "getitimer", errno ); + } + + /* Set the interval between timer events. */ + itimer.it_interval.tv_sec = 0; + itimer.it_interval.tv_usec = portTICK_RATE_MICROSECONDS; + + /* Set the current count-down. */ + itimer.it_value.tv_sec = 0; + itimer.it_value.tv_usec = portTICK_RATE_MICROSECONDS; + + /* Set-up the timer interrupt. */ + iRet = setitimer( ITIMER_REAL, &itimer, NULL ); + + if( iRet == -1 ) + { + prvFatalError( "setitimer", errno ); + } + + prvStartTimeNs = prvGetTimeNs(); +} +/*-----------------------------------------------------------*/ + +static void vPortSystemTickHandler( int sig ) +{ + Thread_t * pxThreadToSuspend; + Thread_t * pxThreadToResume; + + ( void ) sig; + +/* uint64_t xExpectedTicks; */ + + uxCriticalNesting++; /* Signals are blocked in this signal handler. */ + + #if ( configUSE_PREEMPTION == 1 ) + pxThreadToSuspend = prvGetThreadFromTask( xTaskGetCurrentTaskHandle() ); + #endif + + /* Tick Increment, accounting for any lost signals or drift in + * the timer. */ + +/* + * Comment code to adjust timing according to full demo requirements + * xExpectedTicks = (prvGetTimeNs() - prvStartTimeNs) + * / (portTICK_RATE_MICROSECONDS * 1000); + * do { */ + xTaskIncrementTick(); + +/* prvTickCount++; + * } while (prvTickCount < xExpectedTicks); + */ + + #if ( configUSE_PREEMPTION == 1 ) + /* Select Next Task. */ + vTaskSwitchContext(); + + pxThreadToResume = prvGetThreadFromTask( xTaskGetCurrentTaskHandle() ); + + prvSwitchThread( pxThreadToResume, pxThreadToSuspend ); + #endif + + uxCriticalNesting--; +} +/*-----------------------------------------------------------*/ + +void vPortThreadDying( void * pxTaskToDelete, + volatile BaseType_t * pxPendYield ) +{ + Thread_t * pxThread = prvGetThreadFromTask( pxTaskToDelete ); + + ( void ) pxPendYield; + + pxThread->xDying = pdTRUE; +} + +void vPortCancelThread( void * pxTaskToDelete ) +{ + Thread_t * pxThreadToCancel = prvGetThreadFromTask( pxTaskToDelete ); + + /* + * The thread has already been suspended so it can be safely cancelled. + */ + pthread_cancel( pxThreadToCancel->pthread ); + pthread_join( pxThreadToCancel->pthread, NULL ); + event_delete( pxThreadToCancel->ev ); +} +/*-----------------------------------------------------------*/ + +static void * prvWaitForStart( void * pvParams ) +{ + Thread_t * pxThread = pvParams; + + prvSuspendSelf( pxThread ); + + /* Resumed for the first time, unblocks all signals. */ + uxCriticalNesting = 0; + vPortEnableInterrupts(); + + /* Call the task's entry point. */ + pxThread->pxCode( pxThread->pvParams ); + + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). Artificially force an assert() + * to be triggered if configASSERT() is defined, so application writers can + * catch the error. */ + configASSERT( pdFALSE ); + + return NULL; +} +/*-----------------------------------------------------------*/ + +static void prvSwitchThread( Thread_t * pxThreadToResume, + Thread_t * pxThreadToSuspend ) +{ + BaseType_t uxSavedCriticalNesting; + + if( pxThreadToSuspend != pxThreadToResume ) + { + /* + * Switch tasks. + * + * The critical section nesting is per-task, so save it on the + * stack of the current (suspending thread), restoring it when + * we switch back to this task. + */ + uxSavedCriticalNesting = uxCriticalNesting; + + prvResumeThread( pxThreadToResume ); + + if( pxThreadToSuspend->xDying == pdTRUE ) + { + pthread_exit( NULL ); + } + + prvSuspendSelf( pxThreadToSuspend ); + + uxCriticalNesting = uxSavedCriticalNesting; + } +} +/*-----------------------------------------------------------*/ + +static void prvSuspendSelf( Thread_t * thread ) +{ + /* + * Suspend this thread by waiting for a pthread_cond_signal event. + * + * A suspended thread must not handle signals (interrupts) so + * all signals must be blocked by calling this from: + * + * - Inside a critical section (vPortEnterCritical() / + * vPortExitCritical()). + * + * - From a signal handler that has all signals masked. + * + * - A thread with all signals blocked with pthread_sigmask(). + */ + event_wait( thread->ev ); +} + +/*-----------------------------------------------------------*/ + +static void prvResumeThread( Thread_t * xThreadId ) +{ + if( pthread_self() != xThreadId->pthread ) + { + event_signal( xThreadId->ev ); + } +} +/*-----------------------------------------------------------*/ + +static void prvSetupSignalsAndSchedulerPolicy( void ) +{ + struct sigaction sigtick; + int iRet; + + hMainThread = pthread_self(); + + /* Initialise common signal masks. */ + sigfillset( &xAllSignals ); + + /* Don't block SIGINT so this can be used to break into GDB while + * in a critical section. */ + sigdelset( &xAllSignals, SIGINT ); + + /* + * Block all signals in this thread so all new threads + * inherits this mask. + * + * When a thread is resumed for the first time, all signals + * will be unblocked. + */ + ( void ) pthread_sigmask( SIG_SETMASK, + &xAllSignals, + &xSchedulerOriginalSignalMask ); + + sigtick.sa_flags = 0; + sigtick.sa_handler = vPortSystemTickHandler; + sigfillset( &sigtick.sa_mask ); + + iRet = sigaction( SIGALRM, &sigtick, NULL ); + + if( iRet == -1 ) + { + prvFatalError( "sigaction", errno ); + } +} +/*-----------------------------------------------------------*/ + +unsigned long ulPortGetRunTime( void ) +{ + struct tms xTimes; + + times( &xTimes ); + + return ( unsigned long ) xTimes.tms_utime; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/portmacro.h new file mode 100644 index 0000000..7e6f6a5 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/portmacro.h @@ -0,0 +1,135 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright 2020 Cambridge Consultants Ltd. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned long +#define portBASE_TYPE long +#define portPOINTER_SIZE_TYPE intptr_t + +typedef portSTACK_TYPE StackType_t; +typedef long BaseType_t; +typedef unsigned long UBaseType_t; + +typedef unsigned long TickType_t; +#define portMAX_DELAY ( TickType_t ) ULONG_MAX + +#define portTICK_TYPE_IS_ATOMIC 1 + +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portHAS_STACK_OVERFLOW_CHECKING ( 1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portTICK_RATE_MICROSECONDS ( ( portTickType ) 1000000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +extern void vPortYield( void ); + +#define portYIELD() vPortYield() + +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) vPortYield() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortDisableInterrupts( void ); +extern void vPortEnableInterrupts( void ); +#define portSET_INTERRUPT_MASK() ( vPortDisableInterrupts() ) +#define portCLEAR_INTERRUPT_MASK() ( vPortEnableInterrupts() ) + +extern portBASE_TYPE xPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( portBASE_TYPE xMask ); + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +#define portSET_INTERRUPT_MASK_FROM_ISR() xPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) +#define portDISABLE_INTERRUPTS() portSET_INTERRUPT_MASK() +#define portENABLE_INTERRUPTS() portCLEAR_INTERRUPT_MASK() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +extern void vPortThreadDying( void *pxTaskToDelete, volatile BaseType_t *pxPendYield ); +extern void vPortCancelThread( void *pxTaskToDelete ); +#define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxPendYield ) vPortThreadDying( ( pvTaskToDelete ), ( pxPendYield ) ) +#define portCLEAN_UP_TCB( pxTCB ) vPortCancelThread( pxTCB ) +/*-----------------------------------------------------------*/ + +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* + * Tasks run in their own pthreads and context switches between them + * are always a full memory barrier. ISRs are emulated as signals + * which also imply a full memory barrier. + * + * Thus, only a compilier barrier is needed to prevent the compiler + * reordering. + */ +#define portMEMORY_BARRIER() __asm volatile( "" ::: "memory" ) + +extern unsigned long ulPortGetRunTime( void ); +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() /* no-op */ +#define portGET_RUN_TIME_COUNTER_VALUE() ulPortGetRunTime() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c new file mode 100644 index 0000000..aa9dbc3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c @@ -0,0 +1,104 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include +#include +#include + +#include "wait_for_event.h" + +struct event +{ + pthread_mutex_t mutex; + pthread_cond_t cond; + bool event_triggered; +}; + +struct event * event_create( void ) +{ + struct event * ev = malloc( sizeof( struct event ) ); + + ev->event_triggered = false; + pthread_mutex_init( &ev->mutex, NULL ); + pthread_cond_init( &ev->cond, NULL ); + return ev; +} + +void event_delete( struct event * ev ) +{ + pthread_mutex_destroy( &ev->mutex ); + pthread_cond_destroy( &ev->cond ); + free( ev ); +} + +bool event_wait( struct event * ev ) +{ + pthread_mutex_lock( &ev->mutex ); + + while( ev->event_triggered == false ) + { + pthread_cond_wait( &ev->cond, &ev->mutex ); + } + + ev->event_triggered = false; + pthread_mutex_unlock( &ev->mutex ); + return true; +} +bool event_wait_timed( struct event * ev, + time_t ms ) +{ + struct timespec ts; + int ret = 0; + + clock_gettime( CLOCK_REALTIME, &ts ); + ts.tv_sec += ms / 1000; + ts.tv_nsec += ((ms % 1000) * 1000000); + pthread_mutex_lock( &ev->mutex ); + + while( (ev->event_triggered == false) && (ret == 0) ) + { + ret = pthread_cond_timedwait( &ev->cond, &ev->mutex, &ts ); + + if( ( ret == -1 ) && ( errno == ETIMEDOUT ) ) + { + return false; + } + } + + ev->event_triggered = false; + pthread_mutex_unlock( &ev->mutex ); + return true; +} + +void event_signal( struct event * ev ) +{ + pthread_mutex_lock( &ev->mutex ); + ev->event_triggered = true; + pthread_cond_signal( &ev->cond ); + pthread_mutex_unlock( &ev->mutex ); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h new file mode 100644 index 0000000..adb0149 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h @@ -0,0 +1,46 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef _WAIT_FOR_EVENT_H_ +#define _WAIT_FOR_EVENT_H_ + +#include +#include + +struct event; + +struct event * event_create( void ); +void event_delete( struct event * ); +bool event_wait( struct event * ev ); +bool event_wait_timed( struct event * ev, + time_t ms ); +void event_signal( struct event * ev ); + + + +#endif /* ifndef _WAIT_FOR_EVENT_H_ */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt new file mode 100644 index 0000000..f4054ee --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt @@ -0,0 +1,6 @@ +The official and MIT licensed FreeRTOS ports for RISC-V are located in the following directories: +\FreeRTOS\Source\portable\GCC\RISC-V +\FreeRTOS\Source\portable\IAR\RISC-V + +Also so https://www.FreeRTOS.org/Using-FreeRTOS-on-RISC-V.html + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/.gitignore b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/.gitignore new file mode 100644 index 0000000..35eb919 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/.gitignore @@ -0,0 +1,2 @@ +**/cmake-* +.idea diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/CMakeLists.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/CMakeLists.txt new file mode 100644 index 0000000..c953f75 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/CMakeLists.txt @@ -0,0 +1,51 @@ +cmake_minimum_required(VERSION 3.13) + +if (NOT TARGET _FreeRTOS_kernel_inclusion_marker) + add_library(_FreeRTOS_kernel_inclusion_marker INTERFACE) + + # Pull in PICO SDK (must be before project) + include(pico_sdk_import.cmake) + if (PICO_SDK_VERSION_STRING VERSION_LESS "1.2.0") + message(FATAL_ERROR "Require at least Raspberry Pi Pico SDK version 1.2.0") + endif() + + if (NOT FREERTOS_KERNEL_PATH) + get_filename_component(FREERTOS_KERNEL_PATH ${CMAKE_CURRENT_LIST_DIR}/../../../.. REALPATH) + endif () + + message(DEBUG "FREERTOS_KERNEL_PATH is ${FREERTOS_KERNEL_PATH}") + project(FreeRTOS-Kernel C CXX) + + set(CMAKE_C_STANDARD 11) + set(CMAKE_CXX_STANDARD 17) + + pico_is_top_level_project(FREERTOS_KERNEL_TOP_LEVEL_PROJECT) + + # if the SDK has already been initialized, then just add our libraries now - this allows + # this FreeRTOS port to just be added as a sub-directory or include within another project, rather than + # having to include it at the top level before pico_sdk_init() + if (TARGET _pico_sdk_inclusion_marker) + if (PICO_SDK_VERSION_STRING VERSION_LESS "1.3.2") + message(FATAL_ERROR "Require at least Raspberry Pi Pico SDK version 1.3.2 to include FreeRTOS after pico_sdk_init()") + endif() + include(${CMAKE_CURRENT_LIST_DIR}/library.cmake) + else() + # The real work gets done in library.cmake which is called at the end of pico_sdk_init + list(APPEND PICO_SDK_POST_LIST_FILES ${CMAKE_CURRENT_LIST_DIR}/library.cmake) + if (PICO_SDK_VERSION_STRING VERSION_LESS "1.3.2") + # We need to inject the following header file into ALL SDK files (which we do via the config header) + list(APPEND PICO_CONFIG_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/include/freertos_sdk_config.h) + endif() + + if (FREERTOS_KERNEL_TOP_LEVEL_PROJECT) + message("FreeRTOS: initialize SDK since we're the top-level") + # Initialize the SDK + pico_sdk_init() + else() + set(FREERTOS_KERNEL_PATH ${FREERTOS_KERNEL_PATH} PARENT_SCOPE) + set(PICO_CONFIG_HEADER_FILES ${PICO_CONFIG_HEADER_FILES} PARENT_SCOPE) + set(PICO_SDK_POST_LIST_FILES ${PICO_SDK_POST_LIST_FILES} PARENT_SCOPE) + endif() + endif() +endif() + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake new file mode 100644 index 0000000..1f0bf11 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake @@ -0,0 +1,61 @@ +# This is a copy of /portable/ThirdParty/GCC/RP2040/FREERTOS_KERNEL_import.cmake + +# This can be dropped into an external project to help locate the FreeRTOS kernel +# It should be include()ed prior to project(). Alternatively this file may +# or the CMakeLists.txt in this directory may be included or added via add_subdirectory +# respectively. + +if (DEFINED ENV{FREERTOS_KERNEL_PATH} AND (NOT FREERTOS_KERNEL_PATH)) + set(FREERTOS_KERNEL_PATH $ENV{FREERTOS_KERNEL_PATH}) + message("Using FREERTOS_KERNEL_PATH from environment ('${FREERTOS_KERNEL_PATH}')") +endif () + +set(FREERTOS_KERNEL_RP2040_RELATIVE_PATH "portable/ThirdParty/GCC/RP2040") +# undo the above +set(FREERTOS_KERNEL_RP2040_BACK_PATH "../../../..") + +if (NOT FREERTOS_KERNEL_PATH) + # check if we are inside the FreeRTOS kernel tree (i.e. this file has been included directly) + get_filename_component(_ACTUAL_PATH ${CMAKE_CURRENT_LIST_DIR} REALPATH) + get_filename_component(_POSSIBLE_PATH ${CMAKE_CURRENT_LIST_DIR}/${FREERTOS_KERNEL_RP2040_BACK_PATH}/${FREERTOS_KERNEL_RP2040_RELATIVE_PATH} REALPATH) + if (_ACTUAL_PATH STREQUAL _POSSIBLE_PATH) + get_filename_component(FREERTOS_KERNEL_PATH ${CMAKE_CURRENT_LIST_DIR}/${FREERTOS_KERNEL_RP2040_BACK_PATH} REALPATH) + endif() + if (_ACTUAL_PATH STREQUAL _POSSIBLE_PATH) + get_filename_component(FREERTOS_KERNEL_PATH ${CMAKE_CURRENT_LIST_DIR}/${FREERTOS_KERNEL_RP2040_BACK_PATH} REALPATH) + message("Setting FREERTOS_KERNEL_PATH to ${FREERTOS_KERNEL_PATH} based on location of FreeRTOS-Kernel-import.cmake") + elseif (PICO_SDK_PATH AND EXISTS "${PICO_SDK_PATH}/../FreeRTOS-Kernel") + set(FREERTOS_KERNEL_PATH ${PICO_SDK_PATH}/../FreeRTOS-Kernel) + message("Defaulting FREERTOS_KERNEL_PATH as sibling of PICO_SDK_PATH: ${FREERTOS_KERNEL_PATH}") + endif() +endif () + +if (NOT FREERTOS_KERNEL_PATH) + foreach(POSSIBLE_SUFFIX Source FreeRTOS-Kernel FreeRTOS/Source) + # check if FreeRTOS-Kernel exists under directory that included us + set(SEARCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) + get_filename_component(_POSSIBLE_PATH ${SEARCH_ROOT}/${POSSIBLE_SUFFIX} REALPATH) + if (EXISTS ${_POSSIBLE_PATH}/${FREERTOS_KERNEL_RP2040_RELATIVE_PATH}/CMakeLists.txt) + get_filename_component(FREERTOS_KERNEL_PATH ${_POSSIBLE_PATH} REALPATH) + message("Setting FREERTOS_KERNEL_PATH to '${FREERTOS_KERNEL_PATH}' found relative to enclosing project") + break() + endif() + endforeach() +endif() + +if (NOT FREERTOS_KERNEL_PATH) + message(FATAL_ERROR "FreeRTOS location was not specified. Please set FREERTOS_KERNEL_PATH.") +endif() + +set(FREERTOS_KERNEL_PATH "${FREERTOS_KERNEL_PATH}" CACHE PATH "Path to the FreeRTOS Kernel") + +get_filename_component(FREERTOS_KERNEL_PATH "${FREERTOS_KERNEL_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +if (NOT EXISTS ${FREERTOS_KERNEL_PATH}) + message(FATAL_ERROR "Directory '${FREERTOS_KERNEL_PATH}' not found") +endif() +if (NOT EXISTS ${FREERTOS_KERNEL_PATH}/${FREERTOS_KERNEL_RP2040_RELATIVE_PATH}/CMakeLists.txt) + message(FATAL_ERROR "Directory '${FREERTOS_KERNEL_PATH}' does not contain an RP2040 port here: ${FREERTOS_KERNEL_RP2040_RELATIVE_PATH}") +endif() +set(FREERTOS_KERNEL_PATH ${FREERTOS_KERNEL_PATH} CACHE PATH "Path to the FreeRTOS_KERNEL" FORCE) + +add_subdirectory(${FREERTOS_KERNEL_PATH}/${FREERTOS_KERNEL_RP2040_RELATIVE_PATH} FREERTOS_KERNEL) \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/LICENSE.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/LICENSE.md new file mode 100644 index 0000000..62cf255 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/LICENSE.md @@ -0,0 +1,23 @@ +BSD-3-Clause License + +Copyright (c) 2020-2021 Raspberry Pi (Trading) Ltd. + +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 the copyright holder 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. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/README.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/README.md new file mode 100644 index 0000000..c50cb4e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/README.md @@ -0,0 +1,42 @@ +## Overview + +This directory provides a FreeRTOS-Kernel port that can be used with the Raspberry Pi Pico SDK. It supports: + + * Simple CMake INTERFACE libraries, to provide the FreeRTOS-Kernel and also the individual allocator types, without copying code into the user's project. + * Running the FreeRTOS-Kernel and tasks on either core 0 or core 1 + * Use of SDK synchronization primitives (such as mutexes, semaphores, queues from pico_sync) between FreeRTOS tasks and code executing on the other core, or in IRQ handlers. + +Note that a FreeRTOS SMP version of this port is also available in the FreeRTOS-Kernel smp branch, which additionally supports utilizing both RP2040 CPU cores for FreeRTOS tasks simultaneously. + +## Using this port + +You can copy [FreeRTOS-Kernel-import.cmake](FreeRTOS-Kernel-import.cmake) into your project, and +add the following in your `CMakeLists.txt`: + +```cmake +include(FreeRTOS_Kernel_import.cmake) +``` + +This will locate the FreeRTOS kernel if it is a direct sub-module of your project, or if you provide the +`FREERTOS_KERNEL_PATH` variable in your environment or via `-DFREERTOS_KERNEL_PATH=/path/to/FreeRTOS-Kernel` on the CMake command line. + +**NOTE:** If you are using version 1.3.1 or older of the Raspberry Pi Pico SDK then this line must appear before the +`pico_sdk_init()` and will cause FreeRTOS to be included/required in all RP2040 targets in your project. After this SDK +version, you can include the FreeRTOS-Kernel support later in your CMake build (possibly in a subdirectory) and the +FreeRTOS-Kernel support will only apply to those targets which explicitly include FreeRTOS support. + +As an alternative to the `import` statement above, you can just add this directory directly via thw following (with +the same placement restrictions related to the Raspberry Pi Pico SDK version above): + +```cmake +add_subdirectory(path/to/this/directory FreeRTOS-Kernel) +``` + + +## Advanced Configuration + +Some additional `config` options are defined [here](include/rp2040_config.h) which control some low level implementation details. + +## Known Limitations + +- Tickless idle has not currently been tested, and is likely non-functional diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c new file mode 100644 index 0000000..af5fb22 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c @@ -0,0 +1,52 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + */ + +#include "FreeRTOS.h" + +void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, + StackType_t **ppxIdleTaskStackBuffer, + uint32_t *pulIdleTaskStackSize ) +{ + /* If the buffers to be provided to the Idle task are declared inside this + function then they must be declared static - otherwise they will be allocated on + the stack and so not exists after this function exits. */ + static StaticTask_t xIdleTaskTCB; + static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ]; + + /* Pass out a pointer to the StaticTask_t structure in which the Idle task's + state will be stored. */ + *ppxIdleTaskTCBBuffer = &xIdleTaskTCB; + + /* Pass out the array that will be used as the Idle task's stack. */ + *ppxIdleTaskStackBuffer = uxIdleTaskStack; + + /* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer. + Note that, as the array is necessarily of type StackType_t, + configMINIMAL_STACK_SIZE is specified in words, not bytes. */ + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h new file mode 100644 index 0000000..8eb39f6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h @@ -0,0 +1,73 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + */ + +#ifndef FREERTOS_SDK_CONFIG_H +#define FREERTOS_SDK_CONFIG_H + +#ifndef __ASSEMBLER__ + #include "FreeRTOSConfig.h" + #include "rp2040_config.h" + #ifndef PICO_USE_MALLOC_MUTEX + // malloc needs to be made thread safe + #define PICO_USE_MALLOC_MUTEX 1 + #endif /* PICO_USE_MALLOC_MUTEX */ + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + // increase the amount of time it may reasonably take to wake us up + #ifndef PICO_TIME_SLEEP_OVERHEAD_ADJUST_US + #define PICO_TIME_SLEEP_OVERHEAD_ADJUST_US 150 + #endif + + #define lock_owner_id_t uint32_t + extern uint32_t ulPortLockGetCurrentOwnerId(void); + #define lock_get_caller_owner_id() ulPortLockGetCurrentOwnerId() + #define LOCK_INVALID_OWNER_ID ((uint32_t)-1) + + struct lock_core; + #ifndef lock_internal_spin_unlock_with_wait + extern void vPortLockInternalSpinUnlockWithWait( struct lock_core *pxLock, uint32_t ulSave); + #define lock_internal_spin_unlock_with_wait(lock, save) vPortLockInternalSpinUnlockWithWait(lock, save) + #endif + + #ifndef lock_internal_spin_unlock_with_notify + extern void vPortLockInternalSpinUnlockWithNotify( struct lock_core *pxLock, uint32_t save); + #define lock_internal_spin_unlock_with_notify(lock, save) vPortLockInternalSpinUnlockWithNotify(lock, save); + #endif + + #ifndef lock_internal_spin_unlock_with_best_effort_wait_or_timeout + extern bool xPortLockInternalSpinUnlockWithBestEffortWaitOrTimeout( struct lock_core *pxLock, uint32_t ulSave, absolute_time_t uxUntil); + #define lock_internal_spin_unlock_with_best_effort_wait_or_timeout(lock, save, until) \ + xPortLockInternalSpinUnlockWithBestEffortWaitOrTimeout(lock, save, until) + #endif + #endif /* configSUPPORT_PICO_SYNC_INTEROP */ + + #if ( configSUPPORT_PICO_TIME_INTEROP == 1 ) + extern void xPortSyncInternalYieldUntilBefore(absolute_time_t t); + #define sync_internal_yield_until_before(t) xPortSyncInternalYieldUntilBefore(t) + #endif /* configSUPPORT_PICO_TIME_INTEROP */ +#endif /* __ASSEMBLER__ */ +#endif \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/portmacro.h new file mode 100644 index 0000000..9fa4c0c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/portmacro.h @@ -0,0 +1,151 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H + #define PORTMACRO_H + + #ifdef __cplusplus + extern "C" { + #endif + + #include "pico.h" +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + #define portCHAR char + #define portFLOAT float + #define portDOUBLE double + #define portLONG long + #define portSHORT short + #define portSTACK_TYPE uint32_t + #define portBASE_TYPE long + + typedef portSTACK_TYPE StackType_t; + typedef int32_t BaseType_t; + typedef uint32_t UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + +/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do + * not need to be guarded with a critical section. */ + #define portTICK_TYPE_IS_ATOMIC 1 + #endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 8 + #define portDONT_DISCARD __attribute__( ( used ) ) + /* We have to use PICO_DIVIDER_DISABLE_INTERRUPTS as the source of truth rathern than our config, + * as our FreeRTOSConfig.h header cannot be included by ASM code - which is what this affects in the SDK */ + #define portUSE_DIVIDER_SAVE_RESTORE !PICO_DIVIDER_DISABLE_INTERRUPTS + #if portUSE_DIVIDER_SAVE_RESTORE + #define portSTACK_LIMIT_PADDING 4 + #endif + +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ + extern void vPortYield( void ); + #define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) + #define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) + #define portYIELD() vPortYield() + #define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT + #define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) + +/*-----------------------------------------------------------*/ + +/* Exception handlers */ + #if (configUSE_DYNAMIC_EXCEPTION_HANDLERS == 0) + /* We only need to override the SDK's weak functions if we want to replace them at compile time */ + #define vPortSVCHandler isr_svcall + #define xPortPendSVHandler isr_pendsv + #define xPortSysTickHandler isr_systick + #endif + + #define portCHECK_IF_IN_ISR() ({ \ + uint32_t ulIPSR; \ + __asm volatile ("mrs %0, IPSR" : "=r" (ulIPSR)::); \ + ((uint8_t)ulIPSR)>0;}) + +/*-----------------------------------------------------------*/ + +/* Critical section management. */ + extern uint32_t ulSetInterruptMaskFromISR( void ) __attribute__( ( naked ) ); + extern void vClearInterruptMaskFromISR( uint32_t ulMask ) __attribute__( ( naked ) ); + #define portSET_INTERRUPT_MASK_FROM_ISR() ulSetInterruptMaskFromISR() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) vClearInterruptMaskFromISR( x ) + + #define portDISABLE_INTERRUPTS() __asm volatile ( " cpsid i " ::: "memory" ) + + extern void vPortEnableInterrupts(); + #define portENABLE_INTERRUPTS() vPortEnableInterrupts() + + extern void vPortEnterCritical( void ); + extern void vPortExitCritical( void ); + #define portENTER_CRITICAL() vPortEnterCritical() + #define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ + #ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) + #endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + + #define portNOP() + + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + #ifdef __cplusplus + } + #endif + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h new file mode 100644 index 0000000..346f748 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h @@ -0,0 +1,70 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + */ + +#ifndef RP2040_CONFIG_H +#define RP2040_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* configUSE_DYNAMIC_EXCEPTION_HANDLERS == 1 means set the exception handlers dynamically on cores + * that need them in case the user has set up distinct vector table offsets per core + */ +#ifndef configUSE_DYNAMIC_EXCEPTION_HANDLERS + #if defined( PICO_NO_RAM_VECTOR_TABLE ) && ( PICO_NO_RAM_VECTOR_TABLE == 1 ) + #define configUSE_DYNAMIC_EXCEPTION_HANDLERS 0 + #else + #define configUSE_DYNAMIC_EXCEPTION_HANDLERS 1 + #endif +#endif + +/* configSUPPORT_PICO_SYNC_INTEROP == 1 means that SDK pico_sync + * sem/mutex/queue etc. will work correctly when called from FreeRTOS tasks + */ +#ifndef configSUPPORT_PICO_SYNC_INTEROP + #if LIB_PICO_SYNC + #define configSUPPORT_PICO_SYNC_INTEROP 1 + #endif +#endif + +/* configSUPPORT_PICO_SYNC_INTEROP == 1 means that SDK pico_time + * sleep_ms/sleep_us/sleep_until will work correctly when called from FreeRTOS + * tasks, and will actually block at the FreeRTOS level + */ +#ifndef configSUPPORT_PICO_TIME_INTEROP + #if LIB_PICO_TIME + #define configSUPPORT_PICO_TIME_INTEROP 1 + #endif +#endif + +#ifdef __cplusplus +}; +#endif + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/library.cmake b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/library.cmake new file mode 100644 index 0000000..902a217 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/library.cmake @@ -0,0 +1,69 @@ +# Copyright (c) 2020 Raspberry Pi (Trading) Ltd. +# +# SPDX-License-Identifier: BSD-3-Clause + +# Called after the Raspberry Pi Pico SDK has been initialized to add our libraries + +add_library(FreeRTOS-Kernel-Core INTERFACE) +target_sources(FreeRTOS-Kernel-Core INTERFACE + ${FREERTOS_KERNEL_PATH}/croutine.c + ${FREERTOS_KERNEL_PATH}/event_groups.c + ${FREERTOS_KERNEL_PATH}/list.c + ${FREERTOS_KERNEL_PATH}/queue.c + ${FREERTOS_KERNEL_PATH}/stream_buffer.c + ${FREERTOS_KERNEL_PATH}/tasks.c + ${FREERTOS_KERNEL_PATH}/timers.c + ) +target_include_directories(FreeRTOS-Kernel-Core INTERFACE ${FREERTOS_KERNEL_PATH}/include) + +if (PICO_SDK_VERSION_STRING VERSION_GREATER_EQUAL "1.3.2") + target_compile_definitions(FreeRTOS-Kernel-Core INTERFACE + PICO_CONFIG_RTOS_ADAPTER_HEADER=${CMAKE_CURRENT_LIST_DIR}/include/freertos_sdk_config.h) +endif() + +add_library(FreeRTOS-Kernel INTERFACE) +target_sources(FreeRTOS-Kernel INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/port.c +) + +target_include_directories(FreeRTOS-Kernel INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/include + ${FREERTOS_CONFIG_FILE_DIRECTORY}) + +target_link_libraries(FreeRTOS-Kernel INTERFACE + FreeRTOS-Kernel-Core + pico_base_headers + hardware_exception) + +target_compile_definitions(FreeRTOS-Kernel INTERFACE + LIB_FREERTOS_KERNEL=1 + FREERTOS_KERNEL_SMP=0 +) + +add_library(FreeRTOS-Kernel-Static INTERFACE) +target_compile_definitions(FreeRTOS-Kernel-Static INTERFACE + configSUPPORT_STATIC_ALLOCATION=1 + ) + +target_sources(FreeRTOS-Kernel-Static INTERFACE ${CMAKE_CURRENT_LIST_DIR}/idle_task_static_memory.c) +target_link_libraries(FreeRTOS-Kernel-Static INTERFACE FreeRTOS-Kernel) + +add_library(FreeRTOS-Kernel-Heap1 INTERFACE) +target_sources(FreeRTOS-Kernel-Heap1 INTERFACE ${FREERTOS_KERNEL_PATH}/portable/MemMang/heap_1.c) +target_link_libraries(FreeRTOS-Kernel-Heap1 INTERFACE FreeRTOS-Kernel) + +add_library(FreeRTOS-Kernel-Heap2 INTERFACE) +target_sources(FreeRTOS-Kernel-Heap2 INTERFACE ${FREERTOS_KERNEL_PATH}/portable/MemMang/heap_2.c) +target_link_libraries(FreeRTOS-Kernel-Heap2 INTERFACE FreeRTOS-Kernel) + +add_library(FreeRTOS-Kernel-Heap3 INTERFACE) +target_sources(FreeRTOS-Kernel-Heap3 INTERFACE ${FREERTOS_KERNEL_PATH}/portable/MemMang/heap_3.c) +target_link_libraries(FreeRTOS-Kernel-Heap3 INTERFACE FreeRTOS-Kernel) + +add_library(FreeRTOS-Kernel-Heap4 INTERFACE) +target_sources(FreeRTOS-Kernel-Heap4 INTERFACE ${FREERTOS_KERNEL_PATH}/portable/MemMang/heap_4.c) +target_link_libraries(FreeRTOS-Kernel-Heap4 INTERFACE FreeRTOS-Kernel) + +add_library(FreeRTOS-Kernel-Heap5 INTERFACE) +target_sources(FreeRTOS-Kernel-Heap5 INTERFACE ${FREERTOS_KERNEL_PATH}/portable/MemMang/heap_5.c) +target_link_libraries(FreeRTOS-Kernel-Heap5 INTERFACE FreeRTOS-Kernel) diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake new file mode 100644 index 0000000..e6c7a66 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake @@ -0,0 +1,66 @@ +# Copyright (c) 2020 Raspberry Pi (Trading) Ltd. +# +# SPDX-License-Identifier: BSD-3-Clause + +# This is a copy of /external/pico_sdk_import.cmake + +# This can be dropped into an external project to help locate this SDK +# It should be include()ed prior to project() + +if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) + set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) + message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT)) + set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT}) + message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH)) + set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH}) + message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") +endif () + +set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") +set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") +set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") + +if (NOT PICO_SDK_PATH) + if (PICO_SDK_FETCH_FROM_GIT) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) + if (PICO_SDK_FETCH_FROM_GIT_PATH) + get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") + endif () + FetchContent_Declare( + pico_sdk + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG master + ) + if (NOT pico_sdk) + message("Downloading Raspberry Pi Pico SDK") + FetchContent_Populate(pico_sdk) + set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) + endif () + set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) + else () + message(FATAL_ERROR + "SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git." + ) + endif () +endif () + +get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +if (NOT EXISTS ${PICO_SDK_PATH}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found") +endif () + +set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake) +if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK") +endif () + +set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE) + +include(${PICO_SDK_INIT_CMAKE_FILE}) diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/port.c new file mode 100644 index 0000000..328d112 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/port.c @@ -0,0 +1,876 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright (c) 2021 Raspberry Pi (Trading) Ltd. + * + * SPDX-License-Identifier: MIT AND BSD-3-Clause + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/*---------------------------------------------------------------------- +* Implementation of functions defined in portable.h for the RP2040 port. +*----------------------------------------------------------------------*/ + +#include "FreeRTOS.h" +#include "task.h" +#include "rp2040_config.h" +#include "hardware/clocks.h" +#include "hardware/exception.h" + +/* + * LIB_PICO_MULTICORE == 1, if we are linked with pico_multicore (note that + * the non SMP FreeRTOS_Kernel is not linked with pico_multicore itself). We + * use this flag to determine if we need multi-core functionality. + */ +#if ( LIB_PICO_MULTICORE == 1) + #include "pico/multicore.h" +#endif /* LIB_PICO_MULTICORE */ + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( *( ( volatile uint32_t * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( *( ( volatile uint32_t * ) 0xe000e018 ) ) +#define portNVIC_INT_CTRL_REG ( *( ( volatile uint32_t * ) 0xe000ed04 ) ) +#define portNVIC_SHPR3_REG ( *( ( volatile uint32_t * ) 0xe000ed20 ) ) +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portMIN_INTERRUPT_PRIORITY ( 255UL ) +#define portNVIC_PENDSV_PRI ( portMIN_INTERRUPT_PRIORITY << 16UL ) +#define portNVIC_SYSTICK_PRI ( portMIN_INTERRUPT_PRIORITY << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have + * occurred while the SysTick counter is stopped during tickless idle + * calculations. */ +#ifndef portMISSED_COUNTS_FACTOR + #define portMISSED_COUNTS_FACTOR ( 45UL ) +#endif + +/* Let the user override the pre-loading of the initial LR with the address of + * prvTaskExitError() in case it messes up unwinding of the stack in the + * debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__( ( naked ) ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void vPortStartFirstTask( void ) __attribute__( ( naked ) ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* Each task maintains its own interrupt status in the critical nesting + * variable. This is initialized to 0 to allow vPortEnter/ExitCritical + * to be called before the scheduler is started */ +static UBaseType_t uxCriticalNesting; + +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + #include "pico/lock_core.h" + #include "hardware/irq.h" + #include "event_groups.h" + #if configSUPPORT_STATIC_ALLOCATION + static StaticEventGroup_t xStaticEventGroup; + #define pEventGroup (&xStaticEventGroup) + #endif /* configSUPPORT_STATIC_ALLOCATION */ + static EventGroupHandle_t xEventGroup; + #if ( LIB_PICO_MULTICORE == 1 ) + static EventBits_t uxCrossCoreEventBits; + static spin_lock_t * pxCrossCoreSpinLock; + #endif /* LIB_PICO_MULTICORE */ + + static spin_lock_t * pxYieldSpinLock; + static uint32_t ulYieldSpinLockSaveValue; +#endif /* configSUPPORT_PICO_SYNC_INTEROP */ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if ( configUSE_TICKLESS_IDLE == 1 ) + static uint32_t ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +#define INVALID_LAUNCH_CORE_NUM 0xffu +static uint8_t ucLaunchCoreNum = INVALID_LAUNCH_CORE_NUM; +#define portIS_FREE_RTOS_CORE() ( ucLaunchCoreNum == get_core_num() ) + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + * interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11..R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + * its caller as there is nothing to return to. If a task wants to exit it + * should instead call vTaskDelete( NULL ). */ + panic_unsupported(); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* This function is no longer used, but retained for backward + * compatibility. */ +} +/*-----------------------------------------------------------*/ + +void vPortStartFirstTask( void ) +{ + __asm volatile ( + " .syntax unified \n" + " ldr r2, pxCurrentTCBConst1 \n"/* Obtain location of pxCurrentTCB. */ + " ldr r3, [r2] \n" + " ldr r0, [r3] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, #32 \n"/* Discard everything up to r0. */ + " msr psp, r0 \n"/* This is now the new top of stack to use in the task. */ + " movs r0, #2 \n"/* Switch to the psp stack. */ + " msr CONTROL, r0 \n" + " isb \n" + " pop {r0-r5} \n"/* Pop the registers that are saved automatically. */ + " mov lr, r5 \n"/* lr is now in r5. */ + " pop {r3} \n"/* Return address is now in r3. */ + " pop {r2} \n"/* Pop and discard XPSR. */ + " cpsie i \n"/* The first task has its context and interrupts can be enabled. */ + " bx r3 \n"/* Finally, jump to the user defined task code. */ + " .align 4 \n" + "pxCurrentTCBConst1: .word pxCurrentTCB\n" + ); +} +/*-----------------------------------------------------------*/ + +#if ( LIB_PICO_MULTICORE == 1 ) && ( configSUPPORT_PICO_SYNC_INTEROP == 1) + static void prvFIFOInterruptHandler() + { + /* We must remove the contents (which we don't care about) + * to clear the IRQ */ + multicore_fifo_drain(); + multicore_fifo_clear_irq(); + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + uint32_t ulSave = spin_lock_blocking( pxCrossCoreSpinLock ); + EventBits_t ulBits = uxCrossCoreEventBits; + uxCrossCoreEventBits &= ~ulBits; + spin_unlock( pxCrossCoreSpinLock, ulSave ); + xEventGroupSetBitsFromISR( xEventGroup, ulBits, &xHigherPriorityTaskWoken ); + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + } +#endif + +/* + * See header file for description. + */ +BaseType_t xPortStartScheduler( void ) +{ + /* Make PendSV, CallSV and SysTick the same priority as the kernel. */ + portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI; + portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI; + + #if (configUSE_DYNAMIC_EXCEPTION_HANDLERS == 1) + exception_set_exclusive_handler( PENDSV_EXCEPTION, xPortPendSVHandler ); + exception_set_exclusive_handler( SYSTICK_EXCEPTION, xPortSysTickHandler ); + exception_set_exclusive_handler( SVCALL_EXCEPTION, vPortSVCHandler ); + #endif + + /* Start the timer that generates the tick ISR. Interrupts are disabled + * here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + ucLaunchCoreNum = get_core_num(); + #if (LIB_PICO_MULTICORE == 1) + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1) + multicore_fifo_clear_irq(); + multicore_fifo_drain(); + uint32_t irq_num = 15 + get_core_num(); + irq_set_priority( irq_num, portMIN_INTERRUPT_PRIORITY ); + irq_set_exclusive_handler( irq_num, prvFIFOInterruptHandler ); + irq_set_enabled( irq_num, 1 ); + #endif + #endif + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + * exit error function to prevent compiler warnings about a static function + * not being called in the case that the application writer overrides this + * functionality by defining configTASK_RETURN_ADDRESS. Call + * vTaskSwitchContext() so link time optimisation does not remove the + * symbol. */ + vTaskSwitchContext(); + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Not implemented in ports where there is nothing to return to. */ + panic_unsupported(); +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + /* We are not in an ISR, and pxYieldSpinLock is always dealt with and + * cleared interrupts are re-enabled, so should be NULL */ + configASSERT( pxYieldSpinLock == NULL ); + #endif /* configSUPPORT_PICO_SYNC_INTEROP */ + + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + * within the specified behaviour for the architecture. */ + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} + +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + configASSERT( uxCriticalNesting ); + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} + +void vPortEnableInterrupts() { + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + if( pxYieldSpinLock ) + { + spin_unlock(pxYieldSpinLock, ulYieldSpinLockSaveValue); + pxYieldSpinLock = NULL; + } + #endif + __asm volatile ( " cpsie i " ::: "memory" ); +} + +/*-----------------------------------------------------------*/ + +uint32_t ulSetInterruptMaskFromISR( void ) +{ + __asm volatile ( + " mrs r0, PRIMASK \n" + " cpsid i \n" + " bx lr " + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void vClearInterruptMaskFromISR( __attribute__( ( unused ) ) uint32_t ulMask ) +{ + __asm volatile ( + " msr PRIMASK, r0 \n" + " bx lr " + ::: "memory" + ); +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " .syntax unified \n" + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst2 \n"/* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " subs r0, r0, #32 \n"/* Make space for the remaining low registers. */ + " str r0, [r2] \n"/* Save the new top of stack. */ + " stmia r0!, {r4-r7} \n"/* Store the low registers that are not saved automatically. */ + " mov r4, r8 \n"/* Store the high registers. */ + " mov r5, r9 \n" + " mov r6, r10 \n" + " mov r7, r11 \n" + " stmia r0!, {r4-r7} \n" + #if portUSE_DIVIDER_SAVE_RESTORE + " movs r2, #0xd \n"/* Store the divider state. */ + " lsls r2, #28 \n" + /* We expect that the divider is ready at this point (which is + * necessary to safely save/restore), because: + * a) if we have not been interrupted since we entered this method, + * then >8 cycles have clearly passed, so the divider is done + * b) if we were interrupted in the interim, then any "safe" - i.e. + * does the right thing in an IRQ - use of the divider should + * have waited for any in-process divide to complete, saved and + * then fully restored the result, thus the result is ready in + * that case too. */ + " ldr r4, [r2, #0x60] \n"/* SIO_DIV_UDIVIDEND_OFFSET */ + " ldr r5, [r2, #0x64] \n"/* SIO_DIV_UDIVISOR_OFFSET */ + " ldr r6, [r2, #0x74] \n"/* SIO_DIV_REMAINDER_OFFSET */ + " ldr r7, [r2, #0x70] \n"/* SIO_DIV_QUOTIENT_OFFSET */ + /* We actually save the divider state in the 4 words below + * our recorded stack pointer, so as not to disrupt the stack + * frame expected by debuggers - this is addressed by + * portEXTRA_STACK_SIZE */ + " subs r0, r0, #48 \n" + " stmia r0!, {r4-r7} \n" + #endif /* portUSE_DIVIDER_SAVE_RESTORE */ + " push {r3, r14} \n" + " cpsid i \n" + " bl vTaskSwitchContext \n" + " cpsie i \n" + " pop {r2, r3} \n"/* lr goes in r3. r2 now holds tcb pointer. */ + " \n" + " ldr r1, [r2] \n" + " ldr r0, [r1] \n"/* The first item in pxCurrentTCB is the task top of stack. */ + " adds r0, r0, #16 \n"/* Move to the high registers. */ + " ldmia r0!, {r4-r7} \n"/* Pop the high registers. */ + " mov r8, r4 \n" + " mov r9, r5 \n" + " mov r10, r6 \n" + " mov r11, r7 \n" + " \n" + " msr psp, r0 \n"/* Remember the new top of stack for the task. */ + " \n" + #if portUSE_DIVIDER_SAVE_RESTORE + " movs r2, #0xd \n"/* Pop the divider state. */ + " lsls r2, #28 \n" + " subs r0, r0, #48 \n"/* Go back for the divider state */ + " ldmia r0!, {r4-r7} \n"/* Pop the divider state. */ + /* Note always restore via SIO_DIV_UDIVI*, because we will overwrite the + * results stopping the calculation anyway, however the sign of results + * is adjusted by the h/w at read time based on whether the last started + * division was signed and the inputs' signs differed */ + " str r4, [r2, #0x60] \n"/* SIO_DIV_UDIVIDEND_OFFSET */ + " str r5, [r2, #0x64] \n"/* SIO_DIV_UDIVISOR_OFFSET */ + " str r6, [r2, #0x74] \n"/* SIO_DIV_REMAINDER_OFFSET */ + " str r7, [r2, #0x70] \n"/* SIO_DIV_QUOTIENT_OFFSET */ + #else + " subs r0, r0, #32 \n"/* Go back for the low registers that are not automatically restored. */ + #endif /* portUSE_DIVIDER_SAVE_RESTORE */ + " ldmia r0!, {r4-r7} \n"/* Pop low registers. */ + " \n" + " bx r3 \n" + " .align 4 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + uint32_t ulPreviousMask; + + ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if ( configUSE_TICKLESS_IDLE == 1 ) + { + ulTimerCountsForOneTick = ( clock_get_hz(clk_sys) / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR; + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Stop and reset the SysTick. */ + portNVIC_SYSTICK_CTRL_REG = 0UL; + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( clock_get_hz( clk_sys ) / configTICK_RATE_HZ ) - 1UL; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE == 1 ) + + __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) + { + uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + TickType_t xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + * is accounted for as best it can be, but using the tickless mode will + * inevitably result in some tiny drift of the time maintained by the + * kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + * tick periods. -1 is used because this code will execute part way + * through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + * method as that will mask interrupts that should exit sleep mode. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* If a context switch is pending or a task is waiting for the scheduler + * to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + * this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + * periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + * above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + * zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + * set its parameter to 0 to indicate that its implementation contains + * its own wait for interrupt or wait for event instruction, and so wfi + * should not be executed again. However, the original expected idle + * time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + + if( xModifiableIdleTime > 0 ) + { + __asm volatile ( "dsb" ::: "memory" ); + __asm volatile ( "wfi" ); + __asm volatile ( "isb" ); + } + + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Re-enable interrupts to allow the interrupt that brought the MCU + * out of sleep mode to execute immediately. see comments above + * __disable_interrupt() call above. */ + __asm volatile ( "cpsie i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable interrupts again because the clock is about to be stopped + * and interrupts that execute while the clock is stopped will increase + * any slippage between the time maintained by the RTOS and calendar + * time. */ + __asm volatile ( "cpsid i" ::: "memory" ); + __asm volatile ( "dsb" ); + __asm volatile ( "isb" ); + + /* Disable the SysTick clock without reading the + * portNVIC_SYSTICK_CTRL_REG register to ensure the + * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set. Again, + * the time the SysTick is stopped for is accounted for as best it can + * be, but using the tickless mode will inevitably result in some tiny + * drift of the time maintained by the kernel with respect to calendar + * time*/ + portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT ); + + /* Determine if the SysTick clock has already counted to zero and + * been set back to the current reload value (the reload back being + * correct for the entire expected idle time) or if the SysTick is yet + * to count to zero (in which case an interrupt other than the SysTick + * must have brought the system out of sleep mode). */ + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + uint32_t ulCalculatedLoadValue; + + /* The tick interrupt is already pending, and the SysTick count + * reloaded with ulReloadValue. Reset the + * portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + * period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + * underflowed because the post sleep hook did something + * that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* As the pending tick will be processed as soon as this + * function exits, the tick value maintained by the tick is stepped + * forward by one less than the time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + * Work out how long the sleep lasted rounded to complete tick + * periods (not the ulReload value which accounted for part + * ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + * was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + * period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + * again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + * value. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Exit with interrupts enabled. */ + __asm volatile ( "cpsie i" ::: "memory" ); + } + } + +#endif /* configUSE_TICKLESS_IDLE */ + +#if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) || ( configSUPPORT_PICO_TIME_INTEROP == 1 ) + static TickType_t prvGetTicksToWaitBefore( absolute_time_t t ) + { + int64_t xDelay = absolute_time_diff_us(get_absolute_time(), t); + const uint32_t ulTickPeriod = 1000000 / configTICK_RATE_HZ; + xDelay -= ulTickPeriod; + if( xDelay >= ulTickPeriod ) + { + return xDelay / ulTickPeriod; + } + return 0; + } +#endif + +#if ( configSUPPORT_PICO_SYNC_INTEROP == 1 ) + uint32_t ulPortLockGetCurrentOwnerId() + { + if( portIS_FREE_RTOS_CORE()) + { + uint32_t exception = __get_current_exception(); + if( !exception ) + { + return ( uintptr_t ) xTaskGetCurrentTaskHandle(); + } + /* Note: since ROM as at 0x00000000, these can't be confused with + * valid task handles (pointers) in RAM */ + /* We make all exception handler/core combinations distinct owners */ + return get_core_num() + exception * 2; + } + /* Note: since ROM as at 0x00000000, this can't be confused with + * valid task handles (pointers) in RAM */ + return get_core_num(); + } + + static inline EventBits_t prvGetEventGroupBit( spin_lock_t * spinLock ) + { + uint32_t ulBit; + #if ( configUSE_16_BIT_TICKS == 1 ) + ulBit = 1u << (spin_lock_get_num(spinLock) & 0x7u); + #else + ulBit = 1u << spin_lock_get_num(spinLock); + /* reduce to range 0-24 */ + ulBit |= ulBit << 8u; + ulBit >>= 8u; + #endif /* configUSE_16_BIT_TICKS */ + return ( EventBits_t ) ulBit; + } + + static inline EventBits_t prvGetAllEventGroupBits() + { + #if ( configUSE_16_BIT_TICKS == 1 ) + return (EventBits_t) 0xffu; + #else + return ( EventBits_t ) 0xffffffu; + #endif /* configUSE_16_BIT_TICKS */ + } + + void vPortLockInternalSpinUnlockWithWait( struct lock_core * pxLock, uint32_t ulSave ) + { + configASSERT( !portCHECK_IF_IN_ISR() ); + if( !portIS_FREE_RTOS_CORE() ) + { + spin_unlock(pxLock->spin_lock, ulSave ); + __wfe(); + } + else + { + configASSERT( pxYieldSpinLock == NULL ); + + // we want to hold the lock until the event bits have been set; since interrupts are currently disabled + // by the spinlock, we can defer until portENABLE_INTERRUPTS is called which is always called when + // the scheduler is unlocked during this call + configASSERT(pxLock->spin_lock); + pxYieldSpinLock = pxLock->spin_lock; + ulYieldSpinLockSaveValue = ulSave; + xEventGroupWaitBits( xEventGroup, prvGetEventGroupBit(pxLock->spin_lock), + pdTRUE, pdFALSE, portMAX_DELAY); + } + } + + void vPortLockInternalSpinUnlockWithNotify( struct lock_core *pxLock, uint32_t ulSave ) { + EventBits_t uxBits = prvGetEventGroupBit(pxLock->spin_lock ); + if (portIS_FREE_RTOS_CORE()) { + #if LIB_PICO_MULTICORE + /* signal an event in case a regular core is waiting */ + __sev(); + #endif + spin_unlock(pxLock->spin_lock, ulSave ); + if( !portCHECK_IF_IN_ISR() ) + { + xEventGroupSetBits( xEventGroup, uxBits ); + } + else + { + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + xEventGroupSetBitsFromISR( xEventGroup, uxBits, &xHigherPriorityTaskWoken ); + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + } + } + else + { + __sev(); + #if ( LIB_PICO_MULTICORE == 1) + /* We could sent the bits across the FIFO which would have required us to block here if the FIFO was full, + * or we could have just set all bits on the other side, however it seems reasonable instead to take + * the hit of another spin lock to protect an accurate bit set. */ + if( pxCrossCoreSpinLock != pxLock->spin_lock ) + { + spin_lock_unsafe_blocking(pxCrossCoreSpinLock); + uxCrossCoreEventBits |= uxBits; + spin_unlock_unsafe(pxCrossCoreSpinLock); + } + else + { + uxCrossCoreEventBits |= uxBits; + } + /* This causes fifo irq on the other (FreeRTOS) core which will do the set the event bits */ + sio_hw->fifo_wr = 0; + #endif /* LIB_PICO_MULTICORE */ + spin_unlock(pxLock->spin_lock, ulSave); + } + } + + bool xPortLockInternalSpinUnlockWithBestEffortWaitOrTimeout( struct lock_core * pxLock, uint32_t ulSave, absolute_time_t uxUntil ) + { + configASSERT( !portCHECK_IF_IN_ISR() ); + // note no need to check LIB_PICO_MULTICORE, as this is always returns true if that is not defined + if( !portIS_FREE_RTOS_CORE() ) + { + spin_unlock(pxLock->spin_lock, ulSave); + return best_effort_wfe_or_timeout(uxUntil); + } + else + { + configASSERT( pxYieldSpinLock == NULL ); + + TickType_t uxTicksToWait = prvGetTicksToWaitBefore( uxUntil ); + if( uxTicksToWait ) + { + /* We want to hold the lock until the event bits have been set; since interrupts are currently disabled + * by the spinlock, we can defer until portENABLE_INTERRUPTS is called which is always called when + * the scheduler is unlocked during this call */ + configASSERT(pxLock->spin_lock); + pxYieldSpinLock = pxLock->spin_lock; + ulYieldSpinLockSaveValue = ulSave; + xEventGroupWaitBits( xEventGroup, + prvGetEventGroupBit(pxLock->spin_lock), pdTRUE, + pdFALSE, uxTicksToWait ); + /* sanity check that interrupts were disabled, then re-enabled during the call, which will have + * taken care of the yield */ + configASSERT( pxYieldSpinLock == NULL ); + } + else + { + spin_unlock( pxLock->spin_lock, ulSave ); + } + if ( time_reached( uxUntil ) ) + { + return true; + } + else + { + /* We do not want to hog the core */ + portYIELD(); + /* We aren't sure if we've reached the timeout yet; the caller will check */ + return false; + } + } + } + + #if ( configSUPPORT_PICO_SYNC_INTEROP == 1) + /* runs before main */ + static void __attribute__((constructor)) prvRuntimeInitializer( void ) + { + /* This must be done even before the scheduler is started, as the spin lock + * is used by the overrides of the SDK wait/notify primitives */ + #if ( LIB_PICO_MULTICORE == 1 ) + pxCrossCoreSpinLock = spin_lock_instance( next_striped_spin_lock_num() ); + #endif /* portRUNNING_ON_BOTH_CORES */ + + /* The event group is not used prior to scheduler init, but is initialized + * here to since it logically belongs with the spin lock */ + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + xEventGroup = xEventGroupCreateStatic(&xStaticEventGroup); + #else + /* Note that it is slightly dubious calling this here before the scheduler is initialized, + * however the only thing it touches is the allocator which then calls vPortEnterCritical + * and vPortExitCritical, and allocating here saves us checking the one time initialized variable in + * some rather critical code paths */ + xEventGroup = xEventGroupCreate(); + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + #endif +#endif /* configSUPPORT_PICO_SYNC_INTEROP */ + +#if ( configSUPPORT_PICO_TIME_INTEROP == 1 ) + void xPortSyncInternalYieldUntilBefore( absolute_time_t t ) + { + TickType_t uxTicksToWait = prvGetTicksToWaitBefore(t); + if( uxTicksToWait ) + { + vTaskDelay(uxTicksToWait); + } + } +#endif /* configSUPPORT_PICO_TIME_INTEROP */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c new file mode 100644 index 0000000..3b76b5d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c @@ -0,0 +1,27 @@ +/* + * Since at least FreeRTOS V7.5.3 uxTopUsedPriority is no longer + * present in the kernel, so it has to be supplied by other means for + * OpenOCD's threads awareness. + * + * Add this file to your project, and, if you're using --gc-sections, + * ``--undefined=uxTopUsedPriority'' (or + * ``-Wl,--undefined=uxTopUsedPriority'' when using gcc for final + * linking) to your LDFLAGS; same with all the other symbols you need. + */ + +#include "FreeRTOS.h" +#include "esp_attr.h" +#include "sdkconfig.h" + +#ifdef __GNUC__ + #define USED __attribute__( ( used ) ) +#else + #define USED +#endif + +/* + * This file is no longer needed as AFTER FreeRTOS V10.14.1 OpenOCD is fixed in the kernel. + * #ifdef CONFIG_ESP32_DEBUG_OCDAWARE + * const int USED DRAM_ATTR uxTopUsedPriority = configMAX_PRIORITIES - 1; + * #endif + */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h new file mode 100644 index 0000000..07065ef --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h @@ -0,0 +1,134 @@ +/* + * SPDX-FileCopyrightText: 2022 Amazon.com, Inc. or its affiliates + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. If you wish to use our Amazon + * FreeRTOS name, please do so in a fair use way that does not cause confusion. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + * 1 tab == 4 spaces! + */ + +#ifndef FREERTOS_CONFIG_XTENSA_H +#define FREERTOS_CONFIG_XTENSA_H + +#include "sdkconfig.h" + +/* enable use of optimized task selection by the scheduler */ +#if defined (CONFIG_FREERTOS_OPTIMIZED_SCHEDULER) && !defined(configUSE_PORT_OPTIMISED_TASK_SELECTION) +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#endif + +#define XT_USE_THREAD_SAFE_CLIB 0 +#undef XT_USE_SWPRI + +#if CONFIG_FREERTOS_CORETIMER_0 +#define XT_TIMER_INDEX 0 +#elif CONFIG_FREERTOS_CORETIMER_1 +#define XT_TIMER_INDEX 1 +#endif + +#ifndef __ASSEMBLER__ +/** + * This function is defined to provide a deprecation warning whenever + * XT_CLOCK_FREQ macro is used. + * Update the code to use esp_clk_cpu_freq function instead. + * @return current CPU clock frequency, in Hz + */ +int xt_clock_freq(void) __attribute__((deprecated)); + +#define XT_CLOCK_FREQ (xt_clock_freq()) + +#endif // __ASSEMBLER__ + +/* Required for configuration-dependent settings */ +#include + +/* configASSERT behaviour */ +#ifndef __ASSEMBLER__ +#include +#include "esp_rom_sys.h" +#if CONFIG_IDF_TARGET_ESP32 +#include "esp32/rom/ets_sys.h" // will be removed in idf v5.0 +#elif CONFIG_IDF_TARGET_ESP32S2 +#include "esp32s2/rom/ets_sys.h" +#elif CONFIG_IDF_TARGET_ESP32S3 +#include "esp32s3/rom/ets_sys.h" +#endif +#endif // __ASSEMBLER__ + +// If CONFIG_FREERTOS_ASSERT_DISABLE is set then configASSERT is defined empty later in FreeRTOS.h and the macro +// configASSERT_DEFINED remains unset (meaning some warnings are avoided) +#ifdef configASSERT +#undef configASSERT +#if defined(CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE) +#define configASSERT(a) if (unlikely(!(a))) { \ + esp_rom_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__, \ + __FUNCTION__); \ + } +#elif defined(CONFIG_FREERTOS_ASSERT_FAIL_ABORT) +#define configASSERT(a) assert(a) +#endif +#endif + +#if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION +#define UNTESTED_FUNCTION() { esp_rom_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0) +#else +#define UNTESTED_FUNCTION() +#endif + +#define configXT_BOARD 1 /* Board mode */ +#define configXT_SIMULATOR 0 + +/* The maximum interrupt priority from which FreeRTOS.org API functions can + be called. Only API functions that end in ...FromISR() can be used within + interrupts. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY XCHAL_EXCM_LEVEL + +/* Stack alignment, architecture specifc. Must be a power of two. */ +#define configSTACK_ALIGNMENT 16 + + +/* The Xtensa port uses a separate interrupt stack. Adjust the stack size + * to suit the needs of your specific application. + * Size needs to be aligned to the stack increment, since the location of + * the stack for the 2nd CPU will be calculated using configISR_STACK_SIZE. + */ +#ifndef configISR_STACK_SIZE +#define configISR_STACK_SIZE ((CONFIG_FREERTOS_ISR_STACKSIZE + configSTACK_ALIGNMENT - 1) & (~(configSTACK_ALIGNMENT - 1))) +#endif + +#ifndef __ASSEMBLER__ +#if CONFIG_APPTRACE_SV_ENABLE +extern uint32_t port_switch_flag[]; +#define os_task_switch_is_pended(_cpu_) (port_switch_flag[_cpu_]) +#else +#define os_task_switch_is_pended(_cpu_) (false) +#endif +#endif + +#endif // FREERTOS_CONFIG_XTENSA_H diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h new file mode 100644 index 0000000..18b47f3 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2017-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set up the SysTick interrupt + */ +void vPortSetupTimer(void); + +#ifdef __cplusplus +} +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h new file mode 100644 index 0000000..4f14dc4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h @@ -0,0 +1,52 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * This utility helps benchmarking interrupt latency and context switches. + * In order to enable it, set configBENCHMARK to 1 in FreeRTOSConfig.h. + * You will also need to download the FreeRTOS_trace patch that contains + * portbenchmark.c and the complete version of portbenchmark.h + */ + +#ifndef PORTBENCHMARK_H +#define PORTBENCHMARK_H + +#if configBENCHMARK + #error "You need to download the FreeRTOS_trace patch that overwrites this file" +#endif + +#define portbenchmarkINTERRUPT_DISABLE() +#define portbenchmarkINTERRUPT_RESTORE( newstate ) +#define portbenchmarkIntLatency() +#define portbenchmarkIntWait() +#define portbenchmarkReset() +#define portbenchmarkPrint() + +#endif /* PORTBENCHMARK */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h new file mode 100644 index 0000000..03f34bf --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h @@ -0,0 +1,570 @@ +/* + * SPDX-FileCopyrightText: 2017 Amazon.com, Inc. or its affiliates + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. If you wish to use our Amazon + * FreeRTOS name, please do so in a fair use way that does not cause confusion. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + * 1 tab == 4 spaces! + */ + +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ +#ifdef __cplusplus + extern "C" { +#endif +/* *INDENT-ON* */ + +#ifndef __ASSEMBLER__ + + #include + + #include + #include + #include /* required for XSHAL_CLIB */ + #include + #include "soc/spinlock.h" + #include "esp_timer.h" /* required for FreeRTOS run time stats */ + #include "esp_system.h" + #include "esp_idf_version.h" + #include "esp_heap_caps.h" + + /* TODO: Resolve build warnings generated due to this header inclusion */ + #include "hal/cpu_hal.h" + + /* TODO: These includes are not directly used in this file. They are kept into to prevent a breaking change. Remove these. */ + #include + #include + + #include "soc/cpu.h" + #include "soc/soc_memory_layout.h" +#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #include "soc/compare_set.h" +#endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + +/*#include "xtensa_context.h" */ + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + + #define portCHAR int8_t + #define portFLOAT float + #define portDOUBLE double + #define portLONG int32_t + #define portSHORT int16_t + #define portSTACK_TYPE uint8_t + #define portBASE_TYPE int + + typedef portSTACK_TYPE StackType_t; + typedef portBASE_TYPE BaseType_t; + typedef unsigned portBASE_TYPE UBaseType_t; + + #if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff + #else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL + #endif +/*-----------------------------------------------------------*/ + +/* portbenchmark */ + #include "portbenchmark.h" + + #include "sdkconfig.h" + #include "esp_attr.h" + +/* "mux" data structure (spinlock) */ + typedef spinlock_t portMUX_TYPE; /**< Spinlock type used by FreeRTOS critical sections */ + #define portMUX_INITIALIZER_UNLOCKED SPINLOCK_INITIALIZER /**< Spinlock initializer */ + #define portMUX_FREE_VAL SPINLOCK_FREE /**< Spinlock is free. [refactor-todo] check if this is still required */ + #define portMUX_NO_TIMEOUT SPINLOCK_WAIT_FOREVER /**< When passed for 'timeout_cycles', spin forever if necessary. [refactor-todo] check if this is still required */ + #define portMUX_TRY_LOCK SPINLOCK_NO_WAIT /**< Try to acquire the spinlock a single time only. [refactor-todo] check if this is still required */ + #define portMUX_INITIALIZE(mux) spinlock_initialize(mux) /*< Initialize a spinlock to its unlocked state */ + + #define portCRITICAL_NESTING_IN_TCB 1 + +/* + * Modifications to portENTER_CRITICAL. + * + * For an introduction, see "Critical Sections & Disabling Interrupts" in docs/api-guides/freertos-smp.rst + * + * The original portENTER_CRITICAL only disabled the ISRs. This is enough for single-CPU operation: by + * disabling the interrupts, there is no task switch so no other tasks can meddle in the data, and because + * interrupts are disabled, ISRs can't corrupt data structures either. + * + * For multiprocessing, things get a bit more hairy. First of all, disabling the interrupts doesn't stop + * the tasks or ISRs on the other processors meddling with our CPU. For tasks, this is solved by adding + * a spinlock to the portENTER_CRITICAL macro. A task running on the other CPU accessing the same data will + * spinlock in the portENTER_CRITICAL code until the first CPU is done. + * + * For ISRs, we now also need muxes: while portENTER_CRITICAL disabling interrupts will stop ISRs on the same + * CPU from meddling with the data, it does not stop interrupts on the other cores from interfering with the + * data. For this, we also use a spinlock in the routines called by the ISR, but these spinlocks + * do not disable the interrupts (because they already are). + * + * This all assumes that interrupts are either entirely disabled or enabled. Interrupt priority levels + * will break this scheme. + * + * Remark: For the ESP32, portENTER_CRITICAL and portENTER_CRITICAL_ISR both alias vPortEnterCritical, meaning + * that either function can be called both from ISR as well as task context. This is not standard FreeRTOS + * behaviour; please keep this in mind if you need any compatibility with other FreeRTOS implementations. + */ + void vPortCPUInitializeMutex( portMUX_TYPE * mux ); + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + #error CONFIG_FREERTOS_PORTMUX_DEBUG not supported in Amazon FreeRTOS + #endif + + void vTaskExitCritical(); + void vTaskEnterCritical(); + static inline void vPortConsumeSpinlockArg( int unused, + ... ) + { + } + +/** @brief Acquire a portmux spinlock with a timeout + * + * @param mux Pointer to portmux to acquire. + * @param timeout_cycles Timeout to spin, in CPU cycles. Pass portMUX_NO_TIMEOUT to wait forever, + * portMUX_TRY_LOCK to try a single time to acquire the lock. + * + * @return true if mutex is successfully acquired, false on timeout. + */ + bool vPortCPUAcquireMutexTimeout( portMUX_TYPE * mux, + int timeout_cycles ); + void vPortCPUReleaseMutex( portMUX_TYPE * mux ); + + #define portENTER_CRITICAL( ... ) do { vTaskEnterCritical(); vPortConsumeSpinlockArg( 0, ## __VA_ARGS__ ); } while( 0 ) + #define portEXIT_CRITICAL( ... ) do { vTaskExitCritical(); vPortConsumeSpinlockArg( 0, ## __VA_ARGS__ ); } while( 0 ) + + + #define portENTER_CRITICAL_ISR( mux ) vPortCPUAcquireMutexTimeout( mux, portMUX_NO_TIMEOUT ) + #define portEXIT_CRITICAL_ISR( mux ) vPortCPUReleaseMutex( mux ) + + #define portENTER_CRITICAL_SAFE( mux ) \ + do { \ + if( xPortInIsrContext() ) { \ + portENTER_CRITICAL_ISR( mux ); \ + } \ + else { \ + portENTER_CRITICAL( mux ); \ + } \ + } while( 0 ) + + #define portEXIT_CRITICAL_SAFE( mux ) \ + do { \ + if( xPortInIsrContext() ) { \ + portEXIT_CRITICAL_ISR( mux ); \ + } \ + else { \ + portEXIT_CRITICAL( mux ); \ + } \ + } while( 0 ) + + #define portASSERT_IF_IN_ISR() vPortAssertIfInISR() + void vPortAssertIfInISR(void); + +/* Critical section management. NW-TODO: replace XTOS_SET_INTLEVEL with more efficient version, if any? */ +/* These cannot be nested. They should be used with a lot of care and cannot be called from interrupt level. */ +/* */ +/* Only applies to one CPU. See notes above & below for reasons not to use these. */ + #define portDISABLE_INTERRUPTS() do { XTOS_SET_INTLEVEL( XCHAL_EXCM_LEVEL ); portbenchmarkINTERRUPT_DISABLE(); } while( 0 ) + #define portENABLE_INTERRUPTS() do { portbenchmarkINTERRUPT_RESTORE( 0 ); XTOS_SET_INTLEVEL( 0 ); } while( 0 ) + +/* Cleaner solution allows nested interrupts disabling and restoring via local registers or stack. */ +/* They can be called from interrupts too. */ +/* WARNING: Only applies to current CPU. See notes above. */ + static inline UBaseType_t __attribute__( ( always_inline ) ) xPortSetInterruptMaskFromISR( void ) + { + UBaseType_t prev_int_level = XTOS_SET_INTLEVEL( XCHAL_EXCM_LEVEL ); + portbenchmarkINTERRUPT_DISABLE(); + return prev_int_level; + } + + static inline void __attribute__( ( always_inline ) ) vPortClearInterruptMaskFromISR( UBaseType_t prev_level ) + { + portbenchmarkINTERRUPT_RESTORE( prev_level ); + XTOS_RESTORE_JUST_INTLEVEL( prev_level ); + } + +/* These FreeRTOS versions are similar to the nested versions above */ + #define portSET_INTERRUPT_MASK_FROM_ISR() xPortSetInterruptMaskFromISR() + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( prev_level ) vPortClearInterruptMaskFromISR( prev_level ) + +/*Because the ROM routines don't necessarily handle a stack in external RAM correctly, we force */ +/*the stack memory to always be internal. */ + #define portTcbMemoryCaps (MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT) + #define portStackMemoryCaps (MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT) + + #define pvPortMallocTcbMem(size) heap_caps_malloc(size, portTcbMemoryCaps) + #define pvPortMallocStackMem(size) heap_caps_malloc(size, portStackMemoryCaps) + +/*xTaskCreateStatic uses these functions to check incoming memory. */ + #define portVALID_TCB_MEM( ptr ) ( esp_ptr_internal( ptr ) && esp_ptr_byte_accessible( ptr ) ) + #ifdef CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY + #define portVALID_STACK_MEM( ptr ) esp_ptr_byte_accessible( ptr ) + #else + #define portVALID_STACK_MEM( ptr ) ( esp_ptr_internal( ptr ) && esp_ptr_byte_accessible( ptr ) ) + #endif + +/* + * Wrapper for the Xtensa compare-and-set instruction. This subroutine will atomically compare + * *addr to 'compare'. If *addr == compare, *addr is set to *set. *set is updated with the previous + * value of *addr (either 'compare' or some other value.) + * + * Warning: From the ISA docs: in some (unspecified) cases, the s32c1i instruction may return the + * *bitwise inverse* of the old mem if the mem wasn't written. This doesn't seem to happen on the + * ESP32 (portMUX assertions would fail). + */ + static inline void uxPortCompareSet( volatile uint32_t * addr, + uint32_t compare, + uint32_t * set ) + { + #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) + __asm__ __volatile__ ( + "WSR %2,SCOMPARE1 \n" + "S32C1I %0, %1, 0 \n" + : "=r" ( *set ) + : "r" ( addr ), "r" ( compare ), "0" ( *set ) + ); + #else + #if ( XCHAL_HAVE_S32C1I > 0 ) + __asm__ __volatile__ ( + "WSR %2,SCOMPARE1 \n" + "S32C1I %0, %1, 0 \n" + : "=r" ( *set ) + : "r" ( addr ), "r" ( compare ), "0" ( *set ) + ); + #else + /* No S32C1I, so do this by disabling and re-enabling interrupts (slower) */ + uint32_t intlevel, old_value; + __asm__ __volatile__ ( "rsil %0, " XTSTR( XCHAL_EXCM_LEVEL ) "\n" + : "=r" ( intlevel ) ); + + old_value = *addr; + + if( old_value == compare ) + { + *addr = *set; + } + + __asm__ __volatile__ ( "memw \n" + "wsr %0, ps\n" + : : "r" ( intlevel ) ); + + *set = old_value; + #endif /* if ( XCHAL_HAVE_S32C1I > 0 ) */ + #endif /* #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) */ + } + + #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) + void uxPortCompareSetExtram( volatile uint32_t * addr, + uint32_t compare, + uint32_t * set ); + #else + static inline void uxPortCompareSetExtram(volatile uint32_t *addr, uint32_t compare, uint32_t *set) + { + #if defined(CONFIG_SPIRAM) + compare_and_set_extram(addr, compare, set); + #endif + } + #endif + +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ + #define portSTACK_GROWTH ( -1 ) + #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + #define portBYTE_ALIGNMENT 4 + #define portNOP() XT_NOP() +/*-----------------------------------------------------------*/ + +/* Fine resolution time */ + #define portGET_RUN_TIME_COUNTER_VALUE() xthal_get_ccount() +/*ccount or esp_timer are initialized elsewhere */ + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() + + #ifdef CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER +/* Coarse resolution time (us) */ + #define portALT_GET_RUN_TIME_COUNTER_VALUE( x ) do { x = ( uint32_t )esp_timer_get_time(); } while( 0 ) + #endif + + + +/* Kernel utilities. */ + void vPortYield( void ); + void vPortEvaluateYieldFromISR( int argc, ... ); + void _frxt_setup_switch( void ); +/* Macro to count number of arguments of a __VA_ARGS__ used to support portYIELD_FROM_ISR with, + * or without arguments. The macro counts only 0 or 1 arguments. + * + * In the future, we want to switch to C++20. We also want to become compatible with clang. + * Hence, we provide two versions of the following macros which are using variadic arguments. + * The first one is using the GNU extension ##__VA_ARGS__. The second one is using the C++20 feature __VA_OPT__(,). + * This allows users to compile their code with standard C++20 enabled instead of the GNU extension. + * Below C++20, we haven't found any good alternative to using ##__VA_ARGS__. + */ + #if defined( __cplusplus ) && ( __cplusplus > 201703L ) + #define portGET_ARGUMENT_COUNT(...) portGET_ARGUMENT_COUNT_INNER( 0 __VA_OPT__(,) __VA_ARGS__, 1 , 0 ) + #else + #define portGET_ARGUMENT_COUNT(...) portGET_ARGUMENT_COUNT_INNER( 0, ##__VA_ARGS__, 1, 0 ) + #endif + #define portGET_ARGUMENT_COUNT_INNER( zero, one, count, ... ) count + + _Static_assert( portGET_ARGUMENT_COUNT() == 0, "portGET_ARGUMENT_COUNT() result does not match for 0 arguments" ); + _Static_assert( portGET_ARGUMENT_COUNT( 1 ) == 1, "portGET_ARGUMENT_COUNT() result does not match for 1 argument" ); + + #define portYIELD() vPortYield() + +/* The macro below could be used when passing a single argument, or without any argument, + * it was developed to support both usages of portYIELD inside of an ISR. Any other usage form + * might result in undesired behaviour + */ + #if defined( __cplusplus ) && ( __cplusplus > 201703L ) + #define portYIELD_FROM_ISR(...) vPortEvaluateYieldFromISR( portGET_ARGUMENT_COUNT( __VA_ARGS__ ) __VA_OPT__( , ) __VA_ARGS__ ) + #else + #define portYIELD_FROM_ISR(...) vPortEvaluateYieldFromISR( portGET_ARGUMENT_COUNT( __VA_ARGS__ ), ##__VA_ARGS__ ) + #endif + + static inline BaseType_t xPortGetCoreID(); + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ + #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) + #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +/* When coprocessors are defined, we to maintain a pointer to coprocessors area. */ +/* We currently use a hack: redefine field xMPU_SETTINGS in TCB block as a structure that can hold: */ +/* MPU wrappers, coprocessor area pointer, trace code structure, and more if needed. */ +/* The field is normally used for memory protection. FreeRTOS should create another general purpose field. */ + typedef struct + { + #if XCHAL_CP_NUM > 0 + volatile StackType_t * coproc_area; /* Pointer to coprocessor save area; MUST BE FIRST */ + #endif + + #if portUSING_MPU_WRAPPERS + /* Define here mpu_settings, which is port dependent */ + int mpu_setting; /* Just a dummy example here; MPU not ported to Xtensa yet */ + #endif + + #if configUSE_TRACE_FACILITY_2 + struct + { + /* Cf. porttraceStamp() */ + int taskstamp; /* Stamp from inside task to see where we are */ + int taskstampcount; /* A counter usually incremented when we restart the task's loop */ + } porttrace; + #endif + } xMPU_SETTINGS; + +/* Main hack to use MPU_wrappers even when no MPU is defined (warning: mpu_setting should not be accessed; otherwise move this above xMPU_SETTINGS) */ + #if ( XCHAL_CP_NUM > 0 || configUSE_TRACE_FACILITY_2 ) && !portUSING_MPU_WRAPPERS /* If MPU wrappers not used, we still need to allocate coproc area */ + #undef portUSING_MPU_WRAPPERS + #define portUSING_MPU_WRAPPERS 1 /* Enable it to allocate coproc area */ + #define MPU_WRAPPERS_H /* Override mpu_wrapper.h to disable unwanted code */ + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #endif + + void vApplicationSleep( TickType_t xExpectedIdleTime ); + + #define portSUPPRESS_TICKS_AND_SLEEP( idleTime ) vApplicationSleep( idleTime ) + + void _xt_coproc_release( volatile void * coproc_sa_base ); + + /*-----------------------------------------------------------*/ + + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + /* Architecture specific optimisations. */ + + #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 different priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __builtin_clz( ( uxReadyPriorities ) ) ) + + #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + /*-----------------------------------------------------------*/ + +/* + * Map to the memory management routines required for the port. + * + * Note that libc standard malloc/free are also available for + * non-FreeRTOS-specific code, and behave the same as + * pvPortMalloc()/vPortFree(). + */ + #define pvPortMalloc heap_caps_malloc_default + #define vPortFree heap_caps_free + #define xPortGetFreeHeapSize esp_get_free_heap_size + #define xPortGetMinimumEverFreeHeapSize esp_get_minimum_free_heap_size + +#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) +/* + * Send an interrupt to another core in order to make the task running + * on it yield for a higher-priority task. + */ + + void vPortYieldOtherCore( BaseType_t coreid ) PRIVILEGED_FUNCTION; + +#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */ + +/* + * Callback to set a watchpoint on the end of the stack. Called every context switch to change the stack + * watchpoint around. + */ + void vPortSetStackWatchpoint( void * pxStackStart ); + +/* + * Returns true if the current core is in ISR context; low prio ISR, med prio ISR or timer tick ISR. High prio ISRs + * aren't detected here, but they normally cannot call C code, so that should not be an issue anyway. + */ + BaseType_t xPortInIsrContext(); + + +/* + * This function will be called in High prio ISRs. Returns true if the current core was in ISR context + * before calling into high prio ISR context. + */ + BaseType_t xPortInterruptedFromISRContext(); + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ + #if ( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t usStackDepth ) PRIVILEGED_FUNCTION; + void vPortReleaseTaskMPUSettings( xMPU_SETTINGS * xMPUSettings ); + #endif + +/* Multi-core: get current core ID */ + static inline BaseType_t IRAM_ATTR xPortGetCoreID() + { + return ( uint32_t )cpu_hal_get_core_id(); + } + +/* Get tick rate per second */ + uint32_t xPortGetTickRateHz( void ); + + static inline bool IRAM_ATTR xPortCanYield(void) + { + uint32_t ps_reg = 0; + + //Get the current value of PS (processor status) register + RSR(PS, ps_reg); + + /* + * intlevel = (ps_reg & 0xf); + * excm = (ps_reg >> 4) & 0x1; + * CINTLEVEL is max(excm * EXCMLEVEL, INTLEVEL), where EXCMLEVEL is 3. + * However, just return true, only intlevel is zero. + */ + + return ((ps_reg & PS_INTLEVEL_MASK) == 0); + } + +/* porttrace */ + #if configUSE_TRACE_FACILITY_2 + #include "porttrace.h" + #endif + +/* configASSERT_2 if requested */ + #if configASSERT_2 + #include + void exit( int ); + #define configASSERT( x ) if( !( x ) ) { porttracePrint( -1 ); printf( "\nAssertion failed in %s:%d\n", __FILE__, __LINE__ ); exit( -1 ); } + #endif + +/* Barriers */ + #define portMEMORY_BARRIER() __asm volatile ( "" ::: "memory" ) + + +#endif // __ASSEMBLER__ + +/* *INDENT-OFF* */ +#ifdef __cplusplus + } +#endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h new file mode 100644 index 0000000..fce0d5a --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h @@ -0,0 +1,75 @@ +/* + * SPDX-FileCopyrightText: 2017, Intel Corporation + * + * SPDX-License-Identifier: Apache-2.0 + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ + +/* File adapted to use on IDF FreeRTOS component, extracted + * originally from zephyr RTOS code base: + * https://github.com/zephyrproject-rtos/zephyr/blob/dafd348/arch/xtensa/include/xtensa-asm2-s.h + */ + +#ifndef __XT_ASM_UTILS_H +#define __XT_ASM_UTILS_H + +/* + * SPILL_ALL_WINDOWS + * + * Spills all windowed registers (i.e. registers not visible as + * A0-A15) to their ABI-defined spill regions on the stack. + * + * Unlike the Xtensa HAL implementation, this code requires that the + * EXCM and WOE bit be enabled in PS, and relies on repeated hardware + * exception handling to do the register spills. The trick is to do a + * noop write to the high registers, which the hardware will trap + * (into an overflow exception) in the case where those registers are + * already used by an existing call frame. Then it rotates the window + * and repeats until all but the A0-A3 registers of the original frame + * are guaranteed to be spilled, eventually rotating back around into + * the original frame. Advantages: + * + * - Vastly smaller code size + * + * - More easily maintained if changes are needed to window over/underflow + * exception handling. + * + * - Requires no scratch registers to do its work, so can be used safely in any + * context. + * + * - If the WOE bit is not enabled (for example, in code written for + * the CALL0 ABI), this becomes a silent noop and operates compatbily. + * + * - Hilariously it's ACTUALLY FASTER than the HAL routine. And not + * just a little bit, it's MUCH faster. With a mostly full register + * file on an LX6 core (ESP-32) I'm measuring 145 cycles to spill + * registers with this vs. 279 (!) to do it with + * xthal_spill_windows(). + */ + +.macro SPILL_ALL_WINDOWS +#if XCHAL_NUM_AREGS == 64 + and a12, a12, a12 + rotw 3 + and a12, a12, a12 + rotw 3 + and a12, a12, a12 + rotw 3 + and a12, a12, a12 + rotw 3 + and a12, a12, a12 + rotw 4 +#elif XCHAL_NUM_AREGS == 32 + and a12, a12, a12 + rotw 3 + and a12, a12, a12 + rotw 3 + and a4, a4, a4 + rotw 2 +#else +#error Unrecognized XCHAL_NUM_AREGS +#endif +.endm + +#endif \ No newline at end of file diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h new file mode 100644 index 0000000..511a9da --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h new file mode 100644 index 0000000..cb20b18 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h @@ -0,0 +1,154 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* +* +* Configuration-specific information for Xtensa build. This file must be +* included in FreeRTOSConfig.h to properly set up the config-dependent +* parameters correctly. +* +* NOTE: To enable thread-safe C library support, XT_USE_THREAD_SAFE_CLIB must +* be defined to be > 0 somewhere above or on the command line. +* +*******************************************************************************/ + +#ifndef XTENSA_CONFIG_H + #define XTENSA_CONFIG_H + + #ifdef __cplusplus + extern "C" { + #endif + + #include + #include + #include /* required for XSHAL_CLIB */ + + #include "xtensa_context.h" + + +/*----------------------------------------------------------------------------- + * STACK REQUIREMENTS + * + * This section defines the minimum stack size, and the extra space required to + * be allocated for saving coprocessor state and/or C library state information + * (if thread safety is enabled for the C library). The sizes are in bytes. + * + * Stack sizes for individual tasks should be derived from these minima based on + * the maximum call depth of the task and the maximum level of interrupt nesting. + * A minimum stack size is defined by XT_STACK_MIN_SIZE. This minimum is based + * on the requirement for a task that calls nothing else but can be interrupted. + * This assumes that interrupt handlers do not call more than a few levels deep. + * If this is not true, i.e. one or more interrupt handlers make deep calls then + * the minimum must be increased. + * + * If the Xtensa processor configuration includes coprocessors, then space is + * allocated to save the coprocessor state on the stack. + * + * If thread safety is enabled for the C runtime library, (XT_USE_THREAD_SAFE_CLIB + * is defined) then space is allocated to save the C library context in the TCB. + * + * Allocating insufficient stack space is a common source of hard-to-find errors. + * During development, it is best to enable the FreeRTOS stack checking features. + * + * Usage: + * + * XT_USE_THREAD_SAFE_CLIB -- Define this to a nonzero value to enable thread-safe + * use of the C library. This will require extra stack + * space to be allocated for tasks that use the C library + * reentrant functions. See below for more information. + * + * NOTE: The Xtensa toolchain supports multiple C libraries and not all of them + * support thread safety. Check your core configuration to see which C library + * was chosen for your system. + * + * XT_STACK_MIN_SIZE -- The minimum stack size for any task. It is recommended + * that you do not use a stack smaller than this for any + * task. In case you want to use stacks smaller than this + * size, you must verify that the smaller size(s) will work + * under all operating conditions. + * + * XT_STACK_EXTRA -- The amount of extra stack space to allocate for a task + * that does not make C library reentrant calls. Add this + * to the amount of stack space required by the task itself. + * + * XT_STACK_EXTRA_CLIB -- The amount of space to allocate for C library state. + * + * -----------------------------------------------------------------------------*/ + +/* Extra space required for interrupt/exception hooks. */ + #ifdef XT_INTEXC_HOOKS + #ifdef __XTENSA_CALL0_ABI__ + #define STK_INTEXC_EXTRA 0x200 + #else + #define STK_INTEXC_EXTRA 0x180 + #endif + #else + #define STK_INTEXC_EXTRA 0 + #endif + + #define XT_CLIB_CONTEXT_AREA_SIZE 0 + +/*------------------------------------------------------------------------------ + * Extra size -- interrupt frame plus coprocessor save area plus hook space. + * NOTE: Make sure XT_INTEXC_HOOKS is undefined unless you really need the hooks. + * ------------------------------------------------------------------------------*/ + #ifdef __XTENSA_CALL0_ABI__ + #define XT_XTRA_SIZE ( XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x10 + XT_CP_SIZE ) + #else + #define XT_XTRA_SIZE ( XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x20 + XT_CP_SIZE ) + #endif + +/*------------------------------------------------------------------------------ + * Space allocated for user code -- function calls and local variables. + * NOTE: This number can be adjusted to suit your needs. You must verify that the + * amount of space you reserve is adequate for the worst-case conditions in your + * application. + * NOTE: The windowed ABI requires more stack, since space has to be reserved + * for spilling register windows. + * ------------------------------------------------------------------------------*/ + #ifdef __XTENSA_CALL0_ABI__ + #define XT_USER_SIZE 0x200 + #else + #define XT_USER_SIZE 0x400 + #endif + +/* Minimum recommended stack size. */ + #define XT_STACK_MIN_SIZE ( ( XT_XTRA_SIZE + XT_USER_SIZE ) / sizeof( unsigned char ) ) + +/* OS overhead with and without C library thread context. */ + #define XT_STACK_EXTRA ( XT_XTRA_SIZE ) + #define XT_STACK_EXTRA_CLIB ( XT_XTRA_SIZE + XT_CLIB_CONTEXT_AREA_SIZE ) + + + #ifdef __cplusplus + } + #endif + +#endif /* XTENSA_CONFIG_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h new file mode 100644 index 0000000..fc24748 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h new file mode 100644 index 0000000..1f0c063 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h @@ -0,0 +1,242 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* +* +* RTOS-SPECIFIC INFORMATION FOR XTENSA RTOS ASSEMBLER SOURCES +* (FreeRTOS Port) +* +* This header is the primary glue between generic Xtensa RTOS support +* sources and a specific RTOS port for Xtensa. It contains definitions +* and macros for use primarily by Xtensa assembly coded source files. +* +* Macros in this header map callouts from generic Xtensa files to specific +* RTOS functions. It may also be included in C source files. +* +* Xtensa RTOS ports support all RTOS-compatible configurations of the Xtensa +* architecture, using the Xtensa hardware abstraction layer (HAL) to deal +* with configuration specifics. +* +* Should be included by all Xtensa generic and RTOS port-specific sources. +* +*******************************************************************************/ + +#ifndef XTENSA_RTOS_H +#define XTENSA_RTOS_H + +#ifdef __ASSEMBLER__ + #include +#else + #include +#endif + +#include +#include +#include "sdkconfig.h" +/* + * Include any RTOS specific definitions that are needed by this header. + */ +#include "FreeRTOSConfig.h" + +/* + * Convert FreeRTOSConfig definitions to XTENSA definitions. + * However these can still be overridden from the command line. + */ + +#ifndef XT_SIMULATOR + #if configXT_SIMULATOR + #define XT_SIMULATOR 1 /* Simulator mode */ + #endif +#endif + +#ifndef XT_BOARD + #if configXT_BOARD + #define XT_BOARD 1 /* Board mode */ + #endif +#endif + +#ifndef XT_TIMER_INDEX + #if defined configXT_TIMER_INDEX + #define XT_TIMER_INDEX configXT_TIMER_INDEX /* Index of hardware timer to be used */ + #endif +#endif + +#ifndef XT_INTEXC_HOOKS + #if configXT_INTEXC_HOOKS + #define XT_INTEXC_HOOKS 1 /* Enables exception hooks */ + #endif +#endif + +#if !defined( XT_SIMULATOR ) && !defined( XT_BOARD ) + #error Either XT_SIMULATOR or XT_BOARD must be defined. +#endif + + +/* + * Name of RTOS (for messages). + */ +#define XT_RTOS_NAME FreeRTOS + +/* + * Check some Xtensa configuration requirements and report error if not met. + * Error messages can be customize to the RTOS port. + */ + +#if !XCHAL_HAVE_XEA2 + #error "FreeRTOS/Xtensa requires XEA2 (exception architecture 2)." +#endif + + +/******************************************************************************* +* +* RTOS CALLOUT MACROS MAPPED TO RTOS PORT-SPECIFIC FUNCTIONS. +* +* Define callout macros used in generic Xtensa code to interact with the RTOS. +* The macros are simply the function names for use in calls from assembler code. +* Some of these functions may call back to generic functions in xtensa_context.h . +* +*******************************************************************************/ + +/* + * Inform RTOS of entry into an interrupt handler that will affect it. + * Allows RTOS to manage switch to any system stack and count nesting level. + * Called after minimal context has been saved, with interrupts disabled. + * RTOS port can call0 _xt_context_save to save the rest of the context. + * May only be called from assembly code by the 'call0' instruction. + */ +/* void XT_RTOS_INT_ENTER(void) */ +#define XT_RTOS_INT_ENTER _frxt_int_enter + +/* + * Inform RTOS of completion of an interrupt handler, and give control to + * RTOS to perform thread/task scheduling, switch back from any system stack + * and restore the context, and return to the exit dispatcher saved in the + * stack frame at XT_STK_EXIT. RTOS port can call0 _xt_context_restore + * to save the context saved in XT_RTOS_INT_ENTER via _xt_context_save, + * leaving only a minimal part of the context to be restored by the exit + * dispatcher. This function does not return to the place it was called from. + * May only be called from assembly code by the 'call0' instruction. + */ +/* void XT_RTOS_INT_EXIT(void) */ +#define XT_RTOS_INT_EXIT _frxt_int_exit + +/* + * Inform RTOS of the occurrence of a tick timer interrupt. + * If RTOS has no tick timer, leave XT_RTOS_TIMER_INT undefined. + * May be coded in or called from C or assembly, per ABI conventions. + * RTOS may optionally define XT_TICK_PER_SEC in its own way (eg. macro). + */ +/* void XT_RTOS_TIMER_INT(void) */ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT +#define XT_RTOS_TIMER_INT _frxt_timer_int +#endif +#define XT_TICK_PER_SEC configTICK_RATE_HZ + +/* + * Return in a15 the base address of the co-processor state save area for the + * thread that triggered a co-processor exception, or 0 if no thread was running. + * The state save area is structured as defined in xtensa_context.h and has size + * XT_CP_SIZE. Co-processor instructions should only be used in thread code, never + * in interrupt handlers or the RTOS kernel. May only be called from assembly code + * and by the 'call0' instruction. A result of 0 indicates an unrecoverable error. + * The implementation may use only a2-4, a15 (all other regs must be preserved). + */ +/* void* XT_RTOS_CP_STATE(void) */ +#define XT_RTOS_CP_STATE _frxt_task_coproc_state + + +/******************************************************************************* +* +* HOOKS TO DYNAMICALLY INSTALL INTERRUPT AND EXCEPTION HANDLERS PER LEVEL. +* +* This Xtensa RTOS port provides hooks for dynamically installing exception +* and interrupt handlers to facilitate automated testing where each test +* case can install its own handler for user exceptions and each interrupt +* priority (level). This consists of an array of function pointers indexed +* by interrupt priority, with index 0 being the user exception handler hook. +* Each entry in the array is initially 0, and may be replaced by a function +* pointer of type XT_INTEXC_HOOK. A handler may be uninstalled by installing 0. +* +* The handler for low and medium priority obeys ABI conventions so may be coded +* in C. For the exception handler, the cause is the contents of the EXCCAUSE +* reg, and the result is -1 if handled, else the cause (still needs handling). +* For interrupt handlers, the cause is a mask of pending enabled interrupts at +* that level, and the result is the same mask with the bits for the handled +* interrupts cleared (those not cleared still need handling). This allows a test +* case to either pre-handle or override the default handling for the exception +* or interrupt level (see xtensa_vectors.S). +* +* High priority handlers (including NMI) must be coded in assembly, are always +* called by 'call0' regardless of ABI, must preserve all registers except a0, +* and must not use or modify the interrupted stack. The hook argument 'cause' +* is not passed and the result is ignored, so as not to burden the caller with +* saving and restoring a2 (it assumes only one interrupt per level - see the +* discussion in high priority interrupts in xtensa_vectors.S). The handler +* therefore should be coded to prototype 'void h(void)' even though it plugs +* into an array of handlers of prototype 'unsigned h(unsigned)'. +* +* To enable interrupt/exception hooks, compile the RTOS with '-DXT_INTEXC_HOOKS'. +* +*******************************************************************************/ + +#define XT_INTEXC_HOOK_NUM ( 1 + XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI ) + +#ifndef __ASSEMBLER__ + typedef unsigned (* XT_INTEXC_HOOK)( unsigned cause ); + extern volatile XT_INTEXC_HOOK _xt_intexc_hooks[ XT_INTEXC_HOOK_NUM ]; +#endif + + +/******************************************************************************* +* +* CONVENIENCE INCLUSIONS. +* +* Ensures RTOS specific files need only include this one Xtensa-generic header. +* These headers are included last so they can use the RTOS definitions above. +* +*******************************************************************************/ + +#include "xtensa_context.h" + +#ifdef XT_RTOS_TIMER_INT + #include "xtensa_timer.h" +#endif + + +/******************************************************************************* +* +* Xtensa Port Version. +* +*******************************************************************************/ + +#define XTENSA_PORT_VERSION 1.4 .2 +#define XTENSA_PORT_VERSION_STRING "1.4.2" + +#endif /* XTENSA_RTOS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h new file mode 100644 index 0000000..635ce1f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h @@ -0,0 +1,167 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* +* +* XTENSA INFORMATION FOR RTOS TICK TIMER AND CLOCK FREQUENCY +* +* This header contains definitions and macros for use primarily by Xtensa +* RTOS assembly coded source files. It includes and uses the Xtensa hardware +* abstraction layer (HAL) to deal with config specifics. It may also be +* included in C source files. +* +* User may edit to modify timer selection and to specify clock frequency and +* tick duration to match timer interrupt to the real-time tick duration. +* +* If the RTOS has no timer interrupt, then there is no tick timer and the +* clock frequency is irrelevant, so all of these macros are left undefined +* and the Xtensa core configuration need not have a timer. +* +*******************************************************************************/ + +#ifndef XTENSA_TIMER_H +#define XTENSA_TIMER_H + +#ifdef __ASSEMBLER__ + #include +#endif + +#include +#include + +#include "xtensa_rtos.h" /* in case this wasn't included directly */ + +#include "FreeRTOSConfig.h" + +/* + * Select timer to use for periodic tick, and determine its interrupt number + * and priority. User may specify a timer by defining XT_TIMER_INDEX with -D, + * in which case its validity is checked (it must exist in this core and must + * not be on a high priority interrupt - an error will be reported in invalid). + * Otherwise select the first low or medium priority interrupt timer available. + */ +#if XCHAL_NUM_TIMERS == 0 + + #error "This Xtensa configuration is unsupported, it has no timers." + +#else + + #ifndef XT_TIMER_INDEX + #if XCHAL_TIMER3_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL( XCHAL_TIMER3_INTERRUPT ) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 3 + #endif + #endif + #if XCHAL_TIMER2_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL( XCHAL_TIMER2_INTERRUPT ) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 2 + #endif + #endif + #if XCHAL_TIMER1_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL( XCHAL_TIMER1_INTERRUPT ) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 1 + #endif + #endif + #if XCHAL_TIMER0_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL( XCHAL_TIMER0_INTERRUPT ) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 0 + #endif + #endif + #endif /* ifndef XT_TIMER_INDEX */ + #ifndef XT_TIMER_INDEX + #error "There is no suitable timer in this Xtensa configuration." + #endif + + #define XT_CCOMPARE ( CCOMPARE + XT_TIMER_INDEX ) + #define XT_TIMER_INTNUM XCHAL_TIMER_INTERRUPT( XT_TIMER_INDEX ) + #define XT_TIMER_INTPRI XCHAL_INT_LEVEL( XT_TIMER_INTNUM ) + #define XT_TIMER_INTEN ( 1 << XT_TIMER_INTNUM ) + + #if XT_TIMER_INTNUM == XTHAL_TIMER_UNCONFIGURED + #error "The timer selected by XT_TIMER_INDEX does not exist in this core." + #elif XT_TIMER_INTPRI > XCHAL_EXCM_LEVEL + #error "The timer interrupt cannot be high priority (use medium or low)." + #endif + +#endif /* XCHAL_NUM_TIMERS */ + +/* + * Set processor clock frequency, used to determine clock divisor for timer tick. + * User should BE SURE TO ADJUST THIS for the Xtensa platform being used. + * If using a supported board via the board-independent API defined in xtbsp.h, + * this may be left undefined and frequency and tick divisor will be computed + * and cached during run-time initialization. + * + * NOTE ON SIMULATOR: + * Under the Xtensa instruction set simulator, the frequency can only be estimated + * because it depends on the speed of the host and the version of the simulator. + * Also because it runs much slower than hardware, it is not possible to achieve + * real-time performance for most applications under the simulator. A frequency + * too low does not allow enough time between timer interrupts, starving threads. + * To obtain a more convenient but non-real-time tick duration on the simulator, + * compile with xt-xcc option "-DXT_SIMULATOR". + * Adjust this frequency to taste (it's not real-time anyway!). + */ +#if defined( XT_SIMULATOR ) && !defined( XT_CLOCK_FREQ ) + #define XT_CLOCK_FREQ configCPU_CLOCK_HZ +#endif + +#if !defined( XT_CLOCK_FREQ ) && !defined( XT_BOARD ) + #error "XT_CLOCK_FREQ must be defined for the target platform." +#endif + +/* + * Default number of timer "ticks" per second (default 100 for 10ms tick). + * RTOS may define this in its own way (if applicable) in xtensa_rtos.h. + * User may redefine this to an optimal value for the application, either by + * editing this here or in xtensa_rtos.h, or compiling with xt-xcc option + * "-DXT_TICK_PER_SEC=" where is a suitable number. + */ +#ifndef XT_TICK_PER_SEC + #define XT_TICK_PER_SEC configTICK_RATE_HZ /* 10 ms tick = 100 ticks per second */ +#endif + +/* + * Derivation of clock divisor for timer tick and interrupt (one per tick). + */ +#ifdef XT_CLOCK_FREQ + #define XT_TICK_DIVISOR ( XT_CLOCK_FREQ / XT_TICK_PER_SEC ) +#endif + +#ifndef __ASSEMBLER__ + extern unsigned _xt_tick_divisor; + extern void _xt_tick_divisor_init( void ); +#endif + +#endif /* XTENSA_TIMER_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port.c new file mode 100644 index 0000000..e42fbad --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port.c @@ -0,0 +1,568 @@ +/* + * SPDX-FileCopyrightText: 2020 Amazon.com, Inc. or its affiliates + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. If you wish to use our Amazon + * FreeRTOS name, please do so in a fair use way that does not cause confusion. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + * 1 tab == 4 spaces! + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include + +#include "xtensa_rtos.h" +#include "esp_idf_version.h" + +#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) +#include "rom/ets_sys.h" +#include "esp_panic.h" +#include "esp_crosscore_int.h" +#else +#if CONFIG_IDF_TARGET_ESP32S3 + #include "esp32s3/rom/ets_sys.h" +#elif CONFIG_IDF_TARGET_ESP32S2 + #include "esp32s2/rom/ets_sys.h" +#elif CONFIG_IDF_TARGET_ESP32 + #include "esp32/rom/ets_sys.h" +#endif +#include "esp_private/panic_reason.h" +#include "esp_debug_helpers.h" +#include "esp_private/crosscore_int.h" +#include "esp_log.h" +#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */ +#include "soc/cpu.h" + +#include "FreeRTOS.h" +#include "task.h" + +#include "esp_heap_caps.h" + +#include "esp_intr_alloc.h" + +#include "port_systick.h" + +/* Defined in xtensa_context.S */ +extern void _xt_coproc_init( void ); + +_Static_assert(tskNO_AFFINITY == CONFIG_FREERTOS_NO_AFFINITY, "incorrect tskNO_AFFINITY value"); + +/*-----------------------------------------------------------*/ + +extern volatile int port_xSchedulerRunning[portNUM_PROCESSORS]; +unsigned port_interruptNesting[ portNUM_PROCESSORS ] = { 0 }; /* Interrupt nesting level. Increased/decreased in portasm.c, _frxt_int_enter/_frxt_int_exit */ + +/*-----------------------------------------------------------*/ + +/* User exception dispatcher when exiting */ +void _xt_user_exit( void ); + +#if CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER +/* Wrapper to allow task functions to return (increases stack overhead by 16 bytes) */ + static void vPortTaskWrapper( TaskFunction_t pxCode, + void * pvParameters ) + { + pxCode( pvParameters ); + /*FreeRTOS tasks should not return. Log the task name and abort. */ + char * pcTaskName = pcTaskGetTaskName( NULL ); + ESP_LOGE( "FreeRTOS", "FreeRTOS Task \"%s\" should not return, Aborting now!", pcTaskName ); + abort(); + } +#endif /* if CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER */ + +/* + * Stack initialization + */ +/* *INDENT-OFF* */ +#if portUSING_MPU_WRAPPERS + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters, + BaseType_t xRunPrivileged ) +#else + StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +#endif +/* *INDENT-ON* */ +{ + StackType_t * sp; + StackType_t * tp; + XtExcFrame * frame; + + #if XCHAL_CP_NUM > 0 + uint32_t * p; + #endif + + uint32_t * threadptr; + void * task_thread_local_start; + extern int _thread_local_start, _thread_local_end, _flash_rodata_start, _flash_rodata_align; + + /* TODO: check that TLS area fits the stack */ + uint32_t thread_local_sz = ( uint8_t * ) &_thread_local_end - ( uint8_t * ) &_thread_local_start; + + thread_local_sz = ALIGNUP( 0x10, thread_local_sz ); + + /* Initialize task's stack so that we have the following structure at the top: + + ----LOW ADDRESSES ----------------------------------------HIGH ADDRESSES---------- + task stack | interrupt stack frame | thread local vars | co-processor save area | + ---------------------------------------------------------------------------------- + | | + SP pxTopOfStack + + All parts are aligned to 16 byte boundary. + */ + + /* Create interrupt stack frame aligned to 16 byte boundary */ + sp = ( StackType_t * ) ( ( ( UBaseType_t ) pxTopOfStack - XT_CP_SIZE - thread_local_sz - XT_STK_FRMSZ ) & ~0xf ); + + /* Clear the entire frame (do not use memset() because we don't depend on C library) */ + for( tp = sp; tp <= pxTopOfStack; ++tp ) + { + *tp = 0; + } + + frame = ( XtExcFrame * ) sp; + + /* Explicitly initialize certain saved registers */ + #if CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER + frame->pc = ( UBaseType_t ) vPortTaskWrapper; /* task wrapper */ + #else + frame->pc = ( UBaseType_t ) pxCode; /* task entrypoint */ + #endif + frame->a0 = 0; /* to terminate GDB backtrace */ + frame->a1 = ( UBaseType_t ) sp + XT_STK_FRMSZ; /* physical top of stack frame */ + frame->exit = ( UBaseType_t ) _xt_user_exit; /* user exception exit dispatcher */ + + /* Set initial PS to int level 0, EXCM disabled ('rfe' will enable), user mode. */ + /* Also set entry point argument parameter. */ + #ifdef __XTENSA_CALL0_ABI__ + #if CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER + frame->a2 = ( UBaseType_t ) pxCode; + frame->a3 = ( UBaseType_t ) pvParameters; + #else + frame->a2 = ( UBaseType_t ) pvParameters; + #endif + frame->ps = PS_UM | PS_EXCM; + #else + /* + for windowed ABI also set WOE and CALLINC (pretend task was 'call4'd). */ + #if CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER + frame->a6 = ( UBaseType_t ) pxCode; + frame->a7 = ( UBaseType_t ) pvParameters; + #else + frame->a6 = ( UBaseType_t ) pvParameters; + #endif + frame->ps = PS_UM | PS_EXCM | PS_WOE | PS_CALLINC( 1 ); + #endif /* ifdef __XTENSA_CALL0_ABI__ */ + + #ifdef XT_USE_SWPRI + /* Set the initial virtual priority mask value to all 1's. */ + frame->vpri = 0xFFFFFFFF; + #endif + + /* Init threadptr register and set up TLS run-time area. */ + task_thread_local_start = ( void * ) ( ( ( uint32_t ) pxTopOfStack - XT_CP_SIZE - thread_local_sz ) & ~0xf ); + memcpy( task_thread_local_start, &_thread_local_start, thread_local_sz ); + threadptr = ( uint32_t * ) ( sp + XT_STK_EXTRA ); + + /* Calculate THREADPTR value. + * The generated code will add THREADPTR value to a constant value determined at link time, + * to get the address of the TLS variable. + * The constant value is calculated by the linker as follows + * (search for 'tpoff' in elf32-xtensa.c in BFD): + * offset = address - tls_section_vma + align_up(TCB_SIZE, tls_section_alignment) + * where TCB_SIZE is hardcoded to 8. + */ + const uint32_t tls_section_alignment = ( uint32_t ) &_flash_rodata_align; /* ALIGN value of .flash.rodata section */ + const uint32_t tcb_size = 8; /* Unrelated to FreeRTOS, this is the constant from BFD */ + const uint32_t base = ( tcb_size + tls_section_alignment - 1 ) & ( ~( tls_section_alignment - 1 ) ); + *threadptr = ( uint32_t ) task_thread_local_start - ( ( uint32_t ) &_thread_local_start - ( uint32_t ) &_flash_rodata_start ) - base; + + #if XCHAL_CP_NUM > 0 + /* Init the coprocessor save area (see xtensa_context.h) */ + + /* No access to TCB here, so derive indirectly. Stack growth is top to bottom. + * //p = (uint32_t *) xMPUSettings->coproc_area; + */ + p = ( uint32_t * ) ( ( ( uint32_t ) pxTopOfStack - XT_CP_SIZE ) & ~0xf ); + configASSERT( ( uint32_t ) p >= frame->a1 ); + p[ 0 ] = 0; + p[ 1 ] = 0; + p[ 2 ] = ( ( ( uint32_t ) p ) + 12 + XCHAL_TOTAL_SA_ALIGN - 1 ) & -XCHAL_TOTAL_SA_ALIGN; + #endif + + return sp; +} + +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the Xtensa port will get stopped. If required simply + * disable the tick interrupt here. */ + abort(); +} + +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + portDISABLE_INTERRUPTS(); + /* Interrupts are disabled at this point and stack contains PS with enabled interrupts when task context is restored */ + + #if XCHAL_CP_NUM > 0 + /* Initialize co-processor management for tasks. Leave CPENABLE alone. */ + _xt_coproc_init(); + #endif + + /* Setup the hardware to generate the tick */ + vPortSetupTimer(); + + /* NOTE: For ESP32-S3, vPortSetupTimer allocates an interrupt for the + * systimer which is used as the source for FreeRTOS systick. + * + * The behaviour of portEXIT_CRITICAL is different in FreeRTOS and ESP-IDF - + * the former enables the interrupts no matter what the state was at the beginning + * of the call while the latter restores the interrupt state to what was at the + * beginning of the call. + * + * This resulted in the interrupts being enabled before the _frxt_dispatch call, + * who was unable to switch context to the queued tasks. + */ + portDISABLE_INTERRUPTS(); + + port_xSchedulerRunning[ xPortGetCoreID() ] = 1; + + /* Cannot be directly called from C; never returns */ + __asm__ volatile ( "call0 _frxt_dispatch\n" ); + + /* Should not get here. */ + return pdTRUE; +} + +/*-----------------------------------------------------------*/ + +void vPortYieldOtherCore( BaseType_t coreid ) +{ + esp_crosscore_int_send_yield( coreid ); +} + +/*-----------------------------------------------------------*/ + +/* + * Used to set coprocessor area in stack. Current hack is to reuse MPU pointer for coprocessor area. + */ +#if portUSING_MPU_WRAPPERS + void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t usStackDepth ) + { + #if XCHAL_CP_NUM > 0 + xMPUSettings->coproc_area = ( StackType_t * ) ( ( uint32_t ) ( pxBottomOfStack + usStackDepth - 1 )); + xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) xMPUSettings->coproc_area ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( uint32_t ) xMPUSettings->coproc_area - XT_CP_SIZE ) & ~0xf ); + + /* NOTE: we cannot initialize the coprocessor save area here because FreeRTOS is going to + * clear the stack area after we return. This is done in pxPortInitialiseStack(). + */ + #endif + } + + void vPortReleaseTaskMPUSettings( xMPU_SETTINGS * xMPUSettings ) + { + /* If task has live floating point registers somewhere, release them */ + _xt_coproc_release( xMPUSettings->coproc_area ); + } + +#endif /* if portUSING_MPU_WRAPPERS */ + +/* + * Returns true if the current core is in ISR context; low prio ISR, med prio ISR or timer tick ISR. High prio ISRs + * aren't detected here, but they normally cannot call C code, so that should not be an issue anyway. + */ +BaseType_t xPortInIsrContext() +{ + unsigned int irqStatus; + BaseType_t ret; + + irqStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + ret = ( port_interruptNesting[ xPortGetCoreID() ] != 0 ); + portCLEAR_INTERRUPT_MASK_FROM_ISR( irqStatus ); + return ret; +} + +/* + * This function will be called in High prio ISRs. Returns true if the current core was in ISR context + * before calling into high prio ISR context. + */ +BaseType_t IRAM_ATTR xPortInterruptedFromISRContext() +{ + return( port_interruptNesting[ xPortGetCoreID() ] != 0 ); +} + +void IRAM_ATTR vPortEvaluateYieldFromISR( int argc, ... ) +{ + BaseType_t xYield; + va_list ap; + va_start( ap, argc ); + + if( argc ) + { + xYield = ( BaseType_t )va_arg( ap, int ); + va_end( ap ); + } + else + { + //it is a empty parameter vPortYieldFromISR macro call: + va_end( ap ); + traceISR_EXIT_TO_SCHEDULER(); + _frxt_setup_switch(); + return; + } + + //Yield exists, so need evaluate it first then switch: + if( xYield == pdTRUE ) + { + traceISR_EXIT_TO_SCHEDULER(); + _frxt_setup_switch(); + } +} + +void vPortAssertIfInISR() +{ + if( xPortInIsrContext() ) + { + esp_rom_printf( "core=%d port_interruptNesting=%d\n\n", xPortGetCoreID(), port_interruptNesting[ xPortGetCoreID() ] ); + } + + configASSERT( !xPortInIsrContext() ); +} + +/* + * For kernel use: Initialize a per-CPU mux. Mux will be initialized unlocked. + */ +void vPortCPUInitializeMutex( portMUX_TYPE * mux ) +{ + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + esp_rom_printf( "Initializing mux %p\n", mux ); + mux->lastLockedFn = "(never locked)"; + mux->lastLockedLine = -1; + #endif + mux->owner = portMUX_FREE_VAL; + mux->count = 0; +} + +#include "portmux_impl.h" + +/* + * For kernel use: Acquire a per-CPU mux. Spinlocks, so don't hold on to these muxes for too long. + */ +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + void vPortCPUAcquireMutex( portMUX_TYPE * mux, + const char * fnName, + int line ) + { + unsigned int irqStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + + vPortCPUAcquireMutexIntsDisabled( mux, portMUX_NO_TIMEOUT, fnName, line ); + portCLEAR_INTERRUPT_MASK_FROM_ISR( irqStatus ); + } + + bool vPortCPUAcquireMutexTimeout( portMUX_TYPE * mux, + int timeout_cycles, + const char * fnName, + int line ) + { + unsigned int irqStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + bool result = vPortCPUAcquireMutexIntsDisabled( mux, timeout_cycles, fnName, line ); + + portCLEAR_INTERRUPT_MASK_FROM_ISR( irqStatus ); + return result; + } + +#else /* ifdef CONFIG_FREERTOS_PORTMUX_DEBUG */ + void vPortCPUAcquireMutex( portMUX_TYPE * mux ) + { + unsigned int irqStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + + vPortCPUAcquireMutexIntsDisabled( mux, portMUX_NO_TIMEOUT ); + portCLEAR_INTERRUPT_MASK_FROM_ISR( irqStatus ); + } + + bool vPortCPUAcquireMutexTimeout( portMUX_TYPE * mux, + int timeout_cycles ) + { + unsigned int irqStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + bool result = vPortCPUAcquireMutexIntsDisabled( mux, timeout_cycles ); + + portCLEAR_INTERRUPT_MASK_FROM_ISR( irqStatus ); + return result; + } +#endif /* ifdef CONFIG_FREERTOS_PORTMUX_DEBUG */ + + +/* + * For kernel use: Release a per-CPU mux + * + * Mux must be already locked by this core + */ +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + void vPortCPUReleaseMutex( portMUX_TYPE * mux, + const char * fnName, + int line ) + { + unsigned int irqStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + + vPortCPUReleaseMutexIntsDisabled( mux, fnName, line ); + portCLEAR_INTERRUPT_MASK_FROM_ISR( irqStatus ); + } +#else + void vPortCPUReleaseMutex( portMUX_TYPE * mux ) + { + unsigned int irqStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + + vPortCPUReleaseMutexIntsDisabled( mux ); + portCLEAR_INTERRUPT_MASK_FROM_ISR( irqStatus ); + } +#endif /* ifdef CONFIG_FREERTOS_PORTMUX_DEBUG */ + +#define STACK_WATCH_AREA_SIZE ( 32 ) +#define STACK_WATCH_POINT_NUMBER ( SOC_CPU_WATCHPOINTS_NUM - 1 ) + +void vPortSetStackWatchpoint( void * pxStackStart ) +{ + /*Set watchpoint 1 to watch the last 32 bytes of the stack. */ + /*Unfortunately, the Xtensa watchpoints can't set a watchpoint on a random [base - base+n] region because */ + /*the size works by masking off the lowest address bits. For that reason, we futz a bit and watch the lowest 32 */ + /*bytes of the stack we can actually watch. In general, this can cause the watchpoint to be triggered at most */ + /*28 bytes early. The value 32 is chosen because it's larger than the stack canary, which in FreeRTOS is 20 bytes. */ + /*This way, we make sure we trigger before/when the stack canary is corrupted, not after. */ + int addr = ( int ) pxStackStart; + + addr = ( addr + 31 ) & ( ~31 ); + esp_cpu_set_watchpoint( STACK_WATCH_POINT_NUMBER, (char*)addr, 32, ESP_WATCHPOINT_STORE ); +} + +#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) + +#if defined( CONFIG_SPIRAM_SUPPORT ) + +/* + * Compare & set (S32C1) does not work in external RAM. Instead, this routine uses a mux (in internal memory) to fake it. + */ + static portMUX_TYPE extram_mux = portMUX_INITIALIZER_UNLOCKED; + + void uxPortCompareSetExtram( volatile uint32_t * addr, + uint32_t compare, + uint32_t * set ) + { + uint32_t prev; + + uint32_t oldlevel = portSET_INTERRUPT_MASK_FROM_ISR(); + + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + vPortCPUAcquireMutexIntsDisabled( &extram_mux, portMUX_NO_TIMEOUT, __FUNCTION__, __LINE__ ); + #else + vPortCPUAcquireMutexIntsDisabled( &extram_mux, portMUX_NO_TIMEOUT ); + #endif + prev = *addr; + + if( prev == compare ) + { + *addr = *set; + } + + *set = prev; + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + vPortCPUReleaseMutexIntsDisabled( &extram_mux, __FUNCTION__, __LINE__ ); + #else + vPortCPUReleaseMutexIntsDisabled( &extram_mux ); + #endif + + portCLEAR_INTERRUPT_MASK_FROM_ISR(oldlevel); + } +#endif //defined(CONFIG_SPIRAM_SUPPORT) + +#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */ + + +uint32_t xPortGetTickRateHz( void ) +{ + return ( uint32_t ) configTICK_RATE_HZ; +} + +// For now, running FreeRTOS on one core and a bare metal on the other (or other OSes) +// is not supported. For now CONFIG_FREERTOS_UNICORE and CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE +// should mirror each other's values. +// +// And since this should be true, we can just check for CONFIG_FREERTOS_UNICORE. +#if CONFIG_FREERTOS_UNICORE != CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE + #error "FreeRTOS and system configuration mismatch regarding the use of multiple cores." +#endif + +extern void esp_startup_start_app_common(void); + +void esp_startup_start_app(void) +{ +#if !CONFIG_ESP_INT_WDT +#if CONFIG_ESP32_ECO3_CACHE_LOCK_FIX + assert(!soc_has_cache_lock_bug() && "ESP32 Rev 3 + Dual Core + PSRAM requires INT WDT enabled in project config!"); +#endif +#endif + + esp_startup_start_app_common(); + + ESP_LOGI("cpu_start", "Starting scheduler on PRO CPU."); + vTaskStartScheduler(); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c new file mode 100644 index 0000000..11f119b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c @@ -0,0 +1,159 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include "FreeRTOS.h" +#include "task.h" +#include "portmacro.h" +#include "esp_system.h" +#include "esp_heap_caps_init.h" +#include "esp_int_wdt.h" +#include "esp_task_wdt.h" +#include "esp_task.h" +#include "esp_private/crosscore_int.h" +#include "esp_private/startup_internal.h" /* Required by g_spiram_ok. [refactor-todo] for g_spiram_ok */ +#include "esp_log.h" +#include "soc/soc_memory_types.h" +#include "soc/dport_access.h" +#include "sdkconfig.h" +#include "esp_freertos_hooks.h" + +#if CONFIG_IDF_TARGET_ESP32 +#include "esp32/spiram.h" +#elif CONFIG_IDF_TARGET_ESP32S2 +#include "esp32s2/spiram.h" +#elif CONFIG_IDF_TARGET_ESP32S3 +#include "esp32s3/spiram.h" +#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 +// SPIRAM is not supported on ESP32-C3 +#endif + +#if CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL +static const char* TAG = "cpu_start"; +#endif + +/* Architecture-agnostic parts of the FreeRTOS ESP-IDF port layer can go here. + * + * The actual call flow will be to call esp_startup_start_app() in /port.c, + * which will then call esp_startup_start_app_common() + */ + +// Duplicate of inaccessible xSchedulerRunning; needed at startup to avoid counting nesting +volatile unsigned port_xSchedulerRunning[portNUM_PROCESSORS] = {0}; + +// For now, running FreeRTOS on one core and a bare metal on the other (or other OSes) +// is not supported. For now CONFIG_FREERTOS_UNICORE and CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE +// should mirror each other's values. +// +// And since this should be true, we can just check for CONFIG_FREERTOS_UNICORE. +#if CONFIG_FREERTOS_UNICORE != CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE + #error "FreeRTOS and system configuration mismatch regarding the use of multiple cores." +#endif + +static void main_task(void* args); + +#ifdef CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME +void esp_gdbstub_init(void); +#endif // CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME + +extern void app_main(void); + +void esp_startup_start_app_common(void) +{ +#if CONFIG_ESP_INT_WDT + esp_int_wdt_init(); + //Initialize the interrupt watch dog for CPU0. + esp_int_wdt_cpu_init(); +#endif + + esp_crosscore_int_init(); + +#ifdef CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME + esp_gdbstub_init(); +#endif // CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME + + portBASE_TYPE res = xTaskCreatePinnedToCore(&main_task, "main", + ESP_TASK_MAIN_STACK, NULL, + ESP_TASK_MAIN_PRIO, NULL, ESP_TASK_MAIN_CORE); + assert(res == pdTRUE); + (void)res; +} + +#if !CONFIG_FREERTOS_UNICORE +static volatile bool s_other_cpu_startup_done = false; +static bool other_cpu_startup_idle_hook_cb(void) +{ + s_other_cpu_startup_done = true; + return true; +} +#endif + +static void main_task(void* args) +{ +#if !CONFIG_FREERTOS_UNICORE + // Wait for FreeRTOS initialization to finish on other core, before replacing its startup stack + esp_register_freertos_idle_hook_for_cpu(other_cpu_startup_idle_hook_cb, !xPortGetCoreID()); + while (!s_other_cpu_startup_done) { + ; + } + esp_deregister_freertos_idle_hook_for_cpu(other_cpu_startup_idle_hook_cb, !xPortGetCoreID()); +#endif + + // [refactor-todo] check if there is a way to move the following block to esp_system startup + heap_caps_enable_nonos_stack_heaps(); + + // Now we have startup stack RAM available for heap, enable any DMA pool memory +#if CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL + if (g_spiram_ok) { + esp_err_t r = esp_spiram_reserve_dma_pool(CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL); + if (r != ESP_OK) { + ESP_EARLY_LOGE(TAG, "Could not reserve internal/DMA pool (error 0x%x)", r); + abort(); + } + } +#endif + + //Initialize task wdt if configured to do so +#ifdef CONFIG_ESP_TASK_WDT_PANIC + ESP_ERROR_CHECK(esp_task_wdt_init(CONFIG_ESP_TASK_WDT_TIMEOUT_S, true)); +#elif CONFIG_ESP_TASK_WDT + ESP_ERROR_CHECK(esp_task_wdt_init(CONFIG_ESP_TASK_WDT_TIMEOUT_S, false)); +#endif + + //Add IDLE 0 to task wdt +#ifdef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 + TaskHandle_t idle_0 = xTaskGetIdleTaskHandleForCPU(0); + if(idle_0 != NULL){ + ESP_ERROR_CHECK(esp_task_wdt_add(idle_0)); + } +#endif + //Add IDLE 1 to task wdt +#ifdef CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 + TaskHandle_t idle_1 = xTaskGetIdleTaskHandleForCPU(1); + if(idle_1 != NULL){ + ESP_ERROR_CHECK(esp_task_wdt_add(idle_1)); + } +#endif + + app_main(); + vTaskDelete(NULL); +} + +// -------------------- Heap Related ----------------------- + +bool xPortCheckValidTCBMem(const void *ptr) +{ + return esp_ptr_internal(ptr) && esp_ptr_byte_accessible(ptr); +} + +bool xPortcheckValidStackMem(const void *ptr) +{ +#ifdef CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY + return esp_ptr_byte_accessible(ptr); +#else + return esp_ptr_internal(ptr) && esp_ptr_byte_accessible(ptr); +#endif +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c new file mode 100644 index 0000000..a9f437c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c @@ -0,0 +1,174 @@ +/* + * SPDX-FileCopyrightText: 2017-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include "soc/cpu.h" +#include "FreeRTOS.h" +#include "task.h" +#include "esp_intr_alloc.h" +#include "esp_err.h" +#include "esp_log.h" +#include "sdkconfig.h" +#ifdef CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER +#include "soc/periph_defs.h" +#include "soc/system_reg.h" +#include "hal/systimer_hal.h" +#include "hal/systimer_ll.h" +#endif + +#ifdef CONFIG_PM_TRACE +#include "esp_private/pm_trace.h" +#endif //CONFIG_PM_TRACE + +BaseType_t xPortSysTickHandler(void); + +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT +extern void _frxt_tick_timer_init(void); +extern void _xt_tick_divisor_init(void); + +#ifdef CONFIG_FREERTOS_CORETIMER_0 + #define SYSTICK_INTR_ID (ETS_INTERNAL_TIMER0_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) +#endif +#ifdef CONFIG_FREERTOS_CORETIMER_1 + #define SYSTICK_INTR_ID (ETS_INTERNAL_TIMER1_INTR_SOURCE+ETS_INTERNAL_INTR_SOURCE_OFF) +#endif + +/** + * @brief Initialize CCONT timer to generate the tick interrupt + * + */ +void vPortSetupTimer(void) +{ + /* Init the tick divisor value */ + _xt_tick_divisor_init(); + + _frxt_tick_timer_init(); +} + + +#elif CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER + +_Static_assert(SOC_CPU_CORES_NUM <= SOC_SYSTIMER_ALARM_NUM - 1, "the number of cores must match the number of core alarms in SYSTIMER"); + +void SysTickIsrHandler(void *arg); + +static uint32_t s_handled_systicks[portNUM_PROCESSORS] = { 0 }; + +#define SYSTICK_INTR_ID (ETS_SYSTIMER_TARGET0_EDGE_INTR_SOURCE) + +/** + * @brief Set up the systimer peripheral to generate the tick interrupt + * + * Both timer alarms are configured in periodic mode. + * It is done at the same time so SysTicks for both CPUs occur at the same time or very close. + * Shifts a time of triggering interrupts for core 0 and core 1. + */ +void vPortSetupTimer(void) +{ + unsigned cpuid = xPortGetCoreID(); +#ifdef CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 + const unsigned level = ESP_INTR_FLAG_LEVEL3; +#else + const unsigned level = ESP_INTR_FLAG_LEVEL1; +#endif + /* Systimer HAL layer object */ + static systimer_hal_context_t systimer_hal; + /* set system timer interrupt vector */ + ESP_ERROR_CHECK(esp_intr_alloc(ETS_SYSTIMER_TARGET0_EDGE_INTR_SOURCE + cpuid, ESP_INTR_FLAG_IRAM | level, SysTickIsrHandler, &systimer_hal, NULL)); + + if (cpuid == 0) { + systimer_hal_init(&systimer_hal); + systimer_ll_set_counter_value(systimer_hal.dev, SYSTIMER_LL_COUNTER_OS_TICK, 0); + systimer_ll_apply_counter_value(systimer_hal.dev, SYSTIMER_LL_COUNTER_OS_TICK); + + for (cpuid = 0; cpuid < SOC_CPU_CORES_NUM; cpuid++) { + systimer_hal_counter_can_stall_by_cpu(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK, cpuid, false); + } + + for (cpuid = 0; cpuid < portNUM_PROCESSORS; ++cpuid) { + uint32_t alarm_id = SYSTIMER_LL_ALARM_OS_TICK_CORE0 + cpuid; + + /* configure the timer */ + systimer_hal_connect_alarm_counter(&systimer_hal, alarm_id, SYSTIMER_LL_COUNTER_OS_TICK); + systimer_hal_set_alarm_period(&systimer_hal, alarm_id, 1000000UL / CONFIG_FREERTOS_HZ); + systimer_hal_select_alarm_mode(&systimer_hal, alarm_id, SYSTIMER_ALARM_MODE_PERIOD); + systimer_hal_counter_can_stall_by_cpu(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK, cpuid, true); + if (cpuid == 0) { + systimer_hal_enable_alarm_int(&systimer_hal, alarm_id); + systimer_hal_enable_counter(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK); +#ifndef CONFIG_FREERTOS_UNICORE + // SysTick of core 0 and core 1 are shifted by half of period + systimer_hal_counter_value_advance(&systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK, 1000000UL / CONFIG_FREERTOS_HZ / 2); +#endif + } + } + } else { + uint32_t alarm_id = SYSTIMER_LL_ALARM_OS_TICK_CORE0 + cpuid; + systimer_hal_enable_alarm_int(&systimer_hal, alarm_id); + } +} + +/** + * @brief Systimer interrupt handler. + * + * The Systimer interrupt for SysTick works in periodic mode no need to calc the next alarm. + * If a timer interrupt is ever serviced more than one tick late, it is necessary to process multiple ticks. + */ +IRAM_ATTR void SysTickIsrHandler(void *arg) +{ + uint32_t cpuid = xPortGetCoreID(); + systimer_hal_context_t *systimer_hal = (systimer_hal_context_t *)arg; +#ifdef CONFIG_PM_TRACE + ESP_PM_TRACE_ENTER(TICK, cpuid); +#endif + + uint32_t alarm_id = SYSTIMER_LL_ALARM_OS_TICK_CORE0 + cpuid; + do { + systimer_ll_clear_alarm_int(systimer_hal->dev, alarm_id); + + uint32_t diff = systimer_hal_get_counter_value(systimer_hal, SYSTIMER_LL_COUNTER_OS_TICK) / systimer_ll_get_alarm_period(systimer_hal->dev, alarm_id) - s_handled_systicks[cpuid]; + if (diff > 0) { + if (s_handled_systicks[cpuid] == 0) { + s_handled_systicks[cpuid] = diff; + diff = 1; + } else { + s_handled_systicks[cpuid] += diff; + } + + do { + xPortSysTickHandler(); + } while (--diff); + } + } while (systimer_ll_is_alarm_int_fired(systimer_hal->dev, alarm_id)); + +#ifdef CONFIG_PM_TRACE + ESP_PM_TRACE_EXIT(TICK, cpuid); +#endif +} + +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT + +/** + * @brief Handler of SysTick + * + * The function is called from: + * - _frxt_timer_int for xtensa with CONFIG_FREERTOS_SYSTICK_USES_CCOUNT + * - SysTickIsrHandler for xtensa with CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER + * - SysTickIsrHandler for riscv + */ +BaseType_t xPortSysTickHandler(void) +{ + portbenchmarkIntLatency(); + traceISR_ENTER(SYSTICK_INTR_ID); + BaseType_t ret = xTaskIncrementTick(); + if(ret != pdFALSE) { + portYIELD_FROM_ISR(); + } else { + traceISR_EXIT(); + } + return ret; +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S new file mode 100644 index 0000000..c7f6538 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S @@ -0,0 +1,701 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "xtensa_rtos.h" +#include "sdkconfig.h" +#include "esp_idf_version.h" + +#define TOPOFSTACK_OFFS 0x00 /* StackType_t *pxTopOfStack */ +#define CP_TOPOFSTACK_OFFS 0x04 /* xMPU_SETTINGS.coproc_area */ + +.extern pxCurrentTCB + +/* +******************************************************************************* +* Interrupt stack. The size of the interrupt stack is determined by the config +* parameter "configISR_STACK_SIZE" in FreeRTOSConfig.h +******************************************************************************* +*/ + + .data + .align 16 + .global port_IntStack + .global port_IntStackTop + .global port_switch_flag +port_IntStack: + .space configISR_STACK_SIZE*portNUM_PROCESSORS /* This allocates stacks for each individual CPU. */ +port_IntStackTop: + .word 0 +port_switch_flag: + .space portNUM_PROCESSORS*4 /* One flag for each individual CPU. */ + + .text + +/* +******************************************************************************* +* _frxt_setup_switch +* void _frxt_setup_switch(void); +* +* Sets an internal flag indicating that a task switch is required on return +* from interrupt handling. +* +******************************************************************************* +*/ + .global _frxt_setup_switch + .type _frxt_setup_switch,@function + .align 4 +_frxt_setup_switch: + + ENTRY(16) + + getcoreid a3 + movi a2, port_switch_flag + addx4 a2, a3, a2 + + movi a3, 1 + s32i a3, a2, 0 + + RET(16) + + + + + + +/* +******************************************************************************* +* _frxt_int_enter +* void _frxt_int_enter(void) +* +* Implements the Xtensa RTOS porting layer's XT_RTOS_INT_ENTER function for +* freeRTOS. Saves the rest of the interrupt context (not already saved). +* May only be called from assembly code by the 'call0' instruction, with +* interrupts disabled. +* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h. +* +******************************************************************************* +*/ + .globl _frxt_int_enter + .type _frxt_int_enter,@function + .align 4 +_frxt_int_enter: + + /* Save a12-13 in the stack frame as required by _xt_context_save. */ + s32i a12, a1, XT_STK_A12 + s32i a13, a1, XT_STK_A13 + + /* Save return address in a safe place (free a0). */ + mov a12, a0 + + /* Save the rest of the interrupted context (preserves A12-13). */ + call0 _xt_context_save + + /* + Save interrupted task's SP in TCB only if not nesting. + Manage nesting directly rather than call the generic IntEnter() + (in windowed ABI we can't call a C function here anyway because PS.EXCM is still set). + */ + getcoreid a4 + movi a2, port_xSchedulerRunning + addx4 a2, a4, a2 + movi a3, port_interruptNesting + addx4 a3, a4, a3 + l32i a2, a2, 0 /* a2 = port_xSchedulerRunning */ + beqz a2, 1f /* scheduler not running, no tasks */ + l32i a2, a3, 0 /* a2 = port_interruptNesting */ + addi a2, a2, 1 /* increment nesting count */ + s32i a2, a3, 0 /* save nesting count */ + bnei a2, 1, .Lnested /* !=0 before incr, so nested */ + + movi a2, pxCurrentTCB + addx4 a2, a4, a2 + l32i a2, a2, 0 /* a2 = current TCB */ + beqz a2, 1f + s32i a1, a2, TOPOFSTACK_OFFS /* pxCurrentTCB->pxTopOfStack = SP */ + movi a1, port_IntStack+configISR_STACK_SIZE /* a1 = top of intr stack for CPU 0 */ + movi a2, configISR_STACK_SIZE /* add configISR_STACK_SIZE * cpu_num to arrive at top of stack for cpu_num */ + mull a2, a4, a2 + add a1, a1, a2 /* for current proc */ + + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifdef CONFIG_FREERTOS_FPU_IN_ISR + #if XCHAL_CP_NUM > 0 + rsr a3, CPENABLE /* Restore thread scope CPENABLE */ + addi sp, sp,-4 /* ISR will manage FPU coprocessor by forcing */ + s32i a3, a1, 0 /* its trigger */ + #endif + #endif + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + +.Lnested: +1: + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifdef CONFIG_FREERTOS_FPU_IN_ISR + #if XCHAL_CP_NUM > 0 + movi a3, 0 /* whilst ISRs pending keep CPENABLE exception active */ + wsr a3, CPENABLE + rsync + #endif + #endif + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + mov a0, a12 /* restore return addr and return */ + ret + +/* +******************************************************************************* +* _frxt_int_exit +* void _frxt_int_exit(void) +* +* Implements the Xtensa RTOS porting layer's XT_RTOS_INT_EXIT function for +* FreeRTOS. If required, calls vPortYieldFromInt() to perform task context +* switching, restore the (possibly) new task's context, and return to the +* exit dispatcher saved in the task's stack frame at XT_STK_EXIT. +* May only be called from assembly code by the 'call0' instruction. Does not +* return to caller. +* See the description of the XT_RTOS_ENTER macro in xtensa_rtos.h. +* +******************************************************************************* +*/ + .globl _frxt_int_exit + .type _frxt_int_exit,@function + .align 4 +_frxt_int_exit: + + getcoreid a4 + movi a2, port_xSchedulerRunning + addx4 a2, a4, a2 + movi a3, port_interruptNesting + addx4 a3, a4, a3 + rsil a0, XCHAL_EXCM_LEVEL /* lock out interrupts */ + l32i a2, a2, 0 /* a2 = port_xSchedulerRunning */ + beqz a2, .Lnoswitch /* scheduler not running, no tasks */ + l32i a2, a3, 0 /* a2 = port_interruptNesting */ + addi a2, a2, -1 /* decrement nesting count */ + s32i a2, a3, 0 /* save nesting count */ + bnez a2, .Lnesting /* !=0 after decr so still nested */ + + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifdef CONFIG_FREERTOS_FPU_IN_ISR + #if XCHAL_CP_NUM > 0 + l32i a3, sp, 0 /* Grab last CPENABLE before leave ISR */ + addi sp, sp, 4 + wsr a3, CPENABLE + rsync /* ensure CPENABLE was modified */ + #endif + #endif + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + movi a2, pxCurrentTCB + addx4 a2, a4, a2 + l32i a2, a2, 0 /* a2 = current TCB */ + beqz a2, 1f /* no task ? go to dispatcher */ + l32i a1, a2, TOPOFSTACK_OFFS /* SP = pxCurrentTCB->pxTopOfStack */ + + movi a2, port_switch_flag /* address of switch flag */ + addx4 a2, a4, a2 /* point to flag for this cpu */ + l32i a3, a2, 0 /* a3 = port_switch_flag */ + beqz a3, .Lnoswitch /* flag = 0 means no switch reqd */ + movi a3, 0 + s32i a3, a2, 0 /* zero out the flag for next time */ + +1: + /* + Call0 ABI callee-saved regs a12-15 need to be saved before possible preemption. + However a12-13 were already saved by _frxt_int_enter(). + */ + #ifdef __XTENSA_CALL0_ABI__ + s32i a14, a1, XT_STK_A14 + s32i a15, a1, XT_STK_A15 + #endif + + #ifdef __XTENSA_CALL0_ABI__ + call0 vPortYieldFromInt /* call dispatch inside the function; never returns */ + #else + call4 vPortYieldFromInt /* this one returns */ + call0 _frxt_dispatch /* tail-call dispatcher */ + /* Never returns here. */ + #endif + +.Lnoswitch: + /* + If we came here then about to resume the interrupted task. + */ + +.Lnesting: + /* + We come here only if there was no context switch, that is if this + is a nested interrupt, or the interrupted task was not preempted. + In either case there's no need to load the SP. + */ + + /* Restore full context from interrupt stack frame */ + call0 _xt_context_restore + + /* + Must return via the exit dispatcher corresponding to the entrypoint from which + this was called. Interruptee's A0, A1, PS, PC are restored and the interrupt + stack frame is deallocated in the exit dispatcher. + */ + l32i a0, a1, XT_STK_EXIT + ret + + +/* +********************************************************************************************************** +* _frxt_timer_int +* void _frxt_timer_int(void) +* +* Implements the Xtensa RTOS porting layer's XT_RTOS_TIMER_INT function for FreeRTOS. +* Called every timer interrupt. +* Manages the tick timer and calls xPortSysTickHandler() every tick. +* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h. +* +* Callable from C (obeys ABI conventions). Implemented in assmebly code for performance. +* +********************************************************************************************************** +*/ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT + .globl _frxt_timer_int + .type _frxt_timer_int,@function + .align 4 +_frxt_timer_int: + + /* + Xtensa timers work by comparing a cycle counter with a preset value. Once the match occurs + an interrupt is generated, and the handler has to set a new cycle count into the comparator. + To avoid clock drift due to interrupt latency, the new cycle count is computed from the old, + not the time the interrupt was serviced. However if a timer interrupt is ever serviced more + than one tick late, it is necessary to process multiple ticks until the new cycle count is + in the future, otherwise the next timer interrupt would not occur until after the cycle + counter had wrapped (2^32 cycles later). + + do { + ticks++; + old_ccompare = read_ccompare_i(); + write_ccompare_i( old_ccompare + divisor ); + service one tick; + diff = read_ccount() - old_ccompare; + } while ( diff > divisor ); + */ + + ENTRY(16) + + #ifdef CONFIG_PM_TRACE + movi a6, 1 /* = ESP_PM_TRACE_TICK */ + getcoreid a7 + call4 esp_pm_trace_enter + #endif // CONFIG_PM_TRACE + +.L_xt_timer_int_catchup: + + /* Update the timer comparator for the next tick. */ + #ifdef XT_CLOCK_FREQ + movi a2, XT_TICK_DIVISOR /* a2 = comparator increment */ + #else + movi a3, _xt_tick_divisor + l32i a2, a3, 0 /* a2 = comparator increment */ + #endif + rsr a3, XT_CCOMPARE /* a3 = old comparator value */ + add a4, a3, a2 /* a4 = new comparator value */ + wsr a4, XT_CCOMPARE /* update comp. and clear interrupt */ + esync + + #ifdef __XTENSA_CALL0_ABI__ + /* Preserve a2 and a3 across C calls. */ + s32i a2, sp, 4 + s32i a3, sp, 8 + #endif + + /* Call the FreeRTOS tick handler (see port_systick.c). */ + #ifdef __XTENSA_CALL0_ABI__ + call0 xPortSysTickHandler + #else + call4 xPortSysTickHandler + #endif + + #ifdef __XTENSA_CALL0_ABI__ + /* Restore a2 and a3. */ + l32i a2, sp, 4 + l32i a3, sp, 8 + #endif + + /* Check if we need to process more ticks to catch up. */ + esync /* ensure comparator update complete */ + rsr a4, CCOUNT /* a4 = cycle count */ + sub a4, a4, a3 /* diff = ccount - old comparator */ + blt a2, a4, .L_xt_timer_int_catchup /* repeat while diff > divisor */ + +#ifdef CONFIG_PM_TRACE + movi a6, 1 /* = ESP_PM_TRACE_TICK */ + getcoreid a7 + call4 esp_pm_trace_exit +#endif // CONFIG_PM_TRACE + + RET(16) +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT + + /* +********************************************************************************************************** +* _frxt_tick_timer_init +* void _frxt_tick_timer_init(void) +* +* Initialize timer and timer interrrupt handler (_xt_tick_divisor_init() has already been been called). +* Callable from C (obeys ABI conventions on entry). +* +********************************************************************************************************** +*/ +#ifdef CONFIG_FREERTOS_SYSTICK_USES_CCOUNT + .globl _frxt_tick_timer_init + .type _frxt_tick_timer_init,@function + .align 4 +_frxt_tick_timer_init: + + ENTRY(16) + + + /* Set up the periodic tick timer (assume enough time to complete init). */ + #ifdef XT_CLOCK_FREQ + movi a3, XT_TICK_DIVISOR + #else + movi a2, _xt_tick_divisor + l32i a3, a2, 0 + #endif + rsr a2, CCOUNT /* current cycle count */ + add a2, a2, a3 /* time of first timer interrupt */ + wsr a2, XT_CCOMPARE /* set the comparator */ + + /* + Enable the timer interrupt at the device level. Don't write directly + to the INTENABLE register because it may be virtualized. + */ + #ifdef __XTENSA_CALL0_ABI__ + movi a2, XT_TIMER_INTEN + call0 xt_ints_on + #else + movi a6, XT_TIMER_INTEN + call4 xt_ints_on + #endif + + RET(16) +#endif // CONFIG_FREERTOS_SYSTICK_USES_CCOUNT + +/* +********************************************************************************************************** +* DISPATCH THE HIGH READY TASK +* void _frxt_dispatch(void) +* +* Switch context to the highest priority ready task, restore its state and dispatch control to it. +* +* This is a common dispatcher that acts as a shared exit path for all the context switch functions +* including vPortYield() and vPortYieldFromInt(), all of which tail-call this dispatcher +* (for windowed ABI vPortYieldFromInt() calls it indirectly via _frxt_int_exit() ). +* +* The Xtensa port uses different stack frames for solicited and unsolicited task suspension (see +* comments on stack frames in xtensa_context.h). This function restores the state accordingly. +* If restoring a task that solicited entry, restores the minimal state and leaves CPENABLE clear. +* If restoring a task that was preempted, restores all state including the task's CPENABLE. +* +* Entry: +* pxCurrentTCB points to the TCB of the task to suspend, +* Because it is tail-called without a true function entrypoint, it needs no 'entry' instruction. +* +* Exit: +* If incoming task called vPortYield() (solicited), this function returns as if from vPortYield(). +* If incoming task was preempted by an interrupt, this function jumps to exit dispatcher. +* +********************************************************************************************************** +*/ + .globl _frxt_dispatch + .type _frxt_dispatch,@function + .align 4 +_frxt_dispatch: + + #ifdef __XTENSA_CALL0_ABI__ + call0 vTaskSwitchContext // Get next TCB to resume + movi a2, pxCurrentTCB + getcoreid a3 + addx4 a2, a3, a2 + #else + call4 vTaskSwitchContext // Get next TCB to resume + movi a2, pxCurrentTCB + getcoreid a3 + addx4 a2, a3, a2 + #endif + l32i a3, a2, 0 + l32i sp, a3, TOPOFSTACK_OFFS /* SP = next_TCB->pxTopOfStack; */ + s32i a3, a2, 0 + + /* Determine the type of stack frame. */ + l32i a2, sp, XT_STK_EXIT /* exit dispatcher or solicited flag */ + bnez a2, .L_frxt_dispatch_stk + +.L_frxt_dispatch_sol: + + /* Solicited stack frame. Restore minimal context and return from vPortYield(). */ + #if XCHAL_HAVE_THREADPTR + l32i a2, sp, XT_SOL_THREADPTR + wur.threadptr a2 + #endif + l32i a3, sp, XT_SOL_PS + #ifdef __XTENSA_CALL0_ABI__ + l32i a12, sp, XT_SOL_A12 + l32i a13, sp, XT_SOL_A13 + l32i a14, sp, XT_SOL_A14 + l32i a15, sp, XT_SOL_A15 + #endif + l32i a0, sp, XT_SOL_PC + #if XCHAL_CP_NUM > 0 + /* Ensure wsr.CPENABLE is complete (should be, it was cleared on entry). */ + rsync + #endif + /* As soons as PS is restored, interrupts can happen. No need to sync PS. */ + wsr a3, PS + #ifdef __XTENSA_CALL0_ABI__ + addi sp, sp, XT_SOL_FRMSZ + ret + #else + retw + #endif + +.L_frxt_dispatch_stk: + + #if XCHAL_CP_NUM > 0 + /* Restore CPENABLE from task's co-processor save area. */ + movi a3, pxCurrentTCB /* cp_state = */ + getcoreid a2 + addx4 a3, a2, a3 + l32i a3, a3, 0 + l32i a2, a3, CP_TOPOFSTACK_OFFS /* StackType_t *pxStack; */ + l16ui a3, a2, XT_CPENABLE /* CPENABLE = cp_state->cpenable; */ + wsr a3, CPENABLE + #endif + + /* Interrupt stack frame. Restore full context and return to exit dispatcher. */ + call0 _xt_context_restore + + /* In Call0 ABI, restore callee-saved regs (A12, A13 already restored). */ + #ifdef __XTENSA_CALL0_ABI__ + l32i a14, sp, XT_STK_A14 + l32i a15, sp, XT_STK_A15 + #endif + + #if XCHAL_CP_NUM > 0 + /* Ensure wsr.CPENABLE has completed. */ + rsync + #endif + + /* + Must return via the exit dispatcher corresponding to the entrypoint from which + this was called. Interruptee's A0, A1, PS, PC are restored and the interrupt + stack frame is deallocated in the exit dispatcher. + */ + l32i a0, sp, XT_STK_EXIT + ret + + +/* +********************************************************************************************************** +* PERFORM A SOLICTED CONTEXT SWITCH (from a task) +* void vPortYield(void) +* +* This function saves the minimal state needed for a solicited task suspension, clears CPENABLE, +* then tail-calls the dispatcher _frxt_dispatch() to perform the actual context switch +* +* At Entry: +* pxCurrentTCB points to the TCB of the task to suspend +* Callable from C (obeys ABI conventions on entry). +* +* Does not return to caller. +* +********************************************************************************************************** +*/ + .globl vPortYield + .type vPortYield,@function + .align 4 +vPortYield: + + #ifdef __XTENSA_CALL0_ABI__ + addi sp, sp, -XT_SOL_FRMSZ + #else + entry sp, XT_SOL_FRMSZ + #endif + + rsr a2, PS + s32i a0, sp, XT_SOL_PC + s32i a2, sp, XT_SOL_PS + #if XCHAL_HAVE_THREADPTR + rur.threadptr a2 + s32i a2, sp, XT_SOL_THREADPTR + #endif + #ifdef __XTENSA_CALL0_ABI__ + s32i a12, sp, XT_SOL_A12 /* save callee-saved registers */ + s32i a13, sp, XT_SOL_A13 + s32i a14, sp, XT_SOL_A14 + s32i a15, sp, XT_SOL_A15 + #else + /* Spill register windows. Calling xthal_window_spill() causes extra */ + /* spills and reloads, so we will set things up to call the _nw version */ + /* instead to save cycles. */ + movi a6, ~(PS_WOE_MASK|PS_INTLEVEL_MASK) /* spills a4-a7 if needed */ + and a2, a2, a6 /* clear WOE, INTLEVEL */ + addi a2, a2, XCHAL_EXCM_LEVEL /* set INTLEVEL */ + wsr a2, PS + rsync + call0 xthal_window_spill_nw + l32i a2, sp, XT_SOL_PS /* restore PS */ + wsr a2, PS + #endif + + rsil a2, XCHAL_EXCM_LEVEL /* disable low/med interrupts */ + + #if XCHAL_CP_NUM > 0 + /* Save coprocessor callee-saved state (if any). At this point CPENABLE */ + /* should still reflect which CPs were in use (enabled). */ + call0 _xt_coproc_savecs + #endif + + movi a2, pxCurrentTCB + getcoreid a3 + addx4 a2, a3, a2 + l32i a2, a2, 0 /* a2 = pxCurrentTCB */ + movi a3, 0 + s32i a3, sp, XT_SOL_EXIT /* 0 to flag as solicited frame */ + s32i sp, a2, TOPOFSTACK_OFFS /* pxCurrentTCB->pxTopOfStack = SP */ + + #if XCHAL_CP_NUM > 0 + /* Clear CPENABLE, also in task's co-processor state save area. */ + l32i a2, a2, CP_TOPOFSTACK_OFFS /* a2 = pxCurrentTCB->cp_state */ + movi a3, 0 + wsr a3, CPENABLE + beqz a2, 1f + s16i a3, a2, XT_CPENABLE /* clear saved cpenable */ +1: + #endif + + /* Tail-call dispatcher. */ + call0 _frxt_dispatch + /* Never reaches here. */ + + +/* +********************************************************************************************************** +* PERFORM AN UNSOLICITED CONTEXT SWITCH (from an interrupt) +* void vPortYieldFromInt(void) +* +* This calls the context switch hook (removed), saves and clears CPENABLE, then tail-calls the dispatcher +* _frxt_dispatch() to perform the actual context switch. +* +* At Entry: +* Interrupted task context has been saved in an interrupt stack frame at pxCurrentTCB->pxTopOfStack. +* pxCurrentTCB points to the TCB of the task to suspend, +* Callable from C (obeys ABI conventions on entry). +* +* At Exit: +* Windowed ABI defers the actual context switch until the stack is unwound to interrupt entry. +* Call0 ABI tail-calls the dispatcher directly (no need to unwind) so does not return to caller. +* +********************************************************************************************************** +*/ + .globl vPortYieldFromInt + .type vPortYieldFromInt,@function + .align 4 +vPortYieldFromInt: + + ENTRY(16) + + #if XCHAL_CP_NUM > 0 + /* Save CPENABLE in task's co-processor save area, and clear CPENABLE. */ + movi a3, pxCurrentTCB /* cp_state = */ + getcoreid a2 + addx4 a3, a2, a3 + l32i a3, a3, 0 + + l32i a2, a3, CP_TOPOFSTACK_OFFS + + rsr a3, CPENABLE + s16i a3, a2, XT_CPENABLE /* cp_state->cpenable = CPENABLE; */ + movi a3, 0 + wsr a3, CPENABLE /* disable all co-processors */ + #endif + + #ifdef __XTENSA_CALL0_ABI__ + /* Tail-call dispatcher. */ + call0 _frxt_dispatch + /* Never reaches here. */ + #else + RET(16) + #endif + +/* +********************************************************************************************************** +* _frxt_task_coproc_state +* void _frxt_task_coproc_state(void) +* +* Implements the Xtensa RTOS porting layer's XT_RTOS_CP_STATE function for FreeRTOS. +* +* May only be called when a task is running, not within an interrupt handler (returns 0 in that case). +* May only be called from assembly code by the 'call0' instruction. Does NOT obey ABI conventions. +* Returns in A15 a pointer to the base of the co-processor state save area for the current task. +* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h. +* +********************************************************************************************************** +*/ +#if XCHAL_CP_NUM > 0 + + .globl _frxt_task_coproc_state + .type _frxt_task_coproc_state,@function + .align 4 +_frxt_task_coproc_state: + + + /* We can use a3 as a scratchpad, the instances of code calling XT_RTOS_CP_STATE don't seem to need it saved. */ + getcoreid a3 + movi a15, port_xSchedulerRunning /* if (port_xSchedulerRunning */ + addx4 a15, a3,a15 + l32i a15, a15, 0 + beqz a15, 1f + movi a15, port_interruptNesting /* && port_interruptNesting == 0 */ + addx4 a15, a3, a15 + l32i a15, a15, 0 + bnez a15, 1f + + movi a15, pxCurrentTCB + addx4 a15, a3, a15 + l32i a15, a15, 0 /* && pxCurrentTCB != 0) { */ + + beqz a15, 2f + l32i a15, a15, CP_TOPOFSTACK_OFFS + ret + +1: movi a15, 0 +2: ret + +#endif /* XCHAL_CP_NUM > 0 */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h new file mode 100644 index 0000000..98d924f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h @@ -0,0 +1,100 @@ +/* + * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/* This header exists for performance reasons, in order to inline the + * implementation of vPortCPUAcquireMutexIntsDisabled and + * vPortCPUReleaseMutexIntsDisabled into the + * vTaskEnterCritical/vTaskExitCritical functions in task.c as well as the + * vPortCPUAcquireMutex/vPortCPUReleaseMutex implementations. + * + * Normally this kind of performance hack is over the top, but + * vTaskEnterCritical/vTaskExitCritical is called a great + * deal by FreeRTOS internals. + * + * It should be #included by freertos port.c or tasks.c, in esp-idf. + * + * The way it works is that it essentially uses portmux_impl.inc.h as a + * generator template of sorts. When no external memory is used, this + * template is only used to generate the vPortCPUAcquireMutexIntsDisabledInternal + * and vPortCPUReleaseMutexIntsDisabledInternal functions, which use S32C1 to + * do an atomic compare & swap. When external memory is used the functions + * vPortCPUAcquireMutexIntsDisabledExtram and vPortCPUReleaseMutexIntsDisabledExtram + * are also generated, which use uxPortCompareSetExtram to fake the S32C1 instruction. + * The wrapper functions vPortCPUAcquireMutexIntsDisabled and + * vPortCPUReleaseMutexIntsDisabled will then use the appropriate function to do the + * actual lock/unlock. + */ +#include "soc/cpu.h" +#include "portable.h" + +/* XOR one core ID with this value to get the other core ID */ +#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) +#define CORE_ID_XOR_SWAP ( CORE_ID_PRO ^ CORE_ID_APP ) +#else +#define CORE_ID_REGVAL_XOR_SWAP (CORE_ID_REGVAL_PRO ^ CORE_ID_REGVAL_APP) +#endif + + + +/*Define the mux routines for use with muxes in internal RAM */ +#define PORTMUX_AQUIRE_MUX_FN_NAME vPortCPUAcquireMutexIntsDisabledInternal +#define PORTMUX_RELEASE_MUX_FN_NAME vPortCPUReleaseMutexIntsDisabledInternal +#define PORTMUX_COMPARE_SET_FN_NAME uxPortCompareSet +#include "portmux_impl.inc.h" +#undef PORTMUX_AQUIRE_MUX_FN_NAME +#undef PORTMUX_RELEASE_MUX_FN_NAME +#undef PORTMUX_COMPARE_SET_FN_NAME + + +#if defined( CONFIG_SPIRAM_SUPPORT ) + + #define PORTMUX_AQUIRE_MUX_FN_NAME vPortCPUAcquireMutexIntsDisabledExtram + #define PORTMUX_RELEASE_MUX_FN_NAME vPortCPUReleaseMutexIntsDisabledExtram + #define PORTMUX_COMPARE_SET_FN_NAME uxPortCompareSetExtram + #include "portmux_impl.inc.h" + #undef PORTMUX_AQUIRE_MUX_FN_NAME + #undef PORTMUX_RELEASE_MUX_FN_NAME + #undef PORTMUX_COMPARE_SET_FN_NAME + +#endif + + +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + #define PORTMUX_AQUIRE_MUX_FN_ARGS portMUX_TYPE * mux, int timeout_cycles, const char * fnName, int line + #define PORTMUX_RELEASE_MUX_FN_ARGS portMUX_TYPE * mux, const char * fnName, int line + #define PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( x ) x, timeout_cycles, fnName, line + #define PORTMUX_RELEASE_MUX_FN_CALL_ARGS( x ) x, fnName, line +#else + #define PORTMUX_AQUIRE_MUX_FN_ARGS portMUX_TYPE * mux, int timeout_cycles + #define PORTMUX_RELEASE_MUX_FN_ARGS portMUX_TYPE * mux + #define PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( x ) x, timeout_cycles + #define PORTMUX_RELEASE_MUX_FN_CALL_ARGS( x ) x +#endif + + +static inline bool __attribute__( ( always_inline ) ) vPortCPUAcquireMutexIntsDisabled( PORTMUX_AQUIRE_MUX_FN_ARGS ) +{ + #if defined( CONFIG_SPIRAM_SUPPORT ) + if( esp_ptr_external_ram( mux ) ) + { + return vPortCPUAcquireMutexIntsDisabledExtram( PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( mux ) ); + } + #endif + return vPortCPUAcquireMutexIntsDisabledInternal( PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( mux ) ); +} + + +static inline void vPortCPUReleaseMutexIntsDisabled( PORTMUX_RELEASE_MUX_FN_ARGS ) +{ + #if defined( CONFIG_SPIRAM_SUPPORT ) + if( esp_ptr_external_ram( mux ) ) + { + vPortCPUReleaseMutexIntsDisabledExtram( PORTMUX_RELEASE_MUX_FN_CALL_ARGS( mux ) ); + return; + } + #endif + vPortCPUReleaseMutexIntsDisabledInternal( PORTMUX_RELEASE_MUX_FN_CALL_ARGS( mux ) ); +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h new file mode 100644 index 0000000..9d7c826 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h @@ -0,0 +1,195 @@ +/* + * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + + +/* + * Warning: funky preprocessor hackery ahead. Including these headers will generate two + * functions, which names are defined by the preprocessor macros + * PORTMUX_AQUIRE_MUX_FN_NAME and PORTMUX_RELEASE_MUX_FN_NAME. In order to do the compare + * and exchange function, they will use whatever PORTMUX_COMPARE_SET_FN_NAME resolves to. + * + * In some scenarios, this header is included *twice* in portmux_impl.h: one time + * for the 'normal' mux code which uses a compare&exchange routine, another time + * to generate code for a second set of these routines that use a second mux + * (in internal ram) to fake a compare&exchange on a variable in external memory. + */ + + + +static inline bool __attribute__( ( always_inline ) ) +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + PORTMUX_AQUIRE_MUX_FN_NAME( portMUX_TYPE * mux, + int timeout_cycles, + const char * fnName, + int line ) + { +#else + PORTMUX_AQUIRE_MUX_FN_NAME( portMUX_TYPE * mux, int timeout_cycles ) + { + #endif + + + #if !CONFIG_FREERTOS_UNICORE + uint32_t res; + portBASE_TYPE coreID, otherCoreID; + uint32_t ccount_start; + bool set_timeout = timeout_cycles > portMUX_NO_TIMEOUT; + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + if( !set_timeout ) + { + timeout_cycles = 10000; /* Always set a timeout in debug mode */ + set_timeout = true; + } + #endif + + if( set_timeout ) /* Timeout */ + { + RSR( CCOUNT, ccount_start ); + } + + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + uint32_t owner = mux->owner; + + #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) + if( ( owner != portMUX_FREE_VAL ) && ( owner != CORE_ID_PRO ) && ( owner != CORE_ID_APP ) ) + #else + if (owner != portMUX_FREE_VAL && owner != CORE_ID_REGVAL_PRO && owner != CORE_ID_REGVAL_APP) + #endif + { + ets_printf( "ERROR: vPortCPUAcquireMutex: mux %p is uninitialized (0x%X)! Called from %s line %d.\n", mux, owner, fnName, line ); + mux->owner = portMUX_FREE_VAL; + } + #endif + + /* Spin until we own the core */ + + RSR( PRID, coreID ); + + /* Note: coreID is the full 32 bit core ID (CORE_ID_PRO/CORE_ID_APP), + * not the 0/1 value returned by xPortGetCoreID() + */ + #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) + otherCoreID = CORE_ID_XOR_SWAP ^ coreID; + #else + otherCoreID = CORE_ID_REGVAL_XOR_SWAP ^ coreID; + #endif + + do + { + /* mux->owner should be one of portMUX_FREE_VAL, CORE_ID_PRO, + * CORE_ID_APP: + * + * - If portMUX_FREE_VAL, we want to atomically set to 'coreID'. + * - If "our" coreID, we can drop through immediately. + * - If "otherCoreID", we spin here. + */ + res = coreID; + PORTMUX_COMPARE_SET_FN_NAME( &mux->owner, portMUX_FREE_VAL, &res ); + + if( res != otherCoreID ) + { + break; /* mux->owner is "our" coreID */ + } + + if( set_timeout ) + { + uint32_t ccount_now; + RSR( CCOUNT, ccount_now ); + + if( ccount_now - ccount_start > ( unsigned ) timeout_cycles ) + { + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + ets_printf( "Timeout on mux! last non-recursive lock %s line %d, curr %s line %d\n", mux->lastLockedFn, mux->lastLockedLine, fnName, line ); + ets_printf( "Owner 0x%x count %d\n", mux->owner, mux->count ); + #endif + return false; + } + } + } while( 1 ); + + assert( res == coreID || res == portMUX_FREE_VAL ); /* any other value implies memory corruption or uninitialized mux */ + assert( ( res == portMUX_FREE_VAL ) == ( mux->count == 0 ) ); /* we're first to lock iff count is zero */ + assert( mux->count < 0xFF ); /* Bad count value implies memory corruption */ + + /* now we own it, we can increment the refcount */ + mux->count++; + + + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + if( res == portMUX_FREE_VAL ) /*initial lock */ + { + mux->lastLockedFn = fnName; + mux->lastLockedLine = line; + } + else + { + ets_printf( "Recursive lock: count=%d last non-recursive lock %s line %d, curr %s line %d\n", mux->count - 1, + mux->lastLockedFn, mux->lastLockedLine, fnName, line ); + } + #endif /* CONFIG_FREERTOS_PORTMUX_DEBUG */ + #endif /* CONFIG_FREERTOS_UNICORE */ + return true; + } + +#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + static inline void PORTMUX_RELEASE_MUX_FN_NAME( portMUX_TYPE * mux, + const char * fnName, + int line ) + { +#else + static inline void PORTMUX_RELEASE_MUX_FN_NAME( portMUX_TYPE * mux ) + { + #endif + + + #if !CONFIG_FREERTOS_UNICORE + portBASE_TYPE coreID; + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + const char * lastLockedFn = mux->lastLockedFn; + int lastLockedLine = mux->lastLockedLine; + mux->lastLockedFn = fnName; + mux->lastLockedLine = line; + uint32_t owner = mux->owner; + + #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) + if( ( owner != portMUX_FREE_VAL ) && ( owner != CORE_ID_PRO ) && ( owner != CORE_ID_APP ) ) + #else + if (owner != portMUX_FREE_VAL && owner != CORE_ID_REGVAL_PRO && owner != CORE_ID_REGVAL_APP) + #endif + { + ets_printf( "ERROR: vPortCPUReleaseMutex: mux %p is invalid (0x%x)!\n", mux, mux->owner ); + } + #endif /* ifdef CONFIG_FREERTOS_PORTMUX_DEBUG */ + + #if CONFIG_FREERTOS_PORTMUX_DEBUG || !defined( NDEBUG ) + RSR( PRID, coreID ); + #endif + + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG + if( coreID != mux->owner ) + { + ets_printf( "ERROR: vPortCPUReleaseMutex: mux %p was already unlocked!\n", mux ); + ets_printf( "Last non-recursive unlock %s line %d, curr unlock %s line %d\n", lastLockedFn, lastLockedLine, fnName, line ); + } + #endif + + assert( coreID == mux->owner ); /* This is a mutex we didn't lock, or it's corrupt */ + + mux->count--; + + if( mux->count == 0 ) + { + mux->owner = portMUX_FREE_VAL; + } + else + { + assert( mux->count < 0x100 ); /* Indicates memory corruption */ + #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG_RECURSIVE + ets_printf( "Recursive unlock: count=%d last locked %s line %d, curr %s line %d\n", mux->count, lastLockedFn, lastLockedLine, fnName, line ); + #endif + } + #endif //!CONFIG_FREERTOS_UNICORE + } diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S new file mode 100644 index 0000000..4450395 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S @@ -0,0 +1,712 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* + + XTENSA CONTEXT SAVE AND RESTORE ROUTINES + +Low-level Call0 functions for handling generic context save and restore of +registers not specifically addressed by the interrupt vectors and handlers. +Those registers (not handled by these functions) are PC, PS, A0, A1 (SP). +Except for the calls to RTOS functions, this code is generic to Xtensa. + +Note that in Call0 ABI, interrupt handlers are expected to preserve the callee- +save regs (A12-A15), which is always the case if the handlers are coded in C. +However A12, A13 are made available as scratch registers for interrupt dispatch +code, so are presumed saved anyway, and are always restored even in Call0 ABI. +Only A14, A15 are truly handled as callee-save regs. + +Because Xtensa is a configurable architecture, this port supports all user +generated configurations (except restrictions stated in the release notes). +This is accomplished by conditional compilation using macros and functions +defined in the Xtensa HAL (hardware adaptation layer) for your configuration. +Only the processor state included in your configuration is saved and restored, +including any processor state added by user configuration options or TIE. + +*******************************************************************************/ + +/* Warn nicely if this file gets named with a lowercase .s instead of .S: */ +#define NOERROR # +NOERROR: .error "C preprocessor needed for this file: make sure its filename\ + ends in uppercase .S, or use xt-xcc's -x assembler-with-cpp option." + + +#include "xtensa_rtos.h" +#include "xtensa_context.h" +#include "esp_idf_version.h" +#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) +#include "xt_asm_utils.h" +#endif + +#ifdef XT_USE_OVLY +#include +#endif + + .text + +/******************************************************************************* + +_xt_context_save + + !! MUST BE CALLED ONLY BY 'CALL0' INSTRUCTION !! + +Saves all Xtensa processor state except PC, PS, A0, A1 (SP), A12, A13, in the +interrupt stack frame defined in xtensa_rtos.h. +Its counterpart is _xt_context_restore (which also restores A12, A13). + +Caller is expected to have saved PC, PS, A0, A1 (SP), A12, A13 in the frame. +This function preserves A12 & A13 in order to provide the caller with 2 scratch +regs that need not be saved over the call to this function. The choice of which +2 regs to provide is governed by xthal_window_spill_nw and xthal_save_extra_nw, +to avoid moving data more than necessary. Caller can assign regs accordingly. + +Entry Conditions: + A0 = Return address in caller. + A1 = Stack pointer of interrupted thread or handler ("interruptee"). + Original A12, A13 have already been saved in the interrupt stack frame. + Other processor state except PC, PS, A0, A1 (SP), A12, A13, is as at the + point of interruption. + If windowed ABI, PS.EXCM = 1 (exceptions disabled). + +Exit conditions: + A0 = Return address in caller. + A1 = Stack pointer of interrupted thread or handler ("interruptee"). + A12, A13 as at entry (preserved). + If windowed ABI, PS.EXCM = 1 (exceptions disabled). + +*******************************************************************************/ + + .global _xt_context_save + .type _xt_context_save,@function + .align 4 + .literal_position + .align 4 + +_xt_context_save: + + s32i a2, sp, XT_STK_A2 + s32i a3, sp, XT_STK_A3 + s32i a4, sp, XT_STK_A4 + s32i a5, sp, XT_STK_A5 + s32i a6, sp, XT_STK_A6 + s32i a7, sp, XT_STK_A7 + s32i a8, sp, XT_STK_A8 + s32i a9, sp, XT_STK_A9 + s32i a10, sp, XT_STK_A10 + s32i a11, sp, XT_STK_A11 + + /* + Call0 ABI callee-saved regs a12-15 do not need to be saved here. + a12-13 are the caller's responsibility so it can use them as scratch. + So only need to save a14-a15 here for Windowed ABI (not Call0). + */ + #ifndef __XTENSA_CALL0_ABI__ + s32i a14, sp, XT_STK_A14 + s32i a15, sp, XT_STK_A15 + #endif + + rsr a3, SAR + s32i a3, sp, XT_STK_SAR + + #if XCHAL_HAVE_LOOPS + rsr a3, LBEG + s32i a3, sp, XT_STK_LBEG + rsr a3, LEND + s32i a3, sp, XT_STK_LEND + rsr a3, LCOUNT + s32i a3, sp, XT_STK_LCOUNT + #endif + + #ifdef XT_USE_SWPRI + /* Save virtual priority mask */ + movi a3, _xt_vpri_mask + l32i a3, a3, 0 + s32i a3, sp, XT_STK_VPRI + #endif + + #if XCHAL_EXTRA_SA_SIZE > 0 || !defined(__XTENSA_CALL0_ABI__) + mov a9, a0 /* preserve ret addr */ + #endif + + #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifndef __XTENSA_CALL0_ABI__ + /* + To spill the reg windows, temp. need pre-interrupt stack ptr and a4-15. + Need to save a9,12,13 temporarily (in frame temps) and recover originals. + Interrupts need to be disabled below XCHAL_EXCM_LEVEL and window overflow + and underflow exceptions disabled (assured by PS.EXCM == 1). + */ + s32i a12, sp, XT_STK_TMP0 /* temp. save stuff in stack frame */ + s32i a13, sp, XT_STK_TMP1 + s32i a9, sp, XT_STK_TMP2 + + /* + Save the overlay state if we are supporting overlays. Since we just saved + three registers, we can conveniently use them here. Note that as of now, + overlays only work for windowed calling ABI. + */ + #ifdef XT_USE_OVLY + l32i a9, sp, XT_STK_PC /* recover saved PC */ + _xt_overlay_get_state a9, a12, a13 + s32i a9, sp, XT_STK_OVLY /* save overlay state */ + #endif + + l32i a12, sp, XT_STK_A12 /* recover original a9,12,13 */ + l32i a13, sp, XT_STK_A13 + l32i a9, sp, XT_STK_A9 + addi sp, sp, XT_STK_FRMSZ /* restore the interruptee's SP */ + call0 xthal_window_spill_nw /* preserves only a4,5,8,9,12,13 */ + addi sp, sp, -XT_STK_FRMSZ + l32i a12, sp, XT_STK_TMP0 /* recover stuff from stack frame */ + l32i a13, sp, XT_STK_TMP1 + l32i a9, sp, XT_STK_TMP2 + #endif + #endif /* (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) */ + + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + s32i a12, sp, XT_STK_TMP0 /* temp. save stuff in stack frame */ + s32i a13, sp, XT_STK_TMP1 + s32i a9, sp, XT_STK_TMP2 + + l32i a12, sp, XT_STK_A12 /* recover original a9,12,13 */ + l32i a13, sp, XT_STK_A13 + l32i a9, sp, XT_STK_A9 + #endif + + #if XCHAL_EXTRA_SA_SIZE > 0 + addi a2, sp, XT_STK_EXTRA /* where to save it */ + # if XCHAL_EXTRA_SA_ALIGN > 16 + movi a3, -XCHAL_EXTRA_SA_ALIGN + and a2, a2, a3 /* align dynamically >16 bytes */ + # endif + call0 xthal_save_extra_nw /* destroys a0,2,3 */ + #endif + + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifndef __XTENSA_CALL0_ABI__ + #ifdef XT_USE_OVLY + l32i a9, sp, XT_STK_PC /* recover saved PC */ + _xt_overlay_get_state a9, a12, a13 + s32i a9, sp, XT_STK_OVLY /* save overlay state */ + #endif + + /* SPILL_ALL_WINDOWS macro requires window overflow exceptions to be enabled, + * i.e. PS.EXCM cleared and PS.WOE set. + * Since we are going to clear PS.EXCM, we also need to increase INTLEVEL + * at least to XCHAL_EXCM_LEVEL. This matches that value of effective INTLEVEL + * at entry (CINTLEVEL=max(PS.INTLEVEL, XCHAL_EXCM_LEVEL) when PS.EXCM is set. + * Since WindowOverflow exceptions will trigger inside SPILL_ALL_WINDOWS, + * need to save/restore EPC1 as well. + * Note: even though a4-a15 are saved into the exception frame, we should not + * clobber them until after SPILL_ALL_WINDOWS. This is because these registers + * may contain live windows belonging to previous frames in the call stack. + * These frames will be spilled by SPILL_ALL_WINDOWS, and if the register was + * used as a temporary by this code, the temporary value would get stored + * onto the stack, instead of the real value. + */ + rsr a2, PS /* to be restored after SPILL_ALL_WINDOWS */ + movi a0, PS_INTLEVEL_MASK + and a3, a2, a0 /* get the current INTLEVEL */ + bgeui a3, XCHAL_EXCM_LEVEL, 1f /* calculate max(INTLEVEL, XCHAL_EXCM_LEVEL) */ + movi a3, XCHAL_EXCM_LEVEL +1: + movi a0, PS_UM | PS_WOE /* clear EXCM, enable window overflow, set new INTLEVEL */ + or a3, a3, a0 + wsr a3, ps + rsr a0, EPC1 /* to be restored after SPILL_ALL_WINDOWS */ + + addi sp, sp, XT_STK_FRMSZ /* restore the interruptee's SP */ + SPILL_ALL_WINDOWS + addi sp, sp, -XT_STK_FRMSZ /* return the current stack pointer and proceed with context save*/ + + + wsr a2, PS /* restore to the value at entry */ + rsync + wsr a0, EPC1 /* likewise */ + + #endif /* __XTENSA_CALL0_ABI__ */ + + l32i a12, sp, XT_STK_TMP0 /* restore the temp saved registers */ + l32i a13, sp, XT_STK_TMP1 /* our return address is there */ + l32i a9, sp, XT_STK_TMP2 + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + #if XCHAL_EXTRA_SA_SIZE > 0 || !defined(__XTENSA_CALL0_ABI__) + mov a0, a9 /* retrieve ret addr */ + #endif + + ret + +/******************************************************************************* + +_xt_context_restore + + !! MUST BE CALLED ONLY BY 'CALL0' INSTRUCTION !! + +Restores all Xtensa processor state except PC, PS, A0, A1 (SP) (and in Call0 +ABI, A14, A15 which are preserved by all interrupt handlers) from an interrupt +stack frame defined in xtensa_rtos.h . +Its counterpart is _xt_context_save (whose caller saved A12, A13). + +Caller is responsible to restore PC, PS, A0, A1 (SP). + +Entry Conditions: + A0 = Return address in caller. + A1 = Stack pointer of interrupted thread or handler ("interruptee"). + +Exit conditions: + A0 = Return address in caller. + A1 = Stack pointer of interrupted thread or handler ("interruptee"). + Other processor state except PC, PS, A0, A1 (SP), is as at the point + of interruption. + +*******************************************************************************/ + + .global _xt_context_restore + .type _xt_context_restore,@function + .align 4 + .literal_position + .align 4 +_xt_context_restore: + + #if XCHAL_EXTRA_SA_SIZE > 0 + /* + NOTE: Normally the xthal_restore_extra_nw macro only affects address + registers a2-a5. It is theoretically possible for Xtensa processor + designers to write TIE that causes more address registers to be + affected, but it is generally unlikely. If that ever happens, + more registers need to be saved/restored around this macro invocation. + Here we only assume a13 is preserved. + Future Xtensa tools releases might limit the regs that can be affected. + */ + mov a13, a0 /* preserve ret addr */ + addi a2, sp, XT_STK_EXTRA /* where to find it */ + # if XCHAL_EXTRA_SA_ALIGN > 16 + movi a3, -XCHAL_EXTRA_SA_ALIGN + and a2, a2, a3 /* align dynamically >16 bytes */ + # endif + call0 xthal_restore_extra_nw /* destroys a0,2,3,4,5 */ + mov a0, a13 /* retrieve ret addr */ + #endif + + #if XCHAL_HAVE_LOOPS + l32i a2, sp, XT_STK_LBEG + l32i a3, sp, XT_STK_LEND + wsr a2, LBEG + l32i a2, sp, XT_STK_LCOUNT + wsr a3, LEND + wsr a2, LCOUNT + #endif + + #ifdef XT_USE_OVLY + /* + If we are using overlays, this is a good spot to check if we need + to restore an overlay for the incoming task. Here we have a bunch + of registers to spare. Note that this step is going to use a few + bytes of storage below SP (SP-20 to SP-32) if an overlay is going + to be restored. + */ + l32i a2, sp, XT_STK_PC /* retrieve PC */ + l32i a3, sp, XT_STK_PS /* retrieve PS */ + l32i a4, sp, XT_STK_OVLY /* retrieve overlay state */ + l32i a5, sp, XT_STK_A1 /* retrieve stack ptr */ + _xt_overlay_check_map a2, a3, a4, a5, a6 + s32i a2, sp, XT_STK_PC /* save updated PC */ + s32i a3, sp, XT_STK_PS /* save updated PS */ + #endif + + #ifdef XT_USE_SWPRI + /* Restore virtual interrupt priority and interrupt enable */ + movi a3, _xt_intdata + l32i a4, a3, 0 /* a4 = _xt_intenable */ + l32i a5, sp, XT_STK_VPRI /* a5 = saved _xt_vpri_mask */ + and a4, a4, a5 + wsr a4, INTENABLE /* update INTENABLE */ + s32i a5, a3, 4 /* restore _xt_vpri_mask */ + #endif + + l32i a3, sp, XT_STK_SAR + l32i a2, sp, XT_STK_A2 + wsr a3, SAR + l32i a3, sp, XT_STK_A3 + l32i a4, sp, XT_STK_A4 + l32i a5, sp, XT_STK_A5 + l32i a6, sp, XT_STK_A6 + l32i a7, sp, XT_STK_A7 + l32i a8, sp, XT_STK_A8 + l32i a9, sp, XT_STK_A9 + l32i a10, sp, XT_STK_A10 + l32i a11, sp, XT_STK_A11 + + /* + Call0 ABI callee-saved regs a12-15 do not need to be restored here. + However a12-13 were saved for scratch before XT_RTOS_INT_ENTER(), + so need to be restored anyway, despite being callee-saved in Call0. + */ + l32i a12, sp, XT_STK_A12 + l32i a13, sp, XT_STK_A13 + #ifndef __XTENSA_CALL0_ABI__ + l32i a14, sp, XT_STK_A14 + l32i a15, sp, XT_STK_A15 + #endif + + ret + + +/******************************************************************************* + +_xt_coproc_init + +Initializes global co-processor management data, setting all co-processors +to "unowned". Leaves CPENABLE as it found it (does NOT clear it). + +Called during initialization of the RTOS, before any threads run. + +This may be called from normal Xtensa single-threaded application code which +might use co-processors. The Xtensa run-time initialization enables all +co-processors. They must remain enabled here, else a co-processor exception +might occur outside of a thread, which the exception handler doesn't expect. + +Entry Conditions: + Xtensa single-threaded run-time environment is in effect. + No thread is yet running. + +Exit conditions: + None. + +Obeys ABI conventions per prototype: + void _xt_coproc_init(void) + +*******************************************************************************/ + +#if XCHAL_CP_NUM > 0 + + .global _xt_coproc_init + .type _xt_coproc_init,@function + .align 4 + .literal_position + .align 4 +_xt_coproc_init: + ENTRY0 + + /* Initialize thread co-processor ownerships to 0 (unowned). */ + movi a2, _xt_coproc_owner_sa /* a2 = base of owner array */ + addi a3, a2, (XCHAL_CP_MAX*portNUM_PROCESSORS) << 2 /* a3 = top+1 of owner array */ + movi a4, 0 /* a4 = 0 (unowned) */ +1: s32i a4, a2, 0 + addi a2, a2, 4 + bltu a2, a3, 1b + + RET0 + +#endif + + +/******************************************************************************* + +_xt_coproc_release + +Releases any and all co-processors owned by a given thread. The thread is +identified by it's co-processor state save area defined in xtensa_context.h . + +Must be called before a thread's co-proc save area is deleted to avoid +memory corruption when the exception handler tries to save the state. +May be called when a thread terminates or completes but does not delete +the co-proc save area, to avoid the exception handler having to save the +thread's co-proc state before another thread can use it (optimization). + +Needs to be called on the processor the thread was running on. Unpinned threads +won't have an entry here because they get pinned as soon they use a coprocessor. + +Entry Conditions: + A2 = Pointer to base of co-processor state save area. + +Exit conditions: + None. + +Obeys ABI conventions per prototype: + void _xt_coproc_release(void * coproc_sa_base) + +*******************************************************************************/ + +#if XCHAL_CP_NUM > 0 + + .global _xt_coproc_release + .type _xt_coproc_release,@function + .align 4 + .literal_position + .align 4 +_xt_coproc_release: + ENTRY0 /* a2 = base of save area */ + + getcoreid a5 + movi a3, XCHAL_CP_MAX << 2 + mull a5, a5, a3 + movi a3, _xt_coproc_owner_sa /* a3 = base of owner array */ + add a3, a3, a5 + + addi a4, a3, XCHAL_CP_MAX << 2 /* a4 = top+1 of owner array */ + movi a5, 0 /* a5 = 0 (unowned) */ + + rsil a6, XCHAL_EXCM_LEVEL /* lock interrupts */ + +1: l32i a7, a3, 0 /* a7 = owner at a3 */ + bne a2, a7, 2f /* if (coproc_sa_base == owner) */ + s32i a5, a3, 0 /* owner = unowned */ +2: addi a3, a3, 1<<2 /* a3 = next entry in owner array */ + bltu a3, a4, 1b /* repeat until end of array */ + +3: wsr a6, PS /* restore interrupts */ + + RET0 + +#endif + + +/******************************************************************************* +_xt_coproc_savecs + +If there is a current thread and it has a coprocessor state save area, then +save all callee-saved state into this area. This function is called from the +solicited context switch handler. It calls a system-specific function to get +the coprocessor save area base address. + +Entry conditions: + - The thread being switched out is still the current thread. + - CPENABLE state reflects which coprocessors are active. + - Registers have been saved/spilled already. + +Exit conditions: + - All necessary CP callee-saved state has been saved. + - Registers a2-a7, a13-a15 have been trashed. + +Must be called from assembly code only, using CALL0. +*******************************************************************************/ +#if XCHAL_CP_NUM > 0 + + .extern _xt_coproc_sa_offset /* external reference */ + + .global _xt_coproc_savecs + .type _xt_coproc_savecs,@function + .align 4 + .literal_position + .align 4 +_xt_coproc_savecs: + + /* At entry, CPENABLE should be showing which CPs are enabled. */ + + rsr a2, CPENABLE /* a2 = which CPs are enabled */ + beqz a2, .Ldone /* quick exit if none */ + mov a14, a0 /* save return address */ + call0 XT_RTOS_CP_STATE /* get address of CP save area */ + mov a0, a14 /* restore return address */ + beqz a15, .Ldone /* if none then nothing to do */ + s16i a2, a15, XT_CP_CS_ST /* save mask of CPs being stored */ + movi a13, _xt_coproc_sa_offset /* array of CP save offsets */ + l32i a15, a15, XT_CP_ASA /* a15 = base of aligned save area */ + +#if XCHAL_CP0_SA_SIZE + bbci.l a2, 0, 2f /* CP 0 not enabled */ + l32i a14, a13, 0 /* a14 = _xt_coproc_sa_offset[0] */ + add a3, a14, a15 /* a3 = save area for CP 0 */ + xchal_cp0_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP1_SA_SIZE + bbci.l a2, 1, 2f /* CP 1 not enabled */ + l32i a14, a13, 4 /* a14 = _xt_coproc_sa_offset[1] */ + add a3, a14, a15 /* a3 = save area for CP 1 */ + xchal_cp1_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP2_SA_SIZE + bbci.l a2, 2, 2f + l32i a14, a13, 8 + add a3, a14, a15 + xchal_cp2_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP3_SA_SIZE + bbci.l a2, 3, 2f + l32i a14, a13, 12 + add a3, a14, a15 + xchal_cp3_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP4_SA_SIZE + bbci.l a2, 4, 2f + l32i a14, a13, 16 + add a3, a14, a15 + xchal_cp4_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP5_SA_SIZE + bbci.l a2, 5, 2f + l32i a14, a13, 20 + add a3, a14, a15 + xchal_cp5_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP6_SA_SIZE + bbci.l a2, 6, 2f + l32i a14, a13, 24 + add a3, a14, a15 + xchal_cp6_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP7_SA_SIZE + bbci.l a2, 7, 2f + l32i a14, a13, 28 + add a3, a14, a15 + xchal_cp7_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +.Ldone: + ret +#endif + + +/******************************************************************************* +_xt_coproc_restorecs + +Restore any callee-saved coprocessor state for the incoming thread. +This function is called from coprocessor exception handling, when giving +ownership to a thread that solicited a context switch earlier. It calls a +system-specific function to get the coprocessor save area base address. + +Entry conditions: + - The incoming thread is set as the current thread. + - CPENABLE is set up correctly for all required coprocessors. + - a2 = mask of coprocessors to be restored. + +Exit conditions: + - All necessary CP callee-saved state has been restored. + - CPENABLE - unchanged. + - Registers a2-a7, a13-a15 have been trashed. + +Must be called from assembly code only, using CALL0. +*******************************************************************************/ +#if XCHAL_CP_NUM > 0 + + .global _xt_coproc_restorecs + .type _xt_coproc_restorecs,@function + .align 4 + .literal_position + .align 4 +_xt_coproc_restorecs: + + mov a14, a0 /* save return address */ + call0 XT_RTOS_CP_STATE /* get address of CP save area */ + mov a0, a14 /* restore return address */ + beqz a15, .Ldone2 /* if none then nothing to do */ + l16ui a3, a15, XT_CP_CS_ST /* a3 = which CPs have been saved */ + xor a3, a3, a2 /* clear the ones being restored */ + s32i a3, a15, XT_CP_CS_ST /* update saved CP mask */ + movi a13, _xt_coproc_sa_offset /* array of CP save offsets */ + l32i a15, a15, XT_CP_ASA /* a15 = base of aligned save area */ + +#if XCHAL_CP0_SA_SIZE + bbci.l a2, 0, 2f /* CP 0 not enabled */ + l32i a14, a13, 0 /* a14 = _xt_coproc_sa_offset[0] */ + add a3, a14, a15 /* a3 = save area for CP 0 */ + xchal_cp0_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP1_SA_SIZE + bbci.l a2, 1, 2f /* CP 1 not enabled */ + l32i a14, a13, 4 /* a14 = _xt_coproc_sa_offset[1] */ + add a3, a14, a15 /* a3 = save area for CP 1 */ + xchal_cp1_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP2_SA_SIZE + bbci.l a2, 2, 2f + l32i a14, a13, 8 + add a3, a14, a15 + xchal_cp2_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP3_SA_SIZE + bbci.l a2, 3, 2f + l32i a14, a13, 12 + add a3, a14, a15 + xchal_cp3_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP4_SA_SIZE + bbci.l a2, 4, 2f + l32i a14, a13, 16 + add a3, a14, a15 + xchal_cp4_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP5_SA_SIZE + bbci.l a2, 5, 2f + l32i a14, a13, 20 + add a3, a14, a15 + xchal_cp5_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP6_SA_SIZE + bbci.l a2, 6, 2f + l32i a14, a13, 24 + add a3, a14, a15 + xchal_cp6_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP7_SA_SIZE + bbci.l a2, 7, 2f + l32i a14, a13, 28 + add a3, a14, a15 + xchal_cp7_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +.Ldone2: + ret + +#endif + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c new file mode 100644 index 0000000..e7275c6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c @@ -0,0 +1,75 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* +* +* XTENSA INITIALIZATION ROUTINES CODED IN C +* +* This file contains miscellaneous Xtensa RTOS-generic initialization functions +* that are implemented in C. +* +*******************************************************************************/ + + +#ifdef XT_BOARD +#include "xtensa/xtbsp.h" +#endif + +#include "xtensa_rtos.h" +#include "sdkconfig.h" +#include "esp_idf_version.h" +#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) +#include "esp_clk.h" +#else +#if CONFIG_IDF_TARGET_ESP32 +#include "esp32/clk.h" +#elif CONFIG_IDF_TARGET_ESP32S2 +#include "esp32s2/clk.h" +#elif CONFIG_IDF_TARGET_ESP32S3 +#include "esp32s3/clk.h" +#endif +#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */ + +#ifdef XT_RTOS_TIMER_INT + +unsigned _xt_tick_divisor = 0; /* cached number of cycles per tick */ + +void _xt_tick_divisor_init(void) +{ + _xt_tick_divisor = esp_clk_cpu_freq() / XT_TICK_PER_SEC; +} + +/* Deprecated, to be removed */ +int xt_clock_freq(void) +{ + return esp_clk_cpu_freq(); +} + +#endif /* XT_RTOS_TIMER_INT */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S new file mode 100644 index 0000000..4572eb6 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S @@ -0,0 +1,549 @@ +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/* + * LoadStoreErrorCause: Occurs when trying to access 32 bit addressable memory region as 8 bit or 16 bit + * LoadStoreAlignmentCause: Occurs when trying to access in an unaligned manner + * + * xxxx xxxx = imm8 field + * yyyy = imm4 field + * ssss = s field + * tttt = t field + * + * 16 0 + * ------------------- + * L32I.N yyyy ssss tttt 1000 + * S32I.N yyyy ssss tttt 1001 + * + * 23 0 + * ----------------------------- + * L8UI xxxx xxxx 0000 ssss tttt 0010 <- LoadStoreError + * L16UI xxxx xxxx 0001 ssss tttt 0010 <- LoadStoreError, LoadStoreAlignment + * L16SI xxxx xxxx 1001 ssss tttt 0010 <- LoadStoreError, LoadStoreAlignment + * L32I xxxx xxxx 0010 ssss tttt 0010 <- LoadStoreAlignment + * + * S8I xxxx xxxx 0100 ssss tttt 0010 <- LoadStoreError + * S16I xxxx xxxx 0101 ssss tttt 0010 <- LoadStoreError, LoadStoreAlignment + * S32I xxxx xxxx 0110 ssss tttt 0010 <- LoadStoreAlignment + * + * ******* UNSUPPORTED ******* + * + * L32E 0000 1001 rrrr ssss tttt 0000 + * S32E 0100 1001 rrrr ssss tttt 0000 + * ----------------------------- + */ + +#include "xtensa_rtos.h" +#include "sdkconfig.h" +#include "soc/soc.h" + +#define LOADSTORE_HANDLER_STACK_SZ 8 + .section .bss, "aw" + .balign 16 +LoadStoreHandlerStack: + .rept LOADSTORE_HANDLER_STACK_SZ + .word 0 + .endr + + +/* LoadStoreErrorCause handler: + * + * Completes 8-bit or 16-bit load/store instructions from 32-bit aligned memory region + * Called from UserExceptionVector if EXCCAUSE is LoadStoreErrorCause + */ + + .global LoadStoreErrorHandler + .section .iram1, "ax" + + .literal_position + + .balign 4 +LoadStoreErrorHandler: + .type LoadStoreErrorHandler, @function + + wsr a0, depc // Save return address in depc + mov a0, sp + movi sp, LoadStoreHandlerStack + s32i a0, sp, 0x04 // Since a0 contains value of a1 + s32i a2, sp, 0x08 + s32i a3, sp, 0x0c + s32i a4, sp, 0x10 + + rsr a0, sar // Save SAR in a0 to restore later + + /* Check whether the address lies in the valid range */ + rsr a3, excvaddr + movi a4, _iram_text_end // End of code section of IRAM + bge a3, a4, 1f + movi a4, SOC_CACHE_APP_LOW // Check if in APP cache region + blt a3, a4, .LS_wrong_opcode + movi a4, SOC_CACHE_APP_HIGH + bge a3, a4, .LS_wrong_opcode + j 2f + +1: + movi a4, SOC_IRAM_HIGH // End of IRAM address range + bge a3, a4, .LS_wrong_opcode + +2: + /* Examine the opcode which generated the exception */ + /* Note: Instructions are in this order to avoid pipeline stalls. */ + rsr a2, epc1 + movi a4, ~3 + ssa8l a2 // sar is now correct shift for aligned read + and a2, a2, a4 // a2 now 4-byte aligned address of instruction + l32i a4, a2, 0 + l32i a2, a2, 4 + + src a2, a2, a4 // a2 now instruction that failed + bbci a2, 1, .LS_wrong_opcode + bbsi a2, 14, .LSE_store_op // Store instruction + + /* l8/l16ui/l16si */ + movi a4, ~3 + and a4, a3, a4 // a4 now word aligned read address + + ssa8l a3 // sar is now shift to extract a3's byte + l32i a4, a4, 0 // perform the actual read + srl a4, a4 // shift right correct distance + extui a3, a2, 12, 4 + bnez a3, 1f // l16ui/l16si + extui a4, a4, 0, 8 // mask off bits needed for an l8 + j 2f + +1: + extui a4, a4, 0, 16 + bbci a2, 15, 2f // l16ui + + /* Sign adjustment */ + slli a4, a4, 16 + srai a4, a4, 16 // a4 contains the value + +2: + /* a4 contains the value */ + rsr a3, epc1 + addi a3, a3, 3 + wsr a3, epc1 + wsr a0, sar + rsr a0, excsave1 + + extui a2, a2, 3, 5 + blti a2, 10, .LSE_stack_reg + + movi a3, .LS_jumptable_base + addx8 a2, a2, a3 // a2 is now the address to jump to + l32i a3, sp, 0x0c + jx a2 + +.LSE_stack_reg: + addx2 a2, a2, sp + s32i a4, a2, 0 + + /* Restore all values */ + l32i a4, sp, 0x10 + l32i a3, sp, 0x0c + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + +.LSE_store_op: + s32i a5, a1, 0x14 + s32i a6, a1, 0x18 + + /* a2 -> instruction that caused the error */ + /* a3 -> unaligned address */ + extui a4, a2, 4, 4 + blti a4, 7, 1f + movi a5, .LSE_store_reg + addx8 a5, a4, a5 + jx a5 + +1: + addx4 a4, a4, sp + l32i a4, a4, 0 + +.LSE_store_data: + /* a4 contains the value */ + rsr a6, epc1 + addi a6, a6, 3 + wsr a6, epc1 + + ssa8b a3 + movi a5, -1 + bbsi a2, 12, 1f // s16 + extui a4, a4, 0, 8 + movi a6, 0xff + j 2f +1: + extui a4, a4, 0, 16 + movi a6, 0xffff +2: + sll a4, a4 // shift the value to proper offset + sll a6, a6 + xor a5, a5, a6 // a5 contains the mask + + movi a6, ~3 + and a3, a3, a6 // a3 has the aligned address + l32i a6, a3, 0 // a6 contains the data at the aligned address + and a6, a6, a5 + or a4, a6, a4 + s32i a4, a3, 0 + + /* Restore registers */ + wsr a0, sar + + l32i a6, sp, 0x18 + l32i a5, sp, 0x14 + l32i a4, sp, 0x10 + l32i a3, sp, 0x0c + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rsr a0, excsave1 + + rfe + +.LSE_store_reg: + .org .LSE_store_reg + (7 * 8) + mov a4, a7 + j .LSE_store_data + + .org .LSE_store_reg + (8 * 8) + mov a4, a8 + j .LSE_store_data + + .org .LSE_store_reg + (9 * 8) + mov a4, a9 + j .LSE_store_data + + .org .LSE_store_reg + (10 * 8) + mov a4, a10 + j .LSE_store_data + + .org .LSE_store_reg + (11 * 8) + mov a4, a11 + j .LSE_store_data + + .org .LSE_store_reg + (12 * 8) + mov a4, a12 + j .LSE_store_data + + .org .LSE_store_reg + (13 * 8) + mov a4, a13 + j .LSE_store_data + + .org .LSE_store_reg + (14 * 8) + mov a4, a14 + j .LSE_store_data + + .org .LSE_store_reg + (15 * 8) + mov a4, a15 + j .LSE_store_data + + +/* LoadStoreAlignmentCause handler: + * + * Completes unaligned 16-bit and 32-bit load/store instructions from 32-bit aligned memory region + * Called from UserExceptionVector if EXCCAUSE is LoadStoreAlignmentCause + */ + + .global AlignmentErrorHandler + .section .iram1, "ax" + + .literal_position + + .balign 4 +AlignmentErrorHandler: + .type AlignmentErrorHandler, @function + + wsr a0, depc // Save return address in depc + mov a0, sp + movi sp, LoadStoreHandlerStack + s32i a0, sp, 0x04 // Since a0 contains value of a1 + s32i a2, sp, 0x08 + s32i a3, sp, 0x0c + s32i a4, sp, 0x10 + + rsr a0, sar // Save SAR in a0 to restore later + + /* Check whether the address lies in the valid range */ + rsr a3, excvaddr + movi a4, _iram_text_end // End of code section of IRAM + bge a3, a4, 1f + movi a4, SOC_CACHE_APP_LOW // Check if in APP cache region + blt a3, a4, .LS_wrong_opcode + movi a4, SOC_CACHE_APP_HIGH + bge a3, a4, .LS_wrong_opcode + j 2f + +1: + movi a4, SOC_IRAM_HIGH // End of IRAM address range + bge a3, a4, .LS_wrong_opcode + +2: + /* Examine the opcode which generated the exception */ + /* Note: Instructions are in this order to avoid pipeline stalls. */ + rsr a2, epc1 + movi a4, ~3 + ssa8l a2 // sar is now correct shift for aligned read + and a2, a2, a4 // a2 now 4-byte aligned address of instruction + l32i a4, a2, 0 + l32i a2, a2, 4 + + /* a2 has the instruction that caused the error */ + src a2, a2, a4 + extui a4, a2, 0, 4 + addi a4, a4, -9 + beqz a4, .LSA_store_op + bbsi a2, 14, .LSA_store_op + + ssa8l a3 // a3 contains the unaligned address + movi a4, ~3 + and a4, a3, a4 // a4 has the aligned address + l32i a3, a4, 0 + l32i a4, a4, 4 + src a4, a4, a3 + + rsr a3, epc1 + addi a3, a3, 2 + bbsi a2, 3, 1f // l32i.n + bbci a2, 1, .LS_wrong_opcode + addi a3, a3, 1 + + bbsi a2, 13, 1f // l32 + extui a4, a4, 0, 16 + bbci a2, 15, 1f // l16ui + + /* Sign adjustment */ + slli a4, a4, 16 + srai a4, a4, 16 // a4 contains the value + +1: + wsr a3, epc1 + wsr a0, sar + rsr a0, excsave1 + + extui a2, a2, 4, 4 + blti a2, 5, .LSA_stack_reg // a3 contains the target register + + movi a3, .LS_jumptable_base + slli a2, a2, 4 + add a2, a2, a3 // a2 is now the address to jump to + l32i a3, sp, 0x0c + jx a2 + +.LSA_stack_reg: + addx4 a2, a2, sp + s32i a4, a2, 0 + + /* Restore all values */ + l32i a4, sp, 0x10 + l32i a3, sp, 0x0c + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + +/* Store instruction */ +.LSA_store_op: + s32i a5, sp, 0x14 + s32i a6, sp, 0x18 + s32i a7, sp, 0x1c + + /* a2 -> instruction that caused the error */ + /* a3 -> unaligned address */ + extui a4, a2, 4, 4 + blti a4, 8, 1f + movi a5, .LSA_store_reg + addx8 a5, a4, a5 + jx a5 + +1: + addx4 a4, a4, sp + l32i a4, a4, 0 // a4 contains the value + +.LSA_store_data: + movi a6, 0 + + rsr a7, epc1 + addi a7, a7 ,2 + bbsi a2, 3, 1f // s32i.n + bbci a2, 1, .LS_wrong_opcode + + addi a7, a7, 1 + bbsi a2, 13, 1f // s32i + + movi a5, -1 + extui a4, a4, 0, 16 + slli a6, a5, 16 // 0xffff0000 + +1: + wsr a7, epc1 + movi a5, ~3 + and a5, a3, a5 // a5 has the aligned address + + ssa8b a3 + movi a3, -1 + src a7, a6, a3 + src a3, a3, a6 + + /* Store data on lower address */ + l32i a6, a5, 0 + and a6, a6, a7 + sll a7, a4 + or a6, a6, a7 + s32i a6, a5, 0 + + /* Store data on higher address */ + l32i a7, a5, 4 + srl a6, a4 + and a3, a7, a3 + or a3, a3, a6 + s32i a3, a5, 4 + + /* Restore registers */ + wsr a0, sar + rsr a0, excsave1 + + l32i a7, sp, 0x1c + l32i a6, sp, 0x18 + l32i a5, sp, 0x14 + l32i a4, sp, 0x10 + l32i a3, sp, 0x0c + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + +.LSA_store_reg: + .org .LSA_store_reg + (8 * 8) + mov a4, a8 + j .LSA_store_data + + .org .LSA_store_reg + (9 * 8) + mov a4, a9 + j .LSA_store_data + + .org .LSA_store_reg + (10 * 8) + mov a4, a10 + j .LSA_store_data + + .org .LSA_store_reg + (11 * 8) + mov a4, a11 + j .LSA_store_data + + .org .LSA_store_reg + (12 * 8) + mov a4, a12 + j .LSA_store_data + + .org .LSA_store_reg + (13 * 8) + mov a4, a13 + j .LSA_store_data + + .org .LSA_store_reg + (14 * 8) + mov a4, a14 + j .LSA_store_data + + .org .LSA_store_reg + (15 * 8) + mov a4, a15 + j .LSA_store_data + +/* + * Common routines for both the exception handlers + */ + .balign 4 +.LS_jumptable: + /* The first 5 entries (80 bytes) of this table are unused (registers + a0..a4 are handled separately above). Rather than have a whole bunch + of wasted space, just pretend that the table starts 80 bytes + earlier in memory. */ + .set .LS_jumptable_base, .LS_jumptable - (16 * 5) + + .org .LS_jumptable_base + (16 * 5) + mov a5, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 6) + mov a6, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 7) + mov a7, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 8) + mov a8, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 9) + mov a9, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 10) + mov a10, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 11) + mov a11, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 12) + mov a12, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 13) + mov a13, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 14) + mov a14, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + + .org .LS_jumptable_base + (16 * 15) + mov a15, a4 + l32i a4, sp, 0x10 + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rfe + +.LS_wrong_opcode: + /* Reaches here if the address is in invalid range or the opcode isn't supported. + * Restore registers and jump back to _xt_user_exc + */ + wsr a0, sar + l32i a4, sp, 0x10 + l32i a3, sp, 0x0c + l32i a2, sp, 0x08 + l32i a1, sp, 0x04 + rsr a0, depc + ret // Equivalent to jx a0 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c new file mode 100644 index 0000000..618083d --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c @@ -0,0 +1,75 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* xtensa_overlay_os_hook.c -- Overlay manager OS hooks for FreeRTOS. */ + +#include "FreeRTOS.h" +#include "semphr.h" + +#if configUSE_MUTEX + +/* Mutex object that controls access to the overlay. Currently only one + * overlay region is supported so one mutex suffices. + */ + static SemaphoreHandle_t xt_overlay_mutex; + + +/* This function should be overridden to provide OS specific init such + * as the creation of a mutex lock that can be used for overlay locking. + * Typically this mutex would be set up with priority inheritance. See + * overlay manager documentation for more details. + */ + void xt_overlay_init_os( void ) + { + /* Create the mutex for overlay access. Priority inheritance is + * required. + */ + xt_overlay_mutex = xSemaphoreCreateMutex(); + } + + +/* This function locks access to shared overlay resources, typically + * by acquiring a mutex. + */ + void xt_overlay_lock( void ) + { + xSemaphoreTake( xt_overlay_mutex, 0 ); + } + + +/* This function releases access to shared overlay resources, typically + * by unlocking a mutex. + */ + void xt_overlay_unlock( void ) + { + xSemaphoreGive( xt_overlay_mutex ); + } + +#endif /* if configUSE_MUTEX */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S new file mode 100644 index 0000000..a016e02 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S @@ -0,0 +1,235 @@ +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "xtensa_rtos.h" +#include "esp_idf_version.h" +#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) +#include "esp_panic.h" +#else +#include "esp_private/panic_reason.h" +#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */ +#include "sdkconfig.h" +#include "soc/soc.h" + +/* +This file contains the default handlers for the high interrupt levels as well as some specialized exceptions. +The default behaviour is to just exit the interrupt or call the panic handler on the exceptions +*/ + + +#if XCHAL_HAVE_DEBUG + .global xt_debugexception + .weak xt_debugexception + .set xt_debugexception, _xt_debugexception + .section .iram1,"ax" + .type _xt_debugexception,@function + .align 4 + +_xt_debugexception: +#if (CONFIG_ESP32_ECO3_CACHE_LOCK_FIX && CONFIG_BTDM_CTRL_HLI) +#define XT_DEBUGCAUSE_DI (5) + getcoreid a0 +#if (CONFIG_BTDM_CTRL_PINNED_TO_CORE == PRO_CPU_NUM) + beqz a0, 1f +#else + bnez a0, 1f +#endif + + rsr a0, DEBUGCAUSE + extui a0, a0, XT_DEBUGCAUSE_DI, 1 + bnez a0, _xt_debug_di_exc +1: +#endif //(CONFIG_ESP32_ECO3_CACHE_LOCK_FIX && CONFIG_BTDM_CTRL_HLI) + + movi a0,PANIC_RSN_DEBUGEXCEPTION + wsr a0,EXCCAUSE + /* _xt_panic assumes a level 1 exception. As we're + crashing anyhow, copy EPC & EXCSAVE from DEBUGLEVEL + to level 1. */ + rsr a0,(EPC + XCHAL_DEBUGLEVEL) + wsr a0,EPC_1 + rsr a0,(EXCSAVE + XCHAL_DEBUGLEVEL) + wsr a0,EXCSAVE_1 + call0 _xt_panic /* does not return */ + rfi XCHAL_DEBUGLEVEL + +#if (CONFIG_ESP32_ECO3_CACHE_LOCK_FIX && CONFIG_BTDM_CTRL_HLI) + .align 4 +_xt_debug_di_exc: + + /* + The delay time can be calculated by the following formula: + T = ceil(0.25 + max(t1, t2)) us + + t1 = 80 / f1, t2 = (1 + 14/N) * 20 / f2 + + f1: PSRAM access frequency, unit: MHz. + f2: Flash access frequency, unit: MHz. + + When flash is slow/fast read, N = 1. + When flash is DOUT/DIO read, N = 2. + When flash is QOUT/QIO read, N = 4. + + And after testing, when CPU frequency is 240 MHz, it will take 1us to loop 27 times. + */ +#if defined(CONFIG_ESPTOOLPY_FLASHMODE_QIO) || defined(CONFIG_ESPTOOLPY_FLASHMODE_QOUT) + +# if defined(CONFIG_ESPTOOLPY_FLASHFREQ_80M) && defined(CONFIG_SPIRAM_SPEED_80M) + movi a0, 54 +# elif defined(CONFIG_ESPTOOLPY_FLASHFREQ_80M) && defined(CONFIG_SPIRAM_SPEED_40M) + movi a0, 81 +# elif defined(CONFIG_ESPTOOLPY_FLASHFREQ_40M) && defined(CONFIG_SPIRAM_SPEED_40M) + movi a0, 81 +# elif defined(CONFIG_ESPTOOLPY_FLASHFREQ_26M) && defined(CONFIG_SPIRAM_SPEED_40M) + movi a0, 108 +# else + movi a0, 135 +# endif + +#elif defined(CONFIG_ESPTOOLPY_FLASHMODE_DIO) || defined(CONFIG_ESPTOOLPY_FLASHMODE_DOUT) + +# if defined(CONFIG_ESPTOOLPY_FLASHFREQ_80M) && defined(CONFIG_SPIRAM_SPEED_80M) + movi a0, 81 +# elif defined(CONFIG_ESPTOOLPY_FLASHFREQ_80M) && defined(CONFIG_SPIRAM_SPEED_40M) + movi a0, 81 +# elif defined(CONFIG_ESPTOOLPY_FLASHFREQ_40M) && defined(CONFIG_SPIRAM_SPEED_40M) + movi a0, 135 +# elif defined(CONFIG_ESPTOOLPY_FLASHFREQ_26M) && defined(CONFIG_SPIRAM_SPEED_40M) + movi a0, 189 +# else + movi a0, 243 +# endif + +#else + movi a0, 243 +#endif + +1: addi a0, a0, -1 /* delay_us(N) */ + .rept 4 + nop + .endr + bnez a0, 1b + + rsr a0, EXCSAVE+XCHAL_DEBUGLEVEL + rfi XCHAL_DEBUGLEVEL +#endif //(CONFIG_ESP32_ECO3_CACHE_LOCK_FIX && CONFIG_BTDM_CTRL_HLI) +#endif /* Debug exception */ + + +#if XCHAL_NUM_INTLEVELS >=2 && XCHAL_EXCM_LEVEL <2 && XCHAL_DEBUGLEVEL !=2 + .global xt_highint2 + .weak xt_highint2 + .set xt_highint2, _xt_highint2 + .section .iram1,"ax" + .type _xt_highint2,@function + .align 4 +_xt_highint2: + + /* Default handler does nothing; just returns */ + .align 4 +.L_xt_highint2_exit: + rsr a0, EXCSAVE_2 /* restore a0 */ + rfi 2 + +#endif /* Level 2 */ + +#if XCHAL_NUM_INTLEVELS >=3 && XCHAL_EXCM_LEVEL <3 && XCHAL_DEBUGLEVEL !=3 + + .global xt_highint3 + .weak xt_highint3 + .set xt_highint3, _xt_highint3 + .section .iram1,"ax" + .type _xt_highint3,@function + .align 4 +_xt_highint3: + + /* Default handler does nothing; just returns */ + + .align 4 +.L_xt_highint3_exit: + rsr a0, EXCSAVE_3 /* restore a0 */ + rfi 3 + +#endif /* Level 3 */ + +#if XCHAL_NUM_INTLEVELS >=4 && XCHAL_EXCM_LEVEL <4 && XCHAL_DEBUGLEVEL !=4 + + .global xt_highint4 + .weak xt_highint4 + .set xt_highint4, _xt_highint4 + .section .iram1,"ax" + .type _xt_highint4,@function + .align 4 +_xt_highint4: + + /* Default handler does nothing; just returns */ + + .align 4 +.L_xt_highint4_exit: + rsr a0, EXCSAVE_4 /* restore a0 */ + rfi 4 + +#endif /* Level 4 */ + +#if XCHAL_NUM_INTLEVELS >=5 && XCHAL_EXCM_LEVEL <5 && XCHAL_DEBUGLEVEL !=5 + + .global xt_highint5 + .weak xt_highint5 + .set xt_highint5, _xt_highint5 + .section .iram1,"ax" + .type _xt_highint5,@function + .align 4 +_xt_highint5: + + /* Default handler does nothing; just returns */ + + .align 4 +.L_xt_highint5_exit: + rsr a0, EXCSAVE_5 /* restore a0 */ + rfi 5 + + +#endif /* Level 5 */ + +#if XCHAL_NUM_INTLEVELS >=6 && XCHAL_EXCM_LEVEL <6 && XCHAL_DEBUGLEVEL !=6 + + .global _xt_highint6 + .global xt_highint6 + .weak xt_highint6 + .set xt_highint6, _xt_highint6 + .section .iram1,"ax" + .type _xt_highint6,@function + .align 4 +_xt_highint6: + + /* Default handler does nothing; just returns */ + + .align 4 +.L_xt_highint6_exit: + rsr a0, EXCSAVE_6 /* restore a0 */ + rfi 6 + +#endif /* Level 6 */ + +#if XCHAL_HAVE_NMI + + .global _xt_nmi + .global xt_nmi + .weak xt_nmi + .set xt_nmi, _xt_nmi + .section .iram1,"ax" + .type _xt_nmi,@function + .align 4 +_xt_nmi: + + /* Default handler does nothing; just returns */ + + .align 4 +.L_xt_nmi_exit: + rsr a0, EXCSAVE + XCHAL_NMILEVEL /* restore a0 */ + rfi XCHAL_NMILEVEL + +#endif /* NMI */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S new file mode 100644 index 0000000..3a0a956 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S @@ -0,0 +1,2067 @@ +/* + * SPDX-FileCopyrightText: 2015-2019 Cadence Design Systems, Inc. + * + * SPDX-License-Identifier: MIT + * + * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD + */ +/* + * Copyright (c) 2015-2019 Cadence Design Systems, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/******************************************************************************* +-------------------------------------------------------------------------------- + + XTENSA VECTORS AND LOW LEVEL HANDLERS FOR AN RTOS + + Xtensa low level exception and interrupt vectors and handlers for an RTOS. + + Interrupt handlers and user exception handlers support interaction with + the RTOS by calling XT_RTOS_INT_ENTER and XT_RTOS_INT_EXIT before and + after user's specific interrupt handlers. These macros are defined in + xtensa_.h to call suitable functions in a specific RTOS. + + Users can install application-specific interrupt handlers for low and + medium level interrupts, by calling xt_set_interrupt_handler(). These + handlers can be written in C, and must obey C calling convention. The + handler table is indexed by the interrupt number. Each handler may be + provided with an argument. + + Note that the system timer interrupt is handled specially, and is + dispatched to the RTOS-specific handler. This timer cannot be hooked + by application code. + + Optional hooks are also provided to install a handler per level at + run-time, made available by compiling this source file with + '-DXT_INTEXC_HOOKS' (useful for automated testing). + +!! This file is a template that usually needs to be modified to handle !! +!! application specific interrupts. Search USER_EDIT for helpful comments !! +!! on where to insert handlers and how to write them. !! + + Users can also install application-specific exception handlers in the + same way, by calling xt_set_exception_handler(). One handler slot is + provided for each exception type. Note that some exceptions are handled + by the porting layer itself, and cannot be taken over by application + code in this manner. These are the alloca, syscall, and coprocessor + exceptions. + + The exception handlers can be written in C, and must follow C calling + convention. Each handler is passed a pointer to an exception frame as + its single argument. The exception frame is created on the stack, and + holds the saved context of the thread that took the exception. If the + handler returns, the context will be restored and the instruction that + caused the exception will be retried. If the handler makes any changes + to the saved state in the exception frame, the changes will be applied + when restoring the context. + + Because Xtensa is a configurable architecture, this port supports all user + generated configurations (except restrictions stated in the release notes). + This is accomplished by conditional compilation using macros and functions + defined in the Xtensa HAL (hardware adaptation layer) for your configuration. + Only the relevant parts of this file will be included in your RTOS build. + For example, this file provides interrupt vector templates for all types and + all priority levels, but only the ones in your configuration are built. + + NOTES on the use of 'call0' for long jumps instead of 'j': + 1. This file should be assembled with the -mlongcalls option to xt-xcc. + 2. The -mlongcalls compiler option causes 'call0 dest' to be expanded to + a sequence 'l32r a0, dest' 'callx0 a0' which works regardless of the + distance from the call to the destination. The linker then relaxes + it back to 'call0 dest' if it determines that dest is within range. + This allows more flexibility in locating code without the performance + overhead of the 'l32r' literal data load in cases where the destination + is in range of 'call0'. There is an additional benefit in that 'call0' + has a longer range than 'j' due to the target being word-aligned, so + the 'l32r' sequence is less likely needed. + 3. The use of 'call0' with -mlongcalls requires that register a0 not be + live at the time of the call, which is always the case for a function + call but needs to be ensured if 'call0' is used as a jump in lieu of 'j'. + 4. This use of 'call0' is independent of the C function call ABI. + +*******************************************************************************/ + +#include "xtensa_rtos.h" +#include "esp_idf_version.h" +#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) +#include "esp_panic.h" +#else +#include "esp_private/panic_reason.h" +#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */ +#include "sdkconfig.h" +#include "soc/soc.h" + +/* + Define for workaround: pin no-cpu-affinity tasks to a cpu when fpu is used. + Please change this when the tcb structure is changed +*/ +#define TASKTCB_XCOREID_OFFSET (0x38+configMAX_TASK_NAME_LEN+3)&~3 +.extern pxCurrentTCB + +/* +-------------------------------------------------------------------------------- + In order for backtracing to be able to trace from the pre-exception stack + across to the exception stack (including nested interrupts), we need to create + a pseudo base-save area to make it appear like the exception dispatcher was + triggered by a CALL4 from the pre-exception code. In reality, the exception + dispatcher uses the same window as pre-exception code, and only CALL0s are + used within the exception dispatcher. + + To create the pseudo base-save area, we need to store a copy of the pre-exception's + base save area (a0 to a4) below the exception dispatcher's SP. EXCSAVE_x will + be used to store a copy of the SP that points to the interrupted code's exception + frame just in case the exception dispatcher's SP does not point to the exception + frame (which is the case when switching from task to interrupt stack). + + Clearing the pseudo base-save area is uncessary as the interrupt dispatcher + will restore the current SP to that of the pre-exception SP. +-------------------------------------------------------------------------------- +*/ +#ifdef CONFIG_FREERTOS_INTERRUPT_BACKTRACE +#define XT_DEBUG_BACKTRACE 1 +#endif + + +/* +-------------------------------------------------------------------------------- + Defines used to access _xtos_interrupt_table. +-------------------------------------------------------------------------------- +*/ +#define XIE_HANDLER 0 +#define XIE_ARG 4 +#define XIE_SIZE 8 + + +/* + Macro get_percpu_entry_for - convert a per-core ID into a multicore entry. + Basically does reg=reg*portNUM_PROCESSORS+current_core_id + Multiple versions here to optimize for specific portNUM_PROCESSORS values. +*/ + .macro get_percpu_entry_for reg scratch +#if (portNUM_PROCESSORS == 1) + /* No need to do anything */ +#elif (portNUM_PROCESSORS == 2) + /* Optimized 2-core code. */ + getcoreid \scratch + addx2 \reg,\reg,\scratch +#else + /* Generalized n-core code. Untested! */ + movi \scratch,portNUM_PROCESSORS + mull \scratch,\reg,\scratch + getcoreid \reg + add \reg,\scratch,\reg +#endif + .endm +/* +-------------------------------------------------------------------------------- + Macro extract_msb - return the input with only the highest bit set. + + Input : "ain" - Input value, clobbered. + Output : "aout" - Output value, has only one bit set, MSB of "ain". + The two arguments must be different AR registers. +-------------------------------------------------------------------------------- +*/ + + .macro extract_msb aout ain +1: + addi \aout, \ain, -1 /* aout = ain - 1 */ + and \ain, \ain, \aout /* ain = ain & aout */ + bnez \ain, 1b /* repeat until ain == 0 */ + addi \aout, \aout, 1 /* return aout + 1 */ + .endm + +/* +-------------------------------------------------------------------------------- + Macro dispatch_c_isr - dispatch interrupts to user ISRs. + This will dispatch to user handlers (if any) that are registered in the + XTOS dispatch table (_xtos_interrupt_table). These handlers would have + been registered by calling _xtos_set_interrupt_handler(). There is one + exception - the timer interrupt used by the OS will not be dispatched + to a user handler - this must be handled by the caller of this macro. + + Level triggered and software interrupts are automatically deasserted by + this code. + + ASSUMPTIONS: + -- PS.INTLEVEL is set to "level" at entry + -- PS.EXCM = 0, C calling enabled + + NOTE: For CALL0 ABI, a12-a15 have not yet been saved. + + NOTE: This macro will use registers a0 and a2-a7. The arguments are: + level -- interrupt level + mask -- interrupt bitmask for this level +-------------------------------------------------------------------------------- +*/ + + .macro dispatch_c_isr level mask + + #ifdef CONFIG_PM_TRACE + movi a6, 0 /* = ESP_PM_TRACE_IDLE */ + getcoreid a7 + call4 esp_pm_trace_exit + #endif // CONFIG_PM_TRACE + + /* Get mask of pending, enabled interrupts at this level into a2. */ + +.L_xt_user_int_&level&: + rsr a2, INTENABLE + rsr a3, INTERRUPT + movi a4, \mask + and a2, a2, a3 + and a2, a2, a4 + beqz a2, 9f /* nothing to do */ + + /* This bit of code provides a nice debug backtrace in the debugger. + It does take a few more instructions, so undef XT_DEBUG_BACKTRACE + if you want to save the cycles. + At this point, the exception frame should have been allocated and filled, + and current sp points to the interrupt stack (for non-nested interrupt) + or below the allocated exception frame (for nested interrupts). Copy the + pre-exception's base save area below the current SP. + */ + #ifdef XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + rsr a0, EXCSAVE_1 + \level - 1 /* Get exception frame pointer stored in EXCSAVE_x */ + l32i a3, a0, XT_STK_A0 /* Copy pre-exception a0 (return address) */ + s32e a3, a1, -16 + l32i a3, a0, XT_STK_A1 /* Copy pre-exception a1 (stack pointer) */ + s32e a3, a1, -12 + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + /* Backtracing only needs a0 and a1, no need to create full base save area. + Also need to change current frame's return address to point to pre-exception's + last run instruction. + */ + rsr a0, EPC_1 + \level - 1 /* return address */ + movi a4, 0xC0000000 /* constant with top 2 bits set (call size) */ + or a0, a0, a4 /* set top 2 bits */ + addx2 a0, a4, a0 /* clear top bit -- simulating call4 size */ + #endif + #endif + + #ifdef CONFIG_PM_ENABLE + call4 esp_pm_impl_isr_hook + #endif + + #ifdef XT_INTEXC_HOOKS + /* Call interrupt hook if present to (pre)handle interrupts. */ + movi a4, _xt_intexc_hooks + l32i a4, a4, \level << 2 + beqz a4, 2f + #ifdef __XTENSA_CALL0_ABI__ + callx0 a4 + beqz a2, 9f + #else + mov a6, a2 + callx4 a4 + beqz a6, 9f + mov a2, a6 + #endif +2: + #endif + + /* Now look up in the dispatch table and call user ISR if any. */ + /* If multiple bits are set then MSB has highest priority. */ + + extract_msb a4, a2 /* a4 = MSB of a2, a2 trashed */ + + #ifdef XT_USE_SWPRI + /* Enable all interrupts at this level that are numerically higher + than the one we just selected, since they are treated as higher + priority. + */ + movi a3, \mask /* a3 = all interrupts at this level */ + add a2, a4, a4 /* a2 = a4 << 1 */ + addi a2, a2, -1 /* a2 = mask of 1's <= a4 bit */ + and a2, a2, a3 /* a2 = mask of all bits <= a4 at this level */ + movi a3, _xt_intdata + l32i a6, a3, 4 /* a6 = _xt_vpri_mask */ + neg a2, a2 + addi a2, a2, -1 /* a2 = mask to apply */ + and a5, a6, a2 /* mask off all bits <= a4 bit */ + s32i a5, a3, 4 /* update _xt_vpri_mask */ + rsr a3, INTENABLE + and a3, a3, a2 /* mask off all bits <= a4 bit */ + wsr a3, INTENABLE + rsil a3, \level - 1 /* lower interrupt level by 1 */ + #endif + + #ifdef XT_RTOS_TIMER_INT + movi a3, XT_TIMER_INTEN /* a3 = timer interrupt bit */ + wsr a4, INTCLEAR /* clear sw or edge-triggered interrupt */ + beq a3, a4, 7f /* if timer interrupt then skip table */ + #else + wsr a4, INTCLEAR /* clear sw or edge-triggered interrupt */ + #endif // XT_RTOS_TIMER_INT + + find_ms_setbit a3, a4, a3, 0 /* a3 = interrupt number */ + + get_percpu_entry_for a3, a12 + movi a4, _xt_interrupt_table + addx8 a3, a3, a4 /* a3 = address of interrupt table entry */ + l32i a4, a3, XIE_HANDLER /* a4 = handler address */ + #ifdef __XTENSA_CALL0_ABI__ + mov a12, a6 /* save in callee-saved reg */ + l32i a2, a3, XIE_ARG /* a2 = handler arg */ + callx0 a4 /* call handler */ + mov a2, a12 + #else + mov a2, a6 /* save in windowed reg */ + l32i a6, a3, XIE_ARG /* a6 = handler arg */ + callx4 a4 /* call handler */ + #endif + + #ifdef XT_USE_SWPRI + j 8f + #else + j .L_xt_user_int_&level& /* check for more interrupts */ + #endif + #ifdef XT_RTOS_TIMER_INT +7: + + .ifeq XT_TIMER_INTPRI - \level +.L_xt_user_int_timer_&level&: + /* + Interrupt handler for the RTOS tick timer if at this level. + We'll be reading the interrupt state again after this call + so no need to preserve any registers except a6 (vpri_mask). + */ + + #ifdef __XTENSA_CALL0_ABI__ + mov a12, a6 + call0 XT_RTOS_TIMER_INT + mov a2, a12 + #else + mov a2, a6 + call4 XT_RTOS_TIMER_INT + #endif + .endif + #endif // XT_RTOS_TIMER_INT + + #ifdef XT_USE_SWPRI + j 8f + #else + j .L_xt_user_int_&level& /* check for more interrupts */ + #endif + + #ifdef XT_USE_SWPRI +8: + /* Restore old value of _xt_vpri_mask from a2. Also update INTENABLE from + virtual _xt_intenable which _could_ have changed during interrupt + processing. */ + + movi a3, _xt_intdata + l32i a4, a3, 0 /* a4 = _xt_intenable */ + s32i a2, a3, 4 /* update _xt_vpri_mask */ + and a4, a4, a2 /* a4 = masked intenable */ + wsr a4, INTENABLE /* update INTENABLE */ + #endif + +9: + /* done */ + + .endm + +#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) +/* +-------------------------------------------------------------------------------- + Panic handler. + Should be reached by call0 (preferable) or jump only. If call0, a0 says where + from. If on simulator, display panic message and abort, else loop indefinitely. +-------------------------------------------------------------------------------- +*/ + + .section .iram1,"ax" + .global panicHandler + + .global _xt_panic + .type _xt_panic,@function + .align 4 + .literal_position + .align 4 + +_xt_panic: + /* Allocate exception frame and save minimal context. */ + mov a0, sp + addi sp, sp, -XT_STK_FRMSZ + s32i a0, sp, XT_STK_A1 + #if XCHAL_HAVE_WINDOWED + s32e a0, sp, -12 /* for debug backtrace */ + #endif + rsr a0, PS /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_1 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + #if XCHAL_HAVE_WINDOWED + s32e a0, sp, -16 /* for debug backtrace */ + #endif + s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */ + s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */ + call0 _xt_context_save + + /* Save exc cause and vaddr into exception frame */ + rsr a0, EXCCAUSE + s32i a0, sp, XT_STK_EXCCAUSE + rsr a0, EXCVADDR + s32i a0, sp, XT_STK_EXCVADDR + + /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */ + rsr a0, EXCSAVE_1 /* save interruptee's a0 */ + + s32i a0, sp, XT_STK_A0 + + /* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */ + movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE + wsr a0, PS + + //Call panic handler + mov a6,sp + call4 panicHandler + + + .align 4 +//Call using call0. Prints the hex char in a2. Kills a3, a4, a5 +panic_print_hex: + movi a3,0x60000000 + movi a4,8 +panic_print_hex_loop: + l32i a5, a3, 0x1c + extui a5, a5, 16, 8 + bgei a5,64,panic_print_hex_loop + + srli a5,a2,28 + bgei a5,10,panic_print_hex_a + addi a5,a5,'0' + j panic_print_hex_ok +panic_print_hex_a: + addi a5,a5,'A'-10 +panic_print_hex_ok: + s32i a5,a3,0 + slli a2,a2,4 + + addi a4,a4,-1 + bnei a4,0,panic_print_hex_loop + movi a5,' ' + s32i a5,a3,0 + + ret +#endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + + .section .rodata, "a" + .align 4 + +/* +-------------------------------------------------------------------------------- + Hooks to dynamically install handlers for exceptions and interrupts. + Allows automated regression frameworks to install handlers per test. + Consists of an array of function pointers indexed by interrupt level, + with index 0 containing the entry for user exceptions. + Initialized with all 0s, meaning no handler is installed at each level. + See comment in xtensa_rtos.h for more details. + + *WARNING* This array is for all CPUs, that is, installing a hook for + one CPU will install it for all others as well! +-------------------------------------------------------------------------------- +*/ + + #ifdef XT_INTEXC_HOOKS + .data + .global _xt_intexc_hooks + .type _xt_intexc_hooks,@object + .align 4 + +_xt_intexc_hooks: + .fill XT_INTEXC_HOOK_NUM, 4, 0 + #endif + + +/* +-------------------------------------------------------------------------------- + EXCEPTION AND LEVEL 1 INTERRUPT VECTORS AND LOW LEVEL HANDLERS + (except window exception vectors). + + Each vector goes at a predetermined location according to the Xtensa + hardware configuration, which is ensured by its placement in a special + section known to the Xtensa linker support package (LSP). It performs + the minimum necessary before jumping to the handler in the .text section. + + The corresponding handler goes in the normal .text section. It sets up + the appropriate stack frame, saves a few vector-specific registers and + calls XT_RTOS_INT_ENTER to save the rest of the interrupted context + and enter the RTOS, then sets up a C environment. It then calls the + user's interrupt handler code (which may be coded in C) and finally + calls XT_RTOS_INT_EXIT to transfer control to the RTOS for scheduling. + + While XT_RTOS_INT_EXIT does not return directly to the interruptee, + eventually the RTOS scheduler will want to dispatch the interrupted + task or handler. The scheduler will return to the exit point that was + saved in the interrupt stack frame at XT_STK_EXIT. +-------------------------------------------------------------------------------- +*/ + + +/* +-------------------------------------------------------------------------------- +Debug Exception. +-------------------------------------------------------------------------------- +*/ + +#if XCHAL_HAVE_DEBUG + + .begin literal_prefix .DebugExceptionVector + .section .DebugExceptionVector.text, "ax" + .global _DebugExceptionVector + .align 4 + .global xt_debugexception +_DebugExceptionVector: + wsr a0, EXCSAVE+XCHAL_DEBUGLEVEL /* preserve a0 */ + call0 xt_debugexception /* load exception handler */ + + .end literal_prefix + +#endif + +/* +-------------------------------------------------------------------------------- +Double Exception. +Double exceptions are not a normal occurrence. They indicate a bug of some kind. +-------------------------------------------------------------------------------- +*/ + +#ifdef XCHAL_DOUBLEEXC_VECTOR_VADDR + + .begin literal_prefix .DoubleExceptionVector + .section .DoubleExceptionVector.text, "ax" + .global _DoubleExceptionVector + .align 4 + +_DoubleExceptionVector: + + #if XCHAL_HAVE_DEBUG + break 1, 4 /* unhandled double exception */ + #endif + movi a0,PANIC_RSN_DOUBLEEXCEPTION + wsr a0,EXCCAUSE + call0 _xt_panic /* does not return */ + rfde /* make a0 point here not later */ + + .end literal_prefix + +#endif /* XCHAL_DOUBLEEXC_VECTOR_VADDR */ + +/* +-------------------------------------------------------------------------------- +Kernel Exception (including Level 1 Interrupt from kernel mode). +-------------------------------------------------------------------------------- +*/ + + .begin literal_prefix .KernelExceptionVector + .section .KernelExceptionVector.text, "ax" + .global _KernelExceptionVector + .align 4 + +_KernelExceptionVector: + + wsr a0, EXCSAVE_1 /* preserve a0 */ + call0 _xt_kernel_exc /* kernel exception handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .section .iram1,"ax" + .align 4 + +_xt_kernel_exc: + #if XCHAL_HAVE_DEBUG + break 1, 0 /* unhandled kernel exception */ + #endif + movi a0,PANIC_RSN_KERNELEXCEPTION + wsr a0,EXCCAUSE + call0 _xt_panic /* does not return */ + rfe /* make a0 point here not there */ + + +/* +-------------------------------------------------------------------------------- +User Exception (including Level 1 Interrupt from user mode). +-------------------------------------------------------------------------------- +*/ + + .begin literal_prefix .UserExceptionVector + .section .UserExceptionVector.text, "ax" + .global _UserExceptionVector + .type _UserExceptionVector,@function + .align 4 + +_UserExceptionVector: + + wsr a0, EXCSAVE_1 /* preserve a0 */ + call0 _xt_user_exc /* user exception handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + +/* +-------------------------------------------------------------------------------- + Insert some waypoints for jumping beyond the signed 8-bit range of + conditional branch instructions, so the conditional branchces to specific + exception handlers are not taken in the mainline. Saves some cycles in the + mainline. +-------------------------------------------------------------------------------- +*/ + +#ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY + .global LoadStoreErrorHandler + .global AlignmentErrorHandler +#endif + + .section .iram1,"ax" + + #if XCHAL_HAVE_WINDOWED + .align 4 +_xt_to_alloca_exc: + call0 _xt_alloca_exc /* in window vectors section */ + /* never returns here - call0 is used as a jump (see note at top) */ + #endif + + .align 4 +_xt_to_syscall_exc: + call0 _xt_syscall_exc + /* never returns here - call0 is used as a jump (see note at top) */ + + #if XCHAL_CP_NUM > 0 + .align 4 +_xt_to_coproc_exc: + call0 _xt_coproc_exc + /* never returns here - call0 is used as a jump (see note at top) */ + #endif + +#ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY + .align 4 +_call_loadstore_handler: + call0 LoadStoreErrorHandler + /* This will return only if wrong opcode or address out of range*/ + j .LS_exit + + .align 4 +_call_alignment_handler: + call0 AlignmentErrorHandler + /* This will return only if wrong opcode or address out of range*/ + addi a0, a0, 1 + j .LS_exit +#endif + +/* +-------------------------------------------------------------------------------- + User exception handler. +-------------------------------------------------------------------------------- +*/ + + .type _xt_user_exc,@function + .align 4 + +_xt_user_exc: + + /* If level 1 interrupt then jump to the dispatcher */ + rsr a0, EXCCAUSE + beqi a0, EXCCAUSE_LEVEL1INTERRUPT, _xt_lowint1 + + /* Handle any coprocessor exceptions. Rely on the fact that exception + numbers above EXCCAUSE_CP0_DISABLED all relate to the coprocessors. + */ + #if XCHAL_CP_NUM > 0 + bgeui a0, EXCCAUSE_CP0_DISABLED, _xt_to_coproc_exc + #endif + + /* Handle alloca and syscall exceptions */ + #if XCHAL_HAVE_WINDOWED + beqi a0, EXCCAUSE_ALLOCA, _xt_to_alloca_exc + #endif + beqi a0, EXCCAUSE_SYSCALL, _xt_to_syscall_exc + +#ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY + beqi a0, EXCCAUSE_LOAD_STORE_ERROR, _call_loadstore_handler + + addi a0, a0, -1 + beqi a0, 8, _call_alignment_handler + addi a0, a0, 1 +.LS_exit: +#endif + + /* Handle all other exceptions. All can have user-defined handlers. */ + /* NOTE: we'll stay on the user stack for exception handling. */ + + /* Allocate exception frame and save minimal context. */ + mov a0, sp + addi sp, sp, -XT_STK_FRMSZ + s32i a0, sp, XT_STK_A1 + #if XCHAL_HAVE_WINDOWED + s32e a0, sp, -12 /* for debug backtrace */ + #endif + rsr a0, PS /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_1 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + #if XCHAL_HAVE_WINDOWED + s32e a0, sp, -16 /* for debug backtrace */ + #endif + s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */ + s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */ + call0 _xt_context_save + + /* Save exc cause and vaddr into exception frame */ + rsr a0, EXCCAUSE + s32i a0, sp, XT_STK_EXCCAUSE + rsr a0, EXCVADDR + s32i a0, sp, XT_STK_EXCVADDR + + /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */ + rsr a0, EXCSAVE_1 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + + /* Set up PS for C, reenable debug and NMI interrupts, and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(XCHAL_DEBUGLEVEL - 2) | PS_UM + #else + movi a0, PS_INTLEVEL(XCHAL_DEBUGLEVEL - 2) | PS_UM | PS_WOE + #endif + wsr a0, PS + + /* + Create pseudo base save area. At this point, sp is still pointing to the + allocated and filled exception stack frame. + */ + #ifdef XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + l32i a3, sp, XT_STK_A0 /* Copy pre-exception a0 (return address) */ + s32e a3, sp, -16 + l32i a3, sp, XT_STK_A1 /* Copy pre-exception a1 (stack pointer) */ + s32e a3, sp, -12 + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + rsr a0, EPC_1 /* return address for debug backtrace */ + movi a5, 0xC0000000 /* constant with top 2 bits set (call size) */ + rsync /* wait for WSR.PS to complete */ + or a0, a0, a5 /* set top 2 bits */ + addx2 a0, a5, a0 /* clear top bit -- thus simulating call4 size */ + #else + rsync /* wait for WSR.PS to complete */ + #endif + #endif + + rsr a2, EXCCAUSE /* recover exc cause */ + + #ifdef XT_INTEXC_HOOKS + /* + Call exception hook to pre-handle exceptions (if installed). + Pass EXCCAUSE in a2, and check result in a2 (if -1, skip default handling). + */ + movi a4, _xt_intexc_hooks + l32i a4, a4, 0 /* user exception hook index 0 */ + beqz a4, 1f +.Ln_xt_user_exc_call_hook: + #ifdef __XTENSA_CALL0_ABI__ + callx0 a4 + beqi a2, -1, .L_xt_user_done + #else + mov a6, a2 + callx4 a4 + beqi a6, -1, .L_xt_user_done + mov a2, a6 + #endif +1: + #endif + + rsr a2, EXCCAUSE /* recover exc cause */ + movi a3, _xt_exception_table + get_percpu_entry_for a2, a4 + addx4 a4, a2, a3 /* a4 = address of exception table entry */ + l32i a4, a4, 0 /* a4 = handler address */ + #ifdef __XTENSA_CALL0_ABI__ + mov a2, sp /* a2 = pointer to exc frame */ + callx0 a4 /* call handler */ + #else + mov a6, sp /* a6 = pointer to exc frame */ + callx4 a4 /* call handler */ + #endif + +.L_xt_user_done: + + /* Restore context and return */ + call0 _xt_context_restore + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, PS + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_1 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove exception frame */ + rsync /* ensure PS and EPC written */ + rfe /* PS.EXCM is cleared */ + + +/* +-------------------------------------------------------------------------------- + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. +-------------------------------------------------------------------------------- +*/ + + .global _xt_user_exit + .type _xt_user_exit,@function + .align 4 +_xt_user_exit: + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, PS + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_1 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure PS and EPC written */ + rfe /* PS.EXCM is cleared */ + + +/* + +-------------------------------------------------------------------------------- +Syscall Exception Handler (jumped to from User Exception Handler). +Syscall 0 is required to spill the register windows (no-op in Call 0 ABI). +Only syscall 0 is handled here. Other syscalls return -1 to caller in a2. +-------------------------------------------------------------------------------- +*/ + + .section .iram1,"ax" + .type _xt_syscall_exc,@function + .align 4 +_xt_syscall_exc: + + #ifdef __XTENSA_CALL0_ABI__ + /* + Save minimal regs for scratch. Syscall 0 does nothing in Call0 ABI. + Use a minimal stack frame (16B) to save A2 & A3 for scratch. + PS.EXCM could be cleared here, but unlikely to improve worst-case latency. + rsr a0, PS + addi a0, a0, -PS_EXCM_MASK + wsr a0, PS + */ + addi sp, sp, -16 + s32i a2, sp, 8 + s32i a3, sp, 12 + #else /* Windowed ABI */ + /* + Save necessary context and spill the register windows. + PS.EXCM is still set and must remain set until after the spill. + Reuse context save function though it saves more than necessary. + For this reason, a full interrupt stack frame is allocated. + */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */ + s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */ + call0 _xt_context_save + #endif + + /* + Grab the interruptee's PC and skip over the 'syscall' instruction. + If it's at the end of a zero-overhead loop and it's not on the last + iteration, decrement loop counter and skip to beginning of loop. + */ + rsr a2, EPC_1 /* a2 = PC of 'syscall' */ + addi a3, a2, 3 /* ++PC */ + #if XCHAL_HAVE_LOOPS + rsr a0, LEND /* if (PC == LEND */ + bne a3, a0, 1f + rsr a0, LCOUNT /* && LCOUNT != 0) */ + beqz a0, 1f /* { */ + addi a0, a0, -1 /* --LCOUNT */ + rsr a3, LBEG /* PC = LBEG */ + wsr a0, LCOUNT /* } */ + #endif +1: wsr a3, EPC_1 /* update PC */ + + /* Restore interruptee's context and return from exception. */ + #ifdef __XTENSA_CALL0_ABI__ + l32i a2, sp, 8 + l32i a3, sp, 12 + addi sp, sp, 16 + #else + call0 _xt_context_restore + addi sp, sp, XT_STK_FRMSZ + #endif + movi a0, -1 + movnez a2, a0, a2 /* return -1 if not syscall 0 */ + rsr a0, EXCSAVE_1 + rfe + +/* +-------------------------------------------------------------------------------- +Co-Processor Exception Handler (jumped to from User Exception Handler). +These exceptions are generated by co-processor instructions, which are only +allowed in thread code (not in interrupts or kernel code). This restriction is +deliberately imposed to reduce the burden of state-save/restore in interrupts. +-------------------------------------------------------------------------------- +*/ +#if XCHAL_CP_NUM > 0 + + .section .rodata, "a" + +/* Offset to CP n save area in thread's CP save area. */ + .global _xt_coproc_sa_offset + .type _xt_coproc_sa_offset,@object + .align 16 /* minimize crossing cache boundaries */ +_xt_coproc_sa_offset: + .word XT_CP0_SA, XT_CP1_SA, XT_CP2_SA, XT_CP3_SA + .word XT_CP4_SA, XT_CP5_SA, XT_CP6_SA, XT_CP7_SA + +/* Bitmask for CP n's CPENABLE bit. */ + .type _xt_coproc_mask,@object + .align 16,,8 /* try to keep it all in one cache line */ + .set i, 0 +_xt_coproc_mask: + .rept XCHAL_CP_MAX + .long (i<<16) | (1<= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifndef CONFIG_FREERTOS_FPU_IN_ISR + #endif + beq a15, a2, .L_goto_done /* new owner == old, we're done */ + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #endif + #endif + + /* If no old owner then nothing to save. */ + beqz a2, .L_check_new + + /* If old owner not actively using CP then nothing to save. */ + l16ui a4, a2, XT_CPENABLE /* a4 = old owner's CPENABLE */ + bnone a4, a0, .L_check_new /* old owner not using CP */ + +.L_save_old: + /* Save old owner's coprocessor state. */ + + movi a5, _xt_coproc_sa_offset + + /* Mark old owner state as no longer active (CPENABLE bit n clear). */ + xor a4, a4, a0 /* clear CP bit in CPENABLE */ + s16i a4, a2, XT_CPENABLE /* update old owner's CPENABLE */ + + extui a4, a0, 16, 5 /* a4 = CP index = n */ + addx4 a5, a4, a5 /* a5 = &_xt_coproc_sa_offset[n] */ + + /* Mark old owner state as saved (CPSTORED bit n set). */ + l16ui a4, a2, XT_CPSTORED /* a4 = old owner's CPSTORED */ + l32i a5, a5, 0 /* a5 = XT_CP[n]_SA offset */ + or a4, a4, a0 /* set CP in old owner's CPSTORED */ + s16i a4, a2, XT_CPSTORED /* update old owner's CPSTORED */ + l32i a2, a2, XT_CP_ASA /* ptr to actual (aligned) save area */ + extui a3, a0, 16, 5 /* a3 = CP index = n */ + add a2, a2, a5 /* a2 = old owner's area for CP n */ + + /* + The config-specific HAL macro invoked below destroys a2-5, preserves a0-1. + It is theoretically possible for Xtensa processor designers to write TIE + that causes more address registers to be affected, but it is generally + unlikely. If that ever happens, more registers needs to be saved/restored + around this macro invocation, and the value in a15 needs to be recomputed. + */ + xchal_cpi_store_funcbody + +.L_check_new: + /* Check if any state has to be restored for new owner. */ + /* NOTE: a15 = new owner's save area, cannot be zero when we get here. */ + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + beqz a15, .L_xt_coproc_done + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + l16ui a3, a15, XT_CPSTORED /* a3 = new owner's CPSTORED */ + movi a4, _xt_coproc_sa_offset + bnone a3, a0, .L_check_cs /* full CP not saved, check callee-saved */ + xor a3, a3, a0 /* CPSTORED bit is set, clear it */ + s16i a3, a15, XT_CPSTORED /* update new owner's CPSTORED */ + + /* Adjust new owner's save area pointers to area for CP n. */ + extui a3, a0, 16, 5 /* a3 = CP index = n */ + addx4 a4, a3, a4 /* a4 = &_xt_coproc_sa_offset[n] */ + l32i a4, a4, 0 /* a4 = XT_CP[n]_SA */ + l32i a5, a15, XT_CP_ASA /* ptr to actual (aligned) save area */ + add a2, a4, a5 /* a2 = new owner's area for CP */ + + /* + The config-specific HAL macro invoked below destroys a2-5, preserves a0-1. + It is theoretically possible for Xtensa processor designers to write TIE + that causes more address registers to be affected, but it is generally + unlikely. If that ever happens, more registers needs to be saved/restored + around this macro invocation. + */ + xchal_cpi_load_funcbody + + /* Restore interruptee's saved registers. */ + /* Can omit rsync for wsr.CPENABLE here because _xt_user_exit does it. */ +.L_xt_coproc_done: + l32i a15, sp, XT_STK_A15 + l32i a5, sp, XT_STK_A5 + l32i a4, sp, XT_STK_A4 + l32i a3, sp, XT_STK_A3 + l32i a2, sp, XT_STK_A2 + call0 _xt_user_exit /* return via exit dispatcher */ + /* Never returns here - call0 is used as a jump (see note at top) */ + +.L_check_cs: + /* a0 = CP mask in low bits, a15 = new owner's save area */ + l16ui a2, a15, XT_CP_CS_ST /* a2 = mask of CPs saved */ + bnone a2, a0, .L_xt_coproc_done /* if no match then done */ + and a2, a2, a0 /* a2 = which CPs to restore */ + extui a2, a2, 0, 8 /* extract low 8 bits */ + s32i a6, sp, XT_STK_A6 /* save extra needed regs */ + s32i a7, sp, XT_STK_A7 + s32i a13, sp, XT_STK_A13 + s32i a14, sp, XT_STK_A14 + call0 _xt_coproc_restorecs /* restore CP registers */ + l32i a6, sp, XT_STK_A6 /* restore saved registers */ + l32i a7, sp, XT_STK_A7 + l32i a13, sp, XT_STK_A13 + l32i a14, sp, XT_STK_A14 + j .L_xt_coproc_done + + /* Co-processor exception occurred outside a thread (not supported). */ +.L_xt_coproc_invalid: + movi a0,PANIC_RSN_COPROCEXCEPTION + wsr a0,EXCCAUSE + call0 _xt_panic /* not in a thread (invalid) */ + /* never returns */ + + +#endif /* XCHAL_CP_NUM */ + + +/* +------------------------------------------------------------------------------- + Level 1 interrupt dispatch. Assumes stack frame has not been allocated yet. +------------------------------------------------------------------------------- +*/ + + .section .iram1,"ax" + .type _xt_lowint1,@function + .align 4 + +_xt_lowint1: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, PS /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_1 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_1 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_user_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + /* EXCSAVE_1 should now be free to use. Use it to keep a copy of the + current stack pointer that points to the exception frame (XT_STK_FRAME).*/ + #ifdef XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + mov a0, sp + wsr a0, EXCSAVE_1 + #endif + #endif + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(1) | PS_UM + #else + movi a0, PS_INTLEVEL(1) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 1 XCHAL_INTLEVEL1_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + +/* +------------------------------------------------------------------------------- + MEDIUM PRIORITY (LEVEL 2+) INTERRUPT VECTORS AND LOW LEVEL HANDLERS. + + Medium priority interrupts are by definition those with priority greater + than 1 and not greater than XCHAL_EXCM_LEVEL. These are disabled by + setting PS.EXCM and therefore can easily support a C environment for + handlers in C, and interact safely with an RTOS. + + Each vector goes at a predetermined location according to the Xtensa + hardware configuration, which is ensured by its placement in a special + section known to the Xtensa linker support package (LSP). It performs + the minimum necessary before jumping to the handler in the .text section. + + The corresponding handler goes in the normal .text section. It sets up + the appropriate stack frame, saves a few vector-specific registers and + calls XT_RTOS_INT_ENTER to save the rest of the interrupted context + and enter the RTOS, then sets up a C environment. It then calls the + user's interrupt handler code (which may be coded in C) and finally + calls XT_RTOS_INT_EXIT to transfer control to the RTOS for scheduling. + + While XT_RTOS_INT_EXIT does not return directly to the interruptee, + eventually the RTOS scheduler will want to dispatch the interrupted + task or handler. The scheduler will return to the exit point that was + saved in the interrupt stack frame at XT_STK_EXIT. +------------------------------------------------------------------------------- +*/ + +#if XCHAL_EXCM_LEVEL >= 2 + + .begin literal_prefix .Level2InterruptVector + .section .Level2InterruptVector.text, "ax" + .global _Level2Vector + .type _Level2Vector,@function + .align 4 +_Level2Vector: + wsr a0, EXCSAVE_2 /* preserve a0 */ + call0 _xt_medint2 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .section .iram1,"ax" + .type _xt_medint2,@function + .align 4 +_xt_medint2: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_2 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_2 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_2 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint2_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* EXCSAVE_2 should now be free to use. Use it to keep a copy of the + current stack pointer that points to the exception frame (XT_STK_FRAME).*/ + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifdef XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + mov a0, sp + wsr a0, EXCSAVE_2 + #endif + #endif + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(2) | PS_UM + #else + movi a0, PS_INTLEVEL(2) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 2 XCHAL_INTLEVEL2_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint2_exit + .type _xt_medint2_exit,@function + .align 4 +_xt_medint2_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_2 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_2 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 2 + +#endif /* Level 2 */ + +#if XCHAL_EXCM_LEVEL >= 3 + + .begin literal_prefix .Level3InterruptVector + .section .Level3InterruptVector.text, "ax" + .global _Level3Vector + .type _Level3Vector,@function + .align 4 +_Level3Vector: + wsr a0, EXCSAVE_3 /* preserve a0 */ + call0 _xt_medint3 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .section .iram1,"ax" + .type _xt_medint3,@function + .align 4 +_xt_medint3: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_3 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_3 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_3 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint3_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* EXCSAVE_3 should now be free to use. Use it to keep a copy of the + current stack pointer that points to the exception frame (XT_STK_FRAME).*/ + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifdef XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + mov a0, sp + wsr a0, EXCSAVE_3 + #endif + #endif + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(3) | PS_UM + #else + movi a0, PS_INTLEVEL(3) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 3 XCHAL_INTLEVEL3_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint3_exit + .type _xt_medint3_exit,@function + .align 4 +_xt_medint3_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_3 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_3 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 3 + +#endif /* Level 3 */ + +#if XCHAL_EXCM_LEVEL >= 4 + + .begin literal_prefix .Level4InterruptVector + .section .Level4InterruptVector.text, "ax" + .global _Level4Vector + .type _Level4Vector,@function + .align 4 +_Level4Vector: + wsr a0, EXCSAVE_4 /* preserve a0 */ + call0 _xt_medint4 /* load interrupt handler */ + + .end literal_prefix + + .section .iram1,"ax" + .type _xt_medint4,@function + .align 4 +_xt_medint4: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_4 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_4 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_4 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint4_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* EXCSAVE_4 should now be free to use. Use it to keep a copy of the + current stack pointer that points to the exception frame (XT_STK_FRAME).*/ + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifdef XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + mov a0, sp + wsr a0, EXCSAVE_4 + #endif + #endif + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(4) | PS_UM + #else + movi a0, PS_INTLEVEL(4) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 4 XCHAL_INTLEVEL4_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint4_exit + .type _xt_medint4_exit,@function + .align 4 +_xt_medint4_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_4 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_4 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 4 + +#endif /* Level 4 */ + +#if XCHAL_EXCM_LEVEL >= 5 + + .begin literal_prefix .Level5InterruptVector + .section .Level5InterruptVector.text, "ax" + .global _Level5Vector + .type _Level5Vector,@function + .align 4 +_Level5Vector: + wsr a0, EXCSAVE_5 /* preserve a0 */ + call0 _xt_medint5 /* load interrupt handler */ + + .end literal_prefix + + .section .iram1,"ax" + .type _xt_medint5,@function + .align 4 +_xt_medint5: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_5 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_5 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_5 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint5_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* EXCSAVE_5 should now be free to use. Use it to keep a copy of the + current stack pointer that points to the exception frame (XT_STK_FRAME).*/ + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifdef XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + mov a0, sp + wsr a0, EXCSAVE_5 + #endif + #endif + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(5) | PS_UM + #else + movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 5 XCHAL_INTLEVEL5_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint5_exit + .type _xt_medint5_exit,@function + .align 4 +_xt_medint5_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_5 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_5 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 5 + +#endif /* Level 5 */ + +#if XCHAL_EXCM_LEVEL >= 6 + + .begin literal_prefix .Level6InterruptVector + .section .Level6InterruptVector.text, "ax" + .global _Level6Vector + .type _Level6Vector,@function + .align 4 +_Level6Vector: + wsr a0, EXCSAVE_6 /* preserve a0 */ + call0 _xt_medint6 /* load interrupt handler */ + + .end literal_prefix + + .section .iram1,"ax" + .type _xt_medint6,@function + .align 4 +_xt_medint6: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_6 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_6 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_6 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint6_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* EXCSAVE_6 should now be free to use. Use it to keep a copy of the + current stack pointer that points to the exception frame (XT_STK_FRAME).*/ + #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) + #ifdef XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + mov a0, sp + wsr a0, EXCSAVE_6 + #endif + #endif + #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */ + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(6) | PS_UM + #else + movi a0, PS_INTLEVEL(6) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 6 XCHAL_INTLEVEL6_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint6_exit + .type _xt_medint6_exit,@function + .align 4 +_xt_medint6_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_6 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_6 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 6 + +#endif /* Level 6 */ + + +/******************************************************************************* + +HIGH PRIORITY (LEVEL > XCHAL_EXCM_LEVEL) INTERRUPT VECTORS AND HANDLERS + +High priority interrupts are by definition those with priorities greater +than XCHAL_EXCM_LEVEL. This includes non-maskable (NMI). High priority +interrupts cannot interact with the RTOS, that is they must save all regs +they use and not call any RTOS function. + +A further restriction imposed by the Xtensa windowed architecture is that +high priority interrupts must not modify the stack area even logically +"above" the top of the interrupted stack (they need to provide their +own stack or static save area). + +Cadence Design Systems recommends high priority interrupt handlers be coded in assembly +and used for purposes requiring very short service times. + +Here are templates for high priority (level 2+) interrupt vectors. +They assume only one interrupt per level to avoid the burden of identifying +which interrupts at this level are pending and enabled. This allows for +minimum latency and avoids having to save/restore a2 in addition to a0. +If more than one interrupt per high priority level is configured, this burden +is on the handler which in any case must provide a way to save and restore +registers it uses without touching the interrupted stack. + +Each vector goes at a predetermined location according to the Xtensa +hardware configuration, which is ensured by its placement in a special +section known to the Xtensa linker support package (LSP). It performs +the minimum necessary before jumping to the handler in the .text section. + +*******************************************************************************/ + +/* +These stubs just call xt_highintX/xt_nmi to handle the real interrupt. Please define +these in an external assembly source file. If these symbols are not defined anywhere +else, the defaults in xtensa_vector_defaults.S are used. +*/ + +#if XCHAL_NUM_INTLEVELS >=2 && XCHAL_EXCM_LEVEL <2 && XCHAL_DEBUGLEVEL !=2 + + .begin literal_prefix .Level2InterruptVector + .section .Level2InterruptVector.text, "ax" + .global _Level2Vector + .type _Level2Vector,@function + .global xt_highint2 + .align 4 +_Level2Vector: + wsr a0, EXCSAVE_2 /* preserve a0 */ + call0 xt_highint2 /* load interrupt handler */ + + .end literal_prefix + +#endif /* Level 2 */ + +#if XCHAL_NUM_INTLEVELS >=3 && XCHAL_EXCM_LEVEL <3 && XCHAL_DEBUGLEVEL !=3 + + .begin literal_prefix .Level3InterruptVector + .section .Level3InterruptVector.text, "ax" + .global _Level3Vector + .type _Level3Vector,@function + .global xt_highint3 + .align 4 +_Level3Vector: + wsr a0, EXCSAVE_3 /* preserve a0 */ + call0 xt_highint3 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + +#endif /* Level 3 */ + +#if XCHAL_NUM_INTLEVELS >=4 && XCHAL_EXCM_LEVEL <4 && XCHAL_DEBUGLEVEL !=4 + + .begin literal_prefix .Level4InterruptVector + .section .Level4InterruptVector.text, "ax" + .global _Level4Vector + .type _Level4Vector,@function + .global xt_highint4 + .align 4 +_Level4Vector: + wsr a0, EXCSAVE_4 /* preserve a0 */ + call0 xt_highint4 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + +#endif /* Level 4 */ + +#if XCHAL_NUM_INTLEVELS >=5 && XCHAL_EXCM_LEVEL <5 && XCHAL_DEBUGLEVEL !=5 + + .begin literal_prefix .Level5InterruptVector + .section .Level5InterruptVector.text, "ax" + .global _Level5Vector + .type _Level5Vector,@function + .global xt_highint5 + .align 4 +_Level5Vector: + wsr a0, EXCSAVE_5 /* preserve a0 */ + call0 xt_highint5 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + +#endif /* Level 5 */ + +#if XCHAL_NUM_INTLEVELS >=6 && XCHAL_EXCM_LEVEL <6 && XCHAL_DEBUGLEVEL !=6 + + .begin literal_prefix .Level6InterruptVector + .section .Level6InterruptVector.text, "ax" + .global _Level6Vector + .type _Level6Vector,@function + .global xt_highint6 + .align 4 +_Level6Vector: + wsr a0, EXCSAVE_6 /* preserve a0 */ + call0 xt_highint6 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + +#endif /* Level 6 */ + +#if XCHAL_HAVE_NMI + + .begin literal_prefix .NMIExceptionVector + .section .NMIExceptionVector.text, "ax" + .global _NMIExceptionVector + .type _NMIExceptionVector,@function + .global xt_nmi + .align 4 +_NMIExceptionVector: + wsr a0, EXCSAVE + XCHAL_NMILEVEL _ /* preserve a0 */ + call0 xt_nmi /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + +#endif /* NMI */ + + +/******************************************************************************* + +WINDOW OVERFLOW AND UNDERFLOW EXCEPTION VECTORS AND ALLOCA EXCEPTION HANDLER + +Here is the code for each window overflow/underflow exception vector and +(interspersed) efficient code for handling the alloca exception cause. +Window exceptions are handled entirely in the vector area and are very +tight for performance. The alloca exception is also handled entirely in +the window vector area so comes at essentially no cost in code size. +Users should never need to modify them and Cadence Design Systems recommends +they do not. + +Window handlers go at predetermined vector locations according to the +Xtensa hardware configuration, which is ensured by their placement in a +special section known to the Xtensa linker support package (LSP). Since +their offsets in that section are always the same, the LSPs do not define +a section per vector. + +These things are coded for XEA2 only (XEA1 is not supported). + +Note on Underflow Handlers: +The underflow handler for returning from call[i+1] to call[i] +must preserve all the registers from call[i+1]'s window. +In particular, a0 and a1 must be preserved because the RETW instruction +will be reexecuted (and may even underflow if an intervening exception +has flushed call[i]'s registers). +Registers a2 and up may contain return values. + +*******************************************************************************/ + +#if XCHAL_HAVE_WINDOWED + + .section .WindowVectors.text, "ax" + +/* +-------------------------------------------------------------------------------- +Window Overflow Exception for Call4. + +Invoked if a call[i] referenced a register (a4-a15) +that contains data from ancestor call[j]; +call[j] had done a call4 to call[j+1]. +On entry here: + window rotated to call[j] start point; + a0-a3 are registers to be saved; + a4-a15 must be preserved; + a5 is call[j+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x0 + .global _WindowOverflow4 +_WindowOverflow4: + + s32e a0, a5, -16 /* save a0 to call[j+1]'s stack frame */ + s32e a1, a5, -12 /* save a1 to call[j+1]'s stack frame */ + s32e a2, a5, -8 /* save a2 to call[j+1]'s stack frame */ + s32e a3, a5, -4 /* save a3 to call[j+1]'s stack frame */ + rfwo /* rotates back to call[i] position */ + +/* +-------------------------------------------------------------------------------- +Window Underflow Exception for Call4 + +Invoked by RETW returning from call[i+1] to call[i] +where call[i]'s registers must be reloaded (not live in ARs); +where call[i] had done a call4 to call[i+1]. +On entry here: + window rotated to call[i] start point; + a0-a3 are undefined, must be reloaded with call[i].reg[0..3]; + a4-a15 must be preserved (they are call[i+1].reg[0..11]); + a5 is call[i+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x40 + .global _WindowUnderflow4 +_WindowUnderflow4: + + l32e a0, a5, -16 /* restore a0 from call[i+1]'s stack frame */ + l32e a1, a5, -12 /* restore a1 from call[i+1]'s stack frame */ + l32e a2, a5, -8 /* restore a2 from call[i+1]'s stack frame */ + l32e a3, a5, -4 /* restore a3 from call[i+1]'s stack frame */ + rfwu + +/* +-------------------------------------------------------------------------------- +Handle alloca exception generated by interruptee executing 'movsp'. +This uses space between the window vectors, so is essentially "free". +All interruptee's regs are intact except a0 which is saved in EXCSAVE_1, +and PS.EXCM has been set by the exception hardware (can't be interrupted). +The fact the alloca exception was taken means the registers associated with +the base-save area have been spilled and will be restored by the underflow +handler, so those 4 registers are available for scratch. +The code is optimized to avoid unaligned branches and minimize cache misses. +-------------------------------------------------------------------------------- +*/ + + .align 4 + .global _xt_alloca_exc +_xt_alloca_exc: + + rsr a0, WINDOWBASE /* grab WINDOWBASE before rotw changes it */ + rotw -1 /* WINDOWBASE goes to a4, new a0-a3 are scratch */ + rsr a2, PS + extui a3, a2, XCHAL_PS_OWB_SHIFT, XCHAL_PS_OWB_BITS + xor a3, a3, a4 /* bits changed from old to current windowbase */ + rsr a4, EXCSAVE_1 /* restore original a0 (now in a4) */ + slli a3, a3, XCHAL_PS_OWB_SHIFT + xor a2, a2, a3 /* flip changed bits in old window base */ + wsr a2, PS /* update PS.OWB to new window base */ + rsync + + _bbci.l a4, 31, _WindowUnderflow4 + rotw -1 /* original a0 goes to a8 */ + _bbci.l a8, 30, _WindowUnderflow8 + rotw -1 + j _WindowUnderflow12 + +/* +-------------------------------------------------------------------------------- +Window Overflow Exception for Call8 + +Invoked if a call[i] referenced a register (a4-a15) +that contains data from ancestor call[j]; +call[j] had done a call8 to call[j+1]. +On entry here: + window rotated to call[j] start point; + a0-a7 are registers to be saved; + a8-a15 must be preserved; + a9 is call[j+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x80 + .global _WindowOverflow8 +_WindowOverflow8: + + s32e a0, a9, -16 /* save a0 to call[j+1]'s stack frame */ + l32e a0, a1, -12 /* a0 <- call[j-1]'s sp + (used to find end of call[j]'s frame) */ + s32e a1, a9, -12 /* save a1 to call[j+1]'s stack frame */ + s32e a2, a9, -8 /* save a2 to call[j+1]'s stack frame */ + s32e a3, a9, -4 /* save a3 to call[j+1]'s stack frame */ + s32e a4, a0, -32 /* save a4 to call[j]'s stack frame */ + s32e a5, a0, -28 /* save a5 to call[j]'s stack frame */ + s32e a6, a0, -24 /* save a6 to call[j]'s stack frame */ + s32e a7, a0, -20 /* save a7 to call[j]'s stack frame */ + rfwo /* rotates back to call[i] position */ + +/* +-------------------------------------------------------------------------------- +Window Underflow Exception for Call8 + +Invoked by RETW returning from call[i+1] to call[i] +where call[i]'s registers must be reloaded (not live in ARs); +where call[i] had done a call8 to call[i+1]. +On entry here: + window rotated to call[i] start point; + a0-a7 are undefined, must be reloaded with call[i].reg[0..7]; + a8-a15 must be preserved (they are call[i+1].reg[0..7]); + a9 is call[i+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0xC0 + .global _WindowUnderflow8 +_WindowUnderflow8: + + l32e a0, a9, -16 /* restore a0 from call[i+1]'s stack frame */ + l32e a1, a9, -12 /* restore a1 from call[i+1]'s stack frame */ + l32e a2, a9, -8 /* restore a2 from call[i+1]'s stack frame */ + l32e a7, a1, -12 /* a7 <- call[i-1]'s sp + (used to find end of call[i]'s frame) */ + l32e a3, a9, -4 /* restore a3 from call[i+1]'s stack frame */ + l32e a4, a7, -32 /* restore a4 from call[i]'s stack frame */ + l32e a5, a7, -28 /* restore a5 from call[i]'s stack frame */ + l32e a6, a7, -24 /* restore a6 from call[i]'s stack frame */ + l32e a7, a7, -20 /* restore a7 from call[i]'s stack frame */ + rfwu + +/* +-------------------------------------------------------------------------------- +Window Overflow Exception for Call12 + +Invoked if a call[i] referenced a register (a4-a15) +that contains data from ancestor call[j]; +call[j] had done a call12 to call[j+1]. +On entry here: + window rotated to call[j] start point; + a0-a11 are registers to be saved; + a12-a15 must be preserved; + a13 is call[j+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x100 + .global _WindowOverflow12 +_WindowOverflow12: + + s32e a0, a13, -16 /* save a0 to call[j+1]'s stack frame */ + l32e a0, a1, -12 /* a0 <- call[j-1]'s sp + (used to find end of call[j]'s frame) */ + s32e a1, a13, -12 /* save a1 to call[j+1]'s stack frame */ + s32e a2, a13, -8 /* save a2 to call[j+1]'s stack frame */ + s32e a3, a13, -4 /* save a3 to call[j+1]'s stack frame */ + s32e a4, a0, -48 /* save a4 to end of call[j]'s stack frame */ + s32e a5, a0, -44 /* save a5 to end of call[j]'s stack frame */ + s32e a6, a0, -40 /* save a6 to end of call[j]'s stack frame */ + s32e a7, a0, -36 /* save a7 to end of call[j]'s stack frame */ + s32e a8, a0, -32 /* save a8 to end of call[j]'s stack frame */ + s32e a9, a0, -28 /* save a9 to end of call[j]'s stack frame */ + s32e a10, a0, -24 /* save a10 to end of call[j]'s stack frame */ + s32e a11, a0, -20 /* save a11 to end of call[j]'s stack frame */ + rfwo /* rotates back to call[i] position */ + +/* +-------------------------------------------------------------------------------- +Window Underflow Exception for Call12 + +Invoked by RETW returning from call[i+1] to call[i] +where call[i]'s registers must be reloaded (not live in ARs); +where call[i] had done a call12 to call[i+1]. +On entry here: + window rotated to call[i] start point; + a0-a11 are undefined, must be reloaded with call[i].reg[0..11]; + a12-a15 must be preserved (they are call[i+1].reg[0..3]); + a13 is call[i+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x140 + .global _WindowUnderflow12 +_WindowUnderflow12: + + l32e a0, a13, -16 /* restore a0 from call[i+1]'s stack frame */ + l32e a1, a13, -12 /* restore a1 from call[i+1]'s stack frame */ + l32e a2, a13, -8 /* restore a2 from call[i+1]'s stack frame */ + l32e a11, a1, -12 /* a11 <- call[i-1]'s sp + (used to find end of call[i]'s frame) */ + l32e a3, a13, -4 /* restore a3 from call[i+1]'s stack frame */ + l32e a4, a11, -48 /* restore a4 from end of call[i]'s stack frame */ + l32e a5, a11, -44 /* restore a5 from end of call[i]'s stack frame */ + l32e a6, a11, -40 /* restore a6 from end of call[i]'s stack frame */ + l32e a7, a11, -36 /* restore a7 from end of call[i]'s stack frame */ + l32e a8, a11, -32 /* restore a8 from end of call[i]'s stack frame */ + l32e a9, a11, -28 /* restore a9 from end of call[i]'s stack frame */ + l32e a10, a11, -24 /* restore a10 from end of call[i]'s stack frame */ + l32e a11, a11, -20 /* restore a11 from end of call[i]'s stack frame */ + rfwu + +#endif /* XCHAL_HAVE_WINDOWED */ + + .section .UserEnter.text, "ax" + .global call_user_start + .type call_user_start,@function + .align 4 + .literal_position diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/KnownIssues.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/KnownIssues.md new file mode 100644 index 0000000..593a411 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/KnownIssues.md @@ -0,0 +1,7 @@ +# Known Issues +This document lists the known issues in various FreeRTOS third +party ports. + +## ThirdParty/GCC/ARC_EM_HS +* [Memory Read Protection Violation from Secure MPU on exit from +interrupt](https://github.com/FreeRTOS/FreeRTOS-Kernel/issues/331) diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..5b627cf --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,4 @@ +## Code of Conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +opensource-codeofconduct@amazon.com with any additional questions or comments. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md new file mode 100644 index 0000000..f885cee --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md @@ -0,0 +1,70 @@ +# Contribution guidelines + +Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, code, or +documentation, we welcome our community to be involved in this project. + +Please read through this document before submitting any issues or pull requests to ensure we are able to help you and all members of the community as effectively as possible. + +## Code of conduct +This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). +For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact +opensource-codeofconduct@amazon.com with any additional questions or comments. + + +## Security issue notifications +If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. + + +## Submitting a bugs/feature request +Have a bug to report or feature to request? Follow these steps: +1. Search on the [FreeRTOS Community Support Forums](https://forums.freertos.org/) and [GitHub issue tracker](https://github.com/FreeRTOS/FreeRTOS/issues?utf8=%E2%9C%93&q=is%3Aissue) to be sure this hasn't been already reported or discussed. +2. If your search turns up empty, create a new topic in the [forums](https://forums.freertos.org/) and work with the community to help clarify issues or refine the idea. Include as many of the details listed below. +3. Once the community has had time to discuss and digest, we welcome you to create an [issue](https://github.com/FreeRTOS/FreeRTOS/issues) to report bugs or suggest features. + +When creating a new topic on the forums or filing an issue, please include as many relevant details as possible. Examples include: + +* A clear description of the situation — what you observe, what you expect, and your view on how the two differ. +* A reproducible test case or sequence of steps. +* The version of our code being used. +* Any modifications you've made relevant to the bug. +* Details of your environment or deployment. Highlight anything unusual. + + +## Contributing via pull request +Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: + +1. You are working against the latest source on the *master* branch. +2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. +3. You open an issue to discuss any significant work - we would hate for your time to be wasted. + +To send us a pull request, please: + +1. Fork the repository. +2. Modify the source; focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. +3. Follow the [coding style guide](https://www.freertos.org/FreeRTOS-Coding-Standard-and-Style-Guide.html). +4. Commit to your fork using clear commit messages. +5. Send us a pull request, answering any default questions in the pull request interface. + NOTE: Please make sure the default option (Allow edits from maintainers) is left checked. +6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. + +GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and +[creating a pull request](https://help.github.com/articles/creating-a-pull-request/). + +## Coding style +* Please ensure that your code complies to the [FreeRTOS coding style guidelines](https://www.freertos.org/FreeRTOS-Coding-Standard-and-Style-Guide.html). + + +## Getting your pull request merged +All pull requests must be approved by our review team before it can be merged in. We appreciate your patience while pull requests are reviewed. The time it takes to review will depend on complexity and consideration of wider implications. + + +## Finding contributions to work on +Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), tackling open 'help wanted' issues is a great place to start. + + +## Licensing +The FreeRTOS kernel is released under the MIT open source license, the text of which can be found [here](https://github.com/FreeRTOS/FreeRTOS/blob/master/FreeRTOS/License/license.txt) + +Additional license files can be found in the folders containing any supplementary libraries licensed by their respective copyright owners where applicable. + +We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md new file mode 100644 index 0000000..5fbf6fc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md @@ -0,0 +1,5 @@ +## Reporting a Vulnerability + +If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security +via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/) or directly via email to aws-security@amazon.com. +Please do **not** create a public github issue. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md new file mode 100644 index 0000000..c3c8607 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md @@ -0,0 +1,16 @@ + + +Description +----------- + + +Test Steps +----------- + + +Related Issue +----------- + + + +By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c new file mode 100644 index 0000000..fd3e293 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c @@ -0,0 +1,393 @@ +/* + * FreeRTOS Kernel + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + +#include +#include "porthardware.h" +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the AVR port. +*----------------------------------------------------------*/ + +/* Start tasks with interrupts enables. */ +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x80 ) + +/*-----------------------------------------------------------*/ + +/* We require the address of the pxCurrentTCB variable, but don't want to know + * any details of its type. */ +typedef void RTOS_TCB_t; +extern volatile RTOS_TCB_t * volatile pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * Perform hardware setup to enable ticks from timer. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + uint16_t usAddress; + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* Place a few bytes of known values on the bottom of the stack. + * This is just useful for debugging. Uncomment if needed. */ + /* *pxTopOfStack = 0x11; */ + /* pxTopOfStack--; */ + /* *pxTopOfStack = 0x22; */ + /* pxTopOfStack--; */ + /* *pxTopOfStack = 0x33; */ + /* pxTopOfStack--; */ + + /* The start of the task code will be popped off the stack last, so place + * it on first. */ + usAddress = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* Next simulate the stack as if after a call to portSAVE_CONTEXT(). + * portSAVE_CONTEXT places the flags on the stack immediately after r0 + * to ensure the interrupts get disabled as soon as possible, and so ensuring + * the stack use is minimal should a context switch interrupt occur. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; +#if defined(__AVR_HAVE_RAMPZ__) + *pxTopOfStack = (StackType_t)0x00; /* RAMPZ */ + pxTopOfStack--; +#endif + + /* Now the remaining registers. The compiler expects R1 to be 0. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R1 */ + + /* Leave R2 - R23 untouched */ + pxTopOfStack -= 23; + + /* Place the parameter on the stack in the expected location. */ + usAddress = ( uint16_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + + /* Leave register R26 - R31 untouched */ + pxTopOfStack -= 7; + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Simulate a function call end as generated by the compiler. We will now + * jump to the start of the task the context of which we have just restored. */ + asm volatile ( "ret" ); + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* vPortEndScheduler is not implemented in this port. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. The first thing we do is save the registers so we + * can use a naked attribute. + */ +void vPortYield( void ) __attribute__( ( naked ) ); +void vPortYield( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + asm volatile ( "ret" ); +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch callable from ISRs. The first thing + * we do is save the registers so we can use a naked attribute. + */ +void vPortYieldFromISR( void ) __attribute__( ( naked ) ); +void vPortYieldFromISR( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + asm volatile ( "reti" ); +} +/*-----------------------------------------------------------*/ + +/* + * Context switch function used by the tick. This must be identical to + * vPortYield() from the call to vTaskSwitchContext() onwards. The only + * difference from vPortYield() is the tick count is incremented as the + * call comes from the tick ISR. + */ +void vPortYieldFromTick( void ) __attribute__( ( naked ) ); +void vPortYieldFromTick( void ) +{ + portSAVE_CONTEXT(); + + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + portRESTORE_CONTEXT(); + + asm volatile ( "reti" ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup timer to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ + /* Configure low-power timer used in tickless mode */ +#if (configUSE_TICKLESS_IDLE == 1) + RTC_INIT(); +#endif + TICK_init(); +} +/*-----------------------------------------------------------*/ + +#if (configUSE_PREEMPTION == 1) + +/* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + ISR( TICK_INT_vect, ISR_NAKED ) + { + /* Clear tick interrupt flag. */ + CLR_INT( INT_FLAGS, INT_MASK ); + + vPortYieldFromTick(); + + asm volatile ( "reti" ); + } +#else /* if configUSE_PREEMPTION == 1 */ + +/* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + ISR( TICK_INT_vect ) + { + /* Clear tick interrupt flag. */ + INT_FLAGS = INT_MASK; + xTaskIncrementTick(); + } +#endif /* if configUSE_PREEMPTION == 1 */ + +#if (configUSE_TICKLESS_IDLE == 1) + +volatile uint32_t RTC_OVF_Count = 0; + +ISR(RTC_CNT_vect) +{ + if (RTC.INTFLAGS & RTC_OVF_bm ) + { + RTC_OVF_Count += 0x00010000; + RTC.INTFLAGS = (RTC_OVF_bm); + } + + if (RTC.INTFLAGS & RTC_CMP_bm ) + { + RTC.INTFLAGS = (RTC_CMP_bm); + //Disable compare interrupt + RTC.INTCTRL &= (0xFF ^ RTC_CMP_bm); + } + +} + +static uint32_t ulGetExternalTime(void) +{ + uint32_t time_rtc; + + while (RTC.STATUS & RTC_CNTBUSY_bm) + { + ; + } + time_rtc = RTC.CNT; + time_rtc += RTC_OVF_Count; + return time_rtc; +} + +static void vSetWakeTimeInterrupt(uint16_t xExpectedIdleTime) +{ + uint32_t rtc_cnt_time; + + /* compute the required */ + rtc_cnt_time = RTC_TICKS_TO_COUNTS(xExpectedIdleTime); + rtc_cnt_time += ulGetExternalTime(); + + while (RTC.STATUS & RTC_CMPBUSY_bm) + { + ; + } + RTC.CMP = (rtc_cnt_time & 0xFFFF); + + //Enable compare interrupt + RTC.INTCTRL |= RTC_CMP_bm; +} + +/* Define the function that is called by portSUPPRESS_TICKS_AND_SLEEP(). */ +__attribute__((weak)) void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime) +{ + eSleepModeStatus eSleepStatus; + uint32_t ulLowPowerTimeBeforeSleep, ulLowPowerTimeAfterSleep; + + /* Read the current time from a time source that will remain operational + while the microcontroller is in a low power state. */ + ulLowPowerTimeBeforeSleep = ulGetExternalTime(); + + /* Stop the timer that is generating the tick interrupt. */ + TICK_TMR_STOP(); + + /* Enter a critical section that will not effect interrupts bringing the MCU + out of sleep mode. */ + portDISABLE_INTERRUPTS(); + + /* Ensure it is still ok to enter the sleep mode. */ + eSleepStatus = eTaskConfirmSleepModeStatus(); + + if (eSleepStatus == eAbortSleep) + { + /* A task has been moved out of the Blocked state since this macro was + * executed, or a context switch is being held pending. Do not enter a + * sleep state. Restart the tick and exit the critical section. */ + TICK_TMR_START(); + portENABLE_INTERRUPTS(); + } + else + { + if (eSleepStatus == eNoTasksWaitingTimeout) + { + /* A user definable macro that allows application code to be inserted + * here. Such application code can be used to minimize power consumption + * further by turning off IO, peripheral clocks, the Flash, etc. */ + configPRE_PWR_DOWN_PROCESSING(); + + /* There are no running state tasks and no tasks that are blocked with a + * time out. Assuming the application does not care if the tick time slips + * with respect to calendar time then enter a deep sleep that can only be + * woken by (in this demo case) the user button being pushed on the + * Curiosity Nano board. If the application does require the tick time + * to keep better track of the calender time then the PIT peripheral can be + * used to make rough adjustments. */ + portSET_MODE_AND_SLEEP(SLEEP_MODE_PWR_DOWN); + + /* A user definable macro that allows application code to be inserted + * here. Such application code can be used to reverse any actions taken + * by the configPRE_STOP_PROCESSING() */ + configPOST_PWR_DOWN_PROCESSING(); + } + else + { + /* Configure an interrupt to bring the microcontroller out of its low + * power state at the time the kernel next needs to execute. The + * interrupt must be generated from a source that remains operational + * when the microcontroller is in a low power state. */ + vSetWakeTimeInterrupt(xExpectedIdleTime); + + /* Allow the application to define some pre-sleep processing. This is + * the standard configPRE_SLEEP_PROCESSING() macro as described on the + * FreeRTOS.org website. */ + configPRE_SLEEP_PROCESSING(xExpectedIdleTime); + + /* Enter the low power state. */ + portSET_MODE_AND_SLEEP(SLEEP_MODE_STANDBY); + + /* Determine how long the microcontroller was actually in a low power + * state for, which will be less than xExpectedIdleTime if the + * microcontroller was brought out of low power mode by an interrupt + * other than that configured by the vSetWakeTimeInterrupt() call. + * Note that the scheduler is suspended before + * portSUPPRESS_TICKS_AND_SLEEP() is called, and resumed when + * portSUPPRESS_TICKS_AND_SLEEP() returns. Therefore no other tasks will + * execute until this function completes. */ + ulLowPowerTimeAfterSleep = ulGetExternalTime(); + + /* Allow the application to define some post sleep processing. This is + * the standard configPOST_SLEEP_PROCESSING() macro, as described on the + * FreeRTOS.org website. + * It can be used to reverse the actions of configPRE_SLEEP_PROCESSING(), + * and in so doing, return the microcontroller back to its fully operational state */ + configPOST_SLEEP_PROCESSING(xExpectedIdleTime); + + /* Correct the kernels tick count to account for the time the + * microcontroller spent in its low power state. */ + vTaskStepTick(RTC_COUNTS_TO_TICKS(ulLowPowerTimeAfterSleep - ulLowPowerTimeBeforeSleep)); + // vTaskStepTick(xExpectedIdleTime); + + } + + /* Exit the critical section - it might be possible to do this immediately + * after the SET_MODE_AND_SLEEP calls. */ + portENABLE_INTERRUPTS(); + + /* Restart the timer that is generating the tick interrupt. */ + TICK_TMR_START(); + } +} + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h new file mode 100644 index 0000000..52e3f12 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h @@ -0,0 +1,221 @@ +/* + * FreeRTOS Kernel + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTHARDWARE_H +#define PORTHARDWARE_H + +#include "FreeRTOSConfig.h" + +/*-----------------------------------------------------------*/ + +#define CLR_INT( FLAG_REG, FLAG_MASK ) \ + asm volatile ( \ + "push r16\n\t" \ + "ldi r16, %1\n\t" \ + "sts %0, r16\n\t" \ + "pop r16\n\t" \ + : \ + : "i" ( _SFR_MEM_ADDR( FLAG_REG ) ), "i" ( ( uint8_t ) ( FLAG_MASK ) ) \ + ); + +#if ( configUSE_TIMER_INSTANCE == 0 ) + + #define TICK_INT_vect TCB0_INT_vect + #define INT_FLAGS TCB0_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB0.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB0.INTCTRL = TCB_CAPT_bm; \ + TCB0.CTRLA = TCB_ENABLE_bm; \ + } + + #define TICK_TMR_STOP() TCB0.CTRLA = 0x00; + #define TICK_TMR_START() \ + { \ + TCB0.INTFLAGS = TCB_CAPT_bm; \ + TCB0.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_READ() TCB0.CNT + #define TICK_INT_READY() (TCB0.INTCTRL & TCB_CAPT_bm) + +#elif ( configUSE_TIMER_INSTANCE == 1 ) + + #define TICK_INT_vect TCB1_INT_vect + #define INT_FLAGS TCB1_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB1.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB1.INTCTRL = TCB_CAPT_bm; \ + TCB1.CTRLA = TCB_ENABLE_bm; \ + } + + #define TICK_TMR_STOP() TCB1.CTRLA = 0x00; + #define TICK_TMR_START() \ + { \ + TCB1.INTFLAGS = TCB_CAPT_bm; \ + TCB1.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_READ() TCB1.CNT + #define TICK_INT_READY() (TCB1.INTCTRL & TCB_CAPT_bm) + +#elif ( configUSE_TIMER_INSTANCE == 2 ) + + #define TICK_INT_vect TCB2_INT_vect + #define INT_FLAGS TCB2_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB2.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB2.INTCTRL = TCB_CAPT_bm; \ + TCB2.CTRLA = TCB_ENABLE_bm; \ + } + + #define TICK_TMR_STOP() TCB2.CTRLA = 0x00; + #define TICK_TMR_START() \ + { \ + TCB2.INTFLAGS = TCB_CAPT_bm; \ + TCB2.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_READ() TCB2.CNT + #define TICK_INT_READY() (TCB2.INTCTRL & TCB_CAPT_bm) + +#elif ( configUSE_TIMER_INSTANCE == 3 ) + + #define TICK_INT_vect TCB3_INT_vect + #define INT_FLAGS TCB3_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB3.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB3.INTCTRL = TCB_CAPT_bm; \ + TCB3.CTRLA = TCB_ENABLE_bm; \ + } + + #define TICK_TMR_STOP() TCB3.CTRLA = 0x00; + #define TICK_TMR_START() \ + { \ + TCB3.INTFLAGS = TCB_CAPT_bm; \ + TCB3.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_READ() TCB3.CNT + #define TICK_INT_READY() (TCB3.INTCTRL & TCB_CAPT_bm) + +#elif ( configUSE_TIMER_INSTANCE == 4 ) + + #define TICK_INT_vect TCB4_INT_vect + #define INT_FLAGS TCB4_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB4.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB4.INTCTRL = TCB_CAPT_bm; \ + TCB4.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_STOP() TCB4.CTRLA = 0x00; + #define TICK_TMR_START() \ + { \ + TCB4.INTFLAGS = TCB_CAPT_bm; \ + TCB4.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_READ() TCB4.CNT + #define TICK_INT_READY() (TCB4.INTCTRL & TCB_CAPT_bm) + +#elif ( configUSE_TIMER_INSTANCE == 5 ) + + #if ( configUSE_TICKLESS_IDLE == 1 ) + + /* RTC is not supported as tick timer when tickless mode is used */ + #error Invalid timer setting. + + #else + + #define TICK_INT_vect RTC_CNT_vect + #define INT_FLAGS RTC_INTFLAGS + #define INT_MASK RTC_OVF_bm + + /* Hertz to period for RTC setup */ + #define RTC_PERIOD_HZ( x ) ( 32768 * ( ( 1.0 / x ) ) ) + #define TICK_init() \ + { \ + while( RTC.STATUS > 0 ) {; } \ + RTC.CTRLA = RTC_PRESCALER_DIV1_gc | 1 << RTC_RTCEN_bp; \ + RTC.PER = RTC_PERIOD_HZ( configTICK_RATE_HZ ); \ + RTC.INTCTRL |= 1 << RTC_OVF_bp; \ + } + #undef TICK_TMR_STOP() + #undef TICK_TMR_START() + #undef TICK_TMR_READ() + #undef TICK_INT_READY() + #endif + +#else /* if ( configUSE_TIMER_INSTANCE == 0 ) */ + #undef TICK_INT_vect + #undef INT_FLAGS + #undef INT_MASK + #undef TICK_init() + #undef TICK_TMR_STOP() + #undef TICK_TMR_START() + #undef TICK_TMR_READ() + #undef TICK_INT_READY() + #error Invalid timer setting. +#endif /* if ( configUSE_TIMER_INSTANCE == 0 ) */ + +/*-----------------------------------------------------------*/ + + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +#define LOW_POWER_CLOCK (32768UL) + +#define RTC_TICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define RTC_TICKS_TO_COUNTS(tick_cnt) (uint32_t)(((float)(tick_cnt * LOW_POWER_CLOCK)/configTICK_RATE_HZ) - 0.5) +#define RTC_COUNTS_TO_TICKS(counts) (uint32_t)((float)((counts * 1.0) * configTICK_RATE_HZ)/LOW_POWER_CLOCK ) + + +#define RTC_INIT() \ +{ \ + while( RTC.STATUS > 0 ) {; } \ + RTC.PER = 0xFFFF; \ + RTC.CMP = 0x3FFF; \ + RTC.CNT = 0; \ + RTC.INTFLAGS = RTC_OVF_bm | RTC_CMP_bm; \ + RTC.CTRLA = RTC_RUNSTDBY_bm | RTC_PRESCALER_DIV1_gc | RTC_RTCEN_bm ; \ + RTC.INTCTRL = RTC_OVF_bm | RTC_CMP_bm; \ +} + +#endif + + +#endif /* PORTHARDWARE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h new file mode 100644 index 0000000..7879b64 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h @@ -0,0 +1,267 @@ +/* + * FreeRTOS Kernel + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ + #ifdef __cplusplus + extern "C" { + #endif +/* *INDENT-ON* */ + +#include +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +#define portPOINTER_SIZE_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portENTER_CRITICAL() \ + asm volatile ( "in __tmp_reg__, __SREG__" ); \ + asm volatile ( "cli" ); \ + asm volatile ( "push __tmp_reg__" ) + +#define portEXIT_CRITICAL() \ + asm volatile ( "pop __tmp_reg__" ); \ + asm volatile ( "out __SREG__, __tmp_reg__" ) + +#define portDISABLE_INTERRUPTS() asm volatile ( "cli" ::); +#define portENABLE_INTERRUPTS() asm volatile ( "sei" ::); +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 1 +#define portNOP() asm volatile ( "nop" ); +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +extern void vPortYield( void ) __attribute__( ( naked ) ); +#define portYIELD() vPortYield() + +extern void vPortYieldFromISR( void ) __attribute__( ( naked ) ); +#define portYIELD_FROM_ISR() vPortYieldFromISR() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +/* Macros for tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + +extern void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime); +#define portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime) vPortSuppressTicksAndSleep(xExpectedIdleTime) +#endif + +#ifndef configPRE_PWR_DOWN_PROCESSING +#define configPRE_PWR_DOWN_PROCESSING() +#endif + +#ifndef configPOST_PWR_DOWN_PROCESSING +#define configPOST_PWR_DOWN_PROCESSING() +#endif + +/*-----------------------------------------------------------*/ + +/* Helper macros for portSAVE_CONTEXT/ portRESTORE_CONTEXT - common support for Mega-0 and AVR-Dx families */ + +#if defined(__AVR_HAVE_RAMPZ__) + +#define portSAVE_RAMPZ() \ + asm volatile("in r0, __RAMPZ__ \n\t" \ + "push r0 \n\t"); + +#define portRESTORE_RAMPZ() \ + asm volatile("pop r0 \n\t" \ + "out __RAMPZ__, r0 \n\t"); + +#else + +#define portSAVE_RAMPZ() +#define portRESTORE_RAMPZ() + +#endif + +/* Macro to save all the general purpose registers, the save the stack pointer + * into the TCB. + + * The first thing we do is save the flags then disable interrupts. This is to + * guard our stack against having a context switch interrupt after we have already + * pushed the registers onto the stack - causing the 32 registers to be on the + * stack twice. + + * r1 is set to zero as the compiler expects it to be thus, however some + * of the math routines make use of R1. + + * The interrupts will have been disabled during the call to portSAVE_CONTEXT() + * so we need not worry about reading/writing to the stack pointer. */ + +#define portSAVE_CONTEXT() \ + { \ + asm volatile("push r0 \n\t" \ + "in r0, __SREG__ \n\t" \ + "cli \n\t" \ + "push r0 \n\t"); \ + portSAVE_RAMPZ(); \ + asm volatile("push r1 \n\t" \ + "clr r1 \n\t" \ + "push r2 \n\t" \ + "push r3 \n\t" \ + "push r4 \n\t" \ + "push r5 \n\t" \ + "push r6 \n\t" \ + "push r7 \n\t" \ + "push r8 \n\t" \ + "push r9 \n\t" \ + "push r10 \n\t" \ + "push r11 \n\t" \ + "push r12 \n\t" \ + "push r13 \n\t" \ + "push r14 \n\t" \ + "push r15 \n\t" \ + "push r16 \n\t" \ + "push r17 \n\t" \ + "push r18 \n\t" \ + "push r19 \n\t" \ + "push r20 \n\t" \ + "push r21 \n\t" \ + "push r22 \n\t" \ + "push r23 \n\t" \ + "push r24 \n\t" \ + "push r25 \n\t" \ + "push r26 \n\t" \ + "push r27 \n\t" \ + "push r28 \n\t" \ + "push r29 \n\t" \ + "push r30 \n\t" \ + "push r31 \n\t" \ + "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "in r0, __SP_L__ \n\t" \ + "st x+, r0 \n\t" \ + "in r0, __SP_H__ \n\t" \ + "st x+, r0 \n\t"); \ + } + +/* Opposite to portSAVE_CONTEXT(). Interrupts will have been disabled during + * the context save so we can write to the stack pointer. */ +#define portRESTORE_CONTEXT() \ + { \ + asm volatile("lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "ld r28, x+ \n\t" \ + "out __SP_L__, r28 \n\t" \ + "ld r29, x+ \n\t" \ + "out __SP_H__, r29 \n\t" \ + "pop r31 \n\t" \ + "pop r30 \n\t" \ + "pop r29 \n\t" \ + "pop r28 \n\t" \ + "pop r27 \n\t" \ + "pop r26 \n\t" \ + "pop r25 \n\t" \ + "pop r24 \n\t" \ + "pop r23 \n\t" \ + "pop r22 \n\t" \ + "pop r21 \n\t" \ + "pop r20 \n\t" \ + "pop r19 \n\t" \ + "pop r18 \n\t" \ + "pop r17 \n\t" \ + "pop r16 \n\t" \ + "pop r15 \n\t" \ + "pop r14 \n\t" \ + "pop r13 \n\t" \ + "pop r12 \n\t" \ + "pop r11 \n\t" \ + "pop r10 \n\t" \ + "pop r9 \n\t" \ + "pop r8 \n\t" \ + "pop r7 \n\t" \ + "pop r6 \n\t" \ + "pop r5 \n\t" \ + "pop r4 \n\t" \ + "pop r3 \n\t" \ + "pop r2 \n\t" \ + "pop r1 \n\t"); \ + portRESTORE_RAMPZ(); \ + asm volatile("pop r0 \n\t" \ + "out __SREG__, r0 \n\t" \ + "pop r0 \n\t"); \ + } +/*-----------------------------------------------------------*/ + +#define portSET_MODE_AND_SLEEP(mode) \ + { \ + set_sleep_mode(mode); \ + sleep_enable(); \ + portENABLE_INTERRUPTS(); \ + sleep_cpu(); \ + portDISABLE_INTERRUPTS(); \ + sleep_disable(); \ + } + +/* *INDENT-OFF* */ + #ifdef __cplusplus + } + #endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c new file mode 100644 index 0000000..fd3e293 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c @@ -0,0 +1,393 @@ +/* + * FreeRTOS Kernel + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include + +#include +#include "porthardware.h" +#include "FreeRTOS.h" +#include "task.h" + +/*----------------------------------------------------------- +* Implementation of functions defined in portable.h for the AVR port. +*----------------------------------------------------------*/ + +/* Start tasks with interrupts enables. */ +#define portFLAGS_INT_ENABLED ( ( StackType_t ) 0x80 ) + +/*-----------------------------------------------------------*/ + +/* We require the address of the pxCurrentTCB variable, but don't want to know + * any details of its type. */ +typedef void RTOS_TCB_t; +extern volatile RTOS_TCB_t * volatile pxCurrentTCB; + +/*-----------------------------------------------------------*/ + +/* + * Perform hardware setup to enable ticks from timer. + */ +static void prvSetupTimerInterrupt( void ); +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, + TaskFunction_t pxCode, + void * pvParameters ) +{ + uint16_t usAddress; + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* Place a few bytes of known values on the bottom of the stack. + * This is just useful for debugging. Uncomment if needed. */ + /* *pxTopOfStack = 0x11; */ + /* pxTopOfStack--; */ + /* *pxTopOfStack = 0x22; */ + /* pxTopOfStack--; */ + /* *pxTopOfStack = 0x33; */ + /* pxTopOfStack--; */ + + /* The start of the task code will be popped off the stack last, so place + * it on first. */ + usAddress = ( uint16_t ) pxCode; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + /* Next simulate the stack as if after a call to portSAVE_CONTEXT(). + * portSAVE_CONTEXT places the flags on the stack immediately after r0 + * to ensure the interrupts get disabled as soon as possible, and so ensuring + * the stack use is minimal should a context switch interrupt occur. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R0 */ + pxTopOfStack--; + *pxTopOfStack = portFLAGS_INT_ENABLED; + pxTopOfStack--; +#if defined(__AVR_HAVE_RAMPZ__) + *pxTopOfStack = (StackType_t)0x00; /* RAMPZ */ + pxTopOfStack--; +#endif + + /* Now the remaining registers. The compiler expects R1 to be 0. */ + *pxTopOfStack = ( StackType_t ) 0x00; /* R1 */ + + /* Leave R2 - R23 untouched */ + pxTopOfStack -= 23; + + /* Place the parameter on the stack in the expected location. */ + usAddress = ( uint16_t ) pvParameters; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + pxTopOfStack--; + + usAddress >>= 8; + *pxTopOfStack = ( StackType_t ) ( usAddress & ( uint16_t ) 0x00ff ); + + /* Leave register R26 - R31 untouched */ + pxTopOfStack -= 7; + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + /* Setup the hardware to generate the tick. */ + prvSetupTimerInterrupt(); + + /* Restore the context of the first task that is going to run. */ + portRESTORE_CONTEXT(); + + /* Simulate a function call end as generated by the compiler. We will now + * jump to the start of the task the context of which we have just restored. */ + asm volatile ( "ret" ); + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* vPortEndScheduler is not implemented in this port. */ +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. The first thing we do is save the registers so we + * can use a naked attribute. + */ +void vPortYield( void ) __attribute__( ( naked ) ); +void vPortYield( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + asm volatile ( "ret" ); +} +/*-----------------------------------------------------------*/ + +/* + * Manual context switch callable from ISRs. The first thing + * we do is save the registers so we can use a naked attribute. + */ +void vPortYieldFromISR( void ) __attribute__( ( naked ) ); +void vPortYieldFromISR( void ) +{ + portSAVE_CONTEXT(); + vTaskSwitchContext(); + portRESTORE_CONTEXT(); + asm volatile ( "reti" ); +} +/*-----------------------------------------------------------*/ + +/* + * Context switch function used by the tick. This must be identical to + * vPortYield() from the call to vTaskSwitchContext() onwards. The only + * difference from vPortYield() is the tick count is incremented as the + * call comes from the tick ISR. + */ +void vPortYieldFromTick( void ) __attribute__( ( naked ) ); +void vPortYieldFromTick( void ) +{ + portSAVE_CONTEXT(); + + if( xTaskIncrementTick() != pdFALSE ) + { + vTaskSwitchContext(); + } + + portRESTORE_CONTEXT(); + + asm volatile ( "reti" ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup timer to generate a tick interrupt. + */ +static void prvSetupTimerInterrupt( void ) +{ + /* Configure low-power timer used in tickless mode */ +#if (configUSE_TICKLESS_IDLE == 1) + RTC_INIT(); +#endif + TICK_init(); +} +/*-----------------------------------------------------------*/ + +#if (configUSE_PREEMPTION == 1) + +/* + * Tick ISR for preemptive scheduler. We can use a naked attribute as + * the context is saved at the start of vPortYieldFromTick(). The tick + * count is incremented after the context is saved. + */ + ISR( TICK_INT_vect, ISR_NAKED ) + { + /* Clear tick interrupt flag. */ + CLR_INT( INT_FLAGS, INT_MASK ); + + vPortYieldFromTick(); + + asm volatile ( "reti" ); + } +#else /* if configUSE_PREEMPTION == 1 */ + +/* + * Tick ISR for the cooperative scheduler. All this does is increment the + * tick count. We don't need to switch context, this can only be done by + * manual calls to taskYIELD(); + */ + ISR( TICK_INT_vect ) + { + /* Clear tick interrupt flag. */ + INT_FLAGS = INT_MASK; + xTaskIncrementTick(); + } +#endif /* if configUSE_PREEMPTION == 1 */ + +#if (configUSE_TICKLESS_IDLE == 1) + +volatile uint32_t RTC_OVF_Count = 0; + +ISR(RTC_CNT_vect) +{ + if (RTC.INTFLAGS & RTC_OVF_bm ) + { + RTC_OVF_Count += 0x00010000; + RTC.INTFLAGS = (RTC_OVF_bm); + } + + if (RTC.INTFLAGS & RTC_CMP_bm ) + { + RTC.INTFLAGS = (RTC_CMP_bm); + //Disable compare interrupt + RTC.INTCTRL &= (0xFF ^ RTC_CMP_bm); + } + +} + +static uint32_t ulGetExternalTime(void) +{ + uint32_t time_rtc; + + while (RTC.STATUS & RTC_CNTBUSY_bm) + { + ; + } + time_rtc = RTC.CNT; + time_rtc += RTC_OVF_Count; + return time_rtc; +} + +static void vSetWakeTimeInterrupt(uint16_t xExpectedIdleTime) +{ + uint32_t rtc_cnt_time; + + /* compute the required */ + rtc_cnt_time = RTC_TICKS_TO_COUNTS(xExpectedIdleTime); + rtc_cnt_time += ulGetExternalTime(); + + while (RTC.STATUS & RTC_CMPBUSY_bm) + { + ; + } + RTC.CMP = (rtc_cnt_time & 0xFFFF); + + //Enable compare interrupt + RTC.INTCTRL |= RTC_CMP_bm; +} + +/* Define the function that is called by portSUPPRESS_TICKS_AND_SLEEP(). */ +__attribute__((weak)) void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime) +{ + eSleepModeStatus eSleepStatus; + uint32_t ulLowPowerTimeBeforeSleep, ulLowPowerTimeAfterSleep; + + /* Read the current time from a time source that will remain operational + while the microcontroller is in a low power state. */ + ulLowPowerTimeBeforeSleep = ulGetExternalTime(); + + /* Stop the timer that is generating the tick interrupt. */ + TICK_TMR_STOP(); + + /* Enter a critical section that will not effect interrupts bringing the MCU + out of sleep mode. */ + portDISABLE_INTERRUPTS(); + + /* Ensure it is still ok to enter the sleep mode. */ + eSleepStatus = eTaskConfirmSleepModeStatus(); + + if (eSleepStatus == eAbortSleep) + { + /* A task has been moved out of the Blocked state since this macro was + * executed, or a context switch is being held pending. Do not enter a + * sleep state. Restart the tick and exit the critical section. */ + TICK_TMR_START(); + portENABLE_INTERRUPTS(); + } + else + { + if (eSleepStatus == eNoTasksWaitingTimeout) + { + /* A user definable macro that allows application code to be inserted + * here. Such application code can be used to minimize power consumption + * further by turning off IO, peripheral clocks, the Flash, etc. */ + configPRE_PWR_DOWN_PROCESSING(); + + /* There are no running state tasks and no tasks that are blocked with a + * time out. Assuming the application does not care if the tick time slips + * with respect to calendar time then enter a deep sleep that can only be + * woken by (in this demo case) the user button being pushed on the + * Curiosity Nano board. If the application does require the tick time + * to keep better track of the calender time then the PIT peripheral can be + * used to make rough adjustments. */ + portSET_MODE_AND_SLEEP(SLEEP_MODE_PWR_DOWN); + + /* A user definable macro that allows application code to be inserted + * here. Such application code can be used to reverse any actions taken + * by the configPRE_STOP_PROCESSING() */ + configPOST_PWR_DOWN_PROCESSING(); + } + else + { + /* Configure an interrupt to bring the microcontroller out of its low + * power state at the time the kernel next needs to execute. The + * interrupt must be generated from a source that remains operational + * when the microcontroller is in a low power state. */ + vSetWakeTimeInterrupt(xExpectedIdleTime); + + /* Allow the application to define some pre-sleep processing. This is + * the standard configPRE_SLEEP_PROCESSING() macro as described on the + * FreeRTOS.org website. */ + configPRE_SLEEP_PROCESSING(xExpectedIdleTime); + + /* Enter the low power state. */ + portSET_MODE_AND_SLEEP(SLEEP_MODE_STANDBY); + + /* Determine how long the microcontroller was actually in a low power + * state for, which will be less than xExpectedIdleTime if the + * microcontroller was brought out of low power mode by an interrupt + * other than that configured by the vSetWakeTimeInterrupt() call. + * Note that the scheduler is suspended before + * portSUPPRESS_TICKS_AND_SLEEP() is called, and resumed when + * portSUPPRESS_TICKS_AND_SLEEP() returns. Therefore no other tasks will + * execute until this function completes. */ + ulLowPowerTimeAfterSleep = ulGetExternalTime(); + + /* Allow the application to define some post sleep processing. This is + * the standard configPOST_SLEEP_PROCESSING() macro, as described on the + * FreeRTOS.org website. + * It can be used to reverse the actions of configPRE_SLEEP_PROCESSING(), + * and in so doing, return the microcontroller back to its fully operational state */ + configPOST_SLEEP_PROCESSING(xExpectedIdleTime); + + /* Correct the kernels tick count to account for the time the + * microcontroller spent in its low power state. */ + vTaskStepTick(RTC_COUNTS_TO_TICKS(ulLowPowerTimeAfterSleep - ulLowPowerTimeBeforeSleep)); + // vTaskStepTick(xExpectedIdleTime); + + } + + /* Exit the critical section - it might be possible to do this immediately + * after the SET_MODE_AND_SLEEP calls. */ + portENABLE_INTERRUPTS(); + + /* Restart the timer that is generating the tick interrupt. */ + TICK_TMR_START(); + } +} + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h new file mode 100644 index 0000000..05a04ae --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h @@ -0,0 +1,183 @@ +/* + * FreeRTOS Kernel + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTHARDWARE_H +#define PORTHARDWARE_H + +#include "FreeRTOSConfig.h" + +/*-----------------------------------------------------------*/ + +#define CLR_INT( FLAG_REG, FLAG_MASK ) \ + asm volatile ( \ + "push r16\n\t" \ + "ldi r16, %1\n\t" \ + "sts %0, r16\n\t" \ + "pop r16\n\t" \ + : \ + : "i" ( _SFR_MEM_ADDR( FLAG_REG ) ), "i" ( ( uint8_t ) ( FLAG_MASK ) ) \ + ); + +#if ( configUSE_TIMER_INSTANCE == 0 ) + + #define TICK_INT_vect TCB0_INT_vect + #define INT_FLAGS TCB0_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB0.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB0.INTCTRL = TCB_CAPT_bm; \ + TCB0.CTRLA = TCB_ENABLE_bm; \ + } + + #define TICK_TMR_STOP() TCB0.CTRLA = 0x00; + #define TICK_TMR_START() \ + { \ + TCB0.INTFLAGS = TCB_CAPT_bm; \ + TCB0.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_READ() TCB0.CNT + #define TICK_INT_READY() (TCB0.INTCTRL & TCB_CAPT_bm) + +#elif ( configUSE_TIMER_INSTANCE == 1 ) + + #define TICK_INT_vect TCB1_INT_vect + #define INT_FLAGS TCB1_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB1.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB1.INTCTRL = TCB_CAPT_bm; \ + TCB1.CTRLA = TCB_ENABLE_bm; \ + } + + #define TICK_TMR_STOP() TCB1.CTRLA = 0x00; + #define TICK_TMR_START() \ + { \ + TCB1.INTFLAGS = TCB_CAPT_bm; \ + TCB1.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_READ() TCB1.CNT + #define TICK_INT_READY() (TCB1.INTCTRL & TCB_CAPT_bm) + +#elif ( configUSE_TIMER_INSTANCE == 2 ) + + #define TICK_INT_vect TCB2_INT_vect + #define INT_FLAGS TCB2_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB2.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB2.INTCTRL = TCB_CAPT_bm; \ + TCB2.CTRLA = TCB_ENABLE_bm; \ + } + + #define TICK_TMR_STOP() TCB2.CTRLA = 0x00; + #define TICK_TMR_START() \ + { \ + TCB2.INTFLAGS = TCB_CAPT_bm; \ + TCB2.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_READ() TCB2.CNT + #define TICK_INT_READY() (TCB2.INTCTRL & TCB_CAPT_bm) + +#elif ( configUSE_TIMER_INSTANCE == 3 ) + + #define TICK_INT_vect TCB3_INT_vect + #define INT_FLAGS TCB3_INTFLAGS + #define INT_MASK TCB_CAPT_bm + + #define TICK_init() \ + { \ + TCB3.CCMP = configCPU_CLOCK_HZ / configTICK_RATE_HZ; \ + TCB3.INTCTRL = TCB_CAPT_bm; \ + TCB3.CTRLA = TCB_ENABLE_bm; \ + } + + #define TICK_TMR_STOP() TCB3.CTRLA = 0x00; + #define TICK_TMR_START() \ + { \ + TCB3.INTFLAGS = TCB_CAPT_bm; \ + TCB3.CTRLA = TCB_ENABLE_bm; \ + } + #define TICK_TMR_READ() TCB3.CNT + #define TICK_INT_READY() (TCB3.INTCTRL & TCB_CAPT_bm) + +#elif ( configUSE_TIMER_INSTANCE == 4 ) + + #define TICK_INT_vect RTC_CNT_vect + #define INT_FLAGS RTC_INTFLAGS + #define INT_MASK RTC_OVF_bm + +/* Hertz to period for RTC setup */ + #define RTC_PERIOD_HZ( x ) ( 32768 * ( ( 1.0 / x ) ) ) + #define TICK_init() \ + { \ + while( RTC.STATUS > 0 ) {; } \ + RTC.CTRLA = RTC_PRESCALER_DIV1_gc | 1 << RTC_RTCEN_bp; \ + RTC.PER = RTC_PERIOD_HZ( configTICK_RATE_HZ ); \ + RTC.INTCTRL |= 1 << RTC_OVF_bp; \ + } + +#else /* if ( configUSE_TIMER_INSTANCE == 0 ) */ + #undef TICK_INT_vect + #undef INT_FLAGS + #undef INT_MASK + #undef TICK_init() + #error Invalid timer setting. +#endif /* if ( configUSE_TIMER_INSTANCE == 0 ) */ + + +#if ( configUSE_TICKLESS_IDLE == 1 ) + +#define LOW_POWER_CLOCK (32768UL) + +#define RTC_TICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define RTC_TICKS_TO_COUNTS(tick_cnt) (uint32_t)(((float)(tick_cnt * LOW_POWER_CLOCK)/configTICK_RATE_HZ) - 0.5) +#define RTC_COUNTS_TO_TICKS(counts) (uint32_t)((float)((counts * 1.0) * configTICK_RATE_HZ)/LOW_POWER_CLOCK ) + + +#define RTC_INIT() \ +{ \ + while( RTC.STATUS > 0 ) {; } \ + RTC.PER = 0xFFFF; \ + RTC.CMP = 0x3FFF; \ + RTC.CNT = 0; \ + RTC.INTFLAGS = RTC_OVF_bm | RTC_CMP_bm; \ + RTC.CTRLA = RTC_RUNSTDBY_bm | RTC_PRESCALER_DIV1_gc | RTC_RTCEN_bm ; \ + RTC.INTCTRL = RTC_OVF_bm | RTC_CMP_bm; \ +} + +#endif + +/*-----------------------------------------------------------*/ + +#endif /* PORTHARDWARE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h new file mode 100644 index 0000000..7879b64 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h @@ -0,0 +1,267 @@ +/* + * FreeRTOS Kernel + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +/* *INDENT-OFF* */ + #ifdef __cplusplus + extern "C" { + #endif +/* *INDENT-ON* */ + +#include +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +#define portPOINTER_SIZE_TYPE uint16_t + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +#define portENTER_CRITICAL() \ + asm volatile ( "in __tmp_reg__, __SREG__" ); \ + asm volatile ( "cli" ); \ + asm volatile ( "push __tmp_reg__" ) + +#define portEXIT_CRITICAL() \ + asm volatile ( "pop __tmp_reg__" ); \ + asm volatile ( "out __SREG__, __tmp_reg__" ) + +#define portDISABLE_INTERRUPTS() asm volatile ( "cli" ::); +#define portENABLE_INTERRUPTS() asm volatile ( "sei" ::); +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 1 +#define portNOP() asm volatile ( "nop" ); +/*-----------------------------------------------------------*/ + +/* Kernel utilities. */ +extern void vPortYield( void ) __attribute__( ( naked ) ); +#define portYIELD() vPortYield() + +extern void vPortYieldFromISR( void ) __attribute__( ( naked ) ); +#define portYIELD_FROM_ISR() vPortYieldFromISR() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters ) + +/* Macros for tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + +extern void vPortSuppressTicksAndSleep(TickType_t xExpectedIdleTime); +#define portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime) vPortSuppressTicksAndSleep(xExpectedIdleTime) +#endif + +#ifndef configPRE_PWR_DOWN_PROCESSING +#define configPRE_PWR_DOWN_PROCESSING() +#endif + +#ifndef configPOST_PWR_DOWN_PROCESSING +#define configPOST_PWR_DOWN_PROCESSING() +#endif + +/*-----------------------------------------------------------*/ + +/* Helper macros for portSAVE_CONTEXT/ portRESTORE_CONTEXT - common support for Mega-0 and AVR-Dx families */ + +#if defined(__AVR_HAVE_RAMPZ__) + +#define portSAVE_RAMPZ() \ + asm volatile("in r0, __RAMPZ__ \n\t" \ + "push r0 \n\t"); + +#define portRESTORE_RAMPZ() \ + asm volatile("pop r0 \n\t" \ + "out __RAMPZ__, r0 \n\t"); + +#else + +#define portSAVE_RAMPZ() +#define portRESTORE_RAMPZ() + +#endif + +/* Macro to save all the general purpose registers, the save the stack pointer + * into the TCB. + + * The first thing we do is save the flags then disable interrupts. This is to + * guard our stack against having a context switch interrupt after we have already + * pushed the registers onto the stack - causing the 32 registers to be on the + * stack twice. + + * r1 is set to zero as the compiler expects it to be thus, however some + * of the math routines make use of R1. + + * The interrupts will have been disabled during the call to portSAVE_CONTEXT() + * so we need not worry about reading/writing to the stack pointer. */ + +#define portSAVE_CONTEXT() \ + { \ + asm volatile("push r0 \n\t" \ + "in r0, __SREG__ \n\t" \ + "cli \n\t" \ + "push r0 \n\t"); \ + portSAVE_RAMPZ(); \ + asm volatile("push r1 \n\t" \ + "clr r1 \n\t" \ + "push r2 \n\t" \ + "push r3 \n\t" \ + "push r4 \n\t" \ + "push r5 \n\t" \ + "push r6 \n\t" \ + "push r7 \n\t" \ + "push r8 \n\t" \ + "push r9 \n\t" \ + "push r10 \n\t" \ + "push r11 \n\t" \ + "push r12 \n\t" \ + "push r13 \n\t" \ + "push r14 \n\t" \ + "push r15 \n\t" \ + "push r16 \n\t" \ + "push r17 \n\t" \ + "push r18 \n\t" \ + "push r19 \n\t" \ + "push r20 \n\t" \ + "push r21 \n\t" \ + "push r22 \n\t" \ + "push r23 \n\t" \ + "push r24 \n\t" \ + "push r25 \n\t" \ + "push r26 \n\t" \ + "push r27 \n\t" \ + "push r28 \n\t" \ + "push r29 \n\t" \ + "push r30 \n\t" \ + "push r31 \n\t" \ + "lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "in r0, __SP_L__ \n\t" \ + "st x+, r0 \n\t" \ + "in r0, __SP_H__ \n\t" \ + "st x+, r0 \n\t"); \ + } + +/* Opposite to portSAVE_CONTEXT(). Interrupts will have been disabled during + * the context save so we can write to the stack pointer. */ +#define portRESTORE_CONTEXT() \ + { \ + asm volatile("lds r26, pxCurrentTCB \n\t" \ + "lds r27, pxCurrentTCB + 1 \n\t" \ + "ld r28, x+ \n\t" \ + "out __SP_L__, r28 \n\t" \ + "ld r29, x+ \n\t" \ + "out __SP_H__, r29 \n\t" \ + "pop r31 \n\t" \ + "pop r30 \n\t" \ + "pop r29 \n\t" \ + "pop r28 \n\t" \ + "pop r27 \n\t" \ + "pop r26 \n\t" \ + "pop r25 \n\t" \ + "pop r24 \n\t" \ + "pop r23 \n\t" \ + "pop r22 \n\t" \ + "pop r21 \n\t" \ + "pop r20 \n\t" \ + "pop r19 \n\t" \ + "pop r18 \n\t" \ + "pop r17 \n\t" \ + "pop r16 \n\t" \ + "pop r15 \n\t" \ + "pop r14 \n\t" \ + "pop r13 \n\t" \ + "pop r12 \n\t" \ + "pop r11 \n\t" \ + "pop r10 \n\t" \ + "pop r9 \n\t" \ + "pop r8 \n\t" \ + "pop r7 \n\t" \ + "pop r6 \n\t" \ + "pop r5 \n\t" \ + "pop r4 \n\t" \ + "pop r3 \n\t" \ + "pop r2 \n\t" \ + "pop r1 \n\t"); \ + portRESTORE_RAMPZ(); \ + asm volatile("pop r0 \n\t" \ + "out __SREG__, r0 \n\t" \ + "pop r0 \n\t"); \ + } +/*-----------------------------------------------------------*/ + +#define portSET_MODE_AND_SLEEP(mode) \ + { \ + set_sleep_mode(mode); \ + sleep_enable(); \ + portENABLE_INTERRUPTS(); \ + sleep_cpu(); \ + portDISABLE_INTERRUPTS(); \ + sleep_disable(); \ + } + +/* *INDENT-OFF* */ + #ifdef __cplusplus + } + #endif +/* *INDENT-ON* */ + +#endif /* PORTMACRO_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/LICENSE b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/LICENSE new file mode 100644 index 0000000..2724b4f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/LICENSE @@ -0,0 +1 @@ +This repository contains multiple directories, each individually licensed. Please see the LICENSE file in each directory. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/README.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/README.md new file mode 100644 index 0000000..b614914 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/README.md @@ -0,0 +1,20 @@ +## FreeRTOS Partner Supported Ports + +This repository contains FreeRTOS ports supported by FreeRTOS partners. Follow +the steps below to contribute a FreeRTOS port to this repository: + +1. Write the FreeRTOS port for your Compiler and Architecture. +2. Create a project in the [FreeRTOS Partner Supported Demos Repository](https://github.com/FreeRTOS/FreeRTOS-Partner-Supported-Demos/tree/main) + for your hardware for running tests as mentioned [here](https://github.com/FreeRTOS/FreeRTOS/blob/main/FreeRTOS/Demo/ThirdParty/Template/README.md). +3. Make sure all the tests pass. Add the test results in the Pull Request description. +4. Add a README file with the following information: + 1. How to use this port? + 2. Link to the test project created in Step 2. + 3. Any other relevant information. +5. Raise a PR to merge the FreeRTOS port. +6. Raise another PR to merge the test project in the [FreeRTOS-Partner-Supported-Demos Repository](https://github.com/FreeRTOS/FreeRTOS/tree/main/FreeRTOS/Demo/ThirdParty/Community-Supported). + + +## License + +This repository contains multiple directories, each individually licensed. Please see the LICENSE file in each directory. diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/README.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/README.md new file mode 100644 index 0000000..93a4398 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/README.md @@ -0,0 +1,51 @@ +# FreeRTOS Third Party Ports + +FreeRTOS third party ports can be supported by the FreeRTOS team, a FreeRTOS +partner or FreeRTOS community members. Depending on who supports it, the support +provided will differ as follows: + +## FreeRTOS Team Supported Third Party FreeRTOS Ports + +Location: https://github.com/FreeRTOS/FreeRTOS-Kernel/tree/main/portable/ThirdParty + +These third party FreeRTOS ports are supported by the FreeRTOS team. For a +FreeRTOS team supported third party FreeRTOS port: + +* The code has been reviewed by the FreeRTOS team. +* FreeRTOS team has access to the hardware and the test results have been + verified by the FreeRTOS team. +* Customer queries as well as bugs are addressed by the FreeRTOS team. +* The code can be included in Long Term Support (LTS) releases. + +A new FreeRTOS port cannot be directly contributed to this location. Instead, +the FreeRTOS team will decide to take ownership of a partner supported or a +community supported FreeRTOS port based on the community interest. + +## Partner Supported FreeRTOS Ports + +Location: https://github.com/FreeRTOS/FreeRTOS-Kernel-Partner-Supported-Ports/tree/main + +These FreeRTOS ports are supported by a FreeRTOS partner. For a partner +supported FreeRTOS port: + +* The code has not been reviewed by the FreeRTOS team. +* FreeRTOS team has not verified the tests results but tests exist and are + reported to be successful by the partner. +* Customer queries as well as bugs are addressed by the partner. + +A new FreeRTOS port can be directly contributed by a partner. The process to +contribute a FreeRTOS port is documented [here](https://github.com/FreeRTOS/FreeRTOS-Kernel-Partner-Supported-Ports/blob/main/README.md). + +## Community Supported FreeRTOS Ports + +Location: https://github.com/FreeRTOS/FreeRTOS-Kernel-Community-Supported-Ports/tree/main + +These FreeRTOS ports are supported by the FreeRTOS community members. For a +community supported FreeRTOS port: + +* The code has not been reviewed by the FreeRTOS team. +* Tests may or may not exist for the FreeRTOS port. +* Customer queries as well as bugs are addressed by the community. + +A new FreeRTOS port can be directly contributed by anyone. The process to +contribute a FreeRTOS port is documented [here](https://github.com/FreeRTOS/FreeRTOS-Kernel-Community-Supported-Ports/blob/main/README.md). diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/Makefile b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/Makefile new file mode 100644 index 0000000..2b295e0 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/Makefile @@ -0,0 +1,98 @@ +### Makefile to build the FreeRTOS library ### + +# Build target (options: sim, board) + +TARGET = sim +SMALL = + +# Tools + +CC = xt-xcc +AS = xt-xcc +AR = xt-ar +XT_CORE = $(patsubst %-params,%,$(notdir $(shell xt-xcc --show-config=core))) +CONFIGDIR = $(shell xt-xcc --show-config=config) + +# For platform-specific commands + +include $(CONFIGDIR)/misc/hostenv.mk + +# Source code and build locations + +SRCROOT = $(subst /,$(S),$(CURDIR)) +TSTROOT = $(abspath $(SRCROOT)$(S)..$(S)..$(S)..$(S)..$(S)..$(S)demos$(S)cadence$(S)sim$(SMALL)) +BLDROOT = $(TSTROOT)$(S)build +BLDDIR = $(BLDROOT)$(S)$(XT_CORE) + +FR_SRCDIR = $(abspath $(SRCROOT)$(S)..$(S)..$(S)..) +FR_SRCDIR2 = $(FR_SRCDIR)$(S)portable$(S)MemMang +XT_SRCDIR = $(SRCROOT) + +vpath %.c $(FR_SRCDIR) $(FR_SRCDIR2) $(XT_SRCDIR) +vpath %.S $(XT_SRCDIR) + +# File lists + +FR_C_FILES = $(notdir $(wildcard $(FR_SRCDIR)/*.c)) $(notdir $(wildcard $(FR_SRCDIR2)/*.c)) +XT_C_FILES = $(notdir $(wildcard $(XT_SRCDIR)/*.c)) +XT_S_FILES = $(notdir $(wildcard $(XT_SRCDIR)/*.S)) + +# List of all .o files that will go into the library + +LIB_C_O = $(patsubst %.c,%.o,$(XT_C_FILES) $(FR_C_FILES)) +LIB_S_O = $(patsubst %.S,%.o,$(XT_S_FILES)) +LIB_O_LIST = $(addprefix $(BLDDIR)/,$(LIB_C_O) $(LIB_S_O)) + +# Output files + +OSLIB = $(BLDDIR)$(S)libfreertos.a + +# Build options + +ifeq ($(TARGET),sim) +DFLAGS = -DXT_SIMULATOR +endif +ifeq ($(TARGET),board) +DFLAGS = -DXT_BOARD +endif + +IFLAGS = \ + -I$(FR_SRCDIR)$(S)..$(S)include -I$(FR_SRCDIR)$(S)..$(S)include$(S)private \ + -I$(XT_SRCDIR) -I$(TSTROOT)$(S)common$(S)config_files -I$(BLDDIR) + +CFLAGS = -O2 -g +CCFLAGS = $(CFLAGS) -Wall -mno-coproc -mlongcalls -ffunction-sections -mno-l32r-flix $(DFLAGS) +ASFLAGS = $(CCFLAGS) + +# Include dependency rules (generated using -MD) + +-include $(wildcard $(BLDDIR)/*.d) + +# Targets + +all : mkdir $(OSLIB) + +mkdir : $(BLDDIR)/.mkdir + +$(BLDDIR)/.mkdir : + @$(MKPATH) $(BLDDIR) + @echo "" > $@ + -$(CP) $(CONFIGDIR)/xtensa-elf/include/sys/reent.h $(BLDDIR)/reent.h + +$(OSLIB) : $(LIB_O_LIST) + $(AR) -rs $@ $^ + +$(BLDDIR)/%.o : %.c + $(CC) $(CCFLAGS) $(IFLAGS) -MD -MF $(subst .o,.d,$@) -c -o $@ $< + +$(BLDDIR)/%.o : %.S + $(CC) $(ASFLAGS) $(IFLAGS) -MD -MF $(subst .o,.d,$@) -c -o $@ $< + +clean : + $(RM_R) $(BLDDIR) + +clean_all : + $(RM_R) $(BLDROOT) + +.PHONY : all mkdir clean clean_all + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/port.c new file mode 100644 index 0000000..0784862 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/port.c @@ -0,0 +1,208 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include +#include + +#include "xtensa_rtos.h" + +#include "FreeRTOS.h" +#include "task.h" + + +/* Defined in portasm.h */ +extern void _frxt_tick_timer_init(void); + +/* Defined in xtensa_context.S */ +extern void _xt_coproc_init(void); + + +/*-----------------------------------------------------------*/ + +/* We require the address of the pxCurrentTCB variable, but don't want to know +any details of its type. */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +unsigned port_xSchedulerRunning = 0; // Duplicate of inaccessible xSchedulerRunning; needed at startup to avoid counting nesting +unsigned port_interruptNesting = 0; // Interrupt nesting level + +/*-----------------------------------------------------------*/ + +// User exception dispatcher when exiting +void _xt_user_exit(void); + +/* + * Stack initialization + */ +#if portUSING_MPU_WRAPPERS +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters, BaseType_t xRunPrivileged ) +#else +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +#endif +{ + StackType_t * sp; + StackType_t * tp; + XtExcFrame * frame; + + #if XCHAL_CP_NUM > 0 + uint32_t * p; + #endif + + /* Create interrupt stack frame aligned to 16 byte boundary */ + sp = ( StackType_t * ) ( ( ( UBaseType_t ) pxTopOfStack - XT_CP_SIZE - XT_STK_FRMSZ ) & ~0xf ); + + /* Clear the entire frame (do not use memset() because we don't depend on C library) */ + for( tp = sp; tp <= pxTopOfStack; ++tp ) + { + *tp = 0; + } + + frame = ( XtExcFrame * ) sp; + + /* Explicitly initialize certain saved registers */ + frame->pc = ( UBaseType_t ) pxCode; /* task entrypoint */ + frame->a0 = 0; /* to terminate GDB backtrace */ + frame->a1 = ( UBaseType_t ) sp + XT_STK_FRMSZ; /* physical top of stack frame */ + frame->exit = ( UBaseType_t ) _xt_user_exit; /* user exception exit dispatcher */ + + /* Set initial PS to int level 0, EXCM disabled ('rfe' will enable), user mode. */ + /* Also set entry point argument parameter. */ + #ifdef __XTENSA_CALL0_ABI__ + frame->a2 = ( UBaseType_t ) pvParameters; + frame->ps = PS_UM | PS_EXCM; + #else + /* + for windowed ABI also set WOE and CALLINC (pretend task was 'call4'd). */ + frame->a6 = ( UBaseType_t ) pvParameters; + frame->ps = PS_UM | PS_EXCM | PS_WOE | PS_CALLINC( 1 ); + #endif + + #ifdef XT_USE_SWPRI + /* Set the initial virtual priority mask value to all 1's. */ + frame->vpri = 0xFFFFFFFF; + #endif + + #if XCHAL_CP_NUM > 0 + /* Init the coprocessor save area (see xtensa_context.h) */ + + /* No access to TCB here, so derive indirectly. Stack growth is top to bottom. + * //p = (uint32_t *) xMPUSettings->coproc_area; + */ + p = ( uint32_t * ) ( ( ( uint32_t ) pxTopOfStack - XT_CP_SIZE ) & ~0xf ); + configASSERT( ( uint32_t ) p >= frame->a1 ); + p[ 0 ] = 0; + p[ 1 ] = 0; + p[ 2 ] = ( ( ( uint32_t ) p ) + 12 + XCHAL_TOTAL_SA_ALIGN - 1 ) & -XCHAL_TOTAL_SA_ALIGN; + #endif + + return sp; +} + +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the Xtensa port will get stopped. If required simply + disable the tick interrupt here. */ +} + +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + // Interrupts are disabled at this point and stack contains PS with enabled interrupts when task context is restored + + #if XCHAL_CP_NUM > 0 + /* Initialize co-processor management for tasks. Leave CPENABLE alone. */ + _xt_coproc_init(); + #endif + + /* Init the tick divisor value */ + _xt_tick_divisor_init(); + + /* Setup the hardware to generate the tick. */ + _frxt_tick_timer_init(); + + #if XT_USE_THREAD_SAFE_CLIB + // Init C library + vPortClibInit(); + #endif + + port_xSchedulerRunning = 1; + + // Cannot be directly called from C; never returns + __asm__ volatile ("call0 _frxt_dispatch\n"); + + /* Should not get here. */ + return pdTRUE; +} +/*-----------------------------------------------------------*/ + +BaseType_t xPortSysTickHandler( void ) +{ + BaseType_t ret; + uint32_t interruptMask; + + portbenchmarkIntLatency(); + + /* Interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY must be + * disabled before calling xTaskIncrementTick as it access the + * kernel lists. */ + interruptMask = portSET_INTERRUPT_MASK_FROM_ISR(); + { + ret = xTaskIncrementTick(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( interruptMask ); + + portYIELD_FROM_ISR( ret ); + + return ret; +} +/*-----------------------------------------------------------*/ + +/* + * Used to set coprocessor area in stack. Current hack is to reuse MPU pointer for coprocessor area. + */ +#if portUSING_MPU_WRAPPERS +void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings, + const struct xMEMORY_REGION * const xRegions, + StackType_t * pxBottomOfStack, + uint32_t ulStackDepth ) +{ + #if XCHAL_CP_NUM > 0 + xMPUSettings->coproc_area = ( StackType_t * ) ( ( uint32_t ) ( pxBottomOfStack + ulStackDepth - 1 )); + xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) xMPUSettings->coproc_area ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); + xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( uint32_t ) xMPUSettings->coproc_area - XT_CP_SIZE ) & ~0xf ); + + /* NOTE: we cannot initialize the coprocessor save area here because FreeRTOS is going to + * clear the stack area after we return. This is done in pxPortInitialiseStack(). + */ + #endif +} +#endif /* if portUSING_MPU_WRAPPERS */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portasm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portasm.S new file mode 100644 index 0000000..bd009b1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portasm.S @@ -0,0 +1,601 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "xtensa_rtos.h" + +#define TOPOFSTACK_OFFS 0x00 /* StackType_t *pxTopOfStack */ +#define CP_TOPOFSTACK_OFFS 0x04 /* xMPU_SETTINGS.coproc_area */ + +.extern pxCurrentTCB + + +/* +******************************************************************************* +* Interrupt stack. The size of the interrupt stack is determined by the config +* parameter "configISR_STACK_SIZE" in FreeRTOSConfig.h +******************************************************************************* +*/ + .data + .align 16 + .global port_IntStack +port_IntStack: + .space configISR_STACK_SIZE +port_IntStackTop: + .word 0 +port_switch_flag: + .word 0 + + .text +/* +******************************************************************************* +* _frxt_setup_switch +* void _frxt_setup_switch(void); +* +* Sets an internal flag indicating that a task switch is required on return +* from interrupt handling. +* +******************************************************************************* +*/ + .global _frxt_setup_switch + .type _frxt_setup_switch,@function + .align 4 +_frxt_setup_switch: + + ENTRY(16) + + movi a2, port_switch_flag + movi a3, 1 + s32i a3, a2, 0 + + RET(16) + +/* +******************************************************************************* +* _frxt_int_enter +* void _frxt_int_enter(void) +* +* Implements the Xtensa RTOS porting layer's XT_RTOS_INT_ENTER function for +* freeRTOS. Saves the rest of the interrupt context (not already saved). +* May only be called from assembly code by the 'call0' instruction, with +* interrupts disabled. +* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h. +* +******************************************************************************* +*/ + .globl _frxt_int_enter + .type _frxt_int_enter,@function + .align 4 +_frxt_int_enter: + + /* Save a12-13 in the stack frame as required by _xt_context_save. */ + s32i a12, a1, XT_STK_A12 + s32i a13, a1, XT_STK_A13 + + /* Save return address in a safe place (free a0). */ + mov a12, a0 + + /* Save the rest of the interrupted context (preserves A12-13). */ + call0 _xt_context_save + + /* + Save interrupted task's SP in TCB only if not nesting. + Manage nesting directly rather than call the generic IntEnter() + (in windowed ABI we can't call a C function here anyway because PS.EXCM is still set). + */ + movi a2, port_xSchedulerRunning + movi a3, port_interruptNesting + l32i a2, a2, 0 /* a2 = port_xSchedulerRunning */ + beqz a2, 1f /* scheduler not running, no tasks */ + l32i a2, a3, 0 /* a2 = port_interruptNesting */ + addi a2, a2, 1 /* increment nesting count */ + s32i a2, a3, 0 /* save nesting count */ + bnei a2, 1, .Lnested /* !=0 before incr, so nested */ + + movi a2, pxCurrentTCB + l32i a2, a2, 0 /* a2 = current TCB */ + beqz a2, 1f + s32i a1, a2, TOPOFSTACK_OFFS /* pxCurrentTCB->pxTopOfStack = SP */ + movi a1, port_IntStackTop /* a1 = top of intr stack */ + +.Lnested: +1: + mov a0, a12 /* restore return addr and return */ + ret + +/* +******************************************************************************* +* _frxt_int_exit +* void _frxt_int_exit(void) +* +* Implements the Xtensa RTOS porting layer's XT_RTOS_INT_EXIT function for +* FreeRTOS. If required, calls vPortYieldFromInt() to perform task context +* switching, restore the (possibly) new task's context, and return to the +* exit dispatcher saved in the task's stack frame at XT_STK_EXIT. +* May only be called from assembly code by the 'call0' instruction. Does not +* return to caller. +* See the description of the XT_RTOS_ENTER macro in xtensa_rtos.h. +* +******************************************************************************* +*/ + .globl _frxt_int_exit + .type _frxt_int_exit,@function + .align 4 +_frxt_int_exit: + + movi a2, port_xSchedulerRunning + movi a3, port_interruptNesting + rsil a0, XCHAL_EXCM_LEVEL /* lock out interrupts */ + l32i a2, a2, 0 /* a2 = port_xSchedulerRunning */ + beqz a2, .Lnoswitch /* scheduler not running, no tasks */ + l32i a2, a3, 0 /* a2 = port_interruptNesting */ + addi a2, a2, -1 /* decrement nesting count */ + s32i a2, a3, 0 /* save nesting count */ + bnez a2, .Lnesting /* !=0 after decr so still nested */ + + movi a2, pxCurrentTCB + l32i a2, a2, 0 /* a2 = current TCB */ + beqz a2, 1f /* no task ? go to dispatcher */ + l32i a1, a2, TOPOFSTACK_OFFS /* SP = pxCurrentTCB->pxTopOfStack */ + + movi a2, port_switch_flag /* address of switch flag */ + l32i a3, a2, 0 /* a3 = port_switch_flag */ + beqz a3, .Lnoswitch /* flag = 0 means no switch reqd */ + movi a3, 0 + s32i a3, a2, 0 /* zero out the flag for next time */ + +1: + /* + Call0 ABI callee-saved regs a12-15 need to be saved before possible preemption. + However a12-13 were already saved by _frxt_int_enter(). + */ + #ifdef __XTENSA_CALL0_ABI__ + s32i a14, a1, XT_STK_A14 + s32i a15, a1, XT_STK_A15 + #endif + + #ifdef __XTENSA_CALL0_ABI__ + call0 vPortYieldFromInt /* call dispatch inside the function; never returns */ + #else + call4 vPortYieldFromInt /* this one returns */ + call0 _frxt_dispatch /* tail-call dispatcher */ + /* Never returns here. */ + #endif + +.Lnoswitch: + /* + If we came here then about to resume the interrupted task. + */ + +.Lnesting: + /* + We come here only if there was no context switch, that is if this + is a nested interrupt, or the interrupted task was not preempted. + In either case there's no need to load the SP. + */ + + /* Restore full context from interrupt stack frame */ + call0 _xt_context_restore + + /* + Must return via the exit dispatcher corresponding to the entrypoint from which + this was called. Interruptee's A0, A1, PS, PC are restored and the interrupt + stack frame is deallocated in the exit dispatcher. + */ + l32i a0, a1, XT_STK_EXIT + ret + + +/* +********************************************************************************************************** +* _frxt_timer_int +* void _frxt_timer_int(void) +* +* Implements the Xtensa RTOS porting layer's XT_RTOS_TIMER_INT function for FreeRTOS. +* Called every timer interrupt. +* Manages the tick timer and calls xPortSysTickHandler() every tick. +* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h. +* +* Callable from C (obeys ABI conventions). Implemented in assmebly code for performance. +* +********************************************************************************************************** +*/ + .globl _frxt_timer_int + .type _frxt_timer_int,@function + .align 4 +_frxt_timer_int: + + /* + Xtensa timers work by comparing a cycle counter with a preset value. Once the match occurs + an interrupt is generated, and the handler has to set a new cycle count into the comparator. + To avoid clock drift due to interrupt latency, the new cycle count is computed from the old, + not the time the interrupt was serviced. However if a timer interrupt is ever serviced more + than one tick late, it is necessary to process multiple ticks until the new cycle count is + in the future, otherwise the next timer interrupt would not occur until after the cycle + counter had wrapped (2^32 cycles later). + + do { + ticks++; + old_ccompare = read_ccompare_i(); + write_ccompare_i( old_ccompare + divisor ); + service one tick; + diff = read_ccount() - old_ccompare; + } while ( diff > divisor ); + */ + + ENTRY(16) + +.L_xt_timer_int_catchup: + + /* Update the timer comparator for the next tick. */ + #ifdef XT_CLOCK_FREQ + movi a2, XT_TICK_DIVISOR /* a2 = comparator increment */ + #else + movi a3, _xt_tick_divisor + l32i a2, a3, 0 /* a2 = comparator increment */ + #endif + rsr a3, XT_CCOMPARE /* a3 = old comparator value */ + add a4, a3, a2 /* a4 = new comparator value */ + wsr a4, XT_CCOMPARE /* update comp. and clear interrupt */ + esync + + #ifdef __XTENSA_CALL0_ABI__ + /* Preserve a2 and a3 across C calls. */ + s32i a2, sp, 4 + s32i a3, sp, 8 + #endif + + /* Call the FreeRTOS tick handler (see port.c). */ + #ifdef __XTENSA_CALL0_ABI__ + call0 xPortSysTickHandler + #else + call4 xPortSysTickHandler + #endif + + #ifdef __XTENSA_CALL0_ABI__ + /* Restore a2 and a3. */ + l32i a2, sp, 4 + l32i a3, sp, 8 + #endif + + /* Check if we need to process more ticks to catch up. */ + esync /* ensure comparator update complete */ + rsr a4, CCOUNT /* a4 = cycle count */ + sub a4, a4, a3 /* diff = ccount - old comparator */ + blt a2, a4, .L_xt_timer_int_catchup /* repeat while diff > divisor */ + + RET(16) + + /* +********************************************************************************************************** +* _frxt_tick_timer_init +* void _frxt_tick_timer_init(void) +* +* Initialize timer and timer interrrupt handler (_xt_tick_divisor_init() has already been been called). +* Callable from C (obeys ABI conventions on entry). +* +********************************************************************************************************** +*/ + .globl _frxt_tick_timer_init + .type _frxt_tick_timer_init,@function + .align 4 +_frxt_tick_timer_init: + + ENTRY(16) + + /* Set up the periodic tick timer (assume enough time to complete init). */ + #ifdef XT_CLOCK_FREQ + movi a3, XT_TICK_DIVISOR + #else + movi a2, _xt_tick_divisor + l32i a3, a2, 0 + #endif + rsr a2, CCOUNT /* current cycle count */ + add a2, a2, a3 /* time of first timer interrupt */ + wsr a2, XT_CCOMPARE /* set the comparator */ + + /* + Enable the timer interrupt at the device level. Don't write directly + to the INTENABLE register because it may be virtualized. + */ + #ifdef __XTENSA_CALL0_ABI__ + movi a2, XT_TIMER_INTEN + call0 xt_ints_on + #else + movi a6, XT_TIMER_INTEN + call4 xt_ints_on + #endif + + RET(16) + +/* +********************************************************************************************************** +* DISPATCH THE HIGH READY TASK +* void _frxt_dispatch(void) +* +* Switch context to the highest priority ready task, restore its state and dispatch control to it. +* +* This is a common dispatcher that acts as a shared exit path for all the context switch functions +* including vPortYield() and vPortYieldFromInt(), all of which tail-call this dispatcher +* (for windowed ABI vPortYieldFromInt() calls it indirectly via _frxt_int_exit() ). +* +* The Xtensa port uses different stack frames for solicited and unsolicited task suspension (see +* comments on stack frames in xtensa_context.h). This function restores the state accordingly. +* If restoring a task that solicited entry, restores the minimal state and leaves CPENABLE clear. +* If restoring a task that was preempted, restores all state including the task's CPENABLE. +* +* Entry: +* pxCurrentTCB points to the TCB of the task to suspend, +* Because it is tail-called without a true function entrypoint, it needs no 'entry' instruction. +* +* Exit: +* If incoming task called vPortYield() (solicited), this function returns as if from vPortYield(). +* If incoming task was preempted by an interrupt, this function jumps to exit dispatcher. +* +********************************************************************************************************** +*/ + .globl _frxt_dispatch + .type _frxt_dispatch,@function + .align 4 +_frxt_dispatch: + + #ifdef __XTENSA_CALL0_ABI__ + call0 vTaskSwitchContext // Get next TCB to resume + movi a2, pxCurrentTCB + #else + movi a2, pxCurrentTCB + call4 vTaskSwitchContext // Get next TCB to resume + #endif + l32i a3, a2, 0 + l32i sp, a3, TOPOFSTACK_OFFS /* SP = next_TCB->pxTopOfStack; */ + s32i a3, a2, 0 + + /* Determine the type of stack frame. */ + l32i a2, sp, XT_STK_EXIT /* exit dispatcher or solicited flag */ + bnez a2, .L_frxt_dispatch_stk + +.L_frxt_dispatch_sol: + + /* Solicited stack frame. Restore minimal context and return from vPortYield(). */ + l32i a3, sp, XT_SOL_PS + #ifdef __XTENSA_CALL0_ABI__ + l32i a12, sp, XT_SOL_A12 + l32i a13, sp, XT_SOL_A13 + l32i a14, sp, XT_SOL_A14 + l32i a15, sp, XT_SOL_A15 + #endif + l32i a0, sp, XT_SOL_PC + #if XCHAL_CP_NUM > 0 + /* Ensure wsr.CPENABLE is complete (should be, it was cleared on entry). */ + rsync + #endif + /* As soons as PS is restored, interrupts can happen. No need to sync PS. */ + wsr a3, PS + #ifdef __XTENSA_CALL0_ABI__ + addi sp, sp, XT_SOL_FRMSZ + ret + #else + retw + #endif + +.L_frxt_dispatch_stk: + + #if XCHAL_CP_NUM > 0 + /* Restore CPENABLE from task's co-processor save area. */ + movi a3, pxCurrentTCB /* cp_state = */ + l32i a3, a3, 0 + l32i a2, a3, CP_TOPOFSTACK_OFFS /* StackType_t *pxStack; */ + l16ui a3, a2, XT_CPENABLE /* CPENABLE = cp_state->cpenable; */ + wsr a3, CPENABLE + #endif + + /* Interrupt stack frame. Restore full context and return to exit dispatcher. */ + call0 _xt_context_restore + + /* In Call0 ABI, restore callee-saved regs (A12, A13 already restored). */ + #ifdef __XTENSA_CALL0_ABI__ + l32i a14, sp, XT_STK_A14 + l32i a15, sp, XT_STK_A15 + #endif + + #if XCHAL_CP_NUM > 0 + /* Ensure wsr.CPENABLE has completed. */ + rsync + #endif + + /* + Must return via the exit dispatcher corresponding to the entrypoint from which + this was called. Interruptee's A0, A1, PS, PC are restored and the interrupt + stack frame is deallocated in the exit dispatcher. + */ + l32i a0, sp, XT_STK_EXIT + ret + + +/* +********************************************************************************************************** +* PERFORM A SOLICTED CONTEXT SWITCH (from a task) +* void vPortYield(void) +* +* This function saves the minimal state needed for a solicited task suspension, clears CPENABLE, +* then tail-calls the dispatcher _frxt_dispatch() to perform the actual context switch +* +* At Entry: +* pxCurrentTCB points to the TCB of the task to suspend +* Callable from C (obeys ABI conventions on entry). +* +* Does not return to caller. +* +********************************************************************************************************** +*/ + .globl vPortYield + .type vPortYield,@function + .align 4 +vPortYield: + + #ifdef __XTENSA_CALL0_ABI__ + addi sp, sp, -XT_SOL_FRMSZ + #else + entry sp, XT_SOL_FRMSZ + #endif + + rsr a2, PS + s32i a0, sp, XT_SOL_PC + s32i a2, sp, XT_SOL_PS + #ifdef __XTENSA_CALL0_ABI__ + s32i a12, sp, XT_SOL_A12 /* save callee-saved registers */ + s32i a13, sp, XT_SOL_A13 + s32i a14, sp, XT_SOL_A14 + s32i a15, sp, XT_SOL_A15 + #else + /* Spill register windows. Calling xthal_window_spill() causes extra */ + /* spills and reloads, so we will set things up to call the _nw version */ + /* instead to save cycles. */ + movi a6, ~(PS_WOE_MASK|PS_INTLEVEL_MASK) /* spills a4-a7 if needed */ + and a2, a2, a6 /* clear WOE, INTLEVEL */ + addi a2, a2, XCHAL_EXCM_LEVEL /* set INTLEVEL */ + wsr a2, PS + rsync + call0 xthal_window_spill_nw + l32i a2, sp, XT_SOL_PS /* restore PS */ + wsr a2, PS + #endif + + rsil a2, XCHAL_EXCM_LEVEL /* disable low/med interrupts */ + + #if XCHAL_CP_NUM > 0 + /* Save coprocessor callee-saved state (if any). At this point CPENABLE */ + /* should still reflect which CPs were in use (enabled). */ + call0 _xt_coproc_savecs + #endif + + movi a2, pxCurrentTCB + movi a3, 0 + l32i a2, a2, 0 /* a2 = pxCurrentTCB */ + s32i a3, sp, XT_SOL_EXIT /* 0 to flag as solicited frame */ + s32i sp, a2, TOPOFSTACK_OFFS /* pxCurrentTCB->pxTopOfStack = SP */ + + #if XCHAL_CP_NUM > 0 + /* Clear CPENABLE, also in task's co-processor state save area. */ + l32i a2, a2, CP_TOPOFSTACK_OFFS /* a2 = pxCurrentTCB->cp_state */ + movi a3, 0 + wsr a3, CPENABLE + beqz a2, 1f + s16i a3, a2, XT_CPENABLE /* clear saved cpenable */ +1: + #endif + + /* Tail-call dispatcher. */ + call0 _frxt_dispatch + /* Never reaches here. */ + + +/* +********************************************************************************************************** +* PERFORM AN UNSOLICITED CONTEXT SWITCH (from an interrupt) +* void vPortYieldFromInt(void) +* +* This calls the context switch hook (removed), saves and clears CPENABLE, then tail-calls the dispatcher +* _frxt_dispatch() to perform the actual context switch. +* +* At Entry: +* Interrupted task context has been saved in an interrupt stack frame at pxCurrentTCB->pxTopOfStack. +* pxCurrentTCB points to the TCB of the task to suspend, +* Callable from C (obeys ABI conventions on entry). +* +* At Exit: +* Windowed ABI defers the actual context switch until the stack is unwound to interrupt entry. +* Call0 ABI tail-calls the dispatcher directly (no need to unwind) so does not return to caller. +* +********************************************************************************************************** +*/ + .globl vPortYieldFromInt + .type vPortYieldFromInt,@function + .align 4 +vPortYieldFromInt: + + ENTRY(16) + + #if XCHAL_CP_NUM > 0 + /* Save CPENABLE in task's co-processor save area, and clear CPENABLE. */ + movi a3, pxCurrentTCB /* cp_state = */ + l32i a3, a3, 0 + l32i a2, a3, CP_TOPOFSTACK_OFFS + + rsr a3, CPENABLE + s16i a3, a2, XT_CPENABLE /* cp_state->cpenable = CPENABLE; */ + movi a3, 0 + wsr a3, CPENABLE /* disable all co-processors */ + #endif + + #ifdef __XTENSA_CALL0_ABI__ + /* Tail-call dispatcher. */ + call0 _frxt_dispatch + /* Never reaches here. */ + #else + RET(16) + #endif + +/* +********************************************************************************************************** +* _frxt_task_coproc_state +* void _frxt_task_coproc_state(void) +* +* Implements the Xtensa RTOS porting layer's XT_RTOS_CP_STATE function for FreeRTOS. +* +* May only be called when a task is running, not within an interrupt handler (returns 0 in that case). +* May only be called from assembly code by the 'call0' instruction. Does NOT obey ABI conventions. +* Returns in A15 a pointer to the base of the co-processor state save area for the current task. +* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h. +* +********************************************************************************************************** +*/ +#if XCHAL_CP_NUM > 0 + + .globl _frxt_task_coproc_state + .type _frxt_task_coproc_state,@function + .align 4 +_frxt_task_coproc_state: + + movi a15, port_xSchedulerRunning /* if (port_xSchedulerRunning */ + l32i a15, a15, 0 + beqz a15, 1f + movi a15, port_interruptNesting /* && port_interruptNesting == 0 */ + l32i a15, a15, 0 + bnez a15, 1f + movi a15, pxCurrentTCB + l32i a15, a15, 0 /* && pxCurrentTCB != 0) { */ + beqz a15, 2f + l32i a15, a15, CP_TOPOFSTACK_OFFS + ret + +1: movi a15, 0 +2: ret + +#endif /* XCHAL_CP_NUM > 0 */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portbenchmark.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portbenchmark.h new file mode 100644 index 0000000..5ca7b1c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portbenchmark.h @@ -0,0 +1,51 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * This utility helps benchmarking interrupt latency and context switches. + * In order to enable it, set configBENCHMARK to 1 in FreeRTOSConfig.h. + * You will also need to download the FreeRTOS_trace patch that contains + * portbenchmark.c and the complete version of portbenchmark.h + */ + +#ifndef PORTBENCHMARK_H +#define PORTBENCHMARK_H + +#if configBENCHMARK + #error "You need to download the FreeRTOS_trace patch that overwrites this file" +#endif + +#define portbenchmarkINTERRUPT_DISABLE() +#define portbenchmarkINTERRUPT_RESTORE(newstate) +#define portbenchmarkIntLatency() +#define portbenchmarkIntWait() +#define portbenchmarkReset() +#define portbenchmarkPrint() + +#endif /* PORTBENCHMARK */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portclib.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portclib.c new file mode 100644 index 0000000..4ac9eaa --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portclib.c @@ -0,0 +1,230 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include "FreeRTOS.h" + +#if XT_USE_THREAD_SAFE_CLIB + +#if XSHAL_CLIB == XTHAL_CLIB_XCLIB + +#include +#include + +#include "semphr.h" + +typedef SemaphoreHandle_t _Rmtx; + +//----------------------------------------------------------------------------- +// Override this and set to nonzero to enable locking. +//----------------------------------------------------------------------------- +int32_t _xclib_use_mt = 1; + + +//----------------------------------------------------------------------------- +// Init lock. +//----------------------------------------------------------------------------- +void +_Mtxinit(_Rmtx * mtx) +{ + *mtx = xSemaphoreCreateRecursiveMutex(); +} + +//----------------------------------------------------------------------------- +// Destroy lock. +//----------------------------------------------------------------------------- +void +_Mtxdst(_Rmtx * mtx) +{ + if ((mtx != NULL) && (*mtx != NULL)) { + vSemaphoreDelete(*mtx); + } +} + +//----------------------------------------------------------------------------- +// Lock. +//----------------------------------------------------------------------------- +void +_Mtxlock(_Rmtx * mtx) +{ + if ((mtx != NULL) && (*mtx != NULL)) { + xSemaphoreTakeRecursive(*mtx, portMAX_DELAY); + } +} + +//----------------------------------------------------------------------------- +// Unlock. +//----------------------------------------------------------------------------- +void +_Mtxunlock(_Rmtx * mtx) +{ + if ((mtx != NULL) && (*mtx != NULL)) { + xSemaphoreGiveRecursive(*mtx); + } +} + +//----------------------------------------------------------------------------- +// Called by malloc() to allocate blocks of memory from the heap. +//----------------------------------------------------------------------------- +void * +_sbrk_r (struct _reent * reent, int32_t incr) +{ + extern char _end; + extern char _heap_sentry; + static char * _heap_sentry_ptr = &_heap_sentry; + static char * heap_ptr; + char * base; + + if (!heap_ptr) + heap_ptr = (char *) &_end; + + base = heap_ptr; + if (heap_ptr + incr >= _heap_sentry_ptr) { + reent->_errno = ENOMEM; + return (char *) -1; + } + + heap_ptr += incr; + return base; +} + +//----------------------------------------------------------------------------- +// Global initialization for C library. +//----------------------------------------------------------------------------- +void +vPortClibInit(void) +{ +} + +//----------------------------------------------------------------------------- +// Per-thread cleanup stub provided for linking, does nothing. +//----------------------------------------------------------------------------- +void +_reclaim_reent(void * ptr) +{ +} + +#endif /* XSHAL_CLIB == XTHAL_CLIB_XCLIB */ + +#if XSHAL_CLIB == XTHAL_CLIB_NEWLIB + +#include +#include +#include +#include +#include + +#include "semphr.h" + +static SemaphoreHandle_t xClibMutex; +static uint32_t ulClibInitDone = 0; + +//----------------------------------------------------------------------------- +// Get C library lock. +//----------------------------------------------------------------------------- +void +__malloc_lock(struct _reent * ptr) +{ + if (!ulClibInitDone) + return; + + xSemaphoreTakeRecursive(xClibMutex, portMAX_DELAY); +} + +//----------------------------------------------------------------------------- +// Release C library lock. +//----------------------------------------------------------------------------- +void +__malloc_unlock(struct _reent * ptr) +{ + if (!ulClibInitDone) + return; + + xSemaphoreGiveRecursive(xClibMutex); +} + +//----------------------------------------------------------------------------- +// Lock for environment. Since we have only one global lock we can just call +// the malloc() lock function. +//----------------------------------------------------------------------------- +void +__env_lock(struct _reent * ptr) +{ + __malloc_lock(ptr); +} + + +//----------------------------------------------------------------------------- +// Unlock environment. +//----------------------------------------------------------------------------- +void +__env_unlock(struct _reent * ptr) +{ + __malloc_unlock(ptr); +} + +//----------------------------------------------------------------------------- +// Called by malloc() to allocate blocks of memory from the heap. +//----------------------------------------------------------------------------- +void * +_sbrk_r (struct _reent * reent, int32_t incr) +{ + extern char _end; + extern char _heap_sentry; + static char * _heap_sentry_ptr = &_heap_sentry; + static char * heap_ptr; + char * base; + + if (!heap_ptr) + heap_ptr = (char *) &_end; + + base = heap_ptr; + if (heap_ptr + incr >= _heap_sentry_ptr) { + reent->_errno = ENOMEM; + return (char *) -1; + } + + heap_ptr += incr; + return base; +} + +//----------------------------------------------------------------------------- +// Global initialization for C library. +//----------------------------------------------------------------------------- +void +vPortClibInit(void) +{ + configASSERT(!ulClibInitDone); + + xClibMutex = xSemaphoreCreateRecursiveMutex(); + ulClibInitDone = 1; +} + +#endif /* XSHAL_CLIB == XTHAL_CLIB_NEWLIB */ + +#endif /* XT_USE_THREAD_SAFE_CLIB */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portmacro.h new file mode 100644 index 0000000..40c9369 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portmacro.h @@ -0,0 +1,210 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __ASSEMBLER__ + +#include + +#include +#include +#include +#include /* required for XSHAL_CLIB */ +#include + +//#include "xtensa_context.h" + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ + +#define portCHAR int8_t +#define portFLOAT float +#define portDOUBLE double +#define portLONG int32_t +#define portSHORT int16_t +#define portSTACK_TYPE uint32_t +#define portBASE_TYPE int + +typedef portSTACK_TYPE StackType_t; +typedef portBASE_TYPE BaseType_t; +typedef unsigned portBASE_TYPE UBaseType_t; + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +// portbenchmark +#include "portbenchmark.h" + +/* Critical section management. NW-TODO: replace XTOS_SET_INTLEVEL with more efficient version, if any? */ +// These cannot be nested. They should be used with a lot of care and cannot be called from interrupt level. +#define portDISABLE_INTERRUPTS() do { XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL); portbenchmarkINTERRUPT_DISABLE(); } while (0) +#define portENABLE_INTERRUPTS() do { portbenchmarkINTERRUPT_RESTORE(0); XTOS_SET_INTLEVEL(0); } while (0) + +// These can be nested +#define portCRITICAL_NESTING_IN_TCB 1 // For now, let FreeRTOS' (tasks.c) manage critical nesting +void vTaskEnterCritical(void); +void vTaskExitCritical(void); +#define portENTER_CRITICAL() vTaskEnterCritical() +#define portEXIT_CRITICAL() vTaskExitCritical() + +// Cleaner and preferred solution allows nested interrupts disabling and restoring via local registers or stack. +// They can be called from interrupts too. +static inline unsigned portENTER_CRITICAL_NESTED() { unsigned state = XTOS_SET_INTLEVEL(XCHAL_EXCM_LEVEL); portbenchmarkINTERRUPT_DISABLE(); return state; } +#define portEXIT_CRITICAL_NESTED(state) do { portbenchmarkINTERRUPT_RESTORE(state); XTOS_RESTORE_JUST_INTLEVEL(state); } while (0) + +// These FreeRTOS versions are similar to the nested versions above +#define portSET_INTERRUPT_MASK_FROM_ISR() portENTER_CRITICAL_NESTED() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(state) portEXIT_CRITICAL_NESTED(state) + +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 4 +#define portNOP() XT_NOP() +/*-----------------------------------------------------------*/ + +/* Fine resolution time */ +#define portGET_RUN_TIME_COUNTER_VALUE() xthal_get_ccount() + +/* Kernel utilities. */ +void vPortYield( void ); +void _frxt_setup_switch( void ); +#define portYIELD() vPortYield() +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) \ + if ( ( xHigherPriorityTaskWoken ) != 0 ) { \ + _frxt_setup_switch(); \ + } + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +// When coprocessors are defined, we to maintain a pointer to coprocessors area. +// We currently use a hack: redefine field xMPU_SETTINGS in TCB block as a structure that can hold: +// MPU wrappers, coprocessor area pointer, trace code structure, and more if needed. +// The field is normally used for memory protection. FreeRTOS should create another general purpose field. +typedef struct { + #if XCHAL_CP_NUM > 0 + volatile StackType_t* coproc_area; // Pointer to coprocessor save area; MUST BE FIRST + #endif + + #if portUSING_MPU_WRAPPERS + // Define here mpu_settings, which is port dependent + int mpu_setting; // Just a dummy example here; MPU not ported to Xtensa yet + #endif + + #if configUSE_TRACE_FACILITY_2 + struct { + // Cf. porttraceStamp() + int taskstamp; /* Stamp from inside task to see where we are */ + int taskstampcount; /* A counter usually incremented when we restart the task's loop */ + } porttrace; + #endif +} xMPU_SETTINGS; + +// Main hack to use MPU_wrappers even when no MPU is defined (warning: mpu_setting should not be accessed; otherwise move this above xMPU_SETTINGS) +#if (XCHAL_CP_NUM > 0 || configUSE_TRACE_FACILITY_2) && !portUSING_MPU_WRAPPERS // If MPU wrappers not used, we still need to allocate coproc area + #undef portUSING_MPU_WRAPPERS + #define portUSING_MPU_WRAPPERS 1 // Enable it to allocate coproc area + #define MPU_WRAPPERS_H // Override mpu_wrapper.h to disable unwanted code + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA +#endif + +// porttrace +#if configUSE_TRACE_FACILITY_2 +#include "porttrace.h" +#endif + +// configASSERT_2 if requested +#if configASSERT_2 +#include +void exit(int); +#define configASSERT( x ) if (!(x)) { porttracePrint(-1); printf("\nAssertion failed in %s:%d\n", __FILE__, __LINE__); exit(-1); } +#endif + + +/* C library support -- only XCLIB and NEWLIB are supported. */ + +/* To enable thread-safe C library support, XT_USE_THREAD_SAFE_CLIB must be + defined to be > 0 somewhere above or on the command line. */ + +#if (XT_USE_THREAD_SAFE_CLIB > 0u) && (XSHAL_CLIB == XTHAL_CLIB_XCLIB) +extern void vPortClibInit(void); +#endif // XCLIB support + +#if (XT_USE_THREAD_SAFE_CLIB > 0u) && (XSHAL_CLIB == XTHAL_CLIB_NEWLIB) +extern void vPortClibInit(void); + +// This C library cleanup is not currently done by FreeRTOS when deleting a task +#include +#define portCLEAN_UP_TCB(pxTCB) vPortCleanUpTcbClib(&((pxTCB)->xNewLib_reent)) +static inline void vPortCleanUpTcbClib(struct _reent *ptr) +{ + FILE * fp = &(ptr->__sf[0]); + int i; + for (i = 0; i < 3; ++i, ++fp) { + fp->_close = NULL; + } +} +#endif // NEWLIB support + +#endif // __ASSEMBLER__ + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/porttrace.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/porttrace.h new file mode 100644 index 0000000..a871801 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/porttrace.h @@ -0,0 +1,49 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * This utility helps tracing the entering and exiting from tasks. + * It maintains a circular buffer of tasks in the order they execute, + * and their execution time. To enable it, set configUSE_TRACE_FACILITY_2 + * to 1 in FreeRTOSConfig.h. You will also need to download the + * FreeRTOS_trace patch that contains porttrace.c and the complete version + * of porttrace.h. + */ + +#ifndef PORTTRACE_H +#define PORTTRACE_H + +#if configUSE_TRACE_FACILITY_2 + #error "You need to download the FreeRTOS_trace patch that overwrites this file" +#endif + +#define porttracePrint(nelements) +#define porttraceStamp(stamp, count_incr) + +#endif /* PORTTRACE_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt new file mode 100644 index 0000000..5622809 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt @@ -0,0 +1,764 @@ + FreeRTOS Port for Xtensa Configurable and Diamond Processors + ============================================================ + + FreeRTOS Kernel Version 10.0.0 + + +Introduction +------------ + +This document describes the Xtensa port for FreeRTOS multitasking RTOS. +For an introduction to FreeRTOS itself, please refer to FreeRTOS +documentation. + +This port currently works with FreeRTOS kernel version 10.0.0. + + +Xtensa Configuration Requirements and Restrictions +-------------------------------------------------- + +The Xtensa configurable architecture supports a vast space of processor +features. This port supports all of them, including custom processor +extensions defined in the TIE language, with certain minimum +requirements. You must use Xtensa Tools to compile and link FreeRTOS and +your application for your Xtensa configuration. The port uses the Xtensa +Hardware Abstraction Layer (HAL) to adapt to your Xtensa configuration. +NOTE: It may be possible to build and run this with the open-source +xtensa-linux tools provided you have the correct overlay for your Xtensa +configuration. However, this has not been tested and is currently not +supported by Cadence. + +This port includes optional reentrancy support for the 'newlib' and +'xclib' C runtime libraries distributed with Xtensa Tools, providing +thread-safety on a per task basis (for use in tasks only, not interrupt +handlers). + +NOTE: At this time only 'newlib' and 'xclib' C libraries are supported +for thread safety. The 'uclibc' library is not reentrant and does not +provide thread safety at this time. However, if you are not concerned +with reentrancy then you can use any of these libraries. + +This port also includes a simple example application that may run on +a supported board or the Xtensa instruction set simulator (ISS). There +are also a couple of test programs used in maintaining the port, which +serve as additional examples. + +FreeRTOS for Xtensa configurable processors requires the following minimum +processor configuration options: +- Timer interrupt option with at least one interruptible timer. +- Interrupt option (implied by the timer interrupt option). +- Exception Architecture 2 (XEA2). Please note that XEA1 is NOT supported. + All 'Diamond', 'Xtensa 6', 'Xtensa LX' and 'Xtensa LX2' processors and + most 'Xtensa T1050' processors are configured with XEA2. +All Diamond processor cores meet these requirements and are supported. + +Minimal support for certain evaluation boards is provided via a board +independent XTBSP API implemented by a board specific library distributed +with the Xtensa Tools. This provides the board clock frequency and basic +polled drivers for the display and console device. Note that XTBSP +is not a tradtional RTOS "board support package" with RTOS specific +interrupt-driven drivers - it is not specific to any RTOS. Note that +FreeRTOS can run on any Xtensa or Diamond board without this board support +(a "raw" platform), but you will have to provide the clock frequency +and drivers for any on-board devices you want to use. + + +Installation +------------ + +The Xtensa port of FreeRTOS is available at this location: + + https://github.com/foss-xtensa/amazon-freertos + +This download includes the core FreeRTOS source and include files needed +to build the port. You can also download the official release of FreeRTOS +version 1.0.0 or later from this location: + + https://github.com/aws/amazon-freertos + +The Xtensa port files are currently not included in the official package. + +All source is provided along with a Makefile that works for any host +platform supported by Xtensa Tools (Windows, Linux). These instructions +are written for Windows users, but can easily be understood and adapted +to other host platforms. + +First install the FreeRTOS common package in a directory of your choosing. +The structure of that package will look like this: + + +|-- demos +| `-- cadence +| `-- sim +| |-- common +| | |-- application_code +| | | `-- cadence_code +| | `-- config_files +| `-- xplorer +`-- lib + |-- FreeRTOS + | `-- portable + | |-- Common + | |-- MemMang + | `-- XCC + | `-- Xtensa + `-- include + `-- private + +The Xtensa Tools are available from Cadence as part of a processor +license. Be sure you have installed the Xtensa Tools and your processor +configuration. + + +Building FreeRTOS for Xtensa +---------------------------- + +To build the FreeRTOS library and the example programs, go into the +directory 'demos/cadence/sim' and use the makefile in that directory. +"make all" will build all the examples. There is another makefile in +the 'lib/FreeRTOS/portable/XCC/Xtensa' directory that builds just the +FreeRTOS library. + +By default, you will build for the Xtensa instruction set simulator. If +you have a supported emulation board, you can build to run on that. You +can also build to run on a raw Xtensa core with no board support, a +good starting point for supporting your own target platform. Cadence +recommends doing functional development on the simulator because it +is easier to debug with, then move to a board if/when you need to test +hardware drivers or real-time performance. + +The provided makefile simplifies building FreeRTOS and the example +for your Xtensa configuration and platform (ISS, board, etc.). There +are detailed instructions in the comments at the top of the makefile. + +The makefiles work on Windows and Linux and support incremental builds. +The build for each Xtensa configuration and target platform is placed in +a subdirectory so several core and platform builds can co-exist even with +incremental rebuilds. You may specify the root of the build area (if tou +want it to be elsewhere than under the source tree) by defining BLDROOT +either in the make command or your shell environment. + + +Building the FreeRTOS Library +----------------------------- + +First, be sure you have installed Xtensa Tools and your processor +configuration, and be sure that Xtensa Tools are in your search path. +You can use xt-make, which comes with the Xtensa Tools, to run the +makefiles. + +Change directories to the Xtensa port directory: + +> cd lib/FreeRTOS/portable/XCC/Xtensa + +Now build the FreeRTOS RTOS as a library (libfreertos.a) as follows: + +> xt-make + +which by default builds for the simulator (TARGET=sim), or: + +> xt-make TARGET=board + +which builds for a supported board. Note that the board type does not +need to be specified when building the FreeRTOS library. + +If you are building for an Xtensa processor configuration that is not the +default you selected when you installed Xtensa Tools, you need to define the +environment variable XTENSA_CORE. If your configuration is not in the +default registry you selected when you installed Xtensa Tools, you also +need to define the environment variable XTENSA_SYSTEM. See tools manuals. +You can avoid defining these in your environment if you pass the variables +you need to redefine into xt-make as follows: + +> xt-make XTENSA_CORE= XTENSA_SYSTEM= ... + +There are more details about build options in the comment in the Makefile. + +After the library has been built, you must link your application with this +library in order to use FreeRTOS. + + +Building the FreeRTOS Examples +------------------------------ + +The provided examples are designed to run on the Xtensa instruction set +simulator (ISS) or a supported evaluation board programmed with your +Xtensa processor configuration. + +To build the examples for the default platform (simulator): + +> cd demos/cadence/sim + +> xt-make all + +which is the same as + +> xt-make all TARGET=sim + +The boards currently supported are the Xilinx ML605 and KC705 FPGA +development boards. To target these boards, type + +> xt-make all TARGET=ml605 + +or + +> xt-make all TARGET=kc705 + +To build in a location other than the default, specify the new location +using the BLDROOT variable. Note that this makefile will invoke the +FreeRTOS library build makefile automatically, passing on the relevant +parameters based on what you specified. + +You can override the default compilation options by specifying the new +options via CFLAGS. For example: + +> xt-make all TARGET=sim CFLAGS="-O2 -Os -g" + +This compiles the examples and links them with the FreeRTOS library +libfreertos.a and the appropriate linker-support package (LSP) for your +target platform (you can override the LSP by adding LSP= to the +xt-make command line). The resulting ELF files can be downloaded and +executed on the target. The example binaries appear in the platform +specific subdirectory described earlier. + +To build your application with thread-safe C library support, you +need to make certain modifications to the application to plug in and +invoke the reentrancy support. This allows each task to use the library +without interference with other tasks (it is not safe for interrupt +handlers to call the C library). + +First, you must define + + XT_USE_THREAD_SAFE_CLIB + +to a nonzero value either in xtensa_config.h or on the compiler's command +line. Note that the default xtensa_config.h provided with this port does +define this to 1 if either newlib or xclib is detected. + +Then, you must also make sure to allocate extra space on the stack for +each task that will use the C library reentrant functions. This extra +space is to be allocated over and above the actual stack space required +by the task itself. The define + + XT_STACK_EXTRA_CLIB + +specifies the amount of extra space to be added on to the stack to allow +saving the context for the C library as well as the coprocessors if any. +E.g. if your task requires 2000 bytes of stack space, you must allocate +(2000 + XT_STACK_EXTRA_CLIB) bytes for the stack. + + +IMPORTANT NOTE +-------------- + +The header file FreeRTOS.h, which is a part of the core FreeRTOS sources, +includes if thread safety for the C libraries is enabled. For +xclib, this file exists in and so is reported as missing. +To work around this, the makefiles supplied with this port will copy the +reent.h header into the build directory during the build process. If you +use a different build process, then you must make sure to copy this file +to a location that is included in the list of include paths. This can be +the build directory or the directory that contains the Xtensa port source +files. + + +Running or Debugging an Application +----------------------------------- + +To execute the example application on the simulator: + +> xt-run [--turbo] example.exe + +The option --turbo provides much faster, but non-cycle-accurate simulation +(the --turbo option is only available with Xtensa Tools version 7 or later). + + +To execute on the simulator using the Xplorer GUI based debugger: + +> xplorer --debug example.exe + + +To execute on a supported evaluation board, download example.exe per +instructions in the tools manuals. Be sure the board has been programmed +with the correct configuration and is set up to boot from RAM and debug +a downloaded program! Optionally you may connect a terminal or terminal +emulator to the serial port on the board with settings as described in +the board user manual, and see the output of printf on the terminal. + +To obtain I/O on a "raw" platform such as an unsupported board, you need +to provide low level I/O drivers (eg. inbyte() and outbyte() for character +I/O if you want to use printf etc.). You can run "raw" executables on +any Xtensa platform, including simulator and any board, but you will not +see any behavior specific to the platform (eg. display, printed output, +stopping simulation at end of program). You can, while debugging, use a +debugger mechanism called GDBIO to obtain basic I/O. To use GDBIO, link +with the gdbio LSP. Refer to Xtensa tools documentation for details. + + +Task Stack Sizes +---------------- + +The application must ensure that every task has enough space for its +stack. Each task needs enough space for its own use, its own interrupt +stack frame (defined in xtensa_context.h) and space to save coprocessor +state, if any. Several factors influence the size of the stack required, +including the compiler optimization level and the use of the C library. +Calls to standard output functions such as printf() can use up a lot of +stack space. The tool xt-stack-usage is helpful in determining safe stack +sizes for your application. + +Some macros are provided in xtensa_config.h to help determine the stack +size for tasks that do and do not use the C library. Use these as the +basis for each task's stack size. They are minimum requirements taking +into account your configuration and use of the C library. In particular, +the define + + XT_STACK_MIN_SIZE + +defines the minimum stack size for any task. Be very careful if you try +to use a stack size smaller than this minimum. Stack overruns can cause +all kinds of hard-to-debug errors. It is recommended that you enable the +FreeRTOS stack checking features during development. + +WARNING: The newlib printf() function uses a lot of stack space. Be very +careful in using it. Optionally you can use the 'libxtutil' library for +output - it implements a subset of printf() that has smaller code size +and uses far less stack space. More information about this library is in +the Xtensa Tools documentation. + + +Interrupt Stack +--------------- + +Beginning with port version 1.2, the port uses a separate interrupt stack +for handling interrupts. Thus, it is no longer necessary for each task to +reserve space on its stack to handle interrupts. The size of the interrupt +stack is controlled by the parameter "configISR_STACK_SIZE" defined in +FreeRTOSConfig.h. Define this carefully to match your system requirements. + + +Assembler / Compiler Switches +----------------------------- + +The following are compiler switches are used by the provided +Makefile in building the FreeRTOS library and example application. +These can be modified by editing the Makefile or by overriding the +CFLAGS variable in the make command line, for example: + +> xt-make CFLAGS="-O2 -DXT_USE_THREAD_SAFE_CLIB" + + -g Specifies debug information. + -c Specifies object code generation. + -On Sets compiler optimization level n (default -O0). + -mlongcalls Allows assembler and linker to convert call + instructions to longer indirect call sequences + when target is out of range. + -x assembler-with-cpp Passes .s and .S files through C preprocessor. + -Dmacro Define a preprocessor macro with no value. + -Dmacro=value Define a preprocessor macro with a value. + +See the compiler / linker documentation for a full list of switches and +their use. + +Many definitions can be provided at compile-time via the -D option +without editing the source code. Here are some of the more useful ones: + + XT_USE_THREAD_SAFE_CLIB Enable support for the reentrancy to provide + thread-safety for the newlib and xclib libraries + supplied with Xtensa Tools. Default ON. + + Note, the follwing defines are unique to the Xtensa port so have names + beginning with "XT_". + + XT_SIMULATOR Set this if building to run on the simulator. + Takes advantage of certain simulator control + and reporting facilities, and adjusts timing + of periodic tick to provide a more acceptable + performance in simulation (see XT_CLOCK_FREQ). + Set by default unless PLATFORM is overridden. + + XT_BOARD Set this if building for a supported board. + Be sure to specify the correct LSP for the + board. See the example makefile for usage. + + XT_CLOCK_FREQ=freq Specifies the target processor's clock + frequency in Hz. Used primarily to set the + timer that generates the periodic interrupt. + Defaults are provided and may be edited in + xtensa_timer.h (see comments there also). + Default for simulator provides more acceptable + performance, but cannot provide real-time + performance due to variation in simulation + speed per host platform and insufficient + cycles between interrupts to process them. + Supported board platforms by default leave + this undefined and compute the clock frequency + at initialization unless this is explicitly + defined. + + XT_TICK_PER_SEC=n Specifies the frequency of the periodic tick. + + XT_TIMER_INDEX=n Specifies which timer to use for periodic tick. + Set this if your Xtensa processor configuration + provides more than one suitable timer and you + want to override the default. See xtensa_timer.h . + + XT_INTEXC_HOOKS Enables hooks in interrupt vector handlers + to support dynamic installation of exception + and interrupt handlers. Disabled by default. + + XT_USE_OVLY Enable code overlay support. It uses a mutex, + hence configUSE_MUTEX must be enabled. This + option is currently unsupported. + + XT_USE_SWPRI Enable software prioritization of interrupts. + Enabling this will prioritize interrupts with + higher bit numbers over those with lower bit + numbers at the same level. This works only for + low and medium priority interrupts that can be + dispatched to C handlers. + + +Register Usage and Stack Frames +------------------------------- + +The Xtensa architecture specifies two ABIs that determine how the general +purpose registers a0-a15 are used: the standard windowed ABI use with +the Xtensa windowed register file architecture, and the optional and +more conventional Call0 ABI (required for Xtensa configurations without +a windowed register file). + +Xtensa processors may have other special registers (including co-processor +registers and other TIE "states") that are independent of this choice +of ABI. See Xtensa documentation for more details. + +In the windowed ABI the registers of the current window are used as follows: + a0 = return address + a1 = stack pointer (alias sp) + a2 = first argument and result of call (in simple cases) + a3-7 = second through sixth arguments of call (in simple cases). + Note that complex or large arguments are passed on the + stack. Details are in the Xtensa Tools manuals. + a8-a15 = available for use as temporaries. +There are no callee-save registers. The windowed hardware automatically +saves registers a0-a3 on a call4, a0-a8 on a call8, a0-a12 on a call12, +by rotating the register window. Hardware triggers window overflow and +underflow exceptions as necessary when registers outside the current +window need to be spilled to preallocated space in the stack frame, or +restored. Complete details are in the Xtensa manuals. The entire windowed +register file is saved and restored on interrupt or task context switch. + +The Call0 ABI does not make use of register windows, relying instead +on a fixed set of 16 registers without window rotation. +The Call0 ABI is more conventional and uses registers as follows: + a0 = return address + a1 = stack pointer (alias sp) + a2 = first argument and result of call (in simple cases) + a3-7 = second through sixth arguments of call (in simple cases). + Note that complex or large arguments are passed on the + stack. Details are in the Xtensa Tools manuals. + a8-a11 = scratch. + a12-a15 = callee-save (a function must preserve these for its caller). +On a FreeRTOS API call, callee-save registers are saved only when a task +context switch occurs, and other registers are not saved at all (the caller +does not expect them to be preserved). On an interrupt, callee-saved +registers might only be saved and restored when a task context-switch +occurs, but all other registers are always saved and restored. + +An Xtensa processor has other special registers independent of the ABI, +depending on the configuration (including co-processor registers and other +TIE state) that are part of the task context. FreeRTOS preserves all such +registers over an unsolicited context-switch triggered by an interrupt. +However it does NOT preserve these over a solicited context-switch during +a FreeRTOS API call. This bears some explanation. These special registers +are either ignored by the compiler or treated as caller-saved, meaning +that if kept "live" over a function call (ie. need to be preserved) +they must be saved and restored by the caller. Since solicited entry to +FreeRTOS is always made by a function call, FreeRTOS assumes the caller +has saved any of these registers that are "live". FreeRTOS avoids a lot +of overhead by not having to save and restore every special register +(there can be many) on every solicited context switch. + +As a consequence, the application developer should NOT assume that special +registers are preserved over a FreeRTOS API call such as vTaskDelay(). +If multiple tasks use a register, the caller must save and restore it. + +The saved context stack frames for context switches that occur as +a result of interrupt handling (interrupt frame) or from task-level +API calls (solicited frame) are described in human readable form in +xtensa_context.h . All suspended tasks have one of these two types +of stack frames. The top of the suspended task's stack is pointed to +by pxCurrentTCB->pxTopOfStack. A special location common to both stack +frames differentiates solicited and interrupt stack frames. + + +Improving Performance, Footprint, or Ease of Debugging +------------------------------------------------------ + +By default FreeRTOS for Xtensa is built with debug (-g) and without +compiler optimizations (-O0). This makes debugging easier. Of course, +-O0 costs performance and usually also increases stack usage. To make +FreeRTOS run faster you can change the Makefile to enable the desired +optimizations or set a predefined optimization level (-O) . + +Maximum performance is achieved with -O3 -ipa, but that might increase +the footprint substantially. A good compromise is -O2. See the compiler +manual for details. + +Minimal footprint is achieved by optimizing for space with -Os, at the +cost of some performance. See the compiler manual for details. + +The Xtensa architecture port-specific assembly files are coded with no +file-scope labels inside functions (all labels inside functions begin with +".L"). This allows a profiler to accurately associate an address with a +function, and also allows the debugger's stack trace to show the correct +function wherever the program counter is within that function. However +there are some tradeoffs in debugging. Local (".L") labels are not +visible to the debugger, so the following limitations may be observed +during debugging: +- You cannot set a breakpoint on a local label inside a function. +- Disassembly will show the entire function, but will get out of sync and + show incorrect opcodes if it crosses any padding before an aligned local + branch target (".L" label, not ".Ln"). Restart disassembly specifying an + address range explicitly between points where there is padding. +Since FreeRTOS is provided in source form, it is not difficult to remove +the ".L" and ".Ln" prefixes from local labels if you want them visible. +They can also be made visible by passing the '-L' option to the assembler +and linker (see the assembler and linker manuals for details). + + +Interrupt and Exception Handling +-------------------------------- + +FreeRTOS provides a complete set of efficient exception and first-level +interrupt handlers installed at the appropriate exception and interrupt +vector locations. The Xtensa architecture supports several different +classes of exceptions and interrupts. Being a configurable architecture, +many of these are optional, and the vector locations are determined by +your processor configuration. (Note that Diamond cores are pre-configured +with specific vector locations.) The handlers provided use conditional +compilation to adapt to your processor configuration and include only +the code that is needed. + +Xtensa vector locations may reside almost anywhere, including in ROM. +The amount of code space available at each of these locations is +often very small (e.g. due to following vectors). A small stub of +code installed at the vector jumps to the corresponding handler, +usually in RAM. The exception and interrupt handlers are defined in +xtensa_vectors.S. They are not specific to FreeRTOS, but call into +FreeRTOS where appropriate via macros defined in xtensa_rtos.h . + +The handlers provided for low and medium priority interrupts are just +dispatchers that save relevant state and call user-definable handlers. +See the files xtensa_vectors.S and xtensa_api.h for more details of how +to create and install application-specific user interrupt handlers. +Similarly, user-defined handlers can be installed for exceptions (other +than a few which are always handled by the OS). + +The high priority interrupt handlers provided may be considered templates +into which the application adds code to service specific interrupts. +The places where application handlers should be inserted are tagged with +the comment "USER_EDIT" in xtensa_vectors.S. + +This FreeRTOS port supports strict priority-based nesting of interrupts. +An interrupt may only nest on top of one of strictly lower priority. +Equal priority interrupts concurrently pending are handled in an +application-defined sequence before any lower priority interrupts +are handled. During interrupt and exception handling, the processor's +interrupt level (PS.INTLEVEL) is used to control the interrupt priority +level that can be accepted; interrupt sources are not controlled +individually by FreeRTOS (the application is free to access the INTENABLE +register directly to enable/disable individual interrupts, eg. using +Xtensa HAL services). This approach provides the most deterministic +bounds on interrupt latency (for a given priority) and stack depth. + +Software prioritization of interrupts at the same priority is controlled +by the definition of XT_USE_SWPRI. See above for a description of this +parameter. + +The following subsections describe the handling of each class of exception +and interrupt in more detail. Many have nothing to do with FreeRTOS but +are mentioned because there is code to handle them in xtensa_vectors.S. + +User Exception and Interrupt Handler (Low/Medium Priority): + + All Xtensa 'general exceptions' come to the user, kernel, or double + exception vector. The exception type is identified by the EXCCAUSE + special register (level 1 interrupts are one particular cause of a + general exception). This port sets up PS to direct all such exceptions + to the user vector. Exceptions taken at the other two vectors usually + indicate a kernel or application bug. + + Level 1 interrupts are identified at the beginning of the handler + and are dispatched to a dedicated handler. Then, syscall and alloca + exceptions are identified and dispatched to special handlers described + below. After this, coprocessor exceptions are identified and dispatched + to the coprocessor handler. + + Any remaining exceptions are processed as follows: + + Having allocated the exception stack frame, the user exception handler + saves the current task state and sets up a C environment and enables + the high-priority class of interrupts (which do not interact with + FreeRTOS), then reads EXCCAUSE and uses the cause (number) to index + into a table of user-specified handlers. The correct handler is then + called. If the handler returns, the context is restored and control is + returned to the code that caused the exception. The user-defined handler + may alter the saved context, or any other system state, that allows the + faulting instruction to be retried. + + If the cause is a level 1 (low-priority) or medium-priority interrupt, + the handler enables all interrupts above that priority level after + saving the task context. It then sets up the environment for C code + and then calls the handler (found in the handler table) for the + interrupt number. If the user has not specified a handler, then the + default handler will be called, which will terminate the program. + + If the interrupt is for the system timer, it calls a special interrupt + handler for the system timer tick, which calls _frxt_timer_int then + clears its bit from the mask. This interrupt cannot be hooked by the + user-defined handler. + + Finally, the handler calls _frxt_int_exit to allow FreeRTOS to perform + any scheduling necessary and return either to the interrupted task + or another. + + If software prioritization is enabled, the handler will re-enable all + interrupts at the same level that are numerically higher than the current + one, before calling the user handler. This allows a higher priority + interrupt to pre-empt the lower priority handler. + +Medium Priority Interrupt Handlers: + + Medium priority interrupts are those at levels 2 up to XCHAL_EXCM_LEVEL, + a configuration-specific maximum interrupt level affected by the global + 'exception mode' bit in the processor status word (PS.EXCM). + Interrupt levels above XCHAL_EXCM_LEVEL are of the high-priority class. + The Xtensa hardware documentation considers medium priority interrupts + to be a special case of high-priority interrupts, but from a software + perspective they are very different. + + Dispatch of medium-priority interrupts is discussed in the section + above. + +High Priority Interrupt Handlers: + + High priority interrupts are those strictly above XCHAL_EXCM_LEVEL, + a configuration-specific maximum interrupt level affected by the + global 'exception mode' bit in the processor status word (PS.EXCM). + High priority handlers may not directly interact with FreeRTOS at all, + and are described here only for the sake of completeness. They must + be coded in assembler (may not be coded in C) and are intended to be + used for handling extremely high frequency hardware events that need + to be handled in only a few cycles. A high priority interrupt handler + may trigger a software interrupt at a medium or low priority level to + occasionally signal FreeRTOS. Please see Xtensa documentation. + + There is a separate vector and a few special registers for each high + priority interrupt, providing for fast dispatch and efficient nesting + on top of lower priority interrupts. Handlers are templates included + only for the vectors that exist in your Xtensa processor configuration. + These templates are written for only one interrupt per high priority + level to minimize latency servicing very fast time-critical interrupts. + The vector code jumps to the corresponding first-level interrupt handler, + which then executes application-provided assembler code before returning + quickly to the interrupted task or lower priority handler. + +Kernel Exception Handler: + + Kernel mode is not used in this port of FreeRTOS, and therefore kernel + exceptions should not happen. A stub is provided for the vector that + triggers the debugger (if connected) or calls _xt_panic to freeze the + processor should a kernel exception occur. + +Alloca Exception Handler: + + Alloca exceptions are generated by the 'movsp' instruction, which + is used only in the windowed ABI. Its purpose is to allocate some + space on top of the stack. Because the window hardware may have + spilled some registers to the 16 byte "base save" area below the + stack pointer, it is necessary to protect those values. The alloca + handler accomplishes this quickly without setting up an interrupt + frame or entering FreeRTOS, by emulating a register underflow and + re-executing 'movsp'. + +Syscall Exception Handler: + + Syscall exceptions are generated by a 'syscall' instruction. + The windowed ABI specifies that executing this instruction with + a value of zero in register a2 must spill any unsaved registers + in the windowed register file to their pre-determined locations + on the caller's stack. The handler does exactly that, and skips + over the 'syscall' instruction before returning to the caller. + If a2 is non-zero, the handler returns a2 == -1 to the caller. + +Co-Processor Exception Handler: + + A co-processor exception is generated when a task accesses a + co-processor that it does not "own". Ownership represents which + task's state is currently in the co-processor. Co-processors are + context-switched "lazily" (on demand) only when a non-owning task + uses a co-processor instruction, otherwise a task retains ownership + even when it is preempted from the main processor. The co-processor + exception handler performs the context-switch and manages ownership. + + Co-processors may not be used by any code outside the context of a + task. A co-processor exception triggered by code that is not part + of a running task is a fatal error and FreeRTOS for Xtensa will panic. + This restriction is intended to reduce the overhead of saving and + restoring co-processor state (which can be quite large) and in + particular remove that overhead from interrupt handlers. + +Debug Exception Handler: + + A debug exception is caused as a result of running code, such as by + a 'break' instruction or hardware breakpoints and watchpoints, or + as a result of an external debug interrupt, such as from an OCD based + debugger or multiprocessor debug events ("breakin/breakout"). If the + processor is running in OCD mode under control of an OCD-based debugger, + the trigger event immediately halts the processor and gives control to + the OCD debugger. Otherwise control is transferred to the debug vector. + The debug vector handler calls the simulator if running on the ISS, + which then takes control and interacts with any attached debugger. + If running on hardware and not in OCD mode, debug exceptions are not + expected, so the debug handler calls _xt_panic to freeze the processor. + +Double Exception Handler: + + A double exception is a general exception that happens while the + processor is in exception mode (PS.EXCM set), and thus indicates a + bug in kernel code. The double exception vector handler triggers + the debugger (if connected) or calls _xt_panic to freeze the + processor. + +Window Overflow and Underflow Exception Handlers: + + Window overflow and underflow handlers are required for use of the + windowed ABI. Each has its own dedicated vector and highly optimized + code that is independent of OS. See Xtensa documentation for details. + +Hooks for Dynamic Installation of Handlers: + + Optional hooks are provided in the user exception and low level + interrupt handler and all medium and high priority interrupt handlers, + to dynamically install a handler function (which may be coded in C, + unless in a high-priority interrupt handler). These hooks are enabled + and used by automatic regression tests, they are not part of a normal + FreeRTOS build. However an application is free to take advantage of + them. The interrupt/exception hooks are described in xtensa_rtos.h . + + It is recommended that the application not make use of these hooks, but + rather use xt_set_interrupt_handler() and xt_set_exception_handler() + to install application-specific handlers. This method is more convenient + and allows arguments to be passed to the handlers. Software prioritization + of interrupts works only with this method. See xtensa_api.h for details. + +Overlay Support + + Code overlays are currently not supported for FreeRTOS. This will be + supported in a future release. Make sure that the option XT_USE_OVLY is + never defined when building. + + +-End- + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_api.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_api.h new file mode 100644 index 0000000..0a627cc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_api.h @@ -0,0 +1,128 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Xtensa-specific API for RTOS ports. + */ + +#ifndef __XTENSA_API_H__ +#define __XTENSA_API_H__ + +#include + +#include "xtensa_context.h" + + +/* Typedef for C-callable interrupt handler function */ +typedef void (*xt_handler)(void *); + +/* Typedef for C-callable exception handler function */ +typedef void (*xt_exc_handler)(XtExcFrame *); + + +/* +------------------------------------------------------------------------------- + Call this function to set a handler for the specified exception. + + n - Exception number (type) + f - Handler function address, NULL to uninstall handler. + + The handler will be passed a pointer to the exception frame, which is created + on the stack of the thread that caused the exception. + + If the handler returns, the thread context will be restored and the faulting + instruction will be retried. Any values in the exception frame that are + modified by the handler will be restored as part of the context. For details + of the exception frame structure see xtensa_context.h. +------------------------------------------------------------------------------- +*/ +extern xt_exc_handler xt_set_exception_handler(int n, xt_exc_handler f); + + +/* +------------------------------------------------------------------------------- + Call this function to set a handler for the specified interrupt. + + n - Interrupt number. + f - Handler function address, NULL to uninstall handler. + arg - Argument to be passed to handler. +------------------------------------------------------------------------------- +*/ +extern xt_handler xt_set_interrupt_handler(int n, xt_handler f, void * arg); + + +/* +------------------------------------------------------------------------------- + Call this function to enable the specified interrupts. + + mask - Bit mask of interrupts to be enabled. + + Returns the previous state of the interrupt enables. +------------------------------------------------------------------------------- +*/ +extern unsigned int xt_ints_on(unsigned int mask); + + +/* +------------------------------------------------------------------------------- + Call this function to disable the specified interrupts. + + mask - Bit mask of interrupts to be disabled. + + Returns the previous state of the interrupt enables. +------------------------------------------------------------------------------- +*/ +extern unsigned int xt_ints_off(unsigned int mask); + + +/* +------------------------------------------------------------------------------- + Call this function to set the specified (s/w) interrupt. +------------------------------------------------------------------------------- +*/ +static inline void xt_set_intset(unsigned int arg) +{ + xthal_set_intset(arg); +} + + +/* +------------------------------------------------------------------------------- + Call this function to clear the specified (s/w or edge-triggered) + interrupt. +------------------------------------------------------------------------------- +*/ +static inline void xt_set_intclear(unsigned int arg) +{ + xthal_set_intclear(arg); +} + + +#endif /* __XTENSA_API_H__ */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_config.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_config.h new file mode 100644 index 0000000..c57903e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_config.h @@ -0,0 +1,188 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Configuration-specific information for Xtensa build. This file must be + * included in FreeRTOSConfig.h to properly set up the config-dependent + * parameters correctly. + * + * NOTE: To enable thread-safe C library support, XT_USE_THREAD_SAFE_CLIB must + * be defined to be > 0 somewhere above or on the command line. + */ + +#ifndef XTENSA_CONFIG_H +#define XTENSA_CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include /* required for XSHAL_CLIB */ + +#include "xtensa_context.h" + + +/*----------------------------------------------------------------------------- +* STACK REQUIREMENTS +* +* This section defines the minimum stack size, and the extra space required to +* be allocated for saving coprocessor state and/or C library state information +* (if thread safety is enabled for the C library). The sizes are in bytes. +* +* Stack sizes for individual tasks should be derived from these minima based on +* the maximum call depth of the task and the maximum level of interrupt nesting. +* A minimum stack size is defined by XT_STACK_MIN_SIZE. This minimum is based +* on the requirement for a task that calls nothing else but can be interrupted. +* This assumes that interrupt handlers do not call more than a few levels deep. +* If this is not true, i.e. one or more interrupt handlers make deep calls then +* the minimum must be increased. +* +* If the Xtensa processor configuration includes coprocessors, then space is +* allocated to save the coprocessor state on the stack. +* +* If thread safety is enabled for the C runtime library, (XT_USE_THREAD_SAFE_CLIB +* is defined) then space is allocated to save the C library context in the TCB. +* +* Allocating insufficient stack space is a common source of hard-to-find errors. +* During development, it is best to enable the FreeRTOS stack checking features. +* +* Usage: +* +* XT_USE_THREAD_SAFE_CLIB -- Define this to a nonzero value to enable thread-safe +* use of the C library. This will require extra stack +* space to be allocated for tasks that use the C library +* reentrant functions. See below for more information. +* +* NOTE: The Xtensa toolchain supports multiple C libraries and not all of them +* support thread safety. Check your core configuration to see which C library +* was chosen for your system. +* +* XT_STACK_MIN_SIZE -- The minimum stack size for any task. It is recommended +* that you do not use a stack smaller than this for any +* task. In case you want to use stacks smaller than this +* size, you must verify that the smaller size(s) will work +* under all operating conditions. +* +* XT_STACK_EXTRA -- The amount of extra stack space to allocate for a task +* that does not make C library reentrant calls. Add this +* to the amount of stack space required by the task itself. +* +* XT_STACK_EXTRA_CLIB -- The amount of space to allocate for C library state. +* +-----------------------------------------------------------------------------*/ + +/* Extra space required for interrupt/exception hooks. */ +#ifdef XT_INTEXC_HOOKS + #ifdef __XTENSA_CALL0_ABI__ + #define STK_INTEXC_EXTRA 0x200 + #else + #define STK_INTEXC_EXTRA 0x180 + #endif +#else + #define STK_INTEXC_EXTRA 0 +#endif + +/* Check C library thread safety support and compute size of C library save area. + For the supported libraries, we enable thread safety by default, and this can + be overridden from the compiler/make command line. */ +#if (XSHAL_CLIB == XTHAL_CLIB_NEWLIB) || (XSHAL_CLIB == XTHAL_CLIB_XCLIB) + #ifndef XT_USE_THREAD_SAFE_CLIB + #define XT_USE_THREAD_SAFE_CLIB 1 + #endif +#else + #define XT_USE_THREAD_SAFE_CLIB 0 +#endif + +#if XT_USE_THREAD_SAFE_CLIB > 0u + #if XSHAL_CLIB == XTHAL_CLIB_XCLIB + #define XT_HAVE_THREAD_SAFE_CLIB 1 + #if !defined __ASSEMBLER__ + #include + #define XT_CLIB_CONTEXT_AREA_SIZE ((sizeof(struct _reent) + 15) + (-16)) + #define XT_CLIB_GLOBAL_PTR _reent_ptr + #define _REENT_INIT_PTR _init_reent + #define _impure_ptr _reent_ptr + + void _reclaim_reent(void * ptr); + #endif + #elif XSHAL_CLIB == XTHAL_CLIB_NEWLIB + #define XT_HAVE_THREAD_SAFE_CLIB 1 + #if !defined __ASSEMBLER__ + #include + #define XT_CLIB_CONTEXT_AREA_SIZE ((sizeof(struct _reent) + 15) + (-16)) + #define XT_CLIB_GLOBAL_PTR _impure_ptr + #endif + #else + #define XT_HAVE_THREAD_SAFE_CLIB 0 + #error The selected C runtime library is not thread safe. + #endif +#else + #define XT_CLIB_CONTEXT_AREA_SIZE 0 +#endif + +/*------------------------------------------------------------------------------ + Extra size -- interrupt frame plus coprocessor save area plus hook space. + NOTE: Make sure XT_INTEXC_HOOKS is undefined unless you really need the hooks. +------------------------------------------------------------------------------*/ +#ifdef __XTENSA_CALL0_ABI__ + #define XT_XTRA_SIZE (XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x10 + XT_CP_SIZE) +#else + #define XT_XTRA_SIZE (XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x20 + XT_CP_SIZE) +#endif + +/*------------------------------------------------------------------------------ + Space allocated for user code -- function calls and local variables. + NOTE: This number can be adjusted to suit your needs. You must verify that the + amount of space you reserve is adequate for the worst-case conditions in your + application. + NOTE: The windowed ABI requires more stack, since space has to be reserved + for spilling register windows. +------------------------------------------------------------------------------*/ +#ifdef __XTENSA_CALL0_ABI__ + #define XT_USER_SIZE 0x200 +#else + #define XT_USER_SIZE 0x400 +#endif + +/* Minimum recommended stack size. */ +#define XT_STACK_MIN_SIZE ((XT_XTRA_SIZE + XT_USER_SIZE) / sizeof(unsigned char)) + +/* OS overhead with and without C library thread context. */ +#define XT_STACK_EXTRA (XT_XTRA_SIZE) +#define XT_STACK_EXTRA_CLIB (XT_XTRA_SIZE + XT_CLIB_CONTEXT_AREA_SIZE) + + +#ifdef __cplusplus +} +#endif + +#endif /* XTENSA_CONFIG_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.S new file mode 100644 index 0000000..d4f3759 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.S @@ -0,0 +1,631 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * XTENSA CONTEXT SAVE AND RESTORE ROUTINES + * + * Low-level Call0 functions for handling generic context save and restore of + * registers not specifically addressed by the interrupt vectors and handlers. + * Those registers (not handled by these functions) are PC, PS, A0, A1 (SP). + * Except for the calls to RTOS functions, this code is generic to Xtensa. + * + * Note that in Call0 ABI, interrupt handlers are expected to preserve the callee- + * save regs (A12-A15), which is always the case if the handlers are coded in C. + * However A12, A13 are made available as scratch registers for interrupt dispatch + * code, so are presumed saved anyway, and are always restored even in Call0 ABI. + * Only A14, A15 are truly handled as callee-save regs. + * + * Because Xtensa is a configurable architecture, this port supports all user + * generated configurations (except restrictions stated in the release notes). + * This is accomplished by conditional compilation using macros and functions + * defined in the Xtensa HAL (hardware adaptation layer) for your configuration. + * Only the processor state included in your configuration is saved and restored, + * including any processor state added by user configuration options or TIE. + */ + +/* Warn nicely if this file gets named with a lowercase .s instead of .S: */ +#define NOERROR # +NOERROR: .error "C preprocessor needed for this file: make sure its filename\ + ends in uppercase .S, or use xt-xcc's -x assembler-with-cpp option." + + +#include "xtensa_rtos.h" + +#ifdef XT_USE_OVLY +#include +#endif + + .text + .literal_position + +/******************************************************************************* + +_xt_context_save + + !! MUST BE CALLED ONLY BY 'CALL0' INSTRUCTION !! + +Saves all Xtensa processor state except PC, PS, A0, A1 (SP), A12, A13, in the +interrupt stack frame defined in xtensa_rtos.h. +Its counterpart is _xt_context_restore (which also restores A12, A13). + +Caller is expected to have saved PC, PS, A0, A1 (SP), A12, A13 in the frame. +This function preserves A12 & A13 in order to provide the caller with 2 scratch +regs that need not be saved over the call to this function. The choice of which +2 regs to provide is governed by xthal_window_spill_nw and xthal_save_extra_nw, +to avoid moving data more than necessary. Caller can assign regs accordingly. + +Entry Conditions: + A0 = Return address in caller. + A1 = Stack pointer of interrupted thread or handler ("interruptee"). + Original A12, A13 have already been saved in the interrupt stack frame. + Other processor state except PC, PS, A0, A1 (SP), A12, A13, is as at the + point of interruption. + If windowed ABI, PS.EXCM = 1 (exceptions disabled). + +Exit conditions: + A0 = Return address in caller. + A1 = Stack pointer of interrupted thread or handler ("interruptee"). + A12, A13 as at entry (preserved). + If windowed ABI, PS.EXCM = 1 (exceptions disabled). + +*******************************************************************************/ + + .global _xt_context_save + .type _xt_context_save,@function + .align 4 +_xt_context_save: + + s32i a2, sp, XT_STK_A2 + s32i a3, sp, XT_STK_A3 + s32i a4, sp, XT_STK_A4 + s32i a5, sp, XT_STK_A5 + s32i a6, sp, XT_STK_A6 + s32i a7, sp, XT_STK_A7 + s32i a8, sp, XT_STK_A8 + s32i a9, sp, XT_STK_A9 + s32i a10, sp, XT_STK_A10 + s32i a11, sp, XT_STK_A11 + + /* + Call0 ABI callee-saved regs a12-15 do not need to be saved here. + a12-13 are the caller's responsibility so it can use them as scratch. + So only need to save a14-a15 here for Windowed ABI (not Call0). + */ + #ifndef __XTENSA_CALL0_ABI__ + s32i a14, sp, XT_STK_A14 + s32i a15, sp, XT_STK_A15 + #endif + + rsr a3, SAR + s32i a3, sp, XT_STK_SAR + + #if XCHAL_HAVE_LOOPS + rsr a3, LBEG + s32i a3, sp, XT_STK_LBEG + rsr a3, LEND + s32i a3, sp, XT_STK_LEND + rsr a3, LCOUNT + s32i a3, sp, XT_STK_LCOUNT + #endif + + #if XT_USE_SWPRI + /* Save virtual priority mask */ + movi a3, _xt_vpri_mask + l32i a3, a3, 0 + s32i a3, sp, XT_STK_VPRI + #endif + + #if XCHAL_EXTRA_SA_SIZE > 0 || !defined(__XTENSA_CALL0_ABI__) + mov a9, a0 /* preserve ret addr */ + #endif + + #ifndef __XTENSA_CALL0_ABI__ + /* + To spill the reg windows, temp. need pre-interrupt stack ptr and a4-15. + Need to save a9,12,13 temporarily (in frame temps) and recover originals. + Interrupts need to be disabled below XCHAL_EXCM_LEVEL and window overflow + and underflow exceptions disabled (assured by PS.EXCM == 1). + */ + s32i a12, sp, XT_STK_TMP0 /* temp. save stuff in stack frame */ + s32i a13, sp, XT_STK_TMP1 + s32i a9, sp, XT_STK_TMP2 + + /* + Save the overlay state if we are supporting overlays. Since we just saved + three registers, we can conveniently use them here. Note that as of now, + overlays only work for windowed calling ABI. + */ + #ifdef XT_USE_OVLY + l32i a9, sp, XT_STK_PC /* recover saved PC */ + _xt_overlay_get_state a9, a12, a13 + s32i a9, sp, XT_STK_OVLY /* save overlay state */ + #endif + + l32i a12, sp, XT_STK_A12 /* recover original a9,12,13 */ + l32i a13, sp, XT_STK_A13 + l32i a9, sp, XT_STK_A9 + addi sp, sp, XT_STK_FRMSZ /* restore the interruptee's SP */ + call0 xthal_window_spill_nw /* preserves only a4,5,8,9,12,13 */ + addi sp, sp, -XT_STK_FRMSZ + l32i a12, sp, XT_STK_TMP0 /* recover stuff from stack frame */ + l32i a13, sp, XT_STK_TMP1 + l32i a9, sp, XT_STK_TMP2 + #endif + + #if XCHAL_EXTRA_SA_SIZE > 0 + /* + NOTE: Normally the xthal_save_extra_nw macro only affects address + registers a2-a5. It is theoretically possible for Xtensa processor + designers to write TIE that causes more address registers to be + affected, but it is generally unlikely. If that ever happens, + more registers need to be saved/restored around this macro invocation. + Here we assume a9,12,13 are preserved. + Future Xtensa tools releases might limit the regs that can be affected. + */ + addi a2, sp, XT_STK_EXTRA /* where to save it */ + # if XCHAL_EXTRA_SA_ALIGN > 16 + movi a3, -XCHAL_EXTRA_SA_ALIGN + and a2, a2, a3 /* align dynamically >16 bytes */ + # endif + call0 xthal_save_extra_nw /* destroys a0,2,3,4,5 */ + #endif + + #if XCHAL_EXTRA_SA_SIZE > 0 || !defined(__XTENSA_CALL0_ABI__) + mov a0, a9 /* retrieve ret addr */ + #endif + + ret + +/******************************************************************************* + +_xt_context_restore + + !! MUST BE CALLED ONLY BY 'CALL0' INSTRUCTION !! + +Restores all Xtensa processor state except PC, PS, A0, A1 (SP) (and in Call0 +ABI, A14, A15 which are preserved by all interrupt handlers) from an interrupt +stack frame defined in xtensa_rtos.h . +Its counterpart is _xt_context_save (whose caller saved A12, A13). + +Caller is responsible to restore PC, PS, A0, A1 (SP). + +Entry Conditions: + A0 = Return address in caller. + A1 = Stack pointer of interrupted thread or handler ("interruptee"). + +Exit conditions: + A0 = Return address in caller. + A1 = Stack pointer of interrupted thread or handler ("interruptee"). + Other processor state except PC, PS, A0, A1 (SP), is as at the point + of interruption. + +*******************************************************************************/ + + .global _xt_context_restore + .type _xt_context_restore,@function + .align 4 +_xt_context_restore: + + #if XCHAL_EXTRA_SA_SIZE > 0 + /* + NOTE: Normally the xthal_restore_extra_nw macro only affects address + registers a2-a5. It is theoretically possible for Xtensa processor + designers to write TIE that causes more address registers to be + affected, but it is generally unlikely. If that ever happens, + more registers need to be saved/restored around this macro invocation. + Here we only assume a13 is preserved. + Future Xtensa tools releases might limit the regs that can be affected. + */ + mov a13, a0 /* preserve ret addr */ + addi a2, sp, XT_STK_EXTRA /* where to find it */ + # if XCHAL_EXTRA_SA_ALIGN > 16 + movi a3, -XCHAL_EXTRA_SA_ALIGN + and a2, a2, a3 /* align dynamically >16 bytes */ + # endif + call0 xthal_restore_extra_nw /* destroys a0,2,3,4,5 */ + mov a0, a13 /* retrieve ret addr */ + #endif + + #if XCHAL_HAVE_LOOPS + l32i a2, sp, XT_STK_LBEG + l32i a3, sp, XT_STK_LEND + wsr a2, LBEG + l32i a2, sp, XT_STK_LCOUNT + wsr a3, LEND + wsr a2, LCOUNT + #endif + + #ifdef XT_USE_OVLY + /* + If we are using overlays, this is a good spot to check if we need + to restore an overlay for the incoming task. Here we have a bunch + of registers to spare. Note that this step is going to use a few + bytes of storage below SP (SP-20 to SP-32) if an overlay is going + to be restored. + */ + l32i a2, sp, XT_STK_PC /* retrieve PC */ + l32i a3, sp, XT_STK_PS /* retrieve PS */ + l32i a4, sp, XT_STK_OVLY /* retrieve overlay state */ + l32i a5, sp, XT_STK_A1 /* retrieve stack ptr */ + _xt_overlay_check_map a2, a3, a4, a5, a6 + s32i a2, sp, XT_STK_PC /* save updated PC */ + s32i a3, sp, XT_STK_PS /* save updated PS */ + #endif + + #ifdef XT_USE_SWPRI + /* Restore virtual interrupt priority and interrupt enable */ + movi a3, _xt_intdata + l32i a4, a3, 0 /* a4 = _xt_intenable */ + l32i a5, sp, XT_STK_VPRI /* a5 = saved _xt_vpri_mask */ + and a4, a4, a5 + wsr a4, INTENABLE /* update INTENABLE */ + s32i a5, a3, 4 /* restore _xt_vpri_mask */ + #endif + + l32i a3, sp, XT_STK_SAR + l32i a2, sp, XT_STK_A2 + wsr a3, SAR + l32i a3, sp, XT_STK_A3 + l32i a4, sp, XT_STK_A4 + l32i a5, sp, XT_STK_A5 + l32i a6, sp, XT_STK_A6 + l32i a7, sp, XT_STK_A7 + l32i a8, sp, XT_STK_A8 + l32i a9, sp, XT_STK_A9 + l32i a10, sp, XT_STK_A10 + l32i a11, sp, XT_STK_A11 + + /* + Call0 ABI callee-saved regs a12-15 do not need to be restored here. + However a12-13 were saved for scratch before XT_RTOS_INT_ENTER(), + so need to be restored anyway, despite being callee-saved in Call0. + */ + l32i a12, sp, XT_STK_A12 + l32i a13, sp, XT_STK_A13 + #ifndef __XTENSA_CALL0_ABI__ + l32i a14, sp, XT_STK_A14 + l32i a15, sp, XT_STK_A15 + #endif + + ret + + +/******************************************************************************* + +_xt_coproc_init + +Initializes global co-processor management data, setting all co-processors +to "unowned". Leaves CPENABLE as it found it (does NOT clear it). + +Called during initialization of the RTOS, before any threads run. + +This may be called from normal Xtensa single-threaded application code which +might use co-processors. The Xtensa run-time initialization enables all +co-processors. They must remain enabled here, else a co-processor exception +might occur outside of a thread, which the exception handler doesn't expect. + +Entry Conditions: + Xtensa single-threaded run-time environment is in effect. + No thread is yet running. + +Exit conditions: + None. + +Obeys ABI conventions per prototype: + void _xt_coproc_init(void) + +*******************************************************************************/ + +#if XCHAL_CP_NUM > 0 + + .global _xt_coproc_init + .type _xt_coproc_init,@function + .align 4 +_xt_coproc_init: + ENTRY0 + + /* Initialize thread co-processor ownerships to 0 (unowned). */ + movi a2, _xt_coproc_owner_sa /* a2 = base of owner array */ + addi a3, a2, XCHAL_CP_MAX << 2 /* a3 = top+1 of owner array */ + movi a4, 0 /* a4 = 0 (unowned) */ +1: s32i a4, a2, 0 + addi a2, a2, 4 + bltu a2, a3, 1b + + RET0 + +#endif + + +/******************************************************************************* + +_xt_coproc_release + +Releases any and all co-processors owned by a given thread. The thread is +identified by it's co-processor state save area defined in xtensa_context.h . + +Must be called before a thread's co-proc save area is deleted to avoid +memory corruption when the exception handler tries to save the state. +May be called when a thread terminates or completes but does not delete +the co-proc save area, to avoid the exception handler having to save the +thread's co-proc state before another thread can use it (optimization). + +Entry Conditions: + A2 = Pointer to base of co-processor state save area. + +Exit conditions: + None. + +Obeys ABI conventions per prototype: + void _xt_coproc_release(void * coproc_sa_base) + +*******************************************************************************/ + +#if XCHAL_CP_NUM > 0 + + .global _xt_coproc_release + .type _xt_coproc_release,@function + .align 4 +_xt_coproc_release: + ENTRY0 /* a2 = base of save area */ + + movi a3, _xt_coproc_owner_sa /* a3 = base of owner array */ + addi a4, a3, XCHAL_CP_MAX << 2 /* a4 = top+1 of owner array */ + movi a5, 0 /* a5 = 0 (unowned) */ + + rsil a6, XCHAL_EXCM_LEVEL /* lock interrupts */ + +1: l32i a7, a3, 0 /* a7 = owner at a3 */ + bne a2, a7, 2f /* if (coproc_sa_base == owner) */ + s32i a5, a3, 0 /* owner = unowned */ +2: addi a3, a3, 1<<2 /* a3 = next entry in owner array */ + bltu a3, a4, 1b /* repeat until end of array */ + +3: wsr a6, PS /* restore interrupts */ + + RET0 + +#endif + + +/******************************************************************************* +_xt_coproc_savecs + +If there is a current thread and it has a coprocessor state save area, then +save all callee-saved state into this area. This function is called from the +solicited context switch handler. It calls a system-specific function to get +the coprocessor save area base address. + +Entry conditions: + - The thread being switched out is still the current thread. + - CPENABLE state reflects which coprocessors are active. + - Registers have been saved/spilled already. + +Exit conditions: + - All necessary CP callee-saved state has been saved. + - Registers a2-a7, a13-a15 have been trashed. + +Must be called from assembly code only, using CALL0. +*******************************************************************************/ +#if XCHAL_CP_NUM > 0 + + .extern _xt_coproc_sa_offset /* external reference */ + + .global _xt_coproc_savecs + .type _xt_coproc_savecs,@function + .align 4 +_xt_coproc_savecs: + + /* At entry, CPENABLE should be showing which CPs are enabled. */ + + rsr a2, CPENABLE /* a2 = which CPs are enabled */ + beqz a2, .Ldone /* quick exit if none */ + mov a14, a0 /* save return address */ + call0 XT_RTOS_CP_STATE /* get address of CP save area */ + mov a0, a14 /* restore return address */ + beqz a15, .Ldone /* if none then nothing to do */ + s16i a2, a15, XT_CP_CS_ST /* save mask of CPs being stored */ + movi a13, _xt_coproc_sa_offset /* array of CP save offsets */ + l32i a15, a15, XT_CP_ASA /* a15 = base of aligned save area */ + +#if XCHAL_CP0_SA_SIZE + bbci.l a2, 0, 2f /* CP 0 not enabled */ + l32i a14, a13, 0 /* a14 = _xt_coproc_sa_offset[0] */ + add a3, a14, a15 /* a3 = save area for CP 0 */ + xchal_cp0_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP1_SA_SIZE + bbci.l a2, 1, 2f /* CP 1 not enabled */ + l32i a14, a13, 4 /* a14 = _xt_coproc_sa_offset[1] */ + add a3, a14, a15 /* a3 = save area for CP 1 */ + xchal_cp1_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP2_SA_SIZE + bbci.l a2, 2, 2f + l32i a14, a13, 8 + add a3, a14, a15 + xchal_cp2_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP3_SA_SIZE + bbci.l a2, 3, 2f + l32i a14, a13, 12 + add a3, a14, a15 + xchal_cp3_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP4_SA_SIZE + bbci.l a2, 4, 2f + l32i a14, a13, 16 + add a3, a14, a15 + xchal_cp4_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP5_SA_SIZE + bbci.l a2, 5, 2f + l32i a14, a13, 20 + add a3, a14, a15 + xchal_cp5_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP6_SA_SIZE + bbci.l a2, 6, 2f + l32i a14, a13, 24 + add a3, a14, a15 + xchal_cp6_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP7_SA_SIZE + bbci.l a2, 7, 2f + l32i a14, a13, 28 + add a3, a14, a15 + xchal_cp7_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +.Ldone: + ret +#endif + + +/******************************************************************************* +_xt_coproc_restorecs + +Restore any callee-saved coprocessor state for the incoming thread. +This function is called from coprocessor exception handling, when giving +ownership to a thread that solicited a context switch earlier. It calls a +system-specific function to get the coprocessor save area base address. + +Entry conditions: + - The incoming thread is set as the current thread. + - CPENABLE is set up correctly for all required coprocessors. + - a2 = mask of coprocessors to be restored. + +Exit conditions: + - All necessary CP callee-saved state has been restored. + - CPENABLE - unchanged. + - Registers a2-a7, a13-a15 have been trashed. + +Must be called from assembly code only, using CALL0. +*******************************************************************************/ +#if XCHAL_CP_NUM > 0 + + .global _xt_coproc_restorecs + .type _xt_coproc_restorecs,@function + .align 4 +_xt_coproc_restorecs: + + mov a14, a0 /* save return address */ + call0 XT_RTOS_CP_STATE /* get address of CP save area */ + mov a0, a14 /* restore return address */ + beqz a15, .Ldone2 /* if none then nothing to do */ + l16ui a3, a15, XT_CP_CS_ST /* a3 = which CPs have been saved */ + xor a3, a3, a2 /* clear the ones being restored */ + s32i a3, a15, XT_CP_CS_ST /* update saved CP mask */ + movi a13, _xt_coproc_sa_offset /* array of CP save offsets */ + l32i a15, a15, XT_CP_ASA /* a15 = base of aligned save area */ + +#if XCHAL_CP0_SA_SIZE + bbci.l a2, 0, 2f /* CP 0 not enabled */ + l32i a14, a13, 0 /* a14 = _xt_coproc_sa_offset[0] */ + add a3, a14, a15 /* a3 = save area for CP 0 */ + xchal_cp0_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP1_SA_SIZE + bbci.l a2, 1, 2f /* CP 1 not enabled */ + l32i a14, a13, 4 /* a14 = _xt_coproc_sa_offset[1] */ + add a3, a14, a15 /* a3 = save area for CP 1 */ + xchal_cp1_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP2_SA_SIZE + bbci.l a2, 2, 2f + l32i a14, a13, 8 + add a3, a14, a15 + xchal_cp2_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP3_SA_SIZE + bbci.l a2, 3, 2f + l32i a14, a13, 12 + add a3, a14, a15 + xchal_cp3_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP4_SA_SIZE + bbci.l a2, 4, 2f + l32i a14, a13, 16 + add a3, a14, a15 + xchal_cp4_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP5_SA_SIZE + bbci.l a2, 5, 2f + l32i a14, a13, 20 + add a3, a14, a15 + xchal_cp5_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP6_SA_SIZE + bbci.l a2, 6, 2f + l32i a14, a13, 24 + add a3, a14, a15 + xchal_cp6_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +#if XCHAL_CP7_SA_SIZE + bbci.l a2, 7, 2f + l32i a14, a13, 28 + add a3, a14, a15 + xchal_cp7_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL +2: +#endif + +.Ldone2: + ret + +#endif + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.h new file mode 100644 index 0000000..46fbaaa --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.h @@ -0,0 +1,356 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * XTENSA CONTEXT FRAMES AND MACROS FOR RTOS ASSEMBLER SOURCES + * + * This header contains definitions and macros for use primarily by Xtensa + * RTOS assembly coded source files. It includes and uses the Xtensa hardware + * abstraction layer (HAL) to deal with config specifics. It may also be + * included in C source files. + * + * !! Supports only Xtensa Exception Architecture 2 (XEA2). XEA1 not supported. !! + * + * NOTE: The Xtensa architecture requires stack pointer alignment to 16 bytes. + */ + +#ifndef XTENSA_CONTEXT_H +#define XTENSA_CONTEXT_H + +#ifdef __ASSEMBLER__ +#include +#endif + +#include +#include +#include + + +/* Align a value up to nearest n-byte boundary, where n is a power of 2. */ +#define ALIGNUP(n, val) (((val) + (n)-1) & -(n)) + + +/* +------------------------------------------------------------------------------- + Macros that help define structures for both C and assembler. +------------------------------------------------------------------------------- +*/ +#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__) + +#define STRUCT_BEGIN .pushsection .text; .struct 0 +#define STRUCT_FIELD(ctype,size,asname,name) asname: .space size +#define STRUCT_AFIELD(ctype,size,asname,name,n) asname: .space (size)*(n) +#define STRUCT_END(sname) sname##Size:; .popsection + +#else + +#define STRUCT_BEGIN typedef struct { +#define STRUCT_FIELD(ctype,size,asname,name) ctype name; +#define STRUCT_AFIELD(ctype,size,asname,name,n) ctype name[n]; +#define STRUCT_END(sname) } sname; + +#endif //_ASMLANGUAGE || __ASSEMBLER__ + + +/* +------------------------------------------------------------------------------- + INTERRUPT/EXCEPTION STACK FRAME FOR A THREAD OR NESTED INTERRUPT + + A stack frame of this structure is allocated for any interrupt or exception. + It goes on the current stack. If the RTOS has a system stack for handling + interrupts, every thread stack must allow space for just one interrupt stack + frame, then nested interrupt stack frames go on the system stack. + + The frame includes basic registers (explicit) and "extra" registers introduced + by user TIE or the use of the MAC16 option in the user's Xtensa config. + The frame size is minimized by omitting regs not applicable to user's config. + + For Windowed ABI, this stack frame includes the interruptee's base save area, + another base save area to manage gcc nested functions, and a little temporary + space to help manage the spilling of the register windows. +------------------------------------------------------------------------------- +*/ + +STRUCT_BEGIN +STRUCT_FIELD (long, 4, XT_STK_EXIT, exit) /* exit point for dispatch */ +STRUCT_FIELD (long, 4, XT_STK_PC, pc) /* return PC */ +STRUCT_FIELD (long, 4, XT_STK_PS, ps) /* return PS */ +STRUCT_FIELD (long, 4, XT_STK_A0, a0) +STRUCT_FIELD (long, 4, XT_STK_A1, a1) /* stack pointer before interrupt */ +STRUCT_FIELD (long, 4, XT_STK_A2, a2) +STRUCT_FIELD (long, 4, XT_STK_A3, a3) +STRUCT_FIELD (long, 4, XT_STK_A4, a4) +STRUCT_FIELD (long, 4, XT_STK_A5, a5) +STRUCT_FIELD (long, 4, XT_STK_A6, a6) +STRUCT_FIELD (long, 4, XT_STK_A7, a7) +STRUCT_FIELD (long, 4, XT_STK_A8, a8) +STRUCT_FIELD (long, 4, XT_STK_A9, a9) +STRUCT_FIELD (long, 4, XT_STK_A10, a10) +STRUCT_FIELD (long, 4, XT_STK_A11, a11) +STRUCT_FIELD (long, 4, XT_STK_A12, a12) +STRUCT_FIELD (long, 4, XT_STK_A13, a13) +STRUCT_FIELD (long, 4, XT_STK_A14, a14) +STRUCT_FIELD (long, 4, XT_STK_A15, a15) +STRUCT_FIELD (long, 4, XT_STK_SAR, sar) +STRUCT_FIELD (long, 4, XT_STK_EXCCAUSE, exccause) +STRUCT_FIELD (long, 4, XT_STK_EXCVADDR, excvaddr) +#if XCHAL_HAVE_LOOPS +STRUCT_FIELD (long, 4, XT_STK_LBEG, lbeg) +STRUCT_FIELD (long, 4, XT_STK_LEND, lend) +STRUCT_FIELD (long, 4, XT_STK_LCOUNT, lcount) +#endif +#ifndef __XTENSA_CALL0_ABI__ +/* Temporary space for saving stuff during window spill */ +STRUCT_FIELD (long, 4, XT_STK_TMP0, tmp0) +STRUCT_FIELD (long, 4, XT_STK_TMP1, tmp1) +STRUCT_FIELD (long, 4, XT_STK_TMP2, tmp2) +#endif +#ifdef XT_USE_SWPRI +/* Storage for virtual priority mask */ +STRUCT_FIELD (long, 4, XT_STK_VPRI, vpri) +#endif +#ifdef XT_USE_OVLY +/* Storage for overlay state */ +STRUCT_FIELD (long, 4, XT_STK_OVLY, ovly) +#endif +STRUCT_END(XtExcFrame) + +#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__) +#define XT_STK_NEXT1 XtExcFrameSize +#else +#define XT_STK_NEXT1 sizeof(XtExcFrame) +#endif + +/* Allocate extra storage if needed */ +#if XCHAL_EXTRA_SA_SIZE != 0 + +#if XCHAL_EXTRA_SA_ALIGN <= 16 +#define XT_STK_EXTRA ALIGNUP(XCHAL_EXTRA_SA_ALIGN, XT_STK_NEXT1) +#else +/* If need more alignment than stack, add space for dynamic alignment */ +#define XT_STK_EXTRA (ALIGNUP(XCHAL_EXTRA_SA_ALIGN, XT_STK_NEXT1) + XCHAL_EXTRA_SA_ALIGN) +#endif +#define XT_STK_NEXT2 (XT_STK_EXTRA + XCHAL_EXTRA_SA_SIZE) + +#else + +#define XT_STK_NEXT2 XT_STK_NEXT1 + +#endif + +/* +------------------------------------------------------------------------------- + This is the frame size. Add space for 4 registers (interruptee's base save + area) and some space for gcc nested functions if any. +------------------------------------------------------------------------------- +*/ +#define XT_STK_FRMSZ (ALIGNUP(0x10, XT_STK_NEXT2) + 0x20) + + +/* +------------------------------------------------------------------------------- + SOLICITED STACK FRAME FOR A THREAD + + A stack frame of this structure is allocated whenever a thread enters the + RTOS kernel intentionally (and synchronously) to submit to thread scheduling. + It goes on the current thread's stack. + + The solicited frame only includes registers that are required to be preserved + by the callee according to the compiler's ABI conventions, some space to save + the return address for returning to the caller, and the caller's PS register. + + For Windowed ABI, this stack frame includes the caller's base save area. + + Note on XT_SOL_EXIT field: + It is necessary to distinguish a solicited from an interrupt stack frame. + This field corresponds to XT_STK_EXIT in the interrupt stack frame and is + always at the same offset (0). It can be written with a code (usually 0) + to distinguish a solicted frame from an interrupt frame. An RTOS port may + opt to ignore this field if it has another way of distinguishing frames. +------------------------------------------------------------------------------- +*/ + +STRUCT_BEGIN +#ifdef __XTENSA_CALL0_ABI__ +STRUCT_FIELD (long, 4, XT_SOL_EXIT, exit) +STRUCT_FIELD (long, 4, XT_SOL_PC, pc) +STRUCT_FIELD (long, 4, XT_SOL_PS, ps) +STRUCT_FIELD (long, 4, XT_SOL_NEXT, next) +STRUCT_FIELD (long, 4, XT_SOL_A12, a12) /* should be on 16-byte alignment */ +STRUCT_FIELD (long, 4, XT_SOL_A13, a13) +STRUCT_FIELD (long, 4, XT_SOL_A14, a14) +STRUCT_FIELD (long, 4, XT_SOL_A15, a15) +#else +STRUCT_FIELD (long, 4, XT_SOL_EXIT, exit) +STRUCT_FIELD (long, 4, XT_SOL_PC, pc) +STRUCT_FIELD (long, 4, XT_SOL_PS, ps) +STRUCT_FIELD (long, 4, XT_SOL_NEXT, next) +STRUCT_FIELD (long, 4, XT_SOL_A0, a0) /* should be on 16-byte alignment */ +STRUCT_FIELD (long, 4, XT_SOL_A1, a1) +STRUCT_FIELD (long, 4, XT_SOL_A2, a2) +STRUCT_FIELD (long, 4, XT_SOL_A3, a3) +#endif +STRUCT_END(XtSolFrame) + +/* Size of solicited stack frame */ +#define XT_SOL_FRMSZ ALIGNUP(0x10, XtSolFrameSize) + + +/* +------------------------------------------------------------------------------- + CO-PROCESSOR STATE SAVE AREA FOR A THREAD + + The RTOS must provide an area per thread to save the state of co-processors + when that thread does not have control. Co-processors are context-switched + lazily (on demand) only when a new thread uses a co-processor instruction, + otherwise a thread retains ownership of the co-processor even when it loses + control of the processor. An Xtensa co-processor exception is triggered when + any co-processor instruction is executed by a thread that is not the owner, + and the context switch of that co-processor is then peformed by the handler. + Ownership represents which thread's state is currently in the co-processor. + + Co-processors may not be used by interrupt or exception handlers. If an + co-processor instruction is executed by an interrupt or exception handler, + the co-processor exception handler will trigger a kernel panic and freeze. + This restriction is introduced to reduce the overhead of saving and restoring + co-processor state (which can be quite large) and in particular remove that + overhead from interrupt handlers. + + The co-processor state save area may be in any convenient per-thread location + such as in the thread control block or above the thread stack area. It need + not be in the interrupt stack frame since interrupts don't use co-processors. + + Along with the save area for each co-processor, two bitmasks with flags per + co-processor (laid out as in the CPENABLE reg) help manage context-switching + co-processors as efficiently as possible: + + XT_CPENABLE + The contents of a non-running thread's CPENABLE register. + It represents the co-processors owned (and whose state is still needed) + by the thread. When a thread is preempted, its CPENABLE is saved here. + When a thread solicits a context-swtich, its CPENABLE is cleared - the + compiler has saved the (caller-saved) co-proc state if it needs to. + When a non-running thread loses ownership of a CP, its bit is cleared. + When a thread runs, it's XT_CPENABLE is loaded into the CPENABLE reg. + Avoids co-processor exceptions when no change of ownership is needed. + + XT_CPSTORED + A bitmask with the same layout as CPENABLE, a bit per co-processor. + Indicates whether the state of each co-processor is saved in the state + save area. When a thread enters the kernel, only the state of co-procs + still enabled in CPENABLE is saved. When the co-processor exception + handler assigns ownership of a co-processor to a thread, it restores + the saved state only if this bit is set, and clears this bit. + + XT_CP_CS_ST + A bitmask with the same layout as CPENABLE, a bit per co-processor. + Indicates whether callee-saved state is saved in the state save area. + Callee-saved state is saved by itself on a solicited context switch, + and restored when needed by the coprocessor exception handler. + Unsolicited switches will cause the entire coprocessor to be saved + when necessary. + + XT_CP_ASA + Pointer to the aligned save area. Allows it to be aligned more than + the overall save area (which might only be stack-aligned or TCB-aligned). + Especially relevant for Xtensa cores configured with a very large data + path that requires alignment greater than 16 bytes (ABI stack alignment). +------------------------------------------------------------------------------- +*/ + +#if XCHAL_CP_NUM > 0 + +/* Offsets of each coprocessor save area within the 'aligned save area': */ +#define XT_CP0_SA 0 +#define XT_CP1_SA ALIGNUP(XCHAL_CP1_SA_ALIGN, XT_CP0_SA + XCHAL_CP0_SA_SIZE) +#define XT_CP2_SA ALIGNUP(XCHAL_CP2_SA_ALIGN, XT_CP1_SA + XCHAL_CP1_SA_SIZE) +#define XT_CP3_SA ALIGNUP(XCHAL_CP3_SA_ALIGN, XT_CP2_SA + XCHAL_CP2_SA_SIZE) +#define XT_CP4_SA ALIGNUP(XCHAL_CP4_SA_ALIGN, XT_CP3_SA + XCHAL_CP3_SA_SIZE) +#define XT_CP5_SA ALIGNUP(XCHAL_CP5_SA_ALIGN, XT_CP4_SA + XCHAL_CP4_SA_SIZE) +#define XT_CP6_SA ALIGNUP(XCHAL_CP6_SA_ALIGN, XT_CP5_SA + XCHAL_CP5_SA_SIZE) +#define XT_CP7_SA ALIGNUP(XCHAL_CP7_SA_ALIGN, XT_CP6_SA + XCHAL_CP6_SA_SIZE) +#define XT_CP_SA_SIZE ALIGNUP(16, XT_CP7_SA + XCHAL_CP7_SA_SIZE) + +/* Offsets within the overall save area: */ +#define XT_CPENABLE 0 /* (2 bytes) coprocessors active for this thread */ +#define XT_CPSTORED 2 /* (2 bytes) coprocessors saved for this thread */ +#define XT_CP_CS_ST 4 /* (2 bytes) coprocessor callee-saved regs stored for this thread */ +#define XT_CP_ASA 8 /* (4 bytes) ptr to aligned save area */ +/* Overall size allows for dynamic alignment: */ +#define XT_CP_SIZE (12 + XT_CP_SA_SIZE + XCHAL_TOTAL_SA_ALIGN) +#else +#define XT_CP_SIZE 0 +#endif + + +/* +------------------------------------------------------------------------------- + MACROS TO HANDLE ABI SPECIFICS OF FUNCTION ENTRY AND RETURN + + Convenient where the frame size requirements are the same for both ABIs. + ENTRY(sz), RET(sz) are for framed functions (have locals or make calls). + ENTRY0, RET0 are for frameless functions (no locals, no calls). + + where size = size of stack frame in bytes (must be >0 and aligned to 16). + For framed functions the frame is created and the return address saved at + base of frame (Call0 ABI) or as determined by hardware (Windowed ABI). + For frameless functions, there is no frame and return address remains in a0. + Note: Because CPP macros expand to a single line, macros requiring multi-line + expansions are implemented as assembler macros. +------------------------------------------------------------------------------- +*/ + +#ifdef __ASSEMBLER__ +#ifdef __XTENSA_CALL0_ABI__ + /* Call0 */ + #define ENTRY(sz) entry1 sz + .macro entry1 size=0x10 + addi sp, sp, -\size + s32i a0, sp, 0 + .endm + #define ENTRY0 + #define RET(sz) ret1 sz + .macro ret1 size=0x10 + l32i a0, sp, 0 + addi sp, sp, \size + ret + .endm + #define RET0 ret +#else + /* Windowed */ + #define ENTRY(sz) entry sp, sz + #define ENTRY0 entry sp, 0x10 + #define RET(sz) retw + #define RET0 retw +#endif +#endif + + +#endif /* XTENSA_CONTEXT_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_init.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_init.c new file mode 100644 index 0000000..3113f48 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_init.c @@ -0,0 +1,71 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * XTENSA INITIALIZATION ROUTINES CODED IN C + * + * This file contains miscellaneous Xtensa RTOS-generic initialization functions + * that are implemented in C. + */ + + +#ifdef XT_BOARD +#include +#endif + +#include "xtensa_rtos.h" + +#ifdef XT_RTOS_TIMER_INT + +unsigned _xt_tick_divisor = 0; /* cached number of cycles per tick */ + +/* +Compute and initialize at run-time the tick divisor (the number of +processor clock cycles in an RTOS tick, used to set the tick timer). +Called when the processor clock frequency is not known at compile-time. +*/ +void _xt_tick_divisor_init(void) +{ +#ifdef XT_CLOCK_FREQ + + _xt_tick_divisor = (XT_CLOCK_FREQ / XT_TICK_PER_SEC); + +#else + + #ifdef XT_BOARD + _xt_tick_divisor = xtbsp_clock_freq_hz() / XT_TICK_PER_SEC; + #else + #error "No way to obtain processor clock frequency" + #endif /* XT_BOARD */ + +#endif /* XT_CLOCK_FREQ */ +} + +#endif /* XT_RTOS_TIMER_INT */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c new file mode 100644 index 0000000..7f19dd7 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c @@ -0,0 +1,138 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Xtensa-specific interrupt and exception functions for RTOS ports. + * Also see xtensa_intr_asm.S. + */ + +#include + +#include + +#include "xtensa_api.h" + + +#if XCHAL_HAVE_EXCEPTIONS + +/* Handler table is in xtensa_intr_asm.S */ + +extern xt_exc_handler _xt_exception_table[XCHAL_EXCCAUSE_NUM]; + + +/* + Default handler for unhandled exceptions. +*/ +void xt_unhandled_exception(XtExcFrame *frame) +{ + exit(-1); +} + + +/* + This function registers a handler for the specified exception. + The function returns the address of the previous handler. + On error, it returns 0. +*/ +xt_exc_handler xt_set_exception_handler(int n, xt_exc_handler f) +{ + xt_exc_handler old; + + if( n < 0 || n >= XCHAL_EXCCAUSE_NUM ) + return 0; /* invalid exception number */ + + old = _xt_exception_table[n]; + + if (f) { + _xt_exception_table[n] = f; + } + else { + _xt_exception_table[n] = &xt_unhandled_exception; + } + + return ((old == &xt_unhandled_exception) ? 0 : old); +} + +#endif + +#if XCHAL_HAVE_INTERRUPTS + +/* Handler table is in xtensa_intr_asm.S */ + +typedef struct xt_handler_table_entry { + void * handler; + void * arg; +} xt_handler_table_entry; + +extern xt_handler_table_entry _xt_interrupt_table[XCHAL_NUM_INTERRUPTS]; + + +/* + Default handler for unhandled interrupts. +*/ +void xt_unhandled_interrupt(void * arg) +{ + exit(-1); +} + + +/* + This function registers a handler for the specified interrupt. The "arg" + parameter specifies the argument to be passed to the handler when it is + invoked. The function returns the address of the previous handler. + On error, it returns 0. +*/ +xt_handler xt_set_interrupt_handler(int n, xt_handler f, void * arg) +{ + xt_handler_table_entry * entry; + xt_handler old; + + if( n < 0 || n >= XCHAL_NUM_INTERRUPTS ) + return 0; /* invalid interrupt number */ + if( Xthal_intlevel[n] > XCHAL_EXCM_LEVEL ) + return 0; /* priority level too high to safely handle in C */ + + entry = _xt_interrupt_table + n; + old = entry->handler; + + if (f) { + entry->handler = f; + entry->arg = arg; + } + else { + entry->handler = &xt_unhandled_interrupt; + entry->arg = (void*)n; + } + + return ((old == &xt_unhandled_interrupt) ? 0 : old); +} + + +#endif /* XCHAL_HAVE_INTERRUPTS */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S new file mode 100644 index 0000000..3b568f2 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S @@ -0,0 +1,185 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * Xtensa interrupt handling data and assembly routines. + * Also see xtensa_intr.c and xtensa_vectors.S. + */ + +#include +#include + +#include "xtensa_context.h" + +#if XCHAL_HAVE_INTERRUPTS + +/* +------------------------------------------------------------------------------- + INTENABLE virtualization information. +------------------------------------------------------------------------------- +*/ + + .data + .global _xt_intdata + .align 8 +_xt_intdata: + .global _xt_intenable + .type _xt_intenable,@object + .size _xt_intenable,4 + .global _xt_vpri_mask + .type _xt_vpri_mask,@object + .size _xt_vpri_mask,4 + +_xt_intenable: .word 0 /* Virtual INTENABLE */ +_xt_vpri_mask: .word 0xFFFFFFFF /* Virtual priority mask */ + + +/* +------------------------------------------------------------------------------- + Table of C-callable interrupt handlers for each interrupt. Note that not all + slots can be filled, because interrupts at level > EXCM_LEVEL will not be + dispatched to a C handler by default. +------------------------------------------------------------------------------- +*/ + + .data + .global _xt_interrupt_table + .align 8 + +_xt_interrupt_table: + + .set i, 0 + .rept XCHAL_NUM_INTERRUPTS + .word xt_unhandled_interrupt /* handler address */ + .word i /* handler arg (default: intnum) */ + .set i, i+1 + .endr + +#endif /* XCHAL_HAVE_INTERRUPTS */ + + +#if XCHAL_HAVE_EXCEPTIONS + +/* +------------------------------------------------------------------------------- + Table of C-callable exception handlers for each exception. Note that not all + slots will be active, because some exceptions (e.g. coprocessor exceptions) + are always handled by the OS and cannot be hooked by user handlers. +------------------------------------------------------------------------------- +*/ + + .data + .global _xt_exception_table + .align 4 + +_xt_exception_table: + .rept XCHAL_EXCCAUSE_NUM + .word xt_unhandled_exception /* handler address */ + .endr + +#endif + + +/* +------------------------------------------------------------------------------- + unsigned int xt_ints_on ( unsigned int mask ) + + Enables a set of interrupts. Does not simply set INTENABLE directly, but + computes it as a function of the current virtual priority. + Can be called from interrupt handlers. +------------------------------------------------------------------------------- +*/ + + .text + .align 4 + .global xt_ints_on + .type xt_ints_on,@function + +xt_ints_on: + + ENTRY0 +#if XCHAL_HAVE_INTERRUPTS + movi a3, 0 + movi a4, _xt_intdata + xsr a3, INTENABLE /* Disables all interrupts */ + rsync + l32i a3, a4, 0 /* a3 = _xt_intenable */ + l32i a6, a4, 4 /* a6 = _xt_vpri_mask */ + or a5, a3, a2 /* a5 = _xt_intenable | mask */ + s32i a5, a4, 0 /* _xt_intenable |= mask */ + and a5, a5, a6 /* a5 = _xt_intenable & _xt_vpri_mask */ + wsr a5, INTENABLE /* Reenable interrupts */ + mov a2, a3 /* Previous mask */ +#else + movi a2, 0 /* Return zero */ +#endif + RET0 + + .size xt_ints_on, . - xt_ints_on + + +/* +------------------------------------------------------------------------------- + unsigned int xt_ints_off ( unsigned int mask ) + + Disables a set of interrupts. Does not simply set INTENABLE directly, + but computes it as a function of the current virtual priority. + Can be called from interrupt handlers. +------------------------------------------------------------------------------- +*/ + + .text + .align 4 + .global xt_ints_off + .type xt_ints_off,@function + +xt_ints_off: + + ENTRY0 +#if XCHAL_HAVE_INTERRUPTS + movi a3, 0 + movi a4, _xt_intdata + xsr a3, INTENABLE /* Disables all interrupts */ + rsync + l32i a3, a4, 0 /* a3 = _xt_intenable */ + l32i a6, a4, 4 /* a6 = _xt_vpri_mask */ + or a5, a3, a2 /* a5 = _xt_intenable | mask */ + xor a5, a5, a2 /* a5 = _xt_intenable & ~mask */ + s32i a5, a4, 0 /* _xt_intenable &= ~mask */ + and a5, a5, a6 /* a5 = _xt_intenable & _xt_vpri_mask */ + wsr a5, INTENABLE /* Reenable interrupts */ + mov a2, a3 /* Previous mask */ +#else + movi a2, 0 /* return zero */ +#endif + RET0 + + .size xt_ints_off, . - xt_ints_off + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c new file mode 100644 index 0000000..d7785a4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c @@ -0,0 +1,76 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * xtensa_overlay_os_hook.c -- Overlay manager OS hooks for FreeRTOS. + */ + +#include "FreeRTOS.h" +#include "semphr.h" + +#if configUSE_MUTEX + +/* Mutex object that controls access to the overlay. Currently only one + * overlay region is supported so one mutex suffices. + */ +static SemaphoreHandle_t xt_overlay_mutex; + + +/* This function should be overridden to provide OS specific init such + * as the creation of a mutex lock that can be used for overlay locking. + * Typically this mutex would be set up with priority inheritance. See + * overlay manager documentation for more details. + */ +void xt_overlay_init_os(void) +{ + /* Create the mutex for overlay access. Priority inheritance is + * required. + */ + xt_overlay_mutex = xSemaphoreCreateMutex(); +} + + +/* This function locks access to shared overlay resources, typically + * by acquiring a mutex. + */ +void xt_overlay_lock(void) +{ + xSemaphoreTake(xt_overlay_mutex, 0); +} + + +/* This function releases access to shared overlay resources, typically + * by unlocking a mutex. + */ +void xt_overlay_unlock(void) +{ + xSemaphoreGive(xt_overlay_mutex); +} + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h new file mode 100644 index 0000000..79f1ec1 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h @@ -0,0 +1,239 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * RTOS-SPECIFIC INFORMATION FOR XTENSA RTOS ASSEMBLER SOURCES + * (FreeRTOS Port) + * + * This header is the primary glue between generic Xtensa RTOS support + * sources and a specific RTOS port for Xtensa. It contains definitions + * and macros for use primarily by Xtensa assembly coded source files. + * + * Macros in this header map callouts from generic Xtensa files to specific + * RTOS functions. It may also be included in C source files. + * + * Xtensa RTOS ports support all RTOS-compatible configurations of the Xtensa + * architecture, using the Xtensa hardware abstraction layer (HAL) to deal + * with configuration specifics. + * + * Should be included by all Xtensa generic and RTOS port-specific sources. + */ + +#ifndef XTENSA_RTOS_H +#define XTENSA_RTOS_H + +#ifdef __ASSEMBLER__ +#include +#else +#include +#endif + +#include +#include +#include + +/* +Include any RTOS specific definitions that are needed by this header. +*/ +#include + +/* +Convert FreeRTOSConfig definitions to XTENSA definitions. +However these can still be overridden from the command line. +*/ + +#ifndef XT_SIMULATOR + #if configXT_SIMULATOR + #define XT_SIMULATOR 1 /* Simulator mode */ + #endif +#endif + +#ifndef XT_BOARD + #if configXT_BOARD + #define XT_BOARD 1 /* Board mode */ + #endif +#endif + +#ifndef XT_TIMER_INDEX + #if defined configXT_TIMER_INDEX + #define XT_TIMER_INDEX configXT_TIMER_INDEX /* Index of hardware timer to be used */ + #endif +#endif + +#ifndef XT_INTEXC_HOOKS + #if configXT_INTEXC_HOOKS + #define XT_INTEXC_HOOKS 1 /* Enables exception hooks */ + #endif +#endif + +#if (!XT_SIMULATOR) && (!XT_BOARD) + #error Either XT_SIMULATOR or XT_BOARD must be defined. +#endif + + +/* +Name of RTOS (for messages). +*/ +#define XT_RTOS_NAME FreeRTOS + +/* +Check some Xtensa configuration requirements and report error if not met. +Error messages can be customize to the RTOS port. +*/ + +#if !XCHAL_HAVE_XEA2 +#error "FreeRTOS/Xtensa requires XEA2 (exception architecture 2)." +#endif + + +/******************************************************************************* + +RTOS CALLOUT MACROS MAPPED TO RTOS PORT-SPECIFIC FUNCTIONS. + +Define callout macros used in generic Xtensa code to interact with the RTOS. +The macros are simply the function names for use in calls from assembler code. +Some of these functions may call back to generic functions in xtensa_context.h . + +*******************************************************************************/ + +/* +Inform RTOS of entry into an interrupt handler that will affect it. +Allows RTOS to manage switch to any system stack and count nesting level. +Called after minimal context has been saved, with interrupts disabled. +RTOS port can call0 _xt_context_save to save the rest of the context. +May only be called from assembly code by the 'call0' instruction. +*/ +// void XT_RTOS_INT_ENTER(void) +#define XT_RTOS_INT_ENTER _frxt_int_enter + +/* +Inform RTOS of completion of an interrupt handler, and give control to +RTOS to perform thread/task scheduling, switch back from any system stack +and restore the context, and return to the exit dispatcher saved in the +stack frame at XT_STK_EXIT. RTOS port can call0 _xt_context_restore +to save the context saved in XT_RTOS_INT_ENTER via _xt_context_save, +leaving only a minimal part of the context to be restored by the exit +dispatcher. This function does not return to the place it was called from. +May only be called from assembly code by the 'call0' instruction. +*/ +// void XT_RTOS_INT_EXIT(void) +#define XT_RTOS_INT_EXIT _frxt_int_exit + +/* +Inform RTOS of the occurrence of a tick timer interrupt. +If RTOS has no tick timer, leave XT_RTOS_TIMER_INT undefined. +May be coded in or called from C or assembly, per ABI conventions. +RTOS may optionally define XT_TICK_PER_SEC in its own way (eg. macro). +*/ +// void XT_RTOS_TIMER_INT(void) +#define XT_RTOS_TIMER_INT _frxt_timer_int +#define XT_TICK_PER_SEC configTICK_RATE_HZ + +/* +Return in a15 the base address of the co-processor state save area for the +thread that triggered a co-processor exception, or 0 if no thread was running. +The state save area is structured as defined in xtensa_context.h and has size +XT_CP_SIZE. Co-processor instructions should only be used in thread code, never +in interrupt handlers or the RTOS kernel. May only be called from assembly code +and by the 'call0' instruction. A result of 0 indicates an unrecoverable error. +The implementation may use only a2-4, a15 (all other regs must be preserved). +*/ +// void* XT_RTOS_CP_STATE(void) +#define XT_RTOS_CP_STATE _frxt_task_coproc_state + + +/******************************************************************************* + +HOOKS TO DYNAMICALLY INSTALL INTERRUPT AND EXCEPTION HANDLERS PER LEVEL. + +This Xtensa RTOS port provides hooks for dynamically installing exception +and interrupt handlers to facilitate automated testing where each test +case can install its own handler for user exceptions and each interrupt +priority (level). This consists of an array of function pointers indexed +by interrupt priority, with index 0 being the user exception handler hook. +Each entry in the array is initially 0, and may be replaced by a function +pointer of type XT_INTEXC_HOOK. A handler may be uninstalled by installing 0. + +The handler for low and medium priority obeys ABI conventions so may be coded +in C. For the exception handler, the cause is the contents of the EXCCAUSE +reg, and the result is -1 if handled, else the cause (still needs handling). +For interrupt handlers, the cause is a mask of pending enabled interrupts at +that level, and the result is the same mask with the bits for the handled +interrupts cleared (those not cleared still need handling). This allows a test +case to either pre-handle or override the default handling for the exception +or interrupt level (see xtensa_vectors.S). + +High priority handlers (including NMI) must be coded in assembly, are always +called by 'call0' regardless of ABI, must preserve all registers except a0, +and must not use or modify the interrupted stack. The hook argument 'cause' +is not passed and the result is ignored, so as not to burden the caller with +saving and restoring a2 (it assumes only one interrupt per level - see the +discussion in high priority interrupts in xtensa_vectors.S). The handler +therefore should be coded to prototype 'void h(void)' even though it plugs +into an array of handlers of prototype 'unsigned h(unsigned)'. + +To enable interrupt/exception hooks, compile the RTOS with '-DXT_INTEXC_HOOKS'. + +*******************************************************************************/ + +#define XT_INTEXC_HOOK_NUM (1 + XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI) + +#ifndef __ASSEMBLER__ +typedef unsigned (*XT_INTEXC_HOOK)(unsigned cause); +extern volatile XT_INTEXC_HOOK _xt_intexc_hooks[XT_INTEXC_HOOK_NUM]; +#endif + + +/******************************************************************************* + +CONVENIENCE INCLUSIONS. + +Ensures RTOS specific files need only include this one Xtensa-generic header. +These headers are included last so they can use the RTOS definitions above. + +*******************************************************************************/ + +#include "xtensa_context.h" + +#ifdef XT_RTOS_TIMER_INT +#include "xtensa_timer.h" +#endif + + +/******************************************************************************* + +Xtensa Port Version. + +*******************************************************************************/ + +#define XTENSA_PORT_VERSION 1.7 +#define XTENSA_PORT_VERSION_STRING "1.7" + +#endif /* XTENSA_RTOS_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h new file mode 100644 index 0000000..6380305 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h @@ -0,0 +1,165 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + * XTENSA INFORMATION FOR RTOS TICK TIMER AND CLOCK FREQUENCY + * + * This header contains definitions and macros for use primarily by Xtensa + * RTOS assembly coded source files. It includes and uses the Xtensa hardware + * abstraction layer (HAL) to deal with config specifics. It may also be + * included in C source files. + * + * Edit this file to modify timer selection and to specify clock frequency and + * tick duration to match timer interrupt to the real-time tick duration. + * + * If the RTOS has no timer interrupt, then there is no tick timer and the + * clock frequency is irrelevant, so all of these macros are left undefined + * and the Xtensa core configuration need not have a timer. + */ + +#ifndef XTENSA_TIMER_H +#define XTENSA_TIMER_H + +#ifdef __ASSEMBLER__ +#include +#endif + +#include +#include + +#include "xtensa_rtos.h" /* in case this wasn't included directly */ + +#include + +/* +Select timer to use for periodic tick, and determine its interrupt number +and priority. User may specify a timer by defining XT_TIMER_INDEX with -D, +in which case its validity is checked (it must exist in this core and must +not be on a high priority interrupt - an error will be reported in invalid). +Otherwise select the first low or medium priority interrupt timer available. +*/ +#if XCHAL_NUM_TIMERS == 0 + + #error "This Xtensa configuration is unsupported, it has no timers." + +#else + +#ifndef XT_TIMER_INDEX + #if XCHAL_TIMER3_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL(XCHAL_TIMER3_INTERRUPT) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 3 + #endif + #endif + #if XCHAL_TIMER2_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL(XCHAL_TIMER2_INTERRUPT) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 2 + #endif + #endif + #if XCHAL_TIMER1_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL(XCHAL_TIMER1_INTERRUPT) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 1 + #endif + #endif + #if XCHAL_TIMER0_INTERRUPT != XTHAL_TIMER_UNCONFIGURED + #if XCHAL_INT_LEVEL(XCHAL_TIMER0_INTERRUPT) <= XCHAL_EXCM_LEVEL + #undef XT_TIMER_INDEX + #define XT_TIMER_INDEX 0 + #endif + #endif +#endif +#ifndef XT_TIMER_INDEX + #error "There is no suitable timer in this Xtensa configuration." +#endif + +#define XT_CCOMPARE (CCOMPARE + XT_TIMER_INDEX) +#define XT_TIMER_INTNUM XCHAL_TIMER_INTERRUPT(XT_TIMER_INDEX) +#define XT_TIMER_INTPRI XCHAL_INT_LEVEL(XT_TIMER_INTNUM) +#define XT_TIMER_INTEN (1 << XT_TIMER_INTNUM) + +#if XT_TIMER_INTNUM == XTHAL_TIMER_UNCONFIGURED + #error "The timer selected by XT_TIMER_INDEX does not exist in this core." +#elif XT_TIMER_INTPRI > XCHAL_EXCM_LEVEL + #error "The timer interrupt cannot be high priority (use medium or low)." +#endif + +#endif /* XCHAL_NUM_TIMERS */ + +/* +Set processor clock frequency, used to determine clock divisor for timer tick. +User should BE SURE TO ADJUST THIS for the Xtensa platform being used. +If using a supported board via the board-independent API defined in xtbsp.h, +this may be left undefined and frequency and tick divisor will be computed +and cached during run-time initialization. + +NOTE ON SIMULATOR: +Under the Xtensa instruction set simulator, the frequency can only be estimated +because it depends on the speed of the host and the version of the simulator. +Also because it runs much slower than hardware, it is not possible to achieve +real-time performance for most applications under the simulator. A frequency +too low does not allow enough time between timer interrupts, starving threads. +To obtain a more convenient but non-real-time tick duration on the simulator, +compile with xt-xcc option "-DXT_SIMULATOR". +Adjust this frequency to taste (it's not real-time anyway!). +*/ +#if defined(XT_SIMULATOR) && !defined(XT_CLOCK_FREQ) +#define XT_CLOCK_FREQ configCPU_CLOCK_HZ +#endif + +#if !defined(XT_CLOCK_FREQ) && !defined(XT_BOARD) + #error "XT_CLOCK_FREQ must be defined for the target platform." +#endif + +/* +Default number of timer "ticks" per second (default 100 for 10ms tick). +RTOS may define this in its own way (if applicable) in xtensa_rtos.h. +User may redefine this to an optimal value for the application, either by +editing this here or in xtensa_rtos.h, or compiling with xt-xcc option +"-DXT_TICK_PER_SEC=" where is a suitable number. +*/ +#ifndef XT_TICK_PER_SEC +#define XT_TICK_PER_SEC configTICK_RATE_HZ /* 10 ms tick = 100 ticks per second */ +#endif + +/* +Derivation of clock divisor for timer tick and interrupt (one per tick). +*/ +#ifdef XT_CLOCK_FREQ +#define XT_TICK_DIVISOR (XT_CLOCK_FREQ / XT_TICK_PER_SEC) +#endif + +#ifndef __ASSEMBLER__ +extern unsigned _xt_tick_divisor; +extern void _xt_tick_divisor_init(void); +#endif + +#endif /* XTENSA_TIMER_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S new file mode 100644 index 0000000..0163554 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S @@ -0,0 +1,1925 @@ + /* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2015-2019 Cadence Design Systems, Inc. + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* + XTENSA VECTORS AND LOW LEVEL HANDLERS FOR AN RTOS + + Xtensa low level exception and interrupt vectors and handlers for an RTOS. + + Interrupt handlers and user exception handlers support interaction with + the RTOS by calling XT_RTOS_INT_ENTER and XT_RTOS_INT_EXIT before and + after user's specific interrupt handlers. These macros are defined in + xtensa_.h to call suitable functions in a specific RTOS. + + Users can install application-specific interrupt handlers for low and + medium level interrupts, by calling xt_set_interrupt_handler(). These + handlers can be written in C, and must obey C calling convention. The + handler table is indexed by the interrupt number. Each handler may be + provided with an argument. + + Note that the system timer interrupt is handled specially, and is + dispatched to the RTOS-specific handler. This timer cannot be hooked + by application code. + + Optional hooks are also provided to install a handler per level at + run-time, made available by compiling this source file with + '-DXT_INTEXC_HOOKS' (useful for automated testing). + +!! This file is a template that usually needs to be modified to handle !! +!! application specific interrupts. Search USER_EDIT for helpful comments !! +!! on where to insert handlers and how to write them. !! + + Users can also install application-specific exception handlers in the + same way, by calling xt_set_exception_handler(). One handler slot is + provided for each exception type. Note that some exceptions are handled + by the porting layer itself, and cannot be taken over by application + code in this manner. These are the alloca, syscall, and coprocessor + exceptions. + + The exception handlers can be written in C, and must follow C calling + convention. Each handler is passed a pointer to an exception frame as + its single argument. The exception frame is created on the stack, and + holds the saved context of the thread that took the exception. If the + handler returns, the context will be restored and the instruction that + caused the exception will be retried. If the handler makes any changes + to the saved state in the exception frame, the changes will be applied + when restoring the context. + + Because Xtensa is a configurable architecture, this port supports all user + generated configurations (except restrictions stated in the release notes). + This is accomplished by conditional compilation using macros and functions + defined in the Xtensa HAL (hardware adaptation layer) for your configuration. + Only the relevant parts of this file will be included in your RTOS build. + For example, this file provides interrupt vector templates for all types and + all priority levels, but only the ones in your configuration are built. + + NOTES on the use of 'call0' for long jumps instead of 'j': + 1. This file should be assembled with the -mlongcalls option to xt-xcc. + 2. The -mlongcalls compiler option causes 'call0 dest' to be expanded to + a sequence 'l32r a0, dest' 'callx0 a0' which works regardless of the + distance from the call to the destination. The linker then relaxes + it back to 'call0 dest' if it determines that dest is within range. + This allows more flexibility in locating code without the performance + overhead of the 'l32r' literal data load in cases where the destination + is in range of 'call0'. There is an additional benefit in that 'call0' + has a longer range than 'j' due to the target being word-aligned, so + the 'l32r' sequence is less likely needed. + 3. The use of 'call0' with -mlongcalls requires that register a0 not be + live at the time of the call, which is always the case for a function + call but needs to be ensured if 'call0' is used as a jump in lieu of 'j'. + 4. This use of 'call0' is independent of the C function call ABI. + + */ + +#include "xtensa_rtos.h" + + +/* Enable stack backtrace across exception/interrupt - see below */ +#define XT_DEBUG_BACKTRACE 1 + + +/* +-------------------------------------------------------------------------------- + Defines used to access _xtos_interrupt_table. +-------------------------------------------------------------------------------- +*/ +#define XIE_HANDLER 0 +#define XIE_ARG 4 +#define XIE_SIZE 8 + +/* +-------------------------------------------------------------------------------- + Macro extract_msb - return the input with only the highest bit set. + + Input : "ain" - Input value, clobbered. + Output : "aout" - Output value, has only one bit set, MSB of "ain". + The two arguments must be different AR registers. +-------------------------------------------------------------------------------- +*/ + + .macro extract_msb aout ain +1: + addi \aout, \ain, -1 /* aout = ain - 1 */ + and \ain, \ain, \aout /* ain = ain & aout */ + bnez \ain, 1b /* repeat until ain == 0 */ + addi \aout, \aout, 1 /* return aout + 1 */ + .endm + +/* +-------------------------------------------------------------------------------- + Macro dispatch_c_isr - dispatch interrupts to user ISRs. + This will dispatch to user handlers (if any) that are registered in the + XTOS dispatch table (_xtos_interrupt_table). These handlers would have + been registered by calling _xtos_set_interrupt_handler(). There is one + exception - the timer interrupt used by the OS will not be dispatched + to a user handler - this must be handled by the caller of this macro. + + Level triggered and software interrupts are automatically deasserted by + this code. + + ASSUMPTIONS: + -- PS.INTLEVEL is set to "level" at entry + -- PS.EXCM = 0, C calling enabled + + NOTE: For CALL0 ABI, a12-a15 have not yet been saved. + + NOTE: This macro will use registers a0 and a2-a6. The arguments are: + level -- interrupt level + mask -- interrupt bitmask for this level +-------------------------------------------------------------------------------- +*/ + + .macro dispatch_c_isr level mask + + /* Get mask of pending, enabled interrupts at this level into a2. */ + +.L_xt_user_int_&level&: + rsr a2, INTENABLE + rsr a3, INTERRUPT + movi a4, \mask + and a2, a2, a3 + and a2, a2, a4 + beqz a2, 9f /* nothing to do */ + + /* This bit of code provides a nice debug backtrace in the debugger. + It does take a few more instructions, so undef XT_DEBUG_BACKTRACE + if you want to save the cycles. + */ + #if XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + rsr a0, EPC_1 + \level - 1 /* return address */ + movi a4, 0xC0000000 /* constant with top 2 bits set (call size) */ + or a0, a0, a4 /* set top 2 bits */ + addx2 a0, a4, a0 /* clear top bit -- simulating call4 size */ + #endif + #endif + + #ifdef XT_INTEXC_HOOKS + /* Call interrupt hook if present to (pre)handle interrupts. */ + movi a4, _xt_intexc_hooks + l32i a4, a4, \level << 2 + beqz a4, 2f + #ifdef __XTENSA_CALL0_ABI__ + callx0 a4 + beqz a2, 9f + #else + mov a6, a2 + callx4 a4 + beqz a6, 9f + mov a2, a6 + #endif +2: + #endif + + /* Now look up in the dispatch table and call user ISR if any. */ + /* If multiple bits are set then MSB has highest priority. */ + + extract_msb a4, a2 /* a4 = MSB of a2, a2 trashed */ + + #ifdef XT_USE_SWPRI + /* Enable all interrupts at this level that are numerically higher + than the one we just selected, since they are treated as higher + priority. + */ + movi a3, \mask /* a3 = all interrupts at this level */ + add a2, a4, a4 /* a2 = a4 << 1 */ + addi a2, a2, -1 /* a2 = mask of 1's <= a4 bit */ + and a2, a2, a3 /* a2 = mask of all bits <= a4 at this level */ + movi a3, _xt_intdata + l32i a6, a3, 4 /* a6 = _xt_vpri_mask */ + neg a2, a2 + addi a2, a2, -1 /* a2 = mask to apply */ + and a5, a6, a2 /* mask off all bits <= a4 bit */ + s32i a5, a3, 4 /* update _xt_vpri_mask */ + rsr a3, INTENABLE + and a3, a3, a2 /* mask off all bits <= a4 bit */ + wsr a3, INTENABLE + rsil a3, \level - 1 /* lower interrupt level by 1 */ + #endif + + movi a3, XT_TIMER_INTEN /* a3 = timer interrupt bit */ + wsr a4, INTCLEAR /* clear sw or edge-triggered interrupt */ + beq a3, a4, 7f /* if timer interrupt then skip table */ + + find_ms_setbit a3, a4, a3, 0 /* a3 = interrupt number */ + + movi a4, _xt_interrupt_table + addx8 a3, a3, a4 /* a3 = address of interrupt table entry */ + l32i a4, a3, XIE_HANDLER /* a4 = handler address */ + #ifdef __XTENSA_CALL0_ABI__ + mov a12, a6 /* save in callee-saved reg */ + l32i a2, a3, XIE_ARG /* a2 = handler arg */ + callx0 a4 /* call handler */ + mov a2, a12 + #else + mov a2, a6 /* save in windowed reg */ + l32i a6, a3, XIE_ARG /* a6 = handler arg */ + callx4 a4 /* call handler */ + #endif + + #ifdef XT_USE_SWPRI + j 8f + #else + j .L_xt_user_int_&level& /* check for more interrupts */ + #endif + +7: + + .ifeq XT_TIMER_INTPRI - \level +.L_xt_user_int_timer_&level&: + /* + Interrupt handler for the RTOS tick timer if at this level. + We'll be reading the interrupt state again after this call + so no need to preserve any registers except a6 (vpri_mask). + */ + + #ifdef __XTENSA_CALL0_ABI__ + mov a12, a6 + call0 XT_RTOS_TIMER_INT + mov a2, a12 + #else + mov a2, a6 + call4 XT_RTOS_TIMER_INT + #endif + .endif + + #ifdef XT_USE_SWPRI + j 8f + #else + j .L_xt_user_int_&level& /* check for more interrupts */ + #endif + + #ifdef XT_USE_SWPRI +8: + /* Restore old value of _xt_vpri_mask from a2. Also update INTENABLE from + virtual _xt_intenable which _could_ have changed during interrupt + processing. */ + + movi a3, _xt_intdata + l32i a4, a3, 0 /* a4 = _xt_intenable */ + s32i a2, a3, 4 /* update _xt_vpri_mask */ + and a4, a4, a2 /* a4 = masked intenable */ + wsr a4, INTENABLE /* update INTENABLE */ + #endif + +9: + /* done */ + + .endm + + +/* +-------------------------------------------------------------------------------- + Panic handler. + Should be reached by call0 (preferable) or jump only. If call0, a0 says where + from. If on simulator, display panic message and abort, else loop indefinitely. +-------------------------------------------------------------------------------- +*/ + + .text + .global _xt_panic + .type _xt_panic,@function + .align 4 + .literal_position + +_xt_panic: + #ifdef XT_SIMULATOR + addi a4, a0, -3 /* point to call0 */ + movi a3, _xt_panic_message + movi a2, SYS_log_msg + simcall + movi a2, SYS_gdb_abort + simcall + #else + rsil a2, XCHAL_EXCM_LEVEL /* disable all low & med ints */ +1: j 1b /* loop infinitely */ + #endif + + .section .rodata, "a" + .align 4 + +_xt_panic_message: + .string "\n*** _xt_panic() was called from 0x%08x or jumped to. ***\n" + + +/* +-------------------------------------------------------------------------------- + Hooks to dynamically install handlers for exceptions and interrupts. + Allows automated regression frameworks to install handlers per test. + Consists of an array of function pointers indexed by interrupt level, + with index 0 containing the entry for user exceptions. + Initialized with all 0s, meaning no handler is installed at each level. + See comment in xtensa_rtos.h for more details. +-------------------------------------------------------------------------------- +*/ + + #ifdef XT_INTEXC_HOOKS + .data + .global _xt_intexc_hooks + .type _xt_intexc_hooks,@object + .align 4 + +_xt_intexc_hooks: + .fill XT_INTEXC_HOOK_NUM, 4, 0 + #endif + + +/* +-------------------------------------------------------------------------------- + EXCEPTION AND LEVEL 1 INTERRUPT VECTORS AND LOW LEVEL HANDLERS + (except window exception vectors). + + Each vector goes at a predetermined location according to the Xtensa + hardware configuration, which is ensured by its placement in a special + section known to the Xtensa linker support package (LSP). It performs + the minimum necessary before jumping to the handler in the .text section. + + The corresponding handler goes in the normal .text section. It sets up + the appropriate stack frame, saves a few vector-specific registers and + calls XT_RTOS_INT_ENTER to save the rest of the interrupted context + and enter the RTOS, then sets up a C environment. It then calls the + user's interrupt handler code (which may be coded in C) and finally + calls XT_RTOS_INT_EXIT to transfer control to the RTOS for scheduling. + + While XT_RTOS_INT_EXIT does not return directly to the interruptee, + eventually the RTOS scheduler will want to dispatch the interrupted + task or handler. The scheduler will return to the exit point that was + saved in the interrupt stack frame at XT_STK_EXIT. +-------------------------------------------------------------------------------- +*/ + + +/* +-------------------------------------------------------------------------------- +Debug Exception. +-------------------------------------------------------------------------------- +*/ + +#if XCHAL_HAVE_DEBUG + + .begin literal_prefix .DebugExceptionVector + .section .DebugExceptionVector.text, "ax" + .global _DebugExceptionVector + .align 4 + .literal_position + +_DebugExceptionVector: + + #ifdef XT_SIMULATOR + /* + In the simulator, let the debugger (if any) handle the debug exception, + or simply stop the simulation: + */ + wsr a2, EXCSAVE+XCHAL_DEBUGLEVEL /* save a2 where sim expects it */ + movi a2, SYS_gdb_enter_sktloop + simcall /* have ISS handle debug exc. */ + #elif 0 /* change condition to 1 to use the HAL minimal debug handler */ + wsr a3, EXCSAVE+XCHAL_DEBUGLEVEL + movi a3, xthal_debugexc_defhndlr_nw /* use default debug handler */ + jx a3 + #else + wsr a0, EXCSAVE+XCHAL_DEBUGLEVEL /* save original a0 somewhere */ + call0 _xt_panic /* does not return */ + rfi XCHAL_DEBUGLEVEL /* make a0 point here not later */ + #endif + + .end literal_prefix + +#endif + +/* +-------------------------------------------------------------------------------- +Double Exception. +Double exceptions are not a normal occurrence. They indicate a bug of some kind. +-------------------------------------------------------------------------------- +*/ + +#ifdef XCHAL_DOUBLEEXC_VECTOR_VADDR + + .begin literal_prefix .DoubleExceptionVector + .section .DoubleExceptionVector.text, "ax" + .global _DoubleExceptionVector + .align 4 + .literal_position + +_DoubleExceptionVector: + + #if XCHAL_HAVE_DEBUG + break 1, 4 /* unhandled double exception */ + #endif + call0 _xt_panic /* does not return */ + rfde /* make a0 point here not later */ + + .end literal_prefix + +#endif /* XCHAL_DOUBLEEXC_VECTOR_VADDR */ + +/* +-------------------------------------------------------------------------------- +Kernel Exception (including Level 1 Interrupt from kernel mode). +-------------------------------------------------------------------------------- +*/ + + .begin literal_prefix .KernelExceptionVector + .section .KernelExceptionVector.text, "ax" + .global _KernelExceptionVector + .align 4 + .literal_position + +_KernelExceptionVector: + + wsr a0, EXCSAVE_1 /* preserve a0 */ + call0 _xt_kernel_exc /* kernel exception handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .text + .align 4 + +_xt_kernel_exc: + #if XCHAL_HAVE_DEBUG + break 1, 0 /* unhandled kernel exception */ + #endif + call0 _xt_panic /* does not return */ + rfe /* make a0 point here not there */ + + +/* +-------------------------------------------------------------------------------- +User Exception (including Level 1 Interrupt from user mode). +-------------------------------------------------------------------------------- +*/ + + .begin literal_prefix .UserExceptionVector + .section .UserExceptionVector.text, "ax" + .global _UserExceptionVector + .type _UserExceptionVector,@function + .align 4 + .literal_position + +_UserExceptionVector: + + wsr a0, EXCSAVE_1 /* preserve a0 */ + call0 _xt_user_exc /* user exception handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + +/* +-------------------------------------------------------------------------------- + Insert some waypoints for jumping beyond the signed 8-bit range of + conditional branch instructions, so the conditional branchces to specific + exception handlers are not taken in the mainline. Saves some cycles in the + mainline. +-------------------------------------------------------------------------------- +*/ + + .text + + #if XCHAL_HAVE_WINDOWED + .align 4 +_xt_to_alloca_exc: + call0 _xt_alloca_exc /* in window vectors section */ + /* never returns here - call0 is used as a jump (see note at top) */ + #endif + + .align 4 +_xt_to_syscall_exc: + call0 _xt_syscall_exc + /* never returns here - call0 is used as a jump (see note at top) */ + + #if XCHAL_CP_NUM > 0 + .align 4 +_xt_to_coproc_exc: + call0 _xt_coproc_exc + /* never returns here - call0 is used as a jump (see note at top) */ + #endif + + +/* +-------------------------------------------------------------------------------- + User exception handler. +-------------------------------------------------------------------------------- +*/ + + .type _xt_user_exc,@function + .align 4 + +_xt_user_exc: + + /* If level 1 interrupt then jump to the dispatcher */ + rsr a0, EXCCAUSE + beqi a0, EXCCAUSE_LEVEL1INTERRUPT, _xt_lowint1 + + /* Handle any coprocessor exceptions. Rely on the fact that exception + numbers above EXCCAUSE_CP0_DISABLED all relate to the coprocessors. + */ + #if XCHAL_CP_NUM > 0 + bgeui a0, EXCCAUSE_CP0_DISABLED, _xt_to_coproc_exc + #endif + + /* Handle alloca and syscall exceptions */ + #if XCHAL_HAVE_WINDOWED + beqi a0, EXCCAUSE_ALLOCA, _xt_to_alloca_exc + #endif + beqi a0, EXCCAUSE_SYSCALL, _xt_to_syscall_exc + + /* Handle all other exceptions. All can have user-defined handlers. */ + /* NOTE: we'll stay on the user stack for exception handling. */ + + /* Allocate exception frame and save minimal context. */ + mov a0, sp + addi sp, sp, -XT_STK_FRMSZ + s32i a0, sp, XT_STK_A1 + #if XCHAL_HAVE_WINDOWED + s32e a0, sp, -12 /* for debug backtrace */ + #endif + rsr a0, PS /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_1 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_1 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + #if XCHAL_HAVE_WINDOWED + s32e a0, sp, -16 /* for debug backtrace */ + #endif + s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */ + s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */ + call0 _xt_context_save + + /* Save exc cause and vaddr into exception frame */ + rsr a0, EXCCAUSE + s32i a0, sp, XT_STK_EXCCAUSE + rsr a0, EXCVADDR + s32i a0, sp, XT_STK_EXCVADDR + + /* Set up PS for C, reenable hi-pri interrupts, and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(XCHAL_EXCM_LEVEL) | PS_UM + #else + movi a0, PS_INTLEVEL(XCHAL_EXCM_LEVEL) | PS_UM | PS_WOE + #endif + wsr a0, PS + + #ifdef XT_DEBUG_BACKTRACE + #ifndef __XTENSA_CALL0_ABI__ + rsr a0, EPC_1 /* return address for debug backtrace */ + movi a5, 0xC0000000 /* constant with top 2 bits set (call size) */ + rsync /* wait for WSR.PS to complete */ + or a0, a0, a5 /* set top 2 bits */ + addx2 a0, a5, a0 /* clear top bit -- thus simulating call4 size */ + #else + rsync /* wait for WSR.PS to complete */ + #endif + #endif + + rsr a2, EXCCAUSE /* recover exc cause */ + + #ifdef XT_INTEXC_HOOKS + /* + Call exception hook to pre-handle exceptions (if installed). + Pass EXCCAUSE in a2, and check result in a2 (if -1, skip default handling). + */ + movi a4, _xt_intexc_hooks + l32i a4, a4, 0 /* user exception hook index 0 */ + beqz a4, 1f +.Ln_xt_user_exc_call_hook: + #ifdef __XTENSA_CALL0_ABI__ + callx0 a4 + beqi a2, -1, .L_xt_user_done + #else + mov a6, a2 + callx4 a4 + beqi a6, -1, .L_xt_user_done + mov a2, a6 + #endif +1: + #endif + + rsr a2, EXCCAUSE /* recover exc cause */ + movi a3, _xt_exception_table + addx4 a4, a2, a3 /* a4 = address of exception table entry */ + l32i a4, a4, 0 /* a4 = handler address */ + #ifdef __XTENSA_CALL0_ABI__ + mov a2, sp /* a2 = pointer to exc frame */ + callx0 a4 /* call handler */ + #else + mov a6, sp /* a6 = pointer to exc frame */ + callx4 a4 /* call handler */ + #endif + +.L_xt_user_done: + + /* Restore context and return */ + call0 _xt_context_restore + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, PS + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_1 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove exception frame */ + rsync /* ensure PS and EPC written */ + rfe /* PS.EXCM is cleared */ + + +/* +-------------------------------------------------------------------------------- + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. +-------------------------------------------------------------------------------- +*/ + + .global _xt_user_exit + .type _xt_user_exit,@function + .align 4 +_xt_user_exit: + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, PS + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_1 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure PS and EPC written */ + rfe /* PS.EXCM is cleared */ + + +/* +-------------------------------------------------------------------------------- +Syscall Exception Handler (jumped to from User Exception Handler). +Syscall 0 is required to spill the register windows (no-op in Call 0 ABI). +Only syscall 0 is handled here. Other syscalls return -1 to caller in a2. +-------------------------------------------------------------------------------- +*/ + + .text + .type _xt_syscall_exc,@function + .align 4 +_xt_syscall_exc: + + #ifdef __XTENSA_CALL0_ABI__ + /* + Save minimal regs for scratch. Syscall 0 does nothing in Call0 ABI. + Use a minimal stack frame (16B) to save A2 & A3 for scratch. + PS.EXCM could be cleared here, but unlikely to improve worst-case latency. + rsr a0, PS + addi a0, a0, -PS_EXCM_MASK + wsr a0, PS + */ + addi sp, sp, -16 + s32i a2, sp, 8 + s32i a3, sp, 12 + #else /* Windowed ABI */ + /* + Save necessary context and spill the register windows. + PS.EXCM is still set and must remain set until after the spill. + Reuse context save function though it saves more than necessary. + For this reason, a full interrupt stack frame is allocated. + */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */ + s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */ + call0 _xt_context_save + #endif + + /* + Grab the interruptee's PC and skip over the 'syscall' instruction. + If it's at the end of a zero-overhead loop and it's not on the last + iteration, decrement loop counter and skip to beginning of loop. + */ + rsr a2, EPC_1 /* a2 = PC of 'syscall' */ + addi a3, a2, 3 /* ++PC */ + #if XCHAL_HAVE_LOOPS + rsr a0, LEND /* if (PC == LEND */ + bne a3, a0, 1f + rsr a0, LCOUNT /* && LCOUNT != 0) */ + beqz a0, 1f /* { */ + addi a0, a0, -1 /* --LCOUNT */ + rsr a3, LBEG /* PC = LBEG */ + wsr a0, LCOUNT /* } */ + #endif +1: wsr a3, EPC_1 /* update PC */ + + /* Restore interruptee's context and return from exception. */ + #ifdef __XTENSA_CALL0_ABI__ + l32i a2, sp, 8 + l32i a3, sp, 12 + addi sp, sp, 16 + #else + call0 _xt_context_restore + addi sp, sp, XT_STK_FRMSZ + #endif + movi a0, -1 + movnez a2, a0, a2 /* return -1 if not syscall 0 */ + rsr a0, EXCSAVE_1 + rfe + +/* +-------------------------------------------------------------------------------- +Co-Processor Exception Handler (jumped to from User Exception Handler). +These exceptions are generated by co-processor instructions, which are only +allowed in thread code (not in interrupts or kernel code). This restriction is +deliberately imposed to reduce the burden of state-save/restore in interrupts. +-------------------------------------------------------------------------------- +*/ +#if XCHAL_CP_NUM > 0 + + .section .rodata, "a" + +/* Offset to CP n save area in thread's CP save area. */ + .global _xt_coproc_sa_offset + .type _xt_coproc_sa_offset,@object + .align 16 /* minimize crossing cache boundaries */ +_xt_coproc_sa_offset: + .word XT_CP0_SA, XT_CP1_SA, XT_CP2_SA, XT_CP3_SA + .word XT_CP4_SA, XT_CP5_SA, XT_CP6_SA, XT_CP7_SA + +/* Bitmask for CP n's CPENABLE bit. */ + .type _xt_coproc_mask,@object + .align 16,,8 /* try to keep it all in one cache line */ + .set i, 0 +_xt_coproc_mask: + .rept XCHAL_CP_MAX + .long (i<<16) | (1<= 2 + + .begin literal_prefix .Level2InterruptVector + .section .Level2InterruptVector.text, "ax" + .global _Level2Vector + .type _Level2Vector,@function + .align 4 + .literal_position + +_Level2Vector: + wsr a0, EXCSAVE_2 /* preserve a0 */ + call0 _xt_medint2 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .text + .type _xt_medint2,@function + .align 4 +_xt_medint2: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_2 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_2 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_2 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint2_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(2) | PS_UM + #else + movi a0, PS_INTLEVEL(2) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 2 XCHAL_INTLEVEL2_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint2_exit + .type _xt_medint2_exit,@function + .align 4 +_xt_medint2_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_2 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_2 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 2 + +#endif /* Level 2 */ + +#if XCHAL_EXCM_LEVEL >= 3 + + .begin literal_prefix .Level3InterruptVector + .section .Level3InterruptVector.text, "ax" + .global _Level3Vector + .type _Level3Vector,@function + .align 4 + .literal_position + +_Level3Vector: + wsr a0, EXCSAVE_3 /* preserve a0 */ + call0 _xt_medint3 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .text + .type _xt_medint3,@function + .align 4 +_xt_medint3: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_3 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_3 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_3 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint3_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(3) | PS_UM + #else + movi a0, PS_INTLEVEL(3) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 3 XCHAL_INTLEVEL3_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint3_exit + .type _xt_medint3_exit,@function + .align 4 +_xt_medint3_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_3 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_3 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 3 + +#endif /* Level 3 */ + +#if XCHAL_EXCM_LEVEL >= 4 + + .begin literal_prefix .Level4InterruptVector + .section .Level4InterruptVector.text, "ax" + .global _Level4Vector + .type _Level4Vector,@function + .align 4 + .literal_position + +_Level4Vector: + wsr a0, EXCSAVE_4 /* preserve a0 */ + call0 _xt_medint4 /* load interrupt handler */ + + .end literal_prefix + + .text + .type _xt_medint4,@function + .align 4 +_xt_medint4: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_4 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_4 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_4 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint4_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(4) | PS_UM + #else + movi a0, PS_INTLEVEL(4) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 4 XCHAL_INTLEVEL4_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint4_exit + .type _xt_medint4_exit,@function + .align 4 +_xt_medint4_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_4 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_4 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 4 + +#endif /* Level 4 */ + +#if XCHAL_EXCM_LEVEL >= 5 + + .begin literal_prefix .Level5InterruptVector + .section .Level5InterruptVector.text, "ax" + .global _Level5Vector + .type _Level5Vector,@function + .align 4 + .literal_position + +_Level5Vector: + wsr a0, EXCSAVE_5 /* preserve a0 */ + call0 _xt_medint5 /* load interrupt handler */ + + .end literal_prefix + + .text + .type _xt_medint5,@function + .align 4 +_xt_medint5: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_5 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_5 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_5 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint5_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(5) | PS_UM + #else + movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 5 XCHAL_INTLEVEL5_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint5_exit + .type _xt_medint5_exit,@function + .align 4 +_xt_medint5_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_5 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_5 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 5 + +#endif /* Level 5 */ + +#if XCHAL_EXCM_LEVEL >= 6 + + .begin literal_prefix .Level6InterruptVector + .section .Level6InterruptVector.text, "ax" + .global _Level6Vector + .type _Level6Vector,@function + .align 4 + .literal_position + +_Level6Vector: + wsr a0, EXCSAVE_6 /* preserve a0 */ + call0 _xt_medint6 /* load interrupt handler */ + + .end literal_prefix + + .text + .type _xt_medint6,@function + .align 4 +_xt_medint6: + mov a0, sp /* sp == a1 */ + addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */ + s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */ + rsr a0, EPS_6 /* save interruptee's PS */ + s32i a0, sp, XT_STK_PS + rsr a0, EPC_6 /* save interruptee's PC */ + s32i a0, sp, XT_STK_PC + rsr a0, EXCSAVE_6 /* save interruptee's a0 */ + s32i a0, sp, XT_STK_A0 + movi a0, _xt_medint6_exit /* save exit point for dispatch */ + s32i a0, sp, XT_STK_EXIT + + /* Save rest of interrupt context and enter RTOS. */ + call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */ + + /* !! We are now on the RTOS system stack !! */ + + /* Set up PS for C, enable interrupts above this level and clear EXCM. */ + #ifdef __XTENSA_CALL0_ABI__ + movi a0, PS_INTLEVEL(6) | PS_UM + #else + movi a0, PS_INTLEVEL(6) | PS_UM | PS_WOE + #endif + wsr a0, PS + rsync + + /* OK to call C code at this point, dispatch user ISRs */ + + dispatch_c_isr 6 XCHAL_INTLEVEL6_MASK + + /* Done handling interrupts, transfer control to OS */ + call0 XT_RTOS_INT_EXIT /* does not return directly here */ + + /* + Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT + on entry and used to return to a thread or interrupted interrupt handler. + */ + .global _xt_medint6_exit + .type _xt_medint6_exit,@function + .align 4 +_xt_medint6_exit: + /* Restore only level-specific regs (the rest were already restored) */ + l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */ + wsr a0, EPS_6 + l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */ + wsr a0, EPC_6 + l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */ + l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */ + rsync /* ensure EPS and EPC written */ + rfi 6 + +#endif /* Level 6 */ + + +/******************************************************************************* + +HIGH PRIORITY (LEVEL > XCHAL_EXCM_LEVEL) INTERRUPT VECTORS AND HANDLERS + +High priority interrupts are by definition those with priorities greater +than XCHAL_EXCM_LEVEL. This includes non-maskable (NMI). High priority +interrupts cannot interact with the RTOS, that is they must save all regs +they use and not call any RTOS function. + +A further restriction imposed by the Xtensa windowed architecture is that +high priority interrupts must not modify the stack area even logically +"above" the top of the interrupted stack (they need to provide their +own stack or static save area). + +Cadence Design Systems recommends high priority interrupt handlers be coded in assembly +and used for purposes requiring very short service times. + +Here are templates for high priority (level 2+) interrupt vectors. +They assume only one interrupt per level to avoid the burden of identifying +which interrupts at this level are pending and enabled. This allows for +minimum latency and avoids having to save/restore a2 in addition to a0. +If more than one interrupt per high priority level is configured, this burden +is on the handler which in any case must provide a way to save and restore +registers it uses without touching the interrupted stack. + +Each vector goes at a predetermined location according to the Xtensa +hardware configuration, which is ensured by its placement in a special +section known to the Xtensa linker support package (LSP). It performs +the minimum necessary before jumping to the handler in the .text section. + +*******************************************************************************/ + +/* +Currently only shells for high priority interrupt handlers are provided +here. However a template and example can be found in the Cadence Design Systems tools +documentation: "Microprocessor Programmer's Guide". +*/ + +#if XCHAL_NUM_INTLEVELS >=2 && XCHAL_EXCM_LEVEL <2 && XCHAL_DEBUGLEVEL !=2 + + .begin literal_prefix .Level2InterruptVector + .section .Level2InterruptVector.text, "ax" + .global _Level2Vector + .type _Level2Vector,@function + .align 4 +_Level2Vector: + wsr a0, EXCSAVE_2 /* preserve a0 */ + call0 _xt_highint2 /* load interrupt handler */ + + .end literal_prefix + + .text + .type _xt_highint2,@function + .align 4 +_xt_highint2: + + #ifdef XT_INTEXC_HOOKS + /* Call interrupt hook if present to (pre)handle interrupts. */ + movi a0, _xt_intexc_hooks + l32i a0, a0, 2<<2 + beqz a0, 1f +.Ln_xt_highint2_call_hook: + callx0 a0 /* must NOT disturb stack! */ +1: + #endif + + /* USER_EDIT: + ADD HIGH PRIORITY LEVEL 2 INTERRUPT HANDLER CODE HERE. + */ + + .align 4 +.L_xt_highint2_exit: + rsr a0, EXCSAVE_2 /* restore a0 */ + rfi 2 + +#endif /* Level 2 */ + +#if XCHAL_NUM_INTLEVELS >=3 && XCHAL_EXCM_LEVEL <3 && XCHAL_DEBUGLEVEL !=3 + + .begin literal_prefix .Level3InterruptVector + .section .Level3InterruptVector.text, "ax" + .global _Level3Vector + .type _Level3Vector,@function + .align 4 +_Level3Vector: + wsr a0, EXCSAVE_3 /* preserve a0 */ + call0 _xt_highint3 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .text + .type _xt_highint3,@function + .align 4 +_xt_highint3: + + #ifdef XT_INTEXC_HOOKS + /* Call interrupt hook if present to (pre)handle interrupts. */ + movi a0, _xt_intexc_hooks + l32i a0, a0, 3<<2 + beqz a0, 1f +.Ln_xt_highint3_call_hook: + callx0 a0 /* must NOT disturb stack! */ +1: + #endif + + /* USER_EDIT: + ADD HIGH PRIORITY LEVEL 3 INTERRUPT HANDLER CODE HERE. + */ + + .align 4 +.L_xt_highint3_exit: + rsr a0, EXCSAVE_3 /* restore a0 */ + rfi 3 + +#endif /* Level 3 */ + +#if XCHAL_NUM_INTLEVELS >=4 && XCHAL_EXCM_LEVEL <4 && XCHAL_DEBUGLEVEL !=4 + + .begin literal_prefix .Level4InterruptVector + .section .Level4InterruptVector.text, "ax" + .global _Level4Vector + .type _Level4Vector,@function + .align 4 +_Level4Vector: + wsr a0, EXCSAVE_4 /* preserve a0 */ + call0 _xt_highint4 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .text + .type _xt_highint4,@function + .align 4 +_xt_highint4: + + #ifdef XT_INTEXC_HOOKS + /* Call interrupt hook if present to (pre)handle interrupts. */ + movi a0, _xt_intexc_hooks + l32i a0, a0, 4<<2 + beqz a0, 1f +.Ln_xt_highint4_call_hook: + callx0 a0 /* must NOT disturb stack! */ +1: + #endif + + /* USER_EDIT: + ADD HIGH PRIORITY LEVEL 4 INTERRUPT HANDLER CODE HERE. + */ + + .align 4 +.L_xt_highint4_exit: + rsr a0, EXCSAVE_4 /* restore a0 */ + rfi 4 + +#endif /* Level 4 */ + +#if XCHAL_NUM_INTLEVELS >=5 && XCHAL_EXCM_LEVEL <5 && XCHAL_DEBUGLEVEL !=5 + + .begin literal_prefix .Level5InterruptVector + .section .Level5InterruptVector.text, "ax" + .global _Level5Vector + .type _Level5Vector,@function + .align 4 +_Level5Vector: + wsr a0, EXCSAVE_5 /* preserve a0 */ + call0 _xt_highint5 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .text + .type _xt_highint5,@function + .align 4 +_xt_highint5: + + #ifdef XT_INTEXC_HOOKS + /* Call interrupt hook if present to (pre)handle interrupts. */ + movi a0, _xt_intexc_hooks + l32i a0, a0, 5<<2 + beqz a0, 1f +.Ln_xt_highint5_call_hook: + callx0 a0 /* must NOT disturb stack! */ +1: + #endif + + /* USER_EDIT: + ADD HIGH PRIORITY LEVEL 5 INTERRUPT HANDLER CODE HERE. + */ + + .align 4 +.L_xt_highint5_exit: + rsr a0, EXCSAVE_5 /* restore a0 */ + rfi 5 + +#endif /* Level 5 */ + +#if XCHAL_NUM_INTLEVELS >=6 && XCHAL_EXCM_LEVEL <6 && XCHAL_DEBUGLEVEL !=6 + + .begin literal_prefix .Level6InterruptVector + .section .Level6InterruptVector.text, "ax" + .global _Level6Vector + .type _Level6Vector,@function + .align 4 +_Level6Vector: + wsr a0, EXCSAVE_6 /* preserve a0 */ + call0 _xt_highint6 /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .text + .type _xt_highint6,@function + .align 4 +_xt_highint6: + + #ifdef XT_INTEXC_HOOKS + /* Call interrupt hook if present to (pre)handle interrupts. */ + movi a0, _xt_intexc_hooks + l32i a0, a0, 6<<2 + beqz a0, 1f +.Ln_xt_highint6_call_hook: + callx0 a0 /* must NOT disturb stack! */ +1: + #endif + + /* USER_EDIT: + ADD HIGH PRIORITY LEVEL 6 INTERRUPT HANDLER CODE HERE. + */ + + .align 4 +.L_xt_highint6_exit: + rsr a0, EXCSAVE_6 /* restore a0 */ + rfi 6 + +#endif /* Level 6 */ + +#if XCHAL_HAVE_NMI + + .begin literal_prefix .NMIExceptionVector + .section .NMIExceptionVector.text, "ax" + .global _NMIExceptionVector + .type _NMIExceptionVector,@function + .align 4 +_NMIExceptionVector: + wsr a0, EXCSAVE + XCHAL_NMILEVEL _ /* preserve a0 */ + call0 _xt_nmi /* load interrupt handler */ + /* never returns here - call0 is used as a jump (see note at top) */ + + .end literal_prefix + + .text + .type _xt_nmi,@function + .align 4 +_xt_nmi: + + #ifdef XT_INTEXC_HOOKS + /* Call interrupt hook if present to (pre)handle interrupts. */ + movi a0, _xt_intexc_hooks + l32i a0, a0, XCHAL_NMILEVEL<<2 + beqz a0, 1f +.Ln_xt_nmi_call_hook: + callx0 a0 /* must NOT disturb stack! */ +1: + #endif + + /* USER_EDIT: + ADD HIGH PRIORITY NON-MASKABLE INTERRUPT (NMI) HANDLER CODE HERE. + */ + + .align 4 +.L_xt_nmi_exit: + rsr a0, EXCSAVE + XCHAL_NMILEVEL /* restore a0 */ + rfi XCHAL_NMILEVEL + +#endif /* NMI */ + + +/******************************************************************************* + +WINDOW OVERFLOW AND UNDERFLOW EXCEPTION VECTORS AND ALLOCA EXCEPTION HANDLER + +Here is the code for each window overflow/underflow exception vector and +(interspersed) efficient code for handling the alloca exception cause. +Window exceptions are handled entirely in the vector area and are very +tight for performance. The alloca exception is also handled entirely in +the window vector area so comes at essentially no cost in code size. +Users should never need to modify them and Cadence Design Systems recommends +they do not. + +Window handlers go at predetermined vector locations according to the +Xtensa hardware configuration, which is ensured by their placement in a +special section known to the Xtensa linker support package (LSP). Since +their offsets in that section are always the same, the LSPs do not define +a section per vector. + +These things are coded for XEA2 only (XEA1 is not supported). + +Note on Underflow Handlers: +The underflow handler for returning from call[i+1] to call[i] +must preserve all the registers from call[i+1]'s window. +In particular, a0 and a1 must be preserved because the RETW instruction +will be reexecuted (and may even underflow if an intervening exception +has flushed call[i]'s registers). +Registers a2 and up may contain return values. + +*******************************************************************************/ + +#if XCHAL_HAVE_WINDOWED + + .section .WindowVectors.text, "ax" + +/* +-------------------------------------------------------------------------------- +Window Overflow Exception for Call4. + +Invoked if a call[i] referenced a register (a4-a15) +that contains data from ancestor call[j]; +call[j] had done a call4 to call[j+1]. +On entry here: + window rotated to call[j] start point; + a0-a3 are registers to be saved; + a4-a15 must be preserved; + a5 is call[j+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x0 + .global _WindowOverflow4 +_WindowOverflow4: + + s32e a0, a5, -16 /* save a0 to call[j+1]'s stack frame */ + s32e a1, a5, -12 /* save a1 to call[j+1]'s stack frame */ + s32e a2, a5, -8 /* save a2 to call[j+1]'s stack frame */ + s32e a3, a5, -4 /* save a3 to call[j+1]'s stack frame */ + rfwo /* rotates back to call[i] position */ + +/* +-------------------------------------------------------------------------------- +Window Underflow Exception for Call4 + +Invoked by RETW returning from call[i+1] to call[i] +where call[i]'s registers must be reloaded (not live in ARs); +where call[i] had done a call4 to call[i+1]. +On entry here: + window rotated to call[i] start point; + a0-a3 are undefined, must be reloaded with call[i].reg[0..3]; + a4-a15 must be preserved (they are call[i+1].reg[0..11]); + a5 is call[i+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x40 + .global _WindowUnderflow4 +_WindowUnderflow4: + + l32e a0, a5, -16 /* restore a0 from call[i+1]'s stack frame */ + l32e a1, a5, -12 /* restore a1 from call[i+1]'s stack frame */ + l32e a2, a5, -8 /* restore a2 from call[i+1]'s stack frame */ + l32e a3, a5, -4 /* restore a3 from call[i+1]'s stack frame */ + rfwu + +/* +-------------------------------------------------------------------------------- +Handle alloca exception generated by interruptee executing 'movsp'. +This uses space between the window vectors, so is essentially "free". +All interruptee's regs are intact except a0 which is saved in EXCSAVE_1, +and PS.EXCM has been set by the exception hardware (can't be interrupted). +The fact the alloca exception was taken means the registers associated with +the base-save area have been spilled and will be restored by the underflow +handler, so those 4 registers are available for scratch. +The code is optimized to avoid unaligned branches and minimize cache misses. +-------------------------------------------------------------------------------- +*/ + + .align 4 + .global _xt_alloca_exc +_xt_alloca_exc: + + rsr a0, WINDOWBASE /* grab WINDOWBASE before rotw changes it */ + rotw -1 /* WINDOWBASE goes to a4, new a0-a3 are scratch */ + rsr a2, PS + extui a3, a2, XCHAL_PS_OWB_SHIFT, XCHAL_PS_OWB_BITS + xor a3, a3, a4 /* bits changed from old to current windowbase */ + rsr a4, EXCSAVE_1 /* restore original a0 (now in a4) */ + slli a3, a3, XCHAL_PS_OWB_SHIFT + xor a2, a2, a3 /* flip changed bits in old window base */ + wsr a2, PS /* update PS.OWB to new window base */ + rsync + + _bbci.l a4, 31, _WindowUnderflow4 + rotw -1 /* original a0 goes to a8 */ + _bbci.l a8, 30, _WindowUnderflow8 + rotw -1 + j _WindowUnderflow12 + +/* +-------------------------------------------------------------------------------- +Window Overflow Exception for Call8 + +Invoked if a call[i] referenced a register (a4-a15) +that contains data from ancestor call[j]; +call[j] had done a call8 to call[j+1]. +On entry here: + window rotated to call[j] start point; + a0-a7 are registers to be saved; + a8-a15 must be preserved; + a9 is call[j+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x80 + .global _WindowOverflow8 +_WindowOverflow8: + + s32e a0, a9, -16 /* save a0 to call[j+1]'s stack frame */ + l32e a0, a1, -12 /* a0 <- call[j-1]'s sp + (used to find end of call[j]'s frame) */ + s32e a1, a9, -12 /* save a1 to call[j+1]'s stack frame */ + s32e a2, a9, -8 /* save a2 to call[j+1]'s stack frame */ + s32e a3, a9, -4 /* save a3 to call[j+1]'s stack frame */ + s32e a4, a0, -32 /* save a4 to call[j]'s stack frame */ + s32e a5, a0, -28 /* save a5 to call[j]'s stack frame */ + s32e a6, a0, -24 /* save a6 to call[j]'s stack frame */ + s32e a7, a0, -20 /* save a7 to call[j]'s stack frame */ + rfwo /* rotates back to call[i] position */ + +/* +-------------------------------------------------------------------------------- +Window Underflow Exception for Call8 + +Invoked by RETW returning from call[i+1] to call[i] +where call[i]'s registers must be reloaded (not live in ARs); +where call[i] had done a call8 to call[i+1]. +On entry here: + window rotated to call[i] start point; + a0-a7 are undefined, must be reloaded with call[i].reg[0..7]; + a8-a15 must be preserved (they are call[i+1].reg[0..7]); + a9 is call[i+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0xC0 + .global _WindowUnderflow8 +_WindowUnderflow8: + + l32e a0, a9, -16 /* restore a0 from call[i+1]'s stack frame */ + l32e a1, a9, -12 /* restore a1 from call[i+1]'s stack frame */ + l32e a2, a9, -8 /* restore a2 from call[i+1]'s stack frame */ + l32e a7, a1, -12 /* a7 <- call[i-1]'s sp + (used to find end of call[i]'s frame) */ + l32e a3, a9, -4 /* restore a3 from call[i+1]'s stack frame */ + l32e a4, a7, -32 /* restore a4 from call[i]'s stack frame */ + l32e a5, a7, -28 /* restore a5 from call[i]'s stack frame */ + l32e a6, a7, -24 /* restore a6 from call[i]'s stack frame */ + l32e a7, a7, -20 /* restore a7 from call[i]'s stack frame */ + rfwu + +/* +-------------------------------------------------------------------------------- +Window Overflow Exception for Call12 + +Invoked if a call[i] referenced a register (a4-a15) +that contains data from ancestor call[j]; +call[j] had done a call12 to call[j+1]. +On entry here: + window rotated to call[j] start point; + a0-a11 are registers to be saved; + a12-a15 must be preserved; + a13 is call[j+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x100 + .global _WindowOverflow12 +_WindowOverflow12: + + s32e a0, a13, -16 /* save a0 to call[j+1]'s stack frame */ + l32e a0, a1, -12 /* a0 <- call[j-1]'s sp + (used to find end of call[j]'s frame) */ + s32e a1, a13, -12 /* save a1 to call[j+1]'s stack frame */ + s32e a2, a13, -8 /* save a2 to call[j+1]'s stack frame */ + s32e a3, a13, -4 /* save a3 to call[j+1]'s stack frame */ + s32e a4, a0, -48 /* save a4 to end of call[j]'s stack frame */ + s32e a5, a0, -44 /* save a5 to end of call[j]'s stack frame */ + s32e a6, a0, -40 /* save a6 to end of call[j]'s stack frame */ + s32e a7, a0, -36 /* save a7 to end of call[j]'s stack frame */ + s32e a8, a0, -32 /* save a8 to end of call[j]'s stack frame */ + s32e a9, a0, -28 /* save a9 to end of call[j]'s stack frame */ + s32e a10, a0, -24 /* save a10 to end of call[j]'s stack frame */ + s32e a11, a0, -20 /* save a11 to end of call[j]'s stack frame */ + rfwo /* rotates back to call[i] position */ + +/* +-------------------------------------------------------------------------------- +Window Underflow Exception for Call12 + +Invoked by RETW returning from call[i+1] to call[i] +where call[i]'s registers must be reloaded (not live in ARs); +where call[i] had done a call12 to call[i+1]. +On entry here: + window rotated to call[i] start point; + a0-a11 are undefined, must be reloaded with call[i].reg[0..11]; + a12-a15 must be preserved (they are call[i+1].reg[0..3]); + a13 is call[i+1]'s stack pointer. +-------------------------------------------------------------------------------- +*/ + + .org 0x140 + .global _WindowUnderflow12 +_WindowUnderflow12: + + l32e a0, a13, -16 /* restore a0 from call[i+1]'s stack frame */ + l32e a1, a13, -12 /* restore a1 from call[i+1]'s stack frame */ + l32e a2, a13, -8 /* restore a2 from call[i+1]'s stack frame */ + l32e a11, a1, -12 /* a11 <- call[i-1]'s sp + (used to find end of call[i]'s frame) */ + l32e a3, a13, -4 /* restore a3 from call[i+1]'s stack frame */ + l32e a4, a11, -48 /* restore a4 from end of call[i]'s stack frame */ + l32e a5, a11, -44 /* restore a5 from end of call[i]'s stack frame */ + l32e a6, a11, -40 /* restore a6 from end of call[i]'s stack frame */ + l32e a7, a11, -36 /* restore a7 from end of call[i]'s stack frame */ + l32e a8, a11, -32 /* restore a8 from end of call[i]'s stack frame */ + l32e a9, a11, -28 /* restore a9 from end of call[i]'s stack frame */ + l32e a10, a11, -24 /* restore a10 from end of call[i]'s stack frame */ + l32e a11, a11, -20 /* restore a11 from end of call[i]'s stack frame */ + rfwu + +#endif /* XCHAL_HAVE_WINDOWED */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/Tick.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/Tick.c new file mode 100644 index 0000000..1f1b562 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/Tick.c @@ -0,0 +1,139 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V3.0.0 + + ISRcode is pulled inline and portTICKisr() is therefore + deleted from this file. + + + Prescaler logic for Timer1 added to allow for a wider + range of TickRates. + +Changes from V3.0.1 +*/ + +#include +#include + +/* IO port constants. */ +#define portBIT_SET (1) +#define portBIT_CLEAR (0) + +/* + * Hardware setup for the tick. + * We use a compare match on timer1. Depending on MPU-frequency + * and requested tickrate, a prescaled value with a matching + * prescaler are determined. + */ +#define portTIMER_COMPARE_BASE ((APROCFREQ/4)/configTICK_RATE_HZ) + +#if portTIMER_COMPARE_BASE < 0x10000 + #define portTIMER_COMPARE_VALUE (portTIMER_COMPARE_BASE) + #define portTIMER_COMPARE_PS1 (portBIT_CLEAR) + #define portTIMER_COMPARE_PS0 (portBIT_CLEAR) +#elif portTIMER_COMPARE_BASE < 0x20000 + #define portTIMER_COMPARE_VALUE (portTIMER_COMPARE_BASE / 2) + #define portTIMER_COMPARE_PS1 (portBIT_CLEAR) + #define portTIMER_COMPARE_PS0 (portBIT_SET) +#elif portTIMER_COMPARE_BASE < 0x40000 + #define portTIMER_COMPARE_VALUE (portTIMER_COMPARE_BASE / 4) + #define portTIMER_COMPARE_PS1 (portBIT_SET) + #define portTIMER_COMPARE_PS0 (portBIT_CLEAR) +#elif portTIMER_COMPARE_BASE < 0x80000 + #define portTIMER_COMPARE_VALUE (portTIMER_COMPARE_BASE / 8) + #define portTIMER_COMPARE_PS1 (portBIT_SET) + #define portTIMER_COMPARE_PS0 (portBIT_SET) +#else + #error "TickRate out of range" +#endif + +/*-----------------------------------------------------------*/ + +/* + * Setup a timer for a regular tick. + */ +void portSetupTick( void ) +{ + /* + * Interrupts are disabled when this function is called. + */ + + /* + * Setup CCP1 + * Provide the tick interrupt using a compare match on timer1. + */ + + /* + * Set the compare match value. + */ + CCPR1H = ( uint8_t ) ( ( portTIMER_COMPARE_VALUE >> 8 ) & 0xff ); + CCPR1L = ( uint8_t ) ( portTIMER_COMPARE_VALUE & 0xff ); + + /* + * Set Compare Special Event Trigger Mode + */ + bCCP1M3 = portBIT_SET; + bCCP1M2 = portBIT_CLEAR; + bCCP1M1 = portBIT_SET; + bCCP1M0 = portBIT_SET; + + /* + * Enable CCP1 interrupt + */ + bCCP1IE = portBIT_SET; + + /* + * We are only going to use the global interrupt bit, so disable + * interruptpriorities and enable peripheral interrupts. + */ + bIPEN = portBIT_CLEAR; + bPEIE = portBIT_SET; + + /* + * Set up timer1 + * It will produce the system tick. + */ + + /* + * Clear the time count + */ + TMR1H = ( uint8_t ) 0x00; + TMR1L = ( uint8_t ) 0x00; + + /* + * Setup the timer + */ + bRD16 = portBIT_SET; // 16-bit + bT1CKPS1 = portTIMER_COMPARE_PS1; // prescaler + bT1CKPS0 = portTIMER_COMPARE_PS0; // prescaler + bT1OSCEN = portBIT_SET; // Oscillator enable + bT1SYNC = portBIT_SET; // No external clock sync + bTMR1CS = portBIT_CLEAR; // Internal clock + + bTMR1ON = portBIT_SET; // Start timer1 +} diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/isrTick.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/isrTick.c new file mode 100644 index 0000000..cbc7c09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/isrTick.c @@ -0,0 +1,79 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V3.0.0 + + ISRcode pulled inline to reduce stack-usage. + + + Added functionality to only call vTaskSwitchContext() once + when handling multiple interruptsources in a single interruptcall. + + + Filename changed to a .c extension to allow stepping through code + using F7. + +Changes from V3.0.1 +*/ + +/* + * ISR for the tick. + * This increments the tick count and, if using the preemptive scheduler, + * performs a context switch. This must be identical to the manual + * context switch in how it stores the context of a task. + */ + +#ifndef _FREERTOS_DRIVERS_TICK_ISRTICK_C +#define _FREERTOS_DRIVERS_TICK_ISRTICK_C + +{ + /* + * Was the interrupt the SystemClock? + */ + if( bCCP1IF && bCCP1IE ) + { + /* + * Reset the interrupt flag + */ + bCCP1IF = 0; + + /* + * Maintain the tick count. + */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* + * Ask for a switch to the highest priority task + * that is ready to run. + */ + uxSwitchRequested = pdTRUE; + } + } +} + +#pragma wizcpp uselib "$__PATHNAME__/Tick.c" + +#endif /* _FREERTOS_DRIVERS_TICK_ISRTICK_C */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Install.bat b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Install.bat new file mode 100644 index 0000000..7259ead --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Install.bat @@ -0,0 +1,172 @@ + +@echo off +cls + +SET PACKAGENAME=the FreeRTOS port for fedC and wizC + +echo. +echo Hello, I'm the installationscript for %PACKAGENAME%. +echo. + +:CHECKFEDC + set FED=C:\Program Files\FED\PIC_C + echo. + echo I'm checking your system for fedC + if not exist "%FED%" goto NOFEDC + echo YES, I found a fedC-installation! + goto FOUNDFED +:NOFEDC + echo I could not find a fedC-installation. + + +:CHECKWIZC + set FED=C:\Program Files\FED\PIXIE + echo. + echo I'm checking your system for wizC + if not exist "%FED%" goto NOWIZC + echo YES, I found a wizC-installation! + goto FOUNDFED +:noWIZC + echo I could not find a wizC-installation. + + +:ERROR + echo. + echo. + echo I could not find a FED C-compiler installation on your system. + echo. + echo Perhaps I got confused because you installed fedC or wizC in a non-default directory. + echo If this is the case, please change the path at the top of this install-script. + echo After that rerun the script and I will be happy to try again. + echo. + goto ENDIT + + +:FOUNDFED + echo. + echo. + + set FEDLIBS=%FED%\Libs + set FEDLIBSUSER=%FEDLIBS%\LibsUser + + if exist "%FEDLIBS%" goto INSTALL + echo The FED installationdirectory "%FED%" + echo contains no Libs subdirectory. This is weird! + echo. + echo Installation is aborted, sorry... + goto ENDIT + + +:INSTALL + echo I am about to install %PACKAGENAME% + echo into directory %FEDLIBSUSER% + echo. + echo Press 'enter' to let me do my thing + echo Press 'ctrl-c' to stop me + pause >nul + echo. + echo Installing... + + +:RESET_READONLY + echo. + echo Removing ReadOnly attributes + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\Croutine.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\Port.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\List.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\Queue.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Modules\Tasks.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\Tick.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\isrTick.c" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Portmacro.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Croutine.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\List.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Portable.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Projdefs.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Queue.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Semphr.h" >nul + attrib -R "%FEDLIBSUSER%\libFreeRTOS\Include\Task.h" >nul + attrib -R "%FEDLIBSUSER%\FreeRTOS.h" >nul + echo Done + +:CREATE_DIRECTORIES + echo. + echo Creating directories (if necessary)... + if not exist "%FEDLIBSUSER%" mkdir "%FEDLIBSUSER%" + if not exist "%FEDLIBSUSER%\libFreeRTOS" mkdir "%FEDLIBSUSER%\libFreeRTOS" + if not exist "%FEDLIBSUSER%\libFreeRTOS\Drivers" mkdir "%FEDLIBSUSER%\libFreeRTOS\Drivers" + if not exist "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick" mkdir "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick" + if not exist "%FEDLIBSUSER%\libFreeRTOS\Include" mkdir "%FEDLIBSUSER%\libFreeRTOS\Include" + if not exist "%FEDLIBSUSER%\libFreeRTOS\Modules" mkdir "%FEDLIBSUSER%\libFreeRTOS\Modules" + echo Done + + + echo. + echo Copying Files... +:COPY_MODULES + echo Modules... + copy /V /Y "Port.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\Port.c" >nul + copy /V /Y "..\..\..\Croutine.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\Croutine.c" >nul + copy /V /Y "..\..\..\List.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\List.c" >nul + copy /V /Y "..\..\..\Queue.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\Queue.c" >nul + copy /V /Y "..\..\..\Tasks.c" "%FEDLIBSUSER%\libFreeRTOS\Modules\Tasks.c" >nul + +:COPY_DRIVERS + echo Drivers... + copy /V /Y "Drivers\Tick\Tick.c" "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\Tick.c" >nul + copy /V /Y "Drivers\Tick\isrTick.c" "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\isrTick.c" >nul + +:COPY_HEADERS + echo Headers... + copy /V /Y "portmacro.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Portmacro.h" >nul + copy /V /Y "..\..\..\include\Croutine.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Croutine.h" >nul + copy /V /Y "..\..\..\include\List.h" "%FEDLIBSUSER%\libFreeRTOS\Include\List.h" >nul + copy /V /Y "..\..\..\include\Portable.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Portable.h" >nul + copy /V /Y "..\..\..\include\Projdefs.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Projdefs.h" >nul + copy /V /Y "..\..\..\include\Queue.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Queue.h" >nul + copy /V /Y "..\..\..\include\Semphr.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Semphr.h" >nul + copy /V /Y "..\..\..\include\Task.h" "%FEDLIBSUSER%\libFreeRTOS\Include\Task.h" >nul + copy /V /Y "addFreeRTOS.h" + "..\..\..\include\FreeRTOS.h" "%FEDLIBSUSER%\FreeRTOS.h" >nul + + + echo Done + + +:SET_READONLY + echo. + echo Setting files to ReadOnly + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\Port.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\Croutine.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\List.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\Queue.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Modules\Tasks.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\Tick.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Drivers\Tick\isrTick.c" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Portmacro.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Croutine.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\List.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Portable.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Projdefs.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Queue.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Semphr.h" >nul + attrib +R "%FEDLIBSUSER%\libFreeRTOS\Include\Task.h" >nul + attrib +R "%FEDLIBSUSER%\FreeRTOS.h" >nul + echo Done + + +:FINISHED + echo. + echo The installation of %PACKAGENAME% is completed. + echo. + echo Please review the installation instructions as additional libraries + echo and fedC/wizC configuration settings may be needed for FreeRTOS + echo to function correctly. + + goto ENDIT + + +:ENDIT + echo. + echo. + echo Press 'enter' to close this window + pause >nul diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/addFreeRTOS.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/addFreeRTOS.h new file mode 100644 index 0000000..5fd741e --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/addFreeRTOS.h @@ -0,0 +1,54 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V3.0.0 + +Changes from V3.0.1 + +Changes from V4.0.1 + Uselib pragma added for Croutine.c +*/ + +/* + * The installation script will automatically prepend this file to the default FreeRTOS.h. + */ + +#ifndef WIZC_FREERTOS_H +#define WIZC_FREERTOS_H + +#pragma noheap +#pragma wizcpp expandnl on +#pragma wizcpp searchpath "$__PATHNAME__/libFreeRTOS/Include/" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/Croutine.c" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/Tasks.c" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/Queue.c" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/List.c" +#pragma wizcpp uselib "$__PATHNAME__/libFreeRTOS/Modules/Port.c" + +#endif /* WIZC_FREERTOS_H */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/port.c new file mode 100644 index 0000000..ea0814f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/port.c @@ -0,0 +1,318 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V3.2.1 + + CallReturn Depth increased from 8 to 10 levels to accomodate wizC/fedC V12. + +Changes from V3.2.0 + + TBLPTRU is now initialised to zero during the initial stack creation of a new task. This solves + an error on devices with more than 64kB ROM. + +Changes from V3.0.0 + + ucCriticalNesting is now initialised to 0x7F to prevent interrupts from being + handled before the scheduler is started. + +Changes from V3.0.1 +*/ + +/* Scheduler include files. */ +#include +#include + +#include + +/*--------------------------------------------------------------------------- + * Implementation of functions defined in portable.h for the WizC PIC18 port. + *---------------------------------------------------------------------------*/ + +/* + * We require the address of the pxCurrentTCB variable, but don't want to + * know any details of its type. + */ +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; + +/* + * Define minimal-stack constants + * ----- + * FSR's: + * STATUS, WREG, BSR, PRODH, PRODL, FSR0H, FSR0L, + * FSR1H, FSR1L,TABLAT, (TBLPTRU), TBLPTRH, TBLPTRL, + * (PCLATU), PCLATH + * sfr's within parenthesis only on devices > 64kB + * ----- + * Call/Return stack: + * 2 bytes per entry on devices <= 64kB + * 3 bytes per entry on devices > 64kB + * ----- + * Other bytes: + * 2 bytes: FunctionParameter for initial taskcode + * 1 byte : Number of entries on call/return stack + * 1 byte : ucCriticalNesting + * 16 bytes: Free space on stack + */ +#if _ROMSIZE > 0x8000 + #define portSTACK_FSR_BYTES ( 15 ) + #define portSTACK_CALLRETURN_ENTRY_SIZE ( 3 ) +#else + #define portSTACK_FSR_BYTES ( 13 ) + #define portSTACK_CALLRETURN_ENTRY_SIZE ( 2 ) +#endif + +#define portSTACK_MINIMAL_CALLRETURN_DEPTH ( 10 ) +#define portSTACK_OTHER_BYTES ( 20 ) + +uint16_t usCalcMinStackSize = 0; + +/*-----------------------------------------------------------*/ + +/* + * We initialise ucCriticalNesting to the middle value an + * uint8_t can contain. This way portENTER_CRITICAL() + * and portEXIT_CRITICAL() can be called without interrupts + * being enabled before the scheduler starts. + */ +register uint8_t ucCriticalNesting = 0x7F; + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a new task. + * See portSAVE_CONTEXT macro for description. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +uint8_t ucScratch; + /* + * Get the size of the RAMarea in page 0 used by the compiler + * We do this here already to avoid W-register conflicts. + */ + _Pragma("asm") + movlw OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE + movwf PRODL,ACCESS ; PRODL is used as temp register + _Pragma("asmend") + ucScratch = PRODL; + + /* + * Place a few bytes of known values on the bottom of the stack. + * This is just useful for debugging. + */ +// *pxTopOfStack-- = 0x11; +// *pxTopOfStack-- = 0x22; +// *pxTopOfStack-- = 0x33; + + /* + * Simulate how the stack would look after a call to vPortYield() + * generated by the compiler. + */ + + /* + * First store the function parameters. This is where the task expects + * to find them when it starts running. + */ + *pxTopOfStack-- = ( StackType_t ) ( (( uint16_t ) pvParameters >> 8) & 0x00ff ); + *pxTopOfStack-- = ( StackType_t ) ( ( uint16_t ) pvParameters & 0x00ff ); + + /* + * Next are all the registers that form part of the task context. + */ + *pxTopOfStack-- = ( StackType_t ) 0x11; /* STATUS. */ + *pxTopOfStack-- = ( StackType_t ) 0x22; /* WREG. */ + *pxTopOfStack-- = ( StackType_t ) 0x33; /* BSR. */ + *pxTopOfStack-- = ( StackType_t ) 0x44; /* PRODH. */ + *pxTopOfStack-- = ( StackType_t ) 0x55; /* PRODL. */ + *pxTopOfStack-- = ( StackType_t ) 0x66; /* FSR0H. */ + *pxTopOfStack-- = ( StackType_t ) 0x77; /* FSR0L. */ + *pxTopOfStack-- = ( StackType_t ) 0x88; /* FSR1H. */ + *pxTopOfStack-- = ( StackType_t ) 0x99; /* FSR1L. */ + *pxTopOfStack-- = ( StackType_t ) 0xAA; /* TABLAT. */ +#if _ROMSIZE > 0x8000 + *pxTopOfStack-- = ( StackType_t ) 0x00; /* TBLPTRU. */ +#endif + *pxTopOfStack-- = ( StackType_t ) 0xCC; /* TBLPTRH. */ + *pxTopOfStack-- = ( StackType_t ) 0xDD; /* TBLPTRL. */ +#if _ROMSIZE > 0x8000 + *pxTopOfStack-- = ( StackType_t ) 0xEE; /* PCLATU. */ +#endif + *pxTopOfStack-- = ( StackType_t ) 0xFF; /* PCLATH. */ + + /* + * Next the compiler's scratchspace. + */ + while(ucScratch-- > 0) + { + *pxTopOfStack-- = ( StackType_t ) 0; + } + + /* + * The only function return address so far is the address of the task entry. + * The order is TOSU/TOSH/TOSL. For devices > 64kB, TOSU is put on the + * stack, too. TOSU is always written as zero here because wizC does not allow + * functionpointers to point above 64kB in ROM. + */ +#if _ROMSIZE > 0x8000 + *pxTopOfStack-- = ( StackType_t ) 0; +#endif + *pxTopOfStack-- = ( StackType_t ) ( ( ( uint16_t ) pxCode >> 8 ) & 0x00ff ); + *pxTopOfStack-- = ( StackType_t ) ( ( uint16_t ) pxCode & 0x00ff ); + + /* + * Store the number of return addresses on the hardware stack. + * So far only the address of the task entry point. + */ + *pxTopOfStack-- = ( StackType_t ) 1; + + /* + * The code generated by wizC does not maintain separate + * stack and frame pointers. Therefore the portENTER_CRITICAL macro cannot + * use the stack as per other ports. Instead a variable is used to keep + * track of the critical section nesting. This variable has to be stored + * as part of the task context and is initially set to zero. + */ + *pxTopOfStack-- = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +uint16_t usPortCALCULATE_MINIMAL_STACK_SIZE( void ) +{ + /* + * Fetch the size of compiler's scratchspace. + */ + _Pragma("asm") + movlw OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE + movlb usCalcMinStackSize>>8 + movwf usCalcMinStackSize,BANKED + _Pragma("asmend") + + /* + * Add minimum needed stackspace + */ + usCalcMinStackSize += ( portSTACK_FSR_BYTES ) + + ( portSTACK_MINIMAL_CALLRETURN_DEPTH * portSTACK_CALLRETURN_ENTRY_SIZE ) + + ( portSTACK_OTHER_BYTES ); + + return(usCalcMinStackSize); +} + +/*-----------------------------------------------------------*/ + +BaseType_t xPortStartScheduler( void ) +{ + extern void portSetupTick( void ); + + /* + * Setup a timer for the tick ISR for the preemptive scheduler. + */ + portSetupTick(); + + /* + * Restore the context of the first task to run. + */ + portRESTORE_CONTEXT(); + + /* + * This point should never be reached during execution. + */ + return pdTRUE; +} + +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* + * It is unlikely that the scheduler for the PIC port will get stopped + * once running. When called a reset is done which is probably the + * most valid action. + */ + _Pragma(asmline reset); +} + +/*-----------------------------------------------------------*/ + +/* + * Manual context switch. This is similar to the tick context switch, + * but does not increment the tick count. It must be identical to the + * tick context switch in how it stores the stack of a task. + */ +void vPortYield( void ) +{ + /* + * Save the context of the current task. + */ + portSAVE_CONTEXT( portINTERRUPTS_UNCHANGED ); + + /* + * Switch to the highest priority task that is ready to run. + */ + vTaskSwitchContext(); + + /* + * Start executing the task we have just switched to. + */ + portRESTORE_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + void *pvPortMalloc( uint16_t usWantedSize ) + { + void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = malloc( ( malloc_t ) usWantedSize ); + } + xTaskResumeAll(); + + return pvReturn; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ + +/*-----------------------------------------------------------*/ + +#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + void vPortFree( void *pv ) + { + if( pv ) + { + vTaskSuspendAll(); + { + free( pv ); + } + xTaskResumeAll(); + } + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/portmacro.h new file mode 100644 index 0000000..ac77cbc --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/portmacro.h @@ -0,0 +1,424 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V3.0.0 + +Changes from V3.0.1 +*/ +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#if !defined(_SERIES) || _SERIES != 18 + #error "WizC supports FreeRTOS on the Microchip PIC18-series only" +#endif + +#if !defined(QUICKCALL) || QUICKCALL != 1 + #error "QuickCall must be enabled (see ProjectOptions/Optimisations)" +#endif + +#include +#include + +#define portCHAR char +#define portFLOAT float +#define portDOUBLE portFLOAT +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint8_t +#define portBASE_TYPE char + +typedef portSTACK_TYPE StackType_t; +typedef signed char BaseType_t; +typedef unsigned char UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) ( 0xFFFF ) +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) ( 0xFFFFFFFF ) +#endif + +#define portBYTE_ALIGNMENT 1 + +/*-----------------------------------------------------------*/ + +/* + * Constant used for context switch macro when we require the interrupt + * enable state to be forced when the interrupted task is switched back in. + */ +#define portINTERRUPTS_FORCED (0x01) + +/* + * Constant used for context switch macro when we require the interrupt + * enable state to be unchanged when the interrupted task is switched back in. + */ +#define portINTERRUPTS_UNCHANGED (0x00) + +/* Initial interrupt enable state for newly created tasks. This value is + * used when a task switches in for the first time. + */ +#define portINTERRUPTS_INITIAL_STATE (portINTERRUPTS_FORCED) + +/* + * Macros to modify the global interrupt enable bit in INTCON. + */ +#define portDISABLE_INTERRUPTS() \ + do \ + { \ + bGIE=0; \ + } while(bGIE) // MicroChip recommends this check! + +#define portENABLE_INTERRUPTS() \ + do \ + { \ + bGIE=1; \ + } while(0) + +/*-----------------------------------------------------------*/ + +/* + * Critical section macros. + */ +extern uint8_t ucCriticalNesting; + +#define portNO_CRITICAL_SECTION_NESTING ( ( uint8_t ) 0 ) + +#define portENTER_CRITICAL() \ + do \ + { \ + portDISABLE_INTERRUPTS(); \ + \ + /* \ + * Now interrupts are disabled ucCriticalNesting \ + * can be accessed directly. Increment \ + * ucCriticalNesting to keep a count of how \ + * many times portENTER_CRITICAL() has been called. \ + */ \ + ucCriticalNesting++; \ + } while(0) + +#define portEXIT_CRITICAL() \ + do \ + { \ + if(ucCriticalNesting > portNO_CRITICAL_SECTION_NESTING) \ + { \ + /* \ + * Decrement the nesting count as we are leaving a \ + * critical section. \ + */ \ + ucCriticalNesting--; \ + } \ + \ + /* \ + * If the nesting level has reached zero then \ + * interrupts should be re-enabled. \ + */ \ + if( ucCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \ + { \ + portENABLE_INTERRUPTS(); \ + } \ + } while(0) + +/*-----------------------------------------------------------*/ + +/* + * The minimal stacksize is calculated on the first reference of + * portMINIMAL_STACK_SIZE. Some input to this calculation is + * compiletime determined, other input is port-defined (see port.c) + */ +extern uint16_t usPortCALCULATE_MINIMAL_STACK_SIZE( void ); +extern uint16_t usCalcMinStackSize; + +#define portMINIMAL_STACK_SIZE \ + ((usCalcMinStackSize == 0) \ + ? usPortCALCULATE_MINIMAL_STACK_SIZE() \ + : usCalcMinStackSize ) + +/* + * WizC uses a downgrowing stack + */ +#define portSTACK_GROWTH ( -1 ) + +/*-----------------------------------------------------------*/ + +/* + * Macro's that pushes all the registers that make up the context of a task onto + * the stack, then saves the new top of stack into the TCB. TOSU and TBLPTRU + * are only saved/restored on devices with more than 64kB (32k Words) ROM. + * + * The stackpointer is helt by WizC in FSR2 and points to the first free byte. + * WizC uses a "downgrowing" stack. There is no framepointer. + * + * We keep track of the interruptstatus using ucCriticalNesting. When this + * value equals zero, interrupts have to be enabled upon exit from the + * portRESTORE_CONTEXT macro. + * + * If this is called from an ISR then the interrupt enable bits must have been + * set for the ISR to ever get called. Therefore we want to save + * ucCriticalNesting with value zero. This means the interrupts will again be + * re-enabled when the interrupted task is switched back in. + * + * If this is called from a manual context switch (i.e. from a call to yield), + * then we want to keep the current value of ucCritialNesting so it is restored + * with its current value. This allows a yield from within a critical section. + * + * The compiler uses some locations at the bottom of RAM for temporary + * storage. The compiler may also have been instructed to optimize + * function-parameters and local variables to global storage. The compiler + * uses an area called LocOpt for this wizC feature. + * The total overheadstorage has to be saved in it's entirety as part of + * a task context. These macro's store/restore from data address 0x0000 to + * (OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE - 1). + * OVERHEADPAGE0, LOCOPTSIZE and MAXLOCOPTSIZE are compiler-generated + * assembler definitions. + */ + +#define portSAVE_CONTEXT( ucInterruptForced ) \ + do \ + { \ + portDISABLE_INTERRUPTS(); \ + \ + _Pragma("asm") \ + ; \ + ; Push the relevant SFR's onto the task's stack \ + ; \ + movff STATUS,POSTDEC2 \ + movff WREG,POSTDEC2 \ + movff BSR,POSTDEC2 \ + movff PRODH,POSTDEC2 \ + movff PRODL,POSTDEC2 \ + movff FSR0H,POSTDEC2 \ + movff FSR0L,POSTDEC2 \ + movff FSR1H,POSTDEC2 \ + movff FSR1L,POSTDEC2 \ + movff TABLAT,POSTDEC2 \ + if __ROMSIZE > 0x8000 \ + movff TBLPTRU,POSTDEC2 \ + endif \ + movff TBLPTRH,POSTDEC2 \ + movff TBLPTRL,POSTDEC2 \ + if __ROMSIZE > 0x8000 \ + movff PCLATU,POSTDEC2 \ + endif \ + movff PCLATH,POSTDEC2 \ + ; \ + ; Store the compiler-scratch-area as described above. \ + ; \ + movlw OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE \ + clrf FSR0L,ACCESS \ + clrf FSR0H,ACCESS \ + _rtos_S1: \ + movff POSTINC0,POSTDEC2 \ + decfsz WREG,W,ACCESS \ + SMARTJUMP _rtos_S1 \ + ; \ + ; Save the pic call/return-stack belonging to the \ + ; current task by copying it to the task's software- \ + ; stack. We save the hardware stack pointer (which \ + ; is the number of addresses on the stack) in the \ + ; W-register first because we need it later and it \ + ; is modified in the save-loop by executing pop's. \ + ; After the loop the W-register is stored on the \ + ; stack, too. \ + ; \ + movf STKPTR,W,ACCESS \ + bz _rtos_s3 \ + _rtos_S2: \ + if __ROMSIZE > 0x8000 \ + movff TOSU,POSTDEC2 \ + endif \ + movff TOSH,POSTDEC2 \ + movff TOSL,POSTDEC2 \ + pop \ + tstfsz STKPTR,ACCESS \ + SMARTJUMP _rtos_S2 \ + _rtos_s3: \ + movwf POSTDEC2,ACCESS \ + ; \ + ; Next the value for ucCriticalNesting used by the \ + ; task is stored on the stack. When \ + ; (ucInterruptForced == portINTERRUPTS_FORCED), we save \ + ; it as 0 (portNO_CRITICAL_SECTION_NESTING). \ + ; \ + if ucInterruptForced == portINTERRUPTS_FORCED \ + clrf POSTDEC2,ACCESS \ + else \ + movff ucCriticalNesting,POSTDEC2 \ + endif \ + ; \ + ; Save the new top of the software stack in the TCB. \ + ; \ + movff pxCurrentTCB,FSR0L \ + movff pxCurrentTCB+1,FSR0H \ + movff FSR2L,POSTINC0 \ + movff FSR2H,POSTINC0 \ + _Pragma("asmend") \ + } while(0) + +/************************************************************/ + +/* + * This is the reverse of portSAVE_CONTEXT. + */ +#define portRESTORE_CONTEXT() \ + do \ + { \ + _Pragma("asm") \ + ; \ + ; Set FSR0 to point to pxCurrentTCB->pxTopOfStack. \ + ; \ + movff pxCurrentTCB,FSR0L \ + movff pxCurrentTCB+1,FSR0H \ + ; \ + ; De-reference FSR0 to set the address it holds into \ + ; FSR2 (i.e. *( pxCurrentTCB->pxTopOfStack ) ). FSR2 \ + ; is used by wizC as stackpointer. \ + ; \ + movff POSTINC0,FSR2L \ + movff POSTINC0,FSR2H \ + ; \ + ; Next, the value for ucCriticalNesting used by the \ + ; task is retrieved from the stack. \ + ; \ + movff PREINC2,ucCriticalNesting \ + ; \ + ; Rebuild the pic call/return-stack. The number of \ + ; return addresses is the next item on the task stack. \ + ; Save this number in PRODL. Then fetch the addresses \ + ; and store them on the hardwarestack. \ + ; The datasheets say we can't use movff here... \ + ; \ + movff PREINC2,PRODL // Use PRODL as tempregister \ + clrf STKPTR,ACCESS \ + _rtos_R1: \ + push \ + movf PREINC2,W,ACCESS \ + movwf TOSL,ACCESS \ + movf PREINC2,W,ACCESS \ + movwf TOSH,ACCESS \ + if __ROMSIZE > 0x8000 \ + movf PREINC2,W,ACCESS \ + movwf TOSU,ACCESS \ + else \ + clrf TOSU,ACCESS \ + endif \ + decfsz PRODL,F,ACCESS \ + SMARTJUMP _rtos_R1 \ + ; \ + ; Restore the compiler's working storage area to page 0 \ + ; \ + movlw OVERHEADPAGE0-LOCOPTSIZE+MAXLOCOPTSIZE \ + movwf FSR0L,ACCESS \ + clrf FSR0H,ACCESS \ + _rtos_R2: \ + decf FSR0L,F,ACCESS \ + movff PREINC2,INDF0 \ + tstfsz FSR0L,ACCESS \ + SMARTJUMP _rtos_R2 \ + ; \ + ; Restore the sfr's forming the tasks context. \ + ; We cannot yet restore bsr, w and status because \ + ; we need these registers for a final test. \ + ; \ + movff PREINC2,PCLATH \ + if __ROMSIZE > 0x8000 \ + movff PREINC2,PCLATU \ + else \ + clrf PCLATU,ACCESS \ + endif \ + movff PREINC2,TBLPTRL \ + movff PREINC2,TBLPTRH \ + if __ROMSIZE > 0x8000 \ + movff PREINC2,TBLPTRU \ + else \ + clrf TBLPTRU,ACCESS \ + endif \ + movff PREINC2,TABLAT \ + movff PREINC2,FSR1L \ + movff PREINC2,FSR1H \ + movff PREINC2,FSR0L \ + movff PREINC2,FSR0H \ + movff PREINC2,PRODL \ + movff PREINC2,PRODH \ + ; \ + ; The return from portRESTORE_CONTEXT() depends on \ + ; the value of ucCriticalNesting. When it is zero, \ + ; interrupts need to be enabled. This is done via a \ + ; retfie instruction because we need the \ + ; interrupt-enabling and the return to the restored \ + ; task to be uninterruptable. \ + ; Because bsr, status and W are affected by the test \ + ; they are restored after the test. \ + ; \ + movlb ucCriticalNesting>>8 \ + tstfsz ucCriticalNesting,BANKED \ + SMARTJUMP _rtos_R4 \ + _rtos_R3: \ + movff PREINC2,BSR \ + movff PREINC2,WREG \ + movff PREINC2,STATUS \ + retfie 0 ; Return enabling interrupts \ + _rtos_R4: \ + movff PREINC2,BSR \ + movff PREINC2,WREG \ + movff PREINC2,STATUS \ + return 0 ; Return without affecting interrupts \ + _Pragma("asmend") \ + } while(0) + +/*-----------------------------------------------------------*/ + +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) + +/*-----------------------------------------------------------*/ + +extern void vPortYield( void ); +#define portYIELD() vPortYield() + +#define portNOP() _Pragma("asm") \ + nop \ + _Pragma("asmend") + +/*-----------------------------------------------------------*/ + +#define portTASK_FUNCTION( xFunction, pvParameters ) \ + void pointed xFunction( void *pvParameters ) \ + _Pragma(asmfunc xFunction) + +#define portTASK_FUNCTION_PROTO portTASK_FUNCTION +/*-----------------------------------------------------------*/ + + +#define volatile +#define register + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/port.c new file mode 100644 index 0000000..04bcdba --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/port.c @@ -0,0 +1,247 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V1.00: + + + Call to taskYIELD() from within tick ISR has been replaced by the more + efficient portSWITCH_CONTEXT(). + + ISR function definitions renamed to include the prv prefix. + +Changes from V1.2.0: + + + portRESET_PIC() is now called last thing before the end of the preemptive + tick routine. + +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the Flashlite 186 + * port. + *----------------------------------------------------------*/ + +#include +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_EOI_TYPE ( 8 ) +#define portRESET_PIC() portOUTPUT_WORD( ( uint16_t ) 0xff22, portTIMER_EOI_TYPE ) +#define portTIMER_INT_NUMBER 0x12 + +#define portTIMER_1_CONTROL_REGISTER ( ( uint16_t ) 0xff5e ) +#define portTIMER_0_CONTROL_REGISTER ( ( uint16_t ) 0xff56 ) +#define portTIMER_INTERRUPT_ENABLE ( ( uint16_t ) 0x2000 ) + +/* Setup the hardware to generate the required tick frequency. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Set the hardware back to the state as per before the scheduler started. */ +static void prvExitFunction( void ); + +#if configUSE_PREEMPTION == 1 + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif + +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static int16_t sSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual context switches. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + #if configUSE_PREEMPTION == 1 + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + sSchedulerRunning = pdFALSE; + } + else + { + sSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return sSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The tick ISR used depend on whether or not the preemptive or cooperative +kernel is being used. */ +#if configUSE_PREEMPTION == 1 + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + portRESET_PIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + portRESET_PIC(); + } +#endif +/*-----------------------------------------------------------*/ + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +const uint16_t usTimerDisable = 0x0000; +uint16_t usTimer0Control; + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( sSchedulerRunning == pdTRUE ) + { + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + } + + /* Disable the timer used for the tick to ensure the scheduler is + not called before restoring interrupts. There was previously nothing + on this timer so there is no old ISR to restore. */ + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerDisable ); + + /* Restart the DOS tick. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control |= portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); + + + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usMaxCountRegister = 0xff5a; +const uint16_t usTimerPriorityRegister = 0xff32; +const uint16_t usTimerEnable = 0xC000; +const uint16_t usRetrigger = 0x0001; +const uint16_t usTimerHighPriority = 0x0000; +uint16_t usTimer0Control; + +/* ( CPU frequency / 4 ) / clock 2 max count [inpw( 0xff62 ) = 7] */ + +const uint32_t ulClockFrequency = 0x7f31a0; + +uint32_t ulTimerCount = ulClockFrequency / ulTickRateHz; + + portOUTPUT_WORD( portTIMER_1_CONTROL_REGISTER, usTimerEnable | portTIMER_INTERRUPT_ENABLE | usRetrigger ); + portOUTPUT_WORD( usMaxCountRegister, ( uint16_t ) ulTimerCount ); + portOUTPUT_WORD( usTimerPriorityRegister, usTimerHighPriority ); + + /* Stop the DOS tick - don't do this if you want to maintain a TOD clock. */ + usTimer0Control = portINPUT_WORD( portTIMER_0_CONTROL_REGISTER ); + usTimer0Control &= ~portTIMER_INTERRUPT_ENABLE; + portOUTPUT_WORD( portTIMER_0_CONTROL_REGISTER, usTimer0Control ); +} + + +/*lint +e950 */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/portmacro.h new file mode 100644 index 0000000..3b5e551 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/portmacro.h @@ -0,0 +1,111 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE long +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +void portENTER_CRITICAL( void ); +#pragma aux portENTER_CRITICAL = "pushf" \ + "cli"; + +void portEXIT_CRITICAL( void ); +#pragma aux portEXIT_CRITICAL = "popf"; + +void portDISABLE_INTERRUPTS( void ); +#pragma aux portDISABLE_INTERRUPTS = "cli"; + +void portENABLE_INTERRUPTS( void ); +#pragma aux portENABLE_INTERRUPTS = "sti"; +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 2 +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +#define portNOP() __asm{ nop } +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portINPUT_WORD( xAddr ) inpw( xAddr ) +#define portOUTPUT_WORD( xAddr, usValue ) outpw( xAddr, usValue ) +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/port.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/port.c new file mode 100644 index 0000000..50be054 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/port.c @@ -0,0 +1,303 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V1.00: + + + Call to taskYIELD() from within tick ISR has been replaced by the more + efficient portSWITCH_CONTEXT(). + + ISR function definitions renamed to include the prv prefix. + +Changes from V1.2.0: + + + prvPortResetPIC() is now called last thing before the end of the + preemptive tick routine. + +Changes from V2.6.1 + + + Replaced the sUsingPreemption variable with the configUSE_PREEMPTION + macro to be consistent with the later ports. + +Changes from V4.0.1 + + + Add function prvSetTickFrequencyDefault() to set the DOS tick back to + its proper value when the scheduler exits. +*/ + +#include +#include +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" +#include "portasm.h" + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the industrial + * PC port. + *----------------------------------------------------------*/ + +/*lint -e950 Non ANSI reserved words okay in this file only. */ + +#define portTIMER_INT_NUMBER 0x08 + +/* Setup hardware for required tick interrupt rate. */ +static void prvSetTickFrequency( uint32_t ulTickRateHz ); + +/* Restore hardware to as it was prior to starting the scheduler. */ +static void prvExitFunction( void ); + +/* Either chain to the DOS tick (which itself clears the PIC) or clear the PIC +directly. We chain to the DOS tick as close as possible to the standard DOS +tick rate. */ +static void prvPortResetPIC( void ); + +/* The tick ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if configUSE_PREEMPTION == 1 + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ); +#else + /* Tick service routine used by the scheduler when cooperative scheduling is + being used. */ + static void __interrupt __far prvNonPreemptiveTick( void ); +#endif +/* Trap routine used by taskYIELD() to manually cause a context switch. */ +static void __interrupt __far prvYieldProcessor( void ); + +/* Set the tick frequency back so the floppy drive works correctly when the +scheduler exits. */ +static void prvSetTickFrequencyDefault( void ); + +/*lint -e956 File scopes necessary here. */ + +/* Used to signal when to chain to the DOS tick, and when to just clear the PIC ourselves. */ +static int16_t sDOSTickCounter; + +/* Set true when the vectors are set so the scheduler will service the tick. */ +static int16_t sSchedulerRunning = pdFALSE; + +/* Points to the original routine installed on the vector we use for manual context switches. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISR )(); + +/* Points to the original routine installed on the vector we use to chain to the DOS tick. This is then used to restore the original routine during prvExitFunction(). */ +static void ( __interrupt __far *pxOldSwitchISRPlus1 )(); + +/* Used to restore the original DOS context when the scheduler is ended. */ +static jmp_buf xJumpBuf; + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ +BaseType_t xPortStartScheduler( void ) +{ +pxISR pxOriginalTickISR; + + /* This is called with interrupts already disabled. */ + + /* Remember what was on the interrupts we are going to use + so we can put them back later if required. */ + pxOldSwitchISR = _dos_getvect( portSWITCH_INT_NUMBER ); + pxOriginalTickISR = _dos_getvect( portTIMER_INT_NUMBER ); + pxOldSwitchISRPlus1 = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + + prvSetTickFrequency( configTICK_RATE_HZ ); + + /* Put our manual switch (yield) function on a known + vector. */ + _dos_setvect( portSWITCH_INT_NUMBER, prvYieldProcessor ); + + /* Put the old tick on a different interrupt number so we can + call it when we want. */ + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOriginalTickISR ); + + #if configUSE_PREEMPTION == 1 + { + /* Put our tick switch function on the timer interrupt. */ + _dos_setvect( portTIMER_INT_NUMBER, prvPreemptiveTick ); + } + #else + { + /* We want the timer interrupt to just increment the tick count. */ + _dos_setvect( portTIMER_INT_NUMBER, prvNonPreemptiveTick ); + } + #endif + + /* Setup a counter that is used to call the DOS interrupt as close + to it's original frequency as can be achieved given our chosen tick + frequency. */ + sDOSTickCounter = portTICKS_PER_DOS_TICK; + + /* Clean up function if we want to return to DOS. */ + if( setjmp( xJumpBuf ) != 0 ) + { + prvExitFunction(); + sSchedulerRunning = pdFALSE; + } + else + { + sSchedulerRunning = pdTRUE; + + /* Kick off the scheduler by setting up the context of the first task. */ + portFIRST_CONTEXT(); + } + + return sSchedulerRunning; +} +/*-----------------------------------------------------------*/ + +/* The tick ISR used depends on whether the preemptive or cooperative scheduler +is being used. */ +#if configUSE_PREEMPTION == 1 + /* Tick service routine used by the scheduler when preemptive scheduling is + being used. */ + static void __interrupt __far prvPreemptiveTick( void ) + { + /* Get the scheduler to update the task states following the tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); + } + + /* Reset the PIC ready for the next time. */ + prvPortResetPIC(); + } +#else + static void __interrupt __far prvNonPreemptiveTick( void ) + { + /* Same as preemptive tick, but the cooperative scheduler is being used + so we don't have to switch in the context of the next task. */ + xTaskIncrementTick(); + prvPortResetPIC(); + } +#endif +/*-----------------------------------------------------------*/ + + +static void __interrupt __far prvYieldProcessor( void ) +{ + /* Switch in the context of the next task to be run. */ + portSWITCH_CONTEXT(); +} +/*-----------------------------------------------------------*/ + +static void prvPortResetPIC( void ) +{ + /* We are going to call the DOS tick interrupt at as close a + frequency to the normal DOS tick as possible. */ + + /* WE SHOULD NOT DO THIS IF YIELD WAS CALLED. */ + --sDOSTickCounter; + if( sDOSTickCounter <= 0 ) + { + sDOSTickCounter = ( int16_t ) portTICKS_PER_DOS_TICK; + __asm{ int portSWITCH_INT_NUMBER + 1 }; + } + else + { + /* Reset the PIC as the DOS tick is not being called to + do it. */ + __asm + { + mov al, 20H + out 20H, al + }; + } +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* Jump back to the processor state prior to starting the + scheduler. This means we are not going to be using a + task stack frame so the task can be deleted. */ + longjmp( xJumpBuf, 1 ); +} +/*-----------------------------------------------------------*/ + +static void prvExitFunction( void ) +{ +void ( __interrupt __far *pxOriginalTickISR )(); + + /* Interrupts should be disabled here anyway - but no + harm in making sure. */ + portDISABLE_INTERRUPTS(); + if( sSchedulerRunning == pdTRUE ) + { + /* Set the DOS tick back onto the timer ticker. */ + pxOriginalTickISR = _dos_getvect( portSWITCH_INT_NUMBER + 1 ); + _dos_setvect( portTIMER_INT_NUMBER, pxOriginalTickISR ); + prvSetTickFrequencyDefault(); + + /* Put back the switch interrupt routines that was in place + before the scheduler started. */ + _dos_setvect( portSWITCH_INT_NUMBER, pxOldSwitchISR ); + _dos_setvect( portSWITCH_INT_NUMBER + 1, pxOldSwitchISRPlus1 ); + } + /* The tick timer is back how DOS wants it. We can re-enable + interrupts without the scheduler being called. */ + portENABLE_INTERRUPTS(); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequency( uint32_t ulTickRateHz ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint32_t ulPIT_CONST = ( uint32_t ) 1193180; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; +uint32_t ulOutput; + + /* Setup the 8245 to tick at the wanted frequency. */ + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + ulOutput = ulPIT_CONST / ulTickRateHz; + + portOUTPUT_BYTE( usPIT0, ( uint16_t )( ulOutput & ( uint32_t ) 0xff ) ); + ulOutput >>= 8; + portOUTPUT_BYTE( usPIT0, ( uint16_t ) ( ulOutput & ( uint32_t ) 0xff ) ); +} +/*-----------------------------------------------------------*/ + +static void prvSetTickFrequencyDefault( void ) +{ +const uint16_t usPIT_MODE = ( uint16_t ) 0x43; +const uint16_t usPIT0 = ( uint16_t ) 0x40; +const uint16_t us8254_CTR0_MODE3 = ( uint16_t ) 0x36; + + portOUTPUT_BYTE( usPIT_MODE, us8254_CTR0_MODE3 ); + portOUTPUT_BYTE( usPIT0,0 ); + portOUTPUT_BYTE( usPIT0,0 ); +} + + +/*lint +e950 */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/portmacro.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/portmacro.h new file mode 100644 index 0000000..31067cb --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/portmacro.h @@ -0,0 +1,113 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT int +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef uint16_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Critical section definitions. portENTER_CRITICAL() must be defined as a +macro for portable.h to work properly. */ +void portLOCAL_ENTER_CRITICAL( void ); +#pragma aux portLOCAL_ENTER_CRITICAL = "pushf" \ + "cli"; +#define portENTER_CRITICAL() portLOCAL_ENTER_CRITICAL() + +void portEXIT_CRITICAL( void ); +#pragma aux portEXIT_CRITICAL = "popf"; + +void portDISABLE_INTERRUPTS( void ); +#pragma aux portDISABLE_INTERRUPTS = "cli"; + +void portENABLE_INTERRUPTS( void ); +#pragma aux portENABLE_INTERRUPTS = "sti"; +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portSWITCH_INT_NUMBER 0x80 +#define portYIELD() __asm{ int portSWITCH_INT_NUMBER } +#define portDOS_TICK_RATE ( 18.20648 ) +#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) +#define portTICKS_PER_DOS_TICK ( ( uint16_t ) ( ( ( portDOUBLE ) configTICK_RATE_HZ / portDOS_TICK_RATE ) + 0.5 ) ) +#define portINITIAL_SW ( ( portSTACK_TYPE ) 0x0202 ) /* Start the tasks with interrupts enabled. */ +#define portBYTE_ALIGNMENT ( 2 ) +/*-----------------------------------------------------------*/ + +/* Compiler specifics. */ +#define portINPUT_BYTE( xAddr ) inp( xAddr ) +#define portOUTPUT_BYTE( xAddr, ucValue ) outp( xAddr, ucValue ) +#define portNOP() __asm{ nop } +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) +#define portTASK_FUNCTION( vTaskFunction, pvParameters ) void vTaskFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + + +#endif /* PORTMACRO_H */ + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portasm.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portasm.h new file mode 100644 index 0000000..1ff14db --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portasm.h @@ -0,0 +1,111 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +typedef void TCB_t; +extern volatile TCB_t * volatile pxCurrentTCB; +extern void vTaskSwitchContext( void ); + +/* + * Saves the stack pointer for one task into its TCB, calls + * vTaskSwitchContext() to update the TCB being used, then restores the stack + * from the new TCB read to run the task. + */ +void portSWITCH_CONTEXT( void ); + +/* + * Load the stack pointer from the TCB of the task which is going to be first + * to execute. Then force an IRET so the registers and IP are popped off the + * stack. + */ +void portFIRST_CONTEXT( void ); + +/* There are slightly different versions depending on whether you are building +to include debugger information. If debugger information is used then there +are a couple of extra bytes left of the ISR stack (presumably for use by the +debugger). The true stack pointer is then stored in the bp register. We add +2 to the stack pointer to remove the extra bytes before we restore our context. */ + +#ifdef DEBUG_BUILD + + #pragma aux portSWITCH_CONTEXT = "mov ax, seg pxCurrentTCB" \ + "mov ds, ax" \ + "les bx, pxCurrentTCB" /* Save the stack pointer into the TCB. */ \ + "mov es:0x2[ bx ], ss" \ + "mov es:[ bx ], sp" \ + "call vTaskSwitchContext" /* Perform the switch. */ \ + "mov ax, seg pxCurrentTCB" /* Restore the stack pointer from the TCB. */ \ + "mov ds, ax" \ + "les bx, dword ptr pxCurrentTCB" \ + "mov ss, es:[ bx + 2 ]" \ + "mov sp, es:[ bx ]" \ + "mov bp, sp" /* Prepair the bp register for the restoration of the SP in the compiler generated portion of the ISR */ \ + "add bp, 0x0002" + + + + #pragma aux portFIRST_CONTEXT = "mov ax, seg pxCurrentTCB" \ + "mov ds, ax" \ + "les bx, dword ptr pxCurrentTCB" \ + "mov ss, es:[ bx + 2 ]" \ + "mov sp, es:[ bx ]" \ + "add sp, 0x0002" /* Remove the extra bytes that exist in debug builds before restoring the context. */ \ + "pop ax" \ + "pop ax" \ + "pop es" \ + "pop ds" \ + "popa" \ + "iret" +#else + + #pragma aux portSWITCH_CONTEXT = "mov ax, seg pxCurrentTCB" \ + "mov ds, ax" \ + "les bx, pxCurrentTCB" /* Save the stack pointer into the TCB. */ \ + "mov es:0x2[ bx ], ss" \ + "mov es:[ bx ], sp" \ + "call vTaskSwitchContext" /* Perform the switch. */ \ + "mov ax, seg pxCurrentTCB" /* Restore the stack pointer from the TCB. */ \ + "mov ds, ax" \ + "les bx, dword ptr pxCurrentTCB" \ + "mov ss, es:[ bx + 2 ]" \ + "mov sp, es:[ bx ]" + + + #pragma aux portFIRST_CONTEXT = "mov ax, seg pxCurrentTCB" \ + "mov ds, ax" \ + "les bx, dword ptr pxCurrentTCB" \ + "mov ss, es:[ bx + 2 ]" \ + "mov sp, es:[ bx ]" \ + "pop ax" \ + "pop ax" \ + "pop es" \ + "pop ds" \ + "popa" \ + "iret" +#endif + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portcomn.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portcomn.c new file mode 100644 index 0000000..d4bc517 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portcomn.c @@ -0,0 +1,141 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* +Changes from V1.00: + + + pxPortInitialiseStack() now initialises the stack of new tasks to the + same format used by the compiler. This allows the compiler generated + interrupt mechanism to be used for context switches. + +Changes from V2.4.2: + + + pvPortMalloc and vPortFree have been removed. The projects now use + the definitions from the source/portable/MemMang directory. + +Changes from V2.6.1: + + + usPortCheckFreeStackSpace() has been moved to tasks.c. +*/ + + + +#include +#include "FreeRTOS.h" + +/*-----------------------------------------------------------*/ + +/* See header file for description. */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +StackType_t DS_Reg = 0; +StackType_t * pxOriginalSP; + + /* Place a few bytes of known values on the bottom of the stack. + This is just useful for debugging. */ + + *pxTopOfStack = 0x1111; + pxTopOfStack--; + *pxTopOfStack = 0x2222; + pxTopOfStack--; + *pxTopOfStack = 0x3333; + pxTopOfStack--; + *pxTopOfStack = 0x4444; + pxTopOfStack--; + *pxTopOfStack = 0x5555; + pxTopOfStack--; + + + /*lint -e950 -e611 -e923 Lint doesn't like this much - but nothing I can do about it. */ + + /* We are going to start the scheduler using a return from interrupt + instruction to load the program counter, so first there would be the + status register and interrupt return address. We make this the start + of the task. */ + *pxTopOfStack = portINITIAL_SW; + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pxCode ); + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxCode ); + pxTopOfStack--; + + /* We are going to setup the stack for the new task to look like + the stack frame was setup by a compiler generated ISR. We need to know + the address of the existing stack top to place in the SP register within + the stack frame. pxOriginalSP holds SP before (simulated) pusha was + called. */ + pxOriginalSP = pxTopOfStack; + + /* The remaining registers would be pushed on the stack by our context + switch function. These are loaded with values simply to make debugging + easier. */ + *pxTopOfStack = FP_OFF( pvParameters ); /* AX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xCCCC; /* CX */ + pxTopOfStack--; + *pxTopOfStack = FP_SEG( pvParameters ); /* DX */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BX */ + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pxOriginalSP ); /* SP */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBBBB; /* BP */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x0123; /* SI */ + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDDDD; /* DI */ + + /* We need the true data segment. */ + __asm{ MOV DS_Reg, DS }; + + pxTopOfStack--; + *pxTopOfStack = DS_Reg; /* DS */ + + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xEEEE; /* ES */ + + /* The AX register is pushed again twice - don't know why. */ + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pvParameters ); /* AX */ + pxTopOfStack--; + *pxTopOfStack = FP_OFF( pvParameters ); /* AX */ + + + #ifdef DEBUG_BUILD + /* The compiler adds space to each ISR stack if building to + include debug information. Presumably this is used by the + debugger - we don't need to initialise it to anything just + make sure it is there. */ + pxTopOfStack--; + #endif + + /*lint +e950 +e611 +e923 */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/readme.txt b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/readme.txt new file mode 100644 index 0000000..89f6b09 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/readme.txt @@ -0,0 +1,20 @@ +Each real time kernel port consists of three files that contain the core kernel +components and are common to every port, and one or more files that are +specific to a particular microcontroller and/or compiler. + + ++ The FreeRTOS/Source/Portable/MemMang directory contains the five sample +memory allocators as described on the https://www.FreeRTOS.org WEB site. + ++ The other directories each contain files specific to a particular +microcontroller or compiler, where the directory name denotes the compiler +specific files the directory contains. + + + +For example, if you are interested in the [compiler] port for the [architecture] +microcontroller, then the port specific files are contained in +FreeRTOS/Source/Portable/[compiler]/[architecture] directory. If this is the +only port you are interested in then all the other directories can be +ignored. + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/queue.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/queue.c new file mode 100644 index 0000000..e76e7ff --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/queue.c @@ -0,0 +1,3087 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +#if ( configUSE_CO_ROUTINES == 1 ) + #include "croutine.h" +#endif + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + + +/* Constants used with the cRxLock and cTxLock structure members. */ +#define queueUNLOCKED ( ( int8_t ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( int8_t ) 0 ) +#define queueINT8_MAX ( ( int8_t ) 127 ) + +/* When the Queue_t structure is used to represent a base queue its pcHead and + * pcTail members are used as pointers into the queue storage area. When the + * Queue_t structure is used to represent a mutex pcHead and pcTail pointers are + * not necessary, and the pcHead pointer is set to NULL to indicate that the + * structure instead holds a pointer to the mutex holder (if any). Map alternative + * names to the pcHead and structure member to ensure the readability of the code + * is maintained. The QueuePointers_t and SemaphoreData_t types are used to form + * a union as their usage is mutually exclusive dependent on what the queue is + * being used for. */ +#define uxQueueType pcHead +#define queueQUEUE_IS_MUTEX NULL + +typedef struct QueuePointers +{ + int8_t * pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + int8_t * pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ +} QueuePointers_t; + +typedef struct SemaphoreData +{ + TaskHandle_t xMutexHolder; /*< The handle of the task that holds the mutex. */ + UBaseType_t uxRecursiveCallCount; /*< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ +} SemaphoreData_t; + +/* Semaphores do not actually store or copy data, so have an item size of + * zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( UBaseType_t ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( TickType_t ) 0U ) + +#if ( configUSE_PREEMPTION == 0 ) + +/* If the cooperative scheduler is being used then a yield should not be + * performed just because a higher priority task has been woken. */ + #define queueYIELD_IF_USING_PREEMPTION() +#else + #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* + * Definition of the queue used by the scheduler. + * Items are queued by copy, not reference. See the following link for the + * rationale: https://www.FreeRTOS.org/Embedded-RTOS-Queues.html + */ +typedef struct QueueDefinition /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +{ + int8_t * pcHead; /*< Points to the beginning of the queue storage area. */ + int8_t * pcWriteTo; /*< Points to the free next place in the storage area. */ + + union + { + QueuePointers_t xQueue; /*< Data required exclusively when this structure is used as a queue. */ + SemaphoreData_t xSemaphore; /*< Data required exclusively when this structure is used as a semaphore. */ + } u; + + List_t xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + List_t xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile UBaseType_t uxMessagesWaiting; /*< The number of items currently in the queue. */ + UBaseType_t uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + UBaseType_t uxItemSize; /*< The size of each items that the queue will hold. */ + + volatile int8_t cRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile int8_t cTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + + #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + struct QueueDefinition * pxQueueSetContainer; + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxQueueNumber; + uint8_t ucQueueType; + #endif +} xQUEUE; + +/* The old xQUEUE name is maintained above then typedefed to the new Queue_t + * name below to enable the use of older kernel aware debuggers. */ +typedef xQUEUE Queue_t; + +/*-----------------------------------------------------------*/ + +/* + * The queue registry is just a means for kernel aware debuggers to locate + * queue structures. It has no other purpose so is an optional component. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + +/* The type stored within the queue registry array. This allows a name + * to be assigned to each queue making kernel aware debugging a little + * more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + const char * pcQueueName; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + QueueHandle_t xHandle; + } xQueueRegistryItem; + +/* The old xQueueRegistryItem name is maintained above then typedefed to the + * new xQueueRegistryItem name below to enable the use of older kernel aware + * debuggers. */ + typedef xQueueRegistryItem QueueRegistryItem_t; + +/* The queue registry is simply an array of QueueRegistryItem_t structures. + * The pcQueueName member of a structure being NULL is indicative of the + * array position being vacant. */ + PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; + +#endif /* configQUEUE_REGISTRY_SIZE */ + +/* + * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not + * prevent an ISR from adding or removing items to the queue, but does prevent + * an ISR from removing tasks from the queue event lists. If an ISR finds a + * queue is locked it will instead increment the appropriate queue lock count + * to indicate that a task may require unblocking. When the queue in unlocked + * these lock counts are inspected, and the appropriate action taken. + */ +static void prvUnlockQueue( Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any data in a queue. + * + * @return pdTRUE if the queue contains no items, otherwise pdFALSE. + */ +static BaseType_t prvIsQueueEmpty( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any space in a queue. + * + * @return pdTRUE if there is no space, otherwise pdFALSE; + */ +static BaseType_t prvIsQueueFull( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Copies an item into the queue, either at the front of the queue or the + * back of the queue. + */ +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, + const void * pvItemToQueue, + const BaseType_t xPosition ) PRIVILEGED_FUNCTION; + +/* + * Copies an item out of a queue. + */ +static void prvCopyDataFromQueue( Queue_t * const pxQueue, + void * const pvBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_QUEUE_SETS == 1 ) + +/* + * Checks to see if a queue is a member of a queue set, and if so, notifies + * the queue set that the queue contains data. + */ + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * Called after a Queue_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + const uint8_t ucQueueType, + Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION; + +/* + * Mutexes are a special type of queue. When a mutex is created, first the + * queue is created, then prvInitialiseMutex() is called to configure the queue + * as a mutex. + */ +#if ( configUSE_MUTEXES == 1 ) + static void prvInitialiseMutex( Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION; +#endif + +#if ( configUSE_MUTEXES == 1 ) + +/* + * If a task waiting for a mutex causes the mutex holder to inherit a + * priority, but the waiting task times out, then the holder should + * disinherit the priority - but only down to the highest priority of any + * other tasks that are waiting for the same mutex. This function returns + * that priority. + */ + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION; +#endif +/*-----------------------------------------------------------*/ + +/* + * Macro to mark a queue as locked. Locking a queue prevents an ISR from + * accessing the queue event lists. + */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->cRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->cTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() + +/* + * Macro to increment cTxLock member of the queue data structure. It is + * capped at the number of tasks in the system as we cannot unblock more + * tasks than the number of tasks in the system. + */ +#define prvIncrementQueueTxLock( pxQueue, cTxLock ) \ + { \ + const UBaseType_t uxNumberOfTasks = uxTaskGetNumberOfTasks(); \ + if( ( UBaseType_t ) ( cTxLock ) < uxNumberOfTasks ) \ + { \ + configASSERT( ( cTxLock ) != queueINT8_MAX ); \ + ( pxQueue )->cTxLock = ( int8_t ) ( ( cTxLock ) + ( int8_t ) 1 ); \ + } \ + } + +/* + * Macro to increment cRxLock member of the queue data structure. It is + * capped at the number of tasks in the system as we cannot unblock more + * tasks than the number of tasks in the system. + */ +#define prvIncrementQueueRxLock( pxQueue, cRxLock ) \ + { \ + const UBaseType_t uxNumberOfTasks = uxTaskGetNumberOfTasks(); \ + if( ( UBaseType_t ) ( cRxLock ) < uxNumberOfTasks ) \ + { \ + configASSERT( ( cRxLock ) != queueINT8_MAX ); \ + ( pxQueue )->cRxLock = ( int8_t ) ( ( cRxLock ) + ( int8_t ) 1 ); \ + } \ + } +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericReset( QueueHandle_t xQueue, + BaseType_t xNewQueue ) +{ + BaseType_t xReturn = pdPASS; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + if( ( pxQueue != NULL ) && + ( pxQueue->uxLength >= 1U ) && + /* Check for multiplication overflow. */ + ( ( SIZE_MAX / pxQueue->uxLength ) >= pxQueue->uxItemSize ) ) + { + taskENTER_CRITICAL(); + { + pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U; + pxQueue->pcWriteTo = pxQueue->pcHead; + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + pxQueue->cRxLock = queueUNLOCKED; + pxQueue->cTxLock = queueUNLOCKED; + + if( xNewQueue == pdFALSE ) + { + /* If there are tasks blocked waiting to read from the queue, then + * the tasks will remain blocked as after this function exits the queue + * will still be empty. If there are tasks blocked waiting to write to + * the queue, then one should be unblocked as after this function exits + * it will be possible to write to it. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Ensure the event queues start in the correct state. */ + vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); + } + } + taskEXIT_CRITICAL(); + } + else + { + xReturn = pdFAIL; + } + + configASSERT( xReturn != pdFAIL ); + + /* A value is returned for calling semantic consistency with previous + * versions. */ + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + StaticQueue_t * pxStaticQueue, + const uint8_t ucQueueType ) + { + Queue_t * pxNewQueue = NULL; + + /* The StaticQueue_t structure and the queue storage area must be + * supplied. */ + configASSERT( pxStaticQueue ); + + if( ( uxQueueLength > ( UBaseType_t ) 0 ) && + ( pxStaticQueue != NULL ) && + + /* A queue storage area should be provided if the item size is not 0, and + * should not be provided if the item size is 0. */ + ( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0 ) ) ) && + ( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0 ) ) ) ) + { + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticQueue_t or StaticSemaphore_t equals the size of + * the real queue and semaphore structures. */ + volatile size_t xSize = sizeof( StaticQueue_t ); + + /* This assertion cannot be branch covered in unit tests */ + configASSERT( xSize == sizeof( Queue_t ) ); /* LCOV_EXCL_BR_LINE */ + ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ + + /* The address of a statically allocated queue was passed in, use it. + * The address of a statically allocated storage area was also passed in + * but is already set. */ + pxNewQueue = ( Queue_t * ) pxStaticQueue; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Queues can be allocated wither statically or dynamically, so + * note this queue was allocated statically in case the queue is + * later deleted. */ + pxNewQueue->ucStaticallyAllocated = pdTRUE; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + configASSERT( pxNewQueue ); + mtCOVERAGE_TEST_MARKER(); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + const uint8_t ucQueueType ) + { + Queue_t * pxNewQueue = NULL; + size_t xQueueSizeInBytes; + uint8_t * pucQueueStorage; + + if( ( uxQueueLength > ( UBaseType_t ) 0 ) && + /* Check for multiplication overflow. */ + ( ( SIZE_MAX / uxQueueLength ) >= uxItemSize ) && + /* Check for addition overflow. */ + ( ( SIZE_MAX - sizeof( Queue_t ) ) >= ( uxQueueLength * uxItemSize ) ) ) + { + /* Allocate enough space to hold the maximum number of items that + * can be in the queue at any time. It is valid for uxItemSize to be + * zero in the case the queue is used as a semaphore. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Allocate the queue and storage area. Justification for MISRA + * deviation as follows: pvPortMalloc() always ensures returned memory + * blocks are aligned per the requirements of the MCU stack. In this case + * pvPortMalloc() must return a pointer that is guaranteed to meet the + * alignment requirements of the Queue_t structure - which in this case + * is an int8_t *. Therefore, whenever the stack alignment requirements + * are greater than or equal to the pointer to char requirements the cast + * is safe. In other cases alignment requirements are not strict (one or + * two bytes). */ + pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /*lint !e9087 !e9079 see comment above. */ + + if( pxNewQueue != NULL ) + { + /* Jump past the queue structure to find the location of the queue + * storage area. */ + pucQueueStorage = ( uint8_t * ) pxNewQueue; + pucQueueStorage += sizeof( Queue_t ); /*lint !e9016 Pointer arithmetic allowed on char types, especially when it assists conveying intent. */ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* Queues can be created either statically or dynamically, so + * note this task was created dynamically in case it is later + * deleted. */ + pxNewQueue->ucStaticallyAllocated = pdFALSE; + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); + } + else + { + traceQUEUE_CREATE_FAILED( ucQueueType ); + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + configASSERT( pxNewQueue ); + mtCOVERAGE_TEST_MARKER(); + } + + return pxNewQueue; + } + +#endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, + const UBaseType_t uxItemSize, + uint8_t * pucQueueStorage, + const uint8_t ucQueueType, + Queue_t * pxNewQueue ) +{ + /* Remove compiler warnings about unused parameters should + * configUSE_TRACE_FACILITY not be set to 1. */ + ( void ) ucQueueType; + + if( uxItemSize == ( UBaseType_t ) 0 ) + { + /* No RAM was allocated for the queue storage area, but PC head cannot + * be set to NULL because NULL is used as a key to say the queue is used as + * a mutex. Therefore just set pcHead to point to the queue as a benign + * value that is known to be within the memory map. */ + pxNewQueue->pcHead = ( int8_t * ) pxNewQueue; + } + else + { + /* Set the head to the start of the queue storage area. */ + pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage; + } + + /* Initialise the queue members as described where the queue type is + * defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ + + #if ( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif /* configUSE_QUEUE_SETS */ + + traceQUEUE_CREATE( pxNewQueue ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + static void prvInitialiseMutex( Queue_t * pxNewQueue ) + { + if( pxNewQueue != NULL ) + { + /* The queue create function will set all the queue structure members + * correctly for a generic queue, but this function is creating a + * mutex. Overwrite those members that need to be set differently - + * in particular the information required for priority inheritance. */ + pxNewQueue->u.xSemaphore.xMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + + /* In case this is a recursive mutex. */ + pxNewQueue->u.xSemaphore.uxRecursiveCallCount = 0; + + traceCREATE_MUTEX( pxNewQueue ); + + /* Start with the semaphore in the expected state. */ + ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + + return xNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType, + StaticQueue_t * pxStaticQueue ) + { + QueueHandle_t xNewQueue; + const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0; + + /* Prevent compiler warnings about unused parameters if + * configUSE_TRACE_FACILITY does not equal 1. */ + ( void ) ucQueueType; + + xNewQueue = xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType ); + prvInitialiseMutex( ( Queue_t * ) xNewQueue ); + + return xNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; + Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore; + + configASSERT( xSemaphore ); + + /* This function is called by xSemaphoreGetMutexHolder(), and should not + * be called directly. Note: This is a good way of determining if the + * calling task is the mutex holder, but not a good way of determining the + * identity of the mutex holder, as the holder may change between the + * following critical section exiting and the function returning. */ + taskENTER_CRITICAL(); + { + if( pxSemaphore->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = pxSemaphore->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } + } + taskEXIT_CRITICAL(); + + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + +#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) + { + TaskHandle_t pxReturn; + + configASSERT( xSemaphore ); + + /* Mutexes cannot be used in interrupt service routines, so the mutex + * holder should not change in an ISR, and therefore a critical section is + * not required here. */ + if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = ( ( Queue_t * ) xSemaphore )->u.xSemaphore.xMutexHolder; + } + else + { + pxReturn = NULL; + } + + return pxReturn; + } /*lint !e818 xSemaphore cannot be a pointer to const because it is a typedef. */ + +#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* If this is the task that holds the mutex then xMutexHolder will not + * change outside of this task. If this task does not hold the mutex then + * pxMutexHolder can never coincidentally equal the tasks handle, and as + * this is the only condition we are interested in it does not matter if + * pxMutexHolder is accessed simultaneously by another task. Therefore no + * mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); + + /* uxRecursiveCallCount cannot be zero if xMutexHolder is equal to + * the task handle, therefore no underflow check is required. Also, + * uxRecursiveCallCount is only modified by the mutex holder, and as + * there can only be one, no mutual exclusion is required to modify the + * uxRecursiveCallCount member. */ + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )--; + + /* Has the recursive call count unwound to 0? */ + if( pxMutex->u.xSemaphore.uxRecursiveCallCount == ( UBaseType_t ) 0 ) + { + /* Return the mutex. This will automatically unblock any other + * task that might be waiting to access the mutex. */ + ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + /* The mutex cannot be given because the calling task is not the + * holder. */ + xReturn = pdFAIL; + + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxMutex = ( Queue_t * ) xMutex; + + configASSERT( pxMutex ); + + /* Comments regarding mutual exclusion as per those within + * xQueueGiveMutexRecursive(). */ + + traceTAKE_MUTEX_RECURSIVE( pxMutex ); + + if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueSemaphoreTake( pxMutex, xTicksToWait ); + + /* pdPASS will only be returned if the mutex was successfully + * obtained. The calling task may have entered the Blocked state + * before reaching here. */ + if( xReturn != pdFAIL ) + { + ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount, + StaticQueue_t * pxStaticQueue ) + { + QueueHandle_t xHandle = NULL; + + if( ( uxMaxCount != 0 ) && + ( uxInitialCount <= uxMaxCount ) ) + { + xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + } + else + { + configASSERT( xHandle ); + mtCOVERAGE_TEST_MARKER(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, + const UBaseType_t uxInitialCount ) + { + QueueHandle_t xHandle = NULL; + + if( ( uxMaxCount != 0 ) && + ( uxInitialCount <= uxMaxCount ) ) + { + xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + } + else + { + configASSERT( xHandle ); + mtCOVERAGE_TEST_MARKER(); + } + + return xHandle; + } + +#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */ +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSend( QueueHandle_t xQueue, + const void * const pvItemToQueue, + TickType_t xTicksToWait, + const BaseType_t xCopyPosition ) +{ + BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to + * allow return statements within the function itself. This is done in the + * interest of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? The running task must be the + * highest priority task wanting to access the queue. If the head item + * in the queue is to be overwritten then it does not matter if the + * queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND( pxQueue ); + + #if ( configUSE_QUEUE_SETS == 1 ) + { + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + * was overwritten in the queue so the number of items + * in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + * to the queue set caused a higher priority task to + * unblock. A context switch is required. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If there was a task waiting for data to arrive on the + * queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + * our own so yield immediately. Yes it is ok to + * do this from within the critical section - the + * kernel takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + * executed if the task was holding multiple mutexes + * and the mutexes were given back in an order that is + * different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + * queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The unblocked task has a priority higher than + * our own so yield immediately. Yes it is ok to do + * this from within the critical section - the kernel + * takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else if( xYieldRequired != pdFALSE ) + { + /* This path is a special case that will only get + * executed if the task was holding multiple mutexes and + * the mutexes were given back in an order that is + * different to that in which they were taken. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was full and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + * the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + * configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + * now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + * event list. It is possible that interrupts occurring now + * remove this task from the event list again - but as the + * scheduler is suspended the task will go onto the pending + * ready list instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + * ready list into the ready list - so it is feasible that this + * task is already in the ready list before it yields - in which + * case the yield will not cause a context switch unless there + * is also a higher priority task in the pending ready list. */ + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue, + const void * const pvItemToQueue, + BaseType_t * const pxHigherPriorityTaskWoken, + const BaseType_t xCopyPosition ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + /* Similar to xQueueGenericSend, except without blocking if there is no room + * in the queue. Also don't directly wake a task that was blocked on a queue + * read, instead return a flag to say whether a context switch is required or + * not (i.e. has a task with a higher priority than us been woken by this + * post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + const int8_t cTxLock = pxQueue->cTxLock; + const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a + * semaphore or mutex. That means prvCopyDataToQueue() cannot result + * in a task disinheriting a priority and prvCopyDataToQueue() can be + * called here even though the disinherit function does not check if + * the scheduler is suspended before accessing the ready lists. */ + ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* The event list is not altered if the queue is locked. This will + * be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) ) + { + /* Do not notify the queue set as an existing item + * was overwritten in the queue so the number of items + * in the queue has not changed. */ + mtCOVERAGE_TEST_MARKER(); + } + else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting + * to the queue set caused a higher priority task to + * unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + * record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Not used in this path. */ + ( void ) uxPreviousMessagesWaiting; + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was posted while it was locked. */ + prvIncrementQueueTxLock( pxQueue, cTxLock ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueGiveFromISR( QueueHandle_t xQueue, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; + + /* Similar to xQueueGenericSendFromISR() but used with semaphores where the + * item size is 0. Don't directly wake a task that was blocked on a queue + * read, instead return a flag to say whether a context switch is required or + * not (i.e. has a task with a higher priority than us been woken by this + * post). */ + + configASSERT( pxQueue ); + + /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR() + * if the item size is not 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Normally a mutex would not be given from an interrupt, especially if + * there is a mutex holder, as priority inheritance makes no sense for an + * interrupts, only tasks. */ + configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* When the queue is used to implement a semaphore no data is ever + * moved through the queue but it is still valid to see if the queue 'has + * space'. */ + if( uxMessagesWaiting < pxQueue->uxLength ) + { + const int8_t cTxLock = pxQueue->cTxLock; + + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + /* A task can only have an inherited priority if it is a mutex + * holder - and if there is a mutex holder then the mutex cannot be + * given from an ISR. As this is the ISR version of the function it + * can be assumed there is no mutex holder and no need to determine if + * priority disinheritance is needed. Simply increase the count of + * messages (semaphores) available. */ + pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + + /* The event list is not altered if the queue is locked. This will + * be done when the queue is unlocked later. */ + if( cTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The semaphore is a member of a queue set, and + * posting to the queue set caused a higher priority + * task to unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so + * record that a context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was posted while it was locked. */ + prvIncrementQueueTxLock( pxQueue, cTxLock ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceive( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) +{ + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + * is zero (so no data is copied into the buffer). */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to + * allow return statements within the function itself. This is done in the + * interest of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data available, remove one item. */ + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_RECEIVE( pxQueue ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + + /* There is now space in the queue, were any tasks waiting to + * post to the queue? If so, unblock the highest priority waiting + * task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + * configure the timeout structure. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + * now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* The timeout has not expired. If the queue is still empty place + * the task on the list of tasks waiting to receive from the queue. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The queue contains data again. Loop back to try and read the + * data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* Timed out. If there is no data in the queue exit, otherwise loop + * back and attempt to read the data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, + TickType_t xTicksToWait ) +{ + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + Queue_t * const pxQueue = xQueue; + + #if ( configUSE_MUTEXES == 1 ) + BaseType_t xInheritanceOccurred = pdFALSE; + #endif + + /* Check the queue pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* Check this really is a semaphore, in which case the item size will be + * 0. */ + configASSERT( pxQueue->uxItemSize == 0 ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to allow return + * statements within the function itself. This is done in the interest + * of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL(); + { + /* Semaphores are queues with an item size of 0, and where the + * number of messages in the queue is the semaphore's count value. */ + const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxSemaphoreCount > ( UBaseType_t ) 0 ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* Semaphores are queues with a data size of zero and where the + * messages waiting is the semaphore's count. Reduce the count. */ + pxQueue->uxMessagesWaiting = uxSemaphoreCount - ( UBaseType_t ) 1; + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + * priority inheritance should it become necessary. */ + pxQueue->u.xSemaphore.xMutexHolder = pvTaskIncrementMutexHeldCount(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + + /* Check to see if other tasks are blocked waiting to give the + * semaphore, and if so, unblock the highest priority such task. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The semaphore count was 0 and no block time is specified + * (or the block time has expired) so exit now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The semaphore count was 0 and a block time was specified + * so configure the timeout structure ready to block. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can give to and take from the semaphore + * now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* A block time is specified and not expired. If the semaphore + * count is 0 then enter the Blocked state to wait for a semaphore to + * become available. As semaphores are implemented with queues the + * queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + taskENTER_CRITICAL(); + { + xInheritanceOccurred = xTaskPriorityInherit( pxQueue->u.xSemaphore.xMutexHolder ); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* if ( configUSE_MUTEXES == 1 ) */ + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* There was no timeout and the semaphore count was not 0, so + * attempt to take the semaphore again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* Timed out. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + /* If the semaphore count is 0 exit now as the timeout has + * expired. Otherwise return to attempt to take the semaphore that is + * known to be available. As semaphores are implemented by queues the + * queue being empty is equivalent to the semaphore count being 0. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + #if ( configUSE_MUTEXES == 1 ) + { + /* xInheritanceOccurred could only have be set if + * pxQueue->uxQueueType == queueQUEUE_IS_MUTEX so no need to + * test the mutex type again to check it is actually a mutex. */ + if( xInheritanceOccurred != pdFALSE ) + { + taskENTER_CRITICAL(); + { + UBaseType_t uxHighestWaitingPriority; + + /* This task blocking on the mutex caused another + * task to inherit this task's priority. Now this task + * has timed out the priority should be disinherited + * again, but only as low as the next highest priority + * task that is waiting for the same mutex. */ + uxHighestWaitingPriority = prvGetDisinheritPriorityAfterTimeout( pxQueue ); + vTaskPriorityDisinheritAfterTimeout( pxQueue->u.xSemaphore.xMutexHolder, uxHighestWaitingPriority ); + } + taskEXIT_CRITICAL(); + } + } + #endif /* configUSE_MUTEXES */ + + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeek( QueueHandle_t xQueue, + void * const pvBuffer, + TickType_t xTicksToWait ) +{ + BaseType_t xEntryTimeSet = pdFALSE; + TimeOut_t xTimeOut; + int8_t * pcOriginalReadPosition; + Queue_t * const pxQueue = xQueue; + + /* Check the pointer is not NULL. */ + configASSERT( ( pxQueue ) ); + + /* The buffer into which data is received can only be NULL if the data size + * is zero (so no data is copied into the buffer. */ + configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* Cannot block if the scheduler is suspended. */ + #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + { + configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) ); + } + #endif + + /*lint -save -e904 This function relaxes the coding standard somewhat to + * allow return statements within the function itself. This is done in the + * interest of execution time efficiency. */ + for( ; ; ) + { + taskENTER_CRITICAL(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Is there data in the queue now? To be running the calling task + * must be the highest priority task wanting to access the queue. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Remember the read position so it can be reset after the data + * is read from the queue as this function is only peeking the + * data, not removing it. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + traceQUEUE_PEEK( pxQueue ); + + /* The data is not being removed, so reset the read pointer. */ + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + * any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + queueYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( TickType_t ) 0 ) + { + /* The queue was empty and no block time is specified (or + * the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + * configure the timeout structure ready to enter the blocked + * state. */ + vTaskInternalSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + mtCOVERAGE_TEST_MARKER(); + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + * now that the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + /* Timeout has not expired yet, check to see if there is data in the + * queue now, and if not enter the Blocked state to wait for data. */ + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_PEEK( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* There is data in the queue now, so don't enter the blocked + * state, instead return to try and obtain the data. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. If there is still no data in the queue + * exit, otherwise go back and try to read the data again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceQUEUE_PEEK_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint -restore */ +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue, + void * const pvBuffer, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + /* Cannot block in an ISR, so check there is data available. */ + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + const int8_t cRxLock = pxQueue->cRxLock; + + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->uxMessagesWaiting = uxMessagesWaiting - ( UBaseType_t ) 1; + + /* If the queue is locked the event list will not be modified. + * Instead update the lock count so the task that unlocks the queue + * will know that an ISR has removed data while the queue was + * locked. */ + if( cRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + * force a context switch. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + * knows that data was removed while it was locked. */ + prvIncrementQueueRxLock( pxQueue, cRxLock ); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueuePeekFromISR( QueueHandle_t xQueue, + void * const pvBuffer ) +{ + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + int8_t * pcOriginalReadPosition; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) ); + configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */ + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); + + /* Remember the read position so it can be reset as nothing is + * actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition; + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) +{ + UBaseType_t uxReturn; + + configASSERT( xQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) +{ + UBaseType_t uxReturn; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; + } + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +UBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) +{ + UBaseType_t uxReturn; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + uxReturn = pxQueue->uxMessagesWaiting; + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +void vQueueDelete( QueueHandle_t xQueue ) +{ + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + traceQUEUE_DELETE( pxQueue ); + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + vQueueUnregisterQueue( pxQueue ); + } + #endif + + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) + { + /* The queue can only have been allocated dynamically - free it + * again. */ + vPortFree( pxQueue ); + } + #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + { + /* The queue could have been allocated statically or dynamically, so + * check before attempting to free the memory. */ + if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE ) + { + vPortFree( pxQueue ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #else /* if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) */ + { + /* The queue must have been statically allocated, so is not going to be + * deleted. Avoid compiler warnings about the unused parameter. */ + ( void ) pxQueue; + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vQueueSetQueueNumber( QueueHandle_t xQueue, + UBaseType_t uxQueueNumber ) + { + ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) + { + return ( ( Queue_t * ) xQueue )->ucQueueType; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) + { + UBaseType_t uxHighestPriorityOfWaitingTasks; + + /* If a task waiting for a mutex causes the mutex holder to inherit a + * priority, but the waiting task times out, then the holder should + * disinherit the priority - but only down to the highest priority of any + * other tasks that are waiting for the same mutex. For this purpose, + * return the priority of the highest priority task that is waiting for the + * mutex. */ + if( listCURRENT_LIST_LENGTH( &( pxQueue->xTasksWaitingToReceive ) ) > 0U ) + { + uxHighestPriorityOfWaitingTasks = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) listGET_ITEM_VALUE_OF_HEAD_ENTRY( &( pxQueue->xTasksWaitingToReceive ) ); + } + else + { + uxHighestPriorityOfWaitingTasks = tskIDLE_PRIORITY; + } + + return uxHighestPriorityOfWaitingTasks; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue, + const void * pvItemToQueue, + const BaseType_t xPosition ) +{ + BaseType_t xReturn = pdFALSE; + UBaseType_t uxMessagesWaiting; + + /* This function is called from a critical section. */ + + uxMessagesWaiting = pxQueue->uxMessagesWaiting; + + if( pxQueue->uxItemSize == ( UBaseType_t ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder ); + pxQueue->u.xSemaphore.xMutexHolder = NULL; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_MUTEXES */ + } + else if( xPosition == queueSEND_TO_BACK ) + { + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ + pxQueue->pcWriteTo += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ + + if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e9087 !e418 MISRA exception as the casts are only redundant for some ports. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. Assert checks null pointer only used when length is 0. */ + pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xPosition == queueOVERWRITE ) + { + if( uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* An item is not being added but overwritten, so subtract + * one from the recorded number of items in the queue so when + * one is added again below the number of recorded items remains + * correct. */ + --uxMessagesWaiting; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + pxQueue->uxMessagesWaiting = uxMessagesWaiting + ( UBaseType_t ) 1; + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataFromQueue( Queue_t * const pxQueue, + void * const pvBuffer ) +{ + if( pxQueue->uxItemSize != ( UBaseType_t ) 0 ) + { + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; /*lint !e9016 Pointer arithmetic on char types ok, especially in this use case where it is the clearest way of conveying intent. */ + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 !e9087 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. Cast to void required by function signature and safe as no alignment requirement and copy length specified in bytes. */ + } +} +/*-----------------------------------------------------------*/ + +static void prvUnlockQueue( Queue_t * const pxQueue ) +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + * removed from the queue while the queue was locked. When a queue is + * locked items can be added or removed, but the event lists cannot be + * updated. */ + taskENTER_CRITICAL(); + { + int8_t cTxLock = pxQueue->cTxLock; + + /* See if data was added to the queue while it was locked. */ + while( cTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + * blocked waiting for data to become available? */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE ) + { + /* The queue is a member of a queue set, and posting to + * the queue set caused a higher priority task to unblock. + * A context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* Tasks that are removed from the event list will get + * added to the pending ready list as the scheduler is still + * suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + * context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* Tasks that are removed from the event list will get added to + * the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that + * a context switch is required. */ + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + break; + } + } + #endif /* configUSE_QUEUE_SETS */ + + --cTxLock; + } + + pxQueue->cTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); + { + int8_t cRxLock = pxQueue->cRxLock; + + while( cRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --cRxLock; + } + else + { + break; + } + } + + pxQueue->cRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueEmpty( const Queue_t * pxQueue ) +{ + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) +{ + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +static BaseType_t prvIsQueueFull( const Queue_t * pxQueue ) +{ + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) +{ + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + configASSERT( pxQueue ); + + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSend( QueueHandle_t xQueue, + const void * pvItemToQueue, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + /* If the queue is already full we may have to block. A critical section + * is required to prevent an interrupt removing something from the queue + * between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + /* The queue is full - do we want to block or just leave without + * posting? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + * return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; + + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + * into the ready list as we are within a critical section. + * Instead the same pending ready list mechanism is used as if + * the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + * that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceive( QueueHandle_t xQueue, + void * pvBuffer, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + /* If the queue is already empty we may have to block. A critical section + * is required to prevent an interrupt adding something to the queue + * between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + * leave with nothing? */ + if( xTicksToWait > ( TickType_t ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + * indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + * into the ready list as we are within a critical section. + * Instead the same pending ready list mechanism is used as if + * the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue, + const void * pvItemToQueue, + BaseType_t xCoRoutinePreviouslyWoken ) + { + Queue_t * const pxQueue = xQueue; + + /* Cannot block within an ISR so if there is no space on the queue then + * exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + + /* We only want to wake one co-routine per ISR, so check that a + * co-routine has not already been woken. */ + if( xCoRoutinePreviouslyWoken == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCoRoutinePreviouslyWoken; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue, + void * pvBuffer, + BaseType_t * pxCoRoutineWoken ) + { + BaseType_t xReturn; + Queue_t * const pxQueue = xQueue; + + /* We cannot block from an ISR, so check there is data available. If + * not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize; + + if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail ) + { + pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + if( ( *pxCoRoutineWoken ) == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueAddToRegistry( QueueHandle_t xQueue, + const char * pcQueueName ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + QueueRegistryItem_t * pxEntryToWrite = NULL; + + configASSERT( xQueue ); + + if( pcQueueName != NULL ) + { + /* See if there is an empty space in the registry. A NULL name denotes + * a free slot. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + /* Replace an existing entry if the queue is already in the registry. */ + if( xQueue == xQueueRegistry[ ux ].xHandle ) + { + pxEntryToWrite = &( xQueueRegistry[ ux ] ); + break; + } + /* Otherwise, store in the next empty location */ + else if( ( pxEntryToWrite == NULL ) && ( xQueueRegistry[ ux ].pcQueueName == NULL ) ) + { + pxEntryToWrite = &( xQueueRegistry[ ux ] ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + + if( pxEntryToWrite != NULL ) + { + /* Store the information on this queue. */ + pxEntryToWrite->pcQueueName = pcQueueName; + pxEntryToWrite->xHandle = xQueue; + + traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName ); + } + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + const char * pcQueueGetName( QueueHandle_t xQueue ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t ux; + const char * pcReturn = NULL; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + configASSERT( xQueue ); + + /* Note there is nothing here to protect against another task adding or + * removing entries from the registry while it is being searched. */ + + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + pcReturn = xQueueRegistry[ ux ].pcQueueName; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + return pcReturn; + } /*lint !e818 xQueue cannot be a pointer to const because it is a typedef. */ + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueUnregisterQueue( QueueHandle_t xQueue ) + { + UBaseType_t ux; + + configASSERT( xQueue ); + + /* See if the handle of the queue being unregistered in actually in the + * registry. */ + for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; + + /* Set the handle to NULL to ensure the same queue handle cannot + * appear in the registry twice if it is added, removed, then + * added again. */ + xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0; + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vQueueWaitForMessageRestricted( QueueHandle_t xQueue, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) + { + Queue_t * const pxQueue = xQueue; + + /* This function should not be called by application code hence the + * 'Restricted' in its name. It is not part of the public API. It is + * designed for use by kernel code, and has special calling requirements. + * It can result in vListInsert() being called on a list that can only + * possibly ever have one item in it, so the list will be fast, but even + * so it should be called with the scheduler locked and not from a critical + * section. */ + + /* Only do anything if there are no messages in the queue. This function + * will not actually cause the task to block, just place it on a blocked + * list. It will not block until the scheduler is unlocked - at which + * time a yield will be performed. If an item is added to the queue while + * the queue is locked, and the calling task blocks on the queue, then the + * calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + + if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvUnlockQueue( pxQueue ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) + { + QueueSetHandle_t pxQueue; + + pxQueue = xQueueGenericCreate( uxEventQueueLength, ( UBaseType_t ) sizeof( Queue_t * ), queueQUEUE_TYPE_SET ); + + return pxQueue; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + + taskENTER_CRITICAL(); + { + if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) + { + /* Cannot add a queue/semaphore to more than one queue set. */ + xReturn = pdFAIL; + } + else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* Cannot add a queue/semaphore to a queue set if there are already + * items in the queue/semaphore. */ + xReturn = pdFAIL; + } + else + { + ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, + QueueSetHandle_t xQueueSet ) + { + BaseType_t xReturn; + Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore; + + if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) + { + /* The queue was not a member of the set. */ + xReturn = pdFAIL; + } + else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 ) + { + /* It is dangerous to remove a queue from a set when the queue is + * not empty because the queue set will still hold pending events for + * the queue. */ + xReturn = pdFAIL; + } + else + { + taskENTER_CRITICAL(); + { + /* The queue is no longer contained in the set. */ + pxQueueOrSemaphore->pxQueueSetContainer = NULL; + } + taskEXIT_CRITICAL(); + xReturn = pdPASS; + } + + return xReturn; + } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, + TickType_t const xTicksToWait ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) + { + QueueSetMemberHandle_t xReturn = NULL; + + ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) + { + Queue_t * pxQueueSetContainer = pxQueue->pxQueueSetContainer; + BaseType_t xReturn = pdFALSE; + + /* This function must be called form a critical section. */ + + /* The following line is not reachable in unit tests because every call + * to prvNotifyQueueSetContainer is preceded by a check that + * pxQueueSetContainer != NULL */ + configASSERT( pxQueueSetContainer ); /* LCOV_EXCL_BR_LINE */ + configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); + + if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) + { + const int8_t cTxLock = pxQueueSetContainer->cTxLock; + + traceQUEUE_SET_SEND( pxQueueSetContainer ); + + /* The data copied is the handle of the queue that contains data. */ + xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, queueSEND_TO_BACK ); + + if( cTxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + prvIncrementQueueTxLock( pxQueueSetContainer, cTxLock ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/sbom.spdx b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/sbom.spdx new file mode 100644 index 0000000..dd23423 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/sbom.spdx @@ -0,0 +1,1561 @@ +SPDXVersion: SPDX-2.2 +DataLicense: CC0-1.0 +SPDXID: SPDXRef-DOCUMENT +DocumentName: FreeRTOS-Kernel +DocumentNamespace: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/v10.5.1/sbom.spdx +Creator: Amazon Web Services +Created: 2022-11-15T20:10:07Z +CreatorComment: NOASSERTION +DocumentComment: NOASSERTION + +PackageName: FreeRTOS-Kernel +SPDXID: SPDXRef-Package-FreeRTOS-Kernel +PackageVersion: v10.5.1 +PackageDownloadLocation: https://github.com/FreeRTOS/FreeRTOS-Kernel/tree/v10.5.1 +PackageLicenseConcluded: MIT +FilesAnalyzed: True +PackageVerificationCode: 96e4888a8478768c165c6c3e8093b6ad74e7aa97 +PackageCopyrightText: NOASSERTION +PackageSummary: NOASSERTION +PackageDescription: FreeRTOS Kernel. + +FileName: ./stream_buffer.c +SPDXID: SPDXRef-File-stream_buffer.c +FileChecksum: SHA1: 1c2baa1e757130210c05d59a7e07ac8ab9552018 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./croutine.c +SPDXID: SPDXRef-File-croutine.c +FileChecksum: SHA1: 803043ff6cc8b5d893963fe448589ef42cdacb14 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./event_groups.c +SPDXID: SPDXRef-File-event_groups.c +FileChecksum: SHA1: c0c7ecca4606f5985305abd2a2b6332f2e84607b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./list.c +SPDXID: SPDXRef-File-list.c +FileChecksum: SHA1: 171e33e47d98bd69b41c2d96d6940be279dae1e1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./queue.c +SPDXID: SPDXRef-File-queue.c +FileChecksum: SHA1: 592dc3d7b6341db514978706e74cd0c2948a7bb0 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./tasks.c +SPDXID: SPDXRef-File-tasks.c +FileChecksum: SHA1: c32e962fcc28232c55b19a2286f48beb73a42a95 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./timers.c +SPDXID: SPDXRef-File-timers.c +FileChecksum: SHA1: 5709c8fa637a1a7af9094d273e7895f69123d054 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/CCS/MSP430X/port.c +SPDXID: SPDXRef-File-portable-CCS-MSP430X-port.c +FileChecksum: SHA1: 5079359be02915999512b97cfdd0466d1206da0c +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/CCS/ARM_CM4F/port.c +SPDXID: SPDXRef-File-portable-CCS-ARM_CM4F-port.c +FileChecksum: SHA1: 6acf3c7164f96612e3ee25189446b9444b82b73d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/CCS/ARM_CM3/port.c +SPDXID: SPDXRef-File-portable-CCS-ARM_CM3-port.c +FileChecksum: SHA1: a26e6f70312a7947d0c00452ed0620fc97557872 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/CCS/ARM_Cortex-R4/port.c +SPDXID: SPDXRef-File-portable-CCS-ARM_Cortex-R4-port.c +FileChecksum: SHA1: 6bb3269d1908d19449fb06981b51877123f63a5c +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MikroC/ARM_CM4F/port.c +SPDXID: SPDXRef-File-portable-MikroC-ARM_CM4F-port.c +FileChecksum: SHA1: d486325d1f761bb70cfa29d1a483911d2e988575 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/BCC/16BitDOS/PC/port.c +SPDXID: SPDXRef-File-portable-BCC-16BitDOS-PC-port.c +FileChecksum: SHA1: 68dc85a243ef9cdc6ac11359f136386787b0cbd6 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/BCC/16BitDOS/common/portcomn.c +SPDXID: SPDXRef-File-portable-BCC-16BitDOS-common-portcomn.c +FileChecksum: SHA1: 9ce97d3e33238cab16faa1ca9880736db727223c +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/BCC/16BitDOS/Flsh186/port.c +SPDXID: SPDXRef-File-portable-BCC-16BitDOS-Flsh186-port.c +FileChecksum: SHA1: 35b8e43c195af5f4757ef39b549971a7e2215f12 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Rowley/MSP430F449/port.c +SPDXID: SPDXRef-File-portable-Rowley-MSP430F449-port.c +FileChecksum: SHA1: 8105f0e88d952d925140f7050554254d52d87bdf +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/SDCC/Cygnal/port.c +SPDXID: SPDXRef-File-portable-SDCC-Cygnal-port.c +FileChecksum: SHA1: a297d40f8ef95f6d78c5b64a1e00c36b777c6937 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/RVDS/ARM_CM4_MPU/port.c +SPDXID: SPDXRef-File-portable-RVDS-ARM_CM4_MPU-port.c +FileChecksum: SHA1: 08344265c5e61d1b2ae7eb30a1d35d62ef79a274 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/RVDS/ARM7_LPC21xx/port.c +SPDXID: SPDXRef-File-portable-RVDS-ARM7_LPC21xx-port.c +FileChecksum: SHA1: ce442b6f66a3d869326dca2005bd80f66326600b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/RVDS/ARM_CM7/r0p1/port.c +SPDXID: SPDXRef-File-portable-RVDS-ARM_CM7-r0p1-port.c +FileChecksum: SHA1: 7bcfb74d36ec1ea00ea3f9b2535c635da6933af1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/RVDS/ARM_CM4F/port.c +SPDXID: SPDXRef-File-portable-RVDS-ARM_CM4F-port.c +FileChecksum: SHA1: 9e86fdeb88ec953c791938c22b505f3f15db979c +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/RVDS/ARM_CA9/port.c +SPDXID: SPDXRef-File-portable-RVDS-ARM_CA9-port.c +FileChecksum: SHA1: 5fd59e8f1451038843b5c53131ad8864f3b2da0e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/RVDS/ARM_CM3/port.c +SPDXID: SPDXRef-File-portable-RVDS-ARM_CM3-port.c +FileChecksum: SHA1: 1dd525bf973639aee2e527bd275307b2f05a0691 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/RVDS/ARM_CM0/port.c +SPDXID: SPDXRef-File-portable-RVDS-ARM_CM0-port.c +FileChecksum: SHA1: 632b983eb081008e1457dddcf87648a37ea4005f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Paradigm/Tern_EE/large_untested/port.c +SPDXID: SPDXRef-File-portable-Paradigm-Tern_EE-large_untested-port.c +FileChecksum: SHA1: 0a20e0468a5858f5ba539d6d7657b9334780c64e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Paradigm/Tern_EE/small/port.c +SPDXID: SPDXRef-File-portable-Paradigm-Tern_EE-small-port.c +FileChecksum: SHA1: a77fe59c250015bb429431d5bc3c1ffb44499f0e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM4_MPU/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM4_MPU-port.c +FileChecksum: SHA1: 5622de1720c3516069bc636370a7d8e073533df8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/RL78/port.c +SPDXID: SPDXRef-File-portable-GCC-RL78-port.c +FileChecksum: SHA1: 65e8c385787853909d4ba9dae183ace2de959161 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/IA32_flat/port.c +SPDXID: SPDXRef-File-portable-GCC-IA32_flat-port.c +FileChecksum: SHA1: f5d0b9df9f6688bf3c145d102adf48aa1a692e93 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/NiosII/port.c +SPDXID: SPDXRef-File-portable-GCC-NiosII-port.c +FileChecksum: SHA1: c23194fccbdeed397df8f1018828c14a549d1e9e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM7_LPC23xx/portISR.c +SPDXID: SPDXRef-File-portable-GCC-ARM7_LPC23xx-portISR.c +FileChecksum: SHA1: 7e7030c594c8ee5adc53438bd4179002e5703236 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM7_LPC23xx/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM7_LPC23xx-port.c +FileChecksum: SHA1: 8479e66a9770b283c305fdbc78529869b612baa2 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM7/r0p1/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM7-r0p1-port.c +FileChecksum: SHA1: 5553768cde1cf30e25d09c8162cb4a677df11779 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/MSP430F449/port.c +SPDXID: SPDXRef-File-portable-GCC-MSP430F449-port.c +FileChecksum: SHA1: 9696a0bf2621dc877561bcf63131d7d535379437 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM7_LPC2000/portISR.c +SPDXID: SPDXRef-File-portable-GCC-ARM7_LPC2000-portISR.c +FileChecksum: SHA1: f5258ff45edce2a18d1b51d4687a8d0690986b82 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM7_LPC2000/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM7_LPC2000-port.c +FileChecksum: SHA1: 1f1bb8ed90f0bf1cc73d6d89f49e0ddf55149e95 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CRx_No_GIC/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CRx_No_GIC-port.c +FileChecksum: SHA1: c75a366b6dbaf32f068abd15acb86b9ee9d66c4f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/MicroBlazeV8/port.c +SPDXID: SPDXRef-File-portable-GCC-MicroBlazeV8-port.c +FileChecksum: SHA1: 9ebcac457d4378eb0c800d0d70693eb11703fb40 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/MicroBlazeV8/port_exceptions.c +SPDXID: SPDXRef-File-portable-GCC-MicroBlazeV8-port_exceptions.c +FileChecksum: SHA1: 6ddd34b4a6ed92717e3bd0bed2bebf318fa71f44 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/MicroBlaze/port.c +SPDXID: SPDXRef-File-portable-GCC-MicroBlaze-port.c +FileChecksum: SHA1: a7ecb0f974b6cffb683ea00e7b352c909f870477 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ColdFire_V2/port.c +SPDXID: SPDXRef-File-portable-GCC-ColdFire_V2-port.c +FileChecksum: SHA1: 932d76f4aef15e2e4a558da32481061b3da1d82c +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CA53_64_BIT/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CA53_64_BIT-port.c +FileChecksum: SHA1: 3e878e86aef525cedfc311b9a3cbbc2c7142bb30 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM55_NTZ-non_secure-portasm.c +FileChecksum: SHA1: 249729a046c0fe1fc8dd3397f443c4c9979499b9 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM55_NTZ/non_secure/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM55_NTZ-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM3_MPU/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM3_MPU-port.c +FileChecksum: SHA1: da7419edd8b969db2a3263cf576f2917ee629a58 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CR5/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CR5-port.c +FileChecksum: SHA1: 361da1a5df63c05e9601d52dbaa6003eb3f38dc5 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/AVR32_UC3/port.c +SPDXID: SPDXRef-File-portable-GCC-AVR32_UC3-port.c +FileChecksum: SHA1: 4464b3b5081ef9adb39fb9ad26f5d6dd9c05ad84 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/RX200/port.c +SPDXID: SPDXRef-File-portable-GCC-RX200-port.c +FileChecksum: SHA1: 4e5358ee871244a2e00e06e546f0e1dfa9936d6d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/STR75x/portISR.c +SPDXID: SPDXRef-File-portable-GCC-STR75x-portISR.c +FileChecksum: SHA1: dbe50473ddeb32c9ba7effa0c3ad5e66bc8192ed +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/STR75x/port.c +SPDXID: SPDXRef-File-portable-GCC-STR75x-port.c +FileChecksum: SHA1: 9ba5853c4865e7067fddedb1f54a5b1777e9308a +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM7_AT91FR40008/portISR.c +SPDXID: SPDXRef-File-portable-GCC-ARM7_AT91FR40008-portISR.c +FileChecksum: SHA1: 189a0b302ba2562b823c28763bc7aefe8687217f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM7_AT91FR40008/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM7_AT91FR40008-port.c +FileChecksum: SHA1: 24b38b808a31dcc5641d57c2365975b1e7328bb8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM33/non_secure/portasm.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM33-non_secure-portasm.c +FileChecksum: SHA1: 6304a240212afc5aa5c44ef0bc4bd3da50f55e9b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM33/non_secure/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM33-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM33/secure/secure_context_port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM33-secure-secure_context_port.c +FileChecksum: SHA1: d9e90b3025d88a9defa5dbdc83cbcd3b86bc3ce4 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM33/secure/secure_heap.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM33-secure-secure_heap.c +FileChecksum: SHA1: c803853724f8df8fca2a6c3520bc4ac83ffa9cc1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM33/secure/secure_context.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM33-secure-secure_context.c +FileChecksum: SHA1: 3b18903a3259d37caeede1d293d27c0701fcb33d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM33/secure/secure_init.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM33-secure-secure_init.c +FileChecksum: SHA1: 01d9390f6968031088f52ff615c165fa8e7e78b6 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM4F/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM4F-port.c +FileChecksum: SHA1: 71d433f0bfef365a86e23e415ec563435a04e757 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM33_NTZ-non_secure-portasm.c +FileChecksum: SHA1: cb80a39285b76c42e97c9503b3018186b4c1a59d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM33_NTZ/non_secure/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM33_NTZ-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/PPC405_Xilinx/port.c +SPDXID: SPDXRef-File-portable-GCC-PPC405_Xilinx-port.c +FileChecksum: SHA1: 478ba8d7b3ba53d0fe3367094f18d159ec21b806 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/RISC-V/port.c +SPDXID: SPDXRef-File-portable-GCC-RISC-V-port.c +FileChecksum: SHA1: 129809b6812071585f3bd53888c447953879dd6f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/RX100/port.c +SPDXID: SPDXRef-File-portable-GCC-RX100-port.c +FileChecksum: SHA1: 02e373ddc7cb1b4f56aaf861d648c6da72e584d3 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/CORTUS_APS3/port.c +SPDXID: SPDXRef-File-portable-GCC-CORTUS_APS3-port.c +FileChecksum: SHA1: 747e7e9d4f1c3c9830a0ef80a3780ccb923544be +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/H8S2329/port.c +SPDXID: SPDXRef-File-portable-GCC-H8S2329-port.c +FileChecksum: SHA1: 181bccd24e13159d6dee345119b4b1c3183ee4ef +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/HCS12/port.c +SPDXID: SPDXRef-File-portable-GCC-HCS12-port.c +FileChecksum: SHA1: 546bc475d0b0f79c1431910313b2ff534af85762 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM85_NTZ-non_secure-portasm.c +FileChecksum: SHA1: cb80a39285b76c42e97c9503b3018186b4c1a59d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM85_NTZ/non_secure/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM85_NTZ-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/RX600/port.c +SPDXID: SPDXRef-File-portable-GCC-RX600-port.c +FileChecksum: SHA1: fc5cbc2e2d53e32e01670dae4f5a2461932d6ce4 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/PPC440_Xilinx/port.c +SPDXID: SPDXRef-File-portable-GCC-PPC440_Xilinx-port.c +FileChecksum: SHA1: b9a24e917dc2ee679e4881fe4361c188ef58cb2c +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ATMega323/port.c +SPDXID: SPDXRef-File-portable-GCC-ATMega323-port.c +FileChecksum: SHA1: 9429770b499b8b243eb2bd347ac958f9b484c82e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CA9/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CA9-port.c +FileChecksum: SHA1: d19ffa018e122844d3f73aa0e941e5955b824c90 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/MicroBlazeV9/port.c +SPDXID: SPDXRef-File-portable-GCC-MicroBlazeV9-port.c +FileChecksum: SHA1: 01eaffe9ef3c1ea0f71899f62614d6a41c78d109 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/MicroBlazeV9/port_exceptions.c +SPDXID: SPDXRef-File-portable-GCC-MicroBlazeV9-port_exceptions.c +FileChecksum: SHA1: 6ddd34b4a6ed92717e3bd0bed2bebf318fa71f44 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c +SPDXID: SPDXRef-File-portable-GCC-ARM7_AT91SAM7S-lib_AT91SAM7X256.c +FileChecksum: SHA1: 19a5b91dc5a9e1ed3e5e38cece6315a6494610e9 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM7_AT91SAM7S/portISR.c +SPDXID: SPDXRef-File-portable-GCC-ARM7_AT91SAM7S-portISR.c +FileChecksum: SHA1: 9d183db30d2b904c015784de3c3e4792d9375c38 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM7_AT91SAM7S/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM7_AT91SAM7S-port.c +FileChecksum: SHA1: fba8714b48bd6a37bddd180a8527c1ae107ab9d1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/TriCore_1782/porttrap.c +SPDXID: SPDXRef-File-portable-GCC-TriCore_1782-porttrap.c +FileChecksum: SHA1: 40a6505eddb3c75ed15a12762eb1b80d3bcc9727 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/TriCore_1782/port.c +SPDXID: SPDXRef-File-portable-GCC-TriCore_1782-port.c +FileChecksum: SHA1: fe6d901cfcbc5e421aaf2ce07af586334d7a1493 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM23/non_secure/portasm.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM23-non_secure-portasm.c +FileChecksum: SHA1: 711c1344bb9577c56ccc4a708a631963d38217b5 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM23/non_secure/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM23-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM23/secure/secure_context_port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM23-secure-secure_context_port.c +FileChecksum: SHA1: 36b3e28d4a98d49d7e36e11808a6c4cac77a51bb +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM23/secure/secure_heap.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM23-secure-secure_heap.c +FileChecksum: SHA1: c803853724f8df8fca2a6c3520bc4ac83ffa9cc1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM23/secure/secure_context.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM23-secure-secure_context.c +FileChecksum: SHA1: 3b18903a3259d37caeede1d293d27c0701fcb33d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM23/secure/secure_init.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM23-secure-secure_init.c +FileChecksum: SHA1: 01d9390f6968031088f52ff615c165fa8e7e78b6 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM85/non_secure/portasm.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM85-non_secure-portasm.c +FileChecksum: SHA1: 6304a240212afc5aa5c44ef0bc4bd3da50f55e9b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM85/non_secure/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM85-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM85/secure/secure_context_port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM85-secure-secure_context_port.c +FileChecksum: SHA1: d9e90b3025d88a9defa5dbdc83cbcd3b86bc3ce4 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM85/secure/secure_heap.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM85-secure-secure_heap.c +FileChecksum: SHA1: c803853724f8df8fca2a6c3520bc4ac83ffa9cc1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM85/secure/secure_context.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM85-secure-secure_context.c +FileChecksum: SHA1: 3b18903a3259d37caeede1d293d27c0701fcb33d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM85/secure/secure_init.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM85-secure-secure_init.c +FileChecksum: SHA1: 01d9390f6968031088f52ff615c165fa8e7e78b6 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/RX600v2/port.c +SPDXID: SPDXRef-File-portable-GCC-RX600v2-port.c +FileChecksum: SHA1: 6aab3ba8300af09fbddd957b1c1a5de0d53769be +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM3/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM3-port.c +FileChecksum: SHA1: 8c5dfff3e4766a347d9cd2a893a2471c2c7e0cc0 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/RX700v3_DPFPU/port.c +SPDXID: SPDXRef-File-portable-GCC-RX700v3_DPFPU-port.c +FileChecksum: SHA1: 3a8da1877c46b1be823f39951c833b25813c431f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM55/non_secure/portasm.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM55-non_secure-portasm.c +FileChecksum: SHA1: 57d0b9f14d59d28ed4d8ade666027477275c9528 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM55/non_secure/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM55-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM55/secure/secure_context_port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM55-secure-secure_context_port.c +FileChecksum: SHA1: 64adb6bc89a3d0460649f8ed6ce92bfe96899929 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM55/secure/secure_heap.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM55-secure-secure_heap.c +FileChecksum: SHA1: 22131716159658eb5b7980fbb4fbf6cc42506401 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM55/secure/secure_context.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM55-secure-secure_context.c +FileChecksum: SHA1: 63fdeebd74ef8654c61d0d8f1497f744b01206b1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM55/secure/secure_init.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM55-secure-secure_init.c +FileChecksum: SHA1: b7f2d8f69ca99be60568173cc844829f8cf80e97 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CA53_64_BIT_SRE/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CA53_64_BIT_SRE-port.c +FileChecksum: SHA1: af55c9568b7e180ed2a3295ab0a8c35cb376b43b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM23_NTZ-non_secure-portasm.c +FileChecksum: SHA1: eb7744902f32d79cd58476d03b846aa25b154895 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM23_NTZ/non_secure/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM23_NTZ-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/GCC/ARM_CM0/port.c +SPDXID: SPDXRef-File-portable-GCC-ARM_CM0-port.c +FileChecksum: SHA1: 4b98a3f5e7cdb6d4969475d6415631e9b3dd9f54 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Softune/MB96340/port.c +SPDXID: SPDXRef-File-portable-Softune-MB96340-port.c +FileChecksum: SHA1: 7fcb818f839785ad0939a8ff19d180f523d9d899 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Softune/MB96340/__STD_LIB_sbrk.c +SPDXID: SPDXRef-File-portable-Softune-MB96340-__STD_LIB_sbrk.c +FileChecksum: SHA1: 10f8f82190ade6d7986582215cb7fc52d8f137ec +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Softune/MB91460/port.c +SPDXID: SPDXRef-File-portable-Softune-MB91460-port.c +FileChecksum: SHA1: 4e6eedebdf6057a3b5ecc6ccf974d3b71b0c93bf +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Softune/MB91460/__STD_LIB_sbrk.c +SPDXID: SPDXRef-File-portable-Softune-MB91460-__STD_LIB_sbrk.c +FileChecksum: SHA1: 10f8f82190ade6d7986582215cb7fc52d8f137ec +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/non_secure/port.c +SPDXID: SPDXRef-File-portable-ARMv8M-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c +SPDXID: SPDXRef-File-portable-ARMv8M-non_secure-portable-GCC-ARM_CM33-portasm.c +FileChecksum: SHA1: 6304a240212afc5aa5c44ef0bc4bd3da50f55e9b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c +SPDXID: SPDXRef-File-portable-ARMv8M-non_secure-portable-GCC-ARM_CM33_NTZ-portasm.c +FileChecksum: SHA1: cb80a39285b76c42e97c9503b3018186b4c1a59d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c +SPDXID: SPDXRef-File-portable-ARMv8M-non_secure-portable-GCC-ARM_CM23-portasm.c +FileChecksum: SHA1: 711c1344bb9577c56ccc4a708a631963d38217b5 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c +SPDXID: SPDXRef-File-portable-ARMv8M-non_secure-portable-GCC-ARM_CM23_NTZ-portasm.c +FileChecksum: SHA1: eb7744902f32d79cd58476d03b846aa25b154895 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/secure/heap/secure_heap.c +SPDXID: SPDXRef-File-portable-ARMv8M-secure-heap-secure_heap.c +FileChecksum: SHA1: c803853724f8df8fca2a6c3520bc4ac83ffa9cc1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/secure/context/secure_context.c +SPDXID: SPDXRef-File-portable-ARMv8M-secure-context-secure_context.c +FileChecksum: SHA1: 3b18903a3259d37caeede1d293d27c0701fcb33d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c +SPDXID: SPDXRef-File-portable-ARMv8M-secure-context-portable-GCC-ARM_CM33-secure_context_port.c +FileChecksum: SHA1: d9e90b3025d88a9defa5dbdc83cbcd3b86bc3ce4 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c +SPDXID: SPDXRef-File-portable-ARMv8M-secure-context-portable-GCC-ARM_CM23-secure_context_port.c +FileChecksum: SHA1: 36b3e28d4a98d49d7e36e11808a6c4cac77a51bb +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ARMv8M/secure/init/secure_init.c +SPDXID: SPDXRef-File-portable-ARMv8M-secure-init-secure_init.c +FileChecksum: SHA1: 01d9390f6968031088f52ff615c165fa8e7e78b6 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Renesas/SH2A_FPU/port.c +SPDXID: SPDXRef-File-portable-Renesas-SH2A_FPU-port.c +FileChecksum: SHA1: 5d7a1294a1538c79222b3ddeca9d015ecd57b76b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Renesas/RX200/port.c +SPDXID: SPDXRef-File-portable-Renesas-RX200-port.c +FileChecksum: SHA1: 241c5e8350799f4539de632e449807ebec550060 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Renesas/RX100/port.c +SPDXID: SPDXRef-File-portable-Renesas-RX100-port.c +FileChecksum: SHA1: 0ee930bd04ed137571337003b278867478316d17 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Renesas/RX600/port.c +SPDXID: SPDXRef-File-portable-Renesas-RX600-port.c +FileChecksum: SHA1: cb819b866379b2e8dd5efb5d672431b34bbd7912 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Renesas/RX600v2/port.c +SPDXID: SPDXRef-File-portable-Renesas-RX600v2-port.c +FileChecksum: SHA1: e75835734a6e50caca7b9bd158a4ffdc029ecb66 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Renesas/RX700v3_DPFPU/port.c +SPDXID: SPDXRef-File-portable-Renesas-RX700v3_DPFPU-port.c +FileChecksum: SHA1: c119de3d323938b05ccde47896e0a43efeff09b4 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MPLAB/PIC18F/port.c +SPDXID: SPDXRef-File-portable-MPLAB-PIC18F-port.c +FileChecksum: SHA1: 4df82e21e6eb1624358bb52fa5018b386bd12a1c +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MPLAB/PIC32MEC14xx/port.c +SPDXID: SPDXRef-File-portable-MPLAB-PIC32MEC14xx-port.c +FileChecksum: SHA1: b5d1e2de6ba94d5cc934185debc9768567d45598 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MPLAB/PIC32MX/port.c +SPDXID: SPDXRef-File-portable-MPLAB-PIC32MX-port.c +FileChecksum: SHA1: 1de50dd19ae325da0c8ec70bdfa9eec92d8cfa0d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MPLAB/PIC32MZ/port.c +SPDXID: SPDXRef-File-portable-MPLAB-PIC32MZ-port.c +FileChecksum: SHA1: f0b399058bec945374ffe75a119e9c4beb8baa1e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MPLAB/PIC24_dsPIC/port.c +SPDXID: SPDXRef-File-portable-MPLAB-PIC24_dsPIC-port.c +FileChecksum: SHA1: fa26fdd93ada4b92fa8f02dba77be2ff149eb15d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/CodeWarrior/ColdFire_V2/port.c +SPDXID: SPDXRef-File-portable-CodeWarrior-ColdFire_V2-port.c +FileChecksum: SHA1: 7afcc073470e64ae5624ccce6a07235f687791f1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/CodeWarrior/HCS12/port.c +SPDXID: SPDXRef-File-portable-CodeWarrior-HCS12-port.c +FileChecksum: SHA1: e877ad2139c9a315381e3bdfd19708a88539b0b3 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/CodeWarrior/ColdFire_V1/port.c +SPDXID: SPDXRef-File-portable-CodeWarrior-ColdFire_V1-port.c +FileChecksum: SHA1: 3b71e7d8a7d044de0b25d1e36214414bb8be3b39 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MemMang/heap_4.c +SPDXID: SPDXRef-File-portable-MemMang-heap_4.c +FileChecksum: SHA1: a452f279d3f91d1e601a0e4a4221008fd422c556 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MemMang/heap_5.c +SPDXID: SPDXRef-File-portable-MemMang-heap_5.c +FileChecksum: SHA1: 540a3bbe77e3e313d28b3a32d9342f7fb6e6795b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MemMang/heap_2.c +SPDXID: SPDXRef-File-portable-MemMang-heap_2.c +FileChecksum: SHA1: 8eba4818731d400281f9970485d684fca9fcd4b8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MemMang/heap_3.c +SPDXID: SPDXRef-File-portable-MemMang-heap_3.c +FileChecksum: SHA1: 6409c5f00557bdc65c628440f706383bb1e9415b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MemMang/heap_1.c +SPDXID: SPDXRef-File-portable-MemMang-heap_1.c +FileChecksum: SHA1: 3db10e6ac9d56efcdd9f7e86bbbf7974941f413c +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-ARC_v1-arc_freertos_exceptions.c +FileChecksum: SHA1: 39ad9008f7017ea75ba984a2867d31afaf836d10 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/ARC_v1/port.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-ARC_v1-port.c +FileChecksum: SHA1: a25919da8c7506a32c089112675e48277ca3fee4 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-ARC_EM_HS-arc_freertos_exceptions.c +FileChecksum: SHA1: 39ad9008f7017ea75ba984a2867d31afaf836d10 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-ARC_EM_HS-freertos_tls.c +FileChecksum: SHA1: 170c3aae182620ee388eb2ca00c65345186bf4e5 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/ARC_EM_HS/port.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-ARC_EM_HS-port.c +FileChecksum: SHA1: 805cbb1d4a1c078df121567329019a9337329d7f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/Posix/port.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-Posix-port.c +FileChecksum: SHA1: 892e342fd230a2c6e7d3c5cc8e9346a00a38ab4f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/Posix/utils/wait_for_event.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-Posix-utils-wait_for_event.c +FileChecksum: SHA1: a46806f9b7316a4efaef388288a4613966c72fc4 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-ARM_TFM-os_wrapper_freertos.c +FileChecksum: SHA1: a1420f4f796a50fc3173a7a1600e7b1f43fbf809 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-RP2040-idle_task_static_memory.c +FileChecksum: SHA1: 99f20e3882c2630f8bbf56be338649a06a8347aa +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/RP2040/port.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-RP2040-port.c +FileChecksum: SHA1: 2473956780bf9652ff18f63b79b1d26c9f3eb608 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-Xtensa_ESP32-FreeRTOS-openocd.c +FileChecksum: SHA1: edeb30d33792d57505b80799a88034c810d7ce0b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-Xtensa_ESP32-port_common.c +FileChecksum: SHA1: 12af31796408503788ec51c48d526258b6bc413b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-Xtensa_ESP32-xtensa_overlay_os_hook.c +FileChecksum: SHA1: f7bc6354e74d83ac2ee094652693c454397e9599 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-Xtensa_ESP32-xtensa_init.c +FileChecksum: SHA1: 8e0fd89383eb408a6d3b2c3aa50e49f0ec3b442e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-Xtensa_ESP32-port_systick.c +FileChecksum: SHA1: b00142b18bfa91bdca90d876ebe03e4a8dac77e7 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/Xtensa_ESP32/port.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-Xtensa_ESP32-port.c +FileChecksum: SHA1: 0f63ba2624dc440e52380e0ab830752990113a66 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/GCC/ATmega/port.c +SPDXID: SPDXRef-File-portable-ThirdParty-GCC-ATmega-port.c +FileChecksum: SHA1: 1ed1936055df89ebc12f76053b2e05e9b9eb6637 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c +SPDXID: SPDXRef-File-portable-ThirdParty-XCC-Xtensa-xtensa_overlay_os_hook.c +FileChecksum: SHA1: 8f0b2a50380c6becd723c252ea77184cd7c619ec +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/XCC/Xtensa/xtensa_init.c +SPDXID: SPDXRef-File-portable-ThirdParty-XCC-Xtensa-xtensa_init.c +FileChecksum: SHA1: 3d3f167933e7667425de96a9a70443c8380edd6f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/XCC/Xtensa/xtensa_intr.c +SPDXID: SPDXRef-File-portable-ThirdParty-XCC-Xtensa-xtensa_intr.c +FileChecksum: SHA1: 58190888bee2d7c656d4d8d1d2fe7f19d26a832e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/XCC/Xtensa/port.c +SPDXID: SPDXRef-File-portable-ThirdParty-XCC-Xtensa-port.c +FileChecksum: SHA1: a58c46bf18fd642d752a253d0bdd43e7f42ecdb0 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/XCC/Xtensa/portclib.c +SPDXID: SPDXRef-File-portable-ThirdParty-XCC-Xtensa-portclib.c +FileChecksum: SHA1: 535f96d2764bbad5d013c2e60a49d67c48fa1b9e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/ThirdParty/CDK/T-HEAD_CK802/port.c +SPDXID: SPDXRef-File-portable-ThirdParty-CDK-T-HEAD_CK802-port.c +FileChecksum: SHA1: 7f58981ec9cd97ae40bd50098f122133b96d8494 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/RL78/port.c +SPDXID: SPDXRef-File-portable-IAR-RL78-port.c +FileChecksum: SHA1: 4bf9be3234e1ac537c89efb0e013c3dcd1c022b5 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/MSP430X/port.c +SPDXID: SPDXRef-File-portable-IAR-MSP430X-port.c +FileChecksum: SHA1: a2854f1e542068d6a0dee5ef78d2bf1fb03dcbf5 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM7/r0p1/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM7-r0p1-port.c +FileChecksum: SHA1: 131ec8dfd40e23d1b019c698d72d89e3b987967c +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CRx_No_GIC/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CRx_No_GIC-port.c +FileChecksum: SHA1: cc15c2006d4d4fdd984c022a2cc232796697ee69 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/V850ES/port.c +SPDXID: SPDXRef-File-portable-IAR-V850ES-port.c +FileChecksum: SHA1: 5f38b24fdfb372b6f4c9dc709cd8cf6e0095ba7f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM55_NTZ/non_secure/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM55_NTZ-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/AVR32_UC3/read.c +SPDXID: SPDXRef-File-portable-IAR-AVR32_UC3-read.c +FileChecksum: SHA1: 2e690795b10a32cec32f55dde960296c62d0f72a +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/AVR32_UC3/write.c +SPDXID: SPDXRef-File-portable-IAR-AVR32_UC3-write.c +FileChecksum: SHA1: 0e44f45e2f2fb5b46b769a9571d1ffb9780ddf13 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/AVR32_UC3/port.c +SPDXID: SPDXRef-File-portable-IAR-AVR32_UC3-port.c +FileChecksum: SHA1: 7b7c43fcfe227114d4d09cfda433670ea9561602 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/STR75x/port.c +SPDXID: SPDXRef-File-portable-IAR-STR75x-port.c +FileChecksum: SHA1: 305cbe5c84979974a6a6124115b7ddf373624fdd +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/78K0R/port.c +SPDXID: SPDXRef-File-portable-IAR-78K0R-port.c +FileChecksum: SHA1: 3d4f06e3c7eeb7c4f6c952d78e486c2141116f88 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/AVR_Mega0/port.c +SPDXID: SPDXRef-File-portable-IAR-AVR_Mega0-port.c +FileChecksum: SHA1: b223c11cc6b1cf6bddd6f6943925295cc5f5aa7f +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM33/non_secure/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM33-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM33/secure/secure_heap.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM33-secure-secure_heap.c +FileChecksum: SHA1: c803853724f8df8fca2a6c3520bc4ac83ffa9cc1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM33/secure/secure_context.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM33-secure-secure_context.c +FileChecksum: SHA1: 3b18903a3259d37caeede1d293d27c0701fcb33d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM33/secure/secure_init.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM33-secure-secure_init.c +FileChecksum: SHA1: 01d9390f6968031088f52ff615c165fa8e7e78b6 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM4F/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM4F-port.c +FileChecksum: SHA1: b9ec3095d50b4825686c3a3629ff22fafb84c4ba +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM33_NTZ/non_secure/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM33_NTZ-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/AtmelSAM9XE/port.c +SPDXID: SPDXRef-File-portable-IAR-AtmelSAM9XE-port.c +FileChecksum: SHA1: bdb25b559149aad7f2e5035fb4b12c70836f97a0 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/RISC-V/port.c +SPDXID: SPDXRef-File-portable-IAR-RISC-V-port.c +FileChecksum: SHA1: 5fe98520bdccddec759a1ddf74f066477bf09a37 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/AVR_AVRDx/port.c +SPDXID: SPDXRef-File-portable-IAR-AVR_AVRDx-port.c +FileChecksum: SHA1: d9d44c218c4bb0acf4c08a9243bedaac8d1cef71 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/MSP430/port.c +SPDXID: SPDXRef-File-portable-IAR-MSP430-port.c +FileChecksum: SHA1: 6812ef4c2c81568e602ba010133698c788e328e4 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/RX100/port.c +SPDXID: SPDXRef-File-portable-IAR-RX100-port.c +FileChecksum: SHA1: 27327ef2975dd1b2416e862515ae2f91062ca2a7 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM85_NTZ/non_secure/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM85_NTZ-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/RX600/port.c +SPDXID: SPDXRef-File-portable-IAR-RX600-port.c +FileChecksum: SHA1: 056369dded69a4ab5fb8d742b8159029bcce94ee +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ATMega323/port.c +SPDXID: SPDXRef-File-portable-IAR-ATMega323-port.c +FileChecksum: SHA1: 9e91a5680e94fedf407bdef7d65ef0bd7eabf799 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CA9/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CA9-port.c +FileChecksum: SHA1: f6cf117194b079fd018bfc110139767bdf83863d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/LPC2000/port.c +SPDXID: SPDXRef-File-portable-IAR-LPC2000-port.c +FileChecksum: SHA1: dd0ecf60f912ca493b23a0b11a050bc16aef4470 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/STR71x/port.c +SPDXID: SPDXRef-File-portable-IAR-STR71x-port.c +FileChecksum: SHA1: 8d1038c43c5d15a5e42097de07e85aa6ce2836ea +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/STR91x/port.c +SPDXID: SPDXRef-File-portable-IAR-STR91x-port.c +FileChecksum: SHA1: 83b791a7425091a6d57cbc6ad184dd2ccde67f7d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM23/non_secure/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM23-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM23/secure/secure_heap.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM23-secure-secure_heap.c +FileChecksum: SHA1: c803853724f8df8fca2a6c3520bc4ac83ffa9cc1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM23/secure/secure_context.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM23-secure-secure_context.c +FileChecksum: SHA1: 3b18903a3259d37caeede1d293d27c0701fcb33d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM23/secure/secure_init.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM23-secure-secure_init.c +FileChecksum: SHA1: 01d9390f6968031088f52ff615c165fa8e7e78b6 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM85/non_secure/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM85-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM85/secure/secure_heap.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM85-secure-secure_heap.c +FileChecksum: SHA1: c803853724f8df8fca2a6c3520bc4ac83ffa9cc1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM85/secure/secure_context.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM85-secure-secure_context.c +FileChecksum: SHA1: 3b18903a3259d37caeede1d293d27c0701fcb33d +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM85/secure/secure_init.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM85-secure-secure_init.c +FileChecksum: SHA1: 01d9390f6968031088f52ff615c165fa8e7e78b6 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/AtmelSAM7S64/port.c +SPDXID: SPDXRef-File-portable-IAR-AtmelSAM7S64-port.c +FileChecksum: SHA1: 914f1804113f6310f7c32568f2f8a29cdb4d6b1e +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM3/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM3-port.c +FileChecksum: SHA1: b4fec57793f1c37717c45c89f40f0072826bde33 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/RX700v3_DPFPU/port.c +SPDXID: SPDXRef-File-portable-IAR-RX700v3_DPFPU-port.c +FileChecksum: SHA1: 2cb6881752a1fb40456d57794981f1ecb01e6bac +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM55/non_secure/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM55-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM55/secure/secure_heap.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM55-secure-secure_heap.c +FileChecksum: SHA1: 22131716159658eb5b7980fbb4fbf6cc42506401 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM55/secure/secure_context.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM55-secure-secure_context.c +FileChecksum: SHA1: 63fdeebd74ef8654c61d0d8f1497f744b01206b1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM55/secure/secure_init.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM55-secure-secure_init.c +FileChecksum: SHA1: b7f2d8f69ca99be60568173cc844829f8cf80e97 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CA5_No_GIC/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CA5_No_GIC-port.c +FileChecksum: SHA1: 02c3d32075d1cdc269940644c42f4ae8cadc6e3b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM4F_MPU/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM4F_MPU-port.c +FileChecksum: SHA1: 9d5b22ffc3b5057ce7efa078234fbd6c0fa822c4 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/RXv2/port.c +SPDXID: SPDXRef-File-portable-IAR-RXv2-port.c +FileChecksum: SHA1: 8cb3e7d74c877997e65f38dfa026408ae56d1310 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM23_NTZ/non_secure/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM23_NTZ-non_secure-port.c +FileChecksum: SHA1: 7232f62ebf97fdae174d06b2471f352975c10fa8 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/IAR/ARM_CM0/port.c +SPDXID: SPDXRef-File-portable-IAR-ARM_CM0-port.c +FileChecksum: SHA1: c7a94e88030646ba23683dd41f746f3513aec48b +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Common/mpu_wrappers.c +SPDXID: SPDXRef-File-portable-Common-mpu_wrappers.c +FileChecksum: SHA1: cf1165968ba4bbeee12e38ca88161b96a2570fd1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/Tasking/ARM_CM4F/port.c +SPDXID: SPDXRef-File-portable-Tasking-ARM_CM4F-port.c +FileChecksum: SHA1: 4e251295192027b1286d1a7fcd54cd5cebdc5bbc +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/oWatcom/16BitDOS/PC/port.c +SPDXID: SPDXRef-File-portable-oWatcom-16BitDOS-PC-port.c +FileChecksum: SHA1: 482f2ca2c10195a7dc0e5f2cbabddd11016295f1 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/oWatcom/16BitDOS/common/portcomn.c +SPDXID: SPDXRef-File-portable-oWatcom-16BitDOS-common-portcomn.c +FileChecksum: SHA1: 7ea2aeb5471e46f344883d38fd214b07bdbffb59 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/oWatcom/16BitDOS/Flsh186/port.c +SPDXID: SPDXRef-File-portable-oWatcom-16BitDOS-Flsh186-port.c +FileChecksum: SHA1: 52126b1ae32773c821d96dc8f9ddd55d67925dd6 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/WizC/PIC18/port.c +SPDXID: SPDXRef-File-portable-WizC-PIC18-port.c +FileChecksum: SHA1: c34cb4df1d9af422ab1137b837408f8edca37937 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/WizC/PIC18/Drivers/Tick/isrTick.c +SPDXID: SPDXRef-File-portable-WizC-PIC18-Drivers-Tick-isrTick.c +FileChecksum: SHA1: d209388fa9ab6fccf9a8cf9926aa06f7a0aef4a7 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/WizC/PIC18/Drivers/Tick/Tick.c +SPDXID: SPDXRef-File-portable-WizC-PIC18-Drivers-Tick-Tick.c +FileChecksum: SHA1: c8cb5a4c67115c0320ce85b1866144c89c8640a0 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + +FileName: ./portable/MSVC-MingW/port.c +SPDXID: SPDXRef-File-portable-MSVC-MingW-port.c +FileChecksum: SHA1: bcf578edabca3bff3897cc1d7021f626a91129f9 +LicenseConcluded: MIT +FileCopyrightText: NOASSERTION +FileComment: NOASSERTION + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/stream_buffer.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/stream_buffer.c new file mode 100644 index 0000000..fed7eb8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/stream_buffer.c @@ -0,0 +1,1427 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "stream_buffer.h" + +#if ( configUSE_TASK_NOTIFICATIONS != 1 ) + #error configUSE_TASK_NOTIFICATIONS must be set to 1 to build stream_buffer.c +#endif + +#if ( INCLUDE_xTaskGetCurrentTaskHandle != 1 ) + #error INCLUDE_xTaskGetCurrentTaskHandle must be set to 1 to build stream_buffer.c +#endif + +/* Lint e961, e9021 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + +/* If the user has not provided application specific Rx notification macros, + * or #defined the notification macros away, then provide default implementations + * that uses task notifications. */ +/*lint -save -e9026 Function like macros allowed and needed here so they can be overridden. */ +#ifndef sbRECEIVE_COMPLETED + #define sbRECEIVE_COMPLETED( pxStreamBuffer ) \ + vTaskSuspendAll(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + ( void ) xTaskResumeAll(); +#endif /* sbRECEIVE_COMPLETED */ + +/* If user has provided a per-instance receive complete callback, then + * invoke the callback else use the receive complete macro which is provided by default for all instances. + */ +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define prvRECEIVE_COMPLETED( pxStreamBuffer ) \ + { \ + if( ( pxStreamBuffer )->pxReceiveCompletedCallback != NULL ) \ + { \ + ( pxStreamBuffer )->pxReceiveCompletedCallback( ( pxStreamBuffer ), pdFALSE, NULL ); \ + } \ + else \ + { \ + sbRECEIVE_COMPLETED( ( pxStreamBuffer ) ); \ + } \ + } +#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + #define prvRECEIVE_COMPLETED( pxStreamBuffer ) sbRECEIVE_COMPLETED( ( pxStreamBuffer ) ) +#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + +#ifndef sbRECEIVE_COMPLETED_FROM_ISR + #define sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \ + pxHigherPriorityTaskWoken ) \ + { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, \ + ( uint32_t ) 0, \ + eNoAction, \ + ( pxHigherPriorityTaskWoken ) ); \ + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \ + } \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } +#endif /* sbRECEIVE_COMPLETED_FROM_ISR */ + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \ + pxHigherPriorityTaskWoken ) \ + { \ + if( ( pxStreamBuffer )->pxReceiveCompletedCallback != NULL ) \ + { \ + ( pxStreamBuffer )->pxReceiveCompletedCallback( ( pxStreamBuffer ), pdTRUE, ( pxHigherPriorityTaskWoken ) ); \ + } \ + else \ + { \ + sbRECEIVE_COMPLETED_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ); \ + } \ + } +#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + #define prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + sbRECEIVE_COMPLETED_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ) +#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + +/* If the user has not provided an application specific Tx notification macro, + * or #defined the notification macro away, then provide a default + * implementation that uses task notifications. + */ +#ifndef sbSEND_COMPLETED + #define sbSEND_COMPLETED( pxStreamBuffer ) \ + vTaskSuspendAll(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + ( void ) xTaskResumeAll(); +#endif /* sbSEND_COMPLETED */ + +/* If user has provided a per-instance send completed callback, then + * invoke the callback else use the send complete macro which is provided by default for all instances. + */ +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define prvSEND_COMPLETED( pxStreamBuffer ) \ + { \ + if( ( pxStreamBuffer )->pxSendCompletedCallback != NULL ) \ + { \ + pxStreamBuffer->pxSendCompletedCallback( ( pxStreamBuffer ), pdFALSE, NULL ); \ + } \ + else \ + { \ + sbSEND_COMPLETED( ( pxStreamBuffer ) ); \ + } \ + } +#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + #define prvSEND_COMPLETED( pxStreamBuffer ) sbSEND_COMPLETED( ( pxStreamBuffer ) ) +#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + + +#ifndef sbSEND_COMPLETE_FROM_ISR + #define sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + { \ + UBaseType_t uxSavedInterruptStatus; \ + \ + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \ + { \ + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, \ + ( uint32_t ) 0, \ + eNoAction, \ + ( pxHigherPriorityTaskWoken ) ); \ + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \ + } \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } +#endif /* sbSEND_COMPLETE_FROM_ISR */ + + +#if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + #define prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + { \ + if( ( pxStreamBuffer )->pxSendCompletedCallback != NULL ) \ + { \ + ( pxStreamBuffer )->pxSendCompletedCallback( ( pxStreamBuffer ), pdTRUE, ( pxHigherPriorityTaskWoken ) ); \ + } \ + else \ + { \ + sbSEND_COMPLETE_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ); \ + } \ + } +#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + #define prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \ + sbSEND_COMPLETE_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ) +#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */ + +/*lint -restore (9026) */ + +/* The number of bytes used to hold the length of a message in the buffer. */ +#define sbBYTES_TO_STORE_MESSAGE_LENGTH ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) ) + +/* Bits stored in the ucFlags field of the stream buffer. */ +#define sbFLAGS_IS_MESSAGE_BUFFER ( ( uint8_t ) 1 ) /* Set if the stream buffer was created as a message buffer, in which case it holds discrete messages rather than a stream. */ +#define sbFLAGS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 2 ) /* Set if the stream buffer was created using statically allocated memory. */ + +/*-----------------------------------------------------------*/ + +/* Structure that hold state information on the buffer. */ +typedef struct StreamBufferDef_t /*lint !e9058 Style convention uses tag. */ +{ + volatile size_t xTail; /* Index to the next item to read within the buffer. */ + volatile size_t xHead; /* Index to the next item to write within the buffer. */ + size_t xLength; /* The length of the buffer pointed to by pucBuffer. */ + size_t xTriggerLevelBytes; /* The number of bytes that must be in the stream buffer before a task that is waiting for data is unblocked. */ + volatile TaskHandle_t xTaskWaitingToReceive; /* Holds the handle of a task waiting for data, or NULL if no tasks are waiting. */ + volatile TaskHandle_t xTaskWaitingToSend; /* Holds the handle of a task waiting to send data to a message buffer that is full. */ + uint8_t * pucBuffer; /* Points to the buffer itself - that is - the RAM that stores the data passed through the buffer. */ + uint8_t ucFlags; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; /* Used for tracing purposes. */ + #endif + + #if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + StreamBufferCallbackFunction_t pxSendCompletedCallback; /* Optional callback called on send complete. sbSEND_COMPLETED is called if this is NULL. */ + StreamBufferCallbackFunction_t pxReceiveCompletedCallback; /* Optional callback called on receive complete. sbRECEIVE_COMPLETED is called if this is NULL. */ + #endif +} StreamBuffer_t; + +/* + * The number of bytes available to be read from the buffer. + */ +static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) PRIVILEGED_FUNCTION; + +/* + * Add xCount bytes from pucData into the pxStreamBuffer's data storage area. + * This function does not update the buffer's xHead pointer, so multiple writes + * may be chained together "atomically". This is useful for Message Buffers where + * the length and data bytes are written in two separate chunks, and we don't want + * the reader to see the buffer as having grown until after all data is copied over. + * This function takes a custom xHead value to indicate where to write to (necessary + * for chaining) and returns the the resulting xHead position. + * To mark the write as complete, manually set the buffer's xHead field with the + * returned xHead from this function. + */ +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, + const uint8_t * pucData, + size_t xCount, + size_t xHead ) PRIVILEGED_FUNCTION; + +/* + * If the stream buffer is being used as a message buffer, then reads an entire + * message out of the buffer. If the stream buffer is being used as a stream + * buffer then read as many bytes as possible from the buffer. + * prvReadBytesFromBuffer() is called to actually extract the bytes from the + * buffer's data storage area. + */ +static size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable ) PRIVILEGED_FUNCTION; + +/* + * If the stream buffer is being used as a message buffer, then writes an entire + * message to the buffer. If the stream buffer is being used as a stream + * buffer then write as many bytes as possible to the buffer. + * prvWriteBytestoBuffer() is called to actually send the bytes to the buffer's + * data storage area. + */ +static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) PRIVILEGED_FUNCTION; + +/* + * Copies xCount bytes from the pxStreamBuffer's data storage area to pucData. + * This function does not update the buffer's xTail pointer, so multiple reads + * may be chained together "atomically". This is useful for Message Buffers where + * the length and data bytes are read in two separate chunks, and we don't want + * the writer to see the buffer as having more free space until after all data is + * copied over, especially if we have to abort the read due to insufficient receiving space. + * This function takes a custom xTail value to indicate where to read from (necessary + * for chaining) and returns the the resulting xTail position. + * To mark the read as complete, manually set the buffer's xTail field with the + * returned xTail from this function. + */ +static size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer, + uint8_t * pucData, + size_t xCount, + size_t xTail ) PRIVILEGED_FUNCTION; + +/* + * Called by both pxStreamBufferCreate() and pxStreamBufferCreateStatic() to + * initialise the members of the newly created stream buffer structure. + */ +static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) + { + uint8_t * pucAllocatedMemory; + uint8_t ucFlags; + + /* In case the stream buffer is going to be used as a message buffer + * (that is, it will hold discrete messages with a little meta data that + * says how big the next message is) check the buffer will be large enough + * to hold at least one message. */ + if( xIsMessageBuffer == pdTRUE ) + { + /* Is a message buffer but not statically allocated. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER; + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + } + else + { + /* Not a message buffer and not statically allocated. */ + ucFlags = 0; + configASSERT( xBufferSizeBytes > 0 ); + } + + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + + /* A trigger level of 0 would cause a waiting task to unblock even when + * the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } + + /* A stream buffer requires a StreamBuffer_t structure and a buffer. + * Both are allocated in a single call to pvPortMalloc(). The + * StreamBuffer_t structure is placed at the start of the allocated memory + * and the buffer follows immediately after. The requested size is + * incremented so the free space is returned as the user would expect - + * this is a quirk of the implementation that means otherwise the free + * space would be reported as one byte smaller than would be logically + * expected. */ + if( xBufferSizeBytes < ( xBufferSizeBytes + 1 + sizeof( StreamBuffer_t ) ) ) + { + xBufferSizeBytes++; + pucAllocatedMemory = ( uint8_t * ) pvPortMalloc( xBufferSizeBytes + sizeof( StreamBuffer_t ) ); /*lint !e9079 malloc() only returns void*. */ + } + else + { + pucAllocatedMemory = NULL; + } + + if( pucAllocatedMemory != NULL ) + { + prvInitialiseNewStreamBuffer( ( StreamBuffer_t * ) pucAllocatedMemory, /* Structure at the start of the allocated memory. */ /*lint !e9087 Safe cast as allocated memory is aligned. */ /*lint !e826 Area is not too small and alignment is guaranteed provided malloc() behaves as expected and returns aligned buffer. */ + pucAllocatedMemory + sizeof( StreamBuffer_t ), /* Storage area follows. */ /*lint !e9016 Indexing past structure valid for uint8_t pointer, also storage area has no alignment requirement. */ + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags, + pxSendCompletedCallback, + pxReceiveCompletedCallback ); + + traceSTREAM_BUFFER_CREATE( ( ( StreamBuffer_t * ) pucAllocatedMemory ), xIsMessageBuffer ); + } + else + { + traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer ); + } + + return ( StreamBufferHandle_t ) pucAllocatedMemory; /*lint !e9087 !e826 Safe cast as allocated memory is aligned. */ + } +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + BaseType_t xIsMessageBuffer, + uint8_t * const pucStreamBufferStorageArea, + StaticStreamBuffer_t * const pxStaticStreamBuffer, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) + { + StreamBuffer_t * const pxStreamBuffer = ( StreamBuffer_t * ) pxStaticStreamBuffer; /*lint !e740 !e9087 Safe cast as StaticStreamBuffer_t is opaque Streambuffer_t. */ + StreamBufferHandle_t xReturn; + uint8_t ucFlags; + + configASSERT( pucStreamBufferStorageArea ); + configASSERT( pxStaticStreamBuffer ); + configASSERT( xTriggerLevelBytes <= xBufferSizeBytes ); + + /* A trigger level of 0 would cause a waiting task to unblock even when + * the buffer was empty. */ + if( xTriggerLevelBytes == ( size_t ) 0 ) + { + xTriggerLevelBytes = ( size_t ) 1; + } + + if( xIsMessageBuffer != pdFALSE ) + { + /* Statically allocated message buffer. */ + ucFlags = sbFLAGS_IS_MESSAGE_BUFFER | sbFLAGS_IS_STATICALLY_ALLOCATED; + } + else + { + /* Statically allocated stream buffer. */ + ucFlags = sbFLAGS_IS_STATICALLY_ALLOCATED; + } + + /* In case the stream buffer is going to be used as a message buffer + * (that is, it will hold discrete messages with a little meta data that + * says how big the next message is) check the buffer will be large enough + * to hold at least one message. */ + configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticStreamBuffer_t equals the size of the real + * message buffer structure. */ + volatile size_t xSize = sizeof( StaticStreamBuffer_t ); + configASSERT( xSize == sizeof( StreamBuffer_t ) ); + } /*lint !e529 xSize is referenced is configASSERT() is defined. */ + #endif /* configASSERT_DEFINED */ + + if( ( pucStreamBufferStorageArea != NULL ) && ( pxStaticStreamBuffer != NULL ) ) + { + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pucStreamBufferStorageArea, + xBufferSizeBytes, + xTriggerLevelBytes, + ucFlags, + pxSendCompletedCallback, + pxReceiveCompletedCallback ); + + /* Remember this was statically allocated in case it is ever deleted + * again. */ + pxStreamBuffer->ucFlags |= sbFLAGS_IS_STATICALLY_ALLOCATED; + + traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer ); + + xReturn = ( StreamBufferHandle_t ) pxStaticStreamBuffer; /*lint !e9087 Data hiding requires cast to opaque type. */ + } + else + { + xReturn = NULL; + traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer ); + } + + return xReturn; + } +#endif /* ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + +void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * pxStreamBuffer = xStreamBuffer; + + configASSERT( pxStreamBuffer ); + + traceSTREAM_BUFFER_DELETE( xStreamBuffer ); + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) pdFALSE ) + { + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* Both the structure and the buffer were allocated using a single call + * to pvPortMalloc(), hence only one call to vPortFree() is required. */ + vPortFree( ( void * ) pxStreamBuffer ); /*lint !e9087 Standard free() semantics require void *, plus pxStreamBuffer was allocated by pvPortMalloc(). */ + } + #else + { + /* Should not be possible to get here, ucFlags must be corrupt. + * Force an assert. */ + configASSERT( xStreamBuffer == ( StreamBufferHandle_t ) ~0 ); + } + #endif + } + else + { + /* The structure and buffer were not allocated dynamically and cannot be + * freed - just scrub the structure so future use will assert. */ + ( void ) memset( pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); + } +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn = pdFAIL; + StreamBufferCallbackFunction_t pxSendCallback = NULL, pxReceiveCallback = NULL; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; + #endif + + configASSERT( pxStreamBuffer ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Store the stream buffer number so it can be restored after the + * reset. */ + uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber; + } + #endif + + /* Can only reset a message buffer if there are no tasks blocked on it. */ + taskENTER_CRITICAL(); + { + if( ( pxStreamBuffer->xTaskWaitingToReceive == NULL ) && ( pxStreamBuffer->xTaskWaitingToSend == NULL ) ) + { + #if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + { + pxSendCallback = pxStreamBuffer->pxSendCompletedCallback; + pxReceiveCallback = pxStreamBuffer->pxReceiveCompletedCallback; + } + #endif + + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pxStreamBuffer->pucBuffer, + pxStreamBuffer->xLength, + pxStreamBuffer->xTriggerLevelBytes, + pxStreamBuffer->ucFlags, + pxSendCallback, + pxReceiveCallback ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } + #endif + + traceSTREAM_BUFFER_RESET( xStreamBuffer ); + + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, + size_t xTriggerLevel ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + + configASSERT( pxStreamBuffer ); + + /* It is not valid for the trigger level to be 0. */ + if( xTriggerLevel == ( size_t ) 0 ) + { + xTriggerLevel = ( size_t ) 1; + } + + /* The trigger level is the number of bytes that must be in the stream + * buffer before a task that is waiting for data is unblocked. */ + if( xTriggerLevel < pxStreamBuffer->xLength ) + { + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevel; + xReturn = pdPASS; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) +{ + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xSpace; + size_t xOriginalTail; + + configASSERT( pxStreamBuffer ); + + /* The code below reads xTail and then xHead. This is safe if the stream + * buffer is updated once between the two reads - but not if the stream buffer + * is updated more than once between the two reads - hence the loop. */ + do + { + xOriginalTail = pxStreamBuffer->xTail; + xSpace = pxStreamBuffer->xLength + pxStreamBuffer->xTail; + xSpace -= pxStreamBuffer->xHead; + } while( xOriginalTail != pxStreamBuffer->xTail ); + + xSpace -= ( size_t ) 1; + + if( xSpace >= pxStreamBuffer->xLength ) + { + xSpace -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xSpace; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) +{ + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn; + + configASSERT( pxStreamBuffer ); + + xReturn = prvBytesInBuffer( pxStreamBuffer ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + TickType_t xTicksToWait ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xSpace = 0; + size_t xRequiredSpace = xDataLengthBytes; + TimeOut_t xTimeOut; + size_t xMaxReportedSpace = 0; + + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); + + /* The maximum amount of space a stream buffer will ever report is its length + * minus 1. */ + xMaxReportedSpace = pxStreamBuffer->xLength - ( size_t ) 1; + + /* This send function is used to write to both message buffers and stream + * buffers. If this is a message buffer then the space needed must be + * increased by the amount of bytes needed to store the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + + /* Overflow? */ + configASSERT( xRequiredSpace > xDataLengthBytes ); + + /* If this is a message buffer then it must be possible to write the + * whole message. */ + if( xRequiredSpace > xMaxReportedSpace ) + { + /* The message would not fit even if the entire buffer was empty, + * so don't wait for space. */ + xTicksToWait = ( TickType_t ) 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If this is a stream buffer then it is acceptable to write only part + * of the message to the buffer. Cap the length to the total length of + * the buffer. */ + if( xRequiredSpace > xMaxReportedSpace ) + { + xRequiredSpace = xMaxReportedSpace; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xTicksToWait != ( TickType_t ) 0 ) + { + vTaskSetTimeOutState( &xTimeOut ); + + do + { + /* Wait until the required number of bytes are free in the message + * buffer. */ + taskENTER_CRITICAL(); + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + + if( xSpace < xRequiredSpace ) + { + /* Clear notification state as going to wait for space. */ + ( void ) xTaskNotifyStateClear( NULL ); + + /* Should only be one writer. */ + configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL ); + pxStreamBuffer->xTaskWaitingToSend = xTaskGetCurrentTaskHandle(); + } + else + { + taskEXIT_CRITICAL(); + break; + } + } + taskEXIT_CRITICAL(); + + traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToSend = NULL; + } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xSpace == ( size_t ) 0 ) + { + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + + if( xReturn > ( size_t ) 0 ) + { + traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn ); + + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + prvSEND_COMPLETED( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer ); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xSpace; + size_t xRequiredSpace = xDataLengthBytes; + + configASSERT( pvTxData ); + configASSERT( pxStreamBuffer ); + + /* This send function is used to write to both message buffers and stream + * buffers. If this is a message buffer then the space needed must be + * increased by the amount of bytes needed to store the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer ); + xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace ); + + if( xReturn > ( size_t ) 0 ) + { + /* Was a task waiting for the data? */ + if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes ) + { + prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer, + const void * pvTxData, + size_t xDataLengthBytes, + size_t xSpace, + size_t xRequiredSpace ) +{ + size_t xNextHead = pxStreamBuffer->xHead; + configMESSAGE_BUFFER_LENGTH_TYPE xMessageLength; + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + /* This is a message buffer, as opposed to a stream buffer. */ + + /* Convert xDataLengthBytes to the message length type. */ + xMessageLength = ( configMESSAGE_BUFFER_LENGTH_TYPE ) xDataLengthBytes; + + /* Ensure the data length given fits within configMESSAGE_BUFFER_LENGTH_TYPE. */ + configASSERT( ( size_t ) xMessageLength == xDataLengthBytes ); + + if( xSpace >= xRequiredSpace ) + { + /* There is enough space to write both the message length and the message + * itself into the buffer. Start by writing the length of the data, the data + * itself will be written later in this function. */ + xNextHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xMessageLength ), sbBYTES_TO_STORE_MESSAGE_LENGTH, xNextHead ); + } + else + { + /* Not enough space, so do not write data to the buffer. */ + xDataLengthBytes = 0; + } + } + else + { + /* This is a stream buffer, as opposed to a message buffer, so writing a + * stream of bytes rather than discrete messages. Plan to write as many + * bytes as possible. */ + xDataLengthBytes = configMIN( xDataLengthBytes, xSpace ); + } + + if( xDataLengthBytes != ( size_t ) 0 ) + { + /* Write the data to the buffer. */ + pxStreamBuffer->xHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes, xNextHead ); /*lint !e9079 Storage buffer is implemented as uint8_t for ease of sizing, alignment and access. */ + } + + return xDataLengthBytes; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + TickType_t xTicksToWait ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); + + /* This receive function is used by both message buffers, which store + * discrete messages, and stream buffers, which store a continuous stream of + * bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + if( xTicksToWait != ( TickType_t ) 0 ) + { + /* Checking if there is data and clearing the notification state must be + * performed atomically. */ + taskENTER_CRITICAL(); + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + /* If this function was invoked by a message buffer read then + * xBytesToStoreMessageLength holds the number of bytes used to hold + * the length of the next discrete message. If this function was + * invoked by a stream buffer read then xBytesToStoreMessageLength will + * be 0. */ + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Clear notification state as going to wait for data. */ + ( void ) xTaskNotifyStateClear( NULL ); + + /* Should only be one reader. */ + configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL ); + pxStreamBuffer->xTaskWaitingToReceive = xTaskGetCurrentTaskHandle(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + if( xBytesAvailable <= xBytesToStoreMessageLength ) + { + /* Wait for data to be available. */ + traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer ); + ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait ); + pxStreamBuffer->xTaskWaitingToReceive = NULL; + + /* Recheck the data available after blocking. */ + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + } + + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + * holds the number of bytes used to store the message length) or a stream of + * bytes (where xBytesToStoreMessageLength is zero), the number of bytes + * available must be greater than xBytesToStoreMessageLength to be able to + * read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable ); + + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength ); + prvRECEIVE_COMPLETED( xStreamBuffer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer ); + mtCOVERAGE_TEST_MARKER(); + } + + return xReceivedLength; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReturn, xBytesAvailable; + configMESSAGE_BUFFER_LENGTH_TYPE xTempReturn; + + configASSERT( pxStreamBuffer ); + + /* Ensure the stream buffer is being used as a message buffer. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + if( xBytesAvailable > sbBYTES_TO_STORE_MESSAGE_LENGTH ) + { + /* The number of bytes available is greater than the number of bytes + * required to hold the length of the next message, so another message + * is available. */ + ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempReturn, sbBYTES_TO_STORE_MESSAGE_LENGTH, pxStreamBuffer->xTail ); + xReturn = ( size_t ) xTempReturn; + } + else + { + /* The minimum amount of bytes in a message buffer is + * ( sbBYTES_TO_STORE_MESSAGE_LENGTH + 1 ), so if xBytesAvailable is + * less than sbBYTES_TO_STORE_MESSAGE_LENGTH the only other valid + * value is 0. */ + configASSERT( xBytesAvailable == 0 ); + xReturn = 0; + } + } + else + { + xReturn = 0; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + BaseType_t * const pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength; + + configASSERT( pvRxData ); + configASSERT( pxStreamBuffer ); + + /* This receive function is used by both message buffers, which store + * discrete messages, and stream buffers, which store a continuous stream of + * bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the + * message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + xBytesAvailable = prvBytesInBuffer( pxStreamBuffer ); + + /* Whether receiving a discrete message (where xBytesToStoreMessageLength + * holds the number of bytes used to store the message length) or a stream of + * bytes (where xBytesToStoreMessageLength is zero), the number of bytes + * available must be greater than xBytesToStoreMessageLength to be able to + * read bytes from the buffer. */ + if( xBytesAvailable > xBytesToStoreMessageLength ) + { + xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable ); + + /* Was a task waiting for space in the buffer? */ + if( xReceivedLength != ( size_t ) 0 ) + { + prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength ); + + return xReceivedLength; +} +/*-----------------------------------------------------------*/ + +static size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer, + void * pvRxData, + size_t xBufferLengthBytes, + size_t xBytesAvailable ) +{ + size_t xCount, xNextMessageLength; + configMESSAGE_BUFFER_LENGTH_TYPE xTempNextMessageLength; + size_t xNextTail = pxStreamBuffer->xTail; + + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + /* A discrete message is being received. First receive the length + * of the message. */ + xNextTail = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempNextMessageLength, sbBYTES_TO_STORE_MESSAGE_LENGTH, xNextTail ); + xNextMessageLength = ( size_t ) xTempNextMessageLength; + + /* Reduce the number of bytes available by the number of bytes just + * read out. */ + xBytesAvailable -= sbBYTES_TO_STORE_MESSAGE_LENGTH; + + /* Check there is enough space in the buffer provided by the + * user. */ + if( xNextMessageLength > xBufferLengthBytes ) + { + /* The user has provided insufficient space to read the message. */ + xNextMessageLength = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* A stream of bytes is being received (as opposed to a discrete + * message), so read as many bytes as possible. */ + xNextMessageLength = xBufferLengthBytes; + } + + /* Use the minimum of the wanted bytes and the available bytes. */ + xCount = configMIN( xNextMessageLength, xBytesAvailable ); + + if( xCount != ( size_t ) 0 ) + { + /* Read the actual data and update the tail to mark the data as officially consumed. */ + pxStreamBuffer->xTail = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) pvRxData, xCount, xNextTail ); /*lint !e9079 Data storage area is implemented as uint8_t array for ease of sizing, indexing and alignment. */ + } + + return xCount; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) +{ + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + size_t xTail; + + configASSERT( pxStreamBuffer ); + + /* True if no bytes are available. */ + xTail = pxStreamBuffer->xTail; + + if( pxStreamBuffer->xHead == xTail ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) +{ + BaseType_t xReturn; + size_t xBytesToStoreMessageLength; + const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + + configASSERT( pxStreamBuffer ); + + /* This generic version of the receive function is used by both message + * buffers, which store discrete messages, and stream buffers, which store a + * continuous stream of bytes. Discrete messages include an additional + * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the message. */ + if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 ) + { + xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH; + } + else + { + xBytesToStoreMessageLength = 0; + } + + /* True if the available space equals zero. */ + if( xStreamBufferSpacesAvailable( xStreamBuffer ) <= xBytesToStoreMessageLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( pxStreamBuffer ); + + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, + BaseType_t * pxHigherPriorityTaskWoken ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( pxStreamBuffer ); + + uxSavedInterruptStatus = ( UBaseType_t ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) + { + ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, + ( uint32_t ) 0, + eNoAction, + pxHigherPriorityTaskWoken ); + ( pxStreamBuffer )->xTaskWaitingToSend = NULL; + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer, + const uint8_t * pucData, + size_t xCount, + size_t xHead ) +{ + size_t xFirstLength; + + configASSERT( xCount > ( size_t ) 0 ); + + /* Calculate the number of bytes that can be added in the first write - + * which may be less than the total number of bytes that need to be added if + * the buffer will wrap back to the beginning. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xHead, xCount ); + + /* Write as many bytes as can be written in the first write. */ + configASSERT( ( xHead + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) ( &( pxStreamBuffer->pucBuffer[ xHead ] ) ), ( const void * ) pucData, xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + + /* If the number of bytes written was less than the number that could be + * written in the first write... */ + if( xCount > xFirstLength ) + { + /* ...then write the remaining bytes to the start of the buffer. */ + configASSERT( ( xCount - xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pxStreamBuffer->pucBuffer, ( const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xHead += xCount; + + if( xHead >= pxStreamBuffer->xLength ) + { + xHead -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xHead; +} +/*-----------------------------------------------------------*/ + +static size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer, + uint8_t * pucData, + size_t xCount, + size_t xTail ) +{ + size_t xFirstLength; + + configASSERT( xCount != ( size_t ) 0 ); + + /* Calculate the number of bytes that can be read - which may be + * less than the number wanted if the data wraps around to the start of + * the buffer. */ + xFirstLength = configMIN( pxStreamBuffer->xLength - xTail, xCount ); + + /* Obtain the number of bytes it is possible to obtain in the first + * read. Asserts check bounds of read and write. */ + configASSERT( xFirstLength <= xCount ); + configASSERT( ( xTail + xFirstLength ) <= pxStreamBuffer->xLength ); + ( void ) memcpy( ( void * ) pucData, ( const void * ) &( pxStreamBuffer->pucBuffer[ xTail ] ), xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + + /* If the total number of wanted bytes is greater than the number + * that could be read in the first read... */ + if( xCount > xFirstLength ) + { + /* ...then read the remaining bytes from the start of the buffer. */ + ( void ) memcpy( ( void * ) &( pucData[ xFirstLength ] ), ( void * ) ( pxStreamBuffer->pucBuffer ), xCount - xFirstLength ); /*lint !e9087 memcpy() requires void *. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Move the tail pointer to effectively remove the data read from the buffer. */ + xTail += xCount; + + if( xTail >= pxStreamBuffer->xLength ) + { + xTail -= pxStreamBuffer->xLength; + } + + return xTail; +} +/*-----------------------------------------------------------*/ + +static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) +{ +/* Returns the distance between xTail and xHead. */ + size_t xCount; + + xCount = pxStreamBuffer->xLength + pxStreamBuffer->xHead; + xCount -= pxStreamBuffer->xTail; + + if( xCount >= pxStreamBuffer->xLength ) + { + xCount -= pxStreamBuffer->xLength; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xCount; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer, + uint8_t * const pucBuffer, + size_t xBufferSizeBytes, + size_t xTriggerLevelBytes, + uint8_t ucFlags, + StreamBufferCallbackFunction_t pxSendCompletedCallback, + StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) +{ + /* Assert here is deliberately writing to the entire buffer to ensure it can + * be written to without generating exceptions, and is setting the buffer to a + * known value to assist in development/debugging. */ + #if ( configASSERT_DEFINED == 1 ) + { + /* The value written just has to be identifiable when looking at the + * memory. Don't use 0xA5 as that is the stack fill value and could + * result in confusion as to what is actually being observed. */ + const BaseType_t xWriteValue = 0x55; + configASSERT( memset( pucBuffer, ( int ) xWriteValue, xBufferSizeBytes ) == pucBuffer ); + } /*lint !e529 !e438 xWriteValue is only used if configASSERT() is defined. */ + #endif + + ( void ) memset( ( void * ) pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) ); /*lint !e9087 memset() requires void *. */ + pxStreamBuffer->pucBuffer = pucBuffer; + pxStreamBuffer->xLength = xBufferSizeBytes; + pxStreamBuffer->xTriggerLevelBytes = xTriggerLevelBytes; + pxStreamBuffer->ucFlags = ucFlags; + #if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + { + pxStreamBuffer->pxSendCompletedCallback = pxSendCompletedCallback; + pxStreamBuffer->pxReceiveCompletedCallback = pxReceiveCompletedCallback; + } + #else + { + ( void ) pxSendCompletedCallback; + ( void ) pxReceiveCompletedCallback; + } + #endif +} + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) + { + return xStreamBuffer->uxStreamBufferNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer, + UBaseType_t uxStreamBufferNumber ) + { + xStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) + { + return( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ); + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/tasks.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/tasks.c new file mode 100644 index 0000000..0cc948f --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/tasks.c @@ -0,0 +1,5429 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "stack_macros.h" + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */ + +/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting + * functions but without including stdio.h here. */ +#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) + +/* At the bottom of this file are two optional functions that can be used + * to generate human readable text from the raw data generated by the + * uxTaskGetSystemState() function. Note the formatting functions are provided + * for convenience only, and are NOT considered part of the kernel. */ + #include +#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ + +#if ( configUSE_PREEMPTION == 0 ) + +/* If the cooperative scheduler is being used then a yield should not be + * performed just because a higher priority task has been woken. */ + #define taskYIELD_IF_USING_PREEMPTION() +#else + #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* Values that can be assigned to the ucNotifyState member of the TCB. */ +#define taskNOT_WAITING_NOTIFICATION ( ( uint8_t ) 0 ) /* Must be zero as it is the initialised value. */ +#define taskWAITING_NOTIFICATION ( ( uint8_t ) 1 ) +#define taskNOTIFICATION_RECEIVED ( ( uint8_t ) 2 ) + +/* + * The value used to fill the stack of a task when the task is created. This + * is used purely for checking the high water mark for tasks. + */ +#define tskSTACK_FILL_BYTE ( 0xa5U ) + +/* Bits used to record how a task's stack and TCB were allocated. */ +#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 0 ) +#define tskSTATICALLY_ALLOCATED_STACK_ONLY ( ( uint8_t ) 1 ) +#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB ( ( uint8_t ) 2 ) + +/* If any of the following are set then task stacks are filled with a known + * value so the high water mark can be determined. If none of the following are + * set then don't fill the stack so there is no unnecessary dependency on memset. */ +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 1 +#else + #define tskSET_NEW_STACKS_TO_KNOWN_VALUE 0 +#endif + +/* + * Macros used by vListTask to indicate which state a task is in. + */ +#define tskRUNNING_CHAR ( 'X' ) +#define tskBLOCKED_CHAR ( 'B' ) +#define tskREADY_CHAR ( 'R' ) +#define tskDELETED_CHAR ( 'D' ) +#define tskSUSPENDED_CHAR ( 'S' ) + +/* + * Some kernel aware debuggers require the data the debugger needs access to to + * be global, rather than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + +/* The name allocated to the Idle task. This can be overridden by defining + * configIDLE_TASK_NAME in FreeRTOSConfig.h. */ +#ifndef configIDLE_TASK_NAME + #define configIDLE_TASK_NAME "IDLE" +#endif + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + +/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is + * performed in a generic way that is not optimised to any particular + * microcontroller architecture. */ + +/* uxTopReadyPriority holds the priority of the highest priority ready + * state task. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) \ + { \ + if( ( uxPriority ) > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( uxPriority ); \ + } \ + } /* taskRECORD_READY_PRIORITY */ + +/*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority = uxTopReadyPriority; \ + \ + /* Find the highest priority queue that contains ready tasks. */ \ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \ + { \ + configASSERT( uxTopPriority ); \ + --uxTopPriority; \ + } \ + \ + /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ + * the same priority get an equal share of the processor time. */ \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + uxTopReadyPriority = uxTopPriority; \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK */ + +/*-----------------------------------------------------------*/ + +/* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as + * they are only required when a port optimised method of task selection is + * being used. */ + #define taskRESET_READY_PRIORITY( uxPriority ) + #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + +#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is + * performed in a way that is tailored to the particular microcontroller + * architecture being used. */ + +/* A port optimised version is provided. Call the port defined macros. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( ( uxPriority ), uxTopReadyPriority ) + +/*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + UBaseType_t uxTopPriority; \ + \ + /* Find the highest priority list that contains ready tasks. */ \ + portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ + configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ + +/*-----------------------------------------------------------*/ + +/* A port optimised version is provided, call it only if the TCB being reset + * is being referenced from a ready list. If it is referenced from a delayed + * or suspended list then it won't be in a ready list. */ + #define taskRESET_READY_PRIORITY( uxPriority ) \ + { \ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ + { \ + portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ + } \ + } + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick + * count overflows. */ +#define taskSWITCH_DELAYED_LISTS() \ + { \ + List_t * pxTemp; \ + \ + /* The delayed tasks list should be empty when the lists are switched. */ \ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ + \ + pxTemp = pxDelayedTaskList; \ + pxDelayedTaskList = pxOverflowDelayedTaskList; \ + pxOverflowDelayedTaskList = pxTemp; \ + xNumOfOverflows++; \ + prvResetNextTaskUnblockTime(); \ + } + +/*-----------------------------------------------------------*/ + +/* + * Place the task represented by pxTCB into the appropriate ready list for + * the task. It is inserted at the end of the list. + */ +#define prvAddTaskToReadyList( pxTCB ) \ + traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + listINSERT_END( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \ + tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB ) +/*-----------------------------------------------------------*/ + +/* + * Several functions take a TaskHandle_t parameter that can optionally be NULL, + * where NULL is used to indicate that the handle of the currently executing + * task should be used in place of the parameter. This macro simply checks to + * see if the parameter is NULL and returns a pointer to the appropriate TCB. + */ +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) ) + +/* The item value of the event list item is normally used to hold the priority + * of the task to which it belongs (coded to allow it to be held in reverse + * priority order). However, it is occasionally borrowed for other purposes. It + * is important its value is not updated due to a task priority change while it is + * being used for another purpose. The following bit definition is used to inform + * the scheduler that the value should not be changed - in which case it is the + * responsibility of whichever module is using the value to ensure it gets set back + * to its original value when it is released. */ +#if ( configUSE_16_BIT_TICKS == 1 ) + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U +#else + #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL +#endif + +/* + * Task control block. A task control block (TCB) is allocated for each task, + * and stores task state information, including a pointer to the task's context + * (the task's run time environment, including register values) + */ +typedef struct tskTaskControlBlock /* The old naming convention is used to prevent breaking kernel aware debuggers. */ +{ + volatile StackType_t * pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif + + ListItem_t xStateListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + ListItem_t xEventListItem; /*< Used to reference a task from an event list. */ + UBaseType_t uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + StackType_t * pxStack; /*< Points to the start of the stack. */ + char pcTaskName[ configMAX_TASK_NAME_LEN ]; /*< Descriptive name given to the task when created. Facilitates debugging only. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + + #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + StackType_t * pxEndOfStack; /*< Points to the highest valid address for the stack. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + UBaseType_t uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + UBaseType_t uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + #endif + + #if ( configUSE_MUTEXES == 1 ) + UBaseType_t uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + UBaseType_t uxMutexesHeld; + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + TaskHookFunction_t pxTaskTag; + #endif + + #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) + void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ]; + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) + configTLS_BLOCK_TYPE xTLSBlock; /*< Memory block used as Thread Local Storage (TLS) Block for the task. */ + #endif + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + volatile uint32_t ulNotifiedValue[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + volatile uint8_t ucNotifyState[ configTASK_NOTIFICATION_ARRAY_ENTRIES ]; + #endif + + /* See the comments in FreeRTOS.h with the definition of + * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */ + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */ + #endif + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + uint8_t ucDelayAborted; + #endif + + #if ( configUSE_POSIX_ERRNO == 1 ) + int iTaskErrno; + #endif +} tskTCB; + +/* The old tskTCB name is maintained above then typedefed to the new TCB_t name + * below to enable the use of older kernel aware debuggers. */ +typedef tskTCB TCB_t; + +/*lint -save -e956 A manual analysis and inspection has been used to determine + * which static variables must be declared volatile. */ +portDONT_DISCARD PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL; + +/* Lists for ready and blocked tasks. -------------------- + * xDelayedTaskList1 and xDelayedTaskList2 could be moved to function scope but + * doing so breaks some kernel aware debuggers and debuggers that rely on removing + * the static qualifier. */ +PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ + +#if ( INCLUDE_vTaskDelete == 1 ) + + PRIVILEGED_DATA static List_t xTasksWaitingTermination; /*< Tasks that have been deleted - but their memory not yet freed. */ + PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U; + +#endif + +#if ( INCLUDE_vTaskSuspend == 1 ) + + PRIVILEGED_DATA static List_t xSuspendedTaskList; /*< Tasks that are currently suspended. */ + +#endif + +/* Global POSIX errno. Its value is changed upon context switching to match + * the errno of the currently running task. */ +#if ( configUSE_POSIX_ERRNO == 1 ) + int FreeRTOS_errno = 0; +#endif + +/* Other file private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; +PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile TickType_t xPendedTicks = ( TickType_t ) 0U; +PRIVILEGED_DATA static volatile BaseType_t xYieldPending = pdFALSE; +PRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0; +PRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U; +PRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */ +PRIVILEGED_DATA static TaskHandle_t xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ + +/* Improve support for OpenOCD. The kernel tracks Ready tasks via priority lists. + * For tracking the state of remote threads, OpenOCD uses uxTopUsedPriority + * to determine the number of priority lists to read back from the remote target. */ +const volatile UBaseType_t uxTopUsedPriority = configMAX_PRIORITIES - 1U; + +/* Context switches are held pending while the scheduler is suspended. Also, + * interrupts must not manipulate the xStateListItem of a TCB, or any of the + * lists the xStateListItem can be referenced from, if the scheduler is suspended. + * If an interrupt needs to unblock a task while the scheduler is suspended then it + * moves the task's event list item into the xPendingReadyList, ready for the + * kernel to move the task from the pending ready list into the real ready list + * when the scheduler is unsuspended. The pending ready list itself can only be + * accessed from a critical section. */ +PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE; + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + +/* Do not move these variables to function scope as doing so prevents the + * code working with debuggers that need to remove the static qualifier. */ + PRIVILEGED_DATA static configRUN_TIME_COUNTER_TYPE ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ + PRIVILEGED_DATA static volatile configRUN_TIME_COUNTER_TYPE ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ + +#endif + +/*lint -restore */ + +/*-----------------------------------------------------------*/ + +/* File private functions. --------------------------------*/ + +/** + * Utility task that simply returns pdTRUE if the task referenced by xTask is + * currently in the Suspended state, or pdFALSE if the task referenced by xTask + * is in any other state. + */ +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION; + +#endif /* INCLUDE_vTaskSuspend */ + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first task. + */ +static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; + +/* + * The idle task, which as all tasks is implemented as a never ending loop. + * The idle task is automatically created and added to the ready lists upon + * creation of the first user task. + * + * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Utility to free all memory allocated by the scheduler to hold a TCB, + * including the stack pointed to by the TCB. + * + * This does not free memory allocated by the task itself (i.e. memory + * allocated by calls to pvPortMalloc from within the tasks application code). + */ +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t * pxTCB ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Used only by the idle task. This checks to see if anything has been placed + * in the list of tasks waiting to be deleted. If so the task is cleaned up + * and its TCB deleted. + */ +static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; + +/* + * The currently executing task is entering the Blocked state. Add the task to + * either the current or the overflow delayed task list. + */ +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, + const BaseType_t xCanBlockIndefinitely ) PRIVILEGED_FUNCTION; + +/* + * Fills an TaskStatus_t structure with information on each task that is + * referenced from the pxList list (which may be a ready list, a delayed list, + * a suspended list, etc.). + * + * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM + * NORMAL APPLICATION CODE. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t * pxTaskStatusArray, + List_t * pxList, + eTaskState eState ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Searches pxList for a task with name pcNameToQuery - returning a handle to + * the task if it is found, or NULL if the task is not found. + */ +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList, + const char pcNameToQuery[] ) PRIVILEGED_FUNCTION; + +#endif + +/* + * When a task is created, the stack of the task is filled with a known value. + * This function determines the 'high water mark' of the task stack by + * determining how much of the stack remains at the original preset value. + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Return the amount of time, in ticks, that will pass before the kernel will + * next move a task from the Blocked state to the Running state. + * + * This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user + * defined low power mode implementations require configUSE_TICKLESS_IDLE to be + * set to a value other than 1. + */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Set xNextTaskUnblockTime to the time at which the next Blocked state task + * will exit the Blocked state. + */ +static void prvResetNextTaskUnblockTime( void ) PRIVILEGED_FUNCTION; + +#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) + +/* + * Helper function used to pad task names with spaces when printing out + * human readable tables of task information. + */ + static char * prvWriteNameToBuffer( char * pcBuffer, + const char * pcTaskName ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Called after a Task_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t * pxNewTCB, + const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION; + +/* + * Called after a new task has been created and initialised to place the task + * under the control of the scheduler. + */ +static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) PRIVILEGED_FUNCTION; + +/* + * freertos_tasks_c_additions_init() should only be called if the user definable + * macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is the only macro + * called by the function. + */ +#ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + + static void freertos_tasks_c_additions_init( void ) PRIVILEGED_FUNCTION; + +#endif + +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + StackType_t * const puxStackBuffer, + StaticTask_t * const pxTaskBuffer ) + { + TCB_t * pxNewTCB; + TaskHandle_t xReturn; + + configASSERT( puxStackBuffer != NULL ); + configASSERT( pxTaskBuffer != NULL ); + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticTask_t equals the size of the real task + * structure. */ + volatile size_t xSize = sizeof( StaticTask_t ); + configASSERT( xSize == sizeof( TCB_t ) ); + ( void ) xSize; /* Prevent lint warning when configASSERT() is not used. */ + } + #endif /* configASSERT_DEFINED */ + + if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) ) + { + /* The memory used for the task's TCB and stack are passed into this + * function - use them. */ + pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ + memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer; + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + * task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + } + else + { + xReturn = NULL; + } + + return xReturn; + } + +#endif /* SUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) + + BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + + configASSERT( pxTaskDefinition->puxStackBuffer != NULL ); + configASSERT( pxTaskDefinition->pxTaskBuffer != NULL ); + + if( ( pxTaskDefinition->puxStackBuffer != NULL ) && ( pxTaskDefinition->pxTaskBuffer != NULL ) ) + { + /* Allocate space for the TCB. Where the memory comes from depends + * on the implementation of the port malloc function and whether or + * not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pxTaskDefinition->pxTaskBuffer; + memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note this + * task was created statically in case the task is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + + return xReturn; + } + +#endif /* ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) + + BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, + TaskHandle_t * pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + + configASSERT( pxTaskDefinition->puxStackBuffer ); + + if( pxTaskDefinition->puxStackBuffer != NULL ) + { + /* Allocate space for the TCB. Where the memory comes from depends + * on the implementation of the port malloc function and whether or + * not static allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer; + + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) + { + /* Tasks can be created statically or dynamically, so note + * this task had a statically allocated stack in case it is + * later deleted. The TCB was allocated dynamically. */ + pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskDefinition->pvTaskCode, + pxTaskDefinition->pcName, + ( uint32_t ) pxTaskDefinition->usStackDepth, + pxTaskDefinition->pvParameters, + pxTaskDefinition->uxPriority, + pxCreatedTask, pxNewTCB, + pxTaskDefinition->xRegions ); + + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + } + + return xReturn; + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const configSTACK_DEPTH_TYPE usStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask ) + { + TCB_t * pxNewTCB; + BaseType_t xReturn; + + /* If the stack grows down then allocate the stack then the TCB so the stack + * does not grow into the TCB. Likewise if the stack grows up then allocate + * the TCB then the stack. */ + #if ( portSTACK_GROWTH > 0 ) + { + /* Allocate space for the TCB. Where the memory comes from depends on + * the implementation of the port malloc function and whether or not static + * allocation is being used. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); + + if( pxNewTCB != NULL ) + { + memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + + /* Allocate space for the stack used by the task being created. + * The base of the stack memory stored in the TCB so the task can + * be deleted later if required. */ + pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + } + } + #else /* portSTACK_GROWTH */ + { + StackType_t * pxStack; + + /* Allocate space for the stack used by the task being created. */ + pxStack = pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ + + if( pxStack != NULL ) + { + /* Allocate space for the TCB. */ + pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */ + + if( pxNewTCB != NULL ) + { + memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) ); + + /* Store the stack location in the TCB. */ + pxNewTCB->pxStack = pxStack; + } + else + { + /* The stack cannot be used as the TCB was not created. Free + * it again. */ + vPortFreeStack( pxStack ); + } + } + else + { + pxNewTCB = NULL; + } + } + #endif /* portSTACK_GROWTH */ + + if( pxNewTCB != NULL ) + { + #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */ + { + /* Tasks can be created statically or dynamically, so note this + * task was created dynamically in case it is later deleted. */ + pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; + } + #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ + + prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); + prvAddNewTaskToReadyList( pxNewTCB ); + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; + } + +#endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseNewTask( TaskFunction_t pxTaskCode, + const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const uint32_t ulStackDepth, + void * const pvParameters, + UBaseType_t uxPriority, + TaskHandle_t * const pxCreatedTask, + TCB_t * pxNewTCB, + const MemoryRegion_t * const xRegions ) +{ + StackType_t * pxTopOfStack; + UBaseType_t x; + + #if ( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + BaseType_t xRunPrivileged; + + if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ + + /* Avoid dependency on memset() if it is not required. */ + #if ( tskSET_NEW_STACKS_TO_KNOWN_VALUE == 1 ) + { + /* Fill the stack with a known value to assist debugging. */ + ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) ); + } + #endif /* tskSET_NEW_STACKS_TO_KNOWN_VALUE */ + + /* Calculate the top of stack address. This depends on whether the stack + * grows from high memory to low (as per the 80x86) or vice versa. + * portSTACK_GROWTH is used to make the result positive or negative as required + * by the port. */ + #if ( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] ); + pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */ + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + #if ( configRECORD_STACK_HIGH_ADDRESS == 1 ) + { + /* Also record the stack's high address, which may assist + * debugging. */ + pxNewTCB->pxEndOfStack = pxTopOfStack; + } + #endif /* configRECORD_STACK_HIGH_ADDRESS */ + } + #else /* portSTACK_GROWTH */ + { + pxTopOfStack = pxNewTCB->pxStack; + + /* Check the alignment of the stack buffer is correct. */ + configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxNewTCB->pxStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + /* The other extreme of the stack space is required if stack checking is + * performed. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); + } + #endif /* portSTACK_GROWTH */ + + /* Store the task name in the TCB. */ + if( pcName != NULL ) + { + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + pxNewTCB->pcTaskName[ x ] = pcName[ x ]; + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + * configMAX_TASK_NAME_LEN characters just in case the memory after the + * string is not accessible (extremely unlikely). */ + if( pcName[ x ] == ( char ) 0x00 ) + { + break; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Ensure the name string is terminated in the case that the string length + * was greater or equal to configMAX_TASK_NAME_LEN. */ + pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* This is used as an array index so must ensure it's not too large. */ + configASSERT( uxPriority < configMAX_PRIORITIES ); + + if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxNewTCB->uxPriority = uxPriority; + #if ( configUSE_MUTEXES == 1 ) + { + pxNewTCB->uxBasePriority = uxPriority; + } + #endif /* configUSE_MUTEXES */ + + vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); + vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); + + /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get + * back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); + + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth ); + } + #else + { + /* Avoid compiler warning about unreferenced parameter. */ + ( void ) xRegions; + } + #endif + + #if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) + { + /* Allocate and initialize memory for the task's TLS Block. */ + configINIT_TLS_BLOCK( pxNewTCB->xTLSBlock ); + } + #endif + + /* Initialize the TCB stack to look as if the task was already running, + * but had been interrupted by the scheduler. The return address is set + * to the start of the task function. Once the stack has been initialised + * the top of stack variable is updated. */ + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + /* If the port has capability to detect stack overflow, + * pass the stack end address to the stack initialization + * function as well. */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if ( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #else /* portUSING_MPU_WRAPPERS */ + { + /* If the port has capability to detect stack overflow, + * pass the stack end address to the stack initialization + * function as well. */ + #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) + { + #if ( portSTACK_GROWTH < 0 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters ); + } + #else /* portSTACK_GROWTH */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters ); + } + #endif /* portSTACK_GROWTH */ + } + #else /* portHAS_STACK_OVERFLOW_CHECKING */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif /* portHAS_STACK_OVERFLOW_CHECKING */ + } + #endif /* portUSING_MPU_WRAPPERS */ + + if( pxCreatedTask != NULL ) + { + /* Pass the handle out in an anonymous way. The handle can be used to + * change the created task's priority, delete the created task, etc.*/ + *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) +{ + /* Ensure interrupts don't access the task lists while the lists are being + * updated. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + + if( pxCurrentTCB == NULL ) + { + /* There are no other tasks, or all the other tasks are in + * the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + + if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) + { + /* This is the first task to be created so do the preliminary + * initialisation required. We will not recover if this call + * fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* If the scheduler is not already running, make this task the + * current task if it is the highest priority task to be created + * so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) + { + pxCurrentTCB = pxNewTCB; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + uxTaskNumber++; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); + + prvAddTaskToReadyList( pxNewTCB ); + + portSETUP_TCB( pxNewTCB ); + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + * then it should run now. */ + if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + void vTaskDelete( TaskHandle_t xTaskToDelete ) + { + TCB_t * pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the calling task that is + * being deleted. */ + pxTCB = prvGetTCBFromHandle( xTaskToDelete ); + + /* Remove task from the ready/delayed list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Increment the uxTaskNumber also so kernel aware debuggers can + * detect that the task lists need re-generating. This is done before + * portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will + * not return. */ + uxTaskNumber++; + + if( pxTCB == pxCurrentTCB ) + { + /* A task is deleting itself. This cannot complete within the + * task itself, as a context switch to another task is required. + * Place the task in the termination list. The idle task will + * check the termination list and free up any memory allocated by + * the scheduler for the TCB and stack of the deleted task. */ + vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) ); + + /* Increment the ucTasksDeleted variable so the idle task knows + * there is a task that has been deleted and that it should therefore + * check the xTasksWaitingTermination list. */ + ++uxDeletedTasksWaitingCleanUp; + + /* Call the delete hook before portPRE_TASK_DELETE_HOOK() as + * portPRE_TASK_DELETE_HOOK() does not return in the Win32 port. */ + traceTASK_DELETE( pxTCB ); + + /* The pre-delete hook is primarily for the Windows simulator, + * in which Windows specific clean up operations are performed, + * after which it is not possible to yield away from this task - + * hence xYieldPending is used to latch that a context switch is + * required. */ + portPRE_TASK_DELETE_HOOK( pxTCB, &xYieldPending ); + } + else + { + --uxCurrentNumberOfTasks; + traceTASK_DELETE( pxTCB ); + + /* Reset the next expected unblock time in case it referred to + * the task that has just been deleted. */ + prvResetNextTaskUnblockTime(); + } + } + taskEXIT_CRITICAL(); + + /* If the task is not deleting itself, call prvDeleteTCB from outside of + * critical section. If a task deletes itself, prvDeleteTCB is called + * from prvCheckTasksWaitingTermination which is called from Idle task. */ + if( pxTCB != pxCurrentTCB ) + { + prvDeleteTCB( pxTCB ); + } + + /* Force a reschedule if it is the currently running task that has just + * been deleted. */ + if( xSchedulerRunning != pdFALSE ) + { + if( pxTCB == pxCurrentTCB ) + { + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskDelayUntil == 1 ) + + BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime, + const TickType_t xTimeIncrement ) + { + TickType_t xTimeToWake; + BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE; + + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0U ) ); + configASSERT( uxSchedulerSuspended == 0 ); + + vTaskSuspendAll(); + { + /* Minor optimisation. The tick count cannot change in this + * block. */ + const TickType_t xConstTickCount = xTickCount; + + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + + if( xConstTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + * lasted called. In this case the only time we should ever + * actually delay is if the wake time has also overflowed, + * and the wake time is greater than the tick time. When this + * is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The tick time has not overflowed. In this case we will + * delay if either the wake time has overflowed, and/or the + * tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; + + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL( xTimeToWake ); + + /* prvAddCurrentTaskToDelayedList() needs the block time, not + * the time to wake, so subtract the current tick count. */ + prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount, pdFALSE ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + xAlreadyYielded = xTaskResumeAll(); + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + * have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xShouldDelay; + } + +#endif /* INCLUDE_xTaskDelayUntil */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( const TickType_t xTicksToDelay ) + { + BaseType_t xAlreadyYielded = pdFALSE; + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( TickType_t ) 0U ) + { + configASSERT( uxSchedulerSuspended == 0 ); + vTaskSuspendAll(); + { + traceTASK_DELAY(); + + /* A task that is removed from the event list while the + * scheduler is suspended will not get placed in the ready + * list or removed from the blocked list until the scheduler + * is resumed. + * + * This task cannot be in an event list as it is the currently + * executing task. */ + prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); + } + xAlreadyYielded = xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + * have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskDelay */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) ) + + eTaskState eTaskGetState( TaskHandle_t xTask ) + { + eTaskState eReturn; + List_t const * pxStateList; + List_t const * pxDelayedList; + List_t const * pxOverflowedDelayedList; + const TCB_t * const pxTCB = xTask; + + configASSERT( pxTCB ); + + if( pxTCB == pxCurrentTCB ) + { + /* The task calling this function is querying its own state. */ + eReturn = eRunning; + } + else + { + taskENTER_CRITICAL(); + { + pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) ); + pxDelayedList = pxDelayedTaskList; + pxOverflowedDelayedList = pxOverflowDelayedTaskList; + } + taskEXIT_CRITICAL(); + + if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) ) + { + /* The task being queried is referenced from one of the Blocked + * lists. */ + eReturn = eBlocked; + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( pxStateList == &xSuspendedTaskList ) + { + /* The task being queried is referenced from the suspended + * list. Is it genuinely suspended or is it blocked + * indefinitely? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) + { + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + BaseType_t x; + + /* The task does not appear on the event list item of + * and of the RTOS objects, but could still be in the + * blocked state if it is waiting on its notification + * rather than waiting on an object. If not, is + * suspended. */ + eReturn = eSuspended; + + for( x = 0; x < configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ ) + { + if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION ) + { + eReturn = eBlocked; + break; + } + } + } + #else /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + { + eReturn = eSuspended; + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + } + else + { + eReturn = eBlocked; + } + } + #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */ + + #if ( INCLUDE_vTaskDelete == 1 ) + else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) ) + { + /* The task being queried is referenced from the deleted + * tasks list, or it is not referenced from any lists at + * all. */ + eReturn = eDeleted; + } + #endif + + else /*lint !e525 Negative indentation is intended to make use of pre-processor clearer. */ + { + /* If the task is not in any other state, it must be in the + * Ready (including pending ready) state. */ + eReturn = eReady; + } + } + + return eReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_eTaskGetState */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) + { + TCB_t const * pxTCB; + UBaseType_t uxReturn; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the task + * that called uxTaskPriorityGet() that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL(); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) + { + TCB_t const * pxTCB; + UBaseType_t uxReturn, uxSavedInterruptState; + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* If null is passed in here then it is the priority of the calling + * task that is being queried. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptState ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + + void vTaskPrioritySet( TaskHandle_t xTask, + UBaseType_t uxNewPriority ) + { + TCB_t * pxTCB; + UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry; + BaseType_t xYieldRequired = pdFALSE; + + configASSERT( uxNewPriority < configMAX_PRIORITIES ); + + /* Ensure the new priority is valid. */ + if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) + { + uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the calling + * task that is being changed. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); + + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentBasePriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentBasePriority = pxTCB->uxPriority; + } + #endif + + if( uxCurrentBasePriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + * priority than the calling task. */ + if( uxNewPriority > uxCurrentBasePriority ) + { + if( pxTCB != pxCurrentTCB ) + { + /* The priority of a task other than the currently + * running task is being raised. Is the priority being + * raised above that of the running task? */ + if( uxNewPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + /* The priority of the running task is being raised, + * but the running task must already be the highest + * priority task able to run so no yield is required. */ + } + } + else if( pxTCB == pxCurrentTCB ) + { + /* Setting the priority of the running task down means + * there may now be another task of higher priority that + * is ready to execute. */ + xYieldRequired = pdTRUE; + } + else + { + /* Setting the priority of any other task down does not + * require a yield as the running task must be above the + * new priority of the task being modified. */ + } + + /* Remember the ready list the task might be referenced from + * before its uxPriority member is changed so the + * taskRESET_READY_PRIORITY() macro can function correctly. */ + uxPriorityUsedOnEntry = pxTCB->uxPriority; + + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + * currently using an inherited priority. */ + if( pxTCB->uxBasePriority == pxTCB->uxPriority ) + { + pxTCB->uxPriority = uxNewPriority; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else /* if ( configUSE_MUTEXES == 1 ) */ + { + pxTCB->uxPriority = uxNewPriority; + } + #endif /* if ( configUSE_MUTEXES == 1 ) */ + + /* Only reset the event list item value if the value is not + * being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task is in the blocked or suspended list we need do + * nothing more than change its priority variable. However, if + * the task is in a ready list it needs to be removed and placed + * in the list appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* The task is currently in its ready list - remove before + * adding it to its new ready list. As we are in a critical + * section we can do this even if the scheduler is suspended. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xYieldRequired != pdFALSE ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Remove compiler warning about unused variables when the port + * optimised task selection is not being used. */ + ( void ) uxPriorityUsedOnEntry; + } + } + taskEXIT_CRITICAL(); + } + +#endif /* INCLUDE_vTaskPrioritySet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskSuspend( TaskHandle_t xTaskToSuspend ) + { + TCB_t * pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the running task that is + * being suspended. */ + pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); + + traceTASK_SUSPEND( pxTCB ); + + /* Remove task from the ready/delayed list and place in the + * suspended list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ); + + #if ( configUSE_TASK_NOTIFICATIONS == 1 ) + { + BaseType_t x; + + for( x = 0; x < configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ ) + { + if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION ) + { + /* The task was blocked to wait for a notification, but is + * now suspended, so no notification was received. */ + pxTCB->ucNotifyState[ x ] = taskNOT_WAITING_NOTIFICATION; + } + } + } + #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */ + } + taskEXIT_CRITICAL(); + + if( xSchedulerRunning != pdFALSE ) + { + /* Reset the next expected unblock time in case it referred to the + * task that is now in the Suspended state. */ + taskENTER_CRITICAL(); + { + prvResetNextTaskUnblockTime(); + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( pxTCB == pxCurrentTCB ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* The current task has just been suspended. */ + configASSERT( uxSchedulerSuspended == 0 ); + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + * to by pxCurrentTCB has just been suspended and pxCurrentTCB + * must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) /*lint !e931 Right has no side effect, just volatile. */ + { + /* No other tasks are ready, so set pxCurrentTCB back to + * NULL so when the next task is created pxCurrentTCB will + * be set to point to it no matter what its relative priority + * is. */ + pxCurrentTCB = NULL; + } + else + { + vTaskSwitchContext(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) + { + BaseType_t xReturn = pdFALSE; + const TCB_t * const pxTCB = xTask; + + /* Accesses xPendingReadyList so must be called from a critical + * section. */ + + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); + + /* Is the task being resumed actually in the suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE ) + { + /* Is it in the suspended list because it is in the Suspended + * state, or because is is blocked with no timeout? */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) /*lint !e961. The cast is only redundant when NULL is used. */ + { + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskResume( TaskHandle_t xTaskToResume ) + { + TCB_t * const pxTCB = xTaskToResume; + + /* It does not make sense to resume the calling task. */ + configASSERT( xTaskToResume ); + + /* The parameter cannot be NULL as it is impossible to resume the + * currently executing task. */ + if( ( pxTCB != pxCurrentTCB ) && ( pxTCB != NULL ) ) + { + taskENTER_CRITICAL(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME( pxTCB ); + + /* The ready list can be accessed even if the scheduler is + * suspended because this is inside a critical section. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* A higher priority task may have just been resumed. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* This yield may not cause the task just resumed to run, + * but will leave the lists in the correct state for the + * next yield. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) + { + BaseType_t xYieldRequired = pdFALSE; + TCB_t * const pxTCB = xTaskToResume; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToResume ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); + + /* Check the ready lists can be accessed. */ + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Ready lists can be accessed so move the task from the + * suspended list to the ready list directly. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + + /* Mark that a yield is pending in case the user is not + * using the return value to initiate a context switch + * from the ISR using portYIELD_FROM_ISR. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed or ready lists cannot be accessed so the task + * is held in the pending ready list until the scheduler is + * unsuspended. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xYieldRequired; + } + +#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ +/*-----------------------------------------------------------*/ + +void vTaskStartScheduler( void ) +{ + BaseType_t xReturn; + + /* Add the idle task at the lowest priority. */ + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t * pxIdleTaskTCBBuffer = NULL; + StackType_t * pxIdleTaskStackBuffer = NULL; + uint32_t ulIdleTaskStackSize; + + /* The Idle task is created using user provided RAM - obtain the + * address of the RAM then create the idle task. */ + vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); + xIdleTaskHandle = xTaskCreateStatic( prvIdleTask, + configIDLE_TASK_NAME, + ulIdleTaskStackSize, + ( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */ + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + pxIdleTaskStackBuffer, + pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + + if( xIdleTaskHandle != NULL ) + { + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + { + /* The Idle task is being created using dynamically allocated RAM. */ + xReturn = xTaskCreate( prvIdleTask, + configIDLE_TASK_NAME, + configMINIMAL_STACK_SIZE, + ( void * ) NULL, + portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ + &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TIMERS */ + + if( xReturn == pdPASS ) + { + /* freertos_tasks_c_additions_init() should only be called if the user + * definable macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is + * the only macro called by the function. */ + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + { + freertos_tasks_c_additions_init(); + } + #endif + + /* Interrupts are turned off here, to ensure a tick does not occur + * before or during the call to xPortStartScheduler(). The stacks of + * the created tasks contain a status word with interrupts switched on + * so interrupts will automatically get re-enabled when the first task + * starts to run. */ + portDISABLE_INTERRUPTS(); + + #if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) + { + /* Switch C-Runtime's TLS Block to point to the TLS + * block specific to the task that will run first. */ + configSET_TLS_BLOCK( pxCurrentTCB->xTLSBlock ); + } + #endif + + xNextTaskUnblockTime = portMAX_DELAY; + xSchedulerRunning = pdTRUE; + xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; + + /* If configGENERATE_RUN_TIME_STATS is defined then the following + * macro must be defined to configure the timer/counter used to generate + * the run time counter time base. NOTE: If configGENERATE_RUN_TIME_STATS + * is set to 0 and the following line fails to build then ensure you do not + * have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() defined in your + * FreeRTOSConfig.h file. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + + traceTASK_SWITCHED_IN(); + + /* Setting up the timer tick is hardware specific and thus in the + * portable interface. */ + xPortStartScheduler(); + + /* In most cases, xPortStartScheduler() will not return. If it + * returns pdTRUE then there was not enough heap memory available + * to create either the Idle or the Timer task. If it returned + * pdFALSE, then the application called xTaskEndScheduler(). + * Most ports don't implement xTaskEndScheduler() as there is + * nothing to return to. */ + } + else + { + /* This line will only be reached if the kernel could not be started, + * because there was not enough FreeRTOS heap to create the idle task + * or the timer task. */ + configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); + } + + /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, + * meaning xIdleTaskHandle is not used anywhere else. */ + ( void ) xIdleTaskHandle; + + /* OpenOCD makes use of uxTopUsedPriority for thread debugging. Prevent uxTopUsedPriority + * from getting optimized out as it is no longer used by the kernel. */ + ( void ) uxTopUsedPriority; +} +/*-----------------------------------------------------------*/ + +void vTaskEndScheduler( void ) +{ + /* Stop the scheduler interrupts and call the portable scheduler end + * routine so the original ISRs can be restored if necessary. The port + * layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + /* A critical section is not required as the variable is of type + * BaseType_t. Please read Richard Barry's reply in the following link to a + * post in the FreeRTOS support forum before reporting this as a bug! - + * https://goo.gl/wu4acr */ + + /* portSOFTWARE_BARRIER() is only implemented for emulated/simulated ports that + * do not otherwise exhibit real time behaviour. */ + portSOFTWARE_BARRIER(); + + /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment + * is used to allow calls to vTaskSuspendAll() to nest. */ + ++uxSchedulerSuspended; + + /* Enforces ordering for ports and optimised compilers that may otherwise place + * the above increment elsewhere. */ + portMEMORY_BARRIER(); +} +/*----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static TickType_t prvGetExpectedIdleTime( void ) + { + TickType_t xReturn; + UBaseType_t uxHigherPriorityReadyTasks = pdFALSE; + + /* uxHigherPriorityReadyTasks takes care of the case where + * configUSE_PREEMPTION is 0, so there may be tasks above the idle priority + * task that are in the Ready state, even though the idle task is + * running. */ + #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + { + if( uxTopReadyPriority > tskIDLE_PRIORITY ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #else + { + const UBaseType_t uxLeastSignificantBit = ( UBaseType_t ) 0x01; + + /* When port optimised task selection is used the uxTopReadyPriority + * variable is used as a bit map. If bits other than the least + * significant bit are set then there are tasks that have a priority + * above the idle priority that are in the Ready state. This takes + * care of the case where the co-operative scheduler is in use. */ + if( uxTopReadyPriority > uxLeastSignificantBit ) + { + uxHigherPriorityReadyTasks = pdTRUE; + } + } + #endif /* if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) */ + + if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY ) + { + xReturn = 0; + } + else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1 ) + { + /* There are other idle priority tasks in the ready state. If + * time slicing is used then the very next tick interrupt must be + * processed. */ + xReturn = 0; + } + else if( uxHigherPriorityReadyTasks != pdFALSE ) + { + /* There are tasks in the Ready state that have a priority above the + * idle priority. This path can only be reached if + * configUSE_PREEMPTION is 0. */ + xReturn = 0; + } + else + { + xReturn = xNextTaskUnblockTime - xTickCount; + } + + return xReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskResumeAll( void ) +{ + TCB_t * pxTCB = NULL; + BaseType_t xAlreadyYielded = pdFALSE; + + /* If uxSchedulerSuspended is zero then this function does not match a + * previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended ); + + /* It is possible that an ISR caused a task to be removed from an event + * list while the scheduler was suspended. If this was the case then the + * removed task will have been added to the xPendingReadyList. Once the + * scheduler has been resumed it is safe to move all the pending ready + * tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + { + --uxSchedulerSuspended; + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) + { + /* Move any readied tasks from the pending list into the + * appropriate ready list. */ + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) + { + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + listREMOVE_ITEM( &( pxTCB->xEventListItem ) ); + portMEMORY_BARRIER(); + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* If the moved task has a priority higher than or equal to + * the current task then a yield must be performed. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( pxTCB != NULL ) + { + /* A task was unblocked while the scheduler was suspended, + * which may have prevented the next unblock time from being + * re-calculated, in which case re-calculate it now. Mainly + * important for low power tickless implementations, where + * this can prevent an unnecessary exit from low power + * state. */ + prvResetNextTaskUnblockTime(); + } + + /* If any ticks occurred while the scheduler was suspended then + * they should be processed now. This ensures the tick count does + * not slip, and that any delayed tasks are resumed at the correct + * time. */ + { + TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */ + + if( xPendedCounts > ( TickType_t ) 0U ) + { + do + { + if( xTaskIncrementTick() != pdFALSE ) + { + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + --xPendedCounts; + } while( xPendedCounts > ( TickType_t ) 0U ); + + xPendedTicks = 0; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + if( xYieldPending != pdFALSE ) + { + #if ( configUSE_PREEMPTION != 0 ) + { + xAlreadyYielded = pdTRUE; + } + #endif + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xAlreadyYielded; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCount( void ) +{ + TickType_t xTicks; + + /* Critical section required if running on a 16 bit processor. */ + portTICK_TYPE_ENTER_CRITICAL(); + { + xTicks = xTickCount; + } + portTICK_TYPE_EXIT_CRITICAL(); + + return xTicks; +} +/*-----------------------------------------------------------*/ + +TickType_t xTaskGetTickCountFromISR( void ) +{ + TickType_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + /* RTOS ports that support interrupt nesting have the concept of a maximum + * system call (or maximum API call) interrupt priority. Interrupts that are + * above the maximum system call priority are kept permanently enabled, even + * when the RTOS kernel is in a critical section, but cannot make any calls to + * FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has been + * assigned a priority above the configured maximum system call priority. + * Only FreeRTOS functions that end in FromISR can be called from interrupts + * that have been assigned a priority at or (logically) below the maximum + * system call interrupt priority. FreeRTOS maintains a separate interrupt + * safe API to ensure interrupt entry is as fast and as simple as possible. + * More information (albeit Cortex-M specific) is provided on the following + * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = xTickCount; + } + portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +UBaseType_t uxTaskGetNumberOfTasks( void ) +{ + /* A critical section is not required because the variables are of type + * BaseType_t. */ + return uxCurrentNumberOfTasks; +} +/*-----------------------------------------------------------*/ + +char * pcTaskGetName( TaskHandle_t xTaskToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ +{ + TCB_t * pxTCB; + + /* If null is passed in here then the name of the calling task is being + * queried. */ + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + configASSERT( pxTCB ); + return &( pxTCB->pcTaskName[ 0 ] ); +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList, + const char pcNameToQuery[] ) + { + TCB_t * pxNextTCB; + TCB_t * pxFirstTCB; + TCB_t * pxReturn = NULL; + UBaseType_t x; + char cNextChar; + BaseType_t xBreakLoop; + + /* This function is called with the scheduler suspended. */ + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + /* Check each character in the name looking for a match or + * mismatch. */ + xBreakLoop = pdFALSE; + + for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) + { + cNextChar = pxNextTCB->pcTaskName[ x ]; + + if( cNextChar != pcNameToQuery[ x ] ) + { + /* Characters didn't match. */ + xBreakLoop = pdTRUE; + } + else if( cNextChar == ( char ) 0x00 ) + { + /* Both strings terminated, a match must have been + * found. */ + pxReturn = pxNextTCB; + xBreakLoop = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + if( xBreakLoop != pdFALSE ) + { + break; + } + } + + if( pxReturn != NULL ) + { + /* The handle has been found. */ + break; + } + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return pxReturn; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetHandle == 1 ) + + TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + UBaseType_t uxQueue = configMAX_PRIORITIES; + TCB_t * pxTCB; + + /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */ + configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN ); + + vTaskSuspendAll(); + { + /* Search the ready lists. */ + do + { + uxQueue--; + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery ); + + if( pxTCB != NULL ) + { + /* Found the handle. */ + break; + } + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Search the delayed lists. */ + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery ); + } + + if( pxTCB == NULL ) + { + pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery ); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the suspended list. */ + pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery ); + } + } + #endif + + #if ( INCLUDE_vTaskDelete == 1 ) + { + if( pxTCB == NULL ) + { + /* Search the deleted list. */ + pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery ); + } + } + #endif + } + ( void ) xTaskResumeAll(); + + return pxTCB; + } + +#endif /* INCLUDE_xTaskGetHandle */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, + const UBaseType_t uxArraySize, + configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) + { + UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES; + + vTaskSuspendAll(); + { + /* Is there a space in the array for each task in the system? */ + if( uxArraySize >= uxCurrentNumberOfTasks ) + { + /* Fill in an TaskStatus_t structure with information on each + * task in the Ready state. */ + do + { + uxQueue--; + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); + } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Fill in an TaskStatus_t structure with information on each + * task in the Blocked state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ); + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + * each task that has been deleted but not yet cleaned up. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* Fill in an TaskStatus_t structure with information on + * each task in the Suspended state. */ + uxTask += prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + if( pulTotalRunTime != NULL ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); + #else + *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + } + } + #else /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ + { + if( pulTotalRunTime != NULL ) + { + *pulTotalRunTime = 0; + } + } + #endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + + TaskHandle_t xTaskGetIdleTaskHandle( void ) + { + /* If xTaskGetIdleTaskHandle() is called before the scheduler has been + * started, then xIdleTaskHandle will be NULL. */ + configASSERT( ( xIdleTaskHandle != NULL ) ); + return xIdleTaskHandle; + } + +#endif /* INCLUDE_xTaskGetIdleTaskHandle */ +/*----------------------------------------------------------*/ + +/* This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure vTaskStepTick() is available when user defined low power mode + * implementations require configUSE_TICKLESS_IDLE to be set to a value other than + * 1. */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + void vTaskStepTick( TickType_t xTicksToJump ) + { + /* Correct the tick count value after a period during which the tick + * was suppressed. Note this does *not* call the tick hook function for + * each stepped tick. */ + configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); + + if( ( xTickCount + xTicksToJump ) == xNextTaskUnblockTime ) + { + /* Arrange for xTickCount to reach xNextTaskUnblockTime in + * xTaskIncrementTick() when the scheduler resumes. This ensures + * that any delayed tasks are resumed at the correct time. */ + configASSERT( uxSchedulerSuspended ); + configASSERT( xTicksToJump != ( TickType_t ) 0 ); + + /* Prevent the tick interrupt modifying xPendedTicks simultaneously. */ + taskENTER_CRITICAL(); + { + xPendedTicks++; + } + taskEXIT_CRITICAL(); + xTicksToJump--; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + xTickCount += xTicksToJump; + traceINCREASE_TICK_COUNT( xTicksToJump ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) +{ + BaseType_t xYieldOccurred; + + /* Must not be called with the scheduler suspended as the implementation + * relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */ + configASSERT( uxSchedulerSuspended == 0 ); + + /* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occurring when + * the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */ + vTaskSuspendAll(); + + /* Prevent the tick interrupt modifying xPendedTicks simultaneously. */ + taskENTER_CRITICAL(); + { + xPendedTicks += xTicksToCatchUp; + } + taskEXIT_CRITICAL(); + xYieldOccurred = xTaskResumeAll(); + + return xYieldOccurred; +} +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskAbortDelay == 1 ) + + BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) + { + TCB_t * pxTCB = xTask; + BaseType_t xReturn; + + configASSERT( pxTCB ); + + vTaskSuspendAll(); + { + /* A task can only be prematurely removed from the Blocked state if + * it is actually in the Blocked state. */ + if( eTaskGetState( xTask ) == eBlocked ) + { + xReturn = pdPASS; + + /* Remove the reference to the task from the blocked list. An + * interrupt won't touch the xStateListItem because the + * scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove it from + * the event list too. Interrupts can touch the event list item, + * even though the scheduler is suspended, so a critical section + * is used. */ + taskENTER_CRITICAL(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + + /* This lets the task know it was forcibly removed from the + * blocked state so it should not re-evaluate its block time and + * then block again. */ + pxTCB->ucDelayAborted = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + /* Place the unblocked task into the appropriate ready list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate context + * switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should only be + * performed if the unblocked task has a priority that is + * higher than the currently executing task. */ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Pend the yield to be performed when the scheduler + * is unsuspended. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + else + { + xReturn = pdFAIL; + } + } + ( void ) xTaskResumeAll(); + + return xReturn; + } + +#endif /* INCLUDE_xTaskAbortDelay */ +/*----------------------------------------------------------*/ + +BaseType_t xTaskIncrementTick( void ) +{ + TCB_t * pxTCB; + TickType_t xItemValue; + BaseType_t xSwitchRequired = pdFALSE; + + /* Called by the portable layer each time a tick interrupt occurs. + * Increments the tick then checks to see if the new tick value will cause any + * tasks to be unblocked. */ + traceTASK_INCREMENT_TICK( xTickCount ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + /* Minor optimisation. The tick count cannot change in this + * block. */ + const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1; + + /* Increment the RTOS tick, switching the delayed and overflowed + * delayed lists if it wraps to 0. */ + xTickCount = xConstTickCount; + + if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */ + { + taskSWITCH_DELAYED_LISTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* See if this tick has made a timeout expire. Tasks are stored in + * the queue in the order of their wake time - meaning once one task + * has been found whose block time has not expired there is no need to + * look any further down the list. */ + if( xConstTickCount >= xNextTaskUnblockTime ) + { + for( ; ; ) + { + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The delayed list is empty. Set xNextTaskUnblockTime + * to the maximum possible value so it is extremely + * unlikely that the + * if( xTickCount >= xNextTaskUnblockTime ) test will pass + * next time through. */ + xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + break; + } + else + { + /* The delayed list is not empty, get the value of the + * item at the head of the delayed list. This is the time + * at which the task at the head of the delayed list must + * be removed from the Blocked state. */ + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); + + if( xConstTickCount < xItemValue ) + { + /* It is not time to unblock this item yet, but the + * item value is the time at which the task at the head + * of the blocked list must be removed from the Blocked + * state - so record the item value in + * xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + break; /*lint !e9011 Code structure here is deemed easier to understand with multiple breaks. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* It is time to remove the item from the Blocked state. */ + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + + /* Is the task waiting on an event also? If so remove + * it from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + listREMOVE_ITEM( &( pxTCB->xEventListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Place the unblocked task into the appropriate ready + * list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate + * context switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should + * only be performed if the unblocked task's + * priority is higher than the currently executing + * task. + * The case of equal priority tasks sharing + * processing time (which happens when both + * preemption and time slicing are on) is + * handled below.*/ + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + } + } + + /* Tasks of equal priority to the currently running task will share + * processing time (time slice) if preemption is on, and the application + * writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ + + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the pended tick + * count is being unwound (when the scheduler is being unlocked). */ + if( xPendedTicks == ( TickType_t ) 0 ) + { + vApplicationTickHook(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICK_HOOK */ + + #if ( configUSE_PREEMPTION == 1 ) + { + if( xYieldPending != pdFALSE ) + { + xSwitchRequired = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_PREEMPTION */ + } + else + { + ++xPendedTicks; + + /* The tick hook gets called at regular intervals, even if the + * scheduler is locked. */ + #if ( configUSE_TICK_HOOK == 1 ) + { + vApplicationTickHook(); + } + #endif + } + + return xSwitchRequired; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + void vTaskSetApplicationTaskTag( TaskHandle_t xTask, + TaskHookFunction_t pxHookFunction ) + { + TCB_t * xTCB; + + /* If xTask is NULL then it is the task hook of the calling task that is + * getting set. */ + if( xTask == NULL ) + { + xTCB = ( TCB_t * ) pxCurrentTCB; + } + else + { + xTCB = xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + * the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xTCB->pxTaskTag = pxHookFunction; + } + taskEXIT_CRITICAL(); + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + TaskHookFunction_t xReturn; + + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + /* Save the hook function in the TCB. A critical section is required as + * the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + { + xReturn = pxTCB->pxTaskTag; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + TaskHookFunction_t xReturn; + UBaseType_t uxSavedInterruptStatus; + + /* If xTask is NULL then set the calling task's hook. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + /* Save the hook function in the TCB. A critical section is required as + * the value can be accessed from an interrupt. */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + xReturn = pxTCB->pxTaskTag; + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, + void * pvParameter ) + { + TCB_t * xTCB; + BaseType_t xReturn; + + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = pxCurrentTCB; + } + else + { + xTCB = xTask; + } + + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +void vTaskSwitchContext( void ) +{ + if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) + { + /* The scheduler is currently suspended - do not allow a context + * switch. */ + xYieldPending = pdTRUE; + } + else + { + xYieldPending = pdFALSE; + traceTASK_SWITCHED_OUT(); + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); + #else + ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the + * accumulated time so far. The time the task started running was + * stored in ulTaskSwitchedInTime. Note that there is no overflow + * protection here so count values are only valid until the timer + * overflows. The guard against negative values is to protect + * against suspect run time stat counter implementations - which + * are provided by the application, not the kernel. */ + if( ulTotalRunTime > ulTaskSwitchedInTime ) + { + pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + ulTaskSwitchedInTime = ulTotalRunTime; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + /* Check for stack overflow, if configured. */ + taskCHECK_FOR_STACK_OVERFLOW(); + + /* Before the currently running task is switched out, save its errno. */ + #if ( configUSE_POSIX_ERRNO == 1 ) + { + pxCurrentTCB->iTaskErrno = FreeRTOS_errno; + } + #endif + + /* Select a new task to run using either the generic C or port + * optimised asm code. */ + taskSELECT_HIGHEST_PRIORITY_TASK(); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + traceTASK_SWITCHED_IN(); + + /* After the new task is switched in, update the global errno. */ + #if ( configUSE_POSIX_ERRNO == 1 ) + { + FreeRTOS_errno = pxCurrentTCB->iTaskErrno; + } + #endif + + #if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) + { + /* Switch C-Runtime's TLS Block to point to the TLS + * Block specific to this task. */ + configSET_TLS_BLOCK( pxCurrentTCB->xTLSBlock ); + } + #endif + } +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnEventList( List_t * const pxEventList, + const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH EITHER INTERRUPTS DISABLED OR THE + * SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */ + + /* Place the event list item of the TCB in the appropriate event list. + * This is placed in the list in priority order so the highest priority task + * is the first to be woken by the event. + * + * Note: Lists are sorted in ascending order by ListItem_t.xItemValue. + * Normally, the xItemValue of a TCB's ListItem_t members is: + * xItemValue = ( configMAX_PRIORITIES - uxPriority ) + * Therefore, the event list is sorted in descending priority order. + * + * The queue that contains the event list is locked, preventing + * simultaneous access from interrupts. */ + vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnUnorderedEventList( List_t * pxEventList, + const TickType_t xItemValue, + const TickType_t xTicksToWait ) +{ + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + * the event groups implementation. */ + configASSERT( uxSchedulerSuspended != 0 ); + + /* Store the item value in the event list item. It is safe to access the + * event list item here as interrupts won't access the event list item of a + * task that is not in the Blocked state. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Place the event list item of the TCB at the end of the appropriate event + * list. It is safe to access the event list here because it is part of an + * event group implementation - and interrupts don't access event groups + * directly (instead they access them indirectly by pending function calls to + * the task level). */ + listINSERT_END( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vTaskPlaceOnEventListRestricted( List_t * const pxEventList, + TickType_t xTicksToWait, + const BaseType_t xWaitIndefinitely ) + { + configASSERT( pxEventList ); + + /* This function should not be called by application code hence the + * 'Restricted' in its name. It is not part of the public API. It is + * designed for use by kernel code, and has special calling requirements - + * it should be called with the scheduler suspended. */ + + + /* Place the event list item of the TCB in the appropriate event list. + * In this case it is assume that this is the only task that is going to + * be waiting on this event list, so the faster vListInsertEnd() function + * can be used in place of vListInsert. */ + listINSERT_END( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* If the task should block indefinitely then set the block time to a + * value that will be recognised as an indefinite delay inside the + * prvAddCurrentTaskToDelayedList() function. */ + if( xWaitIndefinitely != pdFALSE ) + { + xTicksToWait = portMAX_DELAY; + } + + traceTASK_DELAY_UNTIL( ( xTickCount + xTicksToWait ) ); + prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) +{ + TCB_t * pxUnblockedTCB; + BaseType_t xReturn; + + /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION. It can also be + * called from a critical section within an ISR. */ + + /* The event list is sorted in priority order, so the first in the list can + * be removed as it is known to be the highest priority. Remove the TCB from + * the delayed list, and add it to the ready list. + * + * If an event is for a queue that is locked then this function will never + * get called - the lock count on the queue will get modified instead. This + * means exclusive access to the event list is guaranteed here. + * + * This function assumes that a check has already been made to ensure that + * pxEventList is not empty. */ + pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + configASSERT( pxUnblockedTCB ); + listREMOVE_ITEM( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + listREMOVE_ITEM( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + * might be set to the blocked task's time out time. If the task is + * unblocked for a reason other than a timeout xNextTaskUnblockTime is + * normally left unchanged, because it is automatically reset to a new + * value when the tick count equals xNextTaskUnblockTime. However if + * tickless idling is used it might be more important to enter sleep mode + * at the earliest possible time - so reset xNextTaskUnblockTime here to + * ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + } + else + { + /* The delayed and ready lists cannot be accessed, so hold this task + * pending until the scheduler is resumed. */ + listINSERT_END( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has a higher + * priority than the calling task. This allows the calling task to know if + * it should force a context switch now. */ + xReturn = pdTRUE; + + /* Mark that a yield is pending in case the user is not using the + * "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem, + const TickType_t xItemValue ) +{ + TCB_t * pxUnblockedTCB; + + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. It is used by + * the event flags implementation. */ + configASSERT( uxSchedulerSuspended != pdFALSE ); + + /* Store the new item value in the event list. */ + listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE ); + + /* Remove the event list form the event flag. Interrupts do not access + * event flags. */ + pxUnblockedTCB = listGET_LIST_ITEM_OWNER( pxEventListItem ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + configASSERT( pxUnblockedTCB ); + listREMOVE_ITEM( pxEventListItem ); + + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked on a kernel object then xNextTaskUnblockTime + * might be set to the blocked task's time out time. If the task is + * unblocked for a reason other than a timeout xNextTaskUnblockTime is + * normally left unchanged, because it is automatically reset to a new + * value when the tick count equals xNextTaskUnblockTime. However if + * tickless idling is used it might be more important to enter sleep mode + * at the earliest possible time - so reset xNextTaskUnblockTime here to + * ensure it is updated at the earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + /* Remove the task from the delayed list and add it to the ready list. The + * scheduler is suspended so interrupts will not be accessing the ready + * lists. */ + listREMOVE_ITEM( &( pxUnblockedTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + + if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The unblocked task has a priority above that of the calling task, so + * a context switch is required. This function is called with the + * scheduler suspended so xYieldPending is set so the context switch + * occurs immediately that the scheduler is resumed (unsuspended). */ + xYieldPending = pdTRUE; + } +} +/*-----------------------------------------------------------*/ + +void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + configASSERT( pxTimeOut ); + taskENTER_CRITICAL(); + { + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) +{ + /* For internal use only as it does not use a critical section. */ + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; +} +/*-----------------------------------------------------------*/ + +BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, + TickType_t * const pxTicksToWait ) +{ + BaseType_t xReturn; + + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); + + taskENTER_CRITICAL(); + { + /* Minor optimisation. The tick count cannot change in this block. */ + const TickType_t xConstTickCount = xTickCount; + const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering; + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + if( pxCurrentTCB->ucDelayAborted != ( uint8_t ) pdFALSE ) + { + /* The delay was aborted, which is not the same as a time out, + * but has the same result. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + xReturn = pdTRUE; + } + else + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + if( *pxTicksToWait == portMAX_DELAY ) + { + /* If INCLUDE_vTaskSuspend is set to 1 and the block time + * specified is the maximum block time then the task should block + * indefinitely, and therefore never time out. */ + xReturn = pdFALSE; + } + else + #endif + + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ + { + /* The tick count is greater than the time at which + * vTaskSetTimeout() was called, but has also overflowed since + * vTaskSetTimeOut() was called. It must have wrapped all the way + * around and gone past again. This passed since vTaskSetTimeout() + * was called. */ + xReturn = pdTRUE; + *pxTicksToWait = ( TickType_t ) 0; + } + else if( xElapsedTime < *pxTicksToWait ) /*lint !e961 Explicit casting is only redundant with some compilers, whereas others require it to prevent integer conversion errors. */ + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= xElapsedTime; + vTaskInternalSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + *pxTicksToWait = ( TickType_t ) 0; + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskMissedYield( void ) +{ + xYieldPending = pdTRUE; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) + { + UBaseType_t uxReturn; + TCB_t const * pxTCB; + + if( xTask != NULL ) + { + pxTCB = xTask; + uxReturn = pxTCB->uxTaskNumber; + } + else + { + uxReturn = 0U; + } + + return uxReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskSetTaskNumber( TaskHandle_t xTask, + const UBaseType_t uxHandle ) + { + TCB_t * pxTCB; + + if( xTask != NULL ) + { + pxTCB = xTask; + pxTCB->uxTaskNumber = uxHandle; + } + } + +#endif /* configUSE_TRACE_FACILITY */ + +/* + * ----------------------------------------------------------- + * The Idle task. + * ---------------------------------------------------------- + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + /* Stop warnings. */ + ( void ) pvParameters; + + /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE + * SCHEDULER IS STARTED. **/ + + /* In case a task that has a secure context deletes itself, in which case + * the idle task is responsible for deleting the task's secure context, if + * any. */ + portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE ); + + for( ; ; ) + { + /* See if any tasks have deleted themselves - if so then the idle task + * is responsible for freeing the deleted task's TCB and stack. */ + prvCheckTasksWaitingTermination(); + + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + * see if any other task has become available. If we are using + * preemption we don't need to do this as any task becoming available + * will automatically get the processor anyway. */ + taskYIELD(); + } + #endif /* configUSE_PREEMPTION */ + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + * timesliced. If a task that is sharing the idle priority is ready + * to run then the idle task should yield before the end of the + * timeslice. + * + * A critical region is not required here as we are just reading from + * the list, and an occasional incorrect value will not matter. If + * the ready list at the idle priority contains more than one task + * then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) + { + taskYIELD(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ + + #if ( configUSE_IDLE_HOOK == 1 ) + { + extern void vApplicationIdleHook( void ); + + /* Call the user defined function from within the idle task. This + * allows the application designer to add background functionality + * without the overhead of a separate task. + * NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + * CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationIdleHook(); + } + #endif /* configUSE_IDLE_HOOK */ + + /* This conditional compilation should use inequality to 0, not equality + * to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when + * user defined low power mode implementations require + * configUSE_TICKLESS_IDLE to be set to a value other than 1. */ + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + TickType_t xExpectedIdleTime; + + /* It is not desirable to suspend then resume the scheduler on + * each iteration of the idle task. Therefore, a preliminary + * test of the expected idle time is performed without the + * scheduler suspended. The result here is not necessarily + * valid. */ + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + vTaskSuspendAll(); + { + /* Now the scheduler is suspended, the expected idle + * time can be sampled again, and this time its value can + * be used. */ + configASSERT( xNextTaskUnblockTime >= xTickCount ); + xExpectedIdleTime = prvGetExpectedIdleTime(); + + /* Define the following macro to set xExpectedIdleTime to 0 + * if the application does not want + * portSUPPRESS_TICKS_AND_SLEEP() to be called. */ + configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime ); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + traceLOW_POWER_IDLE_BEGIN(); + portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); + traceLOW_POWER_IDLE_END(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + ( void ) xTaskResumeAll(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configUSE_TICKLESS_IDLE */ + } +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + eSleepModeStatus eTaskConfirmSleepModeStatus( void ) + { + #if ( INCLUDE_vTaskSuspend == 1 ) + /* The idle task exists in addition to the application tasks. */ + const UBaseType_t uxNonApplicationTasks = 1; + #endif /* INCLUDE_vTaskSuspend */ + + eSleepModeStatus eReturn = eStandardSleep; + + /* This function must be called from a critical section. */ + + if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 ) + { + /* A task was made ready while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xYieldPending != pdFALSE ) + { + /* A yield was pended while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xPendedTicks != 0 ) + { + /* A tick interrupt has already occurred but was held pending + * because the scheduler is suspended. */ + eReturn = eAbortSleep; + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) + { + /* If all the tasks are in the suspended list (which might mean they + * have an infinite block time rather than actually being suspended) + * then it is safe to turn all clocks off and just wait for external + * interrupts. */ + eReturn = eNoTasksWaitingTimeout; + } + #endif /* INCLUDE_vTaskSuspend */ + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return eReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet, + BaseType_t xIndex, + void * pvValue ) + { + TCB_t * pxTCB; + + if( ( xIndex >= 0 ) && + ( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) ) + { + pxTCB = prvGetTCBFromHandle( xTaskToSet ); + configASSERT( pxTCB != NULL ); + pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue; + } + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) + + void * pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery, + BaseType_t xIndex ) + { + void * pvReturn = NULL; + TCB_t * pxTCB; + + if( ( xIndex >= 0 ) && + ( xIndex < configNUM_THREAD_LOCAL_STORAGE_POINTERS ) ) + { + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ]; + } + else + { + pvReturn = NULL; + } + + return pvReturn; + } + +#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */ +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify, + const MemoryRegion_t * const xRegions ) + { + TCB_t * pxTCB; + + /* If null is passed in here then we are modifying the MPU settings of + * the calling task. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); + + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseTaskLists( void ) +{ + UBaseType_t uxPriority; + + for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); + } + + vListInitialise( &xDelayedTaskList1 ); + vListInitialise( &xDelayedTaskList2 ); + vListInitialise( &xPendingReadyList ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( &xTasksWaitingTermination ); + } + #endif /* INCLUDE_vTaskDelete */ + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( &xSuspendedTaskList ); + } + #endif /* INCLUDE_vTaskSuspend */ + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + * using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/ + + #if ( INCLUDE_vTaskDelete == 1 ) + { + TCB_t * pxTCB; + + /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL() + * being called too often in the idle task. */ + while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) + { + taskENTER_CRITICAL(); + { + pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); + --uxCurrentNumberOfTasks; + --uxDeletedTasksWaitingCleanUp; + } + taskEXIT_CRITICAL(); + + prvDeleteTCB( pxTCB ); + } + } + #endif /* INCLUDE_vTaskDelete */ +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskGetInfo( TaskHandle_t xTask, + TaskStatus_t * pxTaskStatus, + BaseType_t xGetFreeStackSpace, + eTaskState eState ) + { + TCB_t * pxTCB; + + /* xTask is NULL then get the state of the calling task. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB; + pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName[ 0 ] ); + pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority; + pxTaskStatus->pxStackBase = pxTCB->pxStack; + #if ( ( portSTACK_GROWTH > 0 ) && ( configRECORD_STACK_HIGH_ADDRESS == 1 ) ) + pxTaskStatus->pxTopOfStack = pxTCB->pxTopOfStack; + pxTaskStatus->pxEndOfStack = pxTCB->pxEndOfStack; + #endif + pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber; + + #if ( configUSE_MUTEXES == 1 ) + { + pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority; + } + #else + { + pxTaskStatus->uxBasePriority = 0; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter; + } + #else + { + pxTaskStatus->ulRunTimeCounter = ( configRUN_TIME_COUNTER_TYPE ) 0; + } + #endif + + /* Obtaining the task state is a little fiddly, so is only done if the + * value of eState passed into this function is eInvalid - otherwise the + * state is just set to whatever is passed in. */ + if( eState != eInvalid ) + { + if( pxTCB == pxCurrentTCB ) + { + pxTaskStatus->eCurrentState = eRunning; + } + else + { + pxTaskStatus->eCurrentState = eState; + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* If the task is in the suspended list then there is a + * chance it is actually just blocked indefinitely - so really + * it should be reported as being in the Blocked state. */ + if( eState == eSuspended ) + { + vTaskSuspendAll(); + { + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + pxTaskStatus->eCurrentState = eBlocked; + } + } + ( void ) xTaskResumeAll(); + } + } + #endif /* INCLUDE_vTaskSuspend */ + } + } + else + { + pxTaskStatus->eCurrentState = eTaskGetState( pxTCB ); + } + + /* Obtaining the stack space takes some time, so the xGetFreeStackSpace + * parameter is provided to allow it to be skipped. */ + if( xGetFreeStackSpace != pdFALSE ) + { + #if ( portSTACK_GROWTH > 0 ) + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack ); + } + #else + { + pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack ); + } + #endif + } + else + { + pxTaskStatus->usStackHighWaterMark = 0; + } + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t * pxTaskStatusArray, + List_t * pxList, + eTaskState eState ) + { + configLIST_VOLATILE TCB_t * pxNextTCB; + configLIST_VOLATILE TCB_t * pxFirstTCB; + UBaseType_t uxTask = 0; + + if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + /* Populate an TaskStatus_t structure within the + * pxTaskStatusArray array for each task that is referenced from + * pxList. See the definition of TaskStatus_t in task.h for the + * meaning of each TaskStatus_t structure member. */ + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState ); + uxTask++; + } while( pxNextTCB != pxFirstTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) + + static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) + { + uint32_t ulCount = 0U; + + while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + ulCount++; + } + + ulCount /= ( uint32_t ) sizeof( StackType_t ); /*lint !e961 Casting is not redundant on smaller architectures. */ + + return ( configSTACK_DEPTH_TYPE ) ulCount; + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) + +/* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the + * same except for their return type. Using configSTACK_DEPTH_TYPE allows the + * user to determine the return type. It gets around the problem of the value + * overflowing on 8-bit types without breaking backward compatibility for + * applications that expect an 8-bit return type. */ + configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + uint8_t * pucEndOfStack; + configSTACK_DEPTH_TYPE uxReturn; + + /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are + * the same except for their return type. Using configSTACK_DEPTH_TYPE + * allows the user to determine the return type. It gets around the + * problem of the value overflowing on 8-bit types without breaking + * backward compatibility for applications that expect an 8-bit return + * type. */ + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = prvTaskCheckFreeStackSpace( pucEndOfStack ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark2 */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + + UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) + { + TCB_t * pxTCB; + uint8_t * pucEndOfStack; + UBaseType_t uxReturn; + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxStack; + } + #else + { + pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( TCB_t * pxTCB ) + { + /* This call is required specifically for the TriCore port. It must be + * above the vPortFree() calls. The call is also used by ports/demos that + * want to allocate and clean RAM statically. */ + portCLEAN_UP_TCB( pxTCB ); + + #if ( ( configUSE_NEWLIB_REENTRANT == 1 ) || ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) ) + { + /* Free up the memory allocated for the task's TLS Block. */ + configDEINIT_TLS_BLOCK( pxCurrentTCB->xTLSBlock ); + } + #endif + + #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) + { + /* The task can only have been allocated dynamically - free both + * the stack and TCB. */ + vPortFreeStack( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + #elif ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ + { + /* The task could have been allocated statically or dynamically, so + * check what was statically allocated before trying to free the + * memory. */ + if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) + { + /* Both the stack and TCB were allocated dynamically, so both + * must be freed. */ + vPortFreeStack( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) + { + /* Only the stack was statically allocated, so the TCB is the + * only memory that must be freed. */ + vPortFree( pxTCB ); + } + else + { + /* Neither the stack nor the TCB were allocated dynamically, so + * nothing needs to be freed. */ + configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +static void prvResetNextTaskUnblockTime( void ) +{ + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The new current delayed list is empty. Set xNextTaskUnblockTime to + * the maximum possible value so it is extremely unlikely that the + * if( xTickCount >= xNextTaskUnblockTime ) test will pass until + * there is an item in the delayed list. */ + xNextTaskUnblockTime = portMAX_DELAY; + } + else + { + /* The new current delayed list is not empty, get the value of + * the item at the head of the delayed list. This is the time at + * which the task at the head of the delayed list should be removed + * from the Blocked state. */ + xNextTaskUnblockTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxDelayedTaskList ); + } +} +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + + TaskHandle_t xTaskGetCurrentTaskHandle( void ) + { + TaskHandle_t xReturn; + + /* A critical section is not required as this is not called from + * an interrupt and the current TCB will always be the same for any + * individual execution thread. */ + xReturn = pxCurrentTCB; + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + BaseType_t xTaskGetSchedulerState( void ) + { + BaseType_t xReturn; + + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxMutexHolderTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + /* If the mutex was given back by an interrupt while the queue was + * locked then the mutex holder might now be NULL. _RB_ Is this still + * needed as interrupts can no longer use mutexes? */ + if( pxMutexHolder != NULL ) + { + /* If the holder of the mutex has a priority below the priority of + * the task attempting to obtain the mutex then it will temporarily + * inherit the priority of the task attempting to obtain the mutex. */ + if( pxMutexHolderTCB->uxPriority < pxCurrentTCB->uxPriority ) + { + /* Adjust the mutex holder state to account for its new + * priority. Only reset the event list item value if the value is + * not being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the task being modified is in the ready state it will need + * to be moved into a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Inherit the priority before being moved into the new list. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; + prvAddTaskToReadyList( pxMutexHolderTCB ); + } + else + { + /* Just inherit the priority. */ + pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority; + } + + traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB->uxPriority ); + + /* Inheritance occurred. */ + xReturn = pdTRUE; + } + else + { + if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB->uxPriority ) + { + /* The base priority of the mutex holder is lower than the + * priority of the task attempting to take the mutex, but the + * current priority of the mutex holder is not lower than the + * priority of the task attempting to take the mutex. + * Therefore the mutex holder must have already inherited a + * priority, but inheritance would have occurred if that had + * not been the case. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) + { + TCB_t * const pxTCB = pxMutexHolder; + BaseType_t xReturn = pdFALSE; + + if( pxMutexHolder != NULL ) + { + /* A task can only have an inherited priority if it holds the mutex. + * If the mutex is held by a task then it cannot be given from an + * interrupt, and if a mutex is given by the holding task then it must + * be the running state task. */ + configASSERT( pxTCB == pxCurrentTCB ); + configASSERT( pxTCB->uxMutexesHeld ); + ( pxTCB->uxMutexesHeld )--; + + /* Has the holder of the mutex inherited the priority of another + * task? */ + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* Only disinherit if no other mutexes are held. */ + if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 ) + { + /* A task can only have an inherited priority if it holds + * the mutex. If the mutex is held by a task then it cannot be + * given from an interrupt, and if a mutex is given by the + * holding task then it must be the running state task. Remove + * the holding task from the ready list. */ + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Disinherit the priority before adding the task into the + * new ready list. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + pxTCB->uxPriority = pxTCB->uxBasePriority; + + /* Reset the event list item value. It cannot be in use for + * any other purpose if this task is running, and it must be + * running to give back the mutex. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + prvAddTaskToReadyList( pxTCB ); + + /* Return true to indicate that a context switch is required. + * This is only actually required in the corner case whereby + * multiple mutexes were held and the mutexes were given back + * in an order different to that in which they were taken. + * If a context switch did not occur when the first mutex was + * returned, even if a task was waiting on it, then a context + * switch should occur when the last mutex is returned whether + * a task is waiting on it or not. */ + xReturn = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, + UBaseType_t uxHighestPriorityWaitingTask ) + { + TCB_t * const pxTCB = pxMutexHolder; + UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse; + const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1; + + if( pxMutexHolder != NULL ) + { + /* If pxMutexHolder is not NULL then the holder must hold at least + * one mutex. */ + configASSERT( pxTCB->uxMutexesHeld ); + + /* Determine the priority to which the priority of the task that + * holds the mutex should be set. This will be the greater of the + * holding task's base priority and the priority of the highest + * priority task that is waiting to obtain the mutex. */ + if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask ) + { + uxPriorityToUse = uxHighestPriorityWaitingTask; + } + else + { + uxPriorityToUse = pxTCB->uxBasePriority; + } + + /* Does the priority need to change? */ + if( pxTCB->uxPriority != uxPriorityToUse ) + { + /* Only disinherit if no other mutexes are held. This is a + * simplification in the priority inheritance implementation. If + * the task that holds the mutex is also holding other mutexes then + * the other mutexes may have caused the priority inheritance. */ + if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld ) + { + /* If a task has timed out because it already holds the + * mutex it was trying to obtain then it cannot of inherited + * its own priority. */ + configASSERT( pxTCB != pxCurrentTCB ); + + /* Disinherit the priority, remembering the previous + * priority to facilitate determining the subject task's + * state. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, uxPriorityToUse ); + uxPriorityUsedOnEntry = pxTCB->uxPriority; + pxTCB->uxPriority = uxPriorityToUse; + + /* Only reset the event list item value if the value is not + * being used for anything else. */ + if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == 0UL ) + { + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* If the running task is not the task that holds the mutex + * then the task that holds the mutex could be in either the + * Ready, Blocked or Suspended states. Only remove the task + * from its current state list if it is in the Ready state as + * the task's priority is going to change and there is one + * Ready list per priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* It is known that the task is in its ready list so + * there is no need to check again and the port level + * reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + prvAddTaskToReadyList( pxTCB ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB->uxCriticalNesting )++; + + /* This is not the interrupt safe version of the enter critical + * function so assert() if it is being called from an interrupt + * context. Only API functions that end in "FromISR" can be used in an + * interrupt. Only assert if the critical nesting count is 1 to + * protect against recursive calls if the assert function also uses a + * critical section. */ + if( pxCurrentTCB->uxCriticalNesting == 1 ) + { + portASSERT_IF_IN_ISR(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskExitCritical( void ) + { + if( xSchedulerRunning != pdFALSE ) + { + if( pxCurrentTCB->uxCriticalNesting > 0U ) + { + ( pxCurrentTCB->uxCriticalNesting )--; + + if( pxCurrentTCB->uxCriticalNesting == 0U ) + { + portENABLE_INTERRUPTS(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) + + static char * prvWriteNameToBuffer( char * pcBuffer, + const char * pcTaskName ) + { + size_t x; + + /* Start by copying the entire string. */ + strcpy( pcBuffer, pcTaskName ); + + /* Pad the end of the string with spaces to ensure columns line up when + * printed out. */ + for( x = strlen( pcBuffer ); x < ( size_t ) ( configMAX_TASK_NAME_LEN - 1 ); x++ ) + { + pcBuffer[ x ] = ' '; + } + + /* Terminate. */ + pcBuffer[ x ] = ( char ) 0x00; + + /* Return the new end of string. */ + return &( pcBuffer[ x ] ); + } + +#endif /* ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) + + void vTaskList( char * pcWriteBuffer ) + { + TaskStatus_t * pxTaskStatusArray; + UBaseType_t uxArraySize, x; + char cStatus; + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that + * displays task: names, states, priority, stack usage and task number. + * Stack usage specified as the number of unused StackType_t words stack can hold + * on top of stack - not the number of bytes. + * + * vTaskList() has a dependency on the sprintf() C library function that + * might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, + * and limited functionality implementation of sprintf() is provided in + * many of the FreeRTOS/Demo sub-directories in a file called + * printf-stdarg.c (note printf-stdarg.c does not provide a full + * snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskList(). + */ + + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + * function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! if + * configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + * equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); + + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + switch( pxTaskStatusArray[ x ].eCurrentState ) + { + case eRunning: + cStatus = tskRUNNING_CHAR; + break; + + case eReady: + cStatus = tskREADY_CHAR; + break; + + case eBlocked: + cStatus = tskBLOCKED_CHAR; + break; + + case eSuspended: + cStatus = tskSUSPENDED_CHAR; + break; + + case eDeleted: + cStatus = tskDELETED_CHAR; + break; + + case eInvalid: /* Fall through. */ + default: /* Should not get here, but it is included + * to prevent static checking errors. */ + cStatus = ( char ) 0x00; + break; + } + + /* Write the task name to the string, padding with spaces so it + * can be printed in tabular form more easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + /* Write the rest of the string. */ + sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + * is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configUSE_TRACE_FACILITY == 1 ) ) + + void vTaskGetRunTimeStats( char * pcWriteBuffer ) + { + TaskStatus_t * pxTaskStatusArray; + UBaseType_t uxArraySize, x; + configRUN_TIME_COUNTER_TYPE ulTotalTime, ulStatsAsPercentage; + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part + * of the uxTaskGetSystemState() output into a human readable table that + * displays the amount of time each task has spent in the Running state + * in both absolute and percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library + * function that might bloat the code size, use a lot of stack, and + * provide different results on different platforms. An alternative, + * tiny, third party, and limited functionality implementation of + * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in + * a file called printf-stdarg.c (note printf-stdarg.c does not provide + * a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskGetRunTimeStats(). + */ + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = ( char ) 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + * function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. NOTE! If + * configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will + * equate to NULL. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */ + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); + + /* For percentage calculations. */ + ulTotalTime /= 100UL; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > 0UL ) + { + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + /* What percentage of the total run time has the task used? + * This will always be rounded down to the nearest integer. + * ulTotalRunTime has already been divided by 100. */ + ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; + + /* Write the task name to the string, padding with + * spaces so it can be printed in tabular form more + * easily. */ + pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); + + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + * printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + } + #endif + } + else + { + /* If the percentage is zero here then the task has + * consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( pcWriteBuffer, "\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + * printf() library can be used. */ + sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */ + } + #endif + } + + pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers especially as in this case where it best denotes the intent of the code. */ + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + /* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION + * is 0 then vPortFree() will be #defined to nothing. */ + vPortFree( pxTaskStatusArray ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + +#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */ +/*-----------------------------------------------------------*/ + +TickType_t uxTaskResetEventItemValue( void ) +{ + TickType_t uxReturn; + + uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ) ); + + /* Reset the event list item to its normal value - so it can be used with + * queues and semaphores. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + TaskHandle_t pvTaskIncrementMutexHeldCount( void ) + { + /* If xSemaphoreCreateMutex() is called before any tasks have been created + * then pxCurrentTCB will be NULL. */ + if( pxCurrentTCB != NULL ) + { + ( pxCurrentTCB->uxMutexesHeld )++; + } + + return pxCurrentTCB; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWait, + BaseType_t xClearCountOnExit, + TickType_t xTicksToWait ) + { + uint32_t ulReturn; + + configASSERT( uxIndexToWait < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + taskENTER_CRITICAL(); + { + /* Only block if the notification count is not already non-zero. */ + if( pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] == 0UL ) + { + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait ); + + /* All ports are written to allow a yield in a critical + * section (some will yield immediately, others wait until the + * critical section exits) - but it is not something that + * application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_TAKE( uxIndexToWait ); + ulReturn = pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ]; + + if( ulReturn != 0UL ) + { + if( xClearCountOnExit != pdFALSE ) + { + pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] = 0UL; + } + else + { + pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] = ulReturn - ( uint32_t ) 1; + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWait, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait ) + { + BaseType_t xReturn; + + configASSERT( uxIndexToWait < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + taskENTER_CRITICAL(); + { + /* Only block if a notification is not already pending. */ + if( pxCurrentTCB->ucNotifyState[ uxIndexToWait ] != taskNOTIFICATION_RECEIVED ) + { + /* Clear bits in the task's notification value as bits may get + * set by the notifying task or interrupt. This can be used to + * clear the value to zero. */ + pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] &= ~ulBitsToClearOnEntry; + + /* Mark this task as waiting for a notification. */ + pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskWAITING_NOTIFICATION; + + if( xTicksToWait > ( TickType_t ) 0 ) + { + prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE ); + traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWait ); + + /* All ports are written to allow a yield in a critical + * section (some will yield immediately, others wait until the + * critical section exits) - but it is not something that + * application code should ever do. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + traceTASK_NOTIFY_WAIT( uxIndexToWait ); + + if( pulNotificationValue != NULL ) + { + /* Output the current notification value, which may or may not + * have changed. */ + *pulNotificationValue = pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ]; + } + + /* If ucNotifyValue is set then either the task never entered the + * blocked state (because a notification was already pending) or the + * task unblocked because of a notification. Otherwise the task + * unblocked because of a timeout. */ + if( pxCurrentTCB->ucNotifyState[ uxIndexToWait ] != taskNOTIFICATION_RECEIVED ) + { + /* A notification was not received. */ + xReturn = pdFALSE; + } + else + { + /* A notification was already pending or a notification was + * received while the task was waiting. */ + pxCurrentTCB->ulNotifiedValue[ uxIndexToWait ] &= ~ulBitsToClearOnExit; + xReturn = pdTRUE; + } + + pxCurrentTCB->ucNotifyState[ uxIndexToWait ] = taskNOT_WAITING_NOTIFICATION; + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue ) + { + TCB_t * pxTCB; + BaseType_t xReturn = pdPASS; + uint8_t ucOriginalNotifyState; + + configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + configASSERT( xTaskToNotify ); + pxTCB = xTaskToNotify; + + taskENTER_CRITICAL(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue[ uxIndexToNotify ]; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ]; + + pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] |= ulValue; + break; + + case eIncrement: + ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++; + break; + + case eSetValueWithOverwrite: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + break; + + case eSetValueWithoutOverwrite: + + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + + break; + + case eNoAction: + + /* The task is being notified without its notify value being + * updated. */ + break; + + default: + + /* Should not get here if all enums are handled. + * Artificially force an assert by testing a value the + * compiler can't assume is const. */ + configASSERT( xTickCount == ( TickType_t ) 0 ); + + break; + } + + traceTASK_NOTIFY( uxIndexToNotify ); + + /* If the task is in the blocked state specifically to wait for a + * notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + /* If a task is blocked waiting for a notification then + * xNextTaskUnblockTime might be set to the blocked task's time + * out time. If the task is unblocked for a reason other than + * a timeout xNextTaskUnblockTime is normally left unchanged, + * because it will automatically get reset to a new value when + * the tick count equals xNextTaskUnblockTime. However if + * tickless idling is used it might be more important to enter + * sleep mode at the earliest possible time - so reset + * xNextTaskUnblockTime here to ensure it is updated at the + * earliest possible time. */ + prvResetNextTaskUnblockTime(); + } + #endif + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + * executing task so a yield is required. */ + taskYIELD_IF_USING_PREEMPTION(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue, + BaseType_t * pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + BaseType_t xReturn = pdPASS; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( pulPreviousNotificationValue != NULL ) + { + *pulPreviousNotificationValue = pxTCB->ulNotifiedValue[ uxIndexToNotify ]; + } + + ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ]; + pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED; + + switch( eAction ) + { + case eSetBits: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] |= ulValue; + break; + + case eIncrement: + ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++; + break; + + case eSetValueWithOverwrite: + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + break; + + case eSetValueWithoutOverwrite: + + if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED ) + { + pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue; + } + else + { + /* The value could not be written to the task. */ + xReturn = pdFAIL; + } + + break; + + case eNoAction: + + /* The task is being notified without its notify value being + * updated. */ + break; + + default: + + /* Should not get here if all enums are handled. + * Artificially force an assert by testing a value the + * compiler can't assume is const. */ + configASSERT( xTickCount == ( TickType_t ) 0 ); + break; + } + + traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify ); + + /* If the task is in the blocked state specifically to wait for a + * notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + * this task pending until the scheduler is resumed. */ + listINSERT_END( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + * executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + + /* Mark that a yield is pending in case the user is not + * using the "xHigherPriorityTaskWoken" parameter to an ISR + * safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + BaseType_t * pxHigherPriorityTaskWoken ) + { + TCB_t * pxTCB; + uint8_t ucOriginalNotifyState; + UBaseType_t uxSavedInterruptStatus; + + configASSERT( xTaskToNotify ); + configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* RTOS ports that support interrupt nesting have the concept of a + * maximum system call (or maximum API call) interrupt priority. + * Interrupts that are above the maximum system call priority are keep + * permanently enabled, even when the RTOS kernel is in a critical section, + * but cannot make any calls to FreeRTOS API functions. If configASSERT() + * is defined in FreeRTOSConfig.h then + * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + * failure if a FreeRTOS API function is called from an interrupt that has + * been assigned a priority above the configured maximum system call + * priority. Only FreeRTOS functions that end in FromISR can be called + * from interrupts that have been assigned a priority at or (logically) + * below the maximum system call interrupt priority. FreeRTOS maintains a + * separate interrupt safe API to ensure interrupt entry is as fast and as + * simple as possible. More information (albeit Cortex-M specific) is + * provided on the following link: + * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + pxTCB = xTaskToNotify; + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ]; + pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED; + + /* 'Giving' is equivalent to incrementing a count in a counting + * semaphore. */ + ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++; + + traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify ); + + /* If the task is in the blocked state specifically to wait for a + * notification then unblock it now. */ + if( ucOriginalNotifyState == taskWAITING_NOTIFICATION ) + { + /* The task should not have been on an event list. */ + configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ); + + if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) + { + listREMOVE_ITEM( &( pxTCB->xStateListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* The delayed and ready lists cannot be accessed, so hold + * this task pending until the scheduler is resumed. */ + listINSERT_END( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + + if( pxTCB->uxPriority > pxCurrentTCB->uxPriority ) + { + /* The notified task has a priority above the currently + * executing task so a yield is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + + /* Mark that a yield is pending in case the user is not + * using the "xHigherPriorityTaskWoken" parameter in an ISR + * safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + BaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear ) + { + TCB_t * pxTCB; + BaseType_t xReturn; + + configASSERT( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES ); + + /* If null is passed in here then it is the calling task that is having + * its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + if( pxTCB->ucNotifyState[ uxIndexToClear ] == taskNOTIFICATION_RECEIVED ) + { + pxTCB->ucNotifyState[ uxIndexToClear ] = taskNOT_WAITING_NOTIFICATION; + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TASK_NOTIFICATIONS == 1 ) + + uint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask, + UBaseType_t uxIndexToClear, + uint32_t ulBitsToClear ) + { + TCB_t * pxTCB; + uint32_t ulReturn; + + /* If null is passed in here then it is the calling task that is having + * its notification state cleared. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + taskENTER_CRITICAL(); + { + /* Return the notification as it was before the bits were cleared, + * then clear the bit mask. */ + ulReturn = pxTCB->ulNotifiedValue[ uxIndexToClear ]; + pxTCB->ulNotifiedValue[ uxIndexToClear ] &= ~ulBitsToClear; + } + taskEXIT_CRITICAL(); + + return ulReturn; + } + +#endif /* configUSE_TASK_NOTIFICATIONS */ +/*-----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + + configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ) + { + return xIdleTaskHandle->ulRunTimeCounter; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) + + configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ) + { + configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn; + + ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE(); + + /* For percentage calculations. */ + ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 ) + { + ulReturn = xIdleTaskHandle->ulRunTimeCounter / ulTotalTime; + } + else + { + ulReturn = 0; + } + + return ulReturn; + } + +#endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */ +/*-----------------------------------------------------------*/ + +static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, + const BaseType_t xCanBlockIndefinitely ) +{ + TickType_t xTimeToWake; + const TickType_t xConstTickCount = xTickCount; + + #if ( INCLUDE_xTaskAbortDelay == 1 ) + { + /* About to enter a delayed list, so ensure the ucDelayAborted flag is + * reset to pdFALSE so it can be detected as having been set to pdTRUE + * when the task leaves the Blocked state. */ + pxCurrentTCB->ucDelayAborted = pdFALSE; + } + #endif + + /* Remove the task from the ready list before adding it to the blocked list + * as the same list item is used for both lists. */ + if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + * check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB cannot change as it is the calling task. pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) ) + { + /* Add the task to the suspended task list instead of a delayed task + * list to ensure it is not woken by a timing event. It will block + * indefinitely. */ + listINSERT_END( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event + * does not occur. This may overflow but this doesn't matter, the + * kernel will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow + * list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list + * is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the + * head of the list of blocked tasks then xNextTaskUnblockTime + * needs to be updated too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be woken if the event + * does not occur. This may overflow but this doesn't matter, the kernel + * will manage it correctly. */ + xTimeToWake = xConstTickCount + xTicksToWait; + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); + + if( xTimeToWake < xConstTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + } + else + { + /* The wake time has not overflowed, so the current block list is used. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); + + /* If the task entering the blocked state was placed at the head of the + * list of blocked tasks then xNextTaskUnblockTime needs to be updated + * too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + + /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */ + ( void ) xCanBlockIndefinitely; + } + #endif /* INCLUDE_vTaskSuspend */ +} + +/* Code below here allows additional code to be inserted into this source file, + * especially where access to file scope functions and data is needed (for example + * when performing module tests). */ + +#ifdef FREERTOS_MODULE_TEST + #include "tasks_test_access_functions.h" +#endif + + +#if ( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) + + #include "freertos_tasks_c_additions.h" + + #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT + static void freertos_tasks_c_additions_init( void ) + { + FREERTOS_TASKS_C_ADDITIONS_INIT(); + } + #endif + +#endif /* if ( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/timers.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/timers.c new file mode 100644 index 0000000..800a2b8 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/timers.c @@ -0,0 +1,1124 @@ +/* + * FreeRTOS Kernel V10.5.1 + * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining + * all the API functions to use the MPU wrappers. That should only be done when + * task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" + +#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) + #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. +#endif + +/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified + * because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined + * for the header files above, but not in this file, in order to generate the + * correct privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e9021 !e961 !e750. */ + + +/* This entire source file will be skipped if the application is not configured + * to include software timer functionality. This #if is closed at the very bottom + * of this file. If you want to include software timer functionality then ensure + * configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#if ( configUSE_TIMERS == 1 ) + +/* Misc definitions. */ + #define tmrNO_DELAY ( ( TickType_t ) 0U ) + #define tmrMAX_TIME_BEFORE_OVERFLOW ( ( TickType_t ) -1 ) + +/* The name assigned to the timer service task. This can be overridden by + * defining trmTIMER_SERVICE_TASK_NAME in FreeRTOSConfig.h. */ + #ifndef configTIMER_SERVICE_TASK_NAME + #define configTIMER_SERVICE_TASK_NAME "Tmr Svc" + #endif + +/* Bit definitions used in the ucStatus member of a timer structure. */ + #define tmrSTATUS_IS_ACTIVE ( ( uint8_t ) 0x01 ) + #define tmrSTATUS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 0x02 ) + #define tmrSTATUS_IS_AUTORELOAD ( ( uint8_t ) 0x04 ) + +/* The definition of the timers themselves. */ + typedef struct tmrTimerControl /* The old naming convention is used to prevent breaking kernel aware debuggers. */ + { + const char * pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + ListItem_t xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + TickType_t xTimerPeriodInTicks; /*<< How quickly and often the timer expires. */ + void * pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + TimerCallbackFunction_t pxCallbackFunction; /*<< The function that will be called when the timer expires. */ + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxTimerNumber; /*<< An ID assigned by trace tools such as FreeRTOS+Trace */ + #endif + uint8_t ucStatus; /*<< Holds bits to say if the timer was statically allocated or not, and if it is active or not. */ + } xTIMER; + +/* The old xTIMER name is maintained above then typedefed to the new Timer_t + * name below to enable the use of older kernel aware debuggers. */ + typedef xTIMER Timer_t; + +/* The definition of messages that can be sent and received on the timer queue. + * Two types of message can be queued - messages that manipulate a software timer, + * and messages that request the execution of a non-timer related callback. The + * two message types are defined in two separate structures, xTimerParametersType + * and xCallbackParametersType respectively. */ + typedef struct tmrTimerParameters + { + TickType_t xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + Timer_t * pxTimer; /*<< The timer to which the command will be applied. */ + } TimerParameter_t; + + + typedef struct tmrCallbackParameters + { + PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */ + void * pvParameter1; /* << The value that will be used as the callback functions first parameter. */ + uint32_t ulParameter2; /* << The value that will be used as the callback functions second parameter. */ + } CallbackParameters_t; + +/* The structure that contains the two message types, along with an identifier + * that is used to determine which message type is valid. */ + typedef struct tmrTimerQueueMessage + { + BaseType_t xMessageID; /*<< The command being sent to the timer service task. */ + union + { + TimerParameter_t xTimerParameters; + + /* Don't include xCallbackParameters if it is not going to be used as + * it makes the structure (and therefore the timer queue) larger. */ + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + CallbackParameters_t xCallbackParameters; + #endif /* INCLUDE_xTimerPendFunctionCall */ + } u; + } DaemonTaskMessage_t; + +/*lint -save -e956 A manual analysis and inspection has been used to determine + * which static variables must be declared volatile. */ + +/* The list in which active timers are stored. Timers are referenced in expire + * time order, with the nearest expiry time at the front of the list. Only the + * timer service task is allowed to access these lists. + * xActiveTimerList1 and xActiveTimerList2 could be at function scope but that + * breaks some kernel aware debuggers, and debuggers that reply on removing the + * static qualifier. */ + PRIVILEGED_DATA static List_t xActiveTimerList1; + PRIVILEGED_DATA static List_t xActiveTimerList2; + PRIVILEGED_DATA static List_t * pxCurrentTimerList; + PRIVILEGED_DATA static List_t * pxOverflowTimerList; + +/* A queue that is used to send commands to the timer service task. */ + PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL; + PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL; + +/*lint -restore */ + +/*-----------------------------------------------------------*/ + +/* + * Initialise the infrastructure used by the timer service task if it has not + * been initialised already. + */ + static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + +/* + * The timer service task (daemon). Timer functionality is controlled by this + * task. Other tasks communicate with the timer service task using the + * xTimerQueue queue. + */ + static portTASK_FUNCTION_PROTO( prvTimerTask, pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Called by the timer service task to interpret and process a command it + * received on the timer queue. + */ + static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + +/* + * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, + * depending on if the expire time causes a timer counter overflow. + */ + static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, + const TickType_t xNextExpiryTime, + const TickType_t xTimeNow, + const TickType_t xCommandTime ) PRIVILEGED_FUNCTION; + +/* + * Reload the specified auto-reload timer. If the reloading is backlogged, + * clear the backlog, calling the callback for each additional reload. When + * this function returns, the next expiry time is after xTimeNow. + */ + static void prvReloadTimer( Timer_t * const pxTimer, + TickType_t xExpiredTime, + const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * An active timer has reached its expire time. Reload the timer if it is an + * auto-reload timer, then call its callback. + */ + static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, + const TickType_t xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * The tick count has overflowed. Switch the timer lists after ensuring the + * current timer list does not still reference some timers. + */ + static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION; + +/* + * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE + * if a tick count overflow occurred since prvSampleTimeNow() was last called. + */ + static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + +/* + * If the timer list contains any active timers then return the expire time of + * the timer that will expire first and set *pxListWasEmpty to false. If the + * timer list does not contain any timers then return 0 and set *pxListWasEmpty + * to pdTRUE. + */ + static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * If a timer has expired, process it. Otherwise, block the timer service task + * until either a timer does expire or a command is received. + */ + static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, + BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * Called after a Timer_t structure has been allocated either statically or + * dynamically to fill in the structure's members. + */ + static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t * pxNewTimer ) PRIVILEGED_FUNCTION; +/*-----------------------------------------------------------*/ + + BaseType_t xTimerCreateTimerTask( void ) + { + BaseType_t xReturn = pdFAIL; + + /* This function is called when the scheduler is started if + * configUSE_TIMERS is set to 1. Check that the infrastructure used by the + * timer service task has been created/initialised. If timers have already + * been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); + + if( xTimerQueue != NULL ) + { + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + StaticTask_t * pxTimerTaskTCBBuffer = NULL; + StackType_t * pxTimerTaskStackBuffer = NULL; + uint32_t ulTimerTaskStackSize; + + vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize ); + xTimerTaskHandle = xTaskCreateStatic( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + ulTimerTaskStackSize, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + pxTimerTaskStackBuffer, + pxTimerTaskTCBBuffer ); + + if( xTimerTaskHandle != NULL ) + { + xReturn = pdPASS; + } + } + #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + { + xReturn = xTaskCreate( prvTimerTask, + configTIMER_SERVICE_TASK_NAME, + configTIMER_TASK_STACK_DEPTH, + NULL, + ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, + &xTimerTaskHandle ); + } + #endif /* configSUPPORT_STATIC_ALLOCATION */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + configASSERT( xReturn ); + return xReturn; + } +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreate( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction ) + { + Timer_t * pxNewTimer; + + pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of Timer_t is always a pointer to the timer's mame. */ + + if( pxNewTimer != NULL ) + { + /* Status is thus far zero as the timer is not created statically + * and has not been started. The auto-reload bit may get set in + * prvInitialiseNewTimer. */ + pxNewTimer->ucStatus = 0x00; + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } + + return pxNewTimer; + } + + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + + TimerHandle_t xTimerCreateStatic( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + StaticTimer_t * pxTimerBuffer ) + { + Timer_t * pxNewTimer; + + #if ( configASSERT_DEFINED == 1 ) + { + /* Sanity check that the size of the structure used to declare a + * variable of type StaticTimer_t equals the size of the real timer + * structure. */ + volatile size_t xSize = sizeof( StaticTimer_t ); + configASSERT( xSize == sizeof( Timer_t ) ); + ( void ) xSize; /* Keeps lint quiet when configASSERT() is not defined. */ + } + #endif /* configASSERT_DEFINED */ + + /* A pointer to a StaticTimer_t structure MUST be provided, use it. */ + configASSERT( pxTimerBuffer ); + pxNewTimer = ( Timer_t * ) pxTimerBuffer; /*lint !e740 !e9087 StaticTimer_t is a pointer to a Timer_t, so guaranteed to be aligned and sized correctly (checked by an assert()), so this is safe. */ + + if( pxNewTimer != NULL ) + { + /* Timers can be created statically or dynamically so note this + * timer was created statically in case it is later deleted. The + * auto-reload bit may get set in prvInitialiseNewTimer(). */ + pxNewTimer->ucStatus = tmrSTATUS_IS_STATICALLY_ALLOCATED; + + prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer ); + } + + return pxNewTimer; + } + + #endif /* configSUPPORT_STATIC_ALLOCATION */ +/*-----------------------------------------------------------*/ + + static void prvInitialiseNewTimer( const char * const pcTimerName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + const TickType_t xTimerPeriodInTicks, + const BaseType_t xAutoReload, + void * const pvTimerID, + TimerCallbackFunction_t pxCallbackFunction, + Timer_t * pxNewTimer ) + { + /* 0 is not a valid value for xTimerPeriodInTicks. */ + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + + /* Ensure the infrastructure used by the timer service task has been + * created/initialised. */ + prvCheckForValidListAndQueue(); + + /* Initialise the timer structure members using the function + * parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + + if( xAutoReload != pdFALSE ) + { + pxNewTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; + } + + traceTIMER_CREATE( pxNewTimer ); + } +/*-----------------------------------------------------------*/ + + BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, + const BaseType_t xCommandID, + const TickType_t xOptionalValue, + BaseType_t * const pxHigherPriorityTaskWoken, + const TickType_t xTicksToWait ) + { + BaseType_t xReturn = pdFAIL; + DaemonTaskMessage_t xMessage; + + configASSERT( xTimer ); + + /* Send a message to the timer service task to perform a particular action + * on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; + xMessage.u.xTimerParameters.pxTimer = xTimer; + + if( xCommandID < tmrFIRST_FROM_ISR_COMMAND ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + else + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + return xReturn; + } +/*-----------------------------------------------------------*/ + + TaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) + { + /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been + * started, then xTimerTaskHandle will be NULL. */ + configASSERT( ( xTimerTaskHandle != NULL ) ); + return xTimerTaskHandle; + } +/*-----------------------------------------------------------*/ + + TickType_t xTimerGetPeriod( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + + configASSERT( xTimer ); + return pxTimer->xTimerPeriodInTicks; + } +/*-----------------------------------------------------------*/ + + void vTimerSetReloadMode( TimerHandle_t xTimer, + const BaseType_t xAutoReload ) + { + Timer_t * pxTimer = xTimer; + + configASSERT( xTimer ); + taskENTER_CRITICAL(); + { + if( xAutoReload != pdFALSE ) + { + pxTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD; + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_AUTORELOAD ); + } + } + taskEXIT_CRITICAL(); + } +/*-----------------------------------------------------------*/ + + BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + BaseType_t xReturn; + + configASSERT( xTimer ); + taskENTER_CRITICAL(); + { + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0 ) + { + /* Not an auto-reload timer. */ + xReturn = pdFALSE; + } + else + { + /* Is an auto-reload timer. */ + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } + + UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) + { + return ( UBaseType_t ) xTimerGetReloadMode( xTimer ); + } +/*-----------------------------------------------------------*/ + + TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) + { + Timer_t * pxTimer = xTimer; + TickType_t xReturn; + + configASSERT( xTimer ); + xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) ); + return xReturn; + } +/*-----------------------------------------------------------*/ + + const char * pcTimerGetName( TimerHandle_t xTimer ) /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ + { + Timer_t * pxTimer = xTimer; + + configASSERT( xTimer ); + return pxTimer->pcTimerName; + } +/*-----------------------------------------------------------*/ + + static void prvReloadTimer( Timer_t * const pxTimer, + TickType_t xExpiredTime, + const TickType_t xTimeNow ) + { + /* Insert the timer into the appropriate list for the next expiry time. + * If the next expiry time has already passed, advance the expiry time, + * call the callback function, and try again. */ + while( prvInsertTimerInActiveList( pxTimer, ( xExpiredTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xExpiredTime ) != pdFALSE ) + { + /* Advance the expiry time. */ + xExpiredTime += pxTimer->xTimerPeriodInTicks; + + /* Call the timer callback. */ + traceTIMER_EXPIRED( pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } + } +/*-----------------------------------------------------------*/ + + static void prvProcessExpiredTimer( const TickType_t xNextExpireTime, + const TickType_t xTimeNow ) + { + Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); /*lint !e9087 !e9079 void * is used as this macro is used with tasks and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ + + /* Remove the timer from the list of active timers. A check has already + * been performed to ensure the list is not empty. */ + + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + + /* If the timer is an auto-reload timer then calculate the next + * expiry time and re-insert the timer in the list of active timers. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + prvReloadTimer( pxTimer, xNextExpireTime, xTimeNow ); + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + + /* Call the timer callback. */ + traceTIMER_EXPIRED( pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } +/*-----------------------------------------------------------*/ + + static portTASK_FUNCTION( prvTimerTask, pvParameters ) + { + TickType_t xNextExpireTime; + BaseType_t xListWasEmpty; + + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; + + #if ( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 ) + { + extern void vApplicationDaemonTaskStartupHook( void ); + + /* Allow the application writer to execute some code in the context of + * this task at the point the task starts executing. This is useful if the + * application includes initialisation code that would benefit from + * executing after the scheduler has been started. */ + vApplicationDaemonTaskStartupHook(); + } + #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */ + + for( ; ; ) + { + /* Query the timers list to see if it contains any timers, and if so, + * obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + + /* If a timer has expired, process it. Otherwise, block this task + * until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } + } +/*-----------------------------------------------------------*/ + + static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime, + BaseType_t xListWasEmpty ) + { + TickType_t xTimeNow; + BaseType_t xTimerListsWereSwitched; + + vTaskSuspendAll(); + { + /* Obtain the time now to make an assessment as to whether the timer + * has expired or not. If obtaining the time causes the lists to switch + * then don't process this timer as any timers that remained in the list + * when the lists were switched will have been processed within the + * prvSampleTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + ( void ) xTaskResumeAll(); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + * time has not been reached yet. This task should therefore + * block to wait for the next expire time or a command to be + * received - whichever comes first. The following line cannot + * be reached unless xNextExpireTime > xTimeNow, except in the + * case when the current timer list is empty. */ + if( xListWasEmpty != pdFALSE ) + { + /* The current timer list is empty - is the overflow list + * also empty? */ + xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList ); + } + + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty ); + + if( xTaskResumeAll() == pdFALSE ) + { + /* Yield to wait for either a command to arrive, or the + * block time to expire. If a command arrived between the + * critical section being exited and this yield then the yield + * will not cause the task to block. */ + portYIELD_WITHIN_API(); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + } + else + { + ( void ) xTaskResumeAll(); + } + } + } +/*-----------------------------------------------------------*/ + + static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) + { + TickType_t xNextExpireTime; + + /* Timers are listed in expiry time order, with the head of the list + * referencing the task that will expire first. Obtain the time at which + * the timer with the nearest expiry time will expire. If there are no + * active timers then just set the next expire time to 0. That will cause + * this task to unblock when the tick count overflows, at which point the + * timer lists will be switched and the next expiry time can be + * re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( TickType_t ) 0U; + } + + return xNextExpireTime; + } +/*-----------------------------------------------------------*/ + + static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) + { + TickType_t xTimeNow; + PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U; /*lint !e956 Variable is only accessible to one task. */ + + xTimeNow = xTaskGetTickCount(); + + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists(); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } + + xLastTime = xTimeNow; + + return xTimeNow; + } +/*-----------------------------------------------------------*/ + + static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer, + const TickType_t xNextExpiryTime, + const TickType_t xTimeNow, + const TickType_t xCommandTime ) + { + BaseType_t xProcessTimerNow = pdFALSE; + + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + * timer was issued, and the time the command was processed? */ + if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks ) /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + { + /* The time between a command being issued and the command being + * processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + * but the expiry time has not, then the timer must have already passed + * its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } + + return xProcessTimerNow; + } +/*-----------------------------------------------------------*/ + + static void prvProcessReceivedCommands( void ) + { + DaemonTaskMessage_t xMessage; + Timer_t * pxTimer; + BaseType_t xTimerListsWereSwitched; + TickType_t xTimeNow; + + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ + { + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + { + /* Negative commands are pended function calls rather than timer + * commands. */ + if( xMessage.xMessageID < ( BaseType_t ) 0 ) + { + const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters ); + + /* The timer uses the xCallbackParameters member to request a + * callback be executed. Check the callback is not NULL. */ + configASSERT( pxCallback ); + + /* Call the function. */ + pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* INCLUDE_xTimerPendFunctionCall */ + + /* Commands that are positive are timer commands rather than pended + * function calls. */ + if( xMessage.xMessageID >= ( BaseType_t ) 0 ) + { + /* The messages uses the xTimerParameters member to work on a + * software timer. */ + pxTimer = xMessage.u.xTimerParameters.pxTimer; + + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) /*lint !e961. The cast is only redundant when NULL is passed into the macro. */ + { + /* The timer is in a list, remove it. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue ); + + /* In this case the xTimerListsWereSwitched parameter is not used, but + * it must be present in the function call. prvSampleTimeNow() must be + * called after the message is received from xTimerQueue so there is no + * possibility of a higher priority task adding a message to the message + * queue with a time that is ahead of the timer daemon task (because it + * pre-empted the timer daemon task after the xTimeNow value was set). */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START: + case tmrCOMMAND_START_FROM_ISR: + case tmrCOMMAND_RESET: + case tmrCOMMAND_RESET_FROM_ISR: + /* Start or restart a timer. */ + pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; + + if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE ) + { + /* The timer expired before it was added to the active + * timer list. Process it now. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 ) + { + prvReloadTimer( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow ); + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + + /* Call the timer callback. */ + traceTIMER_EXPIRED( pxTimer ); + pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + + break; + + case tmrCOMMAND_STOP: + case tmrCOMMAND_STOP_FROM_ISR: + /* The timer has already been removed from the active list. */ + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + break; + + case tmrCOMMAND_CHANGE_PERIOD: + case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR: + pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE; + pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + + /* The new period does not really have a reference, and can + * be longer or shorter than the old one. The command time is + * therefore set to the current time, and as the period cannot + * be zero the next expiry time can only be in the future, + * meaning (unlike for the xTimerStart() case above) there is + * no fail case that needs to be handled here. */ + ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE: + #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) + { + /* The timer has already been removed from the active list, + * just free up the memory if the memory was dynamically + * allocated. */ + if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 ) + { + vPortFree( pxTimer ); + } + else + { + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + } + #else /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */ + { + /* If dynamic allocation is not enabled, the memory + * could not have been dynamically allocated. So there is + * no need to free the memory - just mark the timer as + * "not active". */ + pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE ); + } + #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ + break; + + default: + /* Don't expect to get here. */ + break; + } + } + } + } +/*-----------------------------------------------------------*/ + + static void prvSwitchTimerLists( void ) + { + TickType_t xNextExpireTime; + List_t * pxTemp; + + /* The tick count has overflowed. The timer lists must be switched. + * If there are any timers still referenced from the current timer list + * then they must have expired and should be processed before the lists + * are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Process the expired timer. For auto-reload timers, be careful to + * process only expirations that occur on the current list. Further + * expirations must wait until after the lists are switched. */ + prvProcessExpiredTimer( xNextExpireTime, tmrMAX_TIME_BEFORE_OVERFLOW ); + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; + } +/*-----------------------------------------------------------*/ + + static void prvCheckForValidListAndQueue( void ) + { + /* Check that the list from which active timers are referenced, and the + * queue used to communicate with the timer service, have been + * initialised. */ + taskENTER_CRITICAL(); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; + + #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) + { + /* The timer queue is allocated statically in case + * configSUPPORT_DYNAMIC_ALLOCATION is 0. */ + PRIVILEGED_DATA static StaticQueue_t xStaticTimerQueue; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ + PRIVILEGED_DATA static uint8_t ucStaticTimerQueueStorage[ ( size_t ) configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ]; /*lint !e956 Ok to declare in this manner to prevent additional conditional compilation guards in other locations. */ + + xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue ); + } + #else + { + xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, sizeof( DaemonTaskMessage_t ) ); + } + #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */ + + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + if( xTimerQueue != NULL ) + { + vQueueAddToRegistry( xTimerQueue, "TmrQ" ); + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + #endif /* configQUEUE_REGISTRY_SIZE */ + } + else + { + mtCOVERAGE_TEST_MARKER(); + } + } + taskEXIT_CRITICAL(); + } +/*-----------------------------------------------------------*/ + + BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) + { + BaseType_t xReturn; + Timer_t * pxTimer = xTimer; + + configASSERT( xTimer ); + + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL(); + { + if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0 ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; + } /*lint !e818 Can't be pointer to const due to the typedef. */ +/*-----------------------------------------------------------*/ + + void * pvTimerGetTimerID( const TimerHandle_t xTimer ) + { + Timer_t * const pxTimer = xTimer; + void * pvReturn; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pvReturn = pxTimer->pvTimerID; + } + taskEXIT_CRITICAL(); + + return pvReturn; + } +/*-----------------------------------------------------------*/ + + void vTimerSetTimerID( TimerHandle_t xTimer, + void * pvNewID ) + { + Timer_t * const pxTimer = xTimer; + + configASSERT( xTimer ); + + taskENTER_CRITICAL(); + { + pxTimer->pvTimerID = pvNewID; + } + taskEXIT_CRITICAL(); + } +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + BaseType_t * pxHigherPriorityTaskWoken ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* Complete the message with the function parameters and post it to the + * daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + + tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + + #endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + + #if ( INCLUDE_xTimerPendFunctionCall == 1 ) + + BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, + void * pvParameter1, + uint32_t ulParameter2, + TickType_t xTicksToWait ) + { + DaemonTaskMessage_t xMessage; + BaseType_t xReturn; + + /* This function can only be called after a timer has been created or + * after the scheduler has been started because, until then, the timer + * queue does not exist. */ + configASSERT( xTimerQueue ); + + /* Complete the message with the function parameters and post it to the + * daemon task. */ + xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK; + xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; + xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; + xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; + + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait ); + + tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn ); + + return xReturn; + } + + #endif /* INCLUDE_xTimerPendFunctionCall */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + + UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) + { + return ( ( Timer_t * ) xTimer )->uxTimerNumber; + } + + #endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + + #if ( configUSE_TRACE_FACILITY == 1 ) + + void vTimerSetTimerNumber( TimerHandle_t xTimer, + UBaseType_t uxTimerNumber ) + { + ( ( Timer_t * ) xTimer )->uxTimerNumber = uxTimerNumber; + } + + #endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +/* This entire source file will be skipped if the application is not configured + * to include software timer functionality. If you want to include software timer + * functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#endif /* configUSE_TIMERS == 1 */ From 8ad3d7075a05538413c07d3eeee43bcc57e6ab55 Mon Sep 17 00:00:00 2001 From: Olivia Linden Date: Sat, 18 Mar 2023 18:29:54 +0100 Subject: [PATCH 3/7] add readme file --- .../README.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/README.md b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/README.md new file mode 100644 index 0000000..4ffdb2b --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/README.md @@ -0,0 +1,26 @@ +# README +This project is an embedded system designed to control a LED to blink using a FreeRTOS on Stm32 microcontroller board. + +# Hardware Requirements +The following components are required to build the project: + +STM32F446 Nucleao-64 board + +# Software Requirements +STM32CubeIDE 1.11.2 + +# Installation + +Connect the STM32F446 Nucleao-64 board to your computer using a USB cable. +Open the STM32CubeIDE 1.11.2 software on your computer. +Open the project code file in the stm32 IDE. +Compile and upload the code to the STM board. + +# Usage +NA + +# Contributors +chen_dinni@hotmail.com + +# License +NA \ No newline at end of file From fb77524639662328e2e545f6d012c6fdef43cbef Mon Sep 17 00:00:00 2001 From: Olivia Linden Date: Sat, 18 Mar 2023 22:51:41 +0100 Subject: [PATCH 4/7] add modified file --- .../FreeRTOS_LED/Core/Inc/app.h | 24 + .../FreeRTOS_LED/Core/Inc/stm32f4xx_it.h | 1 + .../FreeRTOS_LED/Core/Src/app.c | 78 + .../FreeRTOS_LED/Core/Src/main.c | 83 +- .../FreeRTOS_LED/Core/Src/stm32f4xx_it.c | 13 + .../FreeRTOS_LED/Debug/Core/Src/app.d | 89 + .../FreeRTOS_LED/Debug/Core/Src/app.o | Bin 0 -> 1119076 bytes .../FreeRTOS_LED/Debug/Core/Src/app.su | 1 + .../FreeRTOS_LED/Debug/Core/Src/main.d | 2 + .../FreeRTOS_LED/Debug/Core/Src/main.o | Bin 1125976 -> 1123452 bytes .../FreeRTOS_LED/Debug/Core/Src/main.su | 12 +- .../Debug/Core/Src/stm32f4xx_it.o | Bin 1106616 -> 1107048 bytes .../Debug/Core/Src/stm32f4xx_it.su | 3 +- .../FreeRTOS_LED/Debug/Core/Src/subdir.mk | 5 +- .../FreeRTOS_LED/Debug/FreeRTOS_LED.elf | Bin 1237148 -> 1240872 bytes .../FreeRTOS_LED/Debug/FreeRTOS_LED.list | 9529 ++++++++--------- .../FreeRTOS_LED/Debug/FreeRTOS_LED.map | 1143 +- .../FreeRTOS_LED/Debug/objects.list | 1 + 18 files changed, 5568 insertions(+), 5416 deletions(-) create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/app.h create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/app.c create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.d create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.o create mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/app.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/app.h new file mode 100644 index 0000000..3e91442 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/app.h @@ -0,0 +1,24 @@ +/** + ****************************************************************************** + * @file app.h + * @brief This file contains the headers of app.c. + ****************************************************************************** + * @attention + * + * Copyright (c) 2017 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +#ifndef __APP_H +#define __APP_H + +void SystemClock_Config(void); + + +#endif diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h index aa25575..274aab4 100644 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h @@ -53,6 +53,7 @@ void BusFault_Handler(void); void UsageFault_Handler(void); void DebugMon_Handler(void); void SysTick_Handler(void); +void Error_Handler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/app.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/app.c new file mode 100644 index 0000000..8d5262c --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/app.c @@ -0,0 +1,78 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : app.c + * @brief : application calls file + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "app.h" +#include "cmsis_os.h" +#include "main.h" + +void SystemClock_Config(void); + + + +/** + * @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_SCALE3); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + + + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c index e99f460..3af6d86 100644 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c @@ -19,16 +19,17 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" +#include "app.h" #include "cmsis_os.h" osThreadId defaultTaskHandle; osThreadId BlinkLEDHandle; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); -static void MX_GPIO_Init(void); void StartDefaultTask(void const * argument); void StartTask02(void const * argument); void blinkaled(void); +static void MX_GPIO_Init(void); /** * @brief The application entry point. @@ -65,78 +66,24 @@ int main(void) } -/** - * @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_SCALE3); - - /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLM = 16; - RCC_OscInitStruct.PLL.PLLN = 336; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; - RCC_OscInitStruct.PLL.PLLQ = 2; - RCC_OscInitStruct.PLL.PLLR = 2; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } - - /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) - { - Error_Handler(); - } -} - - /** * @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_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); + /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); - /*Configure GPIO pin : B1_Pin */ - GPIO_InitStruct.Pin = B1_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); - /*Configure GPIO pin : LD2_Pin */ GPIO_InitStruct.Pin = LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; @@ -147,7 +94,7 @@ static void MX_GPIO_Init(void) } -/* USER CODE BEGIN Header_StartDefaultTask */ + /** * @brief Function implementing the defaultTask thread. * @param argument: Not used @@ -165,7 +112,8 @@ void StartDefaultTask(void const * argument) /* USER CODE END 5 */ } -/* USER CODE BEGIN Header_StartTask02 */ + + /** * @brief Function implementing the blinkaled thread. * @param argument: Not used @@ -192,24 +140,15 @@ void StartTask02(void const * argument) void blinkaled(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - HAL_Delay(1000); + osDelay(1000); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - HAL_Delay(1000); + osDelay(1000); } /** * @brief This function is executed in case of error occurrence. * @retval None */ -void Error_Handler(void) -{ - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) - { - } - /* USER CODE END Error_Handler_Debug */ -} + #ifdef USE_FULL_ASSERT /** diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c index d5e08d6..0d3897d 100644 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c @@ -153,6 +153,19 @@ void DebugMon_Handler(void) /* USER CODE END DebugMonitor_IRQn 1 */ } +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + + + /** * @brief This function handles System tick timer. */ diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.d new file mode 100644 index 0000000..8936570 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.d @@ -0,0 +1,89 @@ +Core/Src/app.o: ../Core/Src/app.c ../Core/Inc/app.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h \ + ../Core/Inc/FreeRTOSConfig.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/list.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/task.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h \ + ../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h \ + ../Core/Inc/main.h ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Core/Inc/app.h: +../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h: +../Core/Inc/FreeRTOSConfig.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/portable.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h: +../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/list.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/task.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/queue.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h: +../Middlewares/Third_Party/FreeRTOS/Source/include/timers.h: +../Core/Inc/main.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.o new file mode 100644 index 0000000000000000000000000000000000000000..72cd187781b7e8952f38a964d1e18758a5029994 GIT binary patch literal 1119076 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≷7#2ICk?;74iD~zOxlEc7<4~?cp4_- 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∑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 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.su new file mode 100644 index 0000000..61e7fa4 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.su @@ -0,0 +1 @@ +../Core/Src/app.c:34:6:SystemClock_Config 88 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.d index 0fd8678..afe7a49 100644 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.d +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.d @@ -25,6 +25,7 @@ Core/Src/main.o: ../Core/Src/main.c ../Core/Inc/main.h \ ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h \ + ../Core/Inc/app.h \ ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h \ ../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h \ ../Core/Inc/FreeRTOSConfig.h \ @@ -69,6 +70,7 @@ Core/Src/main.o: ../Core/Src/main.c ../Core/Inc/main.h \ ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: +../Core/Inc/app.h: ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h: ../Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h: ../Core/Inc/FreeRTOSConfig.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.o index ccdcbbd3e12ffc98d8cc281a130d0cbb05975da4..0ea132110f5ea4b5f281a8f90abfd0cd77d2aa31 100644 GIT binary patch delta 298036 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

    tj;AIV=`3zo<7 z#@9if$X!Fh(j!ly%c@sCLE*?g`KSe8{qhKkHV?=b{Q%Df^-1RQ*6{hv8@d%92G5ZfjB9C zTZgfOicxonJ1Z<2SmC1h(G8r36ice%_F=^a^3zo@*G%7EI-;nuV(_RUx*gbViqgs8 zaaVjrg2xn3>2c|y*v`bSc3kn0&R2UWbd-PhR=o8ttoKoTvK5^t6;HTeIi>hy4p2@j zc6GsQUq${(5I@Bkx-9(_J9!WYQ0(G^1S%vbnY2v{Qh2J+3|5Hfykm%>VjIxTD5h)z zOsL`vU5H_d&kmy%uILRwD?;(R9W+HMy0ahVvJ|tHf+btA zh>liVR~e)=9Gn%3SLvBwsc2q< zR+S=@@(0z5T{{6?qp+2|fWcZt9({qRPO;Y&0R5`x@8r+oo z|E2u9yYeFnS07X6)AHFv8A;9@R~D~?7oN(c^y%6Y%C*};yp*LHaC$3G(`v^@>AV~h zd{Ws@x5Fvr`e3LytsHs@D89-cGJxWz+)P0Vf2DUjIs=qB&u%2q7@ z@e`)|jxv55SnevPP{6fa`6q?WJCrMEZ`Y{|r`>j!(r6n)^PW=w0R-t zp@+(}eHiOj{!aU_N6G_~Y<{dPr*G9hQ8LNV9%al{SlFv9SOl~_vwHL&`Z+Vm7Qa%!Dzc%EqPWe5%|TN&CMs

    ih#+AlyNK7a{qCL+6m6jem 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 X4#iRmre0hzC2y9Q!I1YQ4iWzka&~9k diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su index 0ed7ab4..71bc444 100644 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su @@ -1,7 +1,5 @@ -../Core/Src/main.c:37:5:main 72 static -../Core/Src/main.c:75:6:SystemClock_Config 88 static -../Core/Src/main.c:124:13:MX_GPIO_Init 48 static -../Core/Src/main.c:160:6:StartDefaultTask 16 static -../Core/Src/main.c:178:6:StartTask02 16 static -../Core/Src/main.c:189:6:blinkaled 8 static -../Core/Src/main.c:200:6:Error_Handler 4 static,ignoring_inline_asm +../Core/Src/main.c:38:5:main 72 static +../Core/Src/main.c:75:13:MX_GPIO_Init 32 static +../Core/Src/main.c:104:6:StartDefaultTask 16 static +../Core/Src/main.c:123:6:StartTask02 16 static +../Core/Src/main.c:140:6:blinkaled 8 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.o index f8ced7349648b865047f036feae18624a4a1a428..e9ca0f03cbb2bc144327ebbccd3e7ac89fef8786 100644 GIT binary patch delta 289950 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 delta 289518 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

    k|NjU^@;^@FTrS~iZsJZJ;BlVg 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 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su index a67f254..60c2be7 100644 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su @@ -4,4 +4,5 @@ ../Core/Src/stm32f4xx_it.c:116:6:BusFault_Handler 4 static ../Core/Src/stm32f4xx_it.c:131:6:UsageFault_Handler 4 static ../Core/Src/stm32f4xx_it.c:146:6:DebugMon_Handler 4 static -../Core/Src/stm32f4xx_it.c:159:6:SysTick_Handler 8 static +../Core/Src/stm32f4xx_it.c:156:6:Error_Handler 4 static,ignoring_inline_asm +../Core/Src/stm32f4xx_it.c:172:6:SysTick_Handler 8 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk index 37f077b..e068ab2 100644 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk @@ -5,6 +5,7 @@ # Add inputs and outputs from these tool invocations to the build variables C_SRCS += \ +../Core/Src/app.c \ ../Core/Src/freertos.c \ ../Core/Src/main.c \ ../Core/Src/stm32f4xx_hal_msp.c \ @@ -14,6 +15,7 @@ C_SRCS += \ ../Core/Src/system_stm32f4xx.c OBJS += \ +./Core/Src/app.o \ ./Core/Src/freertos.o \ ./Core/Src/main.o \ ./Core/Src/stm32f4xx_hal_msp.o \ @@ -23,6 +25,7 @@ OBJS += \ ./Core/Src/system_stm32f4xx.o C_DEPS += \ +./Core/Src/app.d \ ./Core/Src/freertos.d \ ./Core/Src/main.d \ ./Core/Src/stm32f4xx_hal_msp.d \ @@ -39,7 +42,7 @@ Core/Src/%.o Core/Src/%.su: ../Core/Src/%.c Core/Src/subdir.mk clean: clean-Core-2f-Src clean-Core-2f-Src: - -$(RM) ./Core/Src/freertos.d ./Core/Src/freertos.o ./Core/Src/freertos.su ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/stm32f4xx_hal_msp.d ./Core/Src/stm32f4xx_hal_msp.o ./Core/Src/stm32f4xx_hal_msp.su ./Core/Src/stm32f4xx_it.d ./Core/Src/stm32f4xx_it.o ./Core/Src/stm32f4xx_it.su ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f4xx.d ./Core/Src/system_stm32f4xx.o ./Core/Src/system_stm32f4xx.su + -$(RM) ./Core/Src/app.d ./Core/Src/app.o ./Core/Src/app.su ./Core/Src/freertos.d ./Core/Src/freertos.o ./Core/Src/freertos.su ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/stm32f4xx_hal_msp.d ./Core/Src/stm32f4xx_hal_msp.o ./Core/Src/stm32f4xx_hal_msp.su ./Core/Src/stm32f4xx_it.d ./Core/Src/stm32f4xx_it.o ./Core/Src/stm32f4xx_it.su ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f4xx.d ./Core/Src/system_stm32f4xx.o ./Core/Src/system_stm32f4xx.su .PHONY: clean-Core-2f-Src diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.elf b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.elf index 3b615db7db96ea0d65f6b62638c4f32d0e2bcff4..4e51f000890ce75d97bc6c63e1eb7fcb27c61e12 100644 GIT binary patch delta 199669 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�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%0Dq>jA7#oG1o% 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 z�j{-sSiD#-XPCy)9{QrsusFH%Mg9JnCrL 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

    V|&Oc-1-r26bUz-gd1AIoiT=&WpU9(THl-& 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: 80001f4: b508 push {r3, lr} @@ -74,7 +74,7 @@ Disassembly of section .text: 8000202: bd08 pop {r3, pc} 8000204: 00000000 .word 0x00000000 8000208: 20000014 .word 0x20000014 - 800020c: 08002fd4 .word 0x08002fd4 + 800020c: 08002f04 .word 0x08002f04 08000210 <__aeabi_uldivmod>: 8000210: b953 cbnz r3, 8000228 <__aeabi_uldivmod+0x18> @@ -350,7656 +350,7543 @@ Disassembly of section .text: 8000510: 4770 bx lr 8000512: bf00 nop -08000514 : -/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ -static StaticTask_t xIdleTaskTCBBuffer; -static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; - -void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) -{ - 8000514: b480 push {r7} - 8000516: b085 sub sp, #20 - 8000518: af00 add r7, sp, #0 - 800051a: 60f8 str r0, [r7, #12] - 800051c: 60b9 str r1, [r7, #8] - 800051e: 607a str r2, [r7, #4] - *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; - 8000520: 68fb ldr r3, [r7, #12] - 8000522: 4a07 ldr r2, [pc, #28] ; (8000540 ) - 8000524: 601a str r2, [r3, #0] - *ppxIdleTaskStackBuffer = &xIdleStack[0]; - 8000526: 68bb ldr r3, [r7, #8] - 8000528: 4a06 ldr r2, [pc, #24] ; (8000544 ) - 800052a: 601a str r2, [r3, #0] - *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; - 800052c: 687b ldr r3, [r7, #4] - 800052e: 2280 movs r2, #128 ; 0x80 - 8000530: 601a str r2, [r3, #0] - /* place for user code */ -} - 8000532: bf00 nop - 8000534: 3714 adds r7, #20 - 8000536: 46bd mov sp, r7 - 8000538: f85d 7b04 ldr.w r7, [sp], #4 - 800053c: 4770 bx lr - 800053e: bf00 nop - 8000540: 2000002c .word 0x2000002c - 8000544: 20000080 .word 0x20000080 - -08000548

    : -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - 8000548: b5b0 push {r4, r5, r7, lr} - 800054a: b08e sub sp, #56 ; 0x38 - 800054c: af00 add r7, sp, #0 - /* MCU Configuration--------------------------------------------------------*/ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - 800054e: f000 f9c9 bl 80008e4 - /* Configure the system clock */ - SystemClock_Config(); - 8000552: f000 f831 bl 80005b8 - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - 8000556: f000 f89d bl 8000694 - - /* Create the thread(s) */ - /* definition and creation of defaultTask */ - osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); - 800055a: 4b13 ldr r3, [pc, #76] ; (80005a8 ) - 800055c: f107 041c add.w r4, r7, #28 - 8000560: 461d mov r5, r3 - 8000562: cd0f ldmia r5!, {r0, r1, r2, r3} - 8000564: c40f stmia r4!, {r0, r1, r2, r3} - 8000566: e895 0007 ldmia.w r5, {r0, r1, r2} - 800056a: e884 0007 stmia.w r4, {r0, r1, r2} - defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); - 800056e: f107 031c add.w r3, r7, #28 - 8000572: 2100 movs r1, #0 - 8000574: 4618 mov r0, r3 - 8000576: f001 fab2 bl 8001ade - 800057a: 4603 mov r3, r0 - 800057c: 4a0b ldr r2, [pc, #44] ; (80005ac ) - 800057e: 6013 str r3, [r2, #0] - - /* definition and creation of BlinkLED */ - osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); - 8000580: 4b0b ldr r3, [pc, #44] ; (80005b0 ) - 8000582: 463c mov r4, r7 - 8000584: 461d mov r5, r3 - 8000586: cd0f ldmia r5!, {r0, r1, r2, r3} - 8000588: c40f stmia r4!, {r0, r1, r2, r3} - 800058a: e895 0007 ldmia.w r5, {r0, r1, r2} - 800058e: e884 0007 stmia.w r4, {r0, r1, r2} - BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); - 8000592: 463b mov r3, r7 - 8000594: 2100 movs r1, #0 - 8000596: 4618 mov r0, r3 - 8000598: f001 faa1 bl 8001ade - 800059c: 4603 mov r3, r0 - 800059e: 4a05 ldr r2, [pc, #20] ; (80005b4 ) - 80005a0: 6013 str r3, [r2, #0] - - /* Start scheduler */ - osKernelStart(); - 80005a2: f001 fa95 bl 8001ad0 - - /* We should never get here as control is now taken by the scheduler */ - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - while (1) - 80005a6: e7fe b.n 80005a6 - 80005a8: 08003004 .word 0x08003004 - 80005ac: 20000280 .word 0x20000280 - 80005b0: 08003020 .word 0x08003020 - 80005b4: 20000284 .word 0x20000284 - -080005b8 : -/** +08000514 : * @brief System Clock Configuration * @retval None */ + void SystemClock_Config(void) { - 80005b8: b580 push {r7, lr} - 80005ba: b094 sub sp, #80 ; 0x50 - 80005bc: af00 add r7, sp, #0 + 8000514: b580 push {r7, lr} + 8000516: b094 sub sp, #80 ; 0x50 + 8000518: af00 add r7, sp, #0 RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - 80005be: f107 031c add.w r3, r7, #28 - 80005c2: 2234 movs r2, #52 ; 0x34 - 80005c4: 2100 movs r1, #0 - 80005c6: 4618 mov r0, r3 - 80005c8: f002 fcfc bl 8002fc4 + 800051a: f107 031c add.w r3, r7, #28 + 800051e: 2234 movs r2, #52 ; 0x34 + 8000520: 2100 movs r1, #0 + 8000522: 4618 mov r0, r3 + 8000524: f002 fce6 bl 8002ef4 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - 80005cc: f107 0308 add.w r3, r7, #8 - 80005d0: 2200 movs r2, #0 - 80005d2: 601a str r2, [r3, #0] - 80005d4: 605a str r2, [r3, #4] - 80005d6: 609a str r2, [r3, #8] - 80005d8: 60da str r2, [r3, #12] - 80005da: 611a str r2, [r3, #16] + 8000528: f107 0308 add.w r3, r7, #8 + 800052c: 2200 movs r2, #0 + 800052e: 601a str r2, [r3, #0] + 8000530: 605a str r2, [r3, #4] + 8000532: 609a str r2, [r3, #8] + 8000534: 60da str r2, [r3, #12] + 8000536: 611a str r2, [r3, #16] /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); - 80005dc: 2300 movs r3, #0 - 80005de: 607b str r3, [r7, #4] - 80005e0: 4b2a ldr r3, [pc, #168] ; (800068c ) - 80005e2: 6c1b ldr r3, [r3, #64] ; 0x40 - 80005e4: 4a29 ldr r2, [pc, #164] ; (800068c ) - 80005e6: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 - 80005ea: 6413 str r3, [r2, #64] ; 0x40 - 80005ec: 4b27 ldr r3, [pc, #156] ; (800068c ) - 80005ee: 6c1b ldr r3, [r3, #64] ; 0x40 - 80005f0: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 - 80005f4: 607b str r3, [r7, #4] - 80005f6: 687b ldr r3, [r7, #4] + 8000538: 2300 movs r3, #0 + 800053a: 607b str r3, [r7, #4] + 800053c: 4b2a ldr r3, [pc, #168] ; (80005e8 ) + 800053e: 6c1b ldr r3, [r3, #64] ; 0x40 + 8000540: 4a29 ldr r2, [pc, #164] ; (80005e8 ) + 8000542: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 + 8000546: 6413 str r3, [r2, #64] ; 0x40 + 8000548: 4b27 ldr r3, [pc, #156] ; (80005e8 ) + 800054a: 6c1b ldr r3, [r3, #64] ; 0x40 + 800054c: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 8000550: 607b str r3, [r7, #4] + 8000552: 687b ldr r3, [r7, #4] __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); - 80005f8: 2300 movs r3, #0 - 80005fa: 603b str r3, [r7, #0] - 80005fc: 4b24 ldr r3, [pc, #144] ; (8000690 ) - 80005fe: 681b ldr r3, [r3, #0] - 8000600: f423 4340 bic.w r3, r3, #49152 ; 0xc000 - 8000604: 4a22 ldr r2, [pc, #136] ; (8000690 ) - 8000606: f443 4380 orr.w r3, r3, #16384 ; 0x4000 - 800060a: 6013 str r3, [r2, #0] - 800060c: 4b20 ldr r3, [pc, #128] ; (8000690 ) - 800060e: 681b ldr r3, [r3, #0] - 8000610: f403 4340 and.w r3, r3, #49152 ; 0xc000 - 8000614: 603b str r3, [r7, #0] - 8000616: 683b ldr r3, [r7, #0] + 8000554: 2300 movs r3, #0 + 8000556: 603b str r3, [r7, #0] + 8000558: 4b24 ldr r3, [pc, #144] ; (80005ec ) + 800055a: 681b ldr r3, [r3, #0] + 800055c: f423 4340 bic.w r3, r3, #49152 ; 0xc000 + 8000560: 4a22 ldr r2, [pc, #136] ; (80005ec ) + 8000562: f443 4380 orr.w r3, r3, #16384 ; 0x4000 + 8000566: 6013 str r3, [r2, #0] + 8000568: 4b20 ldr r3, [pc, #128] ; (80005ec ) + 800056a: 681b ldr r3, [r3, #0] + 800056c: f403 4340 and.w r3, r3, #49152 ; 0xc000 + 8000570: 603b str r3, [r7, #0] + 8000572: 683b ldr r3, [r7, #0] /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - 8000618: 2302 movs r3, #2 - 800061a: 61fb str r3, [r7, #28] + 8000574: 2302 movs r3, #2 + 8000576: 61fb str r3, [r7, #28] RCC_OscInitStruct.HSIState = RCC_HSI_ON; - 800061c: 2301 movs r3, #1 - 800061e: 62bb str r3, [r7, #40] ; 0x28 + 8000578: 2301 movs r3, #1 + 800057a: 62bb str r3, [r7, #40] ; 0x28 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; - 8000620: 2310 movs r3, #16 - 8000622: 62fb str r3, [r7, #44] ; 0x2c + 800057c: 2310 movs r3, #16 + 800057e: 62fb str r3, [r7, #44] ; 0x2c RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - 8000624: 2302 movs r3, #2 - 8000626: 637b str r3, [r7, #52] ; 0x34 + 8000580: 2302 movs r3, #2 + 8000582: 637b str r3, [r7, #52] ; 0x34 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - 8000628: 2300 movs r3, #0 - 800062a: 63bb str r3, [r7, #56] ; 0x38 + 8000584: 2300 movs r3, #0 + 8000586: 63bb str r3, [r7, #56] ; 0x38 RCC_OscInitStruct.PLL.PLLM = 16; - 800062c: 2310 movs r3, #16 - 800062e: 63fb str r3, [r7, #60] ; 0x3c + 8000588: 2310 movs r3, #16 + 800058a: 63fb str r3, [r7, #60] ; 0x3c RCC_OscInitStruct.PLL.PLLN = 336; - 8000630: f44f 73a8 mov.w r3, #336 ; 0x150 - 8000634: 643b str r3, [r7, #64] ; 0x40 + 800058c: f44f 73a8 mov.w r3, #336 ; 0x150 + 8000590: 643b str r3, [r7, #64] ; 0x40 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; - 8000636: 2304 movs r3, #4 - 8000638: 647b str r3, [r7, #68] ; 0x44 + 8000592: 2304 movs r3, #4 + 8000594: 647b str r3, [r7, #68] ; 0x44 RCC_OscInitStruct.PLL.PLLQ = 2; - 800063a: 2302 movs r3, #2 - 800063c: 64bb str r3, [r7, #72] ; 0x48 + 8000596: 2302 movs r3, #2 + 8000598: 64bb str r3, [r7, #72] ; 0x48 RCC_OscInitStruct.PLL.PLLR = 2; - 800063e: 2302 movs r3, #2 - 8000640: 64fb str r3, [r7, #76] ; 0x4c + 800059a: 2302 movs r3, #2 + 800059c: 64fb str r3, [r7, #76] ; 0x4c if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - 8000642: f107 031c add.w r3, r7, #28 - 8000646: 4618 mov r0, r3 - 8000648: f000 ff8c bl 8001564 - 800064c: 4603 mov r3, r0 - 800064e: 2b00 cmp r3, #0 - 8000650: d001 beq.n 8000656 + 800059e: f107 031c add.w r3, r7, #28 + 80005a2: 4618 mov r0, r3 + 80005a4: f000 ff7c bl 80014a0 + 80005a8: 4603 mov r3, r0 + 80005aa: 2b00 cmp r3, #0 + 80005ac: d001 beq.n 80005b2 { Error_Handler(); - 8000652: f000 f8b5 bl 80007c0 + 80005ae: f000 f90d bl 80007cc } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK - 8000656: 230f movs r3, #15 - 8000658: 60bb str r3, [r7, #8] + 80005b2: 230f movs r3, #15 + 80005b4: 60bb str r3, [r7, #8] |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - 800065a: 2302 movs r3, #2 - 800065c: 60fb str r3, [r7, #12] + 80005b6: 2302 movs r3, #2 + 80005b8: 60fb str r3, [r7, #12] RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - 800065e: 2300 movs r3, #0 - 8000660: 613b str r3, [r7, #16] + 80005ba: 2300 movs r3, #0 + 80005bc: 613b str r3, [r7, #16] RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - 8000662: f44f 5380 mov.w r3, #4096 ; 0x1000 - 8000666: 617b str r3, [r7, #20] + 80005be: f44f 5380 mov.w r3, #4096 ; 0x1000 + 80005c2: 617b str r3, [r7, #20] RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - 8000668: 2300 movs r3, #0 - 800066a: 61bb str r3, [r7, #24] + 80005c4: 2300 movs r3, #0 + 80005c6: 61bb str r3, [r7, #24] if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) - 800066c: f107 0308 add.w r3, r7, #8 - 8000670: 2102 movs r1, #2 - 8000672: 4618 mov r0, r3 - 8000674: f000 fc60 bl 8000f38 - 8000678: 4603 mov r3, r0 - 800067a: 2b00 cmp r3, #0 - 800067c: d001 beq.n 8000682 + 80005c8: f107 0308 add.w r3, r7, #8 + 80005cc: 2102 movs r1, #2 + 80005ce: 4618 mov r0, r3 + 80005d0: f000 fc50 bl 8000e74 + 80005d4: 4603 mov r3, r0 + 80005d6: 2b00 cmp r3, #0 + 80005d8: d001 beq.n 80005de { Error_Handler(); - 800067e: f000 f89f bl 80007c0 + 80005da: f000 f8f7 bl 80007cc } } - 8000682: bf00 nop - 8000684: 3750 adds r7, #80 ; 0x50 - 8000686: 46bd mov sp, r7 - 8000688: bd80 pop {r7, pc} - 800068a: bf00 nop - 800068c: 40023800 .word 0x40023800 - 8000690: 40007000 .word 0x40007000 + 80005de: bf00 nop + 80005e0: 3750 adds r7, #80 ; 0x50 + 80005e2: 46bd mov sp, r7 + 80005e4: bd80 pop {r7, pc} + 80005e6: bf00 nop + 80005e8: 40023800 .word 0x40023800 + 80005ec: 40007000 .word 0x40007000 + +080005f0 : +/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ +static StaticTask_t xIdleTaskTCBBuffer; +static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; + +void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) +{ + 80005f0: b480 push {r7} + 80005f2: b085 sub sp, #20 + 80005f4: af00 add r7, sp, #0 + 80005f6: 60f8 str r0, [r7, #12] + 80005f8: 60b9 str r1, [r7, #8] + 80005fa: 607a str r2, [r7, #4] + *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; + 80005fc: 68fb ldr r3, [r7, #12] + 80005fe: 4a07 ldr r2, [pc, #28] ; (800061c ) + 8000600: 601a str r2, [r3, #0] + *ppxIdleTaskStackBuffer = &xIdleStack[0]; + 8000602: 68bb ldr r3, [r7, #8] + 8000604: 4a06 ldr r2, [pc, #24] ; (8000620 ) + 8000606: 601a str r2, [r3, #0] + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; + 8000608: 687b ldr r3, [r7, #4] + 800060a: 2280 movs r2, #128 ; 0x80 + 800060c: 601a str r2, [r3, #0] + /* place for user code */ +} + 800060e: bf00 nop + 8000610: 3714 adds r7, #20 + 8000612: 46bd mov sp, r7 + 8000614: f85d 7b04 ldr.w r7, [sp], #4 + 8000618: 4770 bx lr + 800061a: bf00 nop + 800061c: 2000002c .word 0x2000002c + 8000620: 20000080 .word 0x20000080 + +08000624
    : +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + 8000624: b5b0 push {r4, r5, r7, lr} + 8000626: b08e sub sp, #56 ; 0x38 + 8000628: af00 add r7, sp, #0 + /* MCU Configuration--------------------------------------------------------*/ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + 800062a: f000 f91d bl 8000868 + /* Configure the system clock */ + SystemClock_Config(); + 800062e: f7ff ff71 bl 8000514 + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + 8000632: f000 f82f bl 8000694 + + /* Create the thread(s) */ + /* definition and creation of defaultTask */ + osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); + 8000636: 4b13 ldr r3, [pc, #76] ; (8000684 ) + 8000638: f107 041c add.w r4, r7, #28 + 800063c: 461d mov r5, r3 + 800063e: cd0f ldmia r5!, {r0, r1, r2, r3} + 8000640: c40f stmia r4!, {r0, r1, r2, r3} + 8000642: e895 0007 ldmia.w r5, {r0, r1, r2} + 8000646: e884 0007 stmia.w r4, {r0, r1, r2} + defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL); + 800064a: f107 031c add.w r3, r7, #28 + 800064e: 2100 movs r1, #0 + 8000650: 4618 mov r0, r3 + 8000652: f001 f9e2 bl 8001a1a + 8000656: 4603 mov r3, r0 + 8000658: 4a0b ldr r2, [pc, #44] ; (8000688 ) + 800065a: 6013 str r3, [r2, #0] + + /* definition and creation of BlinkLED */ + osThreadDef(blinkaled, StartTask02, osPriorityIdle, 0, 128); + 800065c: 4b0b ldr r3, [pc, #44] ; (800068c ) + 800065e: 463c mov r4, r7 + 8000660: 461d mov r5, r3 + 8000662: cd0f ldmia r5!, {r0, r1, r2, r3} + 8000664: c40f stmia r4!, {r0, r1, r2, r3} + 8000666: e895 0007 ldmia.w r5, {r0, r1, r2} + 800066a: e884 0007 stmia.w r4, {r0, r1, r2} + BlinkLEDHandle = osThreadCreate(osThread(blinkaled), NULL); + 800066e: 463b mov r3, r7 + 8000670: 2100 movs r1, #0 + 8000672: 4618 mov r0, r3 + 8000674: f001 f9d1 bl 8001a1a + 8000678: 4603 mov r3, r0 + 800067a: 4a05 ldr r2, [pc, #20] ; (8000690 ) + 800067c: 6013 str r3, [r2, #0] + + /* Start scheduler */ + osKernelStart(); + 800067e: f001 f9c5 bl 8001a0c + + /* We should never get here as control is now taken by the scheduler */ + /* Infinite loop */ + + while (1) + 8000682: e7fe b.n 8000682 + 8000684: 08002f34 .word 0x08002f34 + 8000688: 20000280 .word 0x20000280 + 800068c: 08002f50 .word 0x08002f50 + 8000690: 20000284 .word 0x20000284 08000694 : - * @brief GPIO Initialization Function * @param None * @retval None */ + static void MX_GPIO_Init(void) { 8000694: b580 push {r7, lr} - 8000696: b08a sub sp, #40 ; 0x28 + 8000696: b086 sub sp, #24 8000698: af00 add r7, sp, #0 GPIO_InitTypeDef GPIO_InitStruct = {0}; - 800069a: f107 0314 add.w r3, r7, #20 - 800069e: 2200 movs r2, #0 - 80006a0: 601a str r2, [r3, #0] - 80006a2: 605a str r2, [r3, #4] - 80006a4: 609a str r2, [r3, #8] - 80006a6: 60da str r2, [r3, #12] - 80006a8: 611a str r2, [r3, #16] + 800069a: 1d3b adds r3, r7, #4 + 800069c: 2200 movs r2, #0 + 800069e: 601a str r2, [r3, #0] + 80006a0: 605a str r2, [r3, #4] + 80006a2: 609a str r2, [r3, #8] + 80006a4: 60da str r2, [r3, #12] + 80006a6: 611a str r2, [r3, #16] /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOC_CLK_ENABLE(); - 80006aa: 2300 movs r3, #0 - 80006ac: 613b str r3, [r7, #16] - 80006ae: 4b2d ldr r3, [pc, #180] ; (8000764 ) - 80006b0: 6b1b ldr r3, [r3, #48] ; 0x30 - 80006b2: 4a2c ldr r2, [pc, #176] ; (8000764 ) - 80006b4: f043 0304 orr.w r3, r3, #4 - 80006b8: 6313 str r3, [r2, #48] ; 0x30 - 80006ba: 4b2a ldr r3, [pc, #168] ; (8000764 ) - 80006bc: 6b1b ldr r3, [r3, #48] ; 0x30 - 80006be: f003 0304 and.w r3, r3, #4 - 80006c2: 613b str r3, [r7, #16] - 80006c4: 693b ldr r3, [r7, #16] - __HAL_RCC_GPIOH_CLK_ENABLE(); - 80006c6: 2300 movs r3, #0 - 80006c8: 60fb str r3, [r7, #12] - 80006ca: 4b26 ldr r3, [pc, #152] ; (8000764 ) - 80006cc: 6b1b ldr r3, [r3, #48] ; 0x30 - 80006ce: 4a25 ldr r2, [pc, #148] ; (8000764 ) - 80006d0: f043 0380 orr.w r3, r3, #128 ; 0x80 - 80006d4: 6313 str r3, [r2, #48] ; 0x30 - 80006d6: 4b23 ldr r3, [pc, #140] ; (8000764 ) - 80006d8: 6b1b ldr r3, [r3, #48] ; 0x30 - 80006da: f003 0380 and.w r3, r3, #128 ; 0x80 - 80006de: 60fb str r3, [r7, #12] - 80006e0: 68fb ldr r3, [r7, #12] + __HAL_RCC_GPIOA_CLK_ENABLE(); - 80006e2: 2300 movs r3, #0 - 80006e4: 60bb str r3, [r7, #8] - 80006e6: 4b1f ldr r3, [pc, #124] ; (8000764 ) - 80006e8: 6b1b ldr r3, [r3, #48] ; 0x30 - 80006ea: 4a1e ldr r2, [pc, #120] ; (8000764 ) - 80006ec: f043 0301 orr.w r3, r3, #1 - 80006f0: 6313 str r3, [r2, #48] ; 0x30 - 80006f2: 4b1c ldr r3, [pc, #112] ; (8000764 ) - 80006f4: 6b1b ldr r3, [r3, #48] ; 0x30 - 80006f6: f003 0301 and.w r3, r3, #1 - 80006fa: 60bb str r3, [r7, #8] - 80006fc: 68bb ldr r3, [r7, #8] - __HAL_RCC_GPIOB_CLK_ENABLE(); - 80006fe: 2300 movs r3, #0 - 8000700: 607b str r3, [r7, #4] - 8000702: 4b18 ldr r3, [pc, #96] ; (8000764 ) - 8000704: 6b1b ldr r3, [r3, #48] ; 0x30 - 8000706: 4a17 ldr r2, [pc, #92] ; (8000764 ) - 8000708: f043 0302 orr.w r3, r3, #2 - 800070c: 6313 str r3, [r2, #48] ; 0x30 - 800070e: 4b15 ldr r3, [pc, #84] ; (8000764 ) - 8000710: 6b1b ldr r3, [r3, #48] ; 0x30 - 8000712: f003 0302 and.w r3, r3, #2 - 8000716: 607b str r3, [r7, #4] - 8000718: 687b ldr r3, [r7, #4] + 80006a8: 2300 movs r3, #0 + 80006aa: 603b str r3, [r7, #0] + 80006ac: 4b10 ldr r3, [pc, #64] ; (80006f0 ) + 80006ae: 6b1b ldr r3, [r3, #48] ; 0x30 + 80006b0: 4a0f ldr r2, [pc, #60] ; (80006f0 ) + 80006b2: f043 0301 orr.w r3, r3, #1 + 80006b6: 6313 str r3, [r2, #48] ; 0x30 + 80006b8: 4b0d ldr r3, [pc, #52] ; (80006f0 ) + 80006ba: 6b1b ldr r3, [r3, #48] ; 0x30 + 80006bc: f003 0301 and.w r3, r3, #1 + 80006c0: 603b str r3, [r7, #0] + 80006c2: 683b ldr r3, [r7, #0] + /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); - 800071a: 2200 movs r2, #0 - 800071c: 2120 movs r1, #32 - 800071e: 4812 ldr r0, [pc, #72] ; (8000768 ) - 8000720: f000 fbf0 bl 8000f04 - - /*Configure GPIO pin : B1_Pin */ - GPIO_InitStruct.Pin = B1_Pin; - 8000724: f44f 5300 mov.w r3, #8192 ; 0x2000 - 8000728: 617b str r3, [r7, #20] - GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; - 800072a: f44f 1304 mov.w r3, #2162688 ; 0x210000 - 800072e: 61bb str r3, [r7, #24] - GPIO_InitStruct.Pull = GPIO_NOPULL; - 8000730: 2300 movs r3, #0 - 8000732: 61fb str r3, [r7, #28] - HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); - 8000734: f107 0314 add.w r3, r7, #20 - 8000738: 4619 mov r1, r3 - 800073a: 480c ldr r0, [pc, #48] ; (800076c ) - 800073c: f000 fa4e bl 8000bdc + 80006c4: 2200 movs r2, #0 + 80006c6: 2120 movs r1, #32 + 80006c8: 480a ldr r0, [pc, #40] ; (80006f4 ) + 80006ca: f000 fbb9 bl 8000e40 /*Configure GPIO pin : LD2_Pin */ GPIO_InitStruct.Pin = LD2_Pin; - 8000740: 2320 movs r3, #32 - 8000742: 617b str r3, [r7, #20] + 80006ce: 2320 movs r3, #32 + 80006d0: 607b str r3, [r7, #4] GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - 8000744: 2301 movs r3, #1 - 8000746: 61bb str r3, [r7, #24] + 80006d2: 2301 movs r3, #1 + 80006d4: 60bb str r3, [r7, #8] GPIO_InitStruct.Pull = GPIO_NOPULL; - 8000748: 2300 movs r3, #0 - 800074a: 61fb str r3, [r7, #28] + 80006d6: 2300 movs r3, #0 + 80006d8: 60fb str r3, [r7, #12] GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - 800074c: 2300 movs r3, #0 - 800074e: 623b str r3, [r7, #32] + 80006da: 2300 movs r3, #0 + 80006dc: 613b str r3, [r7, #16] HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); - 8000750: f107 0314 add.w r3, r7, #20 - 8000754: 4619 mov r1, r3 - 8000756: 4804 ldr r0, [pc, #16] ; (8000768 ) - 8000758: f000 fa40 bl 8000bdc + 80006de: 1d3b adds r3, r7, #4 + 80006e0: 4619 mov r1, r3 + 80006e2: 4804 ldr r0, [pc, #16] ; (80006f4 ) + 80006e4: f000 fa18 bl 8000b18 } - 800075c: bf00 nop - 800075e: 3728 adds r7, #40 ; 0x28 - 8000760: 46bd mov sp, r7 - 8000762: bd80 pop {r7, pc} - 8000764: 40023800 .word 0x40023800 - 8000768: 40020000 .word 0x40020000 - 800076c: 40020800 .word 0x40020800 - -08000770 : + 80006e8: bf00 nop + 80006ea: 3718 adds r7, #24 + 80006ec: 46bd mov sp, r7 + 80006ee: bd80 pop {r7, pc} + 80006f0: 40023800 .word 0x40023800 + 80006f4: 40020000 .word 0x40020000 + +080006f8 : * @param argument: Not used * @retval None */ /* USER CODE END Header_StartDefaultTask */ void StartDefaultTask(void const * argument) { - 8000770: b580 push {r7, lr} - 8000772: b082 sub sp, #8 - 8000774: af00 add r7, sp, #0 - 8000776: 6078 str r0, [r7, #4] + 80006f8: b580 push {r7, lr} + 80006fa: b082 sub sp, #8 + 80006fc: af00 add r7, sp, #0 + 80006fe: 6078 str r0, [r7, #4] /* USER CODE BEGIN 5 */ /* Infinite loop */ for(;;) { osDelay(1); - 8000778: 2001 movs r0, #1 - 800077a: f001 f9fc bl 8001b76 - 800077e: e7fb b.n 8000778 + 8000700: 2001 movs r0, #1 + 8000702: f001 f9d6 bl 8001ab2 + 8000706: e7fb b.n 8000700 -08000780 : +08000708 : * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTask02 */ void StartTask02(void const * argument) { - 8000780: b580 push {r7, lr} - 8000782: b082 sub sp, #8 - 8000784: af00 add r7, sp, #0 - 8000786: 6078 str r0, [r7, #4] + 8000708: b580 push {r7, lr} + 800070a: b082 sub sp, #8 + 800070c: af00 add r7, sp, #0 + 800070e: 6078 str r0, [r7, #4] /* USER CODE BEGIN StartTask02 */ /* Infinite loop */ for(;;) { blinkaled(); - 8000788: f000 f802 bl 8000790 - 800078c: e7fc b.n 8000788 + 8000710: f000 f802 bl 8000718 + 8000714: e7fc b.n 8000710 ... -08000790 : - } - /* USER CODE END StartTask02 */ -} - +08000718 : + * Blinks an LED connected to GPIOA Pin 5 by setting it high for 1 second and then low for 1 second. + * Parameters: None + * Returns: None + */ void blinkaled(void) { - 8000790: b580 push {r7, lr} - 8000792: af00 add r7, sp, #0 + 8000718: b580 push {r7, lr} + 800071a: af00 add r7, sp, #0 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); - 8000794: 2201 movs r2, #1 - 8000796: 2120 movs r1, #32 - 8000798: 4808 ldr r0, [pc, #32] ; (80007bc ) - 800079a: f000 fbb3 bl 8000f04 - HAL_Delay(1000); - 800079e: f44f 707a mov.w r0, #1000 ; 0x3e8 - 80007a2: f000 f911 bl 80009c8 + 800071c: 2201 movs r2, #1 + 800071e: 2120 movs r1, #32 + 8000720: 4808 ldr r0, [pc, #32] ; (8000744 ) + 8000722: f000 fb8d bl 8000e40 + osDelay(1000); + 8000726: f44f 707a mov.w r0, #1000 ; 0x3e8 + 800072a: f001 f9c2 bl 8001ab2 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); - 80007a6: 2200 movs r2, #0 - 80007a8: 2120 movs r1, #32 - 80007aa: 4804 ldr r0, [pc, #16] ; (80007bc ) - 80007ac: f000 fbaa bl 8000f04 - HAL_Delay(1000); - 80007b0: f44f 707a mov.w r0, #1000 ; 0x3e8 - 80007b4: f000 f908 bl 80009c8 -} - 80007b8: bf00 nop - 80007ba: bd80 pop {r7, pc} - 80007bc: 40020000 .word 0x40020000 - -080007c0 : -/** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) -{ - 80007c0: b480 push {r7} - 80007c2: af00 add r7, sp, #0 - \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"); - 80007c4: b672 cpsid i + 800072e: 2200 movs r2, #0 + 8000730: 2120 movs r1, #32 + 8000732: 4804 ldr r0, [pc, #16] ; (8000744 ) + 8000734: f000 fb84 bl 8000e40 + osDelay(1000); + 8000738: f44f 707a mov.w r0, #1000 ; 0x3e8 + 800073c: f001 f9b9 bl 8001ab2 } - 80007c6: bf00 nop - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) - 80007c8: e7fe b.n 80007c8 - ... + 8000740: bf00 nop + 8000742: bd80 pop {r7, pc} + 8000744: 40020000 .word 0x40020000 -080007cc : +08000748 : /* USER CODE END 0 */ /** * Initializes the Global MSP. */ void HAL_MspInit(void) { - 80007cc: b580 push {r7, lr} - 80007ce: b082 sub sp, #8 - 80007d0: af00 add r7, sp, #0 + 8000748: b580 push {r7, lr} + 800074a: b082 sub sp, #8 + 800074c: af00 add r7, sp, #0 /* USER CODE BEGIN MspInit 0 */ /* USER CODE END MspInit 0 */ __HAL_RCC_SYSCFG_CLK_ENABLE(); - 80007d2: 2300 movs r3, #0 - 80007d4: 607b str r3, [r7, #4] - 80007d6: 4b12 ldr r3, [pc, #72] ; (8000820 ) - 80007d8: 6c5b ldr r3, [r3, #68] ; 0x44 - 80007da: 4a11 ldr r2, [pc, #68] ; (8000820 ) - 80007dc: f443 4380 orr.w r3, r3, #16384 ; 0x4000 - 80007e0: 6453 str r3, [r2, #68] ; 0x44 - 80007e2: 4b0f ldr r3, [pc, #60] ; (8000820 ) - 80007e4: 6c5b ldr r3, [r3, #68] ; 0x44 - 80007e6: f403 4380 and.w r3, r3, #16384 ; 0x4000 - 80007ea: 607b str r3, [r7, #4] - 80007ec: 687b ldr r3, [r7, #4] + 800074e: 2300 movs r3, #0 + 8000750: 607b str r3, [r7, #4] + 8000752: 4b12 ldr r3, [pc, #72] ; (800079c ) + 8000754: 6c5b ldr r3, [r3, #68] ; 0x44 + 8000756: 4a11 ldr r2, [pc, #68] ; (800079c ) + 8000758: f443 4380 orr.w r3, r3, #16384 ; 0x4000 + 800075c: 6453 str r3, [r2, #68] ; 0x44 + 800075e: 4b0f ldr r3, [pc, #60] ; (800079c ) + 8000760: 6c5b ldr r3, [r3, #68] ; 0x44 + 8000762: f403 4380 and.w r3, r3, #16384 ; 0x4000 + 8000766: 607b str r3, [r7, #4] + 8000768: 687b ldr r3, [r7, #4] __HAL_RCC_PWR_CLK_ENABLE(); - 80007ee: 2300 movs r3, #0 - 80007f0: 603b str r3, [r7, #0] - 80007f2: 4b0b ldr r3, [pc, #44] ; (8000820 ) - 80007f4: 6c1b ldr r3, [r3, #64] ; 0x40 - 80007f6: 4a0a ldr r2, [pc, #40] ; (8000820 ) - 80007f8: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 - 80007fc: 6413 str r3, [r2, #64] ; 0x40 - 80007fe: 4b08 ldr r3, [pc, #32] ; (8000820 ) - 8000800: 6c1b ldr r3, [r3, #64] ; 0x40 - 8000802: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 - 8000806: 603b str r3, [r7, #0] - 8000808: 683b ldr r3, [r7, #0] + 800076a: 2300 movs r3, #0 + 800076c: 603b str r3, [r7, #0] + 800076e: 4b0b ldr r3, [pc, #44] ; (800079c ) + 8000770: 6c1b ldr r3, [r3, #64] ; 0x40 + 8000772: 4a0a ldr r2, [pc, #40] ; (800079c ) + 8000774: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 + 8000778: 6413 str r3, [r2, #64] ; 0x40 + 800077a: 4b08 ldr r3, [pc, #32] ; (800079c ) + 800077c: 6c1b ldr r3, [r3, #64] ; 0x40 + 800077e: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 8000782: 603b str r3, [r7, #0] + 8000784: 683b ldr r3, [r7, #0] /* System interrupt init*/ /* PendSV_IRQn interrupt configuration */ HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0); - 800080a: 2200 movs r2, #0 - 800080c: 210f movs r1, #15 - 800080e: f06f 0001 mvn.w r0, #1 - 8000812: f000 f9ba bl 8000b8a + 8000786: 2200 movs r2, #0 + 8000788: 210f movs r1, #15 + 800078a: f06f 0001 mvn.w r0, #1 + 800078e: f000 f99a bl 8000ac6 /* USER CODE BEGIN MspInit 1 */ /* USER CODE END MspInit 1 */ } - 8000816: bf00 nop - 8000818: 3708 adds r7, #8 - 800081a: 46bd mov sp, r7 - 800081c: bd80 pop {r7, pc} - 800081e: bf00 nop - 8000820: 40023800 .word 0x40023800 - -08000824 : + 8000792: bf00 nop + 8000794: 3708 adds r7, #8 + 8000796: 46bd mov sp, r7 + 8000798: bd80 pop {r7, pc} + 800079a: bf00 nop + 800079c: 40023800 .word 0x40023800 + +080007a0 : /******************************************************************************/ /** * @brief This function handles Non maskable interrupt. */ void NMI_Handler(void) { - 8000824: b480 push {r7} - 8000826: af00 add r7, sp, #0 + 80007a0: b480 push {r7} + 80007a2: af00 add r7, sp, #0 /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ /* USER CODE END NonMaskableInt_IRQn 0 */ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ while (1) - 8000828: e7fe b.n 8000828 + 80007a4: e7fe b.n 80007a4 -0800082a : +080007a6 : /** * @brief This function handles Hard fault interrupt. */ void HardFault_Handler(void) { - 800082a: b480 push {r7} - 800082c: af00 add r7, sp, #0 + 80007a6: b480 push {r7} + 80007a8: af00 add r7, sp, #0 /* USER CODE BEGIN HardFault_IRQn 0 */ /* USER CODE END HardFault_IRQn 0 */ while (1) - 800082e: e7fe b.n 800082e + 80007aa: e7fe b.n 80007aa -08000830 : +080007ac : /** * @brief This function handles Memory management fault. */ void MemManage_Handler(void) { - 8000830: b480 push {r7} - 8000832: af00 add r7, sp, #0 + 80007ac: b480 push {r7} + 80007ae: af00 add r7, sp, #0 /* USER CODE BEGIN MemoryManagement_IRQn 0 */ /* USER CODE END MemoryManagement_IRQn 0 */ while (1) - 8000834: e7fe b.n 8000834 + 80007b0: e7fe b.n 80007b0 -08000836 : +080007b2 : /** * @brief This function handles Pre-fetch fault, memory access fault. */ void BusFault_Handler(void) { - 8000836: b480 push {r7} - 8000838: af00 add r7, sp, #0 + 80007b2: b480 push {r7} + 80007b4: af00 add r7, sp, #0 /* USER CODE BEGIN BusFault_IRQn 0 */ /* USER CODE END BusFault_IRQn 0 */ while (1) - 800083a: e7fe b.n 800083a + 80007b6: e7fe b.n 80007b6 -0800083c : +080007b8 : /** * @brief This function handles Undefined instruction or illegal state. */ void UsageFault_Handler(void) { - 800083c: b480 push {r7} - 800083e: af00 add r7, sp, #0 + 80007b8: b480 push {r7} + 80007ba: af00 add r7, sp, #0 /* USER CODE BEGIN UsageFault_IRQn 0 */ /* USER CODE END UsageFault_IRQn 0 */ while (1) - 8000840: e7fe b.n 8000840 + 80007bc: e7fe b.n 80007bc -08000842 : +080007be : /** * @brief This function handles Debug monitor. */ void DebugMon_Handler(void) { - 8000842: b480 push {r7} - 8000844: af00 add r7, sp, #0 + 80007be: b480 push {r7} + 80007c0: af00 add r7, sp, #0 /* USER CODE END DebugMonitor_IRQn 0 */ /* USER CODE BEGIN DebugMonitor_IRQn 1 */ /* USER CODE END DebugMonitor_IRQn 1 */ } - 8000846: bf00 nop - 8000848: 46bd mov sp, r7 - 800084a: f85d 7b04 ldr.w r7, [sp], #4 - 800084e: 4770 bx lr + 80007c2: bf00 nop + 80007c4: 46bd mov sp, r7 + 80007c6: f85d 7b04 ldr.w r7, [sp], #4 + 80007ca: 4770 bx lr + +080007cc : + +void Error_Handler(void) +{ + 80007cc: b480 push {r7} + 80007ce: af00 add r7, sp, #0 + \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"); + 80007d0: b672 cpsid i +} + 80007d2: bf00 nop + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + 80007d4: e7fe b.n 80007d4 -08000850 : +080007d6 : /** * @brief This function handles System tick timer. */ void SysTick_Handler(void) { - 8000850: b580 push {r7, lr} - 8000852: af00 add r7, sp, #0 + 80007d6: b580 push {r7, lr} + 80007d8: af00 add r7, sp, #0 /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); - 8000854: f000 f898 bl 8000988 + 80007da: f000 f897 bl 800090c #if (INCLUDE_xTaskGetSchedulerState == 1 ) if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) - 8000858: f001 ff10 bl 800267c - 800085c: 4603 mov r3, r0 - 800085e: 2b01 cmp r3, #1 - 8000860: d001 beq.n 8000866 + 80007de: f001 feeb bl 80025b8 + 80007e2: 4603 mov r3, r0 + 80007e4: 2b01 cmp r3, #1 + 80007e6: d001 beq.n 80007ec { #endif /* INCLUDE_xTaskGetSchedulerState */ xPortSysTickHandler(); - 8000862: f002 f951 bl 8002b08 + 80007e8: f002 f926 bl 8002a38 } #endif /* INCLUDE_xTaskGetSchedulerState */ /* USER CODE BEGIN SysTick_IRQn 1 */ /* USER CODE END SysTick_IRQn 1 */ } - 8000866: bf00 nop - 8000868: bd80 pop {r7, pc} - ... + 80007ec: bf00 nop + 80007ee: bd80 pop {r7, pc} -0800086c : +080007f0 : * configuration. * @param None * @retval None */ void SystemInit(void) { - 800086c: b480 push {r7} - 800086e: af00 add r7, sp, #0 + 80007f0: b480 push {r7} + 80007f2: af00 add r7, sp, #0 /* FPU settings ------------------------------------------------------------*/ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - 8000870: 4b06 ldr r3, [pc, #24] ; (800088c ) - 8000872: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88 - 8000876: 4a05 ldr r2, [pc, #20] ; (800088c ) - 8000878: f443 0370 orr.w r3, r3, #15728640 ; 0xf00000 - 800087c: f8c2 3088 str.w r3, [r2, #136] ; 0x88 + 80007f4: 4b06 ldr r3, [pc, #24] ; (8000810 ) + 80007f6: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88 + 80007fa: 4a05 ldr r2, [pc, #20] ; (8000810 ) + 80007fc: f443 0370 orr.w r3, r3, #15728640 ; 0xf00000 + 8000800: f8c2 3088 str.w r3, [r2, #136] ; 0x88 /* Configure the Vector Table location -------------------------------------*/ #if defined(USER_VECT_TAB_ADDRESS) SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ #endif /* USER_VECT_TAB_ADDRESS */ } - 8000880: bf00 nop - 8000882: 46bd mov sp, r7 - 8000884: f85d 7b04 ldr.w r7, [sp], #4 - 8000888: 4770 bx lr - 800088a: bf00 nop - 800088c: e000ed00 .word 0xe000ed00 + 8000804: bf00 nop + 8000806: 46bd mov sp, r7 + 8000808: f85d 7b04 ldr.w r7, [sp], #4 + 800080c: 4770 bx lr + 800080e: bf00 nop + 8000810: e000ed00 .word 0xe000ed00 -08000890 : +08000814 : .section .text.Reset_Handler .weak Reset_Handler .type Reset_Handler, %function Reset_Handler: ldr sp, =_estack /* set stack pointer */ - 8000890: f8df d034 ldr.w sp, [pc, #52] ; 80008c8 + 8000814: f8df d034 ldr.w sp, [pc, #52] ; 800084c /* Copy the data segment initializers from flash to SRAM */ ldr r0, =_sdata - 8000894: 480d ldr r0, [pc, #52] ; (80008cc ) + 8000818: 480d ldr r0, [pc, #52] ; (8000850 ) ldr r1, =_edata - 8000896: 490e ldr r1, [pc, #56] ; (80008d0 ) + 800081a: 490e ldr r1, [pc, #56] ; (8000854 ) ldr r2, =_sidata - 8000898: 4a0e ldr r2, [pc, #56] ; (80008d4 ) + 800081c: 4a0e ldr r2, [pc, #56] ; (8000858 ) movs r3, #0 - 800089a: 2300 movs r3, #0 + 800081e: 2300 movs r3, #0 b LoopCopyDataInit - 800089c: e002 b.n 80008a4 + 8000820: e002 b.n 8000828 -0800089e : +08000822 : CopyDataInit: ldr r4, [r2, r3] - 800089e: 58d4 ldr r4, [r2, r3] + 8000822: 58d4 ldr r4, [r2, r3] str r4, [r0, r3] - 80008a0: 50c4 str r4, [r0, r3] + 8000824: 50c4 str r4, [r0, r3] adds r3, r3, #4 - 80008a2: 3304 adds r3, #4 + 8000826: 3304 adds r3, #4 -080008a4 : +08000828 : LoopCopyDataInit: adds r4, r0, r3 - 80008a4: 18c4 adds r4, r0, r3 + 8000828: 18c4 adds r4, r0, r3 cmp r4, r1 - 80008a6: 428c cmp r4, r1 + 800082a: 428c cmp r4, r1 bcc CopyDataInit - 80008a8: d3f9 bcc.n 800089e + 800082c: d3f9 bcc.n 8000822 /* Zero fill the bss segment. */ ldr r2, =_sbss - 80008aa: 4a0b ldr r2, [pc, #44] ; (80008d8 ) + 800082e: 4a0b ldr r2, [pc, #44] ; (800085c ) ldr r4, =_ebss - 80008ac: 4c0b ldr r4, [pc, #44] ; (80008dc ) + 8000830: 4c0b ldr r4, [pc, #44] ; (8000860 ) movs r3, #0 - 80008ae: 2300 movs r3, #0 + 8000832: 2300 movs r3, #0 b LoopFillZerobss - 80008b0: e001 b.n 80008b6 + 8000834: e001 b.n 800083a -080008b2 : +08000836 : FillZerobss: str r3, [r2] - 80008b2: 6013 str r3, [r2, #0] + 8000836: 6013 str r3, [r2, #0] adds r2, r2, #4 - 80008b4: 3204 adds r2, #4 + 8000838: 3204 adds r2, #4 -080008b6 : +0800083a : LoopFillZerobss: cmp r2, r4 - 80008b6: 42a2 cmp r2, r4 + 800083a: 42a2 cmp r2, r4 bcc FillZerobss - 80008b8: d3fb bcc.n 80008b2 + 800083c: d3fb bcc.n 8000836 /* Call the clock system initialization function.*/ bl SystemInit - 80008ba: f7ff ffd7 bl 800086c + 800083e: f7ff ffd7 bl 80007f0 /* Call static constructors */ bl __libc_init_array - 80008be: f002 fb5d bl 8002f7c <__libc_init_array> + 8000842: f002 fb33 bl 8002eac <__libc_init_array> /* Call the application's entry point.*/ bl main - 80008c2: f7ff fe41 bl 8000548
    + 8000846: f7ff feed bl 8000624
    bx lr - 80008c6: 4770 bx lr + 800084a: 4770 bx lr ldr sp, =_estack /* set stack pointer */ - 80008c8: 20020000 .word 0x20020000 + 800084c: 20020000 .word 0x20020000 ldr r0, =_sdata - 80008cc: 20000000 .word 0x20000000 + 8000850: 20000000 .word 0x20000000 ldr r1, =_edata - 80008d0: 20000010 .word 0x20000010 + 8000854: 20000010 .word 0x20000010 ldr r2, =_sidata - 80008d4: 08003064 .word 0x08003064 + 8000858: 08002f94 .word 0x08002f94 ldr r2, =_sbss - 80008d8: 20000010 .word 0x20000010 + 800085c: 20000010 .word 0x20000010 ldr r4, =_ebss - 80008dc: 20003fe0 .word 0x20003fe0 + 8000860: 20003fe0 .word 0x20003fe0 -080008e0 : +08000864 : * @retval None */ .section .text.Default_Handler,"ax",%progbits Default_Handler: Infinite_Loop: b Infinite_Loop - 80008e0: e7fe b.n 80008e0 + 8000864: e7fe b.n 8000864 ... -080008e4 : +08000868 : * 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) { - 80008e4: b580 push {r7, lr} - 80008e6: af00 add r7, sp, #0 + 8000868: b580 push {r7, lr} + 800086a: af00 add r7, sp, #0 /* Configure Flash prefetch, Instruction cache, Data cache */ #if (INSTRUCTION_CACHE_ENABLE != 0U) __HAL_FLASH_INSTRUCTION_CACHE_ENABLE(); - 80008e8: 4b0e ldr r3, [pc, #56] ; (8000924 ) - 80008ea: 681b ldr r3, [r3, #0] - 80008ec: 4a0d ldr r2, [pc, #52] ; (8000924 ) - 80008ee: f443 7300 orr.w r3, r3, #512 ; 0x200 - 80008f2: 6013 str r3, [r2, #0] + 800086c: 4b0e ldr r3, [pc, #56] ; (80008a8 ) + 800086e: 681b ldr r3, [r3, #0] + 8000870: 4a0d ldr r2, [pc, #52] ; (80008a8 ) + 8000872: f443 7300 orr.w r3, r3, #512 ; 0x200 + 8000876: 6013 str r3, [r2, #0] #endif /* INSTRUCTION_CACHE_ENABLE */ #if (DATA_CACHE_ENABLE != 0U) __HAL_FLASH_DATA_CACHE_ENABLE(); - 80008f4: 4b0b ldr r3, [pc, #44] ; (8000924 ) - 80008f6: 681b ldr r3, [r3, #0] - 80008f8: 4a0a ldr r2, [pc, #40] ; (8000924 ) - 80008fa: f443 6380 orr.w r3, r3, #1024 ; 0x400 - 80008fe: 6013 str r3, [r2, #0] + 8000878: 4b0b ldr r3, [pc, #44] ; (80008a8 ) + 800087a: 681b ldr r3, [r3, #0] + 800087c: 4a0a ldr r2, [pc, #40] ; (80008a8 ) + 800087e: f443 6380 orr.w r3, r3, #1024 ; 0x400 + 8000882: 6013 str r3, [r2, #0] #endif /* DATA_CACHE_ENABLE */ #if (PREFETCH_ENABLE != 0U) __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); - 8000900: 4b08 ldr r3, [pc, #32] ; (8000924 ) - 8000902: 681b ldr r3, [r3, #0] - 8000904: 4a07 ldr r2, [pc, #28] ; (8000924 ) - 8000906: f443 7380 orr.w r3, r3, #256 ; 0x100 - 800090a: 6013 str r3, [r2, #0] + 8000884: 4b08 ldr r3, [pc, #32] ; (80008a8 ) + 8000886: 681b ldr r3, [r3, #0] + 8000888: 4a07 ldr r2, [pc, #28] ; (80008a8 ) + 800088a: f443 7380 orr.w r3, r3, #256 ; 0x100 + 800088e: 6013 str r3, [r2, #0] #endif /* PREFETCH_ENABLE */ /* Set Interrupt Group Priority */ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); - 800090c: 2003 movs r0, #3 - 800090e: f000 f931 bl 8000b74 + 8000890: 2003 movs r0, #3 + 8000892: f000 f90d bl 8000ab0 /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */ HAL_InitTick(TICK_INT_PRIORITY); - 8000912: 200f movs r0, #15 - 8000914: f000 f808 bl 8000928 + 8000896: 200f movs r0, #15 + 8000898: f000 f808 bl 80008ac /* Init the low level hardware */ HAL_MspInit(); - 8000918: f7ff ff58 bl 80007cc + 800089c: f7ff ff54 bl 8000748 /* Return function status */ return HAL_OK; - 800091c: 2300 movs r3, #0 + 80008a0: 2300 movs r3, #0 } - 800091e: 4618 mov r0, r3 - 8000920: bd80 pop {r7, pc} - 8000922: bf00 nop - 8000924: 40023c00 .word 0x40023c00 + 80008a2: 4618 mov r0, r3 + 80008a4: bd80 pop {r7, pc} + 80008a6: bf00 nop + 80008a8: 40023c00 .word 0x40023c00 -08000928 : +080008ac : * implementation in user file. * @param TickPriority Tick interrupt priority. * @retval HAL status */ __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { - 8000928: b580 push {r7, lr} - 800092a: b082 sub sp, #8 - 800092c: af00 add r7, sp, #0 - 800092e: 6078 str r0, [r7, #4] + 80008ac: b580 push {r7, lr} + 80008ae: b082 sub sp, #8 + 80008b0: af00 add r7, sp, #0 + 80008b2: 6078 str r0, [r7, #4] /* Configure the SysTick to have interrupt in 1ms time basis*/ if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) - 8000930: 4b12 ldr r3, [pc, #72] ; (800097c ) - 8000932: 681a ldr r2, [r3, #0] - 8000934: 4b12 ldr r3, [pc, #72] ; (8000980 ) - 8000936: 781b ldrb r3, [r3, #0] - 8000938: 4619 mov r1, r3 - 800093a: f44f 737a mov.w r3, #1000 ; 0x3e8 - 800093e: fbb3 f3f1 udiv r3, r3, r1 - 8000942: fbb2 f3f3 udiv r3, r2, r3 - 8000946: 4618 mov r0, r3 - 8000948: f000 f93b bl 8000bc2 - 800094c: 4603 mov r3, r0 - 800094e: 2b00 cmp r3, #0 - 8000950: d001 beq.n 8000956 + 80008b4: 4b12 ldr r3, [pc, #72] ; (8000900 ) + 80008b6: 681a ldr r2, [r3, #0] + 80008b8: 4b12 ldr r3, [pc, #72] ; (8000904 ) + 80008ba: 781b ldrb r3, [r3, #0] + 80008bc: 4619 mov r1, r3 + 80008be: f44f 737a mov.w r3, #1000 ; 0x3e8 + 80008c2: fbb3 f3f1 udiv r3, r3, r1 + 80008c6: fbb2 f3f3 udiv r3, r2, r3 + 80008ca: 4618 mov r0, r3 + 80008cc: f000 f917 bl 8000afe + 80008d0: 4603 mov r3, r0 + 80008d2: 2b00 cmp r3, #0 + 80008d4: d001 beq.n 80008da { return HAL_ERROR; - 8000952: 2301 movs r3, #1 - 8000954: e00e b.n 8000974 + 80008d6: 2301 movs r3, #1 + 80008d8: e00e b.n 80008f8 } /* Configure the SysTick IRQ priority */ if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - 8000956: 687b ldr r3, [r7, #4] - 8000958: 2b0f cmp r3, #15 - 800095a: d80a bhi.n 8000972 + 80008da: 687b ldr r3, [r7, #4] + 80008dc: 2b0f cmp r3, #15 + 80008de: d80a bhi.n 80008f6 { HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); - 800095c: 2200 movs r2, #0 - 800095e: 6879 ldr r1, [r7, #4] - 8000960: f04f 30ff mov.w r0, #4294967295 - 8000964: f000 f911 bl 8000b8a + 80008e0: 2200 movs r2, #0 + 80008e2: 6879 ldr r1, [r7, #4] + 80008e4: f04f 30ff mov.w r0, #4294967295 + 80008e8: f000 f8ed bl 8000ac6 uwTickPrio = TickPriority; - 8000968: 4a06 ldr r2, [pc, #24] ; (8000984 ) - 800096a: 687b ldr r3, [r7, #4] - 800096c: 6013 str r3, [r2, #0] + 80008ec: 4a06 ldr r2, [pc, #24] ; (8000908 ) + 80008ee: 687b ldr r3, [r7, #4] + 80008f0: 6013 str r3, [r2, #0] { return HAL_ERROR; } /* Return function status */ return HAL_OK; - 800096e: 2300 movs r3, #0 - 8000970: e000 b.n 8000974 + 80008f2: 2300 movs r3, #0 + 80008f4: e000 b.n 80008f8 return HAL_ERROR; - 8000972: 2301 movs r3, #1 + 80008f6: 2301 movs r3, #1 } - 8000974: 4618 mov r0, r3 - 8000976: 3708 adds r7, #8 - 8000978: 46bd mov sp, r7 - 800097a: bd80 pop {r7, pc} - 800097c: 20000000 .word 0x20000000 - 8000980: 20000008 .word 0x20000008 - 8000984: 20000004 .word 0x20000004 - -08000988 : + 80008f8: 4618 mov r0, r3 + 80008fa: 3708 adds r7, #8 + 80008fc: 46bd mov sp, r7 + 80008fe: bd80 pop {r7, pc} + 8000900: 20000000 .word 0x20000000 + 8000904: 20000008 .word 0x20000008 + 8000908: 20000004 .word 0x20000004 + +0800090c : * @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) { - 8000988: b480 push {r7} - 800098a: af00 add r7, sp, #0 + 800090c: b480 push {r7} + 800090e: af00 add r7, sp, #0 uwTick += uwTickFreq; - 800098c: 4b06 ldr r3, [pc, #24] ; (80009a8 ) - 800098e: 781b ldrb r3, [r3, #0] - 8000990: 461a mov r2, r3 - 8000992: 4b06 ldr r3, [pc, #24] ; (80009ac ) - 8000994: 681b ldr r3, [r3, #0] - 8000996: 4413 add r3, r2 - 8000998: 4a04 ldr r2, [pc, #16] ; (80009ac ) - 800099a: 6013 str r3, [r2, #0] + 8000910: 4b06 ldr r3, [pc, #24] ; (800092c ) + 8000912: 781b ldrb r3, [r3, #0] + 8000914: 461a mov r2, r3 + 8000916: 4b06 ldr r3, [pc, #24] ; (8000930 ) + 8000918: 681b ldr r3, [r3, #0] + 800091a: 4413 add r3, r2 + 800091c: 4a04 ldr r2, [pc, #16] ; (8000930 ) + 800091e: 6013 str r3, [r2, #0] } - 800099c: bf00 nop - 800099e: 46bd mov sp, r7 - 80009a0: f85d 7b04 ldr.w r7, [sp], #4 - 80009a4: 4770 bx lr - 80009a6: bf00 nop - 80009a8: 20000008 .word 0x20000008 - 80009ac: 20000288 .word 0x20000288 - -080009b0 : + 8000920: bf00 nop + 8000922: 46bd mov sp, r7 + 8000924: f85d 7b04 ldr.w r7, [sp], #4 + 8000928: 4770 bx lr + 800092a: bf00 nop + 800092c: 20000008 .word 0x20000008 + 8000930: 20000288 .word 0x20000288 + +08000934 : * @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) { - 80009b0: b480 push {r7} - 80009b2: af00 add r7, sp, #0 + 8000934: b480 push {r7} + 8000936: af00 add r7, sp, #0 return uwTick; - 80009b4: 4b03 ldr r3, [pc, #12] ; (80009c4 ) - 80009b6: 681b ldr r3, [r3, #0] + 8000938: 4b03 ldr r3, [pc, #12] ; (8000948 ) + 800093a: 681b ldr r3, [r3, #0] } - 80009b8: 4618 mov r0, r3 - 80009ba: 46bd mov sp, r7 - 80009bc: f85d 7b04 ldr.w r7, [sp], #4 - 80009c0: 4770 bx lr - 80009c2: bf00 nop - 80009c4: 20000288 .word 0x20000288 - -080009c8 : - * implementations in user file. - * @param Delay specifies the delay time length, in milliseconds. - * @retval None - */ -__weak void HAL_Delay(uint32_t Delay) -{ - 80009c8: b580 push {r7, lr} - 80009ca: b084 sub sp, #16 - 80009cc: af00 add r7, sp, #0 - 80009ce: 6078 str r0, [r7, #4] - uint32_t tickstart = HAL_GetTick(); - 80009d0: f7ff ffee bl 80009b0 - 80009d4: 60b8 str r0, [r7, #8] - uint32_t wait = Delay; - 80009d6: 687b ldr r3, [r7, #4] - 80009d8: 60fb str r3, [r7, #12] - - /* Add a freq to guarantee minimum wait */ - if (wait < HAL_MAX_DELAY) - 80009da: 68fb ldr r3, [r7, #12] - 80009dc: f1b3 3fff cmp.w r3, #4294967295 - 80009e0: d005 beq.n 80009ee - { - wait += (uint32_t)(uwTickFreq); - 80009e2: 4b0a ldr r3, [pc, #40] ; (8000a0c ) - 80009e4: 781b ldrb r3, [r3, #0] - 80009e6: 461a mov r2, r3 - 80009e8: 68fb ldr r3, [r7, #12] - 80009ea: 4413 add r3, r2 - 80009ec: 60fb str r3, [r7, #12] - } - - while((HAL_GetTick() - tickstart) < wait) - 80009ee: bf00 nop - 80009f0: f7ff ffde bl 80009b0 - 80009f4: 4602 mov r2, r0 - 80009f6: 68bb ldr r3, [r7, #8] - 80009f8: 1ad3 subs r3, r2, r3 - 80009fa: 68fa ldr r2, [r7, #12] - 80009fc: 429a cmp r2, r3 - 80009fe: d8f7 bhi.n 80009f0 - { - } -} - 8000a00: bf00 nop - 8000a02: bf00 nop - 8000a04: 3710 adds r7, #16 - 8000a06: 46bd mov sp, r7 - 8000a08: bd80 pop {r7, pc} - 8000a0a: bf00 nop - 8000a0c: 20000008 .word 0x20000008 - -08000a10 <__NVIC_SetPriorityGrouping>: + 800093c: 4618 mov r0, r3 + 800093e: 46bd mov sp, r7 + 8000940: f85d 7b04 ldr.w r7, [sp], #4 + 8000944: 4770 bx lr + 8000946: bf00 nop + 8000948: 20000288 .word 0x20000288 + +0800094c <__NVIC_SetPriorityGrouping>: 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) { - 8000a10: b480 push {r7} - 8000a12: b085 sub sp, #20 - 8000a14: af00 add r7, sp, #0 - 8000a16: 6078 str r0, [r7, #4] + 800094c: b480 push {r7} + 800094e: b085 sub sp, #20 + 8000950: af00 add r7, sp, #0 + 8000952: 6078 str r0, [r7, #4] uint32_t reg_value; uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - 8000a18: 687b ldr r3, [r7, #4] - 8000a1a: f003 0307 and.w r3, r3, #7 - 8000a1e: 60fb str r3, [r7, #12] + 8000954: 687b ldr r3, [r7, #4] + 8000956: f003 0307 and.w r3, r3, #7 + 800095a: 60fb str r3, [r7, #12] reg_value = SCB->AIRCR; /* read old register configuration */ - 8000a20: 4b0c ldr r3, [pc, #48] ; (8000a54 <__NVIC_SetPriorityGrouping+0x44>) - 8000a22: 68db ldr r3, [r3, #12] - 8000a24: 60bb str r3, [r7, #8] + 800095c: 4b0c ldr r3, [pc, #48] ; (8000990 <__NVIC_SetPriorityGrouping+0x44>) + 800095e: 68db ldr r3, [r3, #12] + 8000960: 60bb str r3, [r7, #8] reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - 8000a26: 68ba ldr r2, [r7, #8] - 8000a28: f64f 03ff movw r3, #63743 ; 0xf8ff - 8000a2c: 4013 ands r3, r2 - 8000a2e: 60bb str r3, [r7, #8] + 8000962: 68ba ldr r2, [r7, #8] + 8000964: f64f 03ff movw r3, #63743 ; 0xf8ff + 8000968: 4013 ands r3, r2 + 800096a: 60bb str r3, [r7, #8] reg_value = (reg_value | ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - 8000a30: 68fb ldr r3, [r7, #12] - 8000a32: 021a lsls r2, r3, #8 + 800096c: 68fb ldr r3, [r7, #12] + 800096e: 021a lsls r2, r3, #8 ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - 8000a34: 68bb ldr r3, [r7, #8] - 8000a36: 4313 orrs r3, r2 + 8000970: 68bb ldr r3, [r7, #8] + 8000972: 4313 orrs r3, r2 reg_value = (reg_value | - 8000a38: f043 63bf orr.w r3, r3, #100139008 ; 0x5f80000 - 8000a3c: f443 3300 orr.w r3, r3, #131072 ; 0x20000 - 8000a40: 60bb str r3, [r7, #8] + 8000974: f043 63bf orr.w r3, r3, #100139008 ; 0x5f80000 + 8000978: f443 3300 orr.w r3, r3, #131072 ; 0x20000 + 800097c: 60bb str r3, [r7, #8] SCB->AIRCR = reg_value; - 8000a42: 4a04 ldr r2, [pc, #16] ; (8000a54 <__NVIC_SetPriorityGrouping+0x44>) - 8000a44: 68bb ldr r3, [r7, #8] - 8000a46: 60d3 str r3, [r2, #12] + 800097e: 4a04 ldr r2, [pc, #16] ; (8000990 <__NVIC_SetPriorityGrouping+0x44>) + 8000980: 68bb ldr r3, [r7, #8] + 8000982: 60d3 str r3, [r2, #12] } - 8000a48: bf00 nop - 8000a4a: 3714 adds r7, #20 - 8000a4c: 46bd mov sp, r7 - 8000a4e: f85d 7b04 ldr.w r7, [sp], #4 - 8000a52: 4770 bx lr - 8000a54: e000ed00 .word 0xe000ed00 - -08000a58 <__NVIC_GetPriorityGrouping>: + 8000984: bf00 nop + 8000986: 3714 adds r7, #20 + 8000988: 46bd mov sp, r7 + 800098a: f85d 7b04 ldr.w r7, [sp], #4 + 800098e: 4770 bx lr + 8000990: e000ed00 .word 0xe000ed00 + +08000994 <__NVIC_GetPriorityGrouping>: \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) { - 8000a58: b480 push {r7} - 8000a5a: af00 add r7, sp, #0 + 8000994: b480 push {r7} + 8000996: af00 add r7, sp, #0 return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); - 8000a5c: 4b04 ldr r3, [pc, #16] ; (8000a70 <__NVIC_GetPriorityGrouping+0x18>) - 8000a5e: 68db ldr r3, [r3, #12] - 8000a60: 0a1b lsrs r3, r3, #8 - 8000a62: f003 0307 and.w r3, r3, #7 + 8000998: 4b04 ldr r3, [pc, #16] ; (80009ac <__NVIC_GetPriorityGrouping+0x18>) + 800099a: 68db ldr r3, [r3, #12] + 800099c: 0a1b lsrs r3, r3, #8 + 800099e: f003 0307 and.w r3, r3, #7 } - 8000a66: 4618 mov r0, r3 - 8000a68: 46bd mov sp, r7 - 8000a6a: f85d 7b04 ldr.w r7, [sp], #4 - 8000a6e: 4770 bx lr - 8000a70: e000ed00 .word 0xe000ed00 + 80009a2: 4618 mov r0, r3 + 80009a4: 46bd mov sp, r7 + 80009a6: f85d 7b04 ldr.w r7, [sp], #4 + 80009aa: 4770 bx lr + 80009ac: e000ed00 .word 0xe000ed00 -08000a74 <__NVIC_SetPriority>: +080009b0 <__NVIC_SetPriority>: \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) { - 8000a74: b480 push {r7} - 8000a76: b083 sub sp, #12 - 8000a78: af00 add r7, sp, #0 - 8000a7a: 4603 mov r3, r0 - 8000a7c: 6039 str r1, [r7, #0] - 8000a7e: 71fb strb r3, [r7, #7] + 80009b0: b480 push {r7} + 80009b2: b083 sub sp, #12 + 80009b4: af00 add r7, sp, #0 + 80009b6: 4603 mov r3, r0 + 80009b8: 6039 str r1, [r7, #0] + 80009ba: 71fb strb r3, [r7, #7] if ((int32_t)(IRQn) >= 0) - 8000a80: f997 3007 ldrsb.w r3, [r7, #7] - 8000a84: 2b00 cmp r3, #0 - 8000a86: db0a blt.n 8000a9e <__NVIC_SetPriority+0x2a> + 80009bc: f997 3007 ldrsb.w r3, [r7, #7] + 80009c0: 2b00 cmp r3, #0 + 80009c2: db0a blt.n 80009da <__NVIC_SetPriority+0x2a> { NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - 8000a88: 683b ldr r3, [r7, #0] - 8000a8a: b2da uxtb r2, r3 - 8000a8c: 490c ldr r1, [pc, #48] ; (8000ac0 <__NVIC_SetPriority+0x4c>) - 8000a8e: f997 3007 ldrsb.w r3, [r7, #7] - 8000a92: 0112 lsls r2, r2, #4 - 8000a94: b2d2 uxtb r2, r2 - 8000a96: 440b add r3, r1 - 8000a98: f883 2300 strb.w r2, [r3, #768] ; 0x300 + 80009c4: 683b ldr r3, [r7, #0] + 80009c6: b2da uxtb r2, r3 + 80009c8: 490c ldr r1, [pc, #48] ; (80009fc <__NVIC_SetPriority+0x4c>) + 80009ca: f997 3007 ldrsb.w r3, [r7, #7] + 80009ce: 0112 lsls r2, r2, #4 + 80009d0: b2d2 uxtb r2, r2 + 80009d2: 440b add r3, r1 + 80009d4: f883 2300 strb.w r2, [r3, #768] ; 0x300 } else { SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); } } - 8000a9c: e00a b.n 8000ab4 <__NVIC_SetPriority+0x40> + 80009d8: e00a b.n 80009f0 <__NVIC_SetPriority+0x40> SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - 8000a9e: 683b ldr r3, [r7, #0] - 8000aa0: b2da uxtb r2, r3 - 8000aa2: 4908 ldr r1, [pc, #32] ; (8000ac4 <__NVIC_SetPriority+0x50>) - 8000aa4: 79fb ldrb r3, [r7, #7] - 8000aa6: f003 030f and.w r3, r3, #15 - 8000aaa: 3b04 subs r3, #4 - 8000aac: 0112 lsls r2, r2, #4 - 8000aae: b2d2 uxtb r2, r2 - 8000ab0: 440b add r3, r1 - 8000ab2: 761a strb r2, [r3, #24] + 80009da: 683b ldr r3, [r7, #0] + 80009dc: b2da uxtb r2, r3 + 80009de: 4908 ldr r1, [pc, #32] ; (8000a00 <__NVIC_SetPriority+0x50>) + 80009e0: 79fb ldrb r3, [r7, #7] + 80009e2: f003 030f and.w r3, r3, #15 + 80009e6: 3b04 subs r3, #4 + 80009e8: 0112 lsls r2, r2, #4 + 80009ea: b2d2 uxtb r2, r2 + 80009ec: 440b add r3, r1 + 80009ee: 761a strb r2, [r3, #24] } - 8000ab4: bf00 nop - 8000ab6: 370c adds r7, #12 - 8000ab8: 46bd mov sp, r7 - 8000aba: f85d 7b04 ldr.w r7, [sp], #4 - 8000abe: 4770 bx lr - 8000ac0: e000e100 .word 0xe000e100 - 8000ac4: e000ed00 .word 0xe000ed00 - -08000ac8 : + 80009f0: bf00 nop + 80009f2: 370c adds r7, #12 + 80009f4: 46bd mov sp, r7 + 80009f6: f85d 7b04 ldr.w r7, [sp], #4 + 80009fa: 4770 bx lr + 80009fc: e000e100 .word 0xe000e100 + 8000a00: e000ed00 .word 0xe000ed00 + +08000a04 : \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) { - 8000ac8: b480 push {r7} - 8000aca: b089 sub sp, #36 ; 0x24 - 8000acc: af00 add r7, sp, #0 - 8000ace: 60f8 str r0, [r7, #12] - 8000ad0: 60b9 str r1, [r7, #8] - 8000ad2: 607a str r2, [r7, #4] + 8000a04: b480 push {r7} + 8000a06: b089 sub sp, #36 ; 0x24 + 8000a08: af00 add r7, sp, #0 + 8000a0a: 60f8 str r0, [r7, #12] + 8000a0c: 60b9 str r1, [r7, #8] + 8000a0e: 607a str r2, [r7, #4] uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - 8000ad4: 68fb ldr r3, [r7, #12] - 8000ad6: f003 0307 and.w r3, r3, #7 - 8000ada: 61fb str r3, [r7, #28] + 8000a10: 68fb ldr r3, [r7, #12] + 8000a12: f003 0307 and.w r3, r3, #7 + 8000a16: 61fb str r3, [r7, #28] uint32_t PreemptPriorityBits; uint32_t SubPriorityBits; PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - 8000adc: 69fb ldr r3, [r7, #28] - 8000ade: f1c3 0307 rsb r3, r3, #7 - 8000ae2: 2b04 cmp r3, #4 - 8000ae4: bf28 it cs - 8000ae6: 2304 movcs r3, #4 - 8000ae8: 61bb str r3, [r7, #24] + 8000a18: 69fb ldr r3, [r7, #28] + 8000a1a: f1c3 0307 rsb r3, r3, #7 + 8000a1e: 2b04 cmp r3, #4 + 8000a20: bf28 it cs + 8000a22: 2304 movcs r3, #4 + 8000a24: 61bb str r3, [r7, #24] SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - 8000aea: 69fb ldr r3, [r7, #28] - 8000aec: 3304 adds r3, #4 - 8000aee: 2b06 cmp r3, #6 - 8000af0: d902 bls.n 8000af8 - 8000af2: 69fb ldr r3, [r7, #28] - 8000af4: 3b03 subs r3, #3 - 8000af6: e000 b.n 8000afa - 8000af8: 2300 movs r3, #0 - 8000afa: 617b str r3, [r7, #20] + 8000a26: 69fb ldr r3, [r7, #28] + 8000a28: 3304 adds r3, #4 + 8000a2a: 2b06 cmp r3, #6 + 8000a2c: d902 bls.n 8000a34 + 8000a2e: 69fb ldr r3, [r7, #28] + 8000a30: 3b03 subs r3, #3 + 8000a32: e000 b.n 8000a36 + 8000a34: 2300 movs r3, #0 + 8000a36: 617b str r3, [r7, #20] return ( ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - 8000afc: f04f 32ff mov.w r2, #4294967295 - 8000b00: 69bb ldr r3, [r7, #24] - 8000b02: fa02 f303 lsl.w r3, r2, r3 - 8000b06: 43da mvns r2, r3 - 8000b08: 68bb ldr r3, [r7, #8] - 8000b0a: 401a ands r2, r3 - 8000b0c: 697b ldr r3, [r7, #20] - 8000b0e: 409a lsls r2, r3 + 8000a38: f04f 32ff mov.w r2, #4294967295 + 8000a3c: 69bb ldr r3, [r7, #24] + 8000a3e: fa02 f303 lsl.w r3, r2, r3 + 8000a42: 43da mvns r2, r3 + 8000a44: 68bb ldr r3, [r7, #8] + 8000a46: 401a ands r2, r3 + 8000a48: 697b ldr r3, [r7, #20] + 8000a4a: 409a lsls r2, r3 ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - 8000b10: f04f 31ff mov.w r1, #4294967295 - 8000b14: 697b ldr r3, [r7, #20] - 8000b16: fa01 f303 lsl.w r3, r1, r3 - 8000b1a: 43d9 mvns r1, r3 - 8000b1c: 687b ldr r3, [r7, #4] - 8000b1e: 400b ands r3, r1 + 8000a4c: f04f 31ff mov.w r1, #4294967295 + 8000a50: 697b ldr r3, [r7, #20] + 8000a52: fa01 f303 lsl.w r3, r1, r3 + 8000a56: 43d9 mvns r1, r3 + 8000a58: 687b ldr r3, [r7, #4] + 8000a5a: 400b ands r3, r1 ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - 8000b20: 4313 orrs r3, r2 + 8000a5c: 4313 orrs r3, r2 ); } - 8000b22: 4618 mov r0, r3 - 8000b24: 3724 adds r7, #36 ; 0x24 - 8000b26: 46bd mov sp, r7 - 8000b28: f85d 7b04 ldr.w r7, [sp], #4 - 8000b2c: 4770 bx lr + 8000a5e: 4618 mov r0, r3 + 8000a60: 3724 adds r7, #36 ; 0x24 + 8000a62: 46bd mov sp, r7 + 8000a64: f85d 7b04 ldr.w r7, [sp], #4 + 8000a68: 4770 bx lr ... -08000b30 : +08000a6c : \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) { - 8000b30: b580 push {r7, lr} - 8000b32: b082 sub sp, #8 - 8000b34: af00 add r7, sp, #0 - 8000b36: 6078 str r0, [r7, #4] + 8000a6c: b580 push {r7, lr} + 8000a6e: b082 sub sp, #8 + 8000a70: af00 add r7, sp, #0 + 8000a72: 6078 str r0, [r7, #4] if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - 8000b38: 687b ldr r3, [r7, #4] - 8000b3a: 3b01 subs r3, #1 - 8000b3c: f1b3 7f80 cmp.w r3, #16777216 ; 0x1000000 - 8000b40: d301 bcc.n 8000b46 + 8000a74: 687b ldr r3, [r7, #4] + 8000a76: 3b01 subs r3, #1 + 8000a78: f1b3 7f80 cmp.w r3, #16777216 ; 0x1000000 + 8000a7c: d301 bcc.n 8000a82 { return (1UL); /* Reload value impossible */ - 8000b42: 2301 movs r3, #1 - 8000b44: e00f b.n 8000b66 + 8000a7e: 2301 movs r3, #1 + 8000a80: e00f b.n 8000aa2 } SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - 8000b46: 4a0a ldr r2, [pc, #40] ; (8000b70 ) - 8000b48: 687b ldr r3, [r7, #4] - 8000b4a: 3b01 subs r3, #1 - 8000b4c: 6053 str r3, [r2, #4] + 8000a82: 4a0a ldr r2, [pc, #40] ; (8000aac ) + 8000a84: 687b ldr r3, [r7, #4] + 8000a86: 3b01 subs r3, #1 + 8000a88: 6053 str r3, [r2, #4] NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - 8000b4e: 210f movs r1, #15 - 8000b50: f04f 30ff mov.w r0, #4294967295 - 8000b54: f7ff ff8e bl 8000a74 <__NVIC_SetPriority> + 8000a8a: 210f movs r1, #15 + 8000a8c: f04f 30ff mov.w r0, #4294967295 + 8000a90: f7ff ff8e bl 80009b0 <__NVIC_SetPriority> SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - 8000b58: 4b05 ldr r3, [pc, #20] ; (8000b70 ) - 8000b5a: 2200 movs r2, #0 - 8000b5c: 609a str r2, [r3, #8] + 8000a94: 4b05 ldr r3, [pc, #20] ; (8000aac ) + 8000a96: 2200 movs r2, #0 + 8000a98: 609a str r2, [r3, #8] SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - 8000b5e: 4b04 ldr r3, [pc, #16] ; (8000b70 ) - 8000b60: 2207 movs r2, #7 - 8000b62: 601a str r2, [r3, #0] + 8000a9a: 4b04 ldr r3, [pc, #16] ; (8000aac ) + 8000a9c: 2207 movs r2, #7 + 8000a9e: 601a str r2, [r3, #0] SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0UL); /* Function successful */ - 8000b64: 2300 movs r3, #0 + 8000aa0: 2300 movs r3, #0 } - 8000b66: 4618 mov r0, r3 - 8000b68: 3708 adds r7, #8 - 8000b6a: 46bd mov sp, r7 - 8000b6c: bd80 pop {r7, pc} - 8000b6e: bf00 nop - 8000b70: e000e010 .word 0xe000e010 - -08000b74 : + 8000aa2: 4618 mov r0, r3 + 8000aa4: 3708 adds r7, #8 + 8000aa6: 46bd mov sp, r7 + 8000aa8: bd80 pop {r7, pc} + 8000aaa: bf00 nop + 8000aac: e000e010 .word 0xe000e010 + +08000ab0 : * @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) { - 8000b74: b580 push {r7, lr} - 8000b76: b082 sub sp, #8 - 8000b78: af00 add r7, sp, #0 - 8000b7a: 6078 str r0, [r7, #4] + 8000ab0: b580 push {r7, lr} + 8000ab2: b082 sub sp, #8 + 8000ab4: af00 add r7, sp, #0 + 8000ab6: 6078 str r0, [r7, #4] /* 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); - 8000b7c: 6878 ldr r0, [r7, #4] - 8000b7e: f7ff ff47 bl 8000a10 <__NVIC_SetPriorityGrouping> + 8000ab8: 6878 ldr r0, [r7, #4] + 8000aba: f7ff ff47 bl 800094c <__NVIC_SetPriorityGrouping> } - 8000b82: bf00 nop - 8000b84: 3708 adds r7, #8 - 8000b86: 46bd mov sp, r7 - 8000b88: bd80 pop {r7, pc} + 8000abe: bf00 nop + 8000ac0: 3708 adds r7, #8 + 8000ac2: 46bd mov sp, r7 + 8000ac4: bd80 pop {r7, pc} -08000b8a : +08000ac6 : * 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) { - 8000b8a: b580 push {r7, lr} - 8000b8c: b086 sub sp, #24 - 8000b8e: af00 add r7, sp, #0 - 8000b90: 4603 mov r3, r0 - 8000b92: 60b9 str r1, [r7, #8] - 8000b94: 607a str r2, [r7, #4] - 8000b96: 73fb strb r3, [r7, #15] + 8000ac6: b580 push {r7, lr} + 8000ac8: b086 sub sp, #24 + 8000aca: af00 add r7, sp, #0 + 8000acc: 4603 mov r3, r0 + 8000ace: 60b9 str r1, [r7, #8] + 8000ad0: 607a str r2, [r7, #4] + 8000ad2: 73fb strb r3, [r7, #15] uint32_t prioritygroup = 0x00U; - 8000b98: 2300 movs r3, #0 - 8000b9a: 617b str r3, [r7, #20] + 8000ad4: 2300 movs r3, #0 + 8000ad6: 617b str r3, [r7, #20] /* Check the parameters */ assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); prioritygroup = NVIC_GetPriorityGrouping(); - 8000b9c: f7ff ff5c bl 8000a58 <__NVIC_GetPriorityGrouping> - 8000ba0: 6178 str r0, [r7, #20] + 8000ad8: f7ff ff5c bl 8000994 <__NVIC_GetPriorityGrouping> + 8000adc: 6178 str r0, [r7, #20] NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); - 8000ba2: 687a ldr r2, [r7, #4] - 8000ba4: 68b9 ldr r1, [r7, #8] - 8000ba6: 6978 ldr r0, [r7, #20] - 8000ba8: f7ff ff8e bl 8000ac8 - 8000bac: 4602 mov r2, r0 - 8000bae: f997 300f ldrsb.w r3, [r7, #15] - 8000bb2: 4611 mov r1, r2 - 8000bb4: 4618 mov r0, r3 - 8000bb6: f7ff ff5d bl 8000a74 <__NVIC_SetPriority> + 8000ade: 687a ldr r2, [r7, #4] + 8000ae0: 68b9 ldr r1, [r7, #8] + 8000ae2: 6978 ldr r0, [r7, #20] + 8000ae4: f7ff ff8e bl 8000a04 + 8000ae8: 4602 mov r2, r0 + 8000aea: f997 300f ldrsb.w r3, [r7, #15] + 8000aee: 4611 mov r1, r2 + 8000af0: 4618 mov r0, r3 + 8000af2: f7ff ff5d bl 80009b0 <__NVIC_SetPriority> } - 8000bba: bf00 nop - 8000bbc: 3718 adds r7, #24 - 8000bbe: 46bd mov sp, r7 - 8000bc0: bd80 pop {r7, pc} + 8000af6: bf00 nop + 8000af8: 3718 adds r7, #24 + 8000afa: 46bd mov sp, r7 + 8000afc: bd80 pop {r7, pc} -08000bc2 : +08000afe : * @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) { - 8000bc2: b580 push {r7, lr} - 8000bc4: b082 sub sp, #8 - 8000bc6: af00 add r7, sp, #0 - 8000bc8: 6078 str r0, [r7, #4] + 8000afe: b580 push {r7, lr} + 8000b00: b082 sub sp, #8 + 8000b02: af00 add r7, sp, #0 + 8000b04: 6078 str r0, [r7, #4] return SysTick_Config(TicksNumb); - 8000bca: 6878 ldr r0, [r7, #4] - 8000bcc: f7ff ffb0 bl 8000b30 - 8000bd0: 4603 mov r3, r0 + 8000b06: 6878 ldr r0, [r7, #4] + 8000b08: f7ff ffb0 bl 8000a6c + 8000b0c: 4603 mov r3, r0 } - 8000bd2: 4618 mov r0, r3 - 8000bd4: 3708 adds r7, #8 - 8000bd6: 46bd mov sp, r7 - 8000bd8: bd80 pop {r7, pc} + 8000b0e: 4618 mov r0, r3 + 8000b10: 3708 adds r7, #8 + 8000b12: 46bd mov sp, r7 + 8000b14: bd80 pop {r7, pc} ... -08000bdc : +08000b18 : * @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) { - 8000bdc: b480 push {r7} - 8000bde: b089 sub sp, #36 ; 0x24 - 8000be0: af00 add r7, sp, #0 - 8000be2: 6078 str r0, [r7, #4] - 8000be4: 6039 str r1, [r7, #0] + 8000b18: b480 push {r7} + 8000b1a: b089 sub sp, #36 ; 0x24 + 8000b1c: af00 add r7, sp, #0 + 8000b1e: 6078 str r0, [r7, #4] + 8000b20: 6039 str r1, [r7, #0] uint32_t position; uint32_t ioposition = 0x00U; - 8000be6: 2300 movs r3, #0 - 8000be8: 617b str r3, [r7, #20] + 8000b22: 2300 movs r3, #0 + 8000b24: 617b str r3, [r7, #20] uint32_t iocurrent = 0x00U; - 8000bea: 2300 movs r3, #0 - 8000bec: 613b str r3, [r7, #16] + 8000b26: 2300 movs r3, #0 + 8000b28: 613b str r3, [r7, #16] uint32_t temp = 0x00U; - 8000bee: 2300 movs r3, #0 - 8000bf0: 61bb str r3, [r7, #24] + 8000b2a: 2300 movs r3, #0 + 8000b2c: 61bb str r3, [r7, #24] assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); /* Configure the port pins */ for(position = 0U; position < GPIO_NUMBER; position++) - 8000bf2: 2300 movs r3, #0 - 8000bf4: 61fb str r3, [r7, #28] - 8000bf6: e165 b.n 8000ec4 + 8000b2e: 2300 movs r3, #0 + 8000b30: 61fb str r3, [r7, #28] + 8000b32: e165 b.n 8000e00 { /* Get the IO position */ ioposition = 0x01U << position; - 8000bf8: 2201 movs r2, #1 - 8000bfa: 69fb ldr r3, [r7, #28] - 8000bfc: fa02 f303 lsl.w r3, r2, r3 - 8000c00: 617b str r3, [r7, #20] + 8000b34: 2201 movs r2, #1 + 8000b36: 69fb ldr r3, [r7, #28] + 8000b38: fa02 f303 lsl.w r3, r2, r3 + 8000b3c: 617b str r3, [r7, #20] /* Get the current IO position */ iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition; - 8000c02: 683b ldr r3, [r7, #0] - 8000c04: 681b ldr r3, [r3, #0] - 8000c06: 697a ldr r2, [r7, #20] - 8000c08: 4013 ands r3, r2 - 8000c0a: 613b str r3, [r7, #16] + 8000b3e: 683b ldr r3, [r7, #0] + 8000b40: 681b ldr r3, [r3, #0] + 8000b42: 697a ldr r2, [r7, #20] + 8000b44: 4013 ands r3, r2 + 8000b46: 613b str r3, [r7, #16] if(iocurrent == ioposition) - 8000c0c: 693a ldr r2, [r7, #16] - 8000c0e: 697b ldr r3, [r7, #20] - 8000c10: 429a cmp r2, r3 - 8000c12: f040 8154 bne.w 8000ebe + 8000b48: 693a ldr r2, [r7, #16] + 8000b4a: 697b ldr r3, [r7, #20] + 8000b4c: 429a cmp r2, r3 + 8000b4e: f040 8154 bne.w 8000dfa { /*--------------------- GPIO Mode Configuration ------------------------*/ /* In case of Output or Alternate function mode selection */ if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || \ - 8000c16: 683b ldr r3, [r7, #0] - 8000c18: 685b ldr r3, [r3, #4] - 8000c1a: f003 0303 and.w r3, r3, #3 - 8000c1e: 2b01 cmp r3, #1 - 8000c20: d005 beq.n 8000c2e + 8000b52: 683b ldr r3, [r7, #0] + 8000b54: 685b ldr r3, [r3, #4] + 8000b56: f003 0303 and.w r3, r3, #3 + 8000b5a: 2b01 cmp r3, #1 + 8000b5c: d005 beq.n 8000b6a (GPIO_Init->Mode & GPIO_MODE) == MODE_AF) - 8000c22: 683b ldr r3, [r7, #0] - 8000c24: 685b ldr r3, [r3, #4] - 8000c26: f003 0303 and.w r3, r3, #3 + 8000b5e: 683b ldr r3, [r7, #0] + 8000b60: 685b ldr r3, [r3, #4] + 8000b62: f003 0303 and.w r3, r3, #3 if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || \ - 8000c2a: 2b02 cmp r3, #2 - 8000c2c: d130 bne.n 8000c90 + 8000b66: 2b02 cmp r3, #2 + 8000b68: d130 bne.n 8000bcc { /* Check the Speed parameter */ assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); /* Configure the IO Speed */ temp = GPIOx->OSPEEDR; - 8000c2e: 687b ldr r3, [r7, #4] - 8000c30: 689b ldr r3, [r3, #8] - 8000c32: 61bb str r3, [r7, #24] + 8000b6a: 687b ldr r3, [r7, #4] + 8000b6c: 689b ldr r3, [r3, #8] + 8000b6e: 61bb str r3, [r7, #24] temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2U)); - 8000c34: 69fb ldr r3, [r7, #28] - 8000c36: 005b lsls r3, r3, #1 - 8000c38: 2203 movs r2, #3 - 8000c3a: fa02 f303 lsl.w r3, r2, r3 - 8000c3e: 43db mvns r3, r3 - 8000c40: 69ba ldr r2, [r7, #24] - 8000c42: 4013 ands r3, r2 - 8000c44: 61bb str r3, [r7, #24] + 8000b70: 69fb ldr r3, [r7, #28] + 8000b72: 005b lsls r3, r3, #1 + 8000b74: 2203 movs r2, #3 + 8000b76: fa02 f303 lsl.w r3, r2, r3 + 8000b7a: 43db mvns r3, r3 + 8000b7c: 69ba ldr r2, [r7, #24] + 8000b7e: 4013 ands r3, r2 + 8000b80: 61bb str r3, [r7, #24] temp |= (GPIO_Init->Speed << (position * 2U)); - 8000c46: 683b ldr r3, [r7, #0] - 8000c48: 68da ldr r2, [r3, #12] - 8000c4a: 69fb ldr r3, [r7, #28] - 8000c4c: 005b lsls r3, r3, #1 - 8000c4e: fa02 f303 lsl.w r3, r2, r3 - 8000c52: 69ba ldr r2, [r7, #24] - 8000c54: 4313 orrs r3, r2 - 8000c56: 61bb str r3, [r7, #24] + 8000b82: 683b ldr r3, [r7, #0] + 8000b84: 68da ldr r2, [r3, #12] + 8000b86: 69fb ldr r3, [r7, #28] + 8000b88: 005b lsls r3, r3, #1 + 8000b8a: fa02 f303 lsl.w r3, r2, r3 + 8000b8e: 69ba ldr r2, [r7, #24] + 8000b90: 4313 orrs r3, r2 + 8000b92: 61bb str r3, [r7, #24] GPIOx->OSPEEDR = temp; - 8000c58: 687b ldr r3, [r7, #4] - 8000c5a: 69ba ldr r2, [r7, #24] - 8000c5c: 609a str r2, [r3, #8] + 8000b94: 687b ldr r3, [r7, #4] + 8000b96: 69ba ldr r2, [r7, #24] + 8000b98: 609a str r2, [r3, #8] /* Configure the IO Output Type */ temp = GPIOx->OTYPER; - 8000c5e: 687b ldr r3, [r7, #4] - 8000c60: 685b ldr r3, [r3, #4] - 8000c62: 61bb str r3, [r7, #24] + 8000b9a: 687b ldr r3, [r7, #4] + 8000b9c: 685b ldr r3, [r3, #4] + 8000b9e: 61bb str r3, [r7, #24] temp &= ~(GPIO_OTYPER_OT_0 << position) ; - 8000c64: 2201 movs r2, #1 - 8000c66: 69fb ldr r3, [r7, #28] - 8000c68: fa02 f303 lsl.w r3, r2, r3 - 8000c6c: 43db mvns r3, r3 - 8000c6e: 69ba ldr r2, [r7, #24] - 8000c70: 4013 ands r3, r2 - 8000c72: 61bb str r3, [r7, #24] + 8000ba0: 2201 movs r2, #1 + 8000ba2: 69fb ldr r3, [r7, #28] + 8000ba4: fa02 f303 lsl.w r3, r2, r3 + 8000ba8: 43db mvns r3, r3 + 8000baa: 69ba ldr r2, [r7, #24] + 8000bac: 4013 ands r3, r2 + 8000bae: 61bb str r3, [r7, #24] temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position); - 8000c74: 683b ldr r3, [r7, #0] - 8000c76: 685b ldr r3, [r3, #4] - 8000c78: 091b lsrs r3, r3, #4 - 8000c7a: f003 0201 and.w r2, r3, #1 - 8000c7e: 69fb ldr r3, [r7, #28] - 8000c80: fa02 f303 lsl.w r3, r2, r3 - 8000c84: 69ba ldr r2, [r7, #24] - 8000c86: 4313 orrs r3, r2 - 8000c88: 61bb str r3, [r7, #24] + 8000bb0: 683b ldr r3, [r7, #0] + 8000bb2: 685b ldr r3, [r3, #4] + 8000bb4: 091b lsrs r3, r3, #4 + 8000bb6: f003 0201 and.w r2, r3, #1 + 8000bba: 69fb ldr r3, [r7, #28] + 8000bbc: fa02 f303 lsl.w r3, r2, r3 + 8000bc0: 69ba ldr r2, [r7, #24] + 8000bc2: 4313 orrs r3, r2 + 8000bc4: 61bb str r3, [r7, #24] GPIOx->OTYPER = temp; - 8000c8a: 687b ldr r3, [r7, #4] - 8000c8c: 69ba ldr r2, [r7, #24] - 8000c8e: 605a str r2, [r3, #4] + 8000bc6: 687b ldr r3, [r7, #4] + 8000bc8: 69ba ldr r2, [r7, #24] + 8000bca: 605a str r2, [r3, #4] } if((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG) - 8000c90: 683b ldr r3, [r7, #0] - 8000c92: 685b ldr r3, [r3, #4] - 8000c94: f003 0303 and.w r3, r3, #3 - 8000c98: 2b03 cmp r3, #3 - 8000c9a: d017 beq.n 8000ccc + 8000bcc: 683b ldr r3, [r7, #0] + 8000bce: 685b ldr r3, [r3, #4] + 8000bd0: f003 0303 and.w r3, r3, #3 + 8000bd4: 2b03 cmp r3, #3 + 8000bd6: d017 beq.n 8000c08 { /* Check the parameters */ assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); /* Activate the Pull-up or Pull down resistor for the current IO */ temp = GPIOx->PUPDR; - 8000c9c: 687b ldr r3, [r7, #4] - 8000c9e: 68db ldr r3, [r3, #12] - 8000ca0: 61bb str r3, [r7, #24] + 8000bd8: 687b ldr r3, [r7, #4] + 8000bda: 68db ldr r3, [r3, #12] + 8000bdc: 61bb str r3, [r7, #24] temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2U)); - 8000ca2: 69fb ldr r3, [r7, #28] - 8000ca4: 005b lsls r3, r3, #1 - 8000ca6: 2203 movs r2, #3 - 8000ca8: fa02 f303 lsl.w r3, r2, r3 - 8000cac: 43db mvns r3, r3 - 8000cae: 69ba ldr r2, [r7, #24] - 8000cb0: 4013 ands r3, r2 - 8000cb2: 61bb str r3, [r7, #24] + 8000bde: 69fb ldr r3, [r7, #28] + 8000be0: 005b lsls r3, r3, #1 + 8000be2: 2203 movs r2, #3 + 8000be4: fa02 f303 lsl.w r3, r2, r3 + 8000be8: 43db mvns r3, r3 + 8000bea: 69ba ldr r2, [r7, #24] + 8000bec: 4013 ands r3, r2 + 8000bee: 61bb str r3, [r7, #24] temp |= ((GPIO_Init->Pull) << (position * 2U)); - 8000cb4: 683b ldr r3, [r7, #0] - 8000cb6: 689a ldr r2, [r3, #8] - 8000cb8: 69fb ldr r3, [r7, #28] - 8000cba: 005b lsls r3, r3, #1 - 8000cbc: fa02 f303 lsl.w r3, r2, r3 - 8000cc0: 69ba ldr r2, [r7, #24] - 8000cc2: 4313 orrs r3, r2 - 8000cc4: 61bb str r3, [r7, #24] + 8000bf0: 683b ldr r3, [r7, #0] + 8000bf2: 689a ldr r2, [r3, #8] + 8000bf4: 69fb ldr r3, [r7, #28] + 8000bf6: 005b lsls r3, r3, #1 + 8000bf8: fa02 f303 lsl.w r3, r2, r3 + 8000bfc: 69ba ldr r2, [r7, #24] + 8000bfe: 4313 orrs r3, r2 + 8000c00: 61bb str r3, [r7, #24] GPIOx->PUPDR = temp; - 8000cc6: 687b ldr r3, [r7, #4] - 8000cc8: 69ba ldr r2, [r7, #24] - 8000cca: 60da str r2, [r3, #12] + 8000c02: 687b ldr r3, [r7, #4] + 8000c04: 69ba ldr r2, [r7, #24] + 8000c06: 60da str r2, [r3, #12] } /* In case of Alternate function mode selection */ if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) - 8000ccc: 683b ldr r3, [r7, #0] - 8000cce: 685b ldr r3, [r3, #4] - 8000cd0: f003 0303 and.w r3, r3, #3 - 8000cd4: 2b02 cmp r3, #2 - 8000cd6: d123 bne.n 8000d20 + 8000c08: 683b ldr r3, [r7, #0] + 8000c0a: 685b ldr r3, [r3, #4] + 8000c0c: f003 0303 and.w r3, r3, #3 + 8000c10: 2b02 cmp r3, #2 + 8000c12: d123 bne.n 8000c5c { /* 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]; - 8000cd8: 69fb ldr r3, [r7, #28] - 8000cda: 08da lsrs r2, r3, #3 - 8000cdc: 687b ldr r3, [r7, #4] - 8000cde: 3208 adds r2, #8 - 8000ce0: f853 3022 ldr.w r3, [r3, r2, lsl #2] - 8000ce4: 61bb str r3, [r7, #24] + 8000c14: 69fb ldr r3, [r7, #28] + 8000c16: 08da lsrs r2, r3, #3 + 8000c18: 687b ldr r3, [r7, #4] + 8000c1a: 3208 adds r2, #8 + 8000c1c: f853 3022 ldr.w r3, [r3, r2, lsl #2] + 8000c20: 61bb str r3, [r7, #24] temp &= ~(0xFU << ((uint32_t)(position & 0x07U) * 4U)) ; - 8000ce6: 69fb ldr r3, [r7, #28] - 8000ce8: f003 0307 and.w r3, r3, #7 - 8000cec: 009b lsls r3, r3, #2 - 8000cee: 220f movs r2, #15 - 8000cf0: fa02 f303 lsl.w r3, r2, r3 - 8000cf4: 43db mvns r3, r3 - 8000cf6: 69ba ldr r2, [r7, #24] - 8000cf8: 4013 ands r3, r2 - 8000cfa: 61bb str r3, [r7, #24] + 8000c22: 69fb ldr r3, [r7, #28] + 8000c24: f003 0307 and.w r3, r3, #7 + 8000c28: 009b lsls r3, r3, #2 + 8000c2a: 220f movs r2, #15 + 8000c2c: fa02 f303 lsl.w r3, r2, r3 + 8000c30: 43db mvns r3, r3 + 8000c32: 69ba ldr r2, [r7, #24] + 8000c34: 4013 ands r3, r2 + 8000c36: 61bb str r3, [r7, #24] temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & 0x07U) * 4U)); - 8000cfc: 683b ldr r3, [r7, #0] - 8000cfe: 691a ldr r2, [r3, #16] - 8000d00: 69fb ldr r3, [r7, #28] - 8000d02: f003 0307 and.w r3, r3, #7 - 8000d06: 009b lsls r3, r3, #2 - 8000d08: fa02 f303 lsl.w r3, r2, r3 - 8000d0c: 69ba ldr r2, [r7, #24] - 8000d0e: 4313 orrs r3, r2 - 8000d10: 61bb str r3, [r7, #24] + 8000c38: 683b ldr r3, [r7, #0] + 8000c3a: 691a ldr r2, [r3, #16] + 8000c3c: 69fb ldr r3, [r7, #28] + 8000c3e: f003 0307 and.w r3, r3, #7 + 8000c42: 009b lsls r3, r3, #2 + 8000c44: fa02 f303 lsl.w r3, r2, r3 + 8000c48: 69ba ldr r2, [r7, #24] + 8000c4a: 4313 orrs r3, r2 + 8000c4c: 61bb str r3, [r7, #24] GPIOx->AFR[position >> 3U] = temp; - 8000d12: 69fb ldr r3, [r7, #28] - 8000d14: 08da lsrs r2, r3, #3 - 8000d16: 687b ldr r3, [r7, #4] - 8000d18: 3208 adds r2, #8 - 8000d1a: 69b9 ldr r1, [r7, #24] - 8000d1c: f843 1022 str.w r1, [r3, r2, lsl #2] + 8000c4e: 69fb ldr r3, [r7, #28] + 8000c50: 08da lsrs r2, r3, #3 + 8000c52: 687b ldr r3, [r7, #4] + 8000c54: 3208 adds r2, #8 + 8000c56: 69b9 ldr r1, [r7, #24] + 8000c58: f843 1022 str.w r1, [r3, r2, lsl #2] } /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ temp = GPIOx->MODER; - 8000d20: 687b ldr r3, [r7, #4] - 8000d22: 681b ldr r3, [r3, #0] - 8000d24: 61bb str r3, [r7, #24] + 8000c5c: 687b ldr r3, [r7, #4] + 8000c5e: 681b ldr r3, [r3, #0] + 8000c60: 61bb str r3, [r7, #24] temp &= ~(GPIO_MODER_MODER0 << (position * 2U)); - 8000d26: 69fb ldr r3, [r7, #28] - 8000d28: 005b lsls r3, r3, #1 - 8000d2a: 2203 movs r2, #3 - 8000d2c: fa02 f303 lsl.w r3, r2, r3 - 8000d30: 43db mvns r3, r3 - 8000d32: 69ba ldr r2, [r7, #24] - 8000d34: 4013 ands r3, r2 - 8000d36: 61bb str r3, [r7, #24] + 8000c62: 69fb ldr r3, [r7, #28] + 8000c64: 005b lsls r3, r3, #1 + 8000c66: 2203 movs r2, #3 + 8000c68: fa02 f303 lsl.w r3, r2, r3 + 8000c6c: 43db mvns r3, r3 + 8000c6e: 69ba ldr r2, [r7, #24] + 8000c70: 4013 ands r3, r2 + 8000c72: 61bb str r3, [r7, #24] temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2U)); - 8000d38: 683b ldr r3, [r7, #0] - 8000d3a: 685b ldr r3, [r3, #4] - 8000d3c: f003 0203 and.w r2, r3, #3 - 8000d40: 69fb ldr r3, [r7, #28] - 8000d42: 005b lsls r3, r3, #1 - 8000d44: fa02 f303 lsl.w r3, r2, r3 - 8000d48: 69ba ldr r2, [r7, #24] - 8000d4a: 4313 orrs r3, r2 - 8000d4c: 61bb str r3, [r7, #24] + 8000c74: 683b ldr r3, [r7, #0] + 8000c76: 685b ldr r3, [r3, #4] + 8000c78: f003 0203 and.w r2, r3, #3 + 8000c7c: 69fb ldr r3, [r7, #28] + 8000c7e: 005b lsls r3, r3, #1 + 8000c80: fa02 f303 lsl.w r3, r2, r3 + 8000c84: 69ba ldr r2, [r7, #24] + 8000c86: 4313 orrs r3, r2 + 8000c88: 61bb str r3, [r7, #24] GPIOx->MODER = temp; - 8000d4e: 687b ldr r3, [r7, #4] - 8000d50: 69ba ldr r2, [r7, #24] - 8000d52: 601a str r2, [r3, #0] + 8000c8a: 687b ldr r3, [r7, #4] + 8000c8c: 69ba ldr r2, [r7, #24] + 8000c8e: 601a str r2, [r3, #0] /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) != 0x00U) - 8000d54: 683b ldr r3, [r7, #0] - 8000d56: 685b ldr r3, [r3, #4] - 8000d58: f403 3340 and.w r3, r3, #196608 ; 0x30000 - 8000d5c: 2b00 cmp r3, #0 - 8000d5e: f000 80ae beq.w 8000ebe + 8000c90: 683b ldr r3, [r7, #0] + 8000c92: 685b ldr r3, [r3, #4] + 8000c94: f403 3340 and.w r3, r3, #196608 ; 0x30000 + 8000c98: 2b00 cmp r3, #0 + 8000c9a: f000 80ae beq.w 8000dfa { /* Enable SYSCFG Clock */ __HAL_RCC_SYSCFG_CLK_ENABLE(); - 8000d62: 2300 movs r3, #0 - 8000d64: 60fb str r3, [r7, #12] - 8000d66: 4b5d ldr r3, [pc, #372] ; (8000edc ) - 8000d68: 6c5b ldr r3, [r3, #68] ; 0x44 - 8000d6a: 4a5c ldr r2, [pc, #368] ; (8000edc ) - 8000d6c: f443 4380 orr.w r3, r3, #16384 ; 0x4000 - 8000d70: 6453 str r3, [r2, #68] ; 0x44 - 8000d72: 4b5a ldr r3, [pc, #360] ; (8000edc ) - 8000d74: 6c5b ldr r3, [r3, #68] ; 0x44 - 8000d76: f403 4380 and.w r3, r3, #16384 ; 0x4000 - 8000d7a: 60fb str r3, [r7, #12] - 8000d7c: 68fb ldr r3, [r7, #12] + 8000c9e: 2300 movs r3, #0 + 8000ca0: 60fb str r3, [r7, #12] + 8000ca2: 4b5d ldr r3, [pc, #372] ; (8000e18 ) + 8000ca4: 6c5b ldr r3, [r3, #68] ; 0x44 + 8000ca6: 4a5c ldr r2, [pc, #368] ; (8000e18 ) + 8000ca8: f443 4380 orr.w r3, r3, #16384 ; 0x4000 + 8000cac: 6453 str r3, [r2, #68] ; 0x44 + 8000cae: 4b5a ldr r3, [pc, #360] ; (8000e18 ) + 8000cb0: 6c5b ldr r3, [r3, #68] ; 0x44 + 8000cb2: f403 4380 and.w r3, r3, #16384 ; 0x4000 + 8000cb6: 60fb str r3, [r7, #12] + 8000cb8: 68fb ldr r3, [r7, #12] temp = SYSCFG->EXTICR[position >> 2U]; - 8000d7e: 4a58 ldr r2, [pc, #352] ; (8000ee0 ) - 8000d80: 69fb ldr r3, [r7, #28] - 8000d82: 089b lsrs r3, r3, #2 - 8000d84: 3302 adds r3, #2 - 8000d86: f852 3023 ldr.w r3, [r2, r3, lsl #2] - 8000d8a: 61bb str r3, [r7, #24] + 8000cba: 4a58 ldr r2, [pc, #352] ; (8000e1c ) + 8000cbc: 69fb ldr r3, [r7, #28] + 8000cbe: 089b lsrs r3, r3, #2 + 8000cc0: 3302 adds r3, #2 + 8000cc2: f852 3023 ldr.w r3, [r2, r3, lsl #2] + 8000cc6: 61bb str r3, [r7, #24] temp &= ~(0x0FU << (4U * (position & 0x03U))); - 8000d8c: 69fb ldr r3, [r7, #28] - 8000d8e: f003 0303 and.w r3, r3, #3 - 8000d92: 009b lsls r3, r3, #2 - 8000d94: 220f movs r2, #15 - 8000d96: fa02 f303 lsl.w r3, r2, r3 - 8000d9a: 43db mvns r3, r3 - 8000d9c: 69ba ldr r2, [r7, #24] - 8000d9e: 4013 ands r3, r2 - 8000da0: 61bb str r3, [r7, #24] + 8000cc8: 69fb ldr r3, [r7, #28] + 8000cca: f003 0303 and.w r3, r3, #3 + 8000cce: 009b lsls r3, r3, #2 + 8000cd0: 220f movs r2, #15 + 8000cd2: fa02 f303 lsl.w r3, r2, r3 + 8000cd6: 43db mvns r3, r3 + 8000cd8: 69ba ldr r2, [r7, #24] + 8000cda: 4013 ands r3, r2 + 8000cdc: 61bb str r3, [r7, #24] temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4U * (position & 0x03U))); - 8000da2: 687b ldr r3, [r7, #4] - 8000da4: 4a4f ldr r2, [pc, #316] ; (8000ee4 ) - 8000da6: 4293 cmp r3, r2 - 8000da8: d025 beq.n 8000df6 - 8000daa: 687b ldr r3, [r7, #4] - 8000dac: 4a4e ldr r2, [pc, #312] ; (8000ee8 ) - 8000dae: 4293 cmp r3, r2 - 8000db0: d01f beq.n 8000df2 - 8000db2: 687b ldr r3, [r7, #4] - 8000db4: 4a4d ldr r2, [pc, #308] ; (8000eec ) - 8000db6: 4293 cmp r3, r2 - 8000db8: d019 beq.n 8000dee - 8000dba: 687b ldr r3, [r7, #4] - 8000dbc: 4a4c ldr r2, [pc, #304] ; (8000ef0 ) - 8000dbe: 4293 cmp r3, r2 - 8000dc0: d013 beq.n 8000dea - 8000dc2: 687b ldr r3, [r7, #4] - 8000dc4: 4a4b ldr r2, [pc, #300] ; (8000ef4 ) - 8000dc6: 4293 cmp r3, r2 - 8000dc8: d00d beq.n 8000de6 - 8000dca: 687b ldr r3, [r7, #4] - 8000dcc: 4a4a ldr r2, [pc, #296] ; (8000ef8 ) - 8000dce: 4293 cmp r3, r2 - 8000dd0: d007 beq.n 8000de2 - 8000dd2: 687b ldr r3, [r7, #4] - 8000dd4: 4a49 ldr r2, [pc, #292] ; (8000efc ) - 8000dd6: 4293 cmp r3, r2 - 8000dd8: d101 bne.n 8000dde - 8000dda: 2306 movs r3, #6 - 8000ddc: e00c b.n 8000df8 - 8000dde: 2307 movs r3, #7 - 8000de0: e00a b.n 8000df8 - 8000de2: 2305 movs r3, #5 - 8000de4: e008 b.n 8000df8 - 8000de6: 2304 movs r3, #4 - 8000de8: e006 b.n 8000df8 - 8000dea: 2303 movs r3, #3 - 8000dec: e004 b.n 8000df8 - 8000dee: 2302 movs r3, #2 - 8000df0: e002 b.n 8000df8 - 8000df2: 2301 movs r3, #1 - 8000df4: e000 b.n 8000df8 - 8000df6: 2300 movs r3, #0 - 8000df8: 69fa ldr r2, [r7, #28] - 8000dfa: f002 0203 and.w r2, r2, #3 - 8000dfe: 0092 lsls r2, r2, #2 - 8000e00: 4093 lsls r3, r2 - 8000e02: 69ba ldr r2, [r7, #24] - 8000e04: 4313 orrs r3, r2 - 8000e06: 61bb str r3, [r7, #24] + 8000cde: 687b ldr r3, [r7, #4] + 8000ce0: 4a4f ldr r2, [pc, #316] ; (8000e20 ) + 8000ce2: 4293 cmp r3, r2 + 8000ce4: d025 beq.n 8000d32 + 8000ce6: 687b ldr r3, [r7, #4] + 8000ce8: 4a4e ldr r2, [pc, #312] ; (8000e24 ) + 8000cea: 4293 cmp r3, r2 + 8000cec: d01f beq.n 8000d2e + 8000cee: 687b ldr r3, [r7, #4] + 8000cf0: 4a4d ldr r2, [pc, #308] ; (8000e28 ) + 8000cf2: 4293 cmp r3, r2 + 8000cf4: d019 beq.n 8000d2a + 8000cf6: 687b ldr r3, [r7, #4] + 8000cf8: 4a4c ldr r2, [pc, #304] ; (8000e2c ) + 8000cfa: 4293 cmp r3, r2 + 8000cfc: d013 beq.n 8000d26 + 8000cfe: 687b ldr r3, [r7, #4] + 8000d00: 4a4b ldr r2, [pc, #300] ; (8000e30 ) + 8000d02: 4293 cmp r3, r2 + 8000d04: d00d beq.n 8000d22 + 8000d06: 687b ldr r3, [r7, #4] + 8000d08: 4a4a ldr r2, [pc, #296] ; (8000e34 ) + 8000d0a: 4293 cmp r3, r2 + 8000d0c: d007 beq.n 8000d1e + 8000d0e: 687b ldr r3, [r7, #4] + 8000d10: 4a49 ldr r2, [pc, #292] ; (8000e38 ) + 8000d12: 4293 cmp r3, r2 + 8000d14: d101 bne.n 8000d1a + 8000d16: 2306 movs r3, #6 + 8000d18: e00c b.n 8000d34 + 8000d1a: 2307 movs r3, #7 + 8000d1c: e00a b.n 8000d34 + 8000d1e: 2305 movs r3, #5 + 8000d20: e008 b.n 8000d34 + 8000d22: 2304 movs r3, #4 + 8000d24: e006 b.n 8000d34 + 8000d26: 2303 movs r3, #3 + 8000d28: e004 b.n 8000d34 + 8000d2a: 2302 movs r3, #2 + 8000d2c: e002 b.n 8000d34 + 8000d2e: 2301 movs r3, #1 + 8000d30: e000 b.n 8000d34 + 8000d32: 2300 movs r3, #0 + 8000d34: 69fa ldr r2, [r7, #28] + 8000d36: f002 0203 and.w r2, r2, #3 + 8000d3a: 0092 lsls r2, r2, #2 + 8000d3c: 4093 lsls r3, r2 + 8000d3e: 69ba ldr r2, [r7, #24] + 8000d40: 4313 orrs r3, r2 + 8000d42: 61bb str r3, [r7, #24] SYSCFG->EXTICR[position >> 2U] = temp; - 8000e08: 4935 ldr r1, [pc, #212] ; (8000ee0 ) - 8000e0a: 69fb ldr r3, [r7, #28] - 8000e0c: 089b lsrs r3, r3, #2 - 8000e0e: 3302 adds r3, #2 - 8000e10: 69ba ldr r2, [r7, #24] - 8000e12: f841 2023 str.w r2, [r1, r3, lsl #2] + 8000d44: 4935 ldr r1, [pc, #212] ; (8000e1c ) + 8000d46: 69fb ldr r3, [r7, #28] + 8000d48: 089b lsrs r3, r3, #2 + 8000d4a: 3302 adds r3, #2 + 8000d4c: 69ba ldr r2, [r7, #24] + 8000d4e: f841 2023 str.w r2, [r1, r3, lsl #2] /* Clear Rising Falling edge configuration */ temp = EXTI->RTSR; - 8000e16: 4b3a ldr r3, [pc, #232] ; (8000f00 ) - 8000e18: 689b ldr r3, [r3, #8] - 8000e1a: 61bb str r3, [r7, #24] + 8000d52: 4b3a ldr r3, [pc, #232] ; (8000e3c ) + 8000d54: 689b ldr r3, [r3, #8] + 8000d56: 61bb str r3, [r7, #24] temp &= ~((uint32_t)iocurrent); - 8000e1c: 693b ldr r3, [r7, #16] - 8000e1e: 43db mvns r3, r3 - 8000e20: 69ba ldr r2, [r7, #24] - 8000e22: 4013 ands r3, r2 - 8000e24: 61bb str r3, [r7, #24] + 8000d58: 693b ldr r3, [r7, #16] + 8000d5a: 43db mvns r3, r3 + 8000d5c: 69ba ldr r2, [r7, #24] + 8000d5e: 4013 ands r3, r2 + 8000d60: 61bb str r3, [r7, #24] if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00U) - 8000e26: 683b ldr r3, [r7, #0] - 8000e28: 685b ldr r3, [r3, #4] - 8000e2a: f403 1380 and.w r3, r3, #1048576 ; 0x100000 - 8000e2e: 2b00 cmp r3, #0 - 8000e30: d003 beq.n 8000e3a + 8000d62: 683b ldr r3, [r7, #0] + 8000d64: 685b ldr r3, [r3, #4] + 8000d66: f403 1380 and.w r3, r3, #1048576 ; 0x100000 + 8000d6a: 2b00 cmp r3, #0 + 8000d6c: d003 beq.n 8000d76 { temp |= iocurrent; - 8000e32: 69ba ldr r2, [r7, #24] - 8000e34: 693b ldr r3, [r7, #16] - 8000e36: 4313 orrs r3, r2 - 8000e38: 61bb str r3, [r7, #24] + 8000d6e: 69ba ldr r2, [r7, #24] + 8000d70: 693b ldr r3, [r7, #16] + 8000d72: 4313 orrs r3, r2 + 8000d74: 61bb str r3, [r7, #24] } EXTI->RTSR = temp; - 8000e3a: 4a31 ldr r2, [pc, #196] ; (8000f00 ) - 8000e3c: 69bb ldr r3, [r7, #24] - 8000e3e: 6093 str r3, [r2, #8] + 8000d76: 4a31 ldr r2, [pc, #196] ; (8000e3c ) + 8000d78: 69bb ldr r3, [r7, #24] + 8000d7a: 6093 str r3, [r2, #8] temp = EXTI->FTSR; - 8000e40: 4b2f ldr r3, [pc, #188] ; (8000f00 ) - 8000e42: 68db ldr r3, [r3, #12] - 8000e44: 61bb str r3, [r7, #24] + 8000d7c: 4b2f ldr r3, [pc, #188] ; (8000e3c ) + 8000d7e: 68db ldr r3, [r3, #12] + 8000d80: 61bb str r3, [r7, #24] temp &= ~((uint32_t)iocurrent); - 8000e46: 693b ldr r3, [r7, #16] - 8000e48: 43db mvns r3, r3 - 8000e4a: 69ba ldr r2, [r7, #24] - 8000e4c: 4013 ands r3, r2 - 8000e4e: 61bb str r3, [r7, #24] + 8000d82: 693b ldr r3, [r7, #16] + 8000d84: 43db mvns r3, r3 + 8000d86: 69ba ldr r2, [r7, #24] + 8000d88: 4013 ands r3, r2 + 8000d8a: 61bb str r3, [r7, #24] if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00U) - 8000e50: 683b ldr r3, [r7, #0] - 8000e52: 685b ldr r3, [r3, #4] - 8000e54: f403 1300 and.w r3, r3, #2097152 ; 0x200000 - 8000e58: 2b00 cmp r3, #0 - 8000e5a: d003 beq.n 8000e64 + 8000d8c: 683b ldr r3, [r7, #0] + 8000d8e: 685b ldr r3, [r3, #4] + 8000d90: f403 1300 and.w r3, r3, #2097152 ; 0x200000 + 8000d94: 2b00 cmp r3, #0 + 8000d96: d003 beq.n 8000da0 { temp |= iocurrent; - 8000e5c: 69ba ldr r2, [r7, #24] - 8000e5e: 693b ldr r3, [r7, #16] - 8000e60: 4313 orrs r3, r2 - 8000e62: 61bb str r3, [r7, #24] + 8000d98: 69ba ldr r2, [r7, #24] + 8000d9a: 693b ldr r3, [r7, #16] + 8000d9c: 4313 orrs r3, r2 + 8000d9e: 61bb str r3, [r7, #24] } EXTI->FTSR = temp; - 8000e64: 4a26 ldr r2, [pc, #152] ; (8000f00 ) - 8000e66: 69bb ldr r3, [r7, #24] - 8000e68: 60d3 str r3, [r2, #12] + 8000da0: 4a26 ldr r2, [pc, #152] ; (8000e3c ) + 8000da2: 69bb ldr r3, [r7, #24] + 8000da4: 60d3 str r3, [r2, #12] temp = EXTI->EMR; - 8000e6a: 4b25 ldr r3, [pc, #148] ; (8000f00 ) - 8000e6c: 685b ldr r3, [r3, #4] - 8000e6e: 61bb str r3, [r7, #24] + 8000da6: 4b25 ldr r3, [pc, #148] ; (8000e3c ) + 8000da8: 685b ldr r3, [r3, #4] + 8000daa: 61bb str r3, [r7, #24] temp &= ~((uint32_t)iocurrent); - 8000e70: 693b ldr r3, [r7, #16] - 8000e72: 43db mvns r3, r3 - 8000e74: 69ba ldr r2, [r7, #24] - 8000e76: 4013 ands r3, r2 - 8000e78: 61bb str r3, [r7, #24] + 8000dac: 693b ldr r3, [r7, #16] + 8000dae: 43db mvns r3, r3 + 8000db0: 69ba ldr r2, [r7, #24] + 8000db2: 4013 ands r3, r2 + 8000db4: 61bb str r3, [r7, #24] if((GPIO_Init->Mode & EXTI_EVT) != 0x00U) - 8000e7a: 683b ldr r3, [r7, #0] - 8000e7c: 685b ldr r3, [r3, #4] - 8000e7e: f403 3300 and.w r3, r3, #131072 ; 0x20000 - 8000e82: 2b00 cmp r3, #0 - 8000e84: d003 beq.n 8000e8e + 8000db6: 683b ldr r3, [r7, #0] + 8000db8: 685b ldr r3, [r3, #4] + 8000dba: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8000dbe: 2b00 cmp r3, #0 + 8000dc0: d003 beq.n 8000dca { temp |= iocurrent; - 8000e86: 69ba ldr r2, [r7, #24] - 8000e88: 693b ldr r3, [r7, #16] - 8000e8a: 4313 orrs r3, r2 - 8000e8c: 61bb str r3, [r7, #24] + 8000dc2: 69ba ldr r2, [r7, #24] + 8000dc4: 693b ldr r3, [r7, #16] + 8000dc6: 4313 orrs r3, r2 + 8000dc8: 61bb str r3, [r7, #24] } EXTI->EMR = temp; - 8000e8e: 4a1c ldr r2, [pc, #112] ; (8000f00 ) - 8000e90: 69bb ldr r3, [r7, #24] - 8000e92: 6053 str r3, [r2, #4] + 8000dca: 4a1c ldr r2, [pc, #112] ; (8000e3c ) + 8000dcc: 69bb ldr r3, [r7, #24] + 8000dce: 6053 str r3, [r2, #4] /* Clear EXTI line configuration */ temp = EXTI->IMR; - 8000e94: 4b1a ldr r3, [pc, #104] ; (8000f00 ) - 8000e96: 681b ldr r3, [r3, #0] - 8000e98: 61bb str r3, [r7, #24] + 8000dd0: 4b1a ldr r3, [pc, #104] ; (8000e3c ) + 8000dd2: 681b ldr r3, [r3, #0] + 8000dd4: 61bb str r3, [r7, #24] temp &= ~((uint32_t)iocurrent); - 8000e9a: 693b ldr r3, [r7, #16] - 8000e9c: 43db mvns r3, r3 - 8000e9e: 69ba ldr r2, [r7, #24] - 8000ea0: 4013 ands r3, r2 - 8000ea2: 61bb str r3, [r7, #24] + 8000dd6: 693b ldr r3, [r7, #16] + 8000dd8: 43db mvns r3, r3 + 8000dda: 69ba ldr r2, [r7, #24] + 8000ddc: 4013 ands r3, r2 + 8000dde: 61bb str r3, [r7, #24] if((GPIO_Init->Mode & EXTI_IT) != 0x00U) - 8000ea4: 683b ldr r3, [r7, #0] - 8000ea6: 685b ldr r3, [r3, #4] - 8000ea8: f403 3380 and.w r3, r3, #65536 ; 0x10000 - 8000eac: 2b00 cmp r3, #0 - 8000eae: d003 beq.n 8000eb8 + 8000de0: 683b ldr r3, [r7, #0] + 8000de2: 685b ldr r3, [r3, #4] + 8000de4: f403 3380 and.w r3, r3, #65536 ; 0x10000 + 8000de8: 2b00 cmp r3, #0 + 8000dea: d003 beq.n 8000df4 { temp |= iocurrent; - 8000eb0: 69ba ldr r2, [r7, #24] - 8000eb2: 693b ldr r3, [r7, #16] - 8000eb4: 4313 orrs r3, r2 - 8000eb6: 61bb str r3, [r7, #24] + 8000dec: 69ba ldr r2, [r7, #24] + 8000dee: 693b ldr r3, [r7, #16] + 8000df0: 4313 orrs r3, r2 + 8000df2: 61bb str r3, [r7, #24] } EXTI->IMR = temp; - 8000eb8: 4a11 ldr r2, [pc, #68] ; (8000f00 ) - 8000eba: 69bb ldr r3, [r7, #24] - 8000ebc: 6013 str r3, [r2, #0] + 8000df4: 4a11 ldr r2, [pc, #68] ; (8000e3c ) + 8000df6: 69bb ldr r3, [r7, #24] + 8000df8: 6013 str r3, [r2, #0] for(position = 0U; position < GPIO_NUMBER; position++) - 8000ebe: 69fb ldr r3, [r7, #28] - 8000ec0: 3301 adds r3, #1 - 8000ec2: 61fb str r3, [r7, #28] - 8000ec4: 69fb ldr r3, [r7, #28] - 8000ec6: 2b0f cmp r3, #15 - 8000ec8: f67f ae96 bls.w 8000bf8 + 8000dfa: 69fb ldr r3, [r7, #28] + 8000dfc: 3301 adds r3, #1 + 8000dfe: 61fb str r3, [r7, #28] + 8000e00: 69fb ldr r3, [r7, #28] + 8000e02: 2b0f cmp r3, #15 + 8000e04: f67f ae96 bls.w 8000b34 } } } } - 8000ecc: bf00 nop - 8000ece: bf00 nop - 8000ed0: 3724 adds r7, #36 ; 0x24 - 8000ed2: 46bd mov sp, r7 - 8000ed4: f85d 7b04 ldr.w r7, [sp], #4 - 8000ed8: 4770 bx lr - 8000eda: bf00 nop - 8000edc: 40023800 .word 0x40023800 - 8000ee0: 40013800 .word 0x40013800 - 8000ee4: 40020000 .word 0x40020000 - 8000ee8: 40020400 .word 0x40020400 - 8000eec: 40020800 .word 0x40020800 - 8000ef0: 40020c00 .word 0x40020c00 - 8000ef4: 40021000 .word 0x40021000 - 8000ef8: 40021400 .word 0x40021400 - 8000efc: 40021800 .word 0x40021800 - 8000f00: 40013c00 .word 0x40013c00 - -08000f04 : + 8000e08: bf00 nop + 8000e0a: bf00 nop + 8000e0c: 3724 adds r7, #36 ; 0x24 + 8000e0e: 46bd mov sp, r7 + 8000e10: f85d 7b04 ldr.w r7, [sp], #4 + 8000e14: 4770 bx lr + 8000e16: bf00 nop + 8000e18: 40023800 .word 0x40023800 + 8000e1c: 40013800 .word 0x40013800 + 8000e20: 40020000 .word 0x40020000 + 8000e24: 40020400 .word 0x40020400 + 8000e28: 40020800 .word 0x40020800 + 8000e2c: 40020c00 .word 0x40020c00 + 8000e30: 40021000 .word 0x40021000 + 8000e34: 40021400 .word 0x40021400 + 8000e38: 40021800 .word 0x40021800 + 8000e3c: 40013c00 .word 0x40013c00 + +08000e40 : * @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) { - 8000f04: b480 push {r7} - 8000f06: b083 sub sp, #12 - 8000f08: af00 add r7, sp, #0 - 8000f0a: 6078 str r0, [r7, #4] - 8000f0c: 460b mov r3, r1 - 8000f0e: 807b strh r3, [r7, #2] - 8000f10: 4613 mov r3, r2 - 8000f12: 707b strb r3, [r7, #1] + 8000e40: b480 push {r7} + 8000e42: b083 sub sp, #12 + 8000e44: af00 add r7, sp, #0 + 8000e46: 6078 str r0, [r7, #4] + 8000e48: 460b mov r3, r1 + 8000e4a: 807b strh r3, [r7, #2] + 8000e4c: 4613 mov r3, r2 + 8000e4e: 707b strb r3, [r7, #1] /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); assert_param(IS_GPIO_PIN_ACTION(PinState)); if(PinState != GPIO_PIN_RESET) - 8000f14: 787b ldrb r3, [r7, #1] - 8000f16: 2b00 cmp r3, #0 - 8000f18: d003 beq.n 8000f22 + 8000e50: 787b ldrb r3, [r7, #1] + 8000e52: 2b00 cmp r3, #0 + 8000e54: d003 beq.n 8000e5e { GPIOx->BSRR = GPIO_Pin; - 8000f1a: 887a ldrh r2, [r7, #2] - 8000f1c: 687b ldr r3, [r7, #4] - 8000f1e: 619a str r2, [r3, #24] + 8000e56: 887a ldrh r2, [r7, #2] + 8000e58: 687b ldr r3, [r7, #4] + 8000e5a: 619a str r2, [r3, #24] } else { GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; } } - 8000f20: e003 b.n 8000f2a + 8000e5c: e003 b.n 8000e66 GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; - 8000f22: 887b ldrh r3, [r7, #2] - 8000f24: 041a lsls r2, r3, #16 - 8000f26: 687b ldr r3, [r7, #4] - 8000f28: 619a str r2, [r3, #24] + 8000e5e: 887b ldrh r3, [r7, #2] + 8000e60: 041a lsls r2, r3, #16 + 8000e62: 687b ldr r3, [r7, #4] + 8000e64: 619a str r2, [r3, #24] } - 8000f2a: bf00 nop - 8000f2c: 370c adds r7, #12 - 8000f2e: 46bd mov sp, r7 - 8000f30: f85d 7b04 ldr.w r7, [sp], #4 - 8000f34: 4770 bx lr + 8000e66: bf00 nop + 8000e68: 370c adds r7, #12 + 8000e6a: 46bd mov sp, r7 + 8000e6c: f85d 7b04 ldr.w r7, [sp], #4 + 8000e70: 4770 bx lr ... -08000f38 : +08000e74 : * 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) { - 8000f38: b580 push {r7, lr} - 8000f3a: b084 sub sp, #16 - 8000f3c: af00 add r7, sp, #0 - 8000f3e: 6078 str r0, [r7, #4] - 8000f40: 6039 str r1, [r7, #0] + 8000e74: b580 push {r7, lr} + 8000e76: b084 sub sp, #16 + 8000e78: af00 add r7, sp, #0 + 8000e7a: 6078 str r0, [r7, #4] + 8000e7c: 6039 str r1, [r7, #0] uint32_t tickstart; /* Check Null pointer */ if(RCC_ClkInitStruct == NULL) - 8000f42: 687b ldr r3, [r7, #4] - 8000f44: 2b00 cmp r3, #0 - 8000f46: d101 bne.n 8000f4c + 8000e7e: 687b ldr r3, [r7, #4] + 8000e80: 2b00 cmp r3, #0 + 8000e82: d101 bne.n 8000e88 { return HAL_ERROR; - 8000f48: 2301 movs r3, #1 - 8000f4a: e0cc b.n 80010e6 + 8000e84: 2301 movs r3, #1 + 8000e86: e0cc b.n 8001022 /* 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()) - 8000f4c: 4b68 ldr r3, [pc, #416] ; (80010f0 ) - 8000f4e: 681b ldr r3, [r3, #0] - 8000f50: f003 030f and.w r3, r3, #15 - 8000f54: 683a ldr r2, [r7, #0] - 8000f56: 429a cmp r2, r3 - 8000f58: d90c bls.n 8000f74 + 8000e88: 4b68 ldr r3, [pc, #416] ; (800102c ) + 8000e8a: 681b ldr r3, [r3, #0] + 8000e8c: f003 030f and.w r3, r3, #15 + 8000e90: 683a ldr r2, [r7, #0] + 8000e92: 429a cmp r2, r3 + 8000e94: d90c bls.n 8000eb0 { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); - 8000f5a: 4b65 ldr r3, [pc, #404] ; (80010f0 ) - 8000f5c: 683a ldr r2, [r7, #0] - 8000f5e: b2d2 uxtb r2, r2 - 8000f60: 701a strb r2, [r3, #0] + 8000e96: 4b65 ldr r3, [pc, #404] ; (800102c ) + 8000e98: 683a ldr r2, [r7, #0] + 8000e9a: b2d2 uxtb r2, r2 + 8000e9c: 701a strb r2, [r3, #0] /* 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) - 8000f62: 4b63 ldr r3, [pc, #396] ; (80010f0 ) - 8000f64: 681b ldr r3, [r3, #0] - 8000f66: f003 030f and.w r3, r3, #15 - 8000f6a: 683a ldr r2, [r7, #0] - 8000f6c: 429a cmp r2, r3 - 8000f6e: d001 beq.n 8000f74 + 8000e9e: 4b63 ldr r3, [pc, #396] ; (800102c ) + 8000ea0: 681b ldr r3, [r3, #0] + 8000ea2: f003 030f and.w r3, r3, #15 + 8000ea6: 683a ldr r2, [r7, #0] + 8000ea8: 429a cmp r2, r3 + 8000eaa: d001 beq.n 8000eb0 { return HAL_ERROR; - 8000f70: 2301 movs r3, #1 - 8000f72: e0b8 b.n 80010e6 + 8000eac: 2301 movs r3, #1 + 8000eae: e0b8 b.n 8001022 } } /*-------------------------- HCLK Configuration --------------------------*/ if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) - 8000f74: 687b ldr r3, [r7, #4] - 8000f76: 681b ldr r3, [r3, #0] - 8000f78: f003 0302 and.w r3, r3, #2 - 8000f7c: 2b00 cmp r3, #0 - 8000f7e: d020 beq.n 8000fc2 + 8000eb0: 687b ldr r3, [r7, #4] + 8000eb2: 681b ldr r3, [r3, #0] + 8000eb4: f003 0302 and.w r3, r3, #2 + 8000eb8: 2b00 cmp r3, #0 + 8000eba: d020 beq.n 8000efe { /* 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) - 8000f80: 687b ldr r3, [r7, #4] - 8000f82: 681b ldr r3, [r3, #0] - 8000f84: f003 0304 and.w r3, r3, #4 - 8000f88: 2b00 cmp r3, #0 - 8000f8a: d005 beq.n 8000f98 + 8000ebc: 687b ldr r3, [r7, #4] + 8000ebe: 681b ldr r3, [r3, #0] + 8000ec0: f003 0304 and.w r3, r3, #4 + 8000ec4: 2b00 cmp r3, #0 + 8000ec6: d005 beq.n 8000ed4 { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); - 8000f8c: 4b59 ldr r3, [pc, #356] ; (80010f4 ) - 8000f8e: 689b ldr r3, [r3, #8] - 8000f90: 4a58 ldr r2, [pc, #352] ; (80010f4 ) - 8000f92: f443 53e0 orr.w r3, r3, #7168 ; 0x1c00 - 8000f96: 6093 str r3, [r2, #8] + 8000ec8: 4b59 ldr r3, [pc, #356] ; (8001030 ) + 8000eca: 689b ldr r3, [r3, #8] + 8000ecc: 4a58 ldr r2, [pc, #352] ; (8001030 ) + 8000ece: f443 53e0 orr.w r3, r3, #7168 ; 0x1c00 + 8000ed2: 6093 str r3, [r2, #8] } if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - 8000f98: 687b ldr r3, [r7, #4] - 8000f9a: 681b ldr r3, [r3, #0] - 8000f9c: f003 0308 and.w r3, r3, #8 - 8000fa0: 2b00 cmp r3, #0 - 8000fa2: d005 beq.n 8000fb0 + 8000ed4: 687b ldr r3, [r7, #4] + 8000ed6: 681b ldr r3, [r3, #0] + 8000ed8: f003 0308 and.w r3, r3, #8 + 8000edc: 2b00 cmp r3, #0 + 8000ede: d005 beq.n 8000eec { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); - 8000fa4: 4b53 ldr r3, [pc, #332] ; (80010f4 ) - 8000fa6: 689b ldr r3, [r3, #8] - 8000fa8: 4a52 ldr r2, [pc, #328] ; (80010f4 ) - 8000faa: f443 4360 orr.w r3, r3, #57344 ; 0xe000 - 8000fae: 6093 str r3, [r2, #8] + 8000ee0: 4b53 ldr r3, [pc, #332] ; (8001030 ) + 8000ee2: 689b ldr r3, [r3, #8] + 8000ee4: 4a52 ldr r2, [pc, #328] ; (8001030 ) + 8000ee6: f443 4360 orr.w r3, r3, #57344 ; 0xe000 + 8000eea: 6093 str r3, [r2, #8] } assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); - 8000fb0: 4b50 ldr r3, [pc, #320] ; (80010f4 ) - 8000fb2: 689b ldr r3, [r3, #8] - 8000fb4: f023 02f0 bic.w r2, r3, #240 ; 0xf0 - 8000fb8: 687b ldr r3, [r7, #4] - 8000fba: 689b ldr r3, [r3, #8] - 8000fbc: 494d ldr r1, [pc, #308] ; (80010f4 ) - 8000fbe: 4313 orrs r3, r2 - 8000fc0: 608b str r3, [r1, #8] + 8000eec: 4b50 ldr r3, [pc, #320] ; (8001030 ) + 8000eee: 689b ldr r3, [r3, #8] + 8000ef0: f023 02f0 bic.w r2, r3, #240 ; 0xf0 + 8000ef4: 687b ldr r3, [r7, #4] + 8000ef6: 689b ldr r3, [r3, #8] + 8000ef8: 494d ldr r1, [pc, #308] ; (8001030 ) + 8000efa: 4313 orrs r3, r2 + 8000efc: 608b str r3, [r1, #8] } /*------------------------- SYSCLK Configuration ---------------------------*/ if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) - 8000fc2: 687b ldr r3, [r7, #4] - 8000fc4: 681b ldr r3, [r3, #0] - 8000fc6: f003 0301 and.w r3, r3, #1 - 8000fca: 2b00 cmp r3, #0 - 8000fcc: d044 beq.n 8001058 + 8000efe: 687b ldr r3, [r7, #4] + 8000f00: 681b ldr r3, [r3, #0] + 8000f02: f003 0301 and.w r3, r3, #1 + 8000f06: 2b00 cmp r3, #0 + 8000f08: d044 beq.n 8000f94 { assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); /* HSE is selected as System Clock Source */ if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) - 8000fce: 687b ldr r3, [r7, #4] - 8000fd0: 685b ldr r3, [r3, #4] - 8000fd2: 2b01 cmp r3, #1 - 8000fd4: d107 bne.n 8000fe6 + 8000f0a: 687b ldr r3, [r7, #4] + 8000f0c: 685b ldr r3, [r3, #4] + 8000f0e: 2b01 cmp r3, #1 + 8000f10: d107 bne.n 8000f22 { /* Check the HSE ready flag */ if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - 8000fd6: 4b47 ldr r3, [pc, #284] ; (80010f4 ) - 8000fd8: 681b ldr r3, [r3, #0] - 8000fda: f403 3300 and.w r3, r3, #131072 ; 0x20000 - 8000fde: 2b00 cmp r3, #0 - 8000fe0: d119 bne.n 8001016 + 8000f12: 4b47 ldr r3, [pc, #284] ; (8001030 ) + 8000f14: 681b ldr r3, [r3, #0] + 8000f16: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8000f1a: 2b00 cmp r3, #0 + 8000f1c: d119 bne.n 8000f52 { return HAL_ERROR; - 8000fe2: 2301 movs r3, #1 - 8000fe4: e07f b.n 80010e6 + 8000f1e: 2301 movs r3, #1 + 8000f20: e07f b.n 8001022 } } /* PLL is selected as System Clock Source */ else if((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || - 8000fe6: 687b ldr r3, [r7, #4] - 8000fe8: 685b ldr r3, [r3, #4] - 8000fea: 2b02 cmp r3, #2 - 8000fec: d003 beq.n 8000ff6 + 8000f22: 687b ldr r3, [r7, #4] + 8000f24: 685b ldr r3, [r3, #4] + 8000f26: 2b02 cmp r3, #2 + 8000f28: d003 beq.n 8000f32 (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLRCLK)) - 8000fee: 687b ldr r3, [r7, #4] - 8000ff0: 685b ldr r3, [r3, #4] + 8000f2a: 687b ldr r3, [r7, #4] + 8000f2c: 685b ldr r3, [r3, #4] else if((RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) || - 8000ff2: 2b03 cmp r3, #3 - 8000ff4: d107 bne.n 8001006 + 8000f2e: 2b03 cmp r3, #3 + 8000f30: d107 bne.n 8000f42 { /* Check the PLL ready flag */ if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - 8000ff6: 4b3f ldr r3, [pc, #252] ; (80010f4 ) - 8000ff8: 681b ldr r3, [r3, #0] - 8000ffa: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 - 8000ffe: 2b00 cmp r3, #0 - 8001000: d109 bne.n 8001016 + 8000f32: 4b3f ldr r3, [pc, #252] ; (8001030 ) + 8000f34: 681b ldr r3, [r3, #0] + 8000f36: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 8000f3a: 2b00 cmp r3, #0 + 8000f3c: d109 bne.n 8000f52 { return HAL_ERROR; - 8001002: 2301 movs r3, #1 - 8001004: e06f b.n 80010e6 + 8000f3e: 2301 movs r3, #1 + 8000f40: e06f b.n 8001022 } /* HSI is selected as System Clock Source */ else { /* Check the HSI ready flag */ if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - 8001006: 4b3b ldr r3, [pc, #236] ; (80010f4 ) - 8001008: 681b ldr r3, [r3, #0] - 800100a: f003 0302 and.w r3, r3, #2 - 800100e: 2b00 cmp r3, #0 - 8001010: d101 bne.n 8001016 + 8000f42: 4b3b ldr r3, [pc, #236] ; (8001030 ) + 8000f44: 681b ldr r3, [r3, #0] + 8000f46: f003 0302 and.w r3, r3, #2 + 8000f4a: 2b00 cmp r3, #0 + 8000f4c: d101 bne.n 8000f52 { return HAL_ERROR; - 8001012: 2301 movs r3, #1 - 8001014: e067 b.n 80010e6 + 8000f4e: 2301 movs r3, #1 + 8000f50: e067 b.n 8001022 } } __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); - 8001016: 4b37 ldr r3, [pc, #220] ; (80010f4 ) - 8001018: 689b ldr r3, [r3, #8] - 800101a: f023 0203 bic.w r2, r3, #3 - 800101e: 687b ldr r3, [r7, #4] - 8001020: 685b ldr r3, [r3, #4] - 8001022: 4934 ldr r1, [pc, #208] ; (80010f4 ) - 8001024: 4313 orrs r3, r2 - 8001026: 608b str r3, [r1, #8] + 8000f52: 4b37 ldr r3, [pc, #220] ; (8001030 ) + 8000f54: 689b ldr r3, [r3, #8] + 8000f56: f023 0203 bic.w r2, r3, #3 + 8000f5a: 687b ldr r3, [r7, #4] + 8000f5c: 685b ldr r3, [r3, #4] + 8000f5e: 4934 ldr r1, [pc, #208] ; (8001030 ) + 8000f60: 4313 orrs r3, r2 + 8000f62: 608b str r3, [r1, #8] /* Get Start Tick */ tickstart = HAL_GetTick(); - 8001028: f7ff fcc2 bl 80009b0 - 800102c: 60f8 str r0, [r7, #12] + 8000f64: f7ff fce6 bl 8000934 + 8000f68: 60f8 str r0, [r7, #12] while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) - 800102e: e00a b.n 8001046 + 8000f6a: e00a b.n 8000f82 { if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) - 8001030: f7ff fcbe bl 80009b0 - 8001034: 4602 mov r2, r0 - 8001036: 68fb ldr r3, [r7, #12] - 8001038: 1ad3 subs r3, r2, r3 - 800103a: f241 3288 movw r2, #5000 ; 0x1388 - 800103e: 4293 cmp r3, r2 - 8001040: d901 bls.n 8001046 + 8000f6c: f7ff fce2 bl 8000934 + 8000f70: 4602 mov r2, r0 + 8000f72: 68fb ldr r3, [r7, #12] + 8000f74: 1ad3 subs r3, r2, r3 + 8000f76: f241 3288 movw r2, #5000 ; 0x1388 + 8000f7a: 4293 cmp r3, r2 + 8000f7c: d901 bls.n 8000f82 { return HAL_TIMEOUT; - 8001042: 2303 movs r3, #3 - 8001044: e04f b.n 80010e6 + 8000f7e: 2303 movs r3, #3 + 8000f80: e04f b.n 8001022 while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) - 8001046: 4b2b ldr r3, [pc, #172] ; (80010f4 ) - 8001048: 689b ldr r3, [r3, #8] - 800104a: f003 020c and.w r2, r3, #12 - 800104e: 687b ldr r3, [r7, #4] - 8001050: 685b ldr r3, [r3, #4] - 8001052: 009b lsls r3, r3, #2 - 8001054: 429a cmp r2, r3 - 8001056: d1eb bne.n 8001030 + 8000f82: 4b2b ldr r3, [pc, #172] ; (8001030 ) + 8000f84: 689b ldr r3, [r3, #8] + 8000f86: f003 020c and.w r2, r3, #12 + 8000f8a: 687b ldr r3, [r7, #4] + 8000f8c: 685b ldr r3, [r3, #4] + 8000f8e: 009b lsls r3, r3, #2 + 8000f90: 429a cmp r2, r3 + 8000f92: d1eb bne.n 8000f6c } } } /* Decreasing the number of wait states because of lower CPU frequency */ if(FLatency < __HAL_FLASH_GET_LATENCY()) - 8001058: 4b25 ldr r3, [pc, #148] ; (80010f0 ) - 800105a: 681b ldr r3, [r3, #0] - 800105c: f003 030f and.w r3, r3, #15 - 8001060: 683a ldr r2, [r7, #0] - 8001062: 429a cmp r2, r3 - 8001064: d20c bcs.n 8001080 + 8000f94: 4b25 ldr r3, [pc, #148] ; (800102c ) + 8000f96: 681b ldr r3, [r3, #0] + 8000f98: f003 030f and.w r3, r3, #15 + 8000f9c: 683a ldr r2, [r7, #0] + 8000f9e: 429a cmp r2, r3 + 8000fa0: d20c bcs.n 8000fbc { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); - 8001066: 4b22 ldr r3, [pc, #136] ; (80010f0 ) - 8001068: 683a ldr r2, [r7, #0] - 800106a: b2d2 uxtb r2, r2 - 800106c: 701a strb r2, [r3, #0] + 8000fa2: 4b22 ldr r3, [pc, #136] ; (800102c ) + 8000fa4: 683a ldr r2, [r7, #0] + 8000fa6: b2d2 uxtb r2, r2 + 8000fa8: 701a strb r2, [r3, #0] /* 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) - 800106e: 4b20 ldr r3, [pc, #128] ; (80010f0 ) - 8001070: 681b ldr r3, [r3, #0] - 8001072: f003 030f and.w r3, r3, #15 - 8001076: 683a ldr r2, [r7, #0] - 8001078: 429a cmp r2, r3 - 800107a: d001 beq.n 8001080 + 8000faa: 4b20 ldr r3, [pc, #128] ; (800102c ) + 8000fac: 681b ldr r3, [r3, #0] + 8000fae: f003 030f and.w r3, r3, #15 + 8000fb2: 683a ldr r2, [r7, #0] + 8000fb4: 429a cmp r2, r3 + 8000fb6: d001 beq.n 8000fbc { return HAL_ERROR; - 800107c: 2301 movs r3, #1 - 800107e: e032 b.n 80010e6 + 8000fb8: 2301 movs r3, #1 + 8000fba: e032 b.n 8001022 } } /*-------------------------- PCLK1 Configuration ---------------------------*/ if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) - 8001080: 687b ldr r3, [r7, #4] - 8001082: 681b ldr r3, [r3, #0] - 8001084: f003 0304 and.w r3, r3, #4 - 8001088: 2b00 cmp r3, #0 - 800108a: d008 beq.n 800109e + 8000fbc: 687b ldr r3, [r7, #4] + 8000fbe: 681b ldr r3, [r3, #0] + 8000fc0: f003 0304 and.w r3, r3, #4 + 8000fc4: 2b00 cmp r3, #0 + 8000fc6: d008 beq.n 8000fda { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); - 800108c: 4b19 ldr r3, [pc, #100] ; (80010f4 ) - 800108e: 689b ldr r3, [r3, #8] - 8001090: f423 52e0 bic.w r2, r3, #7168 ; 0x1c00 - 8001094: 687b ldr r3, [r7, #4] - 8001096: 68db ldr r3, [r3, #12] - 8001098: 4916 ldr r1, [pc, #88] ; (80010f4 ) - 800109a: 4313 orrs r3, r2 - 800109c: 608b str r3, [r1, #8] + 8000fc8: 4b19 ldr r3, [pc, #100] ; (8001030 ) + 8000fca: 689b ldr r3, [r3, #8] + 8000fcc: f423 52e0 bic.w r2, r3, #7168 ; 0x1c00 + 8000fd0: 687b ldr r3, [r7, #4] + 8000fd2: 68db ldr r3, [r3, #12] + 8000fd4: 4916 ldr r1, [pc, #88] ; (8001030 ) + 8000fd6: 4313 orrs r3, r2 + 8000fd8: 608b str r3, [r1, #8] } /*-------------------------- PCLK2 Configuration ---------------------------*/ if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) - 800109e: 687b ldr r3, [r7, #4] - 80010a0: 681b ldr r3, [r3, #0] - 80010a2: f003 0308 and.w r3, r3, #8 - 80010a6: 2b00 cmp r3, #0 - 80010a8: d009 beq.n 80010be + 8000fda: 687b ldr r3, [r7, #4] + 8000fdc: 681b ldr r3, [r3, #0] + 8000fde: f003 0308 and.w r3, r3, #8 + 8000fe2: 2b00 cmp r3, #0 + 8000fe4: d009 beq.n 8000ffa { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); - 80010aa: 4b12 ldr r3, [pc, #72] ; (80010f4 ) - 80010ac: 689b ldr r3, [r3, #8] - 80010ae: f423 4260 bic.w r2, r3, #57344 ; 0xe000 - 80010b2: 687b ldr r3, [r7, #4] - 80010b4: 691b ldr r3, [r3, #16] - 80010b6: 00db lsls r3, r3, #3 - 80010b8: 490e ldr r1, [pc, #56] ; (80010f4 ) - 80010ba: 4313 orrs r3, r2 - 80010bc: 608b str r3, [r1, #8] + 8000fe6: 4b12 ldr r3, [pc, #72] ; (8001030 ) + 8000fe8: 689b ldr r3, [r3, #8] + 8000fea: f423 4260 bic.w r2, r3, #57344 ; 0xe000 + 8000fee: 687b ldr r3, [r7, #4] + 8000ff0: 691b ldr r3, [r3, #16] + 8000ff2: 00db lsls r3, r3, #3 + 8000ff4: 490e ldr r1, [pc, #56] ; (8001030 ) + 8000ff6: 4313 orrs r3, r2 + 8000ff8: 608b str r3, [r1, #8] } /* Update the SystemCoreClock global variable */ SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; - 80010be: f000 f821 bl 8001104 - 80010c2: 4602 mov r2, r0 - 80010c4: 4b0b ldr r3, [pc, #44] ; (80010f4 ) - 80010c6: 689b ldr r3, [r3, #8] - 80010c8: 091b lsrs r3, r3, #4 - 80010ca: f003 030f and.w r3, r3, #15 - 80010ce: 490a ldr r1, [pc, #40] ; (80010f8 ) - 80010d0: 5ccb ldrb r3, [r1, r3] - 80010d2: fa22 f303 lsr.w r3, r2, r3 - 80010d6: 4a09 ldr r2, [pc, #36] ; (80010fc ) - 80010d8: 6013 str r3, [r2, #0] + 8000ffa: f000 f821 bl 8001040 + 8000ffe: 4602 mov r2, r0 + 8001000: 4b0b ldr r3, [pc, #44] ; (8001030 ) + 8001002: 689b ldr r3, [r3, #8] + 8001004: 091b lsrs r3, r3, #4 + 8001006: f003 030f and.w r3, r3, #15 + 800100a: 490a ldr r1, [pc, #40] ; (8001034 ) + 800100c: 5ccb ldrb r3, [r1, r3] + 800100e: fa22 f303 lsr.w r3, r2, r3 + 8001012: 4a09 ldr r2, [pc, #36] ; (8001038 ) + 8001014: 6013 str r3, [r2, #0] /* Configure the source of time base considering new system clocks settings */ HAL_InitTick (uwTickPrio); - 80010da: 4b09 ldr r3, [pc, #36] ; (8001100 ) - 80010dc: 681b ldr r3, [r3, #0] - 80010de: 4618 mov r0, r3 - 80010e0: f7ff fc22 bl 8000928 + 8001016: 4b09 ldr r3, [pc, #36] ; (800103c ) + 8001018: 681b ldr r3, [r3, #0] + 800101a: 4618 mov r0, r3 + 800101c: f7ff fc46 bl 80008ac return HAL_OK; - 80010e4: 2300 movs r3, #0 + 8001020: 2300 movs r3, #0 } - 80010e6: 4618 mov r0, r3 - 80010e8: 3710 adds r7, #16 - 80010ea: 46bd mov sp, r7 - 80010ec: bd80 pop {r7, pc} - 80010ee: bf00 nop - 80010f0: 40023c00 .word 0x40023c00 - 80010f4: 40023800 .word 0x40023800 - 80010f8: 08003044 .word 0x08003044 - 80010fc: 20000000 .word 0x20000000 - 8001100: 20000004 .word 0x20000004 - -08001104 : + 8001022: 4618 mov r0, r3 + 8001024: 3710 adds r7, #16 + 8001026: 46bd mov sp, r7 + 8001028: bd80 pop {r7, pc} + 800102a: bf00 nop + 800102c: 40023c00 .word 0x40023c00 + 8001030: 40023800 .word 0x40023800 + 8001034: 08002f74 .word 0x08002f74 + 8001038: 20000000 .word 0x20000000 + 800103c: 20000004 .word 0x20000004 + +08001040 : * * * @retval SYSCLK frequency */ uint32_t HAL_RCC_GetSysClockFreq(void) { - 8001104: e92d 4fb0 stmdb sp!, {r4, r5, r7, r8, r9, sl, fp, lr} - 8001108: b0ae sub sp, #184 ; 0xb8 - 800110a: af00 add r7, sp, #0 + 8001040: e92d 4fb0 stmdb sp!, {r4, r5, r7, r8, r9, sl, fp, lr} + 8001044: b0ae sub sp, #184 ; 0xb8 + 8001046: af00 add r7, sp, #0 uint32_t pllm = 0U; - 800110c: 2300 movs r3, #0 - 800110e: f8c7 30ac str.w r3, [r7, #172] ; 0xac + 8001048: 2300 movs r3, #0 + 800104a: f8c7 30ac str.w r3, [r7, #172] ; 0xac uint32_t pllvco = 0U; - 8001112: 2300 movs r3, #0 - 8001114: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + 800104e: 2300 movs r3, #0 + 8001050: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 uint32_t pllp = 0U; - 8001118: 2300 movs r3, #0 - 800111a: f8c7 30a8 str.w r3, [r7, #168] ; 0xa8 + 8001054: 2300 movs r3, #0 + 8001056: f8c7 30a8 str.w r3, [r7, #168] ; 0xa8 uint32_t pllr = 0U; - 800111e: 2300 movs r3, #0 - 8001120: f8c7 30a4 str.w r3, [r7, #164] ; 0xa4 + 800105a: 2300 movs r3, #0 + 800105c: f8c7 30a4 str.w r3, [r7, #164] ; 0xa4 uint32_t sysclockfreq = 0U; - 8001124: 2300 movs r3, #0 - 8001126: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + 8001060: 2300 movs r3, #0 + 8001062: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 /* Get SYSCLK source -------------------------------------------------------*/ switch (RCC->CFGR & RCC_CFGR_SWS) - 800112a: 4bcb ldr r3, [pc, #812] ; (8001458 ) - 800112c: 689b ldr r3, [r3, #8] - 800112e: f003 030c and.w r3, r3, #12 - 8001132: 2b0c cmp r3, #12 - 8001134: f200 8206 bhi.w 8001544 - 8001138: a201 add r2, pc, #4 ; (adr r2, 8001140 ) - 800113a: f852 f023 ldr.w pc, [r2, r3, lsl #2] - 800113e: bf00 nop - 8001140: 08001175 .word 0x08001175 - 8001144: 08001545 .word 0x08001545 - 8001148: 08001545 .word 0x08001545 - 800114c: 08001545 .word 0x08001545 - 8001150: 0800117d .word 0x0800117d - 8001154: 08001545 .word 0x08001545 - 8001158: 08001545 .word 0x08001545 - 800115c: 08001545 .word 0x08001545 - 8001160: 08001185 .word 0x08001185 - 8001164: 08001545 .word 0x08001545 - 8001168: 08001545 .word 0x08001545 - 800116c: 08001545 .word 0x08001545 - 8001170: 08001375 .word 0x08001375 + 8001066: 4bcb ldr r3, [pc, #812] ; (8001394 ) + 8001068: 689b ldr r3, [r3, #8] + 800106a: f003 030c and.w r3, r3, #12 + 800106e: 2b0c cmp r3, #12 + 8001070: f200 8206 bhi.w 8001480 + 8001074: a201 add r2, pc, #4 ; (adr r2, 800107c ) + 8001076: f852 f023 ldr.w pc, [r2, r3, lsl #2] + 800107a: bf00 nop + 800107c: 080010b1 .word 0x080010b1 + 8001080: 08001481 .word 0x08001481 + 8001084: 08001481 .word 0x08001481 + 8001088: 08001481 .word 0x08001481 + 800108c: 080010b9 .word 0x080010b9 + 8001090: 08001481 .word 0x08001481 + 8001094: 08001481 .word 0x08001481 + 8001098: 08001481 .word 0x08001481 + 800109c: 080010c1 .word 0x080010c1 + 80010a0: 08001481 .word 0x08001481 + 80010a4: 08001481 .word 0x08001481 + 80010a8: 08001481 .word 0x08001481 + 80010ac: 080012b1 .word 0x080012b1 { case RCC_CFGR_SWS_HSI: /* HSI used as system clock source */ { sysclockfreq = HSI_VALUE; - 8001174: 4bb9 ldr r3, [pc, #740] ; (800145c ) - 8001176: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + 80010b0: 4bb9 ldr r3, [pc, #740] ; (8001398 ) + 80010b2: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 break; - 800117a: e1e7 b.n 800154c + 80010b6: e1e7 b.n 8001488 } case RCC_CFGR_SWS_HSE: /* HSE used as system clock source */ { sysclockfreq = HSE_VALUE; - 800117c: 4bb8 ldr r3, [pc, #736] ; (8001460 ) - 800117e: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + 80010b8: 4bb8 ldr r3, [pc, #736] ; (800139c ) + 80010ba: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 break; - 8001182: e1e3 b.n 800154c + 80010be: e1e3 b.n 8001488 } 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; - 8001184: 4bb4 ldr r3, [pc, #720] ; (8001458 ) - 8001186: 685b ldr r3, [r3, #4] - 8001188: f003 033f and.w r3, r3, #63 ; 0x3f - 800118c: f8c7 30ac str.w r3, [r7, #172] ; 0xac + 80010c0: 4bb4 ldr r3, [pc, #720] ; (8001394 ) + 80010c2: 685b ldr r3, [r3, #4] + 80010c4: f003 033f and.w r3, r3, #63 ; 0x3f + 80010c8: f8c7 30ac str.w r3, [r7, #172] ; 0xac if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - 8001190: 4bb1 ldr r3, [pc, #708] ; (8001458 ) - 8001192: 685b ldr r3, [r3, #4] - 8001194: f403 0380 and.w r3, r3, #4194304 ; 0x400000 - 8001198: 2b00 cmp r3, #0 - 800119a: d071 beq.n 8001280 + 80010cc: 4bb1 ldr r3, [pc, #708] ; (8001394 ) + 80010ce: 685b ldr r3, [r3, #4] + 80010d0: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 80010d4: 2b00 cmp r3, #0 + 80010d6: d071 beq.n 80011bc { /* 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); - 800119c: 4bae ldr r3, [pc, #696] ; (8001458 ) - 800119e: 685b ldr r3, [r3, #4] - 80011a0: 099b lsrs r3, r3, #6 - 80011a2: 2200 movs r2, #0 - 80011a4: f8c7 3098 str.w r3, [r7, #152] ; 0x98 - 80011a8: f8c7 209c str.w r2, [r7, #156] ; 0x9c - 80011ac: f8d7 3098 ldr.w r3, [r7, #152] ; 0x98 - 80011b0: f3c3 0308 ubfx r3, r3, #0, #9 - 80011b4: f8c7 3090 str.w r3, [r7, #144] ; 0x90 - 80011b8: 2300 movs r3, #0 - 80011ba: f8c7 3094 str.w r3, [r7, #148] ; 0x94 - 80011be: e9d7 4524 ldrd r4, r5, [r7, #144] ; 0x90 - 80011c2: 4622 mov r2, r4 - 80011c4: 462b mov r3, r5 - 80011c6: f04f 0000 mov.w r0, #0 - 80011ca: f04f 0100 mov.w r1, #0 - 80011ce: 0159 lsls r1, r3, #5 - 80011d0: ea41 61d2 orr.w r1, r1, r2, lsr #27 - 80011d4: 0150 lsls r0, r2, #5 - 80011d6: 4602 mov r2, r0 - 80011d8: 460b mov r3, r1 - 80011da: 4621 mov r1, r4 - 80011dc: 1a51 subs r1, r2, r1 - 80011de: 6439 str r1, [r7, #64] ; 0x40 - 80011e0: 4629 mov r1, r5 - 80011e2: eb63 0301 sbc.w r3, r3, r1 - 80011e6: 647b str r3, [r7, #68] ; 0x44 - 80011e8: f04f 0200 mov.w r2, #0 - 80011ec: f04f 0300 mov.w r3, #0 - 80011f0: e9d7 8910 ldrd r8, r9, [r7, #64] ; 0x40 - 80011f4: 4649 mov r1, r9 - 80011f6: 018b lsls r3, r1, #6 - 80011f8: 4641 mov r1, r8 - 80011fa: ea43 6391 orr.w r3, r3, r1, lsr #26 - 80011fe: 4641 mov r1, r8 - 8001200: 018a lsls r2, r1, #6 - 8001202: 4641 mov r1, r8 - 8001204: 1a51 subs r1, r2, r1 - 8001206: 63b9 str r1, [r7, #56] ; 0x38 - 8001208: 4649 mov r1, r9 - 800120a: eb63 0301 sbc.w r3, r3, r1 - 800120e: 63fb str r3, [r7, #60] ; 0x3c - 8001210: f04f 0200 mov.w r2, #0 - 8001214: f04f 0300 mov.w r3, #0 - 8001218: e9d7 890e ldrd r8, r9, [r7, #56] ; 0x38 - 800121c: 4649 mov r1, r9 - 800121e: 00cb lsls r3, r1, #3 - 8001220: 4641 mov r1, r8 - 8001222: ea43 7351 orr.w r3, r3, r1, lsr #29 - 8001226: 4641 mov r1, r8 - 8001228: 00ca lsls r2, r1, #3 - 800122a: 4610 mov r0, r2 - 800122c: 4619 mov r1, r3 - 800122e: 4603 mov r3, r0 - 8001230: 4622 mov r2, r4 - 8001232: 189b adds r3, r3, r2 - 8001234: 633b str r3, [r7, #48] ; 0x30 - 8001236: 462b mov r3, r5 - 8001238: 460a mov r2, r1 - 800123a: eb42 0303 adc.w r3, r2, r3 - 800123e: 637b str r3, [r7, #52] ; 0x34 - 8001240: f04f 0200 mov.w r2, #0 - 8001244: f04f 0300 mov.w r3, #0 - 8001248: e9d7 450c ldrd r4, r5, [r7, #48] ; 0x30 - 800124c: 4629 mov r1, r5 - 800124e: 024b lsls r3, r1, #9 - 8001250: 4621 mov r1, r4 - 8001252: ea43 53d1 orr.w r3, r3, r1, lsr #23 - 8001256: 4621 mov r1, r4 - 8001258: 024a lsls r2, r1, #9 - 800125a: 4610 mov r0, r2 - 800125c: 4619 mov r1, r3 - 800125e: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac - 8001262: 2200 movs r2, #0 - 8001264: f8c7 3088 str.w r3, [r7, #136] ; 0x88 - 8001268: f8c7 208c str.w r2, [r7, #140] ; 0x8c - 800126c: e9d7 2322 ldrd r2, r3, [r7, #136] ; 0x88 - 8001270: f7fe ffce bl 8000210 <__aeabi_uldivmod> - 8001274: 4602 mov r2, r0 - 8001276: 460b mov r3, r1 - 8001278: 4613 mov r3, r2 - 800127a: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 - 800127e: e067 b.n 8001350 + 80010d8: 4bae ldr r3, [pc, #696] ; (8001394 ) + 80010da: 685b ldr r3, [r3, #4] + 80010dc: 099b lsrs r3, r3, #6 + 80010de: 2200 movs r2, #0 + 80010e0: f8c7 3098 str.w r3, [r7, #152] ; 0x98 + 80010e4: f8c7 209c str.w r2, [r7, #156] ; 0x9c + 80010e8: f8d7 3098 ldr.w r3, [r7, #152] ; 0x98 + 80010ec: f3c3 0308 ubfx r3, r3, #0, #9 + 80010f0: f8c7 3090 str.w r3, [r7, #144] ; 0x90 + 80010f4: 2300 movs r3, #0 + 80010f6: f8c7 3094 str.w r3, [r7, #148] ; 0x94 + 80010fa: e9d7 4524 ldrd r4, r5, [r7, #144] ; 0x90 + 80010fe: 4622 mov r2, r4 + 8001100: 462b mov r3, r5 + 8001102: f04f 0000 mov.w r0, #0 + 8001106: f04f 0100 mov.w r1, #0 + 800110a: 0159 lsls r1, r3, #5 + 800110c: ea41 61d2 orr.w r1, r1, r2, lsr #27 + 8001110: 0150 lsls r0, r2, #5 + 8001112: 4602 mov r2, r0 + 8001114: 460b mov r3, r1 + 8001116: 4621 mov r1, r4 + 8001118: 1a51 subs r1, r2, r1 + 800111a: 6439 str r1, [r7, #64] ; 0x40 + 800111c: 4629 mov r1, r5 + 800111e: eb63 0301 sbc.w r3, r3, r1 + 8001122: 647b str r3, [r7, #68] ; 0x44 + 8001124: f04f 0200 mov.w r2, #0 + 8001128: f04f 0300 mov.w r3, #0 + 800112c: e9d7 8910 ldrd r8, r9, [r7, #64] ; 0x40 + 8001130: 4649 mov r1, r9 + 8001132: 018b lsls r3, r1, #6 + 8001134: 4641 mov r1, r8 + 8001136: ea43 6391 orr.w r3, r3, r1, lsr #26 + 800113a: 4641 mov r1, r8 + 800113c: 018a lsls r2, r1, #6 + 800113e: 4641 mov r1, r8 + 8001140: 1a51 subs r1, r2, r1 + 8001142: 63b9 str r1, [r7, #56] ; 0x38 + 8001144: 4649 mov r1, r9 + 8001146: eb63 0301 sbc.w r3, r3, r1 + 800114a: 63fb str r3, [r7, #60] ; 0x3c + 800114c: f04f 0200 mov.w r2, #0 + 8001150: f04f 0300 mov.w r3, #0 + 8001154: e9d7 890e ldrd r8, r9, [r7, #56] ; 0x38 + 8001158: 4649 mov r1, r9 + 800115a: 00cb lsls r3, r1, #3 + 800115c: 4641 mov r1, r8 + 800115e: ea43 7351 orr.w r3, r3, r1, lsr #29 + 8001162: 4641 mov r1, r8 + 8001164: 00ca lsls r2, r1, #3 + 8001166: 4610 mov r0, r2 + 8001168: 4619 mov r1, r3 + 800116a: 4603 mov r3, r0 + 800116c: 4622 mov r2, r4 + 800116e: 189b adds r3, r3, r2 + 8001170: 633b str r3, [r7, #48] ; 0x30 + 8001172: 462b mov r3, r5 + 8001174: 460a mov r2, r1 + 8001176: eb42 0303 adc.w r3, r2, r3 + 800117a: 637b str r3, [r7, #52] ; 0x34 + 800117c: f04f 0200 mov.w r2, #0 + 8001180: f04f 0300 mov.w r3, #0 + 8001184: e9d7 450c ldrd r4, r5, [r7, #48] ; 0x30 + 8001188: 4629 mov r1, r5 + 800118a: 024b lsls r3, r1, #9 + 800118c: 4621 mov r1, r4 + 800118e: ea43 53d1 orr.w r3, r3, r1, lsr #23 + 8001192: 4621 mov r1, r4 + 8001194: 024a lsls r2, r1, #9 + 8001196: 4610 mov r0, r2 + 8001198: 4619 mov r1, r3 + 800119a: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac + 800119e: 2200 movs r2, #0 + 80011a0: f8c7 3088 str.w r3, [r7, #136] ; 0x88 + 80011a4: f8c7 208c str.w r2, [r7, #140] ; 0x8c + 80011a8: e9d7 2322 ldrd r2, r3, [r7, #136] ; 0x88 + 80011ac: f7ff f830 bl 8000210 <__aeabi_uldivmod> + 80011b0: 4602 mov r2, r0 + 80011b2: 460b mov r3, r1 + 80011b4: 4613 mov r3, r2 + 80011b6: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + 80011ba: e067 b.n 800128c } 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); - 8001280: 4b75 ldr r3, [pc, #468] ; (8001458 ) - 8001282: 685b ldr r3, [r3, #4] - 8001284: 099b lsrs r3, r3, #6 - 8001286: 2200 movs r2, #0 - 8001288: f8c7 3080 str.w r3, [r7, #128] ; 0x80 - 800128c: f8c7 2084 str.w r2, [r7, #132] ; 0x84 - 8001290: f8d7 3080 ldr.w r3, [r7, #128] ; 0x80 - 8001294: f3c3 0308 ubfx r3, r3, #0, #9 - 8001298: 67bb str r3, [r7, #120] ; 0x78 - 800129a: 2300 movs r3, #0 - 800129c: 67fb str r3, [r7, #124] ; 0x7c - 800129e: e9d7 451e ldrd r4, r5, [r7, #120] ; 0x78 - 80012a2: 4622 mov r2, r4 - 80012a4: 462b mov r3, r5 - 80012a6: f04f 0000 mov.w r0, #0 - 80012aa: f04f 0100 mov.w r1, #0 - 80012ae: 0159 lsls r1, r3, #5 - 80012b0: ea41 61d2 orr.w r1, r1, r2, lsr #27 - 80012b4: 0150 lsls r0, r2, #5 - 80012b6: 4602 mov r2, r0 - 80012b8: 460b mov r3, r1 - 80012ba: 4621 mov r1, r4 - 80012bc: 1a51 subs r1, r2, r1 - 80012be: 62b9 str r1, [r7, #40] ; 0x28 - 80012c0: 4629 mov r1, r5 - 80012c2: eb63 0301 sbc.w r3, r3, r1 - 80012c6: 62fb str r3, [r7, #44] ; 0x2c - 80012c8: f04f 0200 mov.w r2, #0 - 80012cc: f04f 0300 mov.w r3, #0 - 80012d0: e9d7 890a ldrd r8, r9, [r7, #40] ; 0x28 - 80012d4: 4649 mov r1, r9 - 80012d6: 018b lsls r3, r1, #6 - 80012d8: 4641 mov r1, r8 - 80012da: ea43 6391 orr.w r3, r3, r1, lsr #26 - 80012de: 4641 mov r1, r8 - 80012e0: 018a lsls r2, r1, #6 - 80012e2: 4641 mov r1, r8 - 80012e4: ebb2 0a01 subs.w sl, r2, r1 - 80012e8: 4649 mov r1, r9 - 80012ea: eb63 0b01 sbc.w fp, r3, r1 - 80012ee: f04f 0200 mov.w r2, #0 - 80012f2: f04f 0300 mov.w r3, #0 - 80012f6: ea4f 03cb mov.w r3, fp, lsl #3 - 80012fa: ea43 735a orr.w r3, r3, sl, lsr #29 - 80012fe: ea4f 02ca mov.w r2, sl, lsl #3 - 8001302: 4692 mov sl, r2 - 8001304: 469b mov fp, r3 - 8001306: 4623 mov r3, r4 - 8001308: eb1a 0303 adds.w r3, sl, r3 - 800130c: 623b str r3, [r7, #32] - 800130e: 462b mov r3, r5 - 8001310: eb4b 0303 adc.w r3, fp, r3 - 8001314: 627b str r3, [r7, #36] ; 0x24 - 8001316: f04f 0200 mov.w r2, #0 - 800131a: f04f 0300 mov.w r3, #0 - 800131e: e9d7 4508 ldrd r4, r5, [r7, #32] - 8001322: 4629 mov r1, r5 - 8001324: 028b lsls r3, r1, #10 - 8001326: 4621 mov r1, r4 - 8001328: ea43 5391 orr.w r3, r3, r1, lsr #22 - 800132c: 4621 mov r1, r4 - 800132e: 028a lsls r2, r1, #10 - 8001330: 4610 mov r0, r2 - 8001332: 4619 mov r1, r3 - 8001334: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac - 8001338: 2200 movs r2, #0 - 800133a: 673b str r3, [r7, #112] ; 0x70 - 800133c: 677a str r2, [r7, #116] ; 0x74 - 800133e: e9d7 231c ldrd r2, r3, [r7, #112] ; 0x70 - 8001342: f7fe ff65 bl 8000210 <__aeabi_uldivmod> - 8001346: 4602 mov r2, r0 - 8001348: 460b mov r3, r1 - 800134a: 4613 mov r3, r2 - 800134c: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + 80011bc: 4b75 ldr r3, [pc, #468] ; (8001394 ) + 80011be: 685b ldr r3, [r3, #4] + 80011c0: 099b lsrs r3, r3, #6 + 80011c2: 2200 movs r2, #0 + 80011c4: f8c7 3080 str.w r3, [r7, #128] ; 0x80 + 80011c8: f8c7 2084 str.w r2, [r7, #132] ; 0x84 + 80011cc: f8d7 3080 ldr.w r3, [r7, #128] ; 0x80 + 80011d0: f3c3 0308 ubfx r3, r3, #0, #9 + 80011d4: 67bb str r3, [r7, #120] ; 0x78 + 80011d6: 2300 movs r3, #0 + 80011d8: 67fb str r3, [r7, #124] ; 0x7c + 80011da: e9d7 451e ldrd r4, r5, [r7, #120] ; 0x78 + 80011de: 4622 mov r2, r4 + 80011e0: 462b mov r3, r5 + 80011e2: f04f 0000 mov.w r0, #0 + 80011e6: f04f 0100 mov.w r1, #0 + 80011ea: 0159 lsls r1, r3, #5 + 80011ec: ea41 61d2 orr.w r1, r1, r2, lsr #27 + 80011f0: 0150 lsls r0, r2, #5 + 80011f2: 4602 mov r2, r0 + 80011f4: 460b mov r3, r1 + 80011f6: 4621 mov r1, r4 + 80011f8: 1a51 subs r1, r2, r1 + 80011fa: 62b9 str r1, [r7, #40] ; 0x28 + 80011fc: 4629 mov r1, r5 + 80011fe: eb63 0301 sbc.w r3, r3, r1 + 8001202: 62fb str r3, [r7, #44] ; 0x2c + 8001204: f04f 0200 mov.w r2, #0 + 8001208: f04f 0300 mov.w r3, #0 + 800120c: e9d7 890a ldrd r8, r9, [r7, #40] ; 0x28 + 8001210: 4649 mov r1, r9 + 8001212: 018b lsls r3, r1, #6 + 8001214: 4641 mov r1, r8 + 8001216: ea43 6391 orr.w r3, r3, r1, lsr #26 + 800121a: 4641 mov r1, r8 + 800121c: 018a lsls r2, r1, #6 + 800121e: 4641 mov r1, r8 + 8001220: ebb2 0a01 subs.w sl, r2, r1 + 8001224: 4649 mov r1, r9 + 8001226: eb63 0b01 sbc.w fp, r3, r1 + 800122a: f04f 0200 mov.w r2, #0 + 800122e: f04f 0300 mov.w r3, #0 + 8001232: ea4f 03cb mov.w r3, fp, lsl #3 + 8001236: ea43 735a orr.w r3, r3, sl, lsr #29 + 800123a: ea4f 02ca mov.w r2, sl, lsl #3 + 800123e: 4692 mov sl, r2 + 8001240: 469b mov fp, r3 + 8001242: 4623 mov r3, r4 + 8001244: eb1a 0303 adds.w r3, sl, r3 + 8001248: 623b str r3, [r7, #32] + 800124a: 462b mov r3, r5 + 800124c: eb4b 0303 adc.w r3, fp, r3 + 8001250: 627b str r3, [r7, #36] ; 0x24 + 8001252: f04f 0200 mov.w r2, #0 + 8001256: f04f 0300 mov.w r3, #0 + 800125a: e9d7 4508 ldrd r4, r5, [r7, #32] + 800125e: 4629 mov r1, r5 + 8001260: 028b lsls r3, r1, #10 + 8001262: 4621 mov r1, r4 + 8001264: ea43 5391 orr.w r3, r3, r1, lsr #22 + 8001268: 4621 mov r1, r4 + 800126a: 028a lsls r2, r1, #10 + 800126c: 4610 mov r0, r2 + 800126e: 4619 mov r1, r3 + 8001270: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac + 8001274: 2200 movs r2, #0 + 8001276: 673b str r3, [r7, #112] ; 0x70 + 8001278: 677a str r2, [r7, #116] ; 0x74 + 800127a: e9d7 231c ldrd r2, r3, [r7, #112] ; 0x70 + 800127e: f7fe ffc7 bl 8000210 <__aeabi_uldivmod> + 8001282: 4602 mov r2, r0 + 8001284: 460b mov r3, r1 + 8001286: 4613 mov r3, r2 + 8001288: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 } pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1U) *2U); - 8001350: 4b41 ldr r3, [pc, #260] ; (8001458 ) - 8001352: 685b ldr r3, [r3, #4] - 8001354: 0c1b lsrs r3, r3, #16 - 8001356: f003 0303 and.w r3, r3, #3 - 800135a: 3301 adds r3, #1 - 800135c: 005b lsls r3, r3, #1 - 800135e: f8c7 30a8 str.w r3, [r7, #168] ; 0xa8 + 800128c: 4b41 ldr r3, [pc, #260] ; (8001394 ) + 800128e: 685b ldr r3, [r3, #4] + 8001290: 0c1b lsrs r3, r3, #16 + 8001292: f003 0303 and.w r3, r3, #3 + 8001296: 3301 adds r3, #1 + 8001298: 005b lsls r3, r3, #1 + 800129a: f8c7 30a8 str.w r3, [r7, #168] ; 0xa8 sysclockfreq = pllvco/pllp; - 8001362: f8d7 20b4 ldr.w r2, [r7, #180] ; 0xb4 - 8001366: f8d7 30a8 ldr.w r3, [r7, #168] ; 0xa8 - 800136a: fbb2 f3f3 udiv r3, r2, r3 - 800136e: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + 800129e: f8d7 20b4 ldr.w r2, [r7, #180] ; 0xb4 + 80012a2: f8d7 30a8 ldr.w r3, [r7, #168] ; 0xa8 + 80012a6: fbb2 f3f3 udiv r3, r2, r3 + 80012aa: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 break; - 8001372: e0eb b.n 800154c + 80012ae: e0eb b.n 8001488 } 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; - 8001374: 4b38 ldr r3, [pc, #224] ; (8001458 ) - 8001376: 685b ldr r3, [r3, #4] - 8001378: f003 033f and.w r3, r3, #63 ; 0x3f - 800137c: f8c7 30ac str.w r3, [r7, #172] ; 0xac + 80012b0: 4b38 ldr r3, [pc, #224] ; (8001394 ) + 80012b2: 685b ldr r3, [r3, #4] + 80012b4: f003 033f and.w r3, r3, #63 ; 0x3f + 80012b8: f8c7 30ac str.w r3, [r7, #172] ; 0xac if(__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLSOURCE_HSI) - 8001380: 4b35 ldr r3, [pc, #212] ; (8001458 ) - 8001382: 685b ldr r3, [r3, #4] - 8001384: f403 0380 and.w r3, r3, #4194304 ; 0x400000 - 8001388: 2b00 cmp r3, #0 - 800138a: d06b beq.n 8001464 + 80012bc: 4b35 ldr r3, [pc, #212] ; (8001394 ) + 80012be: 685b ldr r3, [r3, #4] + 80012c0: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 80012c4: 2b00 cmp r3, #0 + 80012c6: d06b beq.n 80013a0 { /* 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); - 800138c: 4b32 ldr r3, [pc, #200] ; (8001458 ) - 800138e: 685b ldr r3, [r3, #4] - 8001390: 099b lsrs r3, r3, #6 - 8001392: 2200 movs r2, #0 - 8001394: 66bb str r3, [r7, #104] ; 0x68 - 8001396: 66fa str r2, [r7, #108] ; 0x6c - 8001398: 6ebb ldr r3, [r7, #104] ; 0x68 - 800139a: f3c3 0308 ubfx r3, r3, #0, #9 - 800139e: 663b str r3, [r7, #96] ; 0x60 - 80013a0: 2300 movs r3, #0 - 80013a2: 667b str r3, [r7, #100] ; 0x64 - 80013a4: e9d7 4518 ldrd r4, r5, [r7, #96] ; 0x60 - 80013a8: 4622 mov r2, r4 - 80013aa: 462b mov r3, r5 - 80013ac: f04f 0000 mov.w r0, #0 - 80013b0: f04f 0100 mov.w r1, #0 - 80013b4: 0159 lsls r1, r3, #5 - 80013b6: ea41 61d2 orr.w r1, r1, r2, lsr #27 - 80013ba: 0150 lsls r0, r2, #5 - 80013bc: 4602 mov r2, r0 - 80013be: 460b mov r3, r1 - 80013c0: 4621 mov r1, r4 - 80013c2: 1a51 subs r1, r2, r1 - 80013c4: 61b9 str r1, [r7, #24] - 80013c6: 4629 mov r1, r5 - 80013c8: eb63 0301 sbc.w r3, r3, r1 - 80013cc: 61fb str r3, [r7, #28] - 80013ce: f04f 0200 mov.w r2, #0 - 80013d2: f04f 0300 mov.w r3, #0 - 80013d6: e9d7 ab06 ldrd sl, fp, [r7, #24] - 80013da: 4659 mov r1, fp - 80013dc: 018b lsls r3, r1, #6 - 80013de: 4651 mov r1, sl - 80013e0: ea43 6391 orr.w r3, r3, r1, lsr #26 - 80013e4: 4651 mov r1, sl - 80013e6: 018a lsls r2, r1, #6 - 80013e8: 4651 mov r1, sl - 80013ea: ebb2 0801 subs.w r8, r2, r1 - 80013ee: 4659 mov r1, fp - 80013f0: eb63 0901 sbc.w r9, r3, r1 - 80013f4: f04f 0200 mov.w r2, #0 - 80013f8: f04f 0300 mov.w r3, #0 - 80013fc: ea4f 03c9 mov.w r3, r9, lsl #3 - 8001400: ea43 7358 orr.w r3, r3, r8, lsr #29 - 8001404: ea4f 02c8 mov.w r2, r8, lsl #3 - 8001408: 4690 mov r8, r2 - 800140a: 4699 mov r9, r3 - 800140c: 4623 mov r3, r4 - 800140e: eb18 0303 adds.w r3, r8, r3 - 8001412: 613b str r3, [r7, #16] - 8001414: 462b mov r3, r5 - 8001416: eb49 0303 adc.w r3, r9, r3 - 800141a: 617b str r3, [r7, #20] - 800141c: f04f 0200 mov.w r2, #0 - 8001420: f04f 0300 mov.w r3, #0 - 8001424: e9d7 4504 ldrd r4, r5, [r7, #16] - 8001428: 4629 mov r1, r5 - 800142a: 024b lsls r3, r1, #9 - 800142c: 4621 mov r1, r4 - 800142e: ea43 53d1 orr.w r3, r3, r1, lsr #23 - 8001432: 4621 mov r1, r4 - 8001434: 024a lsls r2, r1, #9 - 8001436: 4610 mov r0, r2 - 8001438: 4619 mov r1, r3 - 800143a: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac - 800143e: 2200 movs r2, #0 - 8001440: 65bb str r3, [r7, #88] ; 0x58 - 8001442: 65fa str r2, [r7, #92] ; 0x5c - 8001444: e9d7 2316 ldrd r2, r3, [r7, #88] ; 0x58 - 8001448: f7fe fee2 bl 8000210 <__aeabi_uldivmod> - 800144c: 4602 mov r2, r0 - 800144e: 460b mov r3, r1 - 8001450: 4613 mov r3, r2 - 8001452: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 - 8001456: e065 b.n 8001524 - 8001458: 40023800 .word 0x40023800 - 800145c: 00f42400 .word 0x00f42400 - 8001460: 007a1200 .word 0x007a1200 + 80012c8: 4b32 ldr r3, [pc, #200] ; (8001394 ) + 80012ca: 685b ldr r3, [r3, #4] + 80012cc: 099b lsrs r3, r3, #6 + 80012ce: 2200 movs r2, #0 + 80012d0: 66bb str r3, [r7, #104] ; 0x68 + 80012d2: 66fa str r2, [r7, #108] ; 0x6c + 80012d4: 6ebb ldr r3, [r7, #104] ; 0x68 + 80012d6: f3c3 0308 ubfx r3, r3, #0, #9 + 80012da: 663b str r3, [r7, #96] ; 0x60 + 80012dc: 2300 movs r3, #0 + 80012de: 667b str r3, [r7, #100] ; 0x64 + 80012e0: e9d7 4518 ldrd r4, r5, [r7, #96] ; 0x60 + 80012e4: 4622 mov r2, r4 + 80012e6: 462b mov r3, r5 + 80012e8: f04f 0000 mov.w r0, #0 + 80012ec: f04f 0100 mov.w r1, #0 + 80012f0: 0159 lsls r1, r3, #5 + 80012f2: ea41 61d2 orr.w r1, r1, r2, lsr #27 + 80012f6: 0150 lsls r0, r2, #5 + 80012f8: 4602 mov r2, r0 + 80012fa: 460b mov r3, r1 + 80012fc: 4621 mov r1, r4 + 80012fe: 1a51 subs r1, r2, r1 + 8001300: 61b9 str r1, [r7, #24] + 8001302: 4629 mov r1, r5 + 8001304: eb63 0301 sbc.w r3, r3, r1 + 8001308: 61fb str r3, [r7, #28] + 800130a: f04f 0200 mov.w r2, #0 + 800130e: f04f 0300 mov.w r3, #0 + 8001312: e9d7 ab06 ldrd sl, fp, [r7, #24] + 8001316: 4659 mov r1, fp + 8001318: 018b lsls r3, r1, #6 + 800131a: 4651 mov r1, sl + 800131c: ea43 6391 orr.w r3, r3, r1, lsr #26 + 8001320: 4651 mov r1, sl + 8001322: 018a lsls r2, r1, #6 + 8001324: 4651 mov r1, sl + 8001326: ebb2 0801 subs.w r8, r2, r1 + 800132a: 4659 mov r1, fp + 800132c: eb63 0901 sbc.w r9, r3, r1 + 8001330: f04f 0200 mov.w r2, #0 + 8001334: f04f 0300 mov.w r3, #0 + 8001338: ea4f 03c9 mov.w r3, r9, lsl #3 + 800133c: ea43 7358 orr.w r3, r3, r8, lsr #29 + 8001340: ea4f 02c8 mov.w r2, r8, lsl #3 + 8001344: 4690 mov r8, r2 + 8001346: 4699 mov r9, r3 + 8001348: 4623 mov r3, r4 + 800134a: eb18 0303 adds.w r3, r8, r3 + 800134e: 613b str r3, [r7, #16] + 8001350: 462b mov r3, r5 + 8001352: eb49 0303 adc.w r3, r9, r3 + 8001356: 617b str r3, [r7, #20] + 8001358: f04f 0200 mov.w r2, #0 + 800135c: f04f 0300 mov.w r3, #0 + 8001360: e9d7 4504 ldrd r4, r5, [r7, #16] + 8001364: 4629 mov r1, r5 + 8001366: 024b lsls r3, r1, #9 + 8001368: 4621 mov r1, r4 + 800136a: ea43 53d1 orr.w r3, r3, r1, lsr #23 + 800136e: 4621 mov r1, r4 + 8001370: 024a lsls r2, r1, #9 + 8001372: 4610 mov r0, r2 + 8001374: 4619 mov r1, r3 + 8001376: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac + 800137a: 2200 movs r2, #0 + 800137c: 65bb str r3, [r7, #88] ; 0x58 + 800137e: 65fa str r2, [r7, #92] ; 0x5c + 8001380: e9d7 2316 ldrd r2, r3, [r7, #88] ; 0x58 + 8001384: f7fe ff44 bl 8000210 <__aeabi_uldivmod> + 8001388: 4602 mov r2, r0 + 800138a: 460b mov r3, r1 + 800138c: 4613 mov r3, r2 + 800138e: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + 8001392: e065 b.n 8001460 + 8001394: 40023800 .word 0x40023800 + 8001398: 00f42400 .word 0x00f42400 + 800139c: 007a1200 .word 0x007a1200 } 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); - 8001464: 4b3d ldr r3, [pc, #244] ; (800155c ) - 8001466: 685b ldr r3, [r3, #4] - 8001468: 099b lsrs r3, r3, #6 - 800146a: 2200 movs r2, #0 - 800146c: 4618 mov r0, r3 - 800146e: 4611 mov r1, r2 - 8001470: f3c0 0308 ubfx r3, r0, #0, #9 - 8001474: 653b str r3, [r7, #80] ; 0x50 - 8001476: 2300 movs r3, #0 - 8001478: 657b str r3, [r7, #84] ; 0x54 - 800147a: e9d7 8914 ldrd r8, r9, [r7, #80] ; 0x50 - 800147e: 4642 mov r2, r8 - 8001480: 464b mov r3, r9 - 8001482: f04f 0000 mov.w r0, #0 - 8001486: f04f 0100 mov.w r1, #0 - 800148a: 0159 lsls r1, r3, #5 - 800148c: ea41 61d2 orr.w r1, r1, r2, lsr #27 - 8001490: 0150 lsls r0, r2, #5 - 8001492: 4602 mov r2, r0 - 8001494: 460b mov r3, r1 - 8001496: 4641 mov r1, r8 - 8001498: 1a51 subs r1, r2, r1 - 800149a: 60b9 str r1, [r7, #8] - 800149c: 4649 mov r1, r9 - 800149e: eb63 0301 sbc.w r3, r3, r1 - 80014a2: 60fb str r3, [r7, #12] - 80014a4: f04f 0200 mov.w r2, #0 - 80014a8: f04f 0300 mov.w r3, #0 - 80014ac: e9d7 ab02 ldrd sl, fp, [r7, #8] - 80014b0: 4659 mov r1, fp - 80014b2: 018b lsls r3, r1, #6 - 80014b4: 4651 mov r1, sl - 80014b6: ea43 6391 orr.w r3, r3, r1, lsr #26 - 80014ba: 4651 mov r1, sl - 80014bc: 018a lsls r2, r1, #6 - 80014be: 4651 mov r1, sl - 80014c0: 1a54 subs r4, r2, r1 - 80014c2: 4659 mov r1, fp - 80014c4: eb63 0501 sbc.w r5, r3, r1 - 80014c8: f04f 0200 mov.w r2, #0 - 80014cc: f04f 0300 mov.w r3, #0 - 80014d0: 00eb lsls r3, r5, #3 - 80014d2: ea43 7354 orr.w r3, r3, r4, lsr #29 - 80014d6: 00e2 lsls r2, r4, #3 - 80014d8: 4614 mov r4, r2 - 80014da: 461d mov r5, r3 - 80014dc: 4643 mov r3, r8 - 80014de: 18e3 adds r3, r4, r3 - 80014e0: 603b str r3, [r7, #0] - 80014e2: 464b mov r3, r9 - 80014e4: eb45 0303 adc.w r3, r5, r3 - 80014e8: 607b str r3, [r7, #4] - 80014ea: f04f 0200 mov.w r2, #0 - 80014ee: f04f 0300 mov.w r3, #0 - 80014f2: e9d7 4500 ldrd r4, r5, [r7] - 80014f6: 4629 mov r1, r5 - 80014f8: 028b lsls r3, r1, #10 - 80014fa: 4621 mov r1, r4 - 80014fc: ea43 5391 orr.w r3, r3, r1, lsr #22 - 8001500: 4621 mov r1, r4 - 8001502: 028a lsls r2, r1, #10 - 8001504: 4610 mov r0, r2 - 8001506: 4619 mov r1, r3 - 8001508: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac - 800150c: 2200 movs r2, #0 - 800150e: 64bb str r3, [r7, #72] ; 0x48 - 8001510: 64fa str r2, [r7, #76] ; 0x4c - 8001512: e9d7 2312 ldrd r2, r3, [r7, #72] ; 0x48 - 8001516: f7fe fe7b bl 8000210 <__aeabi_uldivmod> - 800151a: 4602 mov r2, r0 - 800151c: 460b mov r3, r1 - 800151e: 4613 mov r3, r2 - 8001520: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 + 80013a0: 4b3d ldr r3, [pc, #244] ; (8001498 ) + 80013a2: 685b ldr r3, [r3, #4] + 80013a4: 099b lsrs r3, r3, #6 + 80013a6: 2200 movs r2, #0 + 80013a8: 4618 mov r0, r3 + 80013aa: 4611 mov r1, r2 + 80013ac: f3c0 0308 ubfx r3, r0, #0, #9 + 80013b0: 653b str r3, [r7, #80] ; 0x50 + 80013b2: 2300 movs r3, #0 + 80013b4: 657b str r3, [r7, #84] ; 0x54 + 80013b6: e9d7 8914 ldrd r8, r9, [r7, #80] ; 0x50 + 80013ba: 4642 mov r2, r8 + 80013bc: 464b mov r3, r9 + 80013be: f04f 0000 mov.w r0, #0 + 80013c2: f04f 0100 mov.w r1, #0 + 80013c6: 0159 lsls r1, r3, #5 + 80013c8: ea41 61d2 orr.w r1, r1, r2, lsr #27 + 80013cc: 0150 lsls r0, r2, #5 + 80013ce: 4602 mov r2, r0 + 80013d0: 460b mov r3, r1 + 80013d2: 4641 mov r1, r8 + 80013d4: 1a51 subs r1, r2, r1 + 80013d6: 60b9 str r1, [r7, #8] + 80013d8: 4649 mov r1, r9 + 80013da: eb63 0301 sbc.w r3, r3, r1 + 80013de: 60fb str r3, [r7, #12] + 80013e0: f04f 0200 mov.w r2, #0 + 80013e4: f04f 0300 mov.w r3, #0 + 80013e8: e9d7 ab02 ldrd sl, fp, [r7, #8] + 80013ec: 4659 mov r1, fp + 80013ee: 018b lsls r3, r1, #6 + 80013f0: 4651 mov r1, sl + 80013f2: ea43 6391 orr.w r3, r3, r1, lsr #26 + 80013f6: 4651 mov r1, sl + 80013f8: 018a lsls r2, r1, #6 + 80013fa: 4651 mov r1, sl + 80013fc: 1a54 subs r4, r2, r1 + 80013fe: 4659 mov r1, fp + 8001400: eb63 0501 sbc.w r5, r3, r1 + 8001404: f04f 0200 mov.w r2, #0 + 8001408: f04f 0300 mov.w r3, #0 + 800140c: 00eb lsls r3, r5, #3 + 800140e: ea43 7354 orr.w r3, r3, r4, lsr #29 + 8001412: 00e2 lsls r2, r4, #3 + 8001414: 4614 mov r4, r2 + 8001416: 461d mov r5, r3 + 8001418: 4643 mov r3, r8 + 800141a: 18e3 adds r3, r4, r3 + 800141c: 603b str r3, [r7, #0] + 800141e: 464b mov r3, r9 + 8001420: eb45 0303 adc.w r3, r5, r3 + 8001424: 607b str r3, [r7, #4] + 8001426: f04f 0200 mov.w r2, #0 + 800142a: f04f 0300 mov.w r3, #0 + 800142e: e9d7 4500 ldrd r4, r5, [r7] + 8001432: 4629 mov r1, r5 + 8001434: 028b lsls r3, r1, #10 + 8001436: 4621 mov r1, r4 + 8001438: ea43 5391 orr.w r3, r3, r1, lsr #22 + 800143c: 4621 mov r1, r4 + 800143e: 028a lsls r2, r1, #10 + 8001440: 4610 mov r0, r2 + 8001442: 4619 mov r1, r3 + 8001444: f8d7 30ac ldr.w r3, [r7, #172] ; 0xac + 8001448: 2200 movs r2, #0 + 800144a: 64bb str r3, [r7, #72] ; 0x48 + 800144c: 64fa str r2, [r7, #76] ; 0x4c + 800144e: e9d7 2312 ldrd r2, r3, [r7, #72] ; 0x48 + 8001452: f7fe fedd bl 8000210 <__aeabi_uldivmod> + 8001456: 4602 mov r2, r0 + 8001458: 460b mov r3, r1 + 800145a: 4613 mov r3, r2 + 800145c: f8c7 30b4 str.w r3, [r7, #180] ; 0xb4 } pllr = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos); - 8001524: 4b0d ldr r3, [pc, #52] ; (800155c ) - 8001526: 685b ldr r3, [r3, #4] - 8001528: 0f1b lsrs r3, r3, #28 - 800152a: f003 0307 and.w r3, r3, #7 - 800152e: f8c7 30a4 str.w r3, [r7, #164] ; 0xa4 + 8001460: 4b0d ldr r3, [pc, #52] ; (8001498 ) + 8001462: 685b ldr r3, [r3, #4] + 8001464: 0f1b lsrs r3, r3, #28 + 8001466: f003 0307 and.w r3, r3, #7 + 800146a: f8c7 30a4 str.w r3, [r7, #164] ; 0xa4 sysclockfreq = pllvco/pllr; - 8001532: f8d7 20b4 ldr.w r2, [r7, #180] ; 0xb4 - 8001536: f8d7 30a4 ldr.w r3, [r7, #164] ; 0xa4 - 800153a: fbb2 f3f3 udiv r3, r2, r3 - 800153e: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + 800146e: f8d7 20b4 ldr.w r2, [r7, #180] ; 0xb4 + 8001472: f8d7 30a4 ldr.w r3, [r7, #164] ; 0xa4 + 8001476: fbb2 f3f3 udiv r3, r2, r3 + 800147a: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 break; - 8001542: e003 b.n 800154c + 800147e: e003 b.n 8001488 } default: { sysclockfreq = HSI_VALUE; - 8001544: 4b06 ldr r3, [pc, #24] ; (8001560 ) - 8001546: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 + 8001480: 4b06 ldr r3, [pc, #24] ; (800149c ) + 8001482: f8c7 30b0 str.w r3, [r7, #176] ; 0xb0 break; - 800154a: bf00 nop + 8001486: bf00 nop } } return sysclockfreq; - 800154c: f8d7 30b0 ldr.w r3, [r7, #176] ; 0xb0 + 8001488: f8d7 30b0 ldr.w r3, [r7, #176] ; 0xb0 } - 8001550: 4618 mov r0, r3 - 8001552: 37b8 adds r7, #184 ; 0xb8 - 8001554: 46bd mov sp, r7 - 8001556: e8bd 8fb0 ldmia.w sp!, {r4, r5, r7, r8, r9, sl, fp, pc} - 800155a: bf00 nop - 800155c: 40023800 .word 0x40023800 - 8001560: 00f42400 .word 0x00f42400 - -08001564 : + 800148c: 4618 mov r0, r3 + 800148e: 37b8 adds r7, #184 ; 0xb8 + 8001490: 46bd mov sp, r7 + 8001492: e8bd 8fb0 ldmia.w sp!, {r4, r5, r7, r8, r9, sl, fp, pc} + 8001496: bf00 nop + 8001498: 40023800 .word 0x40023800 + 800149c: 00f42400 .word 0x00f42400 + +080014a0 : * @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) { - 8001564: b580 push {r7, lr} - 8001566: b086 sub sp, #24 - 8001568: af00 add r7, sp, #0 - 800156a: 6078 str r0, [r7, #4] + 80014a0: b580 push {r7, lr} + 80014a2: b086 sub sp, #24 + 80014a4: af00 add r7, sp, #0 + 80014a6: 6078 str r0, [r7, #4] uint32_t tickstart, pll_config; /* Check Null pointer */ if(RCC_OscInitStruct == NULL) - 800156c: 687b ldr r3, [r7, #4] - 800156e: 2b00 cmp r3, #0 - 8001570: d101 bne.n 8001576 + 80014a8: 687b ldr r3, [r7, #4] + 80014aa: 2b00 cmp r3, #0 + 80014ac: d101 bne.n 80014b2 { return HAL_ERROR; - 8001572: 2301 movs r3, #1 - 8001574: e28d b.n 8001a92 + 80014ae: 2301 movs r3, #1 + 80014b0: e28d b.n 80019ce } /* Check the parameters */ assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); /*------------------------------- HSE Configuration ------------------------*/ if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) - 8001576: 687b ldr r3, [r7, #4] - 8001578: 681b ldr r3, [r3, #0] - 800157a: f003 0301 and.w r3, r3, #1 - 800157e: 2b00 cmp r3, #0 - 8001580: f000 8083 beq.w 800168a + 80014b2: 687b ldr r3, [r7, #4] + 80014b4: 681b ldr r3, [r3, #0] + 80014b6: f003 0301 and.w r3, r3, #1 + 80014ba: 2b00 cmp r3, #0 + 80014bc: f000 8083 beq.w 80015c6 { /* 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) ||\ - 8001584: 4b94 ldr r3, [pc, #592] ; (80017d8 ) - 8001586: 689b ldr r3, [r3, #8] - 8001588: f003 030c and.w r3, r3, #12 - 800158c: 2b04 cmp r3, #4 - 800158e: d019 beq.n 80015c4 + 80014c0: 4b94 ldr r3, [pc, #592] ; (8001714 ) + 80014c2: 689b ldr r3, [r3, #8] + 80014c4: f003 030c and.w r3, r3, #12 + 80014c8: 2b04 cmp r3, #4 + 80014ca: d019 beq.n 8001500 ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ - 8001590: 4b91 ldr r3, [pc, #580] ; (80017d8 ) - 8001592: 689b ldr r3, [r3, #8] - 8001594: f003 030c and.w r3, r3, #12 + 80014cc: 4b91 ldr r3, [pc, #580] ; (8001714 ) + 80014ce: 689b ldr r3, [r3, #8] + 80014d0: f003 030c and.w r3, r3, #12 if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSE) ||\ - 8001598: 2b08 cmp r3, #8 - 800159a: d106 bne.n 80015aa + 80014d4: 2b08 cmp r3, #8 + 80014d6: d106 bne.n 80014e6 ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ - 800159c: 4b8e ldr r3, [pc, #568] ; (80017d8 ) - 800159e: 685b ldr r3, [r3, #4] - 80015a0: f403 0380 and.w r3, r3, #4194304 ; 0x400000 - 80015a4: f5b3 0f80 cmp.w r3, #4194304 ; 0x400000 - 80015a8: d00c beq.n 80015c4 + 80014d8: 4b8e ldr r3, [pc, #568] ; (8001714 ) + 80014da: 685b ldr r3, [r3, #4] + 80014dc: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 80014e0: f5b3 0f80 cmp.w r3, #4194304 ; 0x400000 + 80014e4: d00c beq.n 8001500 ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) - 80015aa: 4b8b ldr r3, [pc, #556] ; (80017d8 ) - 80015ac: 689b ldr r3, [r3, #8] - 80015ae: f003 030c and.w r3, r3, #12 + 80014e6: 4b8b ldr r3, [pc, #556] ; (8001714 ) + 80014e8: 689b ldr r3, [r3, #8] + 80014ea: f003 030c and.w r3, r3, #12 ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE)) ||\ - 80015b2: 2b0c cmp r3, #12 - 80015b4: d112 bne.n 80015dc + 80014ee: 2b0c cmp r3, #12 + 80014f0: d112 bne.n 8001518 ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) - 80015b6: 4b88 ldr r3, [pc, #544] ; (80017d8 ) - 80015b8: 685b ldr r3, [r3, #4] - 80015ba: f403 0380 and.w r3, r3, #4194304 ; 0x400000 - 80015be: f5b3 0f80 cmp.w r3, #4194304 ; 0x400000 - 80015c2: d10b bne.n 80015dc + 80014f2: 4b88 ldr r3, [pc, #544] ; (8001714 ) + 80014f4: 685b ldr r3, [r3, #4] + 80014f6: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 80014fa: f5b3 0f80 cmp.w r3, #4194304 ; 0x400000 + 80014fe: d10b bne.n 8001518 #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)) - 80015c4: 4b84 ldr r3, [pc, #528] ; (80017d8 ) - 80015c6: 681b ldr r3, [r3, #0] - 80015c8: f403 3300 and.w r3, r3, #131072 ; 0x20000 - 80015cc: 2b00 cmp r3, #0 - 80015ce: d05b beq.n 8001688 - 80015d0: 687b ldr r3, [r7, #4] - 80015d2: 685b ldr r3, [r3, #4] - 80015d4: 2b00 cmp r3, #0 - 80015d6: d157 bne.n 8001688 + 8001500: 4b84 ldr r3, [pc, #528] ; (8001714 ) + 8001502: 681b ldr r3, [r3, #0] + 8001504: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8001508: 2b00 cmp r3, #0 + 800150a: d05b beq.n 80015c4 + 800150c: 687b ldr r3, [r7, #4] + 800150e: 685b ldr r3, [r3, #4] + 8001510: 2b00 cmp r3, #0 + 8001512: d157 bne.n 80015c4 { return HAL_ERROR; - 80015d8: 2301 movs r3, #1 - 80015da: e25a b.n 8001a92 + 8001514: 2301 movs r3, #1 + 8001516: e25a b.n 80019ce } } else { /* Set the new HSE configuration ---------------------------------------*/ __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); - 80015dc: 687b ldr r3, [r7, #4] - 80015de: 685b ldr r3, [r3, #4] - 80015e0: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 - 80015e4: d106 bne.n 80015f4 - 80015e6: 4b7c ldr r3, [pc, #496] ; (80017d8 ) - 80015e8: 681b ldr r3, [r3, #0] - 80015ea: 4a7b ldr r2, [pc, #492] ; (80017d8 ) - 80015ec: f443 3380 orr.w r3, r3, #65536 ; 0x10000 - 80015f0: 6013 str r3, [r2, #0] - 80015f2: e01d b.n 8001630 - 80015f4: 687b ldr r3, [r7, #4] - 80015f6: 685b ldr r3, [r3, #4] - 80015f8: f5b3 2fa0 cmp.w r3, #327680 ; 0x50000 - 80015fc: d10c bne.n 8001618 - 80015fe: 4b76 ldr r3, [pc, #472] ; (80017d8 ) - 8001600: 681b ldr r3, [r3, #0] - 8001602: 4a75 ldr r2, [pc, #468] ; (80017d8 ) - 8001604: f443 2380 orr.w r3, r3, #262144 ; 0x40000 - 8001608: 6013 str r3, [r2, #0] - 800160a: 4b73 ldr r3, [pc, #460] ; (80017d8 ) - 800160c: 681b ldr r3, [r3, #0] - 800160e: 4a72 ldr r2, [pc, #456] ; (80017d8 ) - 8001610: f443 3380 orr.w r3, r3, #65536 ; 0x10000 - 8001614: 6013 str r3, [r2, #0] - 8001616: e00b b.n 8001630 - 8001618: 4b6f ldr r3, [pc, #444] ; (80017d8 ) - 800161a: 681b ldr r3, [r3, #0] - 800161c: 4a6e ldr r2, [pc, #440] ; (80017d8 ) - 800161e: f423 3380 bic.w r3, r3, #65536 ; 0x10000 - 8001622: 6013 str r3, [r2, #0] - 8001624: 4b6c ldr r3, [pc, #432] ; (80017d8 ) - 8001626: 681b ldr r3, [r3, #0] - 8001628: 4a6b ldr r2, [pc, #428] ; (80017d8 ) - 800162a: f423 2380 bic.w r3, r3, #262144 ; 0x40000 - 800162e: 6013 str r3, [r2, #0] + 8001518: 687b ldr r3, [r7, #4] + 800151a: 685b ldr r3, [r3, #4] + 800151c: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 + 8001520: d106 bne.n 8001530 + 8001522: 4b7c ldr r3, [pc, #496] ; (8001714 ) + 8001524: 681b ldr r3, [r3, #0] + 8001526: 4a7b ldr r2, [pc, #492] ; (8001714 ) + 8001528: f443 3380 orr.w r3, r3, #65536 ; 0x10000 + 800152c: 6013 str r3, [r2, #0] + 800152e: e01d b.n 800156c + 8001530: 687b ldr r3, [r7, #4] + 8001532: 685b ldr r3, [r3, #4] + 8001534: f5b3 2fa0 cmp.w r3, #327680 ; 0x50000 + 8001538: d10c bne.n 8001554 + 800153a: 4b76 ldr r3, [pc, #472] ; (8001714 ) + 800153c: 681b ldr r3, [r3, #0] + 800153e: 4a75 ldr r2, [pc, #468] ; (8001714 ) + 8001540: f443 2380 orr.w r3, r3, #262144 ; 0x40000 + 8001544: 6013 str r3, [r2, #0] + 8001546: 4b73 ldr r3, [pc, #460] ; (8001714 ) + 8001548: 681b ldr r3, [r3, #0] + 800154a: 4a72 ldr r2, [pc, #456] ; (8001714 ) + 800154c: f443 3380 orr.w r3, r3, #65536 ; 0x10000 + 8001550: 6013 str r3, [r2, #0] + 8001552: e00b b.n 800156c + 8001554: 4b6f ldr r3, [pc, #444] ; (8001714 ) + 8001556: 681b ldr r3, [r3, #0] + 8001558: 4a6e ldr r2, [pc, #440] ; (8001714 ) + 800155a: f423 3380 bic.w r3, r3, #65536 ; 0x10000 + 800155e: 6013 str r3, [r2, #0] + 8001560: 4b6c ldr r3, [pc, #432] ; (8001714 ) + 8001562: 681b ldr r3, [r3, #0] + 8001564: 4a6b ldr r2, [pc, #428] ; (8001714 ) + 8001566: f423 2380 bic.w r3, r3, #262144 ; 0x40000 + 800156a: 6013 str r3, [r2, #0] /* Check the HSE State */ if((RCC_OscInitStruct->HSEState) != RCC_HSE_OFF) - 8001630: 687b ldr r3, [r7, #4] - 8001632: 685b ldr r3, [r3, #4] - 8001634: 2b00 cmp r3, #0 - 8001636: d013 beq.n 8001660 + 800156c: 687b ldr r3, [r7, #4] + 800156e: 685b ldr r3, [r3, #4] + 8001570: 2b00 cmp r3, #0 + 8001572: d013 beq.n 800159c { /* Get Start Tick*/ tickstart = HAL_GetTick(); - 8001638: f7ff f9ba bl 80009b0 - 800163c: 6138 str r0, [r7, #16] + 8001574: f7ff f9de bl 8000934 + 8001578: 6138 str r0, [r7, #16] /* Wait till HSE is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - 800163e: e008 b.n 8001652 + 800157a: e008 b.n 800158e { if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - 8001640: f7ff f9b6 bl 80009b0 - 8001644: 4602 mov r2, r0 - 8001646: 693b ldr r3, [r7, #16] - 8001648: 1ad3 subs r3, r2, r3 - 800164a: 2b64 cmp r3, #100 ; 0x64 - 800164c: d901 bls.n 8001652 + 800157c: f7ff f9da bl 8000934 + 8001580: 4602 mov r2, r0 + 8001582: 693b ldr r3, [r7, #16] + 8001584: 1ad3 subs r3, r2, r3 + 8001586: 2b64 cmp r3, #100 ; 0x64 + 8001588: d901 bls.n 800158e { return HAL_TIMEOUT; - 800164e: 2303 movs r3, #3 - 8001650: e21f b.n 8001a92 + 800158a: 2303 movs r3, #3 + 800158c: e21f b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) - 8001652: 4b61 ldr r3, [pc, #388] ; (80017d8 ) - 8001654: 681b ldr r3, [r3, #0] - 8001656: f403 3300 and.w r3, r3, #131072 ; 0x20000 - 800165a: 2b00 cmp r3, #0 - 800165c: d0f0 beq.n 8001640 - 800165e: e014 b.n 800168a + 800158e: 4b61 ldr r3, [pc, #388] ; (8001714 ) + 8001590: 681b ldr r3, [r3, #0] + 8001592: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8001596: 2b00 cmp r3, #0 + 8001598: d0f0 beq.n 800157c + 800159a: e014 b.n 80015c6 } } else { /* Get Start Tick*/ tickstart = HAL_GetTick(); - 8001660: f7ff f9a6 bl 80009b0 - 8001664: 6138 str r0, [r7, #16] + 800159c: f7ff f9ca bl 8000934 + 80015a0: 6138 str r0, [r7, #16] /* Wait till HSE is bypassed or disabled */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - 8001666: e008 b.n 800167a + 80015a2: e008 b.n 80015b6 { if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) - 8001668: f7ff f9a2 bl 80009b0 - 800166c: 4602 mov r2, r0 - 800166e: 693b ldr r3, [r7, #16] - 8001670: 1ad3 subs r3, r2, r3 - 8001672: 2b64 cmp r3, #100 ; 0x64 - 8001674: d901 bls.n 800167a + 80015a4: f7ff f9c6 bl 8000934 + 80015a8: 4602 mov r2, r0 + 80015aa: 693b ldr r3, [r7, #16] + 80015ac: 1ad3 subs r3, r2, r3 + 80015ae: 2b64 cmp r3, #100 ; 0x64 + 80015b0: d901 bls.n 80015b6 { return HAL_TIMEOUT; - 8001676: 2303 movs r3, #3 - 8001678: e20b b.n 8001a92 + 80015b2: 2303 movs r3, #3 + 80015b4: e20b b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) - 800167a: 4b57 ldr r3, [pc, #348] ; (80017d8 ) - 800167c: 681b ldr r3, [r3, #0] - 800167e: f403 3300 and.w r3, r3, #131072 ; 0x20000 - 8001682: 2b00 cmp r3, #0 - 8001684: d1f0 bne.n 8001668 - 8001686: e000 b.n 800168a + 80015b6: 4b57 ldr r3, [pc, #348] ; (8001714 ) + 80015b8: 681b ldr r3, [r3, #0] + 80015ba: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 80015be: 2b00 cmp r3, #0 + 80015c0: d1f0 bne.n 80015a4 + 80015c2: e000 b.n 80015c6 if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) - 8001688: bf00 nop + 80015c4: bf00 nop } } } } /*----------------------------- HSI Configuration --------------------------*/ if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) - 800168a: 687b ldr r3, [r7, #4] - 800168c: 681b ldr r3, [r3, #0] - 800168e: f003 0302 and.w r3, r3, #2 - 8001692: 2b00 cmp r3, #0 - 8001694: d06f beq.n 8001776 + 80015c6: 687b ldr r3, [r7, #4] + 80015c8: 681b ldr r3, [r3, #0] + 80015ca: f003 0302 and.w r3, r3, #2 + 80015ce: 2b00 cmp r3, #0 + 80015d0: d06f beq.n 80016b2 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) ||\ - 8001696: 4b50 ldr r3, [pc, #320] ; (80017d8 ) - 8001698: 689b ldr r3, [r3, #8] - 800169a: f003 030c and.w r3, r3, #12 - 800169e: 2b00 cmp r3, #0 - 80016a0: d017 beq.n 80016d2 + 80015d2: 4b50 ldr r3, [pc, #320] ; (8001714 ) + 80015d4: 689b ldr r3, [r3, #8] + 80015d6: f003 030c and.w r3, r3, #12 + 80015da: 2b00 cmp r3, #0 + 80015dc: d017 beq.n 800160e ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ - 80016a2: 4b4d ldr r3, [pc, #308] ; (80017d8 ) - 80016a4: 689b ldr r3, [r3, #8] - 80016a6: f003 030c and.w r3, r3, #12 + 80015de: 4b4d ldr r3, [pc, #308] ; (8001714 ) + 80015e0: 689b ldr r3, [r3, #8] + 80015e2: f003 030c and.w r3, r3, #12 if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_HSI) ||\ - 80016aa: 2b08 cmp r3, #8 - 80016ac: d105 bne.n 80016ba + 80015e6: 2b08 cmp r3, #8 + 80015e8: d105 bne.n 80015f6 ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ - 80016ae: 4b4a ldr r3, [pc, #296] ; (80017d8 ) - 80016b0: 685b ldr r3, [r3, #4] - 80016b2: f403 0380 and.w r3, r3, #4194304 ; 0x400000 - 80016b6: 2b00 cmp r3, #0 - 80016b8: d00b beq.n 80016d2 + 80015ea: 4b4a ldr r3, [pc, #296] ; (8001714 ) + 80015ec: 685b ldr r3, [r3, #4] + 80015ee: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 80015f2: 2b00 cmp r3, #0 + 80015f4: d00b beq.n 800160e ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) - 80016ba: 4b47 ldr r3, [pc, #284] ; (80017d8 ) - 80016bc: 689b ldr r3, [r3, #8] - 80016be: f003 030c and.w r3, r3, #12 + 80015f6: 4b47 ldr r3, [pc, #284] ; (8001714 ) + 80015f8: 689b ldr r3, [r3, #8] + 80015fa: f003 030c and.w r3, r3, #12 ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLL) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI)) ||\ - 80016c2: 2b0c cmp r3, #12 - 80016c4: d11c bne.n 8001700 + 80015fe: 2b0c cmp r3, #12 + 8001600: d11c bne.n 800163c ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_CFGR_SWS_PLLR) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) - 80016c6: 4b44 ldr r3, [pc, #272] ; (80017d8 ) - 80016c8: 685b ldr r3, [r3, #4] - 80016ca: f403 0380 and.w r3, r3, #4194304 ; 0x400000 - 80016ce: 2b00 cmp r3, #0 - 80016d0: d116 bne.n 8001700 + 8001602: 4b44 ldr r3, [pc, #272] ; (8001714 ) + 8001604: 685b ldr r3, [r3, #4] + 8001606: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 800160a: 2b00 cmp r3, #0 + 800160c: d116 bne.n 800163c 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)) - 80016d2: 4b41 ldr r3, [pc, #260] ; (80017d8 ) - 80016d4: 681b ldr r3, [r3, #0] - 80016d6: f003 0302 and.w r3, r3, #2 - 80016da: 2b00 cmp r3, #0 - 80016dc: d005 beq.n 80016ea - 80016de: 687b ldr r3, [r7, #4] - 80016e0: 68db ldr r3, [r3, #12] - 80016e2: 2b01 cmp r3, #1 - 80016e4: d001 beq.n 80016ea + 800160e: 4b41 ldr r3, [pc, #260] ; (8001714 ) + 8001610: 681b ldr r3, [r3, #0] + 8001612: f003 0302 and.w r3, r3, #2 + 8001616: 2b00 cmp r3, #0 + 8001618: d005 beq.n 8001626 + 800161a: 687b ldr r3, [r7, #4] + 800161c: 68db ldr r3, [r3, #12] + 800161e: 2b01 cmp r3, #1 + 8001620: d001 beq.n 8001626 { return HAL_ERROR; - 80016e6: 2301 movs r3, #1 - 80016e8: e1d3 b.n 8001a92 + 8001622: 2301 movs r3, #1 + 8001624: e1d3 b.n 80019ce } /* Otherwise, just the calibration is allowed */ else { /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - 80016ea: 4b3b ldr r3, [pc, #236] ; (80017d8 ) - 80016ec: 681b ldr r3, [r3, #0] - 80016ee: f023 02f8 bic.w r2, r3, #248 ; 0xf8 - 80016f2: 687b ldr r3, [r7, #4] - 80016f4: 691b ldr r3, [r3, #16] - 80016f6: 00db lsls r3, r3, #3 - 80016f8: 4937 ldr r1, [pc, #220] ; (80017d8 ) - 80016fa: 4313 orrs r3, r2 - 80016fc: 600b str r3, [r1, #0] + 8001626: 4b3b ldr r3, [pc, #236] ; (8001714 ) + 8001628: 681b ldr r3, [r3, #0] + 800162a: f023 02f8 bic.w r2, r3, #248 ; 0xf8 + 800162e: 687b ldr r3, [r7, #4] + 8001630: 691b ldr r3, [r3, #16] + 8001632: 00db lsls r3, r3, #3 + 8001634: 4937 ldr r1, [pc, #220] ; (8001714 ) + 8001636: 4313 orrs r3, r2 + 8001638: 600b str r3, [r1, #0] if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) - 80016fe: e03a b.n 8001776 + 800163a: e03a b.n 80016b2 } } else { /* Check the HSI State */ if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) - 8001700: 687b ldr r3, [r7, #4] - 8001702: 68db ldr r3, [r3, #12] - 8001704: 2b00 cmp r3, #0 - 8001706: d020 beq.n 800174a + 800163c: 687b ldr r3, [r7, #4] + 800163e: 68db ldr r3, [r3, #12] + 8001640: 2b00 cmp r3, #0 + 8001642: d020 beq.n 8001686 { /* Enable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_ENABLE(); - 8001708: 4b34 ldr r3, [pc, #208] ; (80017dc ) - 800170a: 2201 movs r2, #1 - 800170c: 601a str r2, [r3, #0] + 8001644: 4b34 ldr r3, [pc, #208] ; (8001718 ) + 8001646: 2201 movs r2, #1 + 8001648: 601a str r2, [r3, #0] /* Get Start Tick*/ tickstart = HAL_GetTick(); - 800170e: f7ff f94f bl 80009b0 - 8001712: 6138 str r0, [r7, #16] + 800164a: f7ff f973 bl 8000934 + 800164e: 6138 str r0, [r7, #16] /* Wait till HSI is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - 8001714: e008 b.n 8001728 + 8001650: e008 b.n 8001664 { if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - 8001716: f7ff f94b bl 80009b0 - 800171a: 4602 mov r2, r0 - 800171c: 693b ldr r3, [r7, #16] - 800171e: 1ad3 subs r3, r2, r3 - 8001720: 2b02 cmp r3, #2 - 8001722: d901 bls.n 8001728 + 8001652: f7ff f96f bl 8000934 + 8001656: 4602 mov r2, r0 + 8001658: 693b ldr r3, [r7, #16] + 800165a: 1ad3 subs r3, r2, r3 + 800165c: 2b02 cmp r3, #2 + 800165e: d901 bls.n 8001664 { return HAL_TIMEOUT; - 8001724: 2303 movs r3, #3 - 8001726: e1b4 b.n 8001a92 + 8001660: 2303 movs r3, #3 + 8001662: e1b4 b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) - 8001728: 4b2b ldr r3, [pc, #172] ; (80017d8 ) - 800172a: 681b ldr r3, [r3, #0] - 800172c: f003 0302 and.w r3, r3, #2 - 8001730: 2b00 cmp r3, #0 - 8001732: d0f0 beq.n 8001716 + 8001664: 4b2b ldr r3, [pc, #172] ; (8001714 ) + 8001666: 681b ldr r3, [r3, #0] + 8001668: f003 0302 and.w r3, r3, #2 + 800166c: 2b00 cmp r3, #0 + 800166e: d0f0 beq.n 8001652 } } /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); - 8001734: 4b28 ldr r3, [pc, #160] ; (80017d8 ) - 8001736: 681b ldr r3, [r3, #0] - 8001738: f023 02f8 bic.w r2, r3, #248 ; 0xf8 - 800173c: 687b ldr r3, [r7, #4] - 800173e: 691b ldr r3, [r3, #16] - 8001740: 00db lsls r3, r3, #3 - 8001742: 4925 ldr r1, [pc, #148] ; (80017d8 ) - 8001744: 4313 orrs r3, r2 - 8001746: 600b str r3, [r1, #0] - 8001748: e015 b.n 8001776 + 8001670: 4b28 ldr r3, [pc, #160] ; (8001714 ) + 8001672: 681b ldr r3, [r3, #0] + 8001674: f023 02f8 bic.w r2, r3, #248 ; 0xf8 + 8001678: 687b ldr r3, [r7, #4] + 800167a: 691b ldr r3, [r3, #16] + 800167c: 00db lsls r3, r3, #3 + 800167e: 4925 ldr r1, [pc, #148] ; (8001714 ) + 8001680: 4313 orrs r3, r2 + 8001682: 600b str r3, [r1, #0] + 8001684: e015 b.n 80016b2 } else { /* Disable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_DISABLE(); - 800174a: 4b24 ldr r3, [pc, #144] ; (80017dc ) - 800174c: 2200 movs r2, #0 - 800174e: 601a str r2, [r3, #0] + 8001686: 4b24 ldr r3, [pc, #144] ; (8001718 ) + 8001688: 2200 movs r2, #0 + 800168a: 601a str r2, [r3, #0] /* Get Start Tick*/ tickstart = HAL_GetTick(); - 8001750: f7ff f92e bl 80009b0 - 8001754: 6138 str r0, [r7, #16] + 800168c: f7ff f952 bl 8000934 + 8001690: 6138 str r0, [r7, #16] /* Wait till HSI is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - 8001756: e008 b.n 800176a + 8001692: e008 b.n 80016a6 { if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) - 8001758: f7ff f92a bl 80009b0 - 800175c: 4602 mov r2, r0 - 800175e: 693b ldr r3, [r7, #16] - 8001760: 1ad3 subs r3, r2, r3 - 8001762: 2b02 cmp r3, #2 - 8001764: d901 bls.n 800176a + 8001694: f7ff f94e bl 8000934 + 8001698: 4602 mov r2, r0 + 800169a: 693b ldr r3, [r7, #16] + 800169c: 1ad3 subs r3, r2, r3 + 800169e: 2b02 cmp r3, #2 + 80016a0: d901 bls.n 80016a6 { return HAL_TIMEOUT; - 8001766: 2303 movs r3, #3 - 8001768: e193 b.n 8001a92 + 80016a2: 2303 movs r3, #3 + 80016a4: e193 b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) - 800176a: 4b1b ldr r3, [pc, #108] ; (80017d8 ) - 800176c: 681b ldr r3, [r3, #0] - 800176e: f003 0302 and.w r3, r3, #2 - 8001772: 2b00 cmp r3, #0 - 8001774: d1f0 bne.n 8001758 + 80016a6: 4b1b ldr r3, [pc, #108] ; (8001714 ) + 80016a8: 681b ldr r3, [r3, #0] + 80016aa: f003 0302 and.w r3, r3, #2 + 80016ae: 2b00 cmp r3, #0 + 80016b0: d1f0 bne.n 8001694 } } } } /*------------------------------ LSI Configuration -------------------------*/ if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) - 8001776: 687b ldr r3, [r7, #4] - 8001778: 681b ldr r3, [r3, #0] - 800177a: f003 0308 and.w r3, r3, #8 - 800177e: 2b00 cmp r3, #0 - 8001780: d036 beq.n 80017f0 + 80016b2: 687b ldr r3, [r7, #4] + 80016b4: 681b ldr r3, [r3, #0] + 80016b6: f003 0308 and.w r3, r3, #8 + 80016ba: 2b00 cmp r3, #0 + 80016bc: d036 beq.n 800172c { /* Check the parameters */ assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); /* Check the LSI State */ if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) - 8001782: 687b ldr r3, [r7, #4] - 8001784: 695b ldr r3, [r3, #20] - 8001786: 2b00 cmp r3, #0 - 8001788: d016 beq.n 80017b8 + 80016be: 687b ldr r3, [r7, #4] + 80016c0: 695b ldr r3, [r3, #20] + 80016c2: 2b00 cmp r3, #0 + 80016c4: d016 beq.n 80016f4 { /* Enable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_ENABLE(); - 800178a: 4b15 ldr r3, [pc, #84] ; (80017e0 ) - 800178c: 2201 movs r2, #1 - 800178e: 601a str r2, [r3, #0] + 80016c6: 4b15 ldr r3, [pc, #84] ; (800171c ) + 80016c8: 2201 movs r2, #1 + 80016ca: 601a str r2, [r3, #0] /* Get Start Tick*/ tickstart = HAL_GetTick(); - 8001790: f7ff f90e bl 80009b0 - 8001794: 6138 str r0, [r7, #16] + 80016cc: f7ff f932 bl 8000934 + 80016d0: 6138 str r0, [r7, #16] /* Wait till LSI is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - 8001796: e008 b.n 80017aa + 80016d2: e008 b.n 80016e6 { if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - 8001798: f7ff f90a bl 80009b0 - 800179c: 4602 mov r2, r0 - 800179e: 693b ldr r3, [r7, #16] - 80017a0: 1ad3 subs r3, r2, r3 - 80017a2: 2b02 cmp r3, #2 - 80017a4: d901 bls.n 80017aa + 80016d4: f7ff f92e bl 8000934 + 80016d8: 4602 mov r2, r0 + 80016da: 693b ldr r3, [r7, #16] + 80016dc: 1ad3 subs r3, r2, r3 + 80016de: 2b02 cmp r3, #2 + 80016e0: d901 bls.n 80016e6 { return HAL_TIMEOUT; - 80017a6: 2303 movs r3, #3 - 80017a8: e173 b.n 8001a92 + 80016e2: 2303 movs r3, #3 + 80016e4: e173 b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) - 80017aa: 4b0b ldr r3, [pc, #44] ; (80017d8 ) - 80017ac: 6f5b ldr r3, [r3, #116] ; 0x74 - 80017ae: f003 0302 and.w r3, r3, #2 - 80017b2: 2b00 cmp r3, #0 - 80017b4: d0f0 beq.n 8001798 - 80017b6: e01b b.n 80017f0 + 80016e6: 4b0b ldr r3, [pc, #44] ; (8001714 ) + 80016e8: 6f5b ldr r3, [r3, #116] ; 0x74 + 80016ea: f003 0302 and.w r3, r3, #2 + 80016ee: 2b00 cmp r3, #0 + 80016f0: d0f0 beq.n 80016d4 + 80016f2: e01b b.n 800172c } } else { /* Disable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_DISABLE(); - 80017b8: 4b09 ldr r3, [pc, #36] ; (80017e0 ) - 80017ba: 2200 movs r2, #0 - 80017bc: 601a str r2, [r3, #0] + 80016f4: 4b09 ldr r3, [pc, #36] ; (800171c ) + 80016f6: 2200 movs r2, #0 + 80016f8: 601a str r2, [r3, #0] /* Get Start Tick*/ tickstart = HAL_GetTick(); - 80017be: f7ff f8f7 bl 80009b0 - 80017c2: 6138 str r0, [r7, #16] + 80016fa: f7ff f91b bl 8000934 + 80016fe: 6138 str r0, [r7, #16] /* Wait till LSI is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - 80017c4: e00e b.n 80017e4 + 8001700: e00e b.n 8001720 { if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) - 80017c6: f7ff f8f3 bl 80009b0 - 80017ca: 4602 mov r2, r0 - 80017cc: 693b ldr r3, [r7, #16] - 80017ce: 1ad3 subs r3, r2, r3 - 80017d0: 2b02 cmp r3, #2 - 80017d2: d907 bls.n 80017e4 + 8001702: f7ff f917 bl 8000934 + 8001706: 4602 mov r2, r0 + 8001708: 693b ldr r3, [r7, #16] + 800170a: 1ad3 subs r3, r2, r3 + 800170c: 2b02 cmp r3, #2 + 800170e: d907 bls.n 8001720 { return HAL_TIMEOUT; - 80017d4: 2303 movs r3, #3 - 80017d6: e15c b.n 8001a92 - 80017d8: 40023800 .word 0x40023800 - 80017dc: 42470000 .word 0x42470000 - 80017e0: 42470e80 .word 0x42470e80 + 8001710: 2303 movs r3, #3 + 8001712: e15c b.n 80019ce + 8001714: 40023800 .word 0x40023800 + 8001718: 42470000 .word 0x42470000 + 800171c: 42470e80 .word 0x42470e80 while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) - 80017e4: 4b8a ldr r3, [pc, #552] ; (8001a10 ) - 80017e6: 6f5b ldr r3, [r3, #116] ; 0x74 - 80017e8: f003 0302 and.w r3, r3, #2 - 80017ec: 2b00 cmp r3, #0 - 80017ee: d1ea bne.n 80017c6 + 8001720: 4b8a ldr r3, [pc, #552] ; (800194c ) + 8001722: 6f5b ldr r3, [r3, #116] ; 0x74 + 8001724: f003 0302 and.w r3, r3, #2 + 8001728: 2b00 cmp r3, #0 + 800172a: d1ea bne.n 8001702 } } } } /*------------------------------ LSE Configuration -------------------------*/ if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) - 80017f0: 687b ldr r3, [r7, #4] - 80017f2: 681b ldr r3, [r3, #0] - 80017f4: f003 0304 and.w r3, r3, #4 - 80017f8: 2b00 cmp r3, #0 - 80017fa: f000 8097 beq.w 800192c + 800172c: 687b ldr r3, [r7, #4] + 800172e: 681b ldr r3, [r3, #0] + 8001730: f003 0304 and.w r3, r3, #4 + 8001734: 2b00 cmp r3, #0 + 8001736: f000 8097 beq.w 8001868 { FlagStatus pwrclkchanged = RESET; - 80017fe: 2300 movs r3, #0 - 8001800: 75fb strb r3, [r7, #23] + 800173a: 2300 movs r3, #0 + 800173c: 75fb strb r3, [r7, #23] /* 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()) - 8001802: 4b83 ldr r3, [pc, #524] ; (8001a10 ) - 8001804: 6c1b ldr r3, [r3, #64] ; 0x40 - 8001806: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 - 800180a: 2b00 cmp r3, #0 - 800180c: d10f bne.n 800182e + 800173e: 4b83 ldr r3, [pc, #524] ; (800194c ) + 8001740: 6c1b ldr r3, [r3, #64] ; 0x40 + 8001742: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 8001746: 2b00 cmp r3, #0 + 8001748: d10f bne.n 800176a { __HAL_RCC_PWR_CLK_ENABLE(); - 800180e: 2300 movs r3, #0 - 8001810: 60bb str r3, [r7, #8] - 8001812: 4b7f ldr r3, [pc, #508] ; (8001a10 ) - 8001814: 6c1b ldr r3, [r3, #64] ; 0x40 - 8001816: 4a7e ldr r2, [pc, #504] ; (8001a10 ) - 8001818: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 - 800181c: 6413 str r3, [r2, #64] ; 0x40 - 800181e: 4b7c ldr r3, [pc, #496] ; (8001a10 ) - 8001820: 6c1b ldr r3, [r3, #64] ; 0x40 - 8001822: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 - 8001826: 60bb str r3, [r7, #8] - 8001828: 68bb ldr r3, [r7, #8] + 800174a: 2300 movs r3, #0 + 800174c: 60bb str r3, [r7, #8] + 800174e: 4b7f ldr r3, [pc, #508] ; (800194c ) + 8001750: 6c1b ldr r3, [r3, #64] ; 0x40 + 8001752: 4a7e ldr r2, [pc, #504] ; (800194c ) + 8001754: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 + 8001758: 6413 str r3, [r2, #64] ; 0x40 + 800175a: 4b7c ldr r3, [pc, #496] ; (800194c ) + 800175c: 6c1b ldr r3, [r3, #64] ; 0x40 + 800175e: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 8001762: 60bb str r3, [r7, #8] + 8001764: 68bb ldr r3, [r7, #8] pwrclkchanged = SET; - 800182a: 2301 movs r3, #1 - 800182c: 75fb strb r3, [r7, #23] + 8001766: 2301 movs r3, #1 + 8001768: 75fb strb r3, [r7, #23] } if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - 800182e: 4b79 ldr r3, [pc, #484] ; (8001a14 ) - 8001830: 681b ldr r3, [r3, #0] - 8001832: f403 7380 and.w r3, r3, #256 ; 0x100 - 8001836: 2b00 cmp r3, #0 - 8001838: d118 bne.n 800186c + 800176a: 4b79 ldr r3, [pc, #484] ; (8001950 ) + 800176c: 681b ldr r3, [r3, #0] + 800176e: f403 7380 and.w r3, r3, #256 ; 0x100 + 8001772: 2b00 cmp r3, #0 + 8001774: d118 bne.n 80017a8 { /* Enable write access to Backup domain */ SET_BIT(PWR->CR, PWR_CR_DBP); - 800183a: 4b76 ldr r3, [pc, #472] ; (8001a14 ) - 800183c: 681b ldr r3, [r3, #0] - 800183e: 4a75 ldr r2, [pc, #468] ; (8001a14 ) - 8001840: f443 7380 orr.w r3, r3, #256 ; 0x100 - 8001844: 6013 str r3, [r2, #0] + 8001776: 4b76 ldr r3, [pc, #472] ; (8001950 ) + 8001778: 681b ldr r3, [r3, #0] + 800177a: 4a75 ldr r2, [pc, #468] ; (8001950 ) + 800177c: f443 7380 orr.w r3, r3, #256 ; 0x100 + 8001780: 6013 str r3, [r2, #0] /* Wait for Backup domain Write protection disable */ tickstart = HAL_GetTick(); - 8001846: f7ff f8b3 bl 80009b0 - 800184a: 6138 str r0, [r7, #16] + 8001782: f7ff f8d7 bl 8000934 + 8001786: 6138 str r0, [r7, #16] while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - 800184c: e008 b.n 8001860 + 8001788: e008 b.n 800179c { if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) - 800184e: f7ff f8af bl 80009b0 - 8001852: 4602 mov r2, r0 - 8001854: 693b ldr r3, [r7, #16] - 8001856: 1ad3 subs r3, r2, r3 - 8001858: 2b02 cmp r3, #2 - 800185a: d901 bls.n 8001860 + 800178a: f7ff f8d3 bl 8000934 + 800178e: 4602 mov r2, r0 + 8001790: 693b ldr r3, [r7, #16] + 8001792: 1ad3 subs r3, r2, r3 + 8001794: 2b02 cmp r3, #2 + 8001796: d901 bls.n 800179c { return HAL_TIMEOUT; - 800185c: 2303 movs r3, #3 - 800185e: e118 b.n 8001a92 + 8001798: 2303 movs r3, #3 + 800179a: e118 b.n 80019ce while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) - 8001860: 4b6c ldr r3, [pc, #432] ; (8001a14 ) - 8001862: 681b ldr r3, [r3, #0] - 8001864: f403 7380 and.w r3, r3, #256 ; 0x100 - 8001868: 2b00 cmp r3, #0 - 800186a: d0f0 beq.n 800184e + 800179c: 4b6c ldr r3, [pc, #432] ; (8001950 ) + 800179e: 681b ldr r3, [r3, #0] + 80017a0: f403 7380 and.w r3, r3, #256 ; 0x100 + 80017a4: 2b00 cmp r3, #0 + 80017a6: d0f0 beq.n 800178a } } } /* Set the new LSE configuration -----------------------------------------*/ __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); - 800186c: 687b ldr r3, [r7, #4] - 800186e: 689b ldr r3, [r3, #8] - 8001870: 2b01 cmp r3, #1 - 8001872: d106 bne.n 8001882 - 8001874: 4b66 ldr r3, [pc, #408] ; (8001a10 ) - 8001876: 6f1b ldr r3, [r3, #112] ; 0x70 - 8001878: 4a65 ldr r2, [pc, #404] ; (8001a10 ) - 800187a: f043 0301 orr.w r3, r3, #1 - 800187e: 6713 str r3, [r2, #112] ; 0x70 - 8001880: e01c b.n 80018bc - 8001882: 687b ldr r3, [r7, #4] - 8001884: 689b ldr r3, [r3, #8] - 8001886: 2b05 cmp r3, #5 - 8001888: d10c bne.n 80018a4 - 800188a: 4b61 ldr r3, [pc, #388] ; (8001a10 ) - 800188c: 6f1b ldr r3, [r3, #112] ; 0x70 - 800188e: 4a60 ldr r2, [pc, #384] ; (8001a10 ) - 8001890: f043 0304 orr.w r3, r3, #4 - 8001894: 6713 str r3, [r2, #112] ; 0x70 - 8001896: 4b5e ldr r3, [pc, #376] ; (8001a10 ) - 8001898: 6f1b ldr r3, [r3, #112] ; 0x70 - 800189a: 4a5d ldr r2, [pc, #372] ; (8001a10 ) - 800189c: f043 0301 orr.w r3, r3, #1 - 80018a0: 6713 str r3, [r2, #112] ; 0x70 - 80018a2: e00b b.n 80018bc - 80018a4: 4b5a ldr r3, [pc, #360] ; (8001a10 ) - 80018a6: 6f1b ldr r3, [r3, #112] ; 0x70 - 80018a8: 4a59 ldr r2, [pc, #356] ; (8001a10 ) - 80018aa: f023 0301 bic.w r3, r3, #1 - 80018ae: 6713 str r3, [r2, #112] ; 0x70 - 80018b0: 4b57 ldr r3, [pc, #348] ; (8001a10 ) - 80018b2: 6f1b ldr r3, [r3, #112] ; 0x70 - 80018b4: 4a56 ldr r2, [pc, #344] ; (8001a10 ) - 80018b6: f023 0304 bic.w r3, r3, #4 - 80018ba: 6713 str r3, [r2, #112] ; 0x70 + 80017a8: 687b ldr r3, [r7, #4] + 80017aa: 689b ldr r3, [r3, #8] + 80017ac: 2b01 cmp r3, #1 + 80017ae: d106 bne.n 80017be + 80017b0: 4b66 ldr r3, [pc, #408] ; (800194c ) + 80017b2: 6f1b ldr r3, [r3, #112] ; 0x70 + 80017b4: 4a65 ldr r2, [pc, #404] ; (800194c ) + 80017b6: f043 0301 orr.w r3, r3, #1 + 80017ba: 6713 str r3, [r2, #112] ; 0x70 + 80017bc: e01c b.n 80017f8 + 80017be: 687b ldr r3, [r7, #4] + 80017c0: 689b ldr r3, [r3, #8] + 80017c2: 2b05 cmp r3, #5 + 80017c4: d10c bne.n 80017e0 + 80017c6: 4b61 ldr r3, [pc, #388] ; (800194c ) + 80017c8: 6f1b ldr r3, [r3, #112] ; 0x70 + 80017ca: 4a60 ldr r2, [pc, #384] ; (800194c ) + 80017cc: f043 0304 orr.w r3, r3, #4 + 80017d0: 6713 str r3, [r2, #112] ; 0x70 + 80017d2: 4b5e ldr r3, [pc, #376] ; (800194c ) + 80017d4: 6f1b ldr r3, [r3, #112] ; 0x70 + 80017d6: 4a5d ldr r2, [pc, #372] ; (800194c ) + 80017d8: f043 0301 orr.w r3, r3, #1 + 80017dc: 6713 str r3, [r2, #112] ; 0x70 + 80017de: e00b b.n 80017f8 + 80017e0: 4b5a ldr r3, [pc, #360] ; (800194c ) + 80017e2: 6f1b ldr r3, [r3, #112] ; 0x70 + 80017e4: 4a59 ldr r2, [pc, #356] ; (800194c ) + 80017e6: f023 0301 bic.w r3, r3, #1 + 80017ea: 6713 str r3, [r2, #112] ; 0x70 + 80017ec: 4b57 ldr r3, [pc, #348] ; (800194c ) + 80017ee: 6f1b ldr r3, [r3, #112] ; 0x70 + 80017f0: 4a56 ldr r2, [pc, #344] ; (800194c ) + 80017f2: f023 0304 bic.w r3, r3, #4 + 80017f6: 6713 str r3, [r2, #112] ; 0x70 /* Check the LSE State */ if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) - 80018bc: 687b ldr r3, [r7, #4] - 80018be: 689b ldr r3, [r3, #8] - 80018c0: 2b00 cmp r3, #0 - 80018c2: d015 beq.n 80018f0 + 80017f8: 687b ldr r3, [r7, #4] + 80017fa: 689b ldr r3, [r3, #8] + 80017fc: 2b00 cmp r3, #0 + 80017fe: d015 beq.n 800182c { /* Get Start Tick*/ tickstart = HAL_GetTick(); - 80018c4: f7ff f874 bl 80009b0 - 80018c8: 6138 str r0, [r7, #16] + 8001800: f7ff f898 bl 8000934 + 8001804: 6138 str r0, [r7, #16] /* Wait till LSE is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - 80018ca: e00a b.n 80018e2 + 8001806: e00a b.n 800181e { if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - 80018cc: f7ff f870 bl 80009b0 - 80018d0: 4602 mov r2, r0 - 80018d2: 693b ldr r3, [r7, #16] - 80018d4: 1ad3 subs r3, r2, r3 - 80018d6: f241 3288 movw r2, #5000 ; 0x1388 - 80018da: 4293 cmp r3, r2 - 80018dc: d901 bls.n 80018e2 + 8001808: f7ff f894 bl 8000934 + 800180c: 4602 mov r2, r0 + 800180e: 693b ldr r3, [r7, #16] + 8001810: 1ad3 subs r3, r2, r3 + 8001812: f241 3288 movw r2, #5000 ; 0x1388 + 8001816: 4293 cmp r3, r2 + 8001818: d901 bls.n 800181e { return HAL_TIMEOUT; - 80018de: 2303 movs r3, #3 - 80018e0: e0d7 b.n 8001a92 + 800181a: 2303 movs r3, #3 + 800181c: e0d7 b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) - 80018e2: 4b4b ldr r3, [pc, #300] ; (8001a10 ) - 80018e4: 6f1b ldr r3, [r3, #112] ; 0x70 - 80018e6: f003 0302 and.w r3, r3, #2 - 80018ea: 2b00 cmp r3, #0 - 80018ec: d0ee beq.n 80018cc - 80018ee: e014 b.n 800191a + 800181e: 4b4b ldr r3, [pc, #300] ; (800194c ) + 8001820: 6f1b ldr r3, [r3, #112] ; 0x70 + 8001822: f003 0302 and.w r3, r3, #2 + 8001826: 2b00 cmp r3, #0 + 8001828: d0ee beq.n 8001808 + 800182a: e014 b.n 8001856 } } else { /* Get Start Tick*/ tickstart = HAL_GetTick(); - 80018f0: f7ff f85e bl 80009b0 - 80018f4: 6138 str r0, [r7, #16] + 800182c: f7ff f882 bl 8000934 + 8001830: 6138 str r0, [r7, #16] /* Wait till LSE is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - 80018f6: e00a b.n 800190e + 8001832: e00a b.n 800184a { if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) - 80018f8: f7ff f85a bl 80009b0 - 80018fc: 4602 mov r2, r0 - 80018fe: 693b ldr r3, [r7, #16] - 8001900: 1ad3 subs r3, r2, r3 - 8001902: f241 3288 movw r2, #5000 ; 0x1388 - 8001906: 4293 cmp r3, r2 - 8001908: d901 bls.n 800190e + 8001834: f7ff f87e bl 8000934 + 8001838: 4602 mov r2, r0 + 800183a: 693b ldr r3, [r7, #16] + 800183c: 1ad3 subs r3, r2, r3 + 800183e: f241 3288 movw r2, #5000 ; 0x1388 + 8001842: 4293 cmp r3, r2 + 8001844: d901 bls.n 800184a { return HAL_TIMEOUT; - 800190a: 2303 movs r3, #3 - 800190c: e0c1 b.n 8001a92 + 8001846: 2303 movs r3, #3 + 8001848: e0c1 b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) - 800190e: 4b40 ldr r3, [pc, #256] ; (8001a10 ) - 8001910: 6f1b ldr r3, [r3, #112] ; 0x70 - 8001912: f003 0302 and.w r3, r3, #2 - 8001916: 2b00 cmp r3, #0 - 8001918: d1ee bne.n 80018f8 + 800184a: 4b40 ldr r3, [pc, #256] ; (800194c ) + 800184c: 6f1b ldr r3, [r3, #112] ; 0x70 + 800184e: f003 0302 and.w r3, r3, #2 + 8001852: 2b00 cmp r3, #0 + 8001854: d1ee bne.n 8001834 } } } /* Restore clock configuration if changed */ if(pwrclkchanged == SET) - 800191a: 7dfb ldrb r3, [r7, #23] - 800191c: 2b01 cmp r3, #1 - 800191e: d105 bne.n 800192c + 8001856: 7dfb ldrb r3, [r7, #23] + 8001858: 2b01 cmp r3, #1 + 800185a: d105 bne.n 8001868 { __HAL_RCC_PWR_CLK_DISABLE(); - 8001920: 4b3b ldr r3, [pc, #236] ; (8001a10 ) - 8001922: 6c1b ldr r3, [r3, #64] ; 0x40 - 8001924: 4a3a ldr r2, [pc, #232] ; (8001a10 ) - 8001926: f023 5380 bic.w r3, r3, #268435456 ; 0x10000000 - 800192a: 6413 str r3, [r2, #64] ; 0x40 + 800185c: 4b3b ldr r3, [pc, #236] ; (800194c ) + 800185e: 6c1b ldr r3, [r3, #64] ; 0x40 + 8001860: 4a3a ldr r2, [pc, #232] ; (800194c ) + 8001862: f023 5380 bic.w r3, r3, #268435456 ; 0x10000000 + 8001866: 6413 str r3, [r2, #64] ; 0x40 } } /*-------------------------------- PLL Configuration -----------------------*/ /* Check the parameters */ assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) - 800192c: 687b ldr r3, [r7, #4] - 800192e: 699b ldr r3, [r3, #24] - 8001930: 2b00 cmp r3, #0 - 8001932: f000 80ad beq.w 8001a90 + 8001868: 687b ldr r3, [r7, #4] + 800186a: 699b ldr r3, [r3, #24] + 800186c: 2b00 cmp r3, #0 + 800186e: f000 80ad beq.w 80019cc { /* Check if the PLL is used as system clock or not */ if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_CFGR_SWS_PLL) - 8001936: 4b36 ldr r3, [pc, #216] ; (8001a10 ) - 8001938: 689b ldr r3, [r3, #8] - 800193a: f003 030c and.w r3, r3, #12 - 800193e: 2b08 cmp r3, #8 - 8001940: d060 beq.n 8001a04 + 8001872: 4b36 ldr r3, [pc, #216] ; (800194c ) + 8001874: 689b ldr r3, [r3, #8] + 8001876: f003 030c and.w r3, r3, #12 + 800187a: 2b08 cmp r3, #8 + 800187c: d060 beq.n 8001940 { if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) - 8001942: 687b ldr r3, [r7, #4] - 8001944: 699b ldr r3, [r3, #24] - 8001946: 2b02 cmp r3, #2 - 8001948: d145 bne.n 80019d6 + 800187e: 687b ldr r3, [r7, #4] + 8001880: 699b ldr r3, [r3, #24] + 8001882: 2b02 cmp r3, #2 + 8001884: d145 bne.n 8001912 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(); - 800194a: 4b33 ldr r3, [pc, #204] ; (8001a18 ) - 800194c: 2200 movs r2, #0 - 800194e: 601a str r2, [r3, #0] + 8001886: 4b33 ldr r3, [pc, #204] ; (8001954 ) + 8001888: 2200 movs r2, #0 + 800188a: 601a str r2, [r3, #0] /* Get Start Tick*/ tickstart = HAL_GetTick(); - 8001950: f7ff f82e bl 80009b0 - 8001954: 6138 str r0, [r7, #16] + 800188c: f7ff f852 bl 8000934 + 8001890: 6138 str r0, [r7, #16] /* Wait till PLL is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - 8001956: e008 b.n 800196a + 8001892: e008 b.n 80018a6 { if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - 8001958: f7ff f82a bl 80009b0 - 800195c: 4602 mov r2, r0 - 800195e: 693b ldr r3, [r7, #16] - 8001960: 1ad3 subs r3, r2, r3 - 8001962: 2b02 cmp r3, #2 - 8001964: d901 bls.n 800196a + 8001894: f7ff f84e bl 8000934 + 8001898: 4602 mov r2, r0 + 800189a: 693b ldr r3, [r7, #16] + 800189c: 1ad3 subs r3, r2, r3 + 800189e: 2b02 cmp r3, #2 + 80018a0: d901 bls.n 80018a6 { return HAL_TIMEOUT; - 8001966: 2303 movs r3, #3 - 8001968: e093 b.n 8001a92 + 80018a2: 2303 movs r3, #3 + 80018a4: e093 b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - 800196a: 4b29 ldr r3, [pc, #164] ; (8001a10 ) - 800196c: 681b ldr r3, [r3, #0] - 800196e: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 - 8001972: 2b00 cmp r3, #0 - 8001974: d1f0 bne.n 8001958 + 80018a6: 4b29 ldr r3, [pc, #164] ; (800194c ) + 80018a8: 681b ldr r3, [r3, #0] + 80018aa: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 80018ae: 2b00 cmp r3, #0 + 80018b0: d1f0 bne.n 8001894 } } /* Configure the main PLL clock source, multiplication and division factors. */ WRITE_REG(RCC->PLLCFGR, (RCC_OscInitStruct->PLL.PLLSource | \ - 8001976: 687b ldr r3, [r7, #4] - 8001978: 69da ldr r2, [r3, #28] - 800197a: 687b ldr r3, [r7, #4] - 800197c: 6a1b ldr r3, [r3, #32] - 800197e: 431a orrs r2, r3 - 8001980: 687b ldr r3, [r7, #4] - 8001982: 6a5b ldr r3, [r3, #36] ; 0x24 - 8001984: 019b lsls r3, r3, #6 - 8001986: 431a orrs r2, r3 - 8001988: 687b ldr r3, [r7, #4] - 800198a: 6a9b ldr r3, [r3, #40] ; 0x28 - 800198c: 085b lsrs r3, r3, #1 - 800198e: 3b01 subs r3, #1 - 8001990: 041b lsls r3, r3, #16 - 8001992: 431a orrs r2, r3 - 8001994: 687b ldr r3, [r7, #4] - 8001996: 6adb ldr r3, [r3, #44] ; 0x2c - 8001998: 061b lsls r3, r3, #24 - 800199a: 431a orrs r2, r3 - 800199c: 687b ldr r3, [r7, #4] - 800199e: 6b1b ldr r3, [r3, #48] ; 0x30 - 80019a0: 071b lsls r3, r3, #28 - 80019a2: 491b ldr r1, [pc, #108] ; (8001a10 ) - 80019a4: 4313 orrs r3, r2 - 80019a6: 604b str r3, [r1, #4] + 80018b2: 687b ldr r3, [r7, #4] + 80018b4: 69da ldr r2, [r3, #28] + 80018b6: 687b ldr r3, [r7, #4] + 80018b8: 6a1b ldr r3, [r3, #32] + 80018ba: 431a orrs r2, r3 + 80018bc: 687b ldr r3, [r7, #4] + 80018be: 6a5b ldr r3, [r3, #36] ; 0x24 + 80018c0: 019b lsls r3, r3, #6 + 80018c2: 431a orrs r2, r3 + 80018c4: 687b ldr r3, [r7, #4] + 80018c6: 6a9b ldr r3, [r3, #40] ; 0x28 + 80018c8: 085b lsrs r3, r3, #1 + 80018ca: 3b01 subs r3, #1 + 80018cc: 041b lsls r3, r3, #16 + 80018ce: 431a orrs r2, r3 + 80018d0: 687b ldr r3, [r7, #4] + 80018d2: 6adb ldr r3, [r3, #44] ; 0x2c + 80018d4: 061b lsls r3, r3, #24 + 80018d6: 431a orrs r2, r3 + 80018d8: 687b ldr r3, [r7, #4] + 80018da: 6b1b ldr r3, [r3, #48] ; 0x30 + 80018dc: 071b lsls r3, r3, #28 + 80018de: 491b ldr r1, [pc, #108] ; (800194c ) + 80018e0: 4313 orrs r3, r2 + 80018e2: 604b str r3, [r1, #4] (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos) | \ (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos) | \ (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos) | \ (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))); /* Enable the main PLL. */ __HAL_RCC_PLL_ENABLE(); - 80019a8: 4b1b ldr r3, [pc, #108] ; (8001a18 ) - 80019aa: 2201 movs r2, #1 - 80019ac: 601a str r2, [r3, #0] + 80018e4: 4b1b ldr r3, [pc, #108] ; (8001954 ) + 80018e6: 2201 movs r2, #1 + 80018e8: 601a str r2, [r3, #0] /* Get Start Tick*/ tickstart = HAL_GetTick(); - 80019ae: f7fe ffff bl 80009b0 - 80019b2: 6138 str r0, [r7, #16] + 80018ea: f7ff f823 bl 8000934 + 80018ee: 6138 str r0, [r7, #16] /* Wait till PLL is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - 80019b4: e008 b.n 80019c8 + 80018f0: e008 b.n 8001904 { if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - 80019b6: f7fe fffb bl 80009b0 - 80019ba: 4602 mov r2, r0 - 80019bc: 693b ldr r3, [r7, #16] - 80019be: 1ad3 subs r3, r2, r3 - 80019c0: 2b02 cmp r3, #2 - 80019c2: d901 bls.n 80019c8 + 80018f2: f7ff f81f bl 8000934 + 80018f6: 4602 mov r2, r0 + 80018f8: 693b ldr r3, [r7, #16] + 80018fa: 1ad3 subs r3, r2, r3 + 80018fc: 2b02 cmp r3, #2 + 80018fe: d901 bls.n 8001904 { return HAL_TIMEOUT; - 80019c4: 2303 movs r3, #3 - 80019c6: e064 b.n 8001a92 + 8001900: 2303 movs r3, #3 + 8001902: e064 b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) - 80019c8: 4b11 ldr r3, [pc, #68] ; (8001a10 ) - 80019ca: 681b ldr r3, [r3, #0] - 80019cc: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 - 80019d0: 2b00 cmp r3, #0 - 80019d2: d0f0 beq.n 80019b6 - 80019d4: e05c b.n 8001a90 + 8001904: 4b11 ldr r3, [pc, #68] ; (800194c ) + 8001906: 681b ldr r3, [r3, #0] + 8001908: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 800190c: 2b00 cmp r3, #0 + 800190e: d0f0 beq.n 80018f2 + 8001910: e05c b.n 80019cc } } else { /* Disable the main PLL. */ __HAL_RCC_PLL_DISABLE(); - 80019d6: 4b10 ldr r3, [pc, #64] ; (8001a18 ) - 80019d8: 2200 movs r2, #0 - 80019da: 601a str r2, [r3, #0] + 8001912: 4b10 ldr r3, [pc, #64] ; (8001954 ) + 8001914: 2200 movs r2, #0 + 8001916: 601a str r2, [r3, #0] /* Get Start Tick*/ tickstart = HAL_GetTick(); - 80019dc: f7fe ffe8 bl 80009b0 - 80019e0: 6138 str r0, [r7, #16] + 8001918: f7ff f80c bl 8000934 + 800191c: 6138 str r0, [r7, #16] /* Wait till PLL is ready */ while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - 80019e2: e008 b.n 80019f6 + 800191e: e008 b.n 8001932 { if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) - 80019e4: f7fe ffe4 bl 80009b0 - 80019e8: 4602 mov r2, r0 - 80019ea: 693b ldr r3, [r7, #16] - 80019ec: 1ad3 subs r3, r2, r3 - 80019ee: 2b02 cmp r3, #2 - 80019f0: d901 bls.n 80019f6 + 8001920: f7ff f808 bl 8000934 + 8001924: 4602 mov r2, r0 + 8001926: 693b ldr r3, [r7, #16] + 8001928: 1ad3 subs r3, r2, r3 + 800192a: 2b02 cmp r3, #2 + 800192c: d901 bls.n 8001932 { return HAL_TIMEOUT; - 80019f2: 2303 movs r3, #3 - 80019f4: e04d b.n 8001a92 + 800192e: 2303 movs r3, #3 + 8001930: e04d b.n 80019ce while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) - 80019f6: 4b06 ldr r3, [pc, #24] ; (8001a10 ) - 80019f8: 681b ldr r3, [r3, #0] - 80019fa: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 - 80019fe: 2b00 cmp r3, #0 - 8001a00: d1f0 bne.n 80019e4 - 8001a02: e045 b.n 8001a90 + 8001932: 4b06 ldr r3, [pc, #24] ; (800194c ) + 8001934: 681b ldr r3, [r3, #0] + 8001936: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 800193a: 2b00 cmp r3, #0 + 800193c: d1f0 bne.n 8001920 + 800193e: e045 b.n 80019cc } } else { /* Check if there is a request to disable the PLL used as System clock source */ if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) - 8001a04: 687b ldr r3, [r7, #4] - 8001a06: 699b ldr r3, [r3, #24] - 8001a08: 2b01 cmp r3, #1 - 8001a0a: d107 bne.n 8001a1c + 8001940: 687b ldr r3, [r7, #4] + 8001942: 699b ldr r3, [r3, #24] + 8001944: 2b01 cmp r3, #1 + 8001946: d107 bne.n 8001958 { return HAL_ERROR; - 8001a0c: 2301 movs r3, #1 - 8001a0e: e040 b.n 8001a92 - 8001a10: 40023800 .word 0x40023800 - 8001a14: 40007000 .word 0x40007000 - 8001a18: 42470060 .word 0x42470060 + 8001948: 2301 movs r3, #1 + 800194a: e040 b.n 80019ce + 800194c: 40023800 .word 0x40023800 + 8001950: 40007000 .word 0x40007000 + 8001954: 42470060 .word 0x42470060 } else { /* Do not return HAL_ERROR if request repeats the current configuration */ pll_config = RCC->PLLCFGR; - 8001a1c: 4b1f ldr r3, [pc, #124] ; (8001a9c ) - 8001a1e: 685b ldr r3, [r3, #4] - 8001a20: 60fb str r3, [r7, #12] + 8001958: 4b1f ldr r3, [pc, #124] ; (80019d8 ) + 800195a: 685b ldr r3, [r3, #4] + 800195c: 60fb str r3, [r7, #12] #if defined (RCC_PLLCFGR_PLLR) if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - 8001a22: 687b ldr r3, [r7, #4] - 8001a24: 699b ldr r3, [r3, #24] - 8001a26: 2b01 cmp r3, #1 - 8001a28: d030 beq.n 8001a8c + 800195e: 687b ldr r3, [r7, #4] + 8001960: 699b ldr r3, [r3, #24] + 8001962: 2b01 cmp r3, #1 + 8001964: d030 beq.n 80019c8 (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - 8001a2a: 68fb ldr r3, [r7, #12] - 8001a2c: f403 0280 and.w r2, r3, #4194304 ; 0x400000 - 8001a30: 687b ldr r3, [r7, #4] - 8001a32: 69db ldr r3, [r3, #28] + 8001966: 68fb ldr r3, [r7, #12] + 8001968: f403 0280 and.w r2, r3, #4194304 ; 0x400000 + 800196c: 687b ldr r3, [r7, #4] + 800196e: 69db ldr r3, [r3, #28] if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || - 8001a34: 429a cmp r2, r3 - 8001a36: d129 bne.n 8001a8c + 8001970: 429a cmp r2, r3 + 8001972: d129 bne.n 80019c8 (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - 8001a38: 68fb ldr r3, [r7, #12] - 8001a3a: f003 023f and.w r2, r3, #63 ; 0x3f - 8001a3e: 687b ldr r3, [r7, #4] - 8001a40: 6a1b ldr r3, [r3, #32] + 8001974: 68fb ldr r3, [r7, #12] + 8001976: f003 023f and.w r2, r3, #63 ; 0x3f + 800197a: 687b ldr r3, [r7, #4] + 800197c: 6a1b ldr r3, [r3, #32] (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || - 8001a42: 429a cmp r2, r3 - 8001a44: d122 bne.n 8001a8c + 800197e: 429a cmp r2, r3 + 8001980: d122 bne.n 80019c8 (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - 8001a46: 68fa ldr r2, [r7, #12] - 8001a48: f647 73c0 movw r3, #32704 ; 0x7fc0 - 8001a4c: 4013 ands r3, r2 - 8001a4e: 687a ldr r2, [r7, #4] - 8001a50: 6a52 ldr r2, [r2, #36] ; 0x24 - 8001a52: 0192 lsls r2, r2, #6 + 8001982: 68fa ldr r2, [r7, #12] + 8001984: f647 73c0 movw r3, #32704 ; 0x7fc0 + 8001988: 4013 ands r3, r2 + 800198a: 687a ldr r2, [r7, #4] + 800198c: 6a52 ldr r2, [r2, #36] ; 0x24 + 800198e: 0192 lsls r2, r2, #6 (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != (RCC_OscInitStruct->PLL.PLLM) << RCC_PLLCFGR_PLLM_Pos) || - 8001a54: 4293 cmp r3, r2 - 8001a56: d119 bne.n 8001a8c + 8001990: 4293 cmp r3, r2 + 8001992: d119 bne.n 80019c8 (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - 8001a58: 68fb ldr r3, [r7, #12] - 8001a5a: f403 3240 and.w r2, r3, #196608 ; 0x30000 - 8001a5e: 687b ldr r3, [r7, #4] - 8001a60: 6a9b ldr r3, [r3, #40] ; 0x28 - 8001a62: 085b lsrs r3, r3, #1 - 8001a64: 3b01 subs r3, #1 - 8001a66: 041b lsls r3, r3, #16 + 8001994: 68fb ldr r3, [r7, #12] + 8001996: f403 3240 and.w r2, r3, #196608 ; 0x30000 + 800199a: 687b ldr r3, [r7, #4] + 800199c: 6a9b ldr r3, [r3, #40] ; 0x28 + 800199e: 085b lsrs r3, r3, #1 + 80019a0: 3b01 subs r3, #1 + 80019a2: 041b lsls r3, r3, #16 (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || - 8001a68: 429a cmp r2, r3 - 8001a6a: d10f bne.n 8001a8c + 80019a4: 429a cmp r2, r3 + 80019a6: d10f bne.n 80019c8 (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || - 8001a6c: 68fb ldr r3, [r7, #12] - 8001a6e: f003 6270 and.w r2, r3, #251658240 ; 0xf000000 - 8001a72: 687b ldr r3, [r7, #4] - 8001a74: 6adb ldr r3, [r3, #44] ; 0x2c - 8001a76: 061b lsls r3, r3, #24 + 80019a8: 68fb ldr r3, [r7, #12] + 80019aa: f003 6270 and.w r2, r3, #251658240 ; 0xf000000 + 80019ae: 687b ldr r3, [r7, #4] + 80019b0: 6adb ldr r3, [r3, #44] ; 0x2c + 80019b2: 061b lsls r3, r3, #24 (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || - 8001a78: 429a cmp r2, r3 - 8001a7a: d107 bne.n 8001a8c + 80019b4: 429a cmp r2, r3 + 80019b6: d107 bne.n 80019c8 (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) - 8001a7c: 68fb ldr r3, [r7, #12] - 8001a7e: f003 42e0 and.w r2, r3, #1879048192 ; 0x70000000 - 8001a82: 687b ldr r3, [r7, #4] - 8001a84: 6b1b ldr r3, [r3, #48] ; 0x30 - 8001a86: 071b lsls r3, r3, #28 + 80019b8: 68fb ldr r3, [r7, #12] + 80019ba: f003 42e0 and.w r2, r3, #1879048192 ; 0x70000000 + 80019be: 687b ldr r3, [r7, #4] + 80019c0: 6b1b ldr r3, [r3, #48] ; 0x30 + 80019c2: 071b lsls r3, r3, #28 (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || - 8001a88: 429a cmp r2, r3 - 8001a8a: d001 beq.n 8001a90 + 80019c4: 429a cmp r2, r3 + 80019c6: d001 beq.n 80019cc (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN) << RCC_PLLCFGR_PLLN_Pos) || (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != (((RCC_OscInitStruct->PLL.PLLP >> 1U) - 1U)) << RCC_PLLCFGR_PLLP_Pos) || (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) #endif { return HAL_ERROR; - 8001a8c: 2301 movs r3, #1 - 8001a8e: e000 b.n 8001a92 + 80019c8: 2301 movs r3, #1 + 80019ca: e000 b.n 80019ce } } } } return HAL_OK; - 8001a90: 2300 movs r3, #0 + 80019cc: 2300 movs r3, #0 } - 8001a92: 4618 mov r0, r3 - 8001a94: 3718 adds r7, #24 - 8001a96: 46bd mov sp, r7 - 8001a98: bd80 pop {r7, pc} - 8001a9a: bf00 nop - 8001a9c: 40023800 .word 0x40023800 + 80019ce: 4618 mov r0, r3 + 80019d0: 3718 adds r7, #24 + 80019d2: 46bd mov sp, r7 + 80019d4: bd80 pop {r7, pc} + 80019d6: bf00 nop + 80019d8: 40023800 .word 0x40023800 -08001aa0 : +080019dc : extern void xPortSysTickHandler(void); /* Convert from CMSIS type osPriority to FreeRTOS priority number */ static unsigned portBASE_TYPE makeFreeRtosPriority (osPriority priority) { - 8001aa0: b480 push {r7} - 8001aa2: b085 sub sp, #20 - 8001aa4: af00 add r7, sp, #0 - 8001aa6: 4603 mov r3, r0 - 8001aa8: 80fb strh r3, [r7, #6] + 80019dc: b480 push {r7} + 80019de: b085 sub sp, #20 + 80019e0: af00 add r7, sp, #0 + 80019e2: 4603 mov r3, r0 + 80019e4: 80fb strh r3, [r7, #6] unsigned portBASE_TYPE fpriority = tskIDLE_PRIORITY; - 8001aaa: 2300 movs r3, #0 - 8001aac: 60fb str r3, [r7, #12] + 80019e6: 2300 movs r3, #0 + 80019e8: 60fb str r3, [r7, #12] if (priority != osPriorityError) { - 8001aae: f9b7 3006 ldrsh.w r3, [r7, #6] - 8001ab2: 2b84 cmp r3, #132 ; 0x84 - 8001ab4: d005 beq.n 8001ac2 + 80019ea: f9b7 3006 ldrsh.w r3, [r7, #6] + 80019ee: 2b84 cmp r3, #132 ; 0x84 + 80019f0: d005 beq.n 80019fe fpriority += (priority - osPriorityIdle); - 8001ab6: f9b7 2006 ldrsh.w r2, [r7, #6] - 8001aba: 68fb ldr r3, [r7, #12] - 8001abc: 4413 add r3, r2 - 8001abe: 3303 adds r3, #3 - 8001ac0: 60fb str r3, [r7, #12] + 80019f2: f9b7 2006 ldrsh.w r2, [r7, #6] + 80019f6: 68fb ldr r3, [r7, #12] + 80019f8: 4413 add r3, r2 + 80019fa: 3303 adds r3, #3 + 80019fc: 60fb str r3, [r7, #12] } return fpriority; - 8001ac2: 68fb ldr r3, [r7, #12] + 80019fe: 68fb ldr r3, [r7, #12] } - 8001ac4: 4618 mov r0, r3 - 8001ac6: 3714 adds r7, #20 - 8001ac8: 46bd mov sp, r7 - 8001aca: f85d 7b04 ldr.w r7, [sp], #4 - 8001ace: 4770 bx lr + 8001a00: 4618 mov r0, r3 + 8001a02: 3714 adds r7, #20 + 8001a04: 46bd mov sp, r7 + 8001a06: f85d 7b04 ldr.w r7, [sp], #4 + 8001a0a: 4770 bx lr -08001ad0 : +08001a0c : * @param argument pointer that is passed to the thread function as start argument. * @retval status code that indicates the execution status of the function * @note MUST REMAIN UNCHANGED: \b osKernelStart shall be consistent in every CMSIS-RTOS. */ osStatus osKernelStart (void) { - 8001ad0: b580 push {r7, lr} - 8001ad2: af00 add r7, sp, #0 + 8001a0c: b580 push {r7, lr} + 8001a0e: af00 add r7, sp, #0 vTaskStartScheduler(); - 8001ad4: f000 fade bl 8002094 + 8001a10: f000 fade bl 8001fd0 return osOK; - 8001ad8: 2300 movs r3, #0 + 8001a14: 2300 movs r3, #0 } - 8001ada: 4618 mov r0, r3 - 8001adc: bd80 pop {r7, pc} + 8001a16: 4618 mov r0, r3 + 8001a18: bd80 pop {r7, pc} -08001ade : +08001a1a : * @param argument pointer that is passed to the thread function as start argument. * @retval thread ID for reference by other functions or NULL in case of error. * @note MUST REMAIN UNCHANGED: \b osThreadCreate shall be consistent in every CMSIS-RTOS. */ osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument) { - 8001ade: b5f0 push {r4, r5, r6, r7, lr} - 8001ae0: b089 sub sp, #36 ; 0x24 - 8001ae2: af04 add r7, sp, #16 - 8001ae4: 6078 str r0, [r7, #4] - 8001ae6: 6039 str r1, [r7, #0] + 8001a1a: b5f0 push {r4, r5, r6, r7, lr} + 8001a1c: b089 sub sp, #36 ; 0x24 + 8001a1e: af04 add r7, sp, #16 + 8001a20: 6078 str r0, [r7, #4] + 8001a22: 6039 str r1, [r7, #0] TaskHandle_t handle; #if( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) if((thread_def->buffer != NULL) && (thread_def->controlblock != NULL)) { - 8001ae8: 687b ldr r3, [r7, #4] - 8001aea: 695b ldr r3, [r3, #20] - 8001aec: 2b00 cmp r3, #0 - 8001aee: d020 beq.n 8001b32 - 8001af0: 687b ldr r3, [r7, #4] - 8001af2: 699b ldr r3, [r3, #24] - 8001af4: 2b00 cmp r3, #0 - 8001af6: d01c beq.n 8001b32 + 8001a24: 687b ldr r3, [r7, #4] + 8001a26: 695b ldr r3, [r3, #20] + 8001a28: 2b00 cmp r3, #0 + 8001a2a: d020 beq.n 8001a6e + 8001a2c: 687b ldr r3, [r7, #4] + 8001a2e: 699b ldr r3, [r3, #24] + 8001a30: 2b00 cmp r3, #0 + 8001a32: d01c beq.n 8001a6e handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, - 8001af8: 687b ldr r3, [r7, #4] - 8001afa: 685c ldr r4, [r3, #4] - 8001afc: 687b ldr r3, [r7, #4] - 8001afe: 681d ldr r5, [r3, #0] - 8001b00: 687b ldr r3, [r7, #4] - 8001b02: 691e ldr r6, [r3, #16] - 8001b04: 687b ldr r3, [r7, #4] - 8001b06: f9b3 3008 ldrsh.w r3, [r3, #8] - 8001b0a: 4618 mov r0, r3 - 8001b0c: f7ff ffc8 bl 8001aa0 - 8001b10: 4601 mov r1, r0 + 8001a34: 687b ldr r3, [r7, #4] + 8001a36: 685c ldr r4, [r3, #4] + 8001a38: 687b ldr r3, [r7, #4] + 8001a3a: 681d ldr r5, [r3, #0] + 8001a3c: 687b ldr r3, [r7, #4] + 8001a3e: 691e ldr r6, [r3, #16] + 8001a40: 687b ldr r3, [r7, #4] + 8001a42: f9b3 3008 ldrsh.w r3, [r3, #8] + 8001a46: 4618 mov r0, r3 + 8001a48: f7ff ffc8 bl 80019dc + 8001a4c: 4601 mov r1, r0 thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority), thread_def->buffer, thread_def->controlblock); - 8001b12: 687b ldr r3, [r7, #4] - 8001b14: 695b ldr r3, [r3, #20] - 8001b16: 687a ldr r2, [r7, #4] - 8001b18: 6992 ldr r2, [r2, #24] + 8001a4e: 687b ldr r3, [r7, #4] + 8001a50: 695b ldr r3, [r3, #20] + 8001a52: 687a ldr r2, [r7, #4] + 8001a54: 6992 ldr r2, [r2, #24] handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, - 8001b1a: 9202 str r2, [sp, #8] - 8001b1c: 9301 str r3, [sp, #4] - 8001b1e: 9100 str r1, [sp, #0] - 8001b20: 683b ldr r3, [r7, #0] - 8001b22: 4632 mov r2, r6 - 8001b24: 4629 mov r1, r5 - 8001b26: 4620 mov r0, r4 - 8001b28: f000 f8ed bl 8001d06 - 8001b2c: 4603 mov r3, r0 - 8001b2e: 60fb str r3, [r7, #12] - 8001b30: e01c b.n 8001b6c + 8001a56: 9202 str r2, [sp, #8] + 8001a58: 9301 str r3, [sp, #4] + 8001a5a: 9100 str r1, [sp, #0] + 8001a5c: 683b ldr r3, [r7, #0] + 8001a5e: 4632 mov r2, r6 + 8001a60: 4629 mov r1, r5 + 8001a62: 4620 mov r0, r4 + 8001a64: f000 f8ed bl 8001c42 + 8001a68: 4603 mov r3, r0 + 8001a6a: 60fb str r3, [r7, #12] + 8001a6c: e01c b.n 8001aa8 } else { if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, - 8001b32: 687b ldr r3, [r7, #4] - 8001b34: 685c ldr r4, [r3, #4] - 8001b36: 687b ldr r3, [r7, #4] - 8001b38: 681d ldr r5, [r3, #0] + 8001a6e: 687b ldr r3, [r7, #4] + 8001a70: 685c ldr r4, [r3, #4] + 8001a72: 687b ldr r3, [r7, #4] + 8001a74: 681d ldr r5, [r3, #0] thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority), - 8001b3a: 687b ldr r3, [r7, #4] - 8001b3c: 691b ldr r3, [r3, #16] + 8001a76: 687b ldr r3, [r7, #4] + 8001a78: 691b ldr r3, [r3, #16] if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name, - 8001b3e: b29e uxth r6, r3 - 8001b40: 687b ldr r3, [r7, #4] - 8001b42: f9b3 3008 ldrsh.w r3, [r3, #8] - 8001b46: 4618 mov r0, r3 - 8001b48: f7ff ffaa bl 8001aa0 - 8001b4c: 4602 mov r2, r0 - 8001b4e: f107 030c add.w r3, r7, #12 - 8001b52: 9301 str r3, [sp, #4] - 8001b54: 9200 str r2, [sp, #0] - 8001b56: 683b ldr r3, [r7, #0] - 8001b58: 4632 mov r2, r6 - 8001b5a: 4629 mov r1, r5 - 8001b5c: 4620 mov r0, r4 - 8001b5e: f000 f92f bl 8001dc0 - 8001b62: 4603 mov r3, r0 - 8001b64: 2b01 cmp r3, #1 - 8001b66: d001 beq.n 8001b6c + 8001a7a: b29e uxth r6, r3 + 8001a7c: 687b ldr r3, [r7, #4] + 8001a7e: f9b3 3008 ldrsh.w r3, [r3, #8] + 8001a82: 4618 mov r0, r3 + 8001a84: f7ff ffaa bl 80019dc + 8001a88: 4602 mov r2, r0 + 8001a8a: f107 030c add.w r3, r7, #12 + 8001a8e: 9301 str r3, [sp, #4] + 8001a90: 9200 str r2, [sp, #0] + 8001a92: 683b ldr r3, [r7, #0] + 8001a94: 4632 mov r2, r6 + 8001a96: 4629 mov r1, r5 + 8001a98: 4620 mov r0, r4 + 8001a9a: f000 f92f bl 8001cfc + 8001a9e: 4603 mov r3, r0 + 8001aa0: 2b01 cmp r3, #1 + 8001aa2: d001 beq.n 8001aa8 &handle) != pdPASS) { return NULL; - 8001b68: 2300 movs r3, #0 - 8001b6a: e000 b.n 8001b6e + 8001aa4: 2300 movs r3, #0 + 8001aa6: e000 b.n 8001aaa &handle) != pdPASS) { return NULL; } #endif return handle; - 8001b6c: 68fb ldr r3, [r7, #12] + 8001aa8: 68fb ldr r3, [r7, #12] } - 8001b6e: 4618 mov r0, r3 - 8001b70: 3714 adds r7, #20 - 8001b72: 46bd mov sp, r7 - 8001b74: bdf0 pop {r4, r5, r6, r7, pc} + 8001aaa: 4618 mov r0, r3 + 8001aac: 3714 adds r7, #20 + 8001aae: 46bd mov sp, r7 + 8001ab0: bdf0 pop {r4, r5, r6, r7, pc} -08001b76 : +08001ab2 : * @brief Wait for Timeout (Time Delay) * @param millisec time delay value * @retval status code that indicates the execution status of the function. */ osStatus osDelay (uint32_t millisec) { - 8001b76: b580 push {r7, lr} - 8001b78: b084 sub sp, #16 - 8001b7a: af00 add r7, sp, #0 - 8001b7c: 6078 str r0, [r7, #4] + 8001ab2: b580 push {r7, lr} + 8001ab4: b084 sub sp, #16 + 8001ab6: af00 add r7, sp, #0 + 8001ab8: 6078 str r0, [r7, #4] #if INCLUDE_vTaskDelay TickType_t ticks = millisec / portTICK_PERIOD_MS; - 8001b7e: 687b ldr r3, [r7, #4] - 8001b80: 60fb str r3, [r7, #12] + 8001aba: 687b ldr r3, [r7, #4] + 8001abc: 60fb str r3, [r7, #12] vTaskDelay(ticks ? ticks : 1); /* Minimum delay = 1 tick */ - 8001b82: 68fb ldr r3, [r7, #12] - 8001b84: 2b00 cmp r3, #0 - 8001b86: d001 beq.n 8001b8c - 8001b88: 68fb ldr r3, [r7, #12] - 8001b8a: e000 b.n 8001b8e - 8001b8c: 2301 movs r3, #1 - 8001b8e: 4618 mov r0, r3 - 8001b90: f000 fa4c bl 800202c + 8001abe: 68fb ldr r3, [r7, #12] + 8001ac0: 2b00 cmp r3, #0 + 8001ac2: d001 beq.n 8001ac8 + 8001ac4: 68fb ldr r3, [r7, #12] + 8001ac6: e000 b.n 8001aca + 8001ac8: 2301 movs r3, #1 + 8001aca: 4618 mov r0, r3 + 8001acc: f000 fa4c bl 8001f68 return osOK; - 8001b94: 2300 movs r3, #0 + 8001ad0: 2300 movs r3, #0 #else (void) millisec; return osErrorResource; #endif } - 8001b96: 4618 mov r0, r3 - 8001b98: 3710 adds r7, #16 - 8001b9a: 46bd mov sp, r7 - 8001b9c: bd80 pop {r7, pc} + 8001ad2: 4618 mov r0, r3 + 8001ad4: 3710 adds r7, #16 + 8001ad6: 46bd mov sp, r7 + 8001ad8: bd80 pop {r7, pc} -08001b9e : +08001ada : /*----------------------------------------------------------- * PUBLIC LIST API documented in list.h *----------------------------------------------------------*/ void vListInitialise( List_t * const pxList ) { - 8001b9e: b480 push {r7} - 8001ba0: b083 sub sp, #12 - 8001ba2: af00 add r7, sp, #0 - 8001ba4: 6078 str r0, [r7, #4] + 8001ada: b480 push {r7} + 8001adc: b083 sub sp, #12 + 8001ade: af00 add r7, sp, #0 + 8001ae0: 6078 str r0, [r7, #4] /* The list structure contains a list item which is used to mark the end of the list. To initialise the list the list end is inserted as the only list entry. */ pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - 8001ba6: 687b ldr r3, [r7, #4] - 8001ba8: f103 0208 add.w r2, r3, #8 - 8001bac: 687b ldr r3, [r7, #4] - 8001bae: 605a str r2, [r3, #4] + 8001ae2: 687b ldr r3, [r7, #4] + 8001ae4: f103 0208 add.w r2, r3, #8 + 8001ae8: 687b ldr r3, [r7, #4] + 8001aea: 605a str r2, [r3, #4] /* The list end value is the highest possible value in the list to ensure it remains at the end of the list. */ pxList->xListEnd.xItemValue = portMAX_DELAY; - 8001bb0: 687b ldr r3, [r7, #4] - 8001bb2: f04f 32ff mov.w r2, #4294967295 - 8001bb6: 609a str r2, [r3, #8] + 8001aec: 687b ldr r3, [r7, #4] + 8001aee: f04f 32ff mov.w r2, #4294967295 + 8001af2: 609a str r2, [r3, #8] /* The list end next and previous pointers point to itself so we know when the list is empty. */ pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - 8001bb8: 687b ldr r3, [r7, #4] - 8001bba: f103 0208 add.w r2, r3, #8 - 8001bbe: 687b ldr r3, [r7, #4] - 8001bc0: 60da str r2, [r3, #12] + 8001af4: 687b ldr r3, [r7, #4] + 8001af6: f103 0208 add.w r2, r3, #8 + 8001afa: 687b ldr r3, [r7, #4] + 8001afc: 60da str r2, [r3, #12] pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */ - 8001bc2: 687b ldr r3, [r7, #4] - 8001bc4: f103 0208 add.w r2, r3, #8 - 8001bc8: 687b ldr r3, [r7, #4] - 8001bca: 611a str r2, [r3, #16] + 8001afe: 687b ldr r3, [r7, #4] + 8001b00: f103 0208 add.w r2, r3, #8 + 8001b04: 687b ldr r3, [r7, #4] + 8001b06: 611a str r2, [r3, #16] pxList->uxNumberOfItems = ( UBaseType_t ) 0U; - 8001bcc: 687b ldr r3, [r7, #4] - 8001bce: 2200 movs r2, #0 - 8001bd0: 601a str r2, [r3, #0] + 8001b08: 687b ldr r3, [r7, #4] + 8001b0a: 2200 movs r2, #0 + 8001b0c: 601a str r2, [r3, #0] /* Write known values into the list if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList ); listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList ); } - 8001bd2: bf00 nop - 8001bd4: 370c adds r7, #12 - 8001bd6: 46bd mov sp, r7 - 8001bd8: f85d 7b04 ldr.w r7, [sp], #4 - 8001bdc: 4770 bx lr + 8001b0e: bf00 nop + 8001b10: 370c adds r7, #12 + 8001b12: 46bd mov sp, r7 + 8001b14: f85d 7b04 ldr.w r7, [sp], #4 + 8001b18: 4770 bx lr -08001bde : +08001b1a : /*-----------------------------------------------------------*/ void vListInitialiseItem( ListItem_t * const pxItem ) { - 8001bde: b480 push {r7} - 8001be0: b083 sub sp, #12 - 8001be2: af00 add r7, sp, #0 - 8001be4: 6078 str r0, [r7, #4] + 8001b1a: b480 push {r7} + 8001b1c: b083 sub sp, #12 + 8001b1e: af00 add r7, sp, #0 + 8001b20: 6078 str r0, [r7, #4] /* Make sure the list item is not recorded as being on a list. */ pxItem->pxContainer = NULL; - 8001be6: 687b ldr r3, [r7, #4] - 8001be8: 2200 movs r2, #0 - 8001bea: 611a str r2, [r3, #16] + 8001b22: 687b ldr r3, [r7, #4] + 8001b24: 2200 movs r2, #0 + 8001b26: 611a str r2, [r3, #16] /* Write known values into the list item if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */ listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem ); } - 8001bec: bf00 nop - 8001bee: 370c adds r7, #12 - 8001bf0: 46bd mov sp, r7 - 8001bf2: f85d 7b04 ldr.w r7, [sp], #4 - 8001bf6: 4770 bx lr + 8001b28: bf00 nop + 8001b2a: 370c adds r7, #12 + 8001b2c: 46bd mov sp, r7 + 8001b2e: f85d 7b04 ldr.w r7, [sp], #4 + 8001b32: 4770 bx lr -08001bf8 : +08001b34 : /*-----------------------------------------------------------*/ void vListInsertEnd( List_t * const pxList, ListItem_t * const pxNewListItem ) { - 8001bf8: b480 push {r7} - 8001bfa: b085 sub sp, #20 - 8001bfc: af00 add r7, sp, #0 - 8001bfe: 6078 str r0, [r7, #4] - 8001c00: 6039 str r1, [r7, #0] + 8001b34: b480 push {r7} + 8001b36: b085 sub sp, #20 + 8001b38: af00 add r7, sp, #0 + 8001b3a: 6078 str r0, [r7, #4] + 8001b3c: 6039 str r1, [r7, #0] ListItem_t * const pxIndex = pxList->pxIndex; - 8001c02: 687b ldr r3, [r7, #4] - 8001c04: 685b ldr r3, [r3, #4] - 8001c06: 60fb str r3, [r7, #12] + 8001b3e: 687b ldr r3, [r7, #4] + 8001b40: 685b ldr r3, [r3, #4] + 8001b42: 60fb str r3, [r7, #12] listTEST_LIST_ITEM_INTEGRITY( pxNewListItem ); /* Insert a new list item into pxList, but rather than sort the list, makes the new list item the last item to be removed by a call to listGET_OWNER_OF_NEXT_ENTRY(). */ pxNewListItem->pxNext = pxIndex; - 8001c08: 683b ldr r3, [r7, #0] - 8001c0a: 68fa ldr r2, [r7, #12] - 8001c0c: 605a str r2, [r3, #4] + 8001b44: 683b ldr r3, [r7, #0] + 8001b46: 68fa ldr r2, [r7, #12] + 8001b48: 605a str r2, [r3, #4] pxNewListItem->pxPrevious = pxIndex->pxPrevious; - 8001c0e: 68fb ldr r3, [r7, #12] - 8001c10: 689a ldr r2, [r3, #8] - 8001c12: 683b ldr r3, [r7, #0] - 8001c14: 609a str r2, [r3, #8] + 8001b4a: 68fb ldr r3, [r7, #12] + 8001b4c: 689a ldr r2, [r3, #8] + 8001b4e: 683b ldr r3, [r7, #0] + 8001b50: 609a str r2, [r3, #8] /* Only used during decision coverage testing. */ mtCOVERAGE_TEST_DELAY(); pxIndex->pxPrevious->pxNext = pxNewListItem; - 8001c16: 68fb ldr r3, [r7, #12] - 8001c18: 689b ldr r3, [r3, #8] - 8001c1a: 683a ldr r2, [r7, #0] - 8001c1c: 605a str r2, [r3, #4] + 8001b52: 68fb ldr r3, [r7, #12] + 8001b54: 689b ldr r3, [r3, #8] + 8001b56: 683a ldr r2, [r7, #0] + 8001b58: 605a str r2, [r3, #4] pxIndex->pxPrevious = pxNewListItem; - 8001c1e: 68fb ldr r3, [r7, #12] - 8001c20: 683a ldr r2, [r7, #0] - 8001c22: 609a str r2, [r3, #8] + 8001b5a: 68fb ldr r3, [r7, #12] + 8001b5c: 683a ldr r2, [r7, #0] + 8001b5e: 609a str r2, [r3, #8] /* Remember which list the item is in. */ pxNewListItem->pxContainer = pxList; - 8001c24: 683b ldr r3, [r7, #0] - 8001c26: 687a ldr r2, [r7, #4] - 8001c28: 611a str r2, [r3, #16] + 8001b60: 683b ldr r3, [r7, #0] + 8001b62: 687a ldr r2, [r7, #4] + 8001b64: 611a str r2, [r3, #16] ( pxList->uxNumberOfItems )++; - 8001c2a: 687b ldr r3, [r7, #4] - 8001c2c: 681b ldr r3, [r3, #0] - 8001c2e: 1c5a adds r2, r3, #1 - 8001c30: 687b ldr r3, [r7, #4] - 8001c32: 601a str r2, [r3, #0] + 8001b66: 687b ldr r3, [r7, #4] + 8001b68: 681b ldr r3, [r3, #0] + 8001b6a: 1c5a adds r2, r3, #1 + 8001b6c: 687b ldr r3, [r7, #4] + 8001b6e: 601a str r2, [r3, #0] } - 8001c34: bf00 nop - 8001c36: 3714 adds r7, #20 - 8001c38: 46bd mov sp, r7 - 8001c3a: f85d 7b04 ldr.w r7, [sp], #4 - 8001c3e: 4770 bx lr + 8001b70: bf00 nop + 8001b72: 3714 adds r7, #20 + 8001b74: 46bd mov sp, r7 + 8001b76: f85d 7b04 ldr.w r7, [sp], #4 + 8001b7a: 4770 bx lr -08001c40 : +08001b7c : /*-----------------------------------------------------------*/ void vListInsert( List_t * const pxList, ListItem_t * const pxNewListItem ) { - 8001c40: b480 push {r7} - 8001c42: b085 sub sp, #20 - 8001c44: af00 add r7, sp, #0 - 8001c46: 6078 str r0, [r7, #4] - 8001c48: 6039 str r1, [r7, #0] + 8001b7c: b480 push {r7} + 8001b7e: b085 sub sp, #20 + 8001b80: af00 add r7, sp, #0 + 8001b82: 6078 str r0, [r7, #4] + 8001b84: 6039 str r1, [r7, #0] ListItem_t *pxIterator; const TickType_t xValueOfInsertion = pxNewListItem->xItemValue; - 8001c4a: 683b ldr r3, [r7, #0] - 8001c4c: 681b ldr r3, [r3, #0] - 8001c4e: 60bb str r3, [r7, #8] + 8001b86: 683b ldr r3, [r7, #0] + 8001b88: 681b ldr r3, [r3, #0] + 8001b8a: 60bb str r3, [r7, #8] new list item should be placed after it. This ensures that TCBs which are stored in ready lists (all of which have the same xItemValue value) get a share of the CPU. However, if the xItemValue is the same as the back marker the iteration loop below will not end. Therefore the value is checked first, and the algorithm slightly modified if necessary. */ if( xValueOfInsertion == portMAX_DELAY ) - 8001c50: 68bb ldr r3, [r7, #8] - 8001c52: f1b3 3fff cmp.w r3, #4294967295 - 8001c56: d103 bne.n 8001c60 + 8001b8c: 68bb ldr r3, [r7, #8] + 8001b8e: f1b3 3fff cmp.w r3, #4294967295 + 8001b92: d103 bne.n 8001b9c { pxIterator = pxList->xListEnd.pxPrevious; - 8001c58: 687b ldr r3, [r7, #4] - 8001c5a: 691b ldr r3, [r3, #16] - 8001c5c: 60fb str r3, [r7, #12] - 8001c5e: e00c b.n 8001c7a + 8001b94: 687b ldr r3, [r7, #4] + 8001b96: 691b ldr r3, [r3, #16] + 8001b98: 60fb str r3, [r7, #12] + 8001b9a: e00c b.n 8001bb6 4) Using a queue or semaphore before it has been initialised or before the scheduler has been started (are interrupts firing before vTaskStartScheduler() has been called?). **********************************************************************/ for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */ - 8001c60: 687b ldr r3, [r7, #4] - 8001c62: 3308 adds r3, #8 - 8001c64: 60fb str r3, [r7, #12] - 8001c66: e002 b.n 8001c6e - 8001c68: 68fb ldr r3, [r7, #12] - 8001c6a: 685b ldr r3, [r3, #4] - 8001c6c: 60fb str r3, [r7, #12] - 8001c6e: 68fb ldr r3, [r7, #12] - 8001c70: 685b ldr r3, [r3, #4] - 8001c72: 681b ldr r3, [r3, #0] - 8001c74: 68ba ldr r2, [r7, #8] - 8001c76: 429a cmp r2, r3 - 8001c78: d2f6 bcs.n 8001c68 + 8001b9c: 687b ldr r3, [r7, #4] + 8001b9e: 3308 adds r3, #8 + 8001ba0: 60fb str r3, [r7, #12] + 8001ba2: e002 b.n 8001baa + 8001ba4: 68fb ldr r3, [r7, #12] + 8001ba6: 685b ldr r3, [r3, #4] + 8001ba8: 60fb str r3, [r7, #12] + 8001baa: 68fb ldr r3, [r7, #12] + 8001bac: 685b ldr r3, [r3, #4] + 8001bae: 681b ldr r3, [r3, #0] + 8001bb0: 68ba ldr r2, [r7, #8] + 8001bb2: 429a cmp r2, r3 + 8001bb4: d2f6 bcs.n 8001ba4 /* There is nothing to do here, just iterating to the wanted insertion position. */ } } pxNewListItem->pxNext = pxIterator->pxNext; - 8001c7a: 68fb ldr r3, [r7, #12] - 8001c7c: 685a ldr r2, [r3, #4] - 8001c7e: 683b ldr r3, [r7, #0] - 8001c80: 605a str r2, [r3, #4] + 8001bb6: 68fb ldr r3, [r7, #12] + 8001bb8: 685a ldr r2, [r3, #4] + 8001bba: 683b ldr r3, [r7, #0] + 8001bbc: 605a str r2, [r3, #4] pxNewListItem->pxNext->pxPrevious = pxNewListItem; - 8001c82: 683b ldr r3, [r7, #0] - 8001c84: 685b ldr r3, [r3, #4] - 8001c86: 683a ldr r2, [r7, #0] - 8001c88: 609a str r2, [r3, #8] + 8001bbe: 683b ldr r3, [r7, #0] + 8001bc0: 685b ldr r3, [r3, #4] + 8001bc2: 683a ldr r2, [r7, #0] + 8001bc4: 609a str r2, [r3, #8] pxNewListItem->pxPrevious = pxIterator; - 8001c8a: 683b ldr r3, [r7, #0] - 8001c8c: 68fa ldr r2, [r7, #12] - 8001c8e: 609a str r2, [r3, #8] + 8001bc6: 683b ldr r3, [r7, #0] + 8001bc8: 68fa ldr r2, [r7, #12] + 8001bca: 609a str r2, [r3, #8] pxIterator->pxNext = pxNewListItem; - 8001c90: 68fb ldr r3, [r7, #12] - 8001c92: 683a ldr r2, [r7, #0] - 8001c94: 605a str r2, [r3, #4] + 8001bcc: 68fb ldr r3, [r7, #12] + 8001bce: 683a ldr r2, [r7, #0] + 8001bd0: 605a str r2, [r3, #4] /* Remember which list the item is in. This allows fast removal of the item later. */ pxNewListItem->pxContainer = pxList; - 8001c96: 683b ldr r3, [r7, #0] - 8001c98: 687a ldr r2, [r7, #4] - 8001c9a: 611a str r2, [r3, #16] + 8001bd2: 683b ldr r3, [r7, #0] + 8001bd4: 687a ldr r2, [r7, #4] + 8001bd6: 611a str r2, [r3, #16] ( pxList->uxNumberOfItems )++; - 8001c9c: 687b ldr r3, [r7, #4] - 8001c9e: 681b ldr r3, [r3, #0] - 8001ca0: 1c5a adds r2, r3, #1 - 8001ca2: 687b ldr r3, [r7, #4] - 8001ca4: 601a str r2, [r3, #0] + 8001bd8: 687b ldr r3, [r7, #4] + 8001bda: 681b ldr r3, [r3, #0] + 8001bdc: 1c5a adds r2, r3, #1 + 8001bde: 687b ldr r3, [r7, #4] + 8001be0: 601a str r2, [r3, #0] } - 8001ca6: bf00 nop - 8001ca8: 3714 adds r7, #20 - 8001caa: 46bd mov sp, r7 - 8001cac: f85d 7b04 ldr.w r7, [sp], #4 - 8001cb0: 4770 bx lr + 8001be2: bf00 nop + 8001be4: 3714 adds r7, #20 + 8001be6: 46bd mov sp, r7 + 8001be8: f85d 7b04 ldr.w r7, [sp], #4 + 8001bec: 4770 bx lr -08001cb2 : +08001bee : /*-----------------------------------------------------------*/ UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) { - 8001cb2: b480 push {r7} - 8001cb4: b085 sub sp, #20 - 8001cb6: af00 add r7, sp, #0 - 8001cb8: 6078 str r0, [r7, #4] + 8001bee: b480 push {r7} + 8001bf0: b085 sub sp, #20 + 8001bf2: af00 add r7, sp, #0 + 8001bf4: 6078 str r0, [r7, #4] /* The list item knows which list it is in. Obtain the list from the list item. */ List_t * const pxList = pxItemToRemove->pxContainer; - 8001cba: 687b ldr r3, [r7, #4] - 8001cbc: 691b ldr r3, [r3, #16] - 8001cbe: 60fb str r3, [r7, #12] + 8001bf6: 687b ldr r3, [r7, #4] + 8001bf8: 691b ldr r3, [r3, #16] + 8001bfa: 60fb str r3, [r7, #12] pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; - 8001cc0: 687b ldr r3, [r7, #4] - 8001cc2: 685b ldr r3, [r3, #4] - 8001cc4: 687a ldr r2, [r7, #4] - 8001cc6: 6892 ldr r2, [r2, #8] - 8001cc8: 609a str r2, [r3, #8] + 8001bfc: 687b ldr r3, [r7, #4] + 8001bfe: 685b ldr r3, [r3, #4] + 8001c00: 687a ldr r2, [r7, #4] + 8001c02: 6892 ldr r2, [r2, #8] + 8001c04: 609a str r2, [r3, #8] pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; - 8001cca: 687b ldr r3, [r7, #4] - 8001ccc: 689b ldr r3, [r3, #8] - 8001cce: 687a ldr r2, [r7, #4] - 8001cd0: 6852 ldr r2, [r2, #4] - 8001cd2: 605a str r2, [r3, #4] + 8001c06: 687b ldr r3, [r7, #4] + 8001c08: 689b ldr r3, [r3, #8] + 8001c0a: 687a ldr r2, [r7, #4] + 8001c0c: 6852 ldr r2, [r2, #4] + 8001c0e: 605a str r2, [r3, #4] /* Only used during decision coverage testing. */ mtCOVERAGE_TEST_DELAY(); /* Make sure the index is left pointing to a valid item. */ if( pxList->pxIndex == pxItemToRemove ) - 8001cd4: 68fb ldr r3, [r7, #12] - 8001cd6: 685b ldr r3, [r3, #4] - 8001cd8: 687a ldr r2, [r7, #4] - 8001cda: 429a cmp r2, r3 - 8001cdc: d103 bne.n 8001ce6 + 8001c10: 68fb ldr r3, [r7, #12] + 8001c12: 685b ldr r3, [r3, #4] + 8001c14: 687a ldr r2, [r7, #4] + 8001c16: 429a cmp r2, r3 + 8001c18: d103 bne.n 8001c22 { pxList->pxIndex = pxItemToRemove->pxPrevious; - 8001cde: 687b ldr r3, [r7, #4] - 8001ce0: 689a ldr r2, [r3, #8] - 8001ce2: 68fb ldr r3, [r7, #12] - 8001ce4: 605a str r2, [r3, #4] + 8001c1a: 687b ldr r3, [r7, #4] + 8001c1c: 689a ldr r2, [r3, #8] + 8001c1e: 68fb ldr r3, [r7, #12] + 8001c20: 605a str r2, [r3, #4] else { mtCOVERAGE_TEST_MARKER(); } pxItemToRemove->pxContainer = NULL; - 8001ce6: 687b ldr r3, [r7, #4] - 8001ce8: 2200 movs r2, #0 - 8001cea: 611a str r2, [r3, #16] + 8001c22: 687b ldr r3, [r7, #4] + 8001c24: 2200 movs r2, #0 + 8001c26: 611a str r2, [r3, #16] ( pxList->uxNumberOfItems )--; - 8001cec: 68fb ldr r3, [r7, #12] - 8001cee: 681b ldr r3, [r3, #0] - 8001cf0: 1e5a subs r2, r3, #1 - 8001cf2: 68fb ldr r3, [r7, #12] - 8001cf4: 601a str r2, [r3, #0] + 8001c28: 68fb ldr r3, [r7, #12] + 8001c2a: 681b ldr r3, [r3, #0] + 8001c2c: 1e5a subs r2, r3, #1 + 8001c2e: 68fb ldr r3, [r7, #12] + 8001c30: 601a str r2, [r3, #0] return pxList->uxNumberOfItems; - 8001cf6: 68fb ldr r3, [r7, #12] - 8001cf8: 681b ldr r3, [r3, #0] + 8001c32: 68fb ldr r3, [r7, #12] + 8001c34: 681b ldr r3, [r3, #0] } - 8001cfa: 4618 mov r0, r3 - 8001cfc: 3714 adds r7, #20 - 8001cfe: 46bd mov sp, r7 - 8001d00: f85d 7b04 ldr.w r7, [sp], #4 - 8001d04: 4770 bx lr + 8001c36: 4618 mov r0, r3 + 8001c38: 3714 adds r7, #20 + 8001c3a: 46bd mov sp, r7 + 8001c3c: f85d 7b04 ldr.w r7, [sp], #4 + 8001c40: 4770 bx lr -08001d06 : +08001c42 : const uint32_t ulStackDepth, void * const pvParameters, UBaseType_t uxPriority, StackType_t * const puxStackBuffer, StaticTask_t * const pxTaskBuffer ) { - 8001d06: b580 push {r7, lr} - 8001d08: b08e sub sp, #56 ; 0x38 - 8001d0a: af04 add r7, sp, #16 - 8001d0c: 60f8 str r0, [r7, #12] - 8001d0e: 60b9 str r1, [r7, #8] - 8001d10: 607a str r2, [r7, #4] - 8001d12: 603b str r3, [r7, #0] + 8001c42: b580 push {r7, lr} + 8001c44: b08e sub sp, #56 ; 0x38 + 8001c46: af04 add r7, sp, #16 + 8001c48: 60f8 str r0, [r7, #12] + 8001c4a: 60b9 str r1, [r7, #8] + 8001c4c: 607a str r2, [r7, #4] + 8001c4e: 603b str r3, [r7, #0] TCB_t *pxNewTCB; TaskHandle_t xReturn; configASSERT( puxStackBuffer != NULL ); - 8001d14: 6b7b ldr r3, [r7, #52] ; 0x34 - 8001d16: 2b00 cmp r3, #0 - 8001d18: d10a bne.n 8001d30 + 8001c50: 6b7b ldr r3, [r7, #52] ; 0x34 + 8001c52: 2b00 cmp r3, #0 + 8001c54: d10a bne.n 8001c6c portFORCE_INLINE static void vPortRaiseBASEPRI( void ) { uint32_t ulNewBASEPRI; __asm volatile - 8001d1a: f04f 0350 mov.w r3, #80 ; 0x50 - 8001d1e: f383 8811 msr BASEPRI, r3 - 8001d22: f3bf 8f6f isb sy - 8001d26: f3bf 8f4f dsb sy - 8001d2a: 623b str r3, [r7, #32] + 8001c56: f04f 0350 mov.w r3, #80 ; 0x50 + 8001c5a: f383 8811 msr BASEPRI, r3 + 8001c5e: f3bf 8f6f isb sy + 8001c62: f3bf 8f4f dsb sy + 8001c66: 623b str r3, [r7, #32] " msr basepri, %0 \n" \ " isb \n" \ " dsb \n" \ :"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory" ); } - 8001d2c: bf00 nop - 8001d2e: e7fe b.n 8001d2e + 8001c68: bf00 nop + 8001c6a: e7fe b.n 8001c6a configASSERT( pxTaskBuffer != NULL ); - 8001d30: 6bbb ldr r3, [r7, #56] ; 0x38 - 8001d32: 2b00 cmp r3, #0 - 8001d34: d10a bne.n 8001d4c + 8001c6c: 6bbb ldr r3, [r7, #56] ; 0x38 + 8001c6e: 2b00 cmp r3, #0 + 8001c70: d10a bne.n 8001c88 __asm volatile - 8001d36: f04f 0350 mov.w r3, #80 ; 0x50 - 8001d3a: f383 8811 msr BASEPRI, r3 - 8001d3e: f3bf 8f6f isb sy - 8001d42: f3bf 8f4f dsb sy - 8001d46: 61fb str r3, [r7, #28] + 8001c72: f04f 0350 mov.w r3, #80 ; 0x50 + 8001c76: f383 8811 msr BASEPRI, r3 + 8001c7a: f3bf 8f6f isb sy + 8001c7e: f3bf 8f4f dsb sy + 8001c82: 61fb str r3, [r7, #28] } - 8001d48: bf00 nop - 8001d4a: e7fe b.n 8001d4a + 8001c84: bf00 nop + 8001c86: e7fe b.n 8001c86 #if( configASSERT_DEFINED == 1 ) { /* Sanity check that the size of the structure used to declare a variable of type StaticTask_t equals the size of the real task structure. */ volatile size_t xSize = sizeof( StaticTask_t ); - 8001d4c: 2354 movs r3, #84 ; 0x54 - 8001d4e: 613b str r3, [r7, #16] + 8001c88: 2354 movs r3, #84 ; 0x54 + 8001c8a: 613b str r3, [r7, #16] configASSERT( xSize == sizeof( TCB_t ) ); - 8001d50: 693b ldr r3, [r7, #16] - 8001d52: 2b54 cmp r3, #84 ; 0x54 - 8001d54: d00a beq.n 8001d6c + 8001c8c: 693b ldr r3, [r7, #16] + 8001c8e: 2b54 cmp r3, #84 ; 0x54 + 8001c90: d00a beq.n 8001ca8 __asm volatile - 8001d56: f04f 0350 mov.w r3, #80 ; 0x50 - 8001d5a: f383 8811 msr BASEPRI, r3 - 8001d5e: f3bf 8f6f isb sy - 8001d62: f3bf 8f4f dsb sy - 8001d66: 61bb str r3, [r7, #24] + 8001c92: f04f 0350 mov.w r3, #80 ; 0x50 + 8001c96: f383 8811 msr BASEPRI, r3 + 8001c9a: f3bf 8f6f isb sy + 8001c9e: f3bf 8f4f dsb sy + 8001ca2: 61bb str r3, [r7, #24] } - 8001d68: bf00 nop - 8001d6a: e7fe b.n 8001d6a + 8001ca4: bf00 nop + 8001ca6: e7fe b.n 8001ca6 ( void ) xSize; /* Prevent lint warning when configASSERT() is not used. */ - 8001d6c: 693b ldr r3, [r7, #16] + 8001ca8: 693b ldr r3, [r7, #16] } #endif /* configASSERT_DEFINED */ if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) ) - 8001d6e: 6bbb ldr r3, [r7, #56] ; 0x38 - 8001d70: 2b00 cmp r3, #0 - 8001d72: d01e beq.n 8001db2 - 8001d74: 6b7b ldr r3, [r7, #52] ; 0x34 - 8001d76: 2b00 cmp r3, #0 - 8001d78: d01b beq.n 8001db2 + 8001caa: 6bbb ldr r3, [r7, #56] ; 0x38 + 8001cac: 2b00 cmp r3, #0 + 8001cae: d01e beq.n 8001cee + 8001cb0: 6b7b ldr r3, [r7, #52] ; 0x34 + 8001cb2: 2b00 cmp r3, #0 + 8001cb4: d01b beq.n 8001cee { /* The memory used for the task's TCB and stack are passed into this function - use them. */ pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */ - 8001d7a: 6bbb ldr r3, [r7, #56] ; 0x38 - 8001d7c: 627b str r3, [r7, #36] ; 0x24 + 8001cb6: 6bbb ldr r3, [r7, #56] ; 0x38 + 8001cb8: 627b str r3, [r7, #36] ; 0x24 pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer; - 8001d7e: 6a7b ldr r3, [r7, #36] ; 0x24 - 8001d80: 6b7a ldr r2, [r7, #52] ; 0x34 - 8001d82: 631a str r2, [r3, #48] ; 0x30 + 8001cba: 6a7b ldr r3, [r7, #36] ; 0x24 + 8001cbc: 6b7a ldr r2, [r7, #52] ; 0x34 + 8001cbe: 631a str r2, [r3, #48] ; 0x30 #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ { /* Tasks can be created statically or dynamically, so note this task was created statically in case the task is later deleted. */ pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB; - 8001d84: 6a7b ldr r3, [r7, #36] ; 0x24 - 8001d86: 2202 movs r2, #2 - 8001d88: f883 2051 strb.w r2, [r3, #81] ; 0x51 + 8001cc0: 6a7b ldr r3, [r7, #36] ; 0x24 + 8001cc2: 2202 movs r2, #2 + 8001cc4: f883 2051 strb.w r2, [r3, #81] ; 0x51 } #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, &xReturn, pxNewTCB, NULL ); - 8001d8c: 2300 movs r3, #0 - 8001d8e: 9303 str r3, [sp, #12] - 8001d90: 6a7b ldr r3, [r7, #36] ; 0x24 - 8001d92: 9302 str r3, [sp, #8] - 8001d94: f107 0314 add.w r3, r7, #20 - 8001d98: 9301 str r3, [sp, #4] - 8001d9a: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001d9c: 9300 str r3, [sp, #0] - 8001d9e: 683b ldr r3, [r7, #0] - 8001da0: 687a ldr r2, [r7, #4] - 8001da2: 68b9 ldr r1, [r7, #8] - 8001da4: 68f8 ldr r0, [r7, #12] - 8001da6: f000 f850 bl 8001e4a + 8001cc8: 2300 movs r3, #0 + 8001cca: 9303 str r3, [sp, #12] + 8001ccc: 6a7b ldr r3, [r7, #36] ; 0x24 + 8001cce: 9302 str r3, [sp, #8] + 8001cd0: f107 0314 add.w r3, r7, #20 + 8001cd4: 9301 str r3, [sp, #4] + 8001cd6: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001cd8: 9300 str r3, [sp, #0] + 8001cda: 683b ldr r3, [r7, #0] + 8001cdc: 687a ldr r2, [r7, #4] + 8001cde: 68b9 ldr r1, [r7, #8] + 8001ce0: 68f8 ldr r0, [r7, #12] + 8001ce2: f000 f850 bl 8001d86 prvAddNewTaskToReadyList( pxNewTCB ); - 8001daa: 6a78 ldr r0, [r7, #36] ; 0x24 - 8001dac: f000 f8d4 bl 8001f58 - 8001db0: e001 b.n 8001db6 + 8001ce6: 6a78 ldr r0, [r7, #36] ; 0x24 + 8001ce8: f000 f8d4 bl 8001e94 + 8001cec: e001 b.n 8001cf2 } else { xReturn = NULL; - 8001db2: 2300 movs r3, #0 - 8001db4: 617b str r3, [r7, #20] + 8001cee: 2300 movs r3, #0 + 8001cf0: 617b str r3, [r7, #20] } return xReturn; - 8001db6: 697b ldr r3, [r7, #20] + 8001cf2: 697b ldr r3, [r7, #20] } - 8001db8: 4618 mov r0, r3 - 8001dba: 3728 adds r7, #40 ; 0x28 - 8001dbc: 46bd mov sp, r7 - 8001dbe: bd80 pop {r7, pc} + 8001cf4: 4618 mov r0, r3 + 8001cf6: 3728 adds r7, #40 ; 0x28 + 8001cf8: 46bd mov sp, r7 + 8001cfa: bd80 pop {r7, pc} -08001dc0 : +08001cfc : const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */ const configSTACK_DEPTH_TYPE usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ) { - 8001dc0: b580 push {r7, lr} - 8001dc2: b08c sub sp, #48 ; 0x30 - 8001dc4: af04 add r7, sp, #16 - 8001dc6: 60f8 str r0, [r7, #12] - 8001dc8: 60b9 str r1, [r7, #8] - 8001dca: 603b str r3, [r7, #0] - 8001dcc: 4613 mov r3, r2 - 8001dce: 80fb strh r3, [r7, #6] + 8001cfc: b580 push {r7, lr} + 8001cfe: b08c sub sp, #48 ; 0x30 + 8001d00: af04 add r7, sp, #16 + 8001d02: 60f8 str r0, [r7, #12] + 8001d04: 60b9 str r1, [r7, #8] + 8001d06: 603b str r3, [r7, #0] + 8001d08: 4613 mov r3, r2 + 8001d0a: 80fb strh r3, [r7, #6] #else /* portSTACK_GROWTH */ { StackType_t *pxStack; /* Allocate space for the stack used by the task being created. */ pxStack = pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */ - 8001dd0: 88fb ldrh r3, [r7, #6] - 8001dd2: 009b lsls r3, r3, #2 - 8001dd4: 4618 mov r0, r3 - 8001dd6: f000 fee7 bl 8002ba8 - 8001dda: 6178 str r0, [r7, #20] + 8001d0c: 88fb ldrh r3, [r7, #6] + 8001d0e: 009b lsls r3, r3, #2 + 8001d10: 4618 mov r0, r3 + 8001d12: f000 fee1 bl 8002ad8 + 8001d16: 6178 str r0, [r7, #20] if( pxStack != NULL ) - 8001ddc: 697b ldr r3, [r7, #20] - 8001dde: 2b00 cmp r3, #0 - 8001de0: d00e beq.n 8001e00 + 8001d18: 697b ldr r3, [r7, #20] + 8001d1a: 2b00 cmp r3, #0 + 8001d1c: d00e beq.n 8001d3c { /* Allocate space for the TCB. */ pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */ - 8001de2: 2054 movs r0, #84 ; 0x54 - 8001de4: f000 fee0 bl 8002ba8 - 8001de8: 61f8 str r0, [r7, #28] + 8001d1e: 2054 movs r0, #84 ; 0x54 + 8001d20: f000 feda bl 8002ad8 + 8001d24: 61f8 str r0, [r7, #28] if( pxNewTCB != NULL ) - 8001dea: 69fb ldr r3, [r7, #28] - 8001dec: 2b00 cmp r3, #0 - 8001dee: d003 beq.n 8001df8 + 8001d26: 69fb ldr r3, [r7, #28] + 8001d28: 2b00 cmp r3, #0 + 8001d2a: d003 beq.n 8001d34 { /* Store the stack location in the TCB. */ pxNewTCB->pxStack = pxStack; - 8001df0: 69fb ldr r3, [r7, #28] - 8001df2: 697a ldr r2, [r7, #20] - 8001df4: 631a str r2, [r3, #48] ; 0x30 - 8001df6: e005 b.n 8001e04 + 8001d2c: 69fb ldr r3, [r7, #28] + 8001d2e: 697a ldr r2, [r7, #20] + 8001d30: 631a str r2, [r3, #48] ; 0x30 + 8001d32: e005 b.n 8001d40 } else { /* The stack cannot be used as the TCB was not created. Free it again. */ vPortFree( pxStack ); - 8001df8: 6978 ldr r0, [r7, #20] - 8001dfa: f000 ffa1 bl 8002d40 - 8001dfe: e001 b.n 8001e04 + 8001d34: 6978 ldr r0, [r7, #20] + 8001d36: f000 ff9b bl 8002c70 + 8001d3a: e001 b.n 8001d40 } } else { pxNewTCB = NULL; - 8001e00: 2300 movs r3, #0 - 8001e02: 61fb str r3, [r7, #28] + 8001d3c: 2300 movs r3, #0 + 8001d3e: 61fb str r3, [r7, #28] } } #endif /* portSTACK_GROWTH */ if( pxNewTCB != NULL ) - 8001e04: 69fb ldr r3, [r7, #28] - 8001e06: 2b00 cmp r3, #0 - 8001e08: d017 beq.n 8001e3a + 8001d40: 69fb ldr r3, [r7, #28] + 8001d42: 2b00 cmp r3, #0 + 8001d44: d017 beq.n 8001d76 { #if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */ { /* Tasks can be created statically or dynamically, so note this task was created dynamically in case it is later deleted. */ pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB; - 8001e0a: 69fb ldr r3, [r7, #28] - 8001e0c: 2200 movs r2, #0 - 8001e0e: f883 2051 strb.w r2, [r3, #81] ; 0x51 + 8001d46: 69fb ldr r3, [r7, #28] + 8001d48: 2200 movs r2, #0 + 8001d4a: f883 2051 strb.w r2, [r3, #81] ; 0x51 } #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */ prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL ); - 8001e12: 88fa ldrh r2, [r7, #6] - 8001e14: 2300 movs r3, #0 - 8001e16: 9303 str r3, [sp, #12] - 8001e18: 69fb ldr r3, [r7, #28] - 8001e1a: 9302 str r3, [sp, #8] - 8001e1c: 6afb ldr r3, [r7, #44] ; 0x2c - 8001e1e: 9301 str r3, [sp, #4] - 8001e20: 6abb ldr r3, [r7, #40] ; 0x28 - 8001e22: 9300 str r3, [sp, #0] - 8001e24: 683b ldr r3, [r7, #0] - 8001e26: 68b9 ldr r1, [r7, #8] - 8001e28: 68f8 ldr r0, [r7, #12] - 8001e2a: f000 f80e bl 8001e4a + 8001d4e: 88fa ldrh r2, [r7, #6] + 8001d50: 2300 movs r3, #0 + 8001d52: 9303 str r3, [sp, #12] + 8001d54: 69fb ldr r3, [r7, #28] + 8001d56: 9302 str r3, [sp, #8] + 8001d58: 6afb ldr r3, [r7, #44] ; 0x2c + 8001d5a: 9301 str r3, [sp, #4] + 8001d5c: 6abb ldr r3, [r7, #40] ; 0x28 + 8001d5e: 9300 str r3, [sp, #0] + 8001d60: 683b ldr r3, [r7, #0] + 8001d62: 68b9 ldr r1, [r7, #8] + 8001d64: 68f8 ldr r0, [r7, #12] + 8001d66: f000 f80e bl 8001d86 prvAddNewTaskToReadyList( pxNewTCB ); - 8001e2e: 69f8 ldr r0, [r7, #28] - 8001e30: f000 f892 bl 8001f58 + 8001d6a: 69f8 ldr r0, [r7, #28] + 8001d6c: f000 f892 bl 8001e94 xReturn = pdPASS; - 8001e34: 2301 movs r3, #1 - 8001e36: 61bb str r3, [r7, #24] - 8001e38: e002 b.n 8001e40 + 8001d70: 2301 movs r3, #1 + 8001d72: 61bb str r3, [r7, #24] + 8001d74: e002 b.n 8001d7c } else { xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; - 8001e3a: f04f 33ff mov.w r3, #4294967295 - 8001e3e: 61bb str r3, [r7, #24] + 8001d76: f04f 33ff mov.w r3, #4294967295 + 8001d7a: 61bb str r3, [r7, #24] } return xReturn; - 8001e40: 69bb ldr r3, [r7, #24] + 8001d7c: 69bb ldr r3, [r7, #24] } - 8001e42: 4618 mov r0, r3 - 8001e44: 3720 adds r7, #32 - 8001e46: 46bd mov sp, r7 - 8001e48: bd80 pop {r7, pc} + 8001d7e: 4618 mov r0, r3 + 8001d80: 3720 adds r7, #32 + 8001d82: 46bd mov sp, r7 + 8001d84: bd80 pop {r7, pc} -08001e4a : +08001d86 : void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask, TCB_t *pxNewTCB, const MemoryRegion_t * const xRegions ) { - 8001e4a: b580 push {r7, lr} - 8001e4c: b088 sub sp, #32 - 8001e4e: af00 add r7, sp, #0 - 8001e50: 60f8 str r0, [r7, #12] - 8001e52: 60b9 str r1, [r7, #8] - 8001e54: 607a str r2, [r7, #4] - 8001e56: 603b str r3, [r7, #0] + 8001d86: b580 push {r7, lr} + 8001d88: b088 sub sp, #32 + 8001d8a: af00 add r7, sp, #0 + 8001d8c: 60f8 str r0, [r7, #12] + 8001d8e: 60b9 str r1, [r7, #8] + 8001d90: 607a str r2, [r7, #4] + 8001d92: 603b str r3, [r7, #0] grows from high memory to low (as per the 80x86) or vice versa. portSTACK_GROWTH is used to make the result positive or negative as required by the port. */ #if( portSTACK_GROWTH < 0 ) { pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] ); - 8001e58: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001e5a: 6b1a ldr r2, [r3, #48] ; 0x30 - 8001e5c: 687b ldr r3, [r7, #4] - 8001e5e: f103 4380 add.w r3, r3, #1073741824 ; 0x40000000 - 8001e62: 3b01 subs r3, #1 - 8001e64: 009b lsls r3, r3, #2 - 8001e66: 4413 add r3, r2 - 8001e68: 61bb str r3, [r7, #24] + 8001d94: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001d96: 6b1a ldr r2, [r3, #48] ; 0x30 + 8001d98: 687b ldr r3, [r7, #4] + 8001d9a: f103 4380 add.w r3, r3, #1073741824 ; 0x40000000 + 8001d9e: 3b01 subs r3, #1 + 8001da0: 009b lsls r3, r3, #2 + 8001da2: 4413 add r3, r2 + 8001da4: 61bb str r3, [r7, #24] pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */ - 8001e6a: 69bb ldr r3, [r7, #24] - 8001e6c: f023 0307 bic.w r3, r3, #7 - 8001e70: 61bb str r3, [r7, #24] + 8001da6: 69bb ldr r3, [r7, #24] + 8001da8: f023 0307 bic.w r3, r3, #7 + 8001dac: 61bb str r3, [r7, #24] /* Check the alignment of the calculated top of stack is correct. */ configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); - 8001e72: 69bb ldr r3, [r7, #24] - 8001e74: f003 0307 and.w r3, r3, #7 - 8001e78: 2b00 cmp r3, #0 - 8001e7a: d00a beq.n 8001e92 + 8001dae: 69bb ldr r3, [r7, #24] + 8001db0: f003 0307 and.w r3, r3, #7 + 8001db4: 2b00 cmp r3, #0 + 8001db6: d00a beq.n 8001dce __asm volatile - 8001e7c: f04f 0350 mov.w r3, #80 ; 0x50 - 8001e80: f383 8811 msr BASEPRI, r3 - 8001e84: f3bf 8f6f isb sy - 8001e88: f3bf 8f4f dsb sy - 8001e8c: 617b str r3, [r7, #20] + 8001db8: f04f 0350 mov.w r3, #80 ; 0x50 + 8001dbc: f383 8811 msr BASEPRI, r3 + 8001dc0: f3bf 8f6f isb sy + 8001dc4: f3bf 8f4f dsb sy + 8001dc8: 617b str r3, [r7, #20] } - 8001e8e: bf00 nop - 8001e90: e7fe b.n 8001e90 + 8001dca: bf00 nop + 8001dcc: e7fe b.n 8001dcc pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); } #endif /* portSTACK_GROWTH */ /* Store the task name in the TCB. */ if( pcName != NULL ) - 8001e92: 68bb ldr r3, [r7, #8] - 8001e94: 2b00 cmp r3, #0 - 8001e96: d01f beq.n 8001ed8 + 8001dce: 68bb ldr r3, [r7, #8] + 8001dd0: 2b00 cmp r3, #0 + 8001dd2: d01f beq.n 8001e14 { for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) - 8001e98: 2300 movs r3, #0 - 8001e9a: 61fb str r3, [r7, #28] - 8001e9c: e012 b.n 8001ec4 + 8001dd4: 2300 movs r3, #0 + 8001dd6: 61fb str r3, [r7, #28] + 8001dd8: e012 b.n 8001e00 { pxNewTCB->pcTaskName[ x ] = pcName[ x ]; - 8001e9e: 68ba ldr r2, [r7, #8] - 8001ea0: 69fb ldr r3, [r7, #28] - 8001ea2: 4413 add r3, r2 - 8001ea4: 7819 ldrb r1, [r3, #0] - 8001ea6: 6b3a ldr r2, [r7, #48] ; 0x30 - 8001ea8: 69fb ldr r3, [r7, #28] - 8001eaa: 4413 add r3, r2 - 8001eac: 3334 adds r3, #52 ; 0x34 - 8001eae: 460a mov r2, r1 - 8001eb0: 701a strb r2, [r3, #0] + 8001dda: 68ba ldr r2, [r7, #8] + 8001ddc: 69fb ldr r3, [r7, #28] + 8001dde: 4413 add r3, r2 + 8001de0: 7819 ldrb r1, [r3, #0] + 8001de2: 6b3a ldr r2, [r7, #48] ; 0x30 + 8001de4: 69fb ldr r3, [r7, #28] + 8001de6: 4413 add r3, r2 + 8001de8: 3334 adds r3, #52 ; 0x34 + 8001dea: 460a mov r2, r1 + 8001dec: 701a strb r2, [r3, #0] /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than configMAX_TASK_NAME_LEN characters just in case the memory after the string is not accessible (extremely unlikely). */ if( pcName[ x ] == ( char ) 0x00 ) - 8001eb2: 68ba ldr r2, [r7, #8] - 8001eb4: 69fb ldr r3, [r7, #28] - 8001eb6: 4413 add r3, r2 - 8001eb8: 781b ldrb r3, [r3, #0] - 8001eba: 2b00 cmp r3, #0 - 8001ebc: d006 beq.n 8001ecc + 8001dee: 68ba ldr r2, [r7, #8] + 8001df0: 69fb ldr r3, [r7, #28] + 8001df2: 4413 add r3, r2 + 8001df4: 781b ldrb r3, [r3, #0] + 8001df6: 2b00 cmp r3, #0 + 8001df8: d006 beq.n 8001e08 for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) - 8001ebe: 69fb ldr r3, [r7, #28] - 8001ec0: 3301 adds r3, #1 - 8001ec2: 61fb str r3, [r7, #28] - 8001ec4: 69fb ldr r3, [r7, #28] - 8001ec6: 2b0f cmp r3, #15 - 8001ec8: d9e9 bls.n 8001e9e - 8001eca: e000 b.n 8001ece + 8001dfa: 69fb ldr r3, [r7, #28] + 8001dfc: 3301 adds r3, #1 + 8001dfe: 61fb str r3, [r7, #28] + 8001e00: 69fb ldr r3, [r7, #28] + 8001e02: 2b0f cmp r3, #15 + 8001e04: d9e9 bls.n 8001dda + 8001e06: e000 b.n 8001e0a { break; - 8001ecc: bf00 nop + 8001e08: bf00 nop } } /* Ensure the name string is terminated in the case that the string length was greater or equal to configMAX_TASK_NAME_LEN. */ pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = '\0'; - 8001ece: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001ed0: 2200 movs r2, #0 - 8001ed2: f883 2043 strb.w r2, [r3, #67] ; 0x43 - 8001ed6: e003 b.n 8001ee0 + 8001e0a: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e0c: 2200 movs r2, #0 + 8001e0e: f883 2043 strb.w r2, [r3, #67] ; 0x43 + 8001e12: e003 b.n 8001e1c } else { /* The task has not been given a name, so just ensure there is a NULL terminator when it is read out. */ pxNewTCB->pcTaskName[ 0 ] = 0x00; - 8001ed8: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001eda: 2200 movs r2, #0 - 8001edc: f883 2034 strb.w r2, [r3, #52] ; 0x34 + 8001e14: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e16: 2200 movs r2, #0 + 8001e18: f883 2034 strb.w r2, [r3, #52] ; 0x34 } /* This is used as an array index so must ensure it's not too large. First remove the privilege bit if one is present. */ if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) - 8001ee0: 6abb ldr r3, [r7, #40] ; 0x28 - 8001ee2: 2b06 cmp r3, #6 - 8001ee4: d901 bls.n 8001eea + 8001e1c: 6abb ldr r3, [r7, #40] ; 0x28 + 8001e1e: 2b06 cmp r3, #6 + 8001e20: d901 bls.n 8001e26 { uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U; - 8001ee6: 2306 movs r3, #6 - 8001ee8: 62bb str r3, [r7, #40] ; 0x28 + 8001e22: 2306 movs r3, #6 + 8001e24: 62bb str r3, [r7, #40] ; 0x28 else { mtCOVERAGE_TEST_MARKER(); } pxNewTCB->uxPriority = uxPriority; - 8001eea: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001eec: 6aba ldr r2, [r7, #40] ; 0x28 - 8001eee: 62da str r2, [r3, #44] ; 0x2c + 8001e26: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e28: 6aba ldr r2, [r7, #40] ; 0x28 + 8001e2a: 62da str r2, [r3, #44] ; 0x2c #if ( configUSE_MUTEXES == 1 ) { pxNewTCB->uxBasePriority = uxPriority; - 8001ef0: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001ef2: 6aba ldr r2, [r7, #40] ; 0x28 - 8001ef4: 645a str r2, [r3, #68] ; 0x44 + 8001e2c: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e2e: 6aba ldr r2, [r7, #40] ; 0x28 + 8001e30: 645a str r2, [r3, #68] ; 0x44 pxNewTCB->uxMutexesHeld = 0; - 8001ef6: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001ef8: 2200 movs r2, #0 - 8001efa: 649a str r2, [r3, #72] ; 0x48 + 8001e32: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e34: 2200 movs r2, #0 + 8001e36: 649a str r2, [r3, #72] ; 0x48 } #endif /* configUSE_MUTEXES */ vListInitialiseItem( &( pxNewTCB->xStateListItem ) ); - 8001efc: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001efe: 3304 adds r3, #4 - 8001f00: 4618 mov r0, r3 - 8001f02: f7ff fe6c bl 8001bde + 8001e38: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e3a: 3304 adds r3, #4 + 8001e3c: 4618 mov r0, r3 + 8001e3e: f7ff fe6c bl 8001b1a vListInitialiseItem( &( pxNewTCB->xEventListItem ) ); - 8001f06: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001f08: 3318 adds r3, #24 - 8001f0a: 4618 mov r0, r3 - 8001f0c: f7ff fe67 bl 8001bde + 8001e42: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e44: 3318 adds r3, #24 + 8001e46: 4618 mov r0, r3 + 8001e48: f7ff fe67 bl 8001b1a /* Set the pxNewTCB as a link back from the ListItem_t. This is so we can get back to the containing TCB from a generic item in a list. */ listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB ); - 8001f10: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001f12: 6b3a ldr r2, [r7, #48] ; 0x30 - 8001f14: 611a str r2, [r3, #16] + 8001e4c: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e4e: 6b3a ldr r2, [r7, #48] ; 0x30 + 8001e50: 611a str r2, [r3, #16] /* Event lists are always in priority order. */ listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - 8001f16: 6abb ldr r3, [r7, #40] ; 0x28 - 8001f18: f1c3 0207 rsb r2, r3, #7 - 8001f1c: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001f1e: 619a str r2, [r3, #24] + 8001e52: 6abb ldr r3, [r7, #40] ; 0x28 + 8001e54: f1c3 0207 rsb r2, r3, #7 + 8001e58: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e5a: 619a str r2, [r3, #24] listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB ); - 8001f20: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001f22: 6b3a ldr r2, [r7, #48] ; 0x30 - 8001f24: 625a str r2, [r3, #36] ; 0x24 + 8001e5c: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e5e: 6b3a ldr r2, [r7, #48] ; 0x30 + 8001e60: 625a str r2, [r3, #36] ; 0x24 } #endif #if ( configUSE_TASK_NOTIFICATIONS == 1 ) { pxNewTCB->ulNotifiedValue = 0; - 8001f26: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001f28: 2200 movs r2, #0 - 8001f2a: 64da str r2, [r3, #76] ; 0x4c + 8001e62: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e64: 2200 movs r2, #0 + 8001e66: 64da str r2, [r3, #76] ; 0x4c pxNewTCB->ucNotifyState = taskNOT_WAITING_NOTIFICATION; - 8001f2c: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001f2e: 2200 movs r2, #0 - 8001f30: f883 2050 strb.w r2, [r3, #80] ; 0x50 + 8001e68: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e6a: 2200 movs r2, #0 + 8001e6c: f883 2050 strb.w r2, [r3, #80] ; 0x50 } #endif /* portSTACK_GROWTH */ } #else /* portHAS_STACK_OVERFLOW_CHECKING */ { pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); - 8001f34: 683a ldr r2, [r7, #0] - 8001f36: 68f9 ldr r1, [r7, #12] - 8001f38: 69b8 ldr r0, [r7, #24] - 8001f3a: f000 fc23 bl 8002784 - 8001f3e: 4602 mov r2, r0 - 8001f40: 6b3b ldr r3, [r7, #48] ; 0x30 - 8001f42: 601a str r2, [r3, #0] + 8001e70: 683a ldr r2, [r7, #0] + 8001e72: 68f9 ldr r1, [r7, #12] + 8001e74: 69b8 ldr r0, [r7, #24] + 8001e76: f000 fc23 bl 80026c0 + 8001e7a: 4602 mov r2, r0 + 8001e7c: 6b3b ldr r3, [r7, #48] ; 0x30 + 8001e7e: 601a str r2, [r3, #0] } #endif /* portHAS_STACK_OVERFLOW_CHECKING */ } #endif /* portUSING_MPU_WRAPPERS */ if( pxCreatedTask != NULL ) - 8001f44: 6afb ldr r3, [r7, #44] ; 0x2c - 8001f46: 2b00 cmp r3, #0 - 8001f48: d002 beq.n 8001f50 + 8001e80: 6afb ldr r3, [r7, #44] ; 0x2c + 8001e82: 2b00 cmp r3, #0 + 8001e84: d002 beq.n 8001e8c { /* Pass the handle out in an anonymous way. The handle can be used to change the created task's priority, delete the created task, etc.*/ *pxCreatedTask = ( TaskHandle_t ) pxNewTCB; - 8001f4a: 6afb ldr r3, [r7, #44] ; 0x2c - 8001f4c: 6b3a ldr r2, [r7, #48] ; 0x30 - 8001f4e: 601a str r2, [r3, #0] + 8001e86: 6afb ldr r3, [r7, #44] ; 0x2c + 8001e88: 6b3a ldr r2, [r7, #48] ; 0x30 + 8001e8a: 601a str r2, [r3, #0] } else { mtCOVERAGE_TEST_MARKER(); } } - 8001f50: bf00 nop - 8001f52: 3720 adds r7, #32 - 8001f54: 46bd mov sp, r7 - 8001f56: bd80 pop {r7, pc} + 8001e8c: bf00 nop + 8001e8e: 3720 adds r7, #32 + 8001e90: 46bd mov sp, r7 + 8001e92: bd80 pop {r7, pc} -08001f58 : +08001e94 : /*-----------------------------------------------------------*/ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) { - 8001f58: b580 push {r7, lr} - 8001f5a: b082 sub sp, #8 - 8001f5c: af00 add r7, sp, #0 - 8001f5e: 6078 str r0, [r7, #4] + 8001e94: b580 push {r7, lr} + 8001e96: b082 sub sp, #8 + 8001e98: af00 add r7, sp, #0 + 8001e9a: 6078 str r0, [r7, #4] /* Ensure interrupts don't access the task lists while the lists are being updated. */ taskENTER_CRITICAL(); - 8001f60: f000 fd40 bl 80029e4 + 8001e9c: f000 fd3a bl 8002914 { uxCurrentNumberOfTasks++; - 8001f64: 4b2a ldr r3, [pc, #168] ; (8002010 ) - 8001f66: 681b ldr r3, [r3, #0] - 8001f68: 3301 adds r3, #1 - 8001f6a: 4a29 ldr r2, [pc, #164] ; (8002010 ) - 8001f6c: 6013 str r3, [r2, #0] + 8001ea0: 4b2a ldr r3, [pc, #168] ; (8001f4c ) + 8001ea2: 681b ldr r3, [r3, #0] + 8001ea4: 3301 adds r3, #1 + 8001ea6: 4a29 ldr r2, [pc, #164] ; (8001f4c ) + 8001ea8: 6013 str r3, [r2, #0] if( pxCurrentTCB == NULL ) - 8001f6e: 4b29 ldr r3, [pc, #164] ; (8002014 ) - 8001f70: 681b ldr r3, [r3, #0] - 8001f72: 2b00 cmp r3, #0 - 8001f74: d109 bne.n 8001f8a + 8001eaa: 4b29 ldr r3, [pc, #164] ; (8001f50 ) + 8001eac: 681b ldr r3, [r3, #0] + 8001eae: 2b00 cmp r3, #0 + 8001eb0: d109 bne.n 8001ec6 { /* There are no other tasks, or all the other tasks are in the suspended state - make this the current task. */ pxCurrentTCB = pxNewTCB; - 8001f76: 4a27 ldr r2, [pc, #156] ; (8002014 ) - 8001f78: 687b ldr r3, [r7, #4] - 8001f7a: 6013 str r3, [r2, #0] + 8001eb2: 4a27 ldr r2, [pc, #156] ; (8001f50 ) + 8001eb4: 687b ldr r3, [r7, #4] + 8001eb6: 6013 str r3, [r2, #0] if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 ) - 8001f7c: 4b24 ldr r3, [pc, #144] ; (8002010 ) - 8001f7e: 681b ldr r3, [r3, #0] - 8001f80: 2b01 cmp r3, #1 - 8001f82: d110 bne.n 8001fa6 + 8001eb8: 4b24 ldr r3, [pc, #144] ; (8001f4c ) + 8001eba: 681b ldr r3, [r3, #0] + 8001ebc: 2b01 cmp r3, #1 + 8001ebe: d110 bne.n 8001ee2 { /* This is the first task to be created so do the preliminary initialisation required. We will not recover if this call fails, but we will report the failure. */ prvInitialiseTaskLists(); - 8001f84: f000 fabc bl 8002500 - 8001f88: e00d b.n 8001fa6 + 8001ec0: f000 fabc bl 800243c + 8001ec4: e00d b.n 8001ee2 else { /* If the scheduler is not already running, make this task the current task if it is the highest priority task to be created so far. */ if( xSchedulerRunning == pdFALSE ) - 8001f8a: 4b23 ldr r3, [pc, #140] ; (8002018 ) - 8001f8c: 681b ldr r3, [r3, #0] - 8001f8e: 2b00 cmp r3, #0 - 8001f90: d109 bne.n 8001fa6 + 8001ec6: 4b23 ldr r3, [pc, #140] ; (8001f54 ) + 8001ec8: 681b ldr r3, [r3, #0] + 8001eca: 2b00 cmp r3, #0 + 8001ecc: d109 bne.n 8001ee2 { if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) - 8001f92: 4b20 ldr r3, [pc, #128] ; (8002014 ) - 8001f94: 681b ldr r3, [r3, #0] - 8001f96: 6ada ldr r2, [r3, #44] ; 0x2c - 8001f98: 687b ldr r3, [r7, #4] - 8001f9a: 6adb ldr r3, [r3, #44] ; 0x2c - 8001f9c: 429a cmp r2, r3 - 8001f9e: d802 bhi.n 8001fa6 + 8001ece: 4b20 ldr r3, [pc, #128] ; (8001f50 ) + 8001ed0: 681b ldr r3, [r3, #0] + 8001ed2: 6ada ldr r2, [r3, #44] ; 0x2c + 8001ed4: 687b ldr r3, [r7, #4] + 8001ed6: 6adb ldr r3, [r3, #44] ; 0x2c + 8001ed8: 429a cmp r2, r3 + 8001eda: d802 bhi.n 8001ee2 { pxCurrentTCB = pxNewTCB; - 8001fa0: 4a1c ldr r2, [pc, #112] ; (8002014 ) - 8001fa2: 687b ldr r3, [r7, #4] - 8001fa4: 6013 str r3, [r2, #0] + 8001edc: 4a1c ldr r2, [pc, #112] ; (8001f50 ) + 8001ede: 687b ldr r3, [r7, #4] + 8001ee0: 6013 str r3, [r2, #0] { mtCOVERAGE_TEST_MARKER(); } } uxTaskNumber++; - 8001fa6: 4b1d ldr r3, [pc, #116] ; (800201c ) - 8001fa8: 681b ldr r3, [r3, #0] - 8001faa: 3301 adds r3, #1 - 8001fac: 4a1b ldr r2, [pc, #108] ; (800201c ) - 8001fae: 6013 str r3, [r2, #0] + 8001ee2: 4b1d ldr r3, [pc, #116] ; (8001f58 ) + 8001ee4: 681b ldr r3, [r3, #0] + 8001ee6: 3301 adds r3, #1 + 8001ee8: 4a1b ldr r2, [pc, #108] ; (8001f58 ) + 8001eea: 6013 str r3, [r2, #0] pxNewTCB->uxTCBNumber = uxTaskNumber; } #endif /* configUSE_TRACE_FACILITY */ traceTASK_CREATE( pxNewTCB ); prvAddTaskToReadyList( pxNewTCB ); - 8001fb0: 687b ldr r3, [r7, #4] - 8001fb2: 6adb ldr r3, [r3, #44] ; 0x2c - 8001fb4: 2201 movs r2, #1 - 8001fb6: 409a lsls r2, r3 - 8001fb8: 4b19 ldr r3, [pc, #100] ; (8002020 ) - 8001fba: 681b ldr r3, [r3, #0] - 8001fbc: 4313 orrs r3, r2 - 8001fbe: 4a18 ldr r2, [pc, #96] ; (8002020 ) - 8001fc0: 6013 str r3, [r2, #0] - 8001fc2: 687b ldr r3, [r7, #4] - 8001fc4: 6ada ldr r2, [r3, #44] ; 0x2c - 8001fc6: 4613 mov r3, r2 - 8001fc8: 009b lsls r3, r3, #2 - 8001fca: 4413 add r3, r2 - 8001fcc: 009b lsls r3, r3, #2 - 8001fce: 4a15 ldr r2, [pc, #84] ; (8002024 ) - 8001fd0: 441a add r2, r3 - 8001fd2: 687b ldr r3, [r7, #4] - 8001fd4: 3304 adds r3, #4 - 8001fd6: 4619 mov r1, r3 - 8001fd8: 4610 mov r0, r2 - 8001fda: f7ff fe0d bl 8001bf8 + 8001eec: 687b ldr r3, [r7, #4] + 8001eee: 6adb ldr r3, [r3, #44] ; 0x2c + 8001ef0: 2201 movs r2, #1 + 8001ef2: 409a lsls r2, r3 + 8001ef4: 4b19 ldr r3, [pc, #100] ; (8001f5c ) + 8001ef6: 681b ldr r3, [r3, #0] + 8001ef8: 4313 orrs r3, r2 + 8001efa: 4a18 ldr r2, [pc, #96] ; (8001f5c ) + 8001efc: 6013 str r3, [r2, #0] + 8001efe: 687b ldr r3, [r7, #4] + 8001f00: 6ada ldr r2, [r3, #44] ; 0x2c + 8001f02: 4613 mov r3, r2 + 8001f04: 009b lsls r3, r3, #2 + 8001f06: 4413 add r3, r2 + 8001f08: 009b lsls r3, r3, #2 + 8001f0a: 4a15 ldr r2, [pc, #84] ; (8001f60 ) + 8001f0c: 441a add r2, r3 + 8001f0e: 687b ldr r3, [r7, #4] + 8001f10: 3304 adds r3, #4 + 8001f12: 4619 mov r1, r3 + 8001f14: 4610 mov r0, r2 + 8001f16: f7ff fe0d bl 8001b34 portSETUP_TCB( pxNewTCB ); } taskEXIT_CRITICAL(); - 8001fde: f000 fd31 bl 8002a44 + 8001f1a: f000 fd2b bl 8002974 if( xSchedulerRunning != pdFALSE ) - 8001fe2: 4b0d ldr r3, [pc, #52] ; (8002018 ) - 8001fe4: 681b ldr r3, [r3, #0] - 8001fe6: 2b00 cmp r3, #0 - 8001fe8: d00e beq.n 8002008 + 8001f1e: 4b0d ldr r3, [pc, #52] ; (8001f54 ) + 8001f20: 681b ldr r3, [r3, #0] + 8001f22: 2b00 cmp r3, #0 + 8001f24: d00e beq.n 8001f44 { /* If the created task is of a higher priority than the current task then it should run now. */ if( pxCurrentTCB->uxPriority < pxNewTCB->uxPriority ) - 8001fea: 4b0a ldr r3, [pc, #40] ; (8002014 ) - 8001fec: 681b ldr r3, [r3, #0] - 8001fee: 6ada ldr r2, [r3, #44] ; 0x2c - 8001ff0: 687b ldr r3, [r7, #4] - 8001ff2: 6adb ldr r3, [r3, #44] ; 0x2c - 8001ff4: 429a cmp r2, r3 - 8001ff6: d207 bcs.n 8002008 + 8001f26: 4b0a ldr r3, [pc, #40] ; (8001f50 ) + 8001f28: 681b ldr r3, [r3, #0] + 8001f2a: 6ada ldr r2, [r3, #44] ; 0x2c + 8001f2c: 687b ldr r3, [r7, #4] + 8001f2e: 6adb ldr r3, [r3, #44] ; 0x2c + 8001f30: 429a cmp r2, r3 + 8001f32: d207 bcs.n 8001f44 { taskYIELD_IF_USING_PREEMPTION(); - 8001ff8: 4b0b ldr r3, [pc, #44] ; (8002028 ) - 8001ffa: f04f 5280 mov.w r2, #268435456 ; 0x10000000 - 8001ffe: 601a str r2, [r3, #0] - 8002000: f3bf 8f4f dsb sy - 8002004: f3bf 8f6f isb sy + 8001f34: 4b0b ldr r3, [pc, #44] ; (8001f64 ) + 8001f36: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 8001f3a: 601a str r2, [r3, #0] + 8001f3c: f3bf 8f4f dsb sy + 8001f40: f3bf 8f6f isb sy } else { mtCOVERAGE_TEST_MARKER(); } } - 8002008: bf00 nop - 800200a: 3708 adds r7, #8 - 800200c: 46bd mov sp, r7 - 800200e: bd80 pop {r7, pc} - 8002010: 2000038c .word 0x2000038c - 8002014: 2000028c .word 0x2000028c - 8002018: 20000398 .word 0x20000398 - 800201c: 200003a8 .word 0x200003a8 - 8002020: 20000394 .word 0x20000394 - 8002024: 20000290 .word 0x20000290 - 8002028: e000ed04 .word 0xe000ed04 - -0800202c : + 8001f44: bf00 nop + 8001f46: 3708 adds r7, #8 + 8001f48: 46bd mov sp, r7 + 8001f4a: bd80 pop {r7, pc} + 8001f4c: 2000038c .word 0x2000038c + 8001f50: 2000028c .word 0x2000028c + 8001f54: 20000398 .word 0x20000398 + 8001f58: 200003a8 .word 0x200003a8 + 8001f5c: 20000394 .word 0x20000394 + 8001f60: 20000290 .word 0x20000290 + 8001f64: e000ed04 .word 0xe000ed04 + +08001f68 : /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskDelay == 1 ) void vTaskDelay( const TickType_t xTicksToDelay ) { - 800202c: b580 push {r7, lr} - 800202e: b084 sub sp, #16 - 8002030: af00 add r7, sp, #0 - 8002032: 6078 str r0, [r7, #4] + 8001f68: b580 push {r7, lr} + 8001f6a: b084 sub sp, #16 + 8001f6c: af00 add r7, sp, #0 + 8001f6e: 6078 str r0, [r7, #4] BaseType_t xAlreadyYielded = pdFALSE; - 8002034: 2300 movs r3, #0 - 8002036: 60fb str r3, [r7, #12] + 8001f70: 2300 movs r3, #0 + 8001f72: 60fb str r3, [r7, #12] /* A delay time of zero just forces a reschedule. */ if( xTicksToDelay > ( TickType_t ) 0U ) - 8002038: 687b ldr r3, [r7, #4] - 800203a: 2b00 cmp r3, #0 - 800203c: d017 beq.n 800206e + 8001f74: 687b ldr r3, [r7, #4] + 8001f76: 2b00 cmp r3, #0 + 8001f78: d017 beq.n 8001faa { configASSERT( uxSchedulerSuspended == 0 ); - 800203e: 4b13 ldr r3, [pc, #76] ; (800208c ) - 8002040: 681b ldr r3, [r3, #0] - 8002042: 2b00 cmp r3, #0 - 8002044: d00a beq.n 800205c + 8001f7a: 4b13 ldr r3, [pc, #76] ; (8001fc8 ) + 8001f7c: 681b ldr r3, [r3, #0] + 8001f7e: 2b00 cmp r3, #0 + 8001f80: d00a beq.n 8001f98 __asm volatile - 8002046: f04f 0350 mov.w r3, #80 ; 0x50 - 800204a: f383 8811 msr BASEPRI, r3 - 800204e: f3bf 8f6f isb sy - 8002052: f3bf 8f4f dsb sy - 8002056: 60bb str r3, [r7, #8] + 8001f82: f04f 0350 mov.w r3, #80 ; 0x50 + 8001f86: f383 8811 msr BASEPRI, r3 + 8001f8a: f3bf 8f6f isb sy + 8001f8e: f3bf 8f4f dsb sy + 8001f92: 60bb str r3, [r7, #8] } - 8002058: bf00 nop - 800205a: e7fe b.n 800205a + 8001f94: bf00 nop + 8001f96: e7fe b.n 8001f96 vTaskSuspendAll(); - 800205c: f000 f87a bl 8002154 + 8001f98: f000 f87a bl 8002090 list or removed from the blocked list until the scheduler is resumed. This task cannot be in an event list as it is the currently executing task. */ prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE ); - 8002060: 2100 movs r1, #0 - 8002062: 6878 ldr r0, [r7, #4] - 8002064: f000 fb28 bl 80026b8 + 8001f9c: 2100 movs r1, #0 + 8001f9e: 6878 ldr r0, [r7, #4] + 8001fa0: f000 fb28 bl 80025f4 } xAlreadyYielded = xTaskResumeAll(); - 8002068: f000 f882 bl 8002170 - 800206c: 60f8 str r0, [r7, #12] + 8001fa4: f000 f882 bl 80020ac + 8001fa8: 60f8 str r0, [r7, #12] mtCOVERAGE_TEST_MARKER(); } /* Force a reschedule if xTaskResumeAll has not already done so, we may have put ourselves to sleep. */ if( xAlreadyYielded == pdFALSE ) - 800206e: 68fb ldr r3, [r7, #12] - 8002070: 2b00 cmp r3, #0 - 8002072: d107 bne.n 8002084 + 8001faa: 68fb ldr r3, [r7, #12] + 8001fac: 2b00 cmp r3, #0 + 8001fae: d107 bne.n 8001fc0 { portYIELD_WITHIN_API(); - 8002074: 4b06 ldr r3, [pc, #24] ; (8002090 ) - 8002076: f04f 5280 mov.w r2, #268435456 ; 0x10000000 - 800207a: 601a str r2, [r3, #0] - 800207c: f3bf 8f4f dsb sy - 8002080: f3bf 8f6f isb sy + 8001fb0: 4b06 ldr r3, [pc, #24] ; (8001fcc ) + 8001fb2: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 8001fb6: 601a str r2, [r3, #0] + 8001fb8: f3bf 8f4f dsb sy + 8001fbc: f3bf 8f6f isb sy } else { mtCOVERAGE_TEST_MARKER(); } } - 8002084: bf00 nop - 8002086: 3710 adds r7, #16 - 8002088: 46bd mov sp, r7 - 800208a: bd80 pop {r7, pc} - 800208c: 200003b4 .word 0x200003b4 - 8002090: e000ed04 .word 0xe000ed04 + 8001fc0: bf00 nop + 8001fc2: 3710 adds r7, #16 + 8001fc4: 46bd mov sp, r7 + 8001fc6: bd80 pop {r7, pc} + 8001fc8: 200003b4 .word 0x200003b4 + 8001fcc: e000ed04 .word 0xe000ed04 -08002094 : +08001fd0 : #endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ /*-----------------------------------------------------------*/ void vTaskStartScheduler( void ) { - 8002094: b580 push {r7, lr} - 8002096: b08a sub sp, #40 ; 0x28 - 8002098: af04 add r7, sp, #16 + 8001fd0: b580 push {r7, lr} + 8001fd2: b08a sub sp, #40 ; 0x28 + 8001fd4: af04 add r7, sp, #16 BaseType_t xReturn; /* Add the idle task at the lowest priority. */ #if( configSUPPORT_STATIC_ALLOCATION == 1 ) { StaticTask_t *pxIdleTaskTCBBuffer = NULL; - 800209a: 2300 movs r3, #0 - 800209c: 60bb str r3, [r7, #8] + 8001fd6: 2300 movs r3, #0 + 8001fd8: 60bb str r3, [r7, #8] StackType_t *pxIdleTaskStackBuffer = NULL; - 800209e: 2300 movs r3, #0 - 80020a0: 607b str r3, [r7, #4] + 8001fda: 2300 movs r3, #0 + 8001fdc: 607b str r3, [r7, #4] uint32_t ulIdleTaskStackSize; /* The Idle task is created using user provided RAM - obtain the address of the RAM then create the idle task. */ vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize ); - 80020a2: 463a mov r2, r7 - 80020a4: 1d39 adds r1, r7, #4 - 80020a6: f107 0308 add.w r3, r7, #8 - 80020aa: 4618 mov r0, r3 - 80020ac: f7fe fa32 bl 8000514 + 8001fde: 463a mov r2, r7 + 8001fe0: 1d39 adds r1, r7, #4 + 8001fe2: f107 0308 add.w r3, r7, #8 + 8001fe6: 4618 mov r0, r3 + 8001fe8: f7fe fb02 bl 80005f0 xIdleTaskHandle = xTaskCreateStatic( prvIdleTask, - 80020b0: 6839 ldr r1, [r7, #0] - 80020b2: 687b ldr r3, [r7, #4] - 80020b4: 68ba ldr r2, [r7, #8] - 80020b6: 9202 str r2, [sp, #8] - 80020b8: 9301 str r3, [sp, #4] - 80020ba: 2300 movs r3, #0 - 80020bc: 9300 str r3, [sp, #0] - 80020be: 2300 movs r3, #0 - 80020c0: 460a mov r2, r1 - 80020c2: 491e ldr r1, [pc, #120] ; (800213c ) - 80020c4: 481e ldr r0, [pc, #120] ; (8002140 ) - 80020c6: f7ff fe1e bl 8001d06 - 80020ca: 4603 mov r3, r0 - 80020cc: 4a1d ldr r2, [pc, #116] ; (8002144 ) - 80020ce: 6013 str r3, [r2, #0] + 8001fec: 6839 ldr r1, [r7, #0] + 8001fee: 687b ldr r3, [r7, #4] + 8001ff0: 68ba ldr r2, [r7, #8] + 8001ff2: 9202 str r2, [sp, #8] + 8001ff4: 9301 str r3, [sp, #4] + 8001ff6: 2300 movs r3, #0 + 8001ff8: 9300 str r3, [sp, #0] + 8001ffa: 2300 movs r3, #0 + 8001ffc: 460a mov r2, r1 + 8001ffe: 491e ldr r1, [pc, #120] ; (8002078 ) + 8002000: 481e ldr r0, [pc, #120] ; (800207c ) + 8002002: f7ff fe1e bl 8001c42 + 8002006: 4603 mov r3, r0 + 8002008: 4a1d ldr r2, [pc, #116] ; (8002080 ) + 800200a: 6013 str r3, [r2, #0] ( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */ portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */ pxIdleTaskStackBuffer, pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ if( xIdleTaskHandle != NULL ) - 80020d0: 4b1c ldr r3, [pc, #112] ; (8002144 ) - 80020d2: 681b ldr r3, [r3, #0] - 80020d4: 2b00 cmp r3, #0 - 80020d6: d002 beq.n 80020de + 800200c: 4b1c ldr r3, [pc, #112] ; (8002080 ) + 800200e: 681b ldr r3, [r3, #0] + 8002010: 2b00 cmp r3, #0 + 8002012: d002 beq.n 800201a { xReturn = pdPASS; - 80020d8: 2301 movs r3, #1 - 80020da: 617b str r3, [r7, #20] - 80020dc: e001 b.n 80020e2 + 8002014: 2301 movs r3, #1 + 8002016: 617b str r3, [r7, #20] + 8002018: e001 b.n 800201e } else { xReturn = pdFAIL; - 80020de: 2300 movs r3, #0 - 80020e0: 617b str r3, [r7, #20] + 800201a: 2300 movs r3, #0 + 800201c: 617b str r3, [r7, #20] mtCOVERAGE_TEST_MARKER(); } } #endif /* configUSE_TIMERS */ if( xReturn == pdPASS ) - 80020e2: 697b ldr r3, [r7, #20] - 80020e4: 2b01 cmp r3, #1 - 80020e6: d116 bne.n 8002116 + 800201e: 697b ldr r3, [r7, #20] + 8002020: 2b01 cmp r3, #1 + 8002022: d116 bne.n 8002052 __asm volatile - 80020e8: f04f 0350 mov.w r3, #80 ; 0x50 - 80020ec: f383 8811 msr BASEPRI, r3 - 80020f0: f3bf 8f6f isb sy - 80020f4: f3bf 8f4f dsb sy - 80020f8: 613b str r3, [r7, #16] + 8002024: f04f 0350 mov.w r3, #80 ; 0x50 + 8002028: f383 8811 msr BASEPRI, r3 + 800202c: f3bf 8f6f isb sy + 8002030: f3bf 8f4f dsb sy + 8002034: 613b str r3, [r7, #16] } - 80020fa: bf00 nop + 8002036: bf00 nop for additional information. */ _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); } #endif /* configUSE_NEWLIB_REENTRANT */ xNextTaskUnblockTime = portMAX_DELAY; - 80020fc: 4b12 ldr r3, [pc, #72] ; (8002148 ) - 80020fe: f04f 32ff mov.w r2, #4294967295 - 8002102: 601a str r2, [r3, #0] + 8002038: 4b12 ldr r3, [pc, #72] ; (8002084 ) + 800203a: f04f 32ff mov.w r2, #4294967295 + 800203e: 601a str r2, [r3, #0] xSchedulerRunning = pdTRUE; - 8002104: 4b11 ldr r3, [pc, #68] ; (800214c ) - 8002106: 2201 movs r2, #1 - 8002108: 601a str r2, [r3, #0] + 8002040: 4b11 ldr r3, [pc, #68] ; (8002088 ) + 8002042: 2201 movs r2, #1 + 8002044: 601a str r2, [r3, #0] xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT; - 800210a: 4b11 ldr r3, [pc, #68] ; (8002150 ) - 800210c: 2200 movs r2, #0 - 800210e: 601a str r2, [r3, #0] + 8002046: 4b11 ldr r3, [pc, #68] ; (800208c ) + 8002048: 2200 movs r2, #0 + 800204a: 601a str r2, [r3, #0] traceTASK_SWITCHED_IN(); /* Setting up the timer tick is hardware specific and thus in the portable interface. */ if( xPortStartScheduler() != pdFALSE ) - 8002110: f000 fbc6 bl 80028a0 + 800204c: f000 fbc0 bl 80027d0 } /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0, meaning xIdleTaskHandle is not used anywhere else. */ ( void ) xIdleTaskHandle; } - 8002114: e00e b.n 8002134 + 8002050: e00e b.n 8002070 configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ); - 8002116: 697b ldr r3, [r7, #20] - 8002118: f1b3 3fff cmp.w r3, #4294967295 - 800211c: d10a bne.n 8002134 + 8002052: 697b ldr r3, [r7, #20] + 8002054: f1b3 3fff cmp.w r3, #4294967295 + 8002058: d10a bne.n 8002070 __asm volatile - 800211e: f04f 0350 mov.w r3, #80 ; 0x50 - 8002122: f383 8811 msr BASEPRI, r3 - 8002126: f3bf 8f6f isb sy - 800212a: f3bf 8f4f dsb sy - 800212e: 60fb str r3, [r7, #12] + 800205a: f04f 0350 mov.w r3, #80 ; 0x50 + 800205e: f383 8811 msr BASEPRI, r3 + 8002062: f3bf 8f6f isb sy + 8002066: f3bf 8f4f dsb sy + 800206a: 60fb str r3, [r7, #12] } - 8002130: bf00 nop - 8002132: e7fe b.n 8002132 + 800206c: bf00 nop + 800206e: e7fe b.n 800206e } - 8002134: bf00 nop - 8002136: 3718 adds r7, #24 - 8002138: 46bd mov sp, r7 - 800213a: bd80 pop {r7, pc} - 800213c: 0800303c .word 0x0800303c - 8002140: 080024d1 .word 0x080024d1 - 8002144: 200003b0 .word 0x200003b0 - 8002148: 200003ac .word 0x200003ac - 800214c: 20000398 .word 0x20000398 - 8002150: 20000390 .word 0x20000390 - -08002154 : + 8002070: bf00 nop + 8002072: 3718 adds r7, #24 + 8002074: 46bd mov sp, r7 + 8002076: bd80 pop {r7, pc} + 8002078: 08002f6c .word 0x08002f6c + 800207c: 0800240d .word 0x0800240d + 8002080: 200003b0 .word 0x200003b0 + 8002084: 200003ac .word 0x200003ac + 8002088: 20000398 .word 0x20000398 + 800208c: 20000390 .word 0x20000390 + +08002090 : vPortEndScheduler(); } /*----------------------------------------------------------*/ void vTaskSuspendAll( void ) { - 8002154: b480 push {r7} - 8002156: af00 add r7, sp, #0 + 8002090: b480 push {r7} + 8002092: af00 add r7, sp, #0 do not otherwise exhibit real time behaviour. */ portSOFTWARE_BARRIER(); /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment is used to allow calls to vTaskSuspendAll() to nest. */ ++uxSchedulerSuspended; - 8002158: 4b04 ldr r3, [pc, #16] ; (800216c ) - 800215a: 681b ldr r3, [r3, #0] - 800215c: 3301 adds r3, #1 - 800215e: 4a03 ldr r2, [pc, #12] ; (800216c ) - 8002160: 6013 str r3, [r2, #0] + 8002094: 4b04 ldr r3, [pc, #16] ; (80020a8 ) + 8002096: 681b ldr r3, [r3, #0] + 8002098: 3301 adds r3, #1 + 800209a: 4a03 ldr r2, [pc, #12] ; (80020a8 ) + 800209c: 6013 str r3, [r2, #0] /* Enforces ordering for ports and optimised compilers that may otherwise place the above increment elsewhere. */ portMEMORY_BARRIER(); } - 8002162: bf00 nop - 8002164: 46bd mov sp, r7 - 8002166: f85d 7b04 ldr.w r7, [sp], #4 - 800216a: 4770 bx lr - 800216c: 200003b4 .word 0x200003b4 + 800209e: bf00 nop + 80020a0: 46bd mov sp, r7 + 80020a2: f85d 7b04 ldr.w r7, [sp], #4 + 80020a6: 4770 bx lr + 80020a8: 200003b4 .word 0x200003b4 -08002170 : +080020ac : #endif /* configUSE_TICKLESS_IDLE */ /*----------------------------------------------------------*/ BaseType_t xTaskResumeAll( void ) { - 8002170: b580 push {r7, lr} - 8002172: b084 sub sp, #16 - 8002174: af00 add r7, sp, #0 + 80020ac: b580 push {r7, lr} + 80020ae: b084 sub sp, #16 + 80020b0: af00 add r7, sp, #0 TCB_t *pxTCB = NULL; - 8002176: 2300 movs r3, #0 - 8002178: 60fb str r3, [r7, #12] + 80020b2: 2300 movs r3, #0 + 80020b4: 60fb str r3, [r7, #12] BaseType_t xAlreadyYielded = pdFALSE; - 800217a: 2300 movs r3, #0 - 800217c: 60bb str r3, [r7, #8] + 80020b6: 2300 movs r3, #0 + 80020b8: 60bb str r3, [r7, #8] /* If uxSchedulerSuspended is zero then this function does not match a previous call to vTaskSuspendAll(). */ configASSERT( uxSchedulerSuspended ); - 800217e: 4b41 ldr r3, [pc, #260] ; (8002284 ) - 8002180: 681b ldr r3, [r3, #0] - 8002182: 2b00 cmp r3, #0 - 8002184: d10a bne.n 800219c + 80020ba: 4b41 ldr r3, [pc, #260] ; (80021c0 ) + 80020bc: 681b ldr r3, [r3, #0] + 80020be: 2b00 cmp r3, #0 + 80020c0: d10a bne.n 80020d8 __asm volatile - 8002186: f04f 0350 mov.w r3, #80 ; 0x50 - 800218a: f383 8811 msr BASEPRI, r3 - 800218e: f3bf 8f6f isb sy - 8002192: f3bf 8f4f dsb sy - 8002196: 603b str r3, [r7, #0] + 80020c2: f04f 0350 mov.w r3, #80 ; 0x50 + 80020c6: f383 8811 msr BASEPRI, r3 + 80020ca: f3bf 8f6f isb sy + 80020ce: f3bf 8f4f dsb sy + 80020d2: 603b str r3, [r7, #0] } - 8002198: bf00 nop - 800219a: e7fe b.n 800219a + 80020d4: bf00 nop + 80020d6: e7fe b.n 80020d6 /* It is possible that an ISR caused a task to be removed from an event list while the scheduler was suspended. If this was the case then the removed task will have been added to the xPendingReadyList. Once the scheduler has been resumed it is safe to move all the pending ready tasks from this list into their appropriate ready list. */ taskENTER_CRITICAL(); - 800219c: f000 fc22 bl 80029e4 + 80020d8: f000 fc1c bl 8002914 { --uxSchedulerSuspended; - 80021a0: 4b38 ldr r3, [pc, #224] ; (8002284 ) - 80021a2: 681b ldr r3, [r3, #0] - 80021a4: 3b01 subs r3, #1 - 80021a6: 4a37 ldr r2, [pc, #220] ; (8002284 ) - 80021a8: 6013 str r3, [r2, #0] + 80020dc: 4b38 ldr r3, [pc, #224] ; (80021c0 ) + 80020de: 681b ldr r3, [r3, #0] + 80020e0: 3b01 subs r3, #1 + 80020e2: 4a37 ldr r2, [pc, #220] ; (80021c0 ) + 80020e4: 6013 str r3, [r2, #0] if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - 80021aa: 4b36 ldr r3, [pc, #216] ; (8002284 ) - 80021ac: 681b ldr r3, [r3, #0] - 80021ae: 2b00 cmp r3, #0 - 80021b0: d161 bne.n 8002276 + 80020e6: 4b36 ldr r3, [pc, #216] ; (80021c0 ) + 80020e8: 681b ldr r3, [r3, #0] + 80020ea: 2b00 cmp r3, #0 + 80020ec: d161 bne.n 80021b2 { if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U ) - 80021b2: 4b35 ldr r3, [pc, #212] ; (8002288 ) - 80021b4: 681b ldr r3, [r3, #0] - 80021b6: 2b00 cmp r3, #0 - 80021b8: d05d beq.n 8002276 + 80020ee: 4b35 ldr r3, [pc, #212] ; (80021c4 ) + 80020f0: 681b ldr r3, [r3, #0] + 80020f2: 2b00 cmp r3, #0 + 80020f4: d05d beq.n 80021b2 { /* Move any readied tasks from the pending list into the appropriate ready list. */ while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) - 80021ba: e02e b.n 800221a + 80020f6: e02e b.n 8002156 { pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - 80021bc: 4b33 ldr r3, [pc, #204] ; (800228c ) - 80021be: 68db ldr r3, [r3, #12] - 80021c0: 68db ldr r3, [r3, #12] - 80021c2: 60fb str r3, [r7, #12] + 80020f8: 4b33 ldr r3, [pc, #204] ; (80021c8 ) + 80020fa: 68db ldr r3, [r3, #12] + 80020fc: 68db ldr r3, [r3, #12] + 80020fe: 60fb str r3, [r7, #12] ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - 80021c4: 68fb ldr r3, [r7, #12] - 80021c6: 3318 adds r3, #24 - 80021c8: 4618 mov r0, r3 - 80021ca: f7ff fd72 bl 8001cb2 + 8002100: 68fb ldr r3, [r7, #12] + 8002102: 3318 adds r3, #24 + 8002104: 4618 mov r0, r3 + 8002106: f7ff fd72 bl 8001bee ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - 80021ce: 68fb ldr r3, [r7, #12] - 80021d0: 3304 adds r3, #4 - 80021d2: 4618 mov r0, r3 - 80021d4: f7ff fd6d bl 8001cb2 + 800210a: 68fb ldr r3, [r7, #12] + 800210c: 3304 adds r3, #4 + 800210e: 4618 mov r0, r3 + 8002110: f7ff fd6d bl 8001bee prvAddTaskToReadyList( pxTCB ); - 80021d8: 68fb ldr r3, [r7, #12] - 80021da: 6adb ldr r3, [r3, #44] ; 0x2c - 80021dc: 2201 movs r2, #1 - 80021de: 409a lsls r2, r3 - 80021e0: 4b2b ldr r3, [pc, #172] ; (8002290 ) - 80021e2: 681b ldr r3, [r3, #0] - 80021e4: 4313 orrs r3, r2 - 80021e6: 4a2a ldr r2, [pc, #168] ; (8002290 ) - 80021e8: 6013 str r3, [r2, #0] - 80021ea: 68fb ldr r3, [r7, #12] - 80021ec: 6ada ldr r2, [r3, #44] ; 0x2c - 80021ee: 4613 mov r3, r2 - 80021f0: 009b lsls r3, r3, #2 - 80021f2: 4413 add r3, r2 - 80021f4: 009b lsls r3, r3, #2 - 80021f6: 4a27 ldr r2, [pc, #156] ; (8002294 ) - 80021f8: 441a add r2, r3 - 80021fa: 68fb ldr r3, [r7, #12] - 80021fc: 3304 adds r3, #4 - 80021fe: 4619 mov r1, r3 - 8002200: 4610 mov r0, r2 - 8002202: f7ff fcf9 bl 8001bf8 + 8002114: 68fb ldr r3, [r7, #12] + 8002116: 6adb ldr r3, [r3, #44] ; 0x2c + 8002118: 2201 movs r2, #1 + 800211a: 409a lsls r2, r3 + 800211c: 4b2b ldr r3, [pc, #172] ; (80021cc ) + 800211e: 681b ldr r3, [r3, #0] + 8002120: 4313 orrs r3, r2 + 8002122: 4a2a ldr r2, [pc, #168] ; (80021cc ) + 8002124: 6013 str r3, [r2, #0] + 8002126: 68fb ldr r3, [r7, #12] + 8002128: 6ada ldr r2, [r3, #44] ; 0x2c + 800212a: 4613 mov r3, r2 + 800212c: 009b lsls r3, r3, #2 + 800212e: 4413 add r3, r2 + 8002130: 009b lsls r3, r3, #2 + 8002132: 4a27 ldr r2, [pc, #156] ; (80021d0 ) + 8002134: 441a add r2, r3 + 8002136: 68fb ldr r3, [r7, #12] + 8002138: 3304 adds r3, #4 + 800213a: 4619 mov r1, r3 + 800213c: 4610 mov r0, r2 + 800213e: f7ff fcf9 bl 8001b34 /* If the moved task has a priority higher than the current task then a yield must be performed. */ if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) - 8002206: 68fb ldr r3, [r7, #12] - 8002208: 6ada ldr r2, [r3, #44] ; 0x2c - 800220a: 4b23 ldr r3, [pc, #140] ; (8002298 ) - 800220c: 681b ldr r3, [r3, #0] - 800220e: 6adb ldr r3, [r3, #44] ; 0x2c - 8002210: 429a cmp r2, r3 - 8002212: d302 bcc.n 800221a + 8002142: 68fb ldr r3, [r7, #12] + 8002144: 6ada ldr r2, [r3, #44] ; 0x2c + 8002146: 4b23 ldr r3, [pc, #140] ; (80021d4 ) + 8002148: 681b ldr r3, [r3, #0] + 800214a: 6adb ldr r3, [r3, #44] ; 0x2c + 800214c: 429a cmp r2, r3 + 800214e: d302 bcc.n 8002156 { xYieldPending = pdTRUE; - 8002214: 4b21 ldr r3, [pc, #132] ; (800229c ) - 8002216: 2201 movs r2, #1 - 8002218: 601a str r2, [r3, #0] + 8002150: 4b21 ldr r3, [pc, #132] ; (80021d8 ) + 8002152: 2201 movs r2, #1 + 8002154: 601a str r2, [r3, #0] while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) - 800221a: 4b1c ldr r3, [pc, #112] ; (800228c ) - 800221c: 681b ldr r3, [r3, #0] - 800221e: 2b00 cmp r3, #0 - 8002220: d1cc bne.n 80021bc + 8002156: 4b1c ldr r3, [pc, #112] ; (80021c8 ) + 8002158: 681b ldr r3, [r3, #0] + 800215a: 2b00 cmp r3, #0 + 800215c: d1cc bne.n 80020f8 { mtCOVERAGE_TEST_MARKER(); } } if( pxTCB != NULL ) - 8002222: 68fb ldr r3, [r7, #12] - 8002224: 2b00 cmp r3, #0 - 8002226: d001 beq.n 800222c + 800215e: 68fb ldr r3, [r7, #12] + 8002160: 2b00 cmp r3, #0 + 8002162: d001 beq.n 8002168 which may have prevented the next unblock time from being re-calculated, in which case re-calculate it now. Mainly important for low power tickless implementations, where this can prevent an unnecessary exit from low power state. */ prvResetNextTaskUnblockTime(); - 8002228: f000 fa08 bl 800263c + 8002164: f000 fa08 bl 8002578 /* If any ticks occurred while the scheduler was suspended then they should be processed now. This ensures the tick count does not slip, and that any delayed tasks are resumed at the correct time. */ { TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */ - 800222c: 4b1c ldr r3, [pc, #112] ; (80022a0 ) - 800222e: 681b ldr r3, [r3, #0] - 8002230: 607b str r3, [r7, #4] + 8002168: 4b1c ldr r3, [pc, #112] ; (80021dc ) + 800216a: 681b ldr r3, [r3, #0] + 800216c: 607b str r3, [r7, #4] if( xPendedCounts > ( TickType_t ) 0U ) - 8002232: 687b ldr r3, [r7, #4] - 8002234: 2b00 cmp r3, #0 - 8002236: d010 beq.n 800225a + 800216e: 687b ldr r3, [r7, #4] + 8002170: 2b00 cmp r3, #0 + 8002172: d010 beq.n 8002196 { do { if( xTaskIncrementTick() != pdFALSE ) - 8002238: f000 f836 bl 80022a8 - 800223c: 4603 mov r3, r0 - 800223e: 2b00 cmp r3, #0 - 8002240: d002 beq.n 8002248 + 8002174: f000 f836 bl 80021e4 + 8002178: 4603 mov r3, r0 + 800217a: 2b00 cmp r3, #0 + 800217c: d002 beq.n 8002184 { xYieldPending = pdTRUE; - 8002242: 4b16 ldr r3, [pc, #88] ; (800229c ) - 8002244: 2201 movs r2, #1 - 8002246: 601a str r2, [r3, #0] + 800217e: 4b16 ldr r3, [pc, #88] ; (80021d8 ) + 8002180: 2201 movs r2, #1 + 8002182: 601a str r2, [r3, #0] } else { mtCOVERAGE_TEST_MARKER(); } --xPendedCounts; - 8002248: 687b ldr r3, [r7, #4] - 800224a: 3b01 subs r3, #1 - 800224c: 607b str r3, [r7, #4] + 8002184: 687b ldr r3, [r7, #4] + 8002186: 3b01 subs r3, #1 + 8002188: 607b str r3, [r7, #4] } while( xPendedCounts > ( TickType_t ) 0U ); - 800224e: 687b ldr r3, [r7, #4] - 8002250: 2b00 cmp r3, #0 - 8002252: d1f1 bne.n 8002238 + 800218a: 687b ldr r3, [r7, #4] + 800218c: 2b00 cmp r3, #0 + 800218e: d1f1 bne.n 8002174 xPendedTicks = 0; - 8002254: 4b12 ldr r3, [pc, #72] ; (80022a0 ) - 8002256: 2200 movs r2, #0 - 8002258: 601a str r2, [r3, #0] + 8002190: 4b12 ldr r3, [pc, #72] ; (80021dc ) + 8002192: 2200 movs r2, #0 + 8002194: 601a str r2, [r3, #0] { mtCOVERAGE_TEST_MARKER(); } } if( xYieldPending != pdFALSE ) - 800225a: 4b10 ldr r3, [pc, #64] ; (800229c ) - 800225c: 681b ldr r3, [r3, #0] - 800225e: 2b00 cmp r3, #0 - 8002260: d009 beq.n 8002276 + 8002196: 4b10 ldr r3, [pc, #64] ; (80021d8 ) + 8002198: 681b ldr r3, [r3, #0] + 800219a: 2b00 cmp r3, #0 + 800219c: d009 beq.n 80021b2 { #if( configUSE_PREEMPTION != 0 ) { xAlreadyYielded = pdTRUE; - 8002262: 2301 movs r3, #1 - 8002264: 60bb str r3, [r7, #8] + 800219e: 2301 movs r3, #1 + 80021a0: 60bb str r3, [r7, #8] } #endif taskYIELD_IF_USING_PREEMPTION(); - 8002266: 4b0f ldr r3, [pc, #60] ; (80022a4 ) - 8002268: f04f 5280 mov.w r2, #268435456 ; 0x10000000 - 800226c: 601a str r2, [r3, #0] - 800226e: f3bf 8f4f dsb sy - 8002272: f3bf 8f6f isb sy + 80021a2: 4b0f ldr r3, [pc, #60] ; (80021e0 ) + 80021a4: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 80021a8: 601a str r2, [r3, #0] + 80021aa: f3bf 8f4f dsb sy + 80021ae: f3bf 8f6f isb sy else { mtCOVERAGE_TEST_MARKER(); } } taskEXIT_CRITICAL(); - 8002276: f000 fbe5 bl 8002a44 + 80021b2: f000 fbdf bl 8002974 return xAlreadyYielded; - 800227a: 68bb ldr r3, [r7, #8] + 80021b6: 68bb ldr r3, [r7, #8] } - 800227c: 4618 mov r0, r3 - 800227e: 3710 adds r7, #16 - 8002280: 46bd mov sp, r7 - 8002282: bd80 pop {r7, pc} - 8002284: 200003b4 .word 0x200003b4 - 8002288: 2000038c .word 0x2000038c - 800228c: 2000034c .word 0x2000034c - 8002290: 20000394 .word 0x20000394 - 8002294: 20000290 .word 0x20000290 - 8002298: 2000028c .word 0x2000028c - 800229c: 200003a0 .word 0x200003a0 - 80022a0: 2000039c .word 0x2000039c - 80022a4: e000ed04 .word 0xe000ed04 - -080022a8 : + 80021b8: 4618 mov r0, r3 + 80021ba: 3710 adds r7, #16 + 80021bc: 46bd mov sp, r7 + 80021be: bd80 pop {r7, pc} + 80021c0: 200003b4 .word 0x200003b4 + 80021c4: 2000038c .word 0x2000038c + 80021c8: 2000034c .word 0x2000034c + 80021cc: 20000394 .word 0x20000394 + 80021d0: 20000290 .word 0x20000290 + 80021d4: 2000028c .word 0x2000028c + 80021d8: 200003a0 .word 0x200003a0 + 80021dc: 2000039c .word 0x2000039c + 80021e0: e000ed04 .word 0xe000ed04 + +080021e4 : #endif /* INCLUDE_xTaskAbortDelay */ /*----------------------------------------------------------*/ BaseType_t xTaskIncrementTick( void ) { - 80022a8: b580 push {r7, lr} - 80022aa: b086 sub sp, #24 - 80022ac: af00 add r7, sp, #0 + 80021e4: b580 push {r7, lr} + 80021e6: b086 sub sp, #24 + 80021e8: af00 add r7, sp, #0 TCB_t * pxTCB; TickType_t xItemValue; BaseType_t xSwitchRequired = pdFALSE; - 80022ae: 2300 movs r3, #0 - 80022b0: 617b str r3, [r7, #20] + 80021ea: 2300 movs r3, #0 + 80021ec: 617b str r3, [r7, #20] /* Called by the portable layer each time a tick interrupt occurs. Increments the tick then checks to see if the new tick value will cause any tasks to be unblocked. */ traceTASK_INCREMENT_TICK( xTickCount ); if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - 80022b2: 4b4e ldr r3, [pc, #312] ; (80023ec ) - 80022b4: 681b ldr r3, [r3, #0] - 80022b6: 2b00 cmp r3, #0 - 80022b8: f040 808e bne.w 80023d8 + 80021ee: 4b4e ldr r3, [pc, #312] ; (8002328 ) + 80021f0: 681b ldr r3, [r3, #0] + 80021f2: 2b00 cmp r3, #0 + 80021f4: f040 808e bne.w 8002314 { /* Minor optimisation. The tick count cannot change in this block. */ const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1; - 80022bc: 4b4c ldr r3, [pc, #304] ; (80023f0 ) - 80022be: 681b ldr r3, [r3, #0] - 80022c0: 3301 adds r3, #1 - 80022c2: 613b str r3, [r7, #16] + 80021f8: 4b4c ldr r3, [pc, #304] ; (800232c ) + 80021fa: 681b ldr r3, [r3, #0] + 80021fc: 3301 adds r3, #1 + 80021fe: 613b str r3, [r7, #16] /* Increment the RTOS tick, switching the delayed and overflowed delayed lists if it wraps to 0. */ xTickCount = xConstTickCount; - 80022c4: 4a4a ldr r2, [pc, #296] ; (80023f0 ) - 80022c6: 693b ldr r3, [r7, #16] - 80022c8: 6013 str r3, [r2, #0] + 8002200: 4a4a ldr r2, [pc, #296] ; (800232c ) + 8002202: 693b ldr r3, [r7, #16] + 8002204: 6013 str r3, [r2, #0] if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. */ - 80022ca: 693b ldr r3, [r7, #16] - 80022cc: 2b00 cmp r3, #0 - 80022ce: d120 bne.n 8002312 + 8002206: 693b ldr r3, [r7, #16] + 8002208: 2b00 cmp r3, #0 + 800220a: d120 bne.n 800224e { taskSWITCH_DELAYED_LISTS(); - 80022d0: 4b48 ldr r3, [pc, #288] ; (80023f4 ) - 80022d2: 681b ldr r3, [r3, #0] - 80022d4: 681b ldr r3, [r3, #0] - 80022d6: 2b00 cmp r3, #0 - 80022d8: d00a beq.n 80022f0 + 800220c: 4b48 ldr r3, [pc, #288] ; (8002330 ) + 800220e: 681b ldr r3, [r3, #0] + 8002210: 681b ldr r3, [r3, #0] + 8002212: 2b00 cmp r3, #0 + 8002214: d00a beq.n 800222c __asm volatile - 80022da: f04f 0350 mov.w r3, #80 ; 0x50 - 80022de: f383 8811 msr BASEPRI, r3 - 80022e2: f3bf 8f6f isb sy - 80022e6: f3bf 8f4f dsb sy - 80022ea: 603b str r3, [r7, #0] + 8002216: f04f 0350 mov.w r3, #80 ; 0x50 + 800221a: f383 8811 msr BASEPRI, r3 + 800221e: f3bf 8f6f isb sy + 8002222: f3bf 8f4f dsb sy + 8002226: 603b str r3, [r7, #0] } - 80022ec: bf00 nop - 80022ee: e7fe b.n 80022ee - 80022f0: 4b40 ldr r3, [pc, #256] ; (80023f4 ) - 80022f2: 681b ldr r3, [r3, #0] - 80022f4: 60fb str r3, [r7, #12] - 80022f6: 4b40 ldr r3, [pc, #256] ; (80023f8 ) - 80022f8: 681b ldr r3, [r3, #0] - 80022fa: 4a3e ldr r2, [pc, #248] ; (80023f4 ) - 80022fc: 6013 str r3, [r2, #0] - 80022fe: 4a3e ldr r2, [pc, #248] ; (80023f8 ) - 8002300: 68fb ldr r3, [r7, #12] - 8002302: 6013 str r3, [r2, #0] - 8002304: 4b3d ldr r3, [pc, #244] ; (80023fc ) - 8002306: 681b ldr r3, [r3, #0] - 8002308: 3301 adds r3, #1 - 800230a: 4a3c ldr r2, [pc, #240] ; (80023fc ) - 800230c: 6013 str r3, [r2, #0] - 800230e: f000 f995 bl 800263c + 8002228: bf00 nop + 800222a: e7fe b.n 800222a + 800222c: 4b40 ldr r3, [pc, #256] ; (8002330 ) + 800222e: 681b ldr r3, [r3, #0] + 8002230: 60fb str r3, [r7, #12] + 8002232: 4b40 ldr r3, [pc, #256] ; (8002334 ) + 8002234: 681b ldr r3, [r3, #0] + 8002236: 4a3e ldr r2, [pc, #248] ; (8002330 ) + 8002238: 6013 str r3, [r2, #0] + 800223a: 4a3e ldr r2, [pc, #248] ; (8002334 ) + 800223c: 68fb ldr r3, [r7, #12] + 800223e: 6013 str r3, [r2, #0] + 8002240: 4b3d ldr r3, [pc, #244] ; (8002338 ) + 8002242: 681b ldr r3, [r3, #0] + 8002244: 3301 adds r3, #1 + 8002246: 4a3c ldr r2, [pc, #240] ; (8002338 ) + 8002248: 6013 str r3, [r2, #0] + 800224a: f000 f995 bl 8002578 /* See if this tick has made a timeout expire. Tasks are stored in the queue in the order of their wake time - meaning once one task has been found whose block time has not expired there is no need to look any further down the list. */ if( xConstTickCount >= xNextTaskUnblockTime ) - 8002312: 4b3b ldr r3, [pc, #236] ; (8002400 ) - 8002314: 681b ldr r3, [r3, #0] - 8002316: 693a ldr r2, [r7, #16] - 8002318: 429a cmp r2, r3 - 800231a: d348 bcc.n 80023ae + 800224e: 4b3b ldr r3, [pc, #236] ; (800233c ) + 8002250: 681b ldr r3, [r3, #0] + 8002252: 693a ldr r2, [r7, #16] + 8002254: 429a cmp r2, r3 + 8002256: d348 bcc.n 80022ea { for( ;; ) { if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) - 800231c: 4b35 ldr r3, [pc, #212] ; (80023f4 ) - 800231e: 681b ldr r3, [r3, #0] - 8002320: 681b ldr r3, [r3, #0] - 8002322: 2b00 cmp r3, #0 - 8002324: d104 bne.n 8002330 + 8002258: 4b35 ldr r3, [pc, #212] ; (8002330 ) + 800225a: 681b ldr r3, [r3, #0] + 800225c: 681b ldr r3, [r3, #0] + 800225e: 2b00 cmp r3, #0 + 8002260: d104 bne.n 800226c /* The delayed list is empty. Set xNextTaskUnblockTime to the maximum possible value so it is extremely unlikely that the if( xTickCount >= xNextTaskUnblockTime ) test will pass next time through. */ xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ - 8002326: 4b36 ldr r3, [pc, #216] ; (8002400 ) - 8002328: f04f 32ff mov.w r2, #4294967295 - 800232c: 601a str r2, [r3, #0] + 8002262: 4b36 ldr r3, [pc, #216] ; (800233c ) + 8002264: f04f 32ff mov.w r2, #4294967295 + 8002268: 601a str r2, [r3, #0] break; - 800232e: e03e b.n 80023ae + 800226a: e03e b.n 80022ea { /* The delayed list is not empty, get the value of the item at the head of the delayed list. This is the time at which the task at the head of the delayed list must be removed from the Blocked state. */ pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - 8002330: 4b30 ldr r3, [pc, #192] ; (80023f4 ) - 8002332: 681b ldr r3, [r3, #0] - 8002334: 68db ldr r3, [r3, #12] - 8002336: 68db ldr r3, [r3, #12] - 8002338: 60bb str r3, [r7, #8] + 800226c: 4b30 ldr r3, [pc, #192] ; (8002330 ) + 800226e: 681b ldr r3, [r3, #0] + 8002270: 68db ldr r3, [r3, #12] + 8002272: 68db ldr r3, [r3, #12] + 8002274: 60bb str r3, [r7, #8] xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) ); - 800233a: 68bb ldr r3, [r7, #8] - 800233c: 685b ldr r3, [r3, #4] - 800233e: 607b str r3, [r7, #4] + 8002276: 68bb ldr r3, [r7, #8] + 8002278: 685b ldr r3, [r3, #4] + 800227a: 607b str r3, [r7, #4] if( xConstTickCount < xItemValue ) - 8002340: 693a ldr r2, [r7, #16] - 8002342: 687b ldr r3, [r7, #4] - 8002344: 429a cmp r2, r3 - 8002346: d203 bcs.n 8002350 + 800227c: 693a ldr r2, [r7, #16] + 800227e: 687b ldr r3, [r7, #4] + 8002280: 429a cmp r2, r3 + 8002282: d203 bcs.n 800228c /* It is not time to unblock this item yet, but the item value is the time at which the task at the head of the blocked list must be removed from the Blocked state - so record the item value in xNextTaskUnblockTime. */ xNextTaskUnblockTime = xItemValue; - 8002348: 4a2d ldr r2, [pc, #180] ; (8002400 ) - 800234a: 687b ldr r3, [r7, #4] - 800234c: 6013 str r3, [r2, #0] + 8002284: 4a2d ldr r2, [pc, #180] ; (800233c ) + 8002286: 687b ldr r3, [r7, #4] + 8002288: 6013 str r3, [r2, #0] break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */ - 800234e: e02e b.n 80023ae + 800228a: e02e b.n 80022ea { mtCOVERAGE_TEST_MARKER(); } /* It is time to remove the item from the Blocked state. */ ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - 8002350: 68bb ldr r3, [r7, #8] - 8002352: 3304 adds r3, #4 - 8002354: 4618 mov r0, r3 - 8002356: f7ff fcac bl 8001cb2 + 800228c: 68bb ldr r3, [r7, #8] + 800228e: 3304 adds r3, #4 + 8002290: 4618 mov r0, r3 + 8002292: f7ff fcac bl 8001bee /* Is the task waiting on an event also? If so remove it from the event list. */ if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) - 800235a: 68bb ldr r3, [r7, #8] - 800235c: 6a9b ldr r3, [r3, #40] ; 0x28 - 800235e: 2b00 cmp r3, #0 - 8002360: d004 beq.n 800236c + 8002296: 68bb ldr r3, [r7, #8] + 8002298: 6a9b ldr r3, [r3, #40] ; 0x28 + 800229a: 2b00 cmp r3, #0 + 800229c: d004 beq.n 80022a8 { ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); - 8002362: 68bb ldr r3, [r7, #8] - 8002364: 3318 adds r3, #24 - 8002366: 4618 mov r0, r3 - 8002368: f7ff fca3 bl 8001cb2 + 800229e: 68bb ldr r3, [r7, #8] + 80022a0: 3318 adds r3, #24 + 80022a2: 4618 mov r0, r3 + 80022a4: f7ff fca3 bl 8001bee mtCOVERAGE_TEST_MARKER(); } /* Place the unblocked task into the appropriate ready list. */ prvAddTaskToReadyList( pxTCB ); - 800236c: 68bb ldr r3, [r7, #8] - 800236e: 6adb ldr r3, [r3, #44] ; 0x2c - 8002370: 2201 movs r2, #1 - 8002372: 409a lsls r2, r3 - 8002374: 4b23 ldr r3, [pc, #140] ; (8002404 ) - 8002376: 681b ldr r3, [r3, #0] - 8002378: 4313 orrs r3, r2 - 800237a: 4a22 ldr r2, [pc, #136] ; (8002404 ) - 800237c: 6013 str r3, [r2, #0] - 800237e: 68bb ldr r3, [r7, #8] - 8002380: 6ada ldr r2, [r3, #44] ; 0x2c - 8002382: 4613 mov r3, r2 - 8002384: 009b lsls r3, r3, #2 - 8002386: 4413 add r3, r2 - 8002388: 009b lsls r3, r3, #2 - 800238a: 4a1f ldr r2, [pc, #124] ; (8002408 ) - 800238c: 441a add r2, r3 - 800238e: 68bb ldr r3, [r7, #8] - 8002390: 3304 adds r3, #4 - 8002392: 4619 mov r1, r3 - 8002394: 4610 mov r0, r2 - 8002396: f7ff fc2f bl 8001bf8 + 80022a8: 68bb ldr r3, [r7, #8] + 80022aa: 6adb ldr r3, [r3, #44] ; 0x2c + 80022ac: 2201 movs r2, #1 + 80022ae: 409a lsls r2, r3 + 80022b0: 4b23 ldr r3, [pc, #140] ; (8002340 ) + 80022b2: 681b ldr r3, [r3, #0] + 80022b4: 4313 orrs r3, r2 + 80022b6: 4a22 ldr r2, [pc, #136] ; (8002340 ) + 80022b8: 6013 str r3, [r2, #0] + 80022ba: 68bb ldr r3, [r7, #8] + 80022bc: 6ada ldr r2, [r3, #44] ; 0x2c + 80022be: 4613 mov r3, r2 + 80022c0: 009b lsls r3, r3, #2 + 80022c2: 4413 add r3, r2 + 80022c4: 009b lsls r3, r3, #2 + 80022c6: 4a1f ldr r2, [pc, #124] ; (8002344 ) + 80022c8: 441a add r2, r3 + 80022ca: 68bb ldr r3, [r7, #8] + 80022cc: 3304 adds r3, #4 + 80022ce: 4619 mov r1, r3 + 80022d0: 4610 mov r0, r2 + 80022d2: f7ff fc2f bl 8001b34 { /* Preemption is on, but a context switch should only be performed if the unblocked task has a priority that is equal to or higher than the currently executing task. */ if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) - 800239a: 68bb ldr r3, [r7, #8] - 800239c: 6ada ldr r2, [r3, #44] ; 0x2c - 800239e: 4b1b ldr r3, [pc, #108] ; (800240c ) - 80023a0: 681b ldr r3, [r3, #0] - 80023a2: 6adb ldr r3, [r3, #44] ; 0x2c - 80023a4: 429a cmp r2, r3 - 80023a6: d3b9 bcc.n 800231c + 80022d6: 68bb ldr r3, [r7, #8] + 80022d8: 6ada ldr r2, [r3, #44] ; 0x2c + 80022da: 4b1b ldr r3, [pc, #108] ; (8002348 ) + 80022dc: 681b ldr r3, [r3, #0] + 80022de: 6adb ldr r3, [r3, #44] ; 0x2c + 80022e0: 429a cmp r2, r3 + 80022e2: d3b9 bcc.n 8002258 { xSwitchRequired = pdTRUE; - 80023a8: 2301 movs r3, #1 - 80023aa: 617b str r3, [r7, #20] + 80022e4: 2301 movs r3, #1 + 80022e6: 617b str r3, [r7, #20] if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) - 80023ac: e7b6 b.n 800231c + 80022e8: e7b6 b.n 8002258 /* Tasks of equal priority to the currently running task will share processing time (time slice) if preemption is on, and the application writer has not explicitly turned time slicing off. */ #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) { if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( UBaseType_t ) 1 ) - 80023ae: 4b17 ldr r3, [pc, #92] ; (800240c ) - 80023b0: 681b ldr r3, [r3, #0] - 80023b2: 6ada ldr r2, [r3, #44] ; 0x2c - 80023b4: 4914 ldr r1, [pc, #80] ; (8002408 ) - 80023b6: 4613 mov r3, r2 - 80023b8: 009b lsls r3, r3, #2 - 80023ba: 4413 add r3, r2 - 80023bc: 009b lsls r3, r3, #2 - 80023be: 440b add r3, r1 - 80023c0: 681b ldr r3, [r3, #0] - 80023c2: 2b01 cmp r3, #1 - 80023c4: d901 bls.n 80023ca + 80022ea: 4b17 ldr r3, [pc, #92] ; (8002348 ) + 80022ec: 681b ldr r3, [r3, #0] + 80022ee: 6ada ldr r2, [r3, #44] ; 0x2c + 80022f0: 4914 ldr r1, [pc, #80] ; (8002344 ) + 80022f2: 4613 mov r3, r2 + 80022f4: 009b lsls r3, r3, #2 + 80022f6: 4413 add r3, r2 + 80022f8: 009b lsls r3, r3, #2 + 80022fa: 440b add r3, r1 + 80022fc: 681b ldr r3, [r3, #0] + 80022fe: 2b01 cmp r3, #1 + 8002300: d901 bls.n 8002306 { xSwitchRequired = pdTRUE; - 80023c6: 2301 movs r3, #1 - 80023c8: 617b str r3, [r7, #20] + 8002302: 2301 movs r3, #1 + 8002304: 617b str r3, [r7, #20] } #endif /* configUSE_TICK_HOOK */ #if ( configUSE_PREEMPTION == 1 ) { if( xYieldPending != pdFALSE ) - 80023ca: 4b11 ldr r3, [pc, #68] ; (8002410 ) - 80023cc: 681b ldr r3, [r3, #0] - 80023ce: 2b00 cmp r3, #0 - 80023d0: d007 beq.n 80023e2 + 8002306: 4b11 ldr r3, [pc, #68] ; (800234c ) + 8002308: 681b ldr r3, [r3, #0] + 800230a: 2b00 cmp r3, #0 + 800230c: d007 beq.n 800231e { xSwitchRequired = pdTRUE; - 80023d2: 2301 movs r3, #1 - 80023d4: 617b str r3, [r7, #20] - 80023d6: e004 b.n 80023e2 + 800230e: 2301 movs r3, #1 + 8002310: 617b str r3, [r7, #20] + 8002312: e004 b.n 800231e } #endif /* configUSE_PREEMPTION */ } else { ++xPendedTicks; - 80023d8: 4b0e ldr r3, [pc, #56] ; (8002414 ) - 80023da: 681b ldr r3, [r3, #0] - 80023dc: 3301 adds r3, #1 - 80023de: 4a0d ldr r2, [pc, #52] ; (8002414 ) - 80023e0: 6013 str r3, [r2, #0] + 8002314: 4b0e ldr r3, [pc, #56] ; (8002350 ) + 8002316: 681b ldr r3, [r3, #0] + 8002318: 3301 adds r3, #1 + 800231a: 4a0d ldr r2, [pc, #52] ; (8002350 ) + 800231c: 6013 str r3, [r2, #0] vApplicationTickHook(); } #endif } return xSwitchRequired; - 80023e2: 697b ldr r3, [r7, #20] + 800231e: 697b ldr r3, [r7, #20] } - 80023e4: 4618 mov r0, r3 - 80023e6: 3718 adds r7, #24 - 80023e8: 46bd mov sp, r7 - 80023ea: bd80 pop {r7, pc} - 80023ec: 200003b4 .word 0x200003b4 - 80023f0: 20000390 .word 0x20000390 - 80023f4: 20000344 .word 0x20000344 - 80023f8: 20000348 .word 0x20000348 - 80023fc: 200003a4 .word 0x200003a4 - 8002400: 200003ac .word 0x200003ac - 8002404: 20000394 .word 0x20000394 - 8002408: 20000290 .word 0x20000290 - 800240c: 2000028c .word 0x2000028c - 8002410: 200003a0 .word 0x200003a0 - 8002414: 2000039c .word 0x2000039c - -08002418 : + 8002320: 4618 mov r0, r3 + 8002322: 3718 adds r7, #24 + 8002324: 46bd mov sp, r7 + 8002326: bd80 pop {r7, pc} + 8002328: 200003b4 .word 0x200003b4 + 800232c: 20000390 .word 0x20000390 + 8002330: 20000344 .word 0x20000344 + 8002334: 20000348 .word 0x20000348 + 8002338: 200003a4 .word 0x200003a4 + 800233c: 200003ac .word 0x200003ac + 8002340: 20000394 .word 0x20000394 + 8002344: 20000290 .word 0x20000290 + 8002348: 2000028c .word 0x2000028c + 800234c: 200003a0 .word 0x200003a0 + 8002350: 2000039c .word 0x2000039c + +08002354 : #endif /* configUSE_APPLICATION_TASK_TAG */ /*-----------------------------------------------------------*/ void vTaskSwitchContext( void ) { - 8002418: b480 push {r7} - 800241a: b087 sub sp, #28 - 800241c: af00 add r7, sp, #0 + 8002354: b480 push {r7} + 8002356: b087 sub sp, #28 + 8002358: af00 add r7, sp, #0 if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE ) - 800241e: 4b27 ldr r3, [pc, #156] ; (80024bc ) - 8002420: 681b ldr r3, [r3, #0] - 8002422: 2b00 cmp r3, #0 - 8002424: d003 beq.n 800242e + 800235a: 4b27 ldr r3, [pc, #156] ; (80023f8 ) + 800235c: 681b ldr r3, [r3, #0] + 800235e: 2b00 cmp r3, #0 + 8002360: d003 beq.n 800236a { /* The scheduler is currently suspended - do not allow a context switch. */ xYieldPending = pdTRUE; - 8002426: 4b26 ldr r3, [pc, #152] ; (80024c0 ) - 8002428: 2201 movs r2, #1 - 800242a: 601a str r2, [r3, #0] + 8002362: 4b26 ldr r3, [pc, #152] ; (80023fc ) + 8002364: 2201 movs r2, #1 + 8002366: 601a str r2, [r3, #0] for additional information. */ _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); } #endif /* configUSE_NEWLIB_REENTRANT */ } } - 800242c: e03f b.n 80024ae + 8002368: e03f b.n 80023ea xYieldPending = pdFALSE; - 800242e: 4b24 ldr r3, [pc, #144] ; (80024c0 ) - 8002430: 2200 movs r2, #0 - 8002432: 601a str r2, [r3, #0] + 800236a: 4b24 ldr r3, [pc, #144] ; (80023fc ) + 800236c: 2200 movs r2, #0 + 800236e: 601a str r2, [r3, #0] taskSELECT_HIGHEST_PRIORITY_TASK(); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - 8002434: 4b23 ldr r3, [pc, #140] ; (80024c4 ) - 8002436: 681b ldr r3, [r3, #0] - 8002438: 60fb str r3, [r7, #12] + 8002370: 4b23 ldr r3, [pc, #140] ; (8002400 ) + 8002372: 681b ldr r3, [r3, #0] + 8002374: 60fb str r3, [r7, #12] __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) : "memory" ); - 800243a: 68fb ldr r3, [r7, #12] - 800243c: fab3 f383 clz r3, r3 - 8002440: 72fb strb r3, [r7, #11] + 8002376: 68fb ldr r3, [r7, #12] + 8002378: fab3 f383 clz r3, r3 + 800237c: 72fb strb r3, [r7, #11] return ucReturn; - 8002442: 7afb ldrb r3, [r7, #11] - 8002444: f1c3 031f rsb r3, r3, #31 - 8002448: 617b str r3, [r7, #20] - 800244a: 491f ldr r1, [pc, #124] ; (80024c8 ) - 800244c: 697a ldr r2, [r7, #20] - 800244e: 4613 mov r3, r2 - 8002450: 009b lsls r3, r3, #2 - 8002452: 4413 add r3, r2 - 8002454: 009b lsls r3, r3, #2 - 8002456: 440b add r3, r1 - 8002458: 681b ldr r3, [r3, #0] - 800245a: 2b00 cmp r3, #0 - 800245c: d10a bne.n 8002474 + 800237e: 7afb ldrb r3, [r7, #11] + 8002380: f1c3 031f rsb r3, r3, #31 + 8002384: 617b str r3, [r7, #20] + 8002386: 491f ldr r1, [pc, #124] ; (8002404 ) + 8002388: 697a ldr r2, [r7, #20] + 800238a: 4613 mov r3, r2 + 800238c: 009b lsls r3, r3, #2 + 800238e: 4413 add r3, r2 + 8002390: 009b lsls r3, r3, #2 + 8002392: 440b add r3, r1 + 8002394: 681b ldr r3, [r3, #0] + 8002396: 2b00 cmp r3, #0 + 8002398: d10a bne.n 80023b0 __asm volatile - 800245e: f04f 0350 mov.w r3, #80 ; 0x50 - 8002462: f383 8811 msr BASEPRI, r3 - 8002466: f3bf 8f6f isb sy - 800246a: f3bf 8f4f dsb sy - 800246e: 607b str r3, [r7, #4] + 800239a: f04f 0350 mov.w r3, #80 ; 0x50 + 800239e: f383 8811 msr BASEPRI, r3 + 80023a2: f3bf 8f6f isb sy + 80023a6: f3bf 8f4f dsb sy + 80023aa: 607b str r3, [r7, #4] } - 8002470: bf00 nop - 8002472: e7fe b.n 8002472 - 8002474: 697a ldr r2, [r7, #20] - 8002476: 4613 mov r3, r2 - 8002478: 009b lsls r3, r3, #2 - 800247a: 4413 add r3, r2 - 800247c: 009b lsls r3, r3, #2 - 800247e: 4a12 ldr r2, [pc, #72] ; (80024c8 ) - 8002480: 4413 add r3, r2 - 8002482: 613b str r3, [r7, #16] - 8002484: 693b ldr r3, [r7, #16] - 8002486: 685b ldr r3, [r3, #4] - 8002488: 685a ldr r2, [r3, #4] - 800248a: 693b ldr r3, [r7, #16] - 800248c: 605a str r2, [r3, #4] - 800248e: 693b ldr r3, [r7, #16] - 8002490: 685a ldr r2, [r3, #4] - 8002492: 693b ldr r3, [r7, #16] - 8002494: 3308 adds r3, #8 - 8002496: 429a cmp r2, r3 - 8002498: d104 bne.n 80024a4 - 800249a: 693b ldr r3, [r7, #16] - 800249c: 685b ldr r3, [r3, #4] - 800249e: 685a ldr r2, [r3, #4] - 80024a0: 693b ldr r3, [r7, #16] - 80024a2: 605a str r2, [r3, #4] - 80024a4: 693b ldr r3, [r7, #16] - 80024a6: 685b ldr r3, [r3, #4] - 80024a8: 68db ldr r3, [r3, #12] - 80024aa: 4a08 ldr r2, [pc, #32] ; (80024cc ) - 80024ac: 6013 str r3, [r2, #0] + 80023ac: bf00 nop + 80023ae: e7fe b.n 80023ae + 80023b0: 697a ldr r2, [r7, #20] + 80023b2: 4613 mov r3, r2 + 80023b4: 009b lsls r3, r3, #2 + 80023b6: 4413 add r3, r2 + 80023b8: 009b lsls r3, r3, #2 + 80023ba: 4a12 ldr r2, [pc, #72] ; (8002404 ) + 80023bc: 4413 add r3, r2 + 80023be: 613b str r3, [r7, #16] + 80023c0: 693b ldr r3, [r7, #16] + 80023c2: 685b ldr r3, [r3, #4] + 80023c4: 685a ldr r2, [r3, #4] + 80023c6: 693b ldr r3, [r7, #16] + 80023c8: 605a str r2, [r3, #4] + 80023ca: 693b ldr r3, [r7, #16] + 80023cc: 685a ldr r2, [r3, #4] + 80023ce: 693b ldr r3, [r7, #16] + 80023d0: 3308 adds r3, #8 + 80023d2: 429a cmp r2, r3 + 80023d4: d104 bne.n 80023e0 + 80023d6: 693b ldr r3, [r7, #16] + 80023d8: 685b ldr r3, [r3, #4] + 80023da: 685a ldr r2, [r3, #4] + 80023dc: 693b ldr r3, [r7, #16] + 80023de: 605a str r2, [r3, #4] + 80023e0: 693b ldr r3, [r7, #16] + 80023e2: 685b ldr r3, [r3, #4] + 80023e4: 68db ldr r3, [r3, #12] + 80023e6: 4a08 ldr r2, [pc, #32] ; (8002408 ) + 80023e8: 6013 str r3, [r2, #0] } - 80024ae: bf00 nop - 80024b0: 371c adds r7, #28 - 80024b2: 46bd mov sp, r7 - 80024b4: f85d 7b04 ldr.w r7, [sp], #4 - 80024b8: 4770 bx lr - 80024ba: bf00 nop - 80024bc: 200003b4 .word 0x200003b4 - 80024c0: 200003a0 .word 0x200003a0 - 80024c4: 20000394 .word 0x20000394 - 80024c8: 20000290 .word 0x20000290 - 80024cc: 2000028c .word 0x2000028c - -080024d0 : + 80023ea: bf00 nop + 80023ec: 371c adds r7, #28 + 80023ee: 46bd mov sp, r7 + 80023f0: f85d 7b04 ldr.w r7, [sp], #4 + 80023f4: 4770 bx lr + 80023f6: bf00 nop + 80023f8: 200003b4 .word 0x200003b4 + 80023fc: 200003a0 .word 0x200003a0 + 8002400: 20000394 .word 0x20000394 + 8002404: 20000290 .word 0x20000290 + 8002408: 2000028c .word 0x2000028c + +0800240c : * * void prvIdleTask( void *pvParameters ); * */ static portTASK_FUNCTION( prvIdleTask, pvParameters ) { - 80024d0: b580 push {r7, lr} - 80024d2: b082 sub sp, #8 - 80024d4: af00 add r7, sp, #0 - 80024d6: 6078 str r0, [r7, #4] + 800240c: b580 push {r7, lr} + 800240e: b082 sub sp, #8 + 8002410: af00 add r7, sp, #0 + 8002412: 6078 str r0, [r7, #4] for( ;; ) { /* See if any tasks have deleted themselves - if so then the idle task is responsible for freeing the deleted task's TCB and stack. */ prvCheckTasksWaitingTermination(); - 80024d8: f000 f852 bl 8002580 + 8002414: f000 f852 bl 80024bc A critical region is not required here as we are just reading from the list, and an occasional incorrect value will not matter. If the ready list at the idle priority contains more than one task then a task other than the idle task is ready to execute. */ if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 ) - 80024dc: 4b06 ldr r3, [pc, #24] ; (80024f8 ) - 80024de: 681b ldr r3, [r3, #0] - 80024e0: 2b01 cmp r3, #1 - 80024e2: d9f9 bls.n 80024d8 + 8002418: 4b06 ldr r3, [pc, #24] ; (8002434 ) + 800241a: 681b ldr r3, [r3, #0] + 800241c: 2b01 cmp r3, #1 + 800241e: d9f9 bls.n 8002414 { taskYIELD(); - 80024e4: 4b05 ldr r3, [pc, #20] ; (80024fc ) - 80024e6: f04f 5280 mov.w r2, #268435456 ; 0x10000000 - 80024ea: 601a str r2, [r3, #0] - 80024ec: f3bf 8f4f dsb sy - 80024f0: f3bf 8f6f isb sy + 8002420: 4b05 ldr r3, [pc, #20] ; (8002438 ) + 8002422: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 8002426: 601a str r2, [r3, #0] + 8002428: f3bf 8f4f dsb sy + 800242c: f3bf 8f6f isb sy prvCheckTasksWaitingTermination(); - 80024f4: e7f0 b.n 80024d8 - 80024f6: bf00 nop - 80024f8: 20000290 .word 0x20000290 - 80024fc: e000ed04 .word 0xe000ed04 + 8002430: e7f0 b.n 8002414 + 8002432: bf00 nop + 8002434: 20000290 .word 0x20000290 + 8002438: e000ed04 .word 0xe000ed04 -08002500 : +0800243c : #endif /* portUSING_MPU_WRAPPERS */ /*-----------------------------------------------------------*/ static void prvInitialiseTaskLists( void ) { - 8002500: b580 push {r7, lr} - 8002502: b082 sub sp, #8 - 8002504: af00 add r7, sp, #0 + 800243c: b580 push {r7, lr} + 800243e: b082 sub sp, #8 + 8002440: af00 add r7, sp, #0 UBaseType_t uxPriority; for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) - 8002506: 2300 movs r3, #0 - 8002508: 607b str r3, [r7, #4] - 800250a: e00c b.n 8002526 + 8002442: 2300 movs r3, #0 + 8002444: 607b str r3, [r7, #4] + 8002446: e00c b.n 8002462 { vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); - 800250c: 687a ldr r2, [r7, #4] - 800250e: 4613 mov r3, r2 - 8002510: 009b lsls r3, r3, #2 - 8002512: 4413 add r3, r2 - 8002514: 009b lsls r3, r3, #2 - 8002516: 4a12 ldr r2, [pc, #72] ; (8002560 ) - 8002518: 4413 add r3, r2 - 800251a: 4618 mov r0, r3 - 800251c: f7ff fb3f bl 8001b9e + 8002448: 687a ldr r2, [r7, #4] + 800244a: 4613 mov r3, r2 + 800244c: 009b lsls r3, r3, #2 + 800244e: 4413 add r3, r2 + 8002450: 009b lsls r3, r3, #2 + 8002452: 4a12 ldr r2, [pc, #72] ; (800249c ) + 8002454: 4413 add r3, r2 + 8002456: 4618 mov r0, r3 + 8002458: f7ff fb3f bl 8001ada for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ ) - 8002520: 687b ldr r3, [r7, #4] - 8002522: 3301 adds r3, #1 - 8002524: 607b str r3, [r7, #4] - 8002526: 687b ldr r3, [r7, #4] - 8002528: 2b06 cmp r3, #6 - 800252a: d9ef bls.n 800250c + 800245c: 687b ldr r3, [r7, #4] + 800245e: 3301 adds r3, #1 + 8002460: 607b str r3, [r7, #4] + 8002462: 687b ldr r3, [r7, #4] + 8002464: 2b06 cmp r3, #6 + 8002466: d9ef bls.n 8002448 } vListInitialise( &xDelayedTaskList1 ); - 800252c: 480d ldr r0, [pc, #52] ; (8002564 ) - 800252e: f7ff fb36 bl 8001b9e + 8002468: 480d ldr r0, [pc, #52] ; (80024a0 ) + 800246a: f7ff fb36 bl 8001ada vListInitialise( &xDelayedTaskList2 ); - 8002532: 480d ldr r0, [pc, #52] ; (8002568 ) - 8002534: f7ff fb33 bl 8001b9e + 800246e: 480d ldr r0, [pc, #52] ; (80024a4 ) + 8002470: f7ff fb33 bl 8001ada vListInitialise( &xPendingReadyList ); - 8002538: 480c ldr r0, [pc, #48] ; (800256c ) - 800253a: f7ff fb30 bl 8001b9e + 8002474: 480c ldr r0, [pc, #48] ; (80024a8 ) + 8002476: f7ff fb30 bl 8001ada #if ( INCLUDE_vTaskDelete == 1 ) { vListInitialise( &xTasksWaitingTermination ); - 800253e: 480c ldr r0, [pc, #48] ; (8002570 ) - 8002540: f7ff fb2d bl 8001b9e + 800247a: 480c ldr r0, [pc, #48] ; (80024ac ) + 800247c: f7ff fb2d bl 8001ada } #endif /* INCLUDE_vTaskDelete */ #if ( INCLUDE_vTaskSuspend == 1 ) { vListInitialise( &xSuspendedTaskList ); - 8002544: 480b ldr r0, [pc, #44] ; (8002574 ) - 8002546: f7ff fb2a bl 8001b9e + 8002480: 480b ldr r0, [pc, #44] ; (80024b0 ) + 8002482: f7ff fb2a bl 8001ada } #endif /* INCLUDE_vTaskSuspend */ /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList using list2. */ pxDelayedTaskList = &xDelayedTaskList1; - 800254a: 4b0b ldr r3, [pc, #44] ; (8002578 ) - 800254c: 4a05 ldr r2, [pc, #20] ; (8002564 ) - 800254e: 601a str r2, [r3, #0] + 8002486: 4b0b ldr r3, [pc, #44] ; (80024b4 ) + 8002488: 4a05 ldr r2, [pc, #20] ; (80024a0 ) + 800248a: 601a str r2, [r3, #0] pxOverflowDelayedTaskList = &xDelayedTaskList2; - 8002550: 4b0a ldr r3, [pc, #40] ; (800257c ) - 8002552: 4a05 ldr r2, [pc, #20] ; (8002568 ) - 8002554: 601a str r2, [r3, #0] + 800248c: 4b0a ldr r3, [pc, #40] ; (80024b8 ) + 800248e: 4a05 ldr r2, [pc, #20] ; (80024a4 ) + 8002490: 601a str r2, [r3, #0] } - 8002556: bf00 nop - 8002558: 3708 adds r7, #8 - 800255a: 46bd mov sp, r7 - 800255c: bd80 pop {r7, pc} - 800255e: bf00 nop - 8002560: 20000290 .word 0x20000290 - 8002564: 2000031c .word 0x2000031c - 8002568: 20000330 .word 0x20000330 - 800256c: 2000034c .word 0x2000034c - 8002570: 20000360 .word 0x20000360 - 8002574: 20000378 .word 0x20000378 - 8002578: 20000344 .word 0x20000344 - 800257c: 20000348 .word 0x20000348 - -08002580 : + 8002492: bf00 nop + 8002494: 3708 adds r7, #8 + 8002496: 46bd mov sp, r7 + 8002498: bd80 pop {r7, pc} + 800249a: bf00 nop + 800249c: 20000290 .word 0x20000290 + 80024a0: 2000031c .word 0x2000031c + 80024a4: 20000330 .word 0x20000330 + 80024a8: 2000034c .word 0x2000034c + 80024ac: 20000360 .word 0x20000360 + 80024b0: 20000378 .word 0x20000378 + 80024b4: 20000344 .word 0x20000344 + 80024b8: 20000348 .word 0x20000348 + +080024bc : /*-----------------------------------------------------------*/ static void prvCheckTasksWaitingTermination( void ) { - 8002580: b580 push {r7, lr} - 8002582: b082 sub sp, #8 - 8002584: af00 add r7, sp, #0 + 80024bc: b580 push {r7, lr} + 80024be: b082 sub sp, #8 + 80024c0: af00 add r7, sp, #0 { TCB_t *pxTCB; /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL() being called too often in the idle task. */ while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) - 8002586: e019 b.n 80025bc + 80024c2: e019 b.n 80024f8 { taskENTER_CRITICAL(); - 8002588: f000 fa2c bl 80029e4 + 80024c4: f000 fa26 bl 8002914 { pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - 800258c: 4b10 ldr r3, [pc, #64] ; (80025d0 ) - 800258e: 68db ldr r3, [r3, #12] - 8002590: 68db ldr r3, [r3, #12] - 8002592: 607b str r3, [r7, #4] + 80024c8: 4b10 ldr r3, [pc, #64] ; (800250c ) + 80024ca: 68db ldr r3, [r3, #12] + 80024cc: 68db ldr r3, [r3, #12] + 80024ce: 607b str r3, [r7, #4] ( void ) uxListRemove( &( pxTCB->xStateListItem ) ); - 8002594: 687b ldr r3, [r7, #4] - 8002596: 3304 adds r3, #4 - 8002598: 4618 mov r0, r3 - 800259a: f7ff fb8a bl 8001cb2 + 80024d0: 687b ldr r3, [r7, #4] + 80024d2: 3304 adds r3, #4 + 80024d4: 4618 mov r0, r3 + 80024d6: f7ff fb8a bl 8001bee --uxCurrentNumberOfTasks; - 800259e: 4b0d ldr r3, [pc, #52] ; (80025d4 ) - 80025a0: 681b ldr r3, [r3, #0] - 80025a2: 3b01 subs r3, #1 - 80025a4: 4a0b ldr r2, [pc, #44] ; (80025d4 ) - 80025a6: 6013 str r3, [r2, #0] + 80024da: 4b0d ldr r3, [pc, #52] ; (8002510 ) + 80024dc: 681b ldr r3, [r3, #0] + 80024de: 3b01 subs r3, #1 + 80024e0: 4a0b ldr r2, [pc, #44] ; (8002510 ) + 80024e2: 6013 str r3, [r2, #0] --uxDeletedTasksWaitingCleanUp; - 80025a8: 4b0b ldr r3, [pc, #44] ; (80025d8 ) - 80025aa: 681b ldr r3, [r3, #0] - 80025ac: 3b01 subs r3, #1 - 80025ae: 4a0a ldr r2, [pc, #40] ; (80025d8 ) - 80025b0: 6013 str r3, [r2, #0] + 80024e4: 4b0b ldr r3, [pc, #44] ; (8002514 ) + 80024e6: 681b ldr r3, [r3, #0] + 80024e8: 3b01 subs r3, #1 + 80024ea: 4a0a ldr r2, [pc, #40] ; (8002514 ) + 80024ec: 6013 str r3, [r2, #0] } taskEXIT_CRITICAL(); - 80025b2: f000 fa47 bl 8002a44 + 80024ee: f000 fa41 bl 8002974 prvDeleteTCB( pxTCB ); - 80025b6: 6878 ldr r0, [r7, #4] - 80025b8: f000 f810 bl 80025dc + 80024f2: 6878 ldr r0, [r7, #4] + 80024f4: f000 f810 bl 8002518 while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U ) - 80025bc: 4b06 ldr r3, [pc, #24] ; (80025d8 ) - 80025be: 681b ldr r3, [r3, #0] - 80025c0: 2b00 cmp r3, #0 - 80025c2: d1e1 bne.n 8002588 + 80024f8: 4b06 ldr r3, [pc, #24] ; (8002514 ) + 80024fa: 681b ldr r3, [r3, #0] + 80024fc: 2b00 cmp r3, #0 + 80024fe: d1e1 bne.n 80024c4 } } #endif /* INCLUDE_vTaskDelete */ } - 80025c4: bf00 nop - 80025c6: bf00 nop - 80025c8: 3708 adds r7, #8 - 80025ca: 46bd mov sp, r7 - 80025cc: bd80 pop {r7, pc} - 80025ce: bf00 nop - 80025d0: 20000360 .word 0x20000360 - 80025d4: 2000038c .word 0x2000038c - 80025d8: 20000374 .word 0x20000374 - -080025dc : + 8002500: bf00 nop + 8002502: bf00 nop + 8002504: 3708 adds r7, #8 + 8002506: 46bd mov sp, r7 + 8002508: bd80 pop {r7, pc} + 800250a: bf00 nop + 800250c: 20000360 .word 0x20000360 + 8002510: 2000038c .word 0x2000038c + 8002514: 20000374 .word 0x20000374 + +08002518 : /*-----------------------------------------------------------*/ #if ( INCLUDE_vTaskDelete == 1 ) static void prvDeleteTCB( TCB_t *pxTCB ) { - 80025dc: b580 push {r7, lr} - 80025de: b084 sub sp, #16 - 80025e0: af00 add r7, sp, #0 - 80025e2: 6078 str r0, [r7, #4] + 8002518: b580 push {r7, lr} + 800251a: b084 sub sp, #16 + 800251c: af00 add r7, sp, #0 + 800251e: 6078 str r0, [r7, #4] #elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */ { /* The task could have been allocated statically or dynamically, so check what was statically allocated before trying to free the memory. */ if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB ) - 80025e4: 687b ldr r3, [r7, #4] - 80025e6: f893 3051 ldrb.w r3, [r3, #81] ; 0x51 - 80025ea: 2b00 cmp r3, #0 - 80025ec: d108 bne.n 8002600 + 8002520: 687b ldr r3, [r7, #4] + 8002522: f893 3051 ldrb.w r3, [r3, #81] ; 0x51 + 8002526: 2b00 cmp r3, #0 + 8002528: d108 bne.n 800253c { /* Both the stack and TCB were allocated dynamically, so both must be freed. */ vPortFree( pxTCB->pxStack ); - 80025ee: 687b ldr r3, [r7, #4] - 80025f0: 6b1b ldr r3, [r3, #48] ; 0x30 - 80025f2: 4618 mov r0, r3 - 80025f4: f000 fba4 bl 8002d40 + 800252a: 687b ldr r3, [r7, #4] + 800252c: 6b1b ldr r3, [r3, #48] ; 0x30 + 800252e: 4618 mov r0, r3 + 8002530: f000 fb9e bl 8002c70 vPortFree( pxTCB ); - 80025f8: 6878 ldr r0, [r7, #4] - 80025fa: f000 fba1 bl 8002d40 + 8002534: 6878 ldr r0, [r7, #4] + 8002536: f000 fb9b bl 8002c70 configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); mtCOVERAGE_TEST_MARKER(); } } #endif /* configSUPPORT_DYNAMIC_ALLOCATION */ } - 80025fe: e018 b.n 8002632 + 800253a: e018 b.n 800256e else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY ) - 8002600: 687b ldr r3, [r7, #4] - 8002602: f893 3051 ldrb.w r3, [r3, #81] ; 0x51 - 8002606: 2b01 cmp r3, #1 - 8002608: d103 bne.n 8002612 + 800253c: 687b ldr r3, [r7, #4] + 800253e: f893 3051 ldrb.w r3, [r3, #81] ; 0x51 + 8002542: 2b01 cmp r3, #1 + 8002544: d103 bne.n 800254e vPortFree( pxTCB ); - 800260a: 6878 ldr r0, [r7, #4] - 800260c: f000 fb98 bl 8002d40 + 8002546: 6878 ldr r0, [r7, #4] + 8002548: f000 fb92 bl 8002c70 } - 8002610: e00f b.n 8002632 + 800254c: e00f b.n 800256e configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB ); - 8002612: 687b ldr r3, [r7, #4] - 8002614: f893 3051 ldrb.w r3, [r3, #81] ; 0x51 - 8002618: 2b02 cmp r3, #2 - 800261a: d00a beq.n 8002632 + 800254e: 687b ldr r3, [r7, #4] + 8002550: f893 3051 ldrb.w r3, [r3, #81] ; 0x51 + 8002554: 2b02 cmp r3, #2 + 8002556: d00a beq.n 800256e __asm volatile - 800261c: f04f 0350 mov.w r3, #80 ; 0x50 - 8002620: f383 8811 msr BASEPRI, r3 - 8002624: f3bf 8f6f isb sy - 8002628: f3bf 8f4f dsb sy - 800262c: 60fb str r3, [r7, #12] + 8002558: f04f 0350 mov.w r3, #80 ; 0x50 + 800255c: f383 8811 msr BASEPRI, r3 + 8002560: f3bf 8f6f isb sy + 8002564: f3bf 8f4f dsb sy + 8002568: 60fb str r3, [r7, #12] } - 800262e: bf00 nop - 8002630: e7fe b.n 8002630 + 800256a: bf00 nop + 800256c: e7fe b.n 800256c } - 8002632: bf00 nop - 8002634: 3710 adds r7, #16 - 8002636: 46bd mov sp, r7 - 8002638: bd80 pop {r7, pc} + 800256e: bf00 nop + 8002570: 3710 adds r7, #16 + 8002572: 46bd mov sp, r7 + 8002574: bd80 pop {r7, pc} ... -0800263c : +08002578 : #endif /* INCLUDE_vTaskDelete */ /*-----------------------------------------------------------*/ static void prvResetNextTaskUnblockTime( void ) { - 800263c: b480 push {r7} - 800263e: b083 sub sp, #12 - 8002640: af00 add r7, sp, #0 + 8002578: b480 push {r7} + 800257a: b083 sub sp, #12 + 800257c: af00 add r7, sp, #0 TCB_t *pxTCB; if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) - 8002642: 4b0c ldr r3, [pc, #48] ; (8002674 ) - 8002644: 681b ldr r3, [r3, #0] - 8002646: 681b ldr r3, [r3, #0] - 8002648: 2b00 cmp r3, #0 - 800264a: d104 bne.n 8002656 + 800257e: 4b0c ldr r3, [pc, #48] ; (80025b0 ) + 8002580: 681b ldr r3, [r3, #0] + 8002582: 681b ldr r3, [r3, #0] + 8002584: 2b00 cmp r3, #0 + 8002586: d104 bne.n 8002592 { /* The new current delayed list is empty. Set xNextTaskUnblockTime to the maximum possible value so it is extremely unlikely that the if( xTickCount >= xNextTaskUnblockTime ) test will pass until there is an item in the delayed list. */ xNextTaskUnblockTime = portMAX_DELAY; - 800264c: 4b0a ldr r3, [pc, #40] ; (8002678 ) - 800264e: f04f 32ff mov.w r2, #4294967295 - 8002652: 601a str r2, [r3, #0] + 8002588: 4b0a ldr r3, [pc, #40] ; (80025b4 ) + 800258a: f04f 32ff mov.w r2, #4294967295 + 800258e: 601a str r2, [r3, #0] which the task at the head of the delayed list should be removed from the Blocked state. */ ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); } } - 8002654: e008 b.n 8002668 + 8002590: e008 b.n 80025a4 ( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ - 8002656: 4b07 ldr r3, [pc, #28] ; (8002674 ) - 8002658: 681b ldr r3, [r3, #0] - 800265a: 68db ldr r3, [r3, #12] - 800265c: 68db ldr r3, [r3, #12] - 800265e: 607b str r3, [r7, #4] + 8002592: 4b07 ldr r3, [pc, #28] ; (80025b0 ) + 8002594: 681b ldr r3, [r3, #0] + 8002596: 68db ldr r3, [r3, #12] + 8002598: 68db ldr r3, [r3, #12] + 800259a: 607b str r3, [r7, #4] xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) ); - 8002660: 687b ldr r3, [r7, #4] - 8002662: 685b ldr r3, [r3, #4] - 8002664: 4a04 ldr r2, [pc, #16] ; (8002678 ) - 8002666: 6013 str r3, [r2, #0] + 800259c: 687b ldr r3, [r7, #4] + 800259e: 685b ldr r3, [r3, #4] + 80025a0: 4a04 ldr r2, [pc, #16] ; (80025b4 ) + 80025a2: 6013 str r3, [r2, #0] } - 8002668: bf00 nop - 800266a: 370c adds r7, #12 - 800266c: 46bd mov sp, r7 - 800266e: f85d 7b04 ldr.w r7, [sp], #4 - 8002672: 4770 bx lr - 8002674: 20000344 .word 0x20000344 - 8002678: 200003ac .word 0x200003ac - -0800267c : + 80025a4: bf00 nop + 80025a6: 370c adds r7, #12 + 80025a8: 46bd mov sp, r7 + 80025aa: f85d 7b04 ldr.w r7, [sp], #4 + 80025ae: 4770 bx lr + 80025b0: 20000344 .word 0x20000344 + 80025b4: 200003ac .word 0x200003ac + +080025b8 : /*-----------------------------------------------------------*/ #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) BaseType_t xTaskGetSchedulerState( void ) { - 800267c: b480 push {r7} - 800267e: b083 sub sp, #12 - 8002680: af00 add r7, sp, #0 + 80025b8: b480 push {r7} + 80025ba: b083 sub sp, #12 + 80025bc: af00 add r7, sp, #0 BaseType_t xReturn; if( xSchedulerRunning == pdFALSE ) - 8002682: 4b0b ldr r3, [pc, #44] ; (80026b0 ) - 8002684: 681b ldr r3, [r3, #0] - 8002686: 2b00 cmp r3, #0 - 8002688: d102 bne.n 8002690 + 80025be: 4b0b ldr r3, [pc, #44] ; (80025ec ) + 80025c0: 681b ldr r3, [r3, #0] + 80025c2: 2b00 cmp r3, #0 + 80025c4: d102 bne.n 80025cc { xReturn = taskSCHEDULER_NOT_STARTED; - 800268a: 2301 movs r3, #1 - 800268c: 607b str r3, [r7, #4] - 800268e: e008 b.n 80026a2 + 80025c6: 2301 movs r3, #1 + 80025c8: 607b str r3, [r7, #4] + 80025ca: e008 b.n 80025de } else { if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) - 8002690: 4b08 ldr r3, [pc, #32] ; (80026b4 ) - 8002692: 681b ldr r3, [r3, #0] - 8002694: 2b00 cmp r3, #0 - 8002696: d102 bne.n 800269e + 80025cc: 4b08 ldr r3, [pc, #32] ; (80025f0 ) + 80025ce: 681b ldr r3, [r3, #0] + 80025d0: 2b00 cmp r3, #0 + 80025d2: d102 bne.n 80025da { xReturn = taskSCHEDULER_RUNNING; - 8002698: 2302 movs r3, #2 - 800269a: 607b str r3, [r7, #4] - 800269c: e001 b.n 80026a2 + 80025d4: 2302 movs r3, #2 + 80025d6: 607b str r3, [r7, #4] + 80025d8: e001 b.n 80025de } else { xReturn = taskSCHEDULER_SUSPENDED; - 800269e: 2300 movs r3, #0 - 80026a0: 607b str r3, [r7, #4] + 80025da: 2300 movs r3, #0 + 80025dc: 607b str r3, [r7, #4] } } return xReturn; - 80026a2: 687b ldr r3, [r7, #4] + 80025de: 687b ldr r3, [r7, #4] } - 80026a4: 4618 mov r0, r3 - 80026a6: 370c adds r7, #12 - 80026a8: 46bd mov sp, r7 - 80026aa: f85d 7b04 ldr.w r7, [sp], #4 - 80026ae: 4770 bx lr - 80026b0: 20000398 .word 0x20000398 - 80026b4: 200003b4 .word 0x200003b4 + 80025e0: 4618 mov r0, r3 + 80025e2: 370c adds r7, #12 + 80025e4: 46bd mov sp, r7 + 80025e6: f85d 7b04 ldr.w r7, [sp], #4 + 80025ea: 4770 bx lr + 80025ec: 20000398 .word 0x20000398 + 80025f0: 200003b4 .word 0x200003b4 -080026b8 : +080025f4 : #endif /*-----------------------------------------------------------*/ static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely ) { - 80026b8: b580 push {r7, lr} - 80026ba: b084 sub sp, #16 - 80026bc: af00 add r7, sp, #0 - 80026be: 6078 str r0, [r7, #4] - 80026c0: 6039 str r1, [r7, #0] + 80025f4: b580 push {r7, lr} + 80025f6: b084 sub sp, #16 + 80025f8: af00 add r7, sp, #0 + 80025fa: 6078 str r0, [r7, #4] + 80025fc: 6039 str r1, [r7, #0] TickType_t xTimeToWake; const TickType_t xConstTickCount = xTickCount; - 80026c2: 4b29 ldr r3, [pc, #164] ; (8002768 ) - 80026c4: 681b ldr r3, [r3, #0] - 80026c6: 60fb str r3, [r7, #12] + 80025fe: 4b29 ldr r3, [pc, #164] ; (80026a4 ) + 8002600: 681b ldr r3, [r3, #0] + 8002602: 60fb str r3, [r7, #12] } #endif /* Remove the task from the ready list before adding it to the blocked list as the same list item is used for both lists. */ if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) - 80026c8: 4b28 ldr r3, [pc, #160] ; (800276c ) - 80026ca: 681b ldr r3, [r3, #0] - 80026cc: 3304 adds r3, #4 - 80026ce: 4618 mov r0, r3 - 80026d0: f7ff faef bl 8001cb2 - 80026d4: 4603 mov r3, r0 - 80026d6: 2b00 cmp r3, #0 - 80026d8: d10b bne.n 80026f2 + 8002604: 4b28 ldr r3, [pc, #160] ; (80026a8 ) + 8002606: 681b ldr r3, [r3, #0] + 8002608: 3304 adds r3, #4 + 800260a: 4618 mov r0, r3 + 800260c: f7ff faef bl 8001bee + 8002610: 4603 mov r3, r0 + 8002612: 2b00 cmp r3, #0 + 8002614: d10b bne.n 800262e { /* The current task must be in a ready list, so there is no need to check, and the port reset macro can be called directly. */ portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB cannot change as it is the calling task. pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */ - 80026da: 4b24 ldr r3, [pc, #144] ; (800276c ) - 80026dc: 681b ldr r3, [r3, #0] - 80026de: 6adb ldr r3, [r3, #44] ; 0x2c - 80026e0: 2201 movs r2, #1 - 80026e2: fa02 f303 lsl.w r3, r2, r3 - 80026e6: 43da mvns r2, r3 - 80026e8: 4b21 ldr r3, [pc, #132] ; (8002770 ) - 80026ea: 681b ldr r3, [r3, #0] - 80026ec: 4013 ands r3, r2 - 80026ee: 4a20 ldr r2, [pc, #128] ; (8002770 ) - 80026f0: 6013 str r3, [r2, #0] + 8002616: 4b24 ldr r3, [pc, #144] ; (80026a8 ) + 8002618: 681b ldr r3, [r3, #0] + 800261a: 6adb ldr r3, [r3, #44] ; 0x2c + 800261c: 2201 movs r2, #1 + 800261e: fa02 f303 lsl.w r3, r2, r3 + 8002622: 43da mvns r2, r3 + 8002624: 4b21 ldr r3, [pc, #132] ; (80026ac ) + 8002626: 681b ldr r3, [r3, #0] + 8002628: 4013 ands r3, r2 + 800262a: 4a20 ldr r2, [pc, #128] ; (80026ac ) + 800262c: 6013 str r3, [r2, #0] mtCOVERAGE_TEST_MARKER(); } #if ( INCLUDE_vTaskSuspend == 1 ) { if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) ) - 80026f2: 687b ldr r3, [r7, #4] - 80026f4: f1b3 3fff cmp.w r3, #4294967295 - 80026f8: d10a bne.n 8002710 - 80026fa: 683b ldr r3, [r7, #0] - 80026fc: 2b00 cmp r3, #0 - 80026fe: d007 beq.n 8002710 + 800262e: 687b ldr r3, [r7, #4] + 8002630: f1b3 3fff cmp.w r3, #4294967295 + 8002634: d10a bne.n 800264c + 8002636: 683b ldr r3, [r7, #0] + 8002638: 2b00 cmp r3, #0 + 800263a: d007 beq.n 800264c { /* Add the task to the suspended task list instead of a delayed task list to ensure it is not woken by a timing event. It will block indefinitely. */ vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) ); - 8002700: 4b1a ldr r3, [pc, #104] ; (800276c ) - 8002702: 681b ldr r3, [r3, #0] - 8002704: 3304 adds r3, #4 - 8002706: 4619 mov r1, r3 - 8002708: 481a ldr r0, [pc, #104] ; (8002774 ) - 800270a: f7ff fa75 bl 8001bf8 + 800263c: 4b1a ldr r3, [pc, #104] ; (80026a8 ) + 800263e: 681b ldr r3, [r3, #0] + 8002640: 3304 adds r3, #4 + 8002642: 4619 mov r1, r3 + 8002644: 481a ldr r0, [pc, #104] ; (80026b0 ) + 8002646: f7ff fa75 bl 8001b34 /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */ ( void ) xCanBlockIndefinitely; } #endif /* INCLUDE_vTaskSuspend */ } - 800270e: e026 b.n 800275e + 800264a: e026 b.n 800269a xTimeToWake = xConstTickCount + xTicksToWait; - 8002710: 68fa ldr r2, [r7, #12] - 8002712: 687b ldr r3, [r7, #4] - 8002714: 4413 add r3, r2 - 8002716: 60bb str r3, [r7, #8] + 800264c: 68fa ldr r2, [r7, #12] + 800264e: 687b ldr r3, [r7, #4] + 8002650: 4413 add r3, r2 + 8002652: 60bb str r3, [r7, #8] listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake ); - 8002718: 4b14 ldr r3, [pc, #80] ; (800276c ) - 800271a: 681b ldr r3, [r3, #0] - 800271c: 68ba ldr r2, [r7, #8] - 800271e: 605a str r2, [r3, #4] + 8002654: 4b14 ldr r3, [pc, #80] ; (80026a8 ) + 8002656: 681b ldr r3, [r3, #0] + 8002658: 68ba ldr r2, [r7, #8] + 800265a: 605a str r2, [r3, #4] if( xTimeToWake < xConstTickCount ) - 8002720: 68ba ldr r2, [r7, #8] - 8002722: 68fb ldr r3, [r7, #12] - 8002724: 429a cmp r2, r3 - 8002726: d209 bcs.n 800273c + 800265c: 68ba ldr r2, [r7, #8] + 800265e: 68fb ldr r3, [r7, #12] + 8002660: 429a cmp r2, r3 + 8002662: d209 bcs.n 8002678 vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); - 8002728: 4b13 ldr r3, [pc, #76] ; (8002778 ) - 800272a: 681a ldr r2, [r3, #0] - 800272c: 4b0f ldr r3, [pc, #60] ; (800276c ) - 800272e: 681b ldr r3, [r3, #0] - 8002730: 3304 adds r3, #4 - 8002732: 4619 mov r1, r3 - 8002734: 4610 mov r0, r2 - 8002736: f7ff fa83 bl 8001c40 + 8002664: 4b13 ldr r3, [pc, #76] ; (80026b4 ) + 8002666: 681a ldr r2, [r3, #0] + 8002668: 4b0f ldr r3, [pc, #60] ; (80026a8 ) + 800266a: 681b ldr r3, [r3, #0] + 800266c: 3304 adds r3, #4 + 800266e: 4619 mov r1, r3 + 8002670: 4610 mov r0, r2 + 8002672: f7ff fa83 bl 8001b7c } - 800273a: e010 b.n 800275e + 8002676: e010 b.n 800269a vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xStateListItem ) ); - 800273c: 4b0f ldr r3, [pc, #60] ; (800277c ) - 800273e: 681a ldr r2, [r3, #0] - 8002740: 4b0a ldr r3, [pc, #40] ; (800276c ) - 8002742: 681b ldr r3, [r3, #0] - 8002744: 3304 adds r3, #4 - 8002746: 4619 mov r1, r3 - 8002748: 4610 mov r0, r2 - 800274a: f7ff fa79 bl 8001c40 + 8002678: 4b0f ldr r3, [pc, #60] ; (80026b8 ) + 800267a: 681a ldr r2, [r3, #0] + 800267c: 4b0a ldr r3, [pc, #40] ; (80026a8 ) + 800267e: 681b ldr r3, [r3, #0] + 8002680: 3304 adds r3, #4 + 8002682: 4619 mov r1, r3 + 8002684: 4610 mov r0, r2 + 8002686: f7ff fa79 bl 8001b7c if( xTimeToWake < xNextTaskUnblockTime ) - 800274e: 4b0c ldr r3, [pc, #48] ; (8002780 ) - 8002750: 681b ldr r3, [r3, #0] - 8002752: 68ba ldr r2, [r7, #8] - 8002754: 429a cmp r2, r3 - 8002756: d202 bcs.n 800275e + 800268a: 4b0c ldr r3, [pc, #48] ; (80026bc ) + 800268c: 681b ldr r3, [r3, #0] + 800268e: 68ba ldr r2, [r7, #8] + 8002690: 429a cmp r2, r3 + 8002692: d202 bcs.n 800269a xNextTaskUnblockTime = xTimeToWake; - 8002758: 4a09 ldr r2, [pc, #36] ; (8002780 ) - 800275a: 68bb ldr r3, [r7, #8] - 800275c: 6013 str r3, [r2, #0] + 8002694: 4a09 ldr r2, [pc, #36] ; (80026bc ) + 8002696: 68bb ldr r3, [r7, #8] + 8002698: 6013 str r3, [r2, #0] } - 800275e: bf00 nop - 8002760: 3710 adds r7, #16 - 8002762: 46bd mov sp, r7 - 8002764: bd80 pop {r7, pc} - 8002766: bf00 nop - 8002768: 20000390 .word 0x20000390 - 800276c: 2000028c .word 0x2000028c - 8002770: 20000394 .word 0x20000394 - 8002774: 20000378 .word 0x20000378 - 8002778: 20000348 .word 0x20000348 - 800277c: 20000344 .word 0x20000344 - 8002780: 200003ac .word 0x200003ac - -08002784 : + 800269a: bf00 nop + 800269c: 3710 adds r7, #16 + 800269e: 46bd mov sp, r7 + 80026a0: bd80 pop {r7, pc} + 80026a2: bf00 nop + 80026a4: 20000390 .word 0x20000390 + 80026a8: 2000028c .word 0x2000028c + 80026ac: 20000394 .word 0x20000394 + 80026b0: 20000378 .word 0x20000378 + 80026b4: 20000348 .word 0x20000348 + 80026b8: 20000344 .word 0x20000344 + 80026bc: 200003ac .word 0x200003ac + +080026c0 : /* * See header file for description. */ StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) { - 8002784: b480 push {r7} - 8002786: b085 sub sp, #20 - 8002788: af00 add r7, sp, #0 - 800278a: 60f8 str r0, [r7, #12] - 800278c: 60b9 str r1, [r7, #8] - 800278e: 607a str r2, [r7, #4] + 80026c0: b480 push {r7} + 80026c2: b085 sub sp, #20 + 80026c4: af00 add r7, sp, #0 + 80026c6: 60f8 str r0, [r7, #12] + 80026c8: 60b9 str r1, [r7, #8] + 80026ca: 607a str r2, [r7, #4] /* Simulate the stack frame as it would be created by a context switch interrupt. */ /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts, and to ensure alignment. */ pxTopOfStack--; - 8002790: 68fb ldr r3, [r7, #12] - 8002792: 3b04 subs r3, #4 - 8002794: 60fb str r3, [r7, #12] + 80026cc: 68fb ldr r3, [r7, #12] + 80026ce: 3b04 subs r3, #4 + 80026d0: 60fb str r3, [r7, #12] *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ - 8002796: 68fb ldr r3, [r7, #12] - 8002798: f04f 7280 mov.w r2, #16777216 ; 0x1000000 - 800279c: 601a str r2, [r3, #0] + 80026d2: 68fb ldr r3, [r7, #12] + 80026d4: f04f 7280 mov.w r2, #16777216 ; 0x1000000 + 80026d8: 601a str r2, [r3, #0] pxTopOfStack--; - 800279e: 68fb ldr r3, [r7, #12] - 80027a0: 3b04 subs r3, #4 - 80027a2: 60fb str r3, [r7, #12] + 80026da: 68fb ldr r3, [r7, #12] + 80026dc: 3b04 subs r3, #4 + 80026de: 60fb str r3, [r7, #12] *pxTopOfStack = ( ( StackType_t ) pxCode ) & portSTART_ADDRESS_MASK; /* PC */ - 80027a4: 68bb ldr r3, [r7, #8] - 80027a6: f023 0201 bic.w r2, r3, #1 - 80027aa: 68fb ldr r3, [r7, #12] - 80027ac: 601a str r2, [r3, #0] + 80026e0: 68bb ldr r3, [r7, #8] + 80026e2: f023 0201 bic.w r2, r3, #1 + 80026e6: 68fb ldr r3, [r7, #12] + 80026e8: 601a str r2, [r3, #0] pxTopOfStack--; - 80027ae: 68fb ldr r3, [r7, #12] - 80027b0: 3b04 subs r3, #4 - 80027b2: 60fb str r3, [r7, #12] + 80026ea: 68fb ldr r3, [r7, #12] + 80026ec: 3b04 subs r3, #4 + 80026ee: 60fb str r3, [r7, #12] *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR */ - 80027b4: 4a0c ldr r2, [pc, #48] ; (80027e8 ) - 80027b6: 68fb ldr r3, [r7, #12] - 80027b8: 601a str r2, [r3, #0] + 80026f0: 4a0c ldr r2, [pc, #48] ; (8002724 ) + 80026f2: 68fb ldr r3, [r7, #12] + 80026f4: 601a str r2, [r3, #0] /* Save code space by skipping register initialisation. */ pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ - 80027ba: 68fb ldr r3, [r7, #12] - 80027bc: 3b14 subs r3, #20 - 80027be: 60fb str r3, [r7, #12] + 80026f6: 68fb ldr r3, [r7, #12] + 80026f8: 3b14 subs r3, #20 + 80026fa: 60fb str r3, [r7, #12] *pxTopOfStack = ( StackType_t ) pvParameters; /* R0 */ - 80027c0: 687a ldr r2, [r7, #4] - 80027c2: 68fb ldr r3, [r7, #12] - 80027c4: 601a str r2, [r3, #0] + 80026fc: 687a ldr r2, [r7, #4] + 80026fe: 68fb ldr r3, [r7, #12] + 8002700: 601a str r2, [r3, #0] /* A save method is being used that requires each task to maintain its own exec return value. */ pxTopOfStack--; - 80027c6: 68fb ldr r3, [r7, #12] - 80027c8: 3b04 subs r3, #4 - 80027ca: 60fb str r3, [r7, #12] + 8002702: 68fb ldr r3, [r7, #12] + 8002704: 3b04 subs r3, #4 + 8002706: 60fb str r3, [r7, #12] *pxTopOfStack = portINITIAL_EXC_RETURN; - 80027cc: 68fb ldr r3, [r7, #12] - 80027ce: f06f 0202 mvn.w r2, #2 - 80027d2: 601a str r2, [r3, #0] + 8002708: 68fb ldr r3, [r7, #12] + 800270a: f06f 0202 mvn.w r2, #2 + 800270e: 601a str r2, [r3, #0] pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ - 80027d4: 68fb ldr r3, [r7, #12] - 80027d6: 3b20 subs r3, #32 - 80027d8: 60fb str r3, [r7, #12] + 8002710: 68fb ldr r3, [r7, #12] + 8002712: 3b20 subs r3, #32 + 8002714: 60fb str r3, [r7, #12] return pxTopOfStack; - 80027da: 68fb ldr r3, [r7, #12] + 8002716: 68fb ldr r3, [r7, #12] } - 80027dc: 4618 mov r0, r3 - 80027de: 3714 adds r7, #20 - 80027e0: 46bd mov sp, r7 - 80027e2: f85d 7b04 ldr.w r7, [sp], #4 - 80027e6: 4770 bx lr - 80027e8: 080027ed .word 0x080027ed - -080027ec : + 8002718: 4618 mov r0, r3 + 800271a: 3714 adds r7, #20 + 800271c: 46bd mov sp, r7 + 800271e: f85d 7b04 ldr.w r7, [sp], #4 + 8002722: 4770 bx lr + 8002724: 08002729 .word 0x08002729 + +08002728 : /*-----------------------------------------------------------*/ static void prvTaskExitError( void ) { - 80027ec: b480 push {r7} - 80027ee: b085 sub sp, #20 - 80027f0: af00 add r7, sp, #0 + 8002728: b480 push {r7} + 800272a: b085 sub sp, #20 + 800272c: af00 add r7, sp, #0 volatile uint32_t ulDummy = 0; - 80027f2: 2300 movs r3, #0 - 80027f4: 607b str r3, [r7, #4] + 800272e: 2300 movs r3, #0 + 8002730: 607b str r3, [r7, #4] its caller as there is nothing to return to. If a task wants to exit it should instead call vTaskDelete( NULL ). Artificially force an assert() to be triggered if configASSERT() is defined, then stop here so application writers can catch the error. */ configASSERT( uxCriticalNesting == ~0UL ); - 80027f6: 4b12 ldr r3, [pc, #72] ; (8002840 ) - 80027f8: 681b ldr r3, [r3, #0] - 80027fa: f1b3 3fff cmp.w r3, #4294967295 - 80027fe: d00a beq.n 8002816 + 8002732: 4b12 ldr r3, [pc, #72] ; (800277c ) + 8002734: 681b ldr r3, [r3, #0] + 8002736: f1b3 3fff cmp.w r3, #4294967295 + 800273a: d00a beq.n 8002752 __asm volatile - 8002800: f04f 0350 mov.w r3, #80 ; 0x50 - 8002804: f383 8811 msr BASEPRI, r3 - 8002808: f3bf 8f6f isb sy - 800280c: f3bf 8f4f dsb sy - 8002810: 60fb str r3, [r7, #12] + 800273c: f04f 0350 mov.w r3, #80 ; 0x50 + 8002740: f383 8811 msr BASEPRI, r3 + 8002744: f3bf 8f6f isb sy + 8002748: f3bf 8f4f dsb sy + 800274c: 60fb str r3, [r7, #12] } - 8002812: bf00 nop - 8002814: e7fe b.n 8002814 + 800274e: bf00 nop + 8002750: e7fe b.n 8002750 __asm volatile - 8002816: f04f 0350 mov.w r3, #80 ; 0x50 - 800281a: f383 8811 msr BASEPRI, r3 - 800281e: f3bf 8f6f isb sy - 8002822: f3bf 8f4f dsb sy - 8002826: 60bb str r3, [r7, #8] + 8002752: f04f 0350 mov.w r3, #80 ; 0x50 + 8002756: f383 8811 msr BASEPRI, r3 + 800275a: f3bf 8f6f isb sy + 800275e: f3bf 8f4f dsb sy + 8002762: 60bb str r3, [r7, #8] } - 8002828: bf00 nop + 8002764: bf00 nop portDISABLE_INTERRUPTS(); while( ulDummy == 0 ) - 800282a: bf00 nop - 800282c: 687b ldr r3, [r7, #4] - 800282e: 2b00 cmp r3, #0 - 8002830: d0fc beq.n 800282c + 8002766: bf00 nop + 8002768: 687b ldr r3, [r7, #4] + 800276a: 2b00 cmp r3, #0 + 800276c: d0fc beq.n 8002768 about code appearing after this function is called - making ulDummy volatile makes the compiler think the function could return and therefore not output an 'unreachable code' warning for code that appears after it. */ } } - 8002832: bf00 nop - 8002834: bf00 nop - 8002836: 3714 adds r7, #20 - 8002838: 46bd mov sp, r7 - 800283a: f85d 7b04 ldr.w r7, [sp], #4 - 800283e: 4770 bx lr - 8002840: 2000000c .word 0x2000000c - ... - -08002850 : + 800276e: bf00 nop + 8002770: bf00 nop + 8002772: 3714 adds r7, #20 + 8002774: 46bd mov sp, r7 + 8002776: f85d 7b04 ldr.w r7, [sp], #4 + 800277a: 4770 bx lr + 800277c: 2000000c .word 0x2000000c + +08002780 : /*-----------------------------------------------------------*/ void vPortSVCHandler( void ) { __asm volatile ( - 8002850: 4b07 ldr r3, [pc, #28] ; (8002870 ) - 8002852: 6819 ldr r1, [r3, #0] - 8002854: 6808 ldr r0, [r1, #0] - 8002856: e8b0 4ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - 800285a: f380 8809 msr PSP, r0 - 800285e: f3bf 8f6f isb sy - 8002862: f04f 0000 mov.w r0, #0 - 8002866: f380 8811 msr BASEPRI, r0 - 800286a: 4770 bx lr - 800286c: f3af 8000 nop.w - -08002870 : - 8002870: 2000028c .word 0x2000028c + 8002780: 4b07 ldr r3, [pc, #28] ; (80027a0 ) + 8002782: 6819 ldr r1, [r3, #0] + 8002784: 6808 ldr r0, [r1, #0] + 8002786: e8b0 4ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 800278a: f380 8809 msr PSP, r0 + 800278e: f3bf 8f6f isb sy + 8002792: f04f 0000 mov.w r0, #0 + 8002796: f380 8811 msr BASEPRI, r0 + 800279a: 4770 bx lr + 800279c: f3af 8000 nop.w + +080027a0 : + 80027a0: 2000028c .word 0x2000028c " bx r14 \n" " \n" " .align 4 \n" "pxCurrentTCBConst2: .word pxCurrentTCB \n" ); } - 8002874: bf00 nop - 8002876: bf00 nop + 80027a4: bf00 nop + 80027a6: bf00 nop -08002878 : +080027a8 : { /* Start the first task. This also clears the bit that indicates the FPU is in use in case the FPU was used before the scheduler was started - which would otherwise result in the unnecessary leaving of space in the SVC stack for lazy saving of FPU registers. */ __asm volatile( - 8002878: 4808 ldr r0, [pc, #32] ; (800289c ) - 800287a: 6800 ldr r0, [r0, #0] - 800287c: 6800 ldr r0, [r0, #0] - 800287e: f380 8808 msr MSP, r0 - 8002882: f04f 0000 mov.w r0, #0 - 8002886: f380 8814 msr CONTROL, r0 - 800288a: b662 cpsie i - 800288c: b661 cpsie f - 800288e: f3bf 8f4f dsb sy - 8002892: f3bf 8f6f isb sy - 8002896: df00 svc 0 - 8002898: bf00 nop + 80027a8: 4808 ldr r0, [pc, #32] ; (80027cc ) + 80027aa: 6800 ldr r0, [r0, #0] + 80027ac: 6800 ldr r0, [r0, #0] + 80027ae: f380 8808 msr MSP, r0 + 80027b2: f04f 0000 mov.w r0, #0 + 80027b6: f380 8814 msr CONTROL, r0 + 80027ba: b662 cpsie i + 80027bc: b661 cpsie f + 80027be: f3bf 8f4f dsb sy + 80027c2: f3bf 8f6f isb sy + 80027c6: df00 svc 0 + 80027c8: bf00 nop " dsb \n" " isb \n" " svc 0 \n" /* System call to start first task. */ " nop \n" ); } - 800289a: bf00 nop - 800289c: e000ed08 .word 0xe000ed08 + 80027ca: bf00 nop + 80027cc: e000ed08 .word 0xe000ed08 -080028a0 : +080027d0 : /* * See header file for description. */ BaseType_t xPortStartScheduler( void ) { - 80028a0: b580 push {r7, lr} - 80028a2: b086 sub sp, #24 - 80028a4: af00 add r7, sp, #0 + 80027d0: b580 push {r7, lr} + 80027d2: b086 sub sp, #24 + 80027d4: af00 add r7, sp, #0 configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); /* This port can be used on all revisions of the Cortex-M7 core other than the r0p1 parts. r0p1 parts should use the port from the /source/portable/GCC/ARM_CM7/r0p1 directory. */ configASSERT( portCPUID != portCORTEX_M7_r0p1_ID ); - 80028a6: 4b46 ldr r3, [pc, #280] ; (80029c0 ) - 80028a8: 681b ldr r3, [r3, #0] - 80028aa: 4a46 ldr r2, [pc, #280] ; (80029c4 ) - 80028ac: 4293 cmp r3, r2 - 80028ae: d10a bne.n 80028c6 + 80027d6: 4b46 ldr r3, [pc, #280] ; (80028f0 ) + 80027d8: 681b ldr r3, [r3, #0] + 80027da: 4a46 ldr r2, [pc, #280] ; (80028f4 ) + 80027dc: 4293 cmp r3, r2 + 80027de: d10a bne.n 80027f6 __asm volatile - 80028b0: f04f 0350 mov.w r3, #80 ; 0x50 - 80028b4: f383 8811 msr BASEPRI, r3 - 80028b8: f3bf 8f6f isb sy - 80028bc: f3bf 8f4f dsb sy - 80028c0: 613b str r3, [r7, #16] + 80027e0: f04f 0350 mov.w r3, #80 ; 0x50 + 80027e4: f383 8811 msr BASEPRI, r3 + 80027e8: f3bf 8f6f isb sy + 80027ec: f3bf 8f4f dsb sy + 80027f0: 613b str r3, [r7, #16] } - 80028c2: bf00 nop - 80028c4: e7fe b.n 80028c4 + 80027f2: bf00 nop + 80027f4: e7fe b.n 80027f4 configASSERT( portCPUID != portCORTEX_M7_r0p0_ID ); - 80028c6: 4b3e ldr r3, [pc, #248] ; (80029c0 ) - 80028c8: 681b ldr r3, [r3, #0] - 80028ca: 4a3f ldr r2, [pc, #252] ; (80029c8 ) - 80028cc: 4293 cmp r3, r2 - 80028ce: d10a bne.n 80028e6 + 80027f6: 4b3e ldr r3, [pc, #248] ; (80028f0 ) + 80027f8: 681b ldr r3, [r3, #0] + 80027fa: 4a3f ldr r2, [pc, #252] ; (80028f8 ) + 80027fc: 4293 cmp r3, r2 + 80027fe: d10a bne.n 8002816 __asm volatile - 80028d0: f04f 0350 mov.w r3, #80 ; 0x50 - 80028d4: f383 8811 msr BASEPRI, r3 - 80028d8: f3bf 8f6f isb sy - 80028dc: f3bf 8f4f dsb sy - 80028e0: 60fb str r3, [r7, #12] + 8002800: f04f 0350 mov.w r3, #80 ; 0x50 + 8002804: f383 8811 msr BASEPRI, r3 + 8002808: f3bf 8f6f isb sy + 800280c: f3bf 8f4f dsb sy + 8002810: 60fb str r3, [r7, #12] } - 80028e2: bf00 nop - 80028e4: e7fe b.n 80028e4 + 8002812: bf00 nop + 8002814: e7fe b.n 8002814 #if( configASSERT_DEFINED == 1 ) { volatile uint32_t ulOriginalPriority; volatile uint8_t * const pucFirstUserPriorityRegister = ( volatile uint8_t * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); - 80028e6: 4b39 ldr r3, [pc, #228] ; (80029cc ) - 80028e8: 617b str r3, [r7, #20] + 8002816: 4b39 ldr r3, [pc, #228] ; (80028fc ) + 8002818: 617b str r3, [r7, #20] functions can be called. ISR safe functions are those that end in "FromISR". FreeRTOS maintains separate thread and ISR API functions to ensure interrupt entry is as fast and simple as possible. Save the interrupt priority value that is about to be clobbered. */ ulOriginalPriority = *pucFirstUserPriorityRegister; - 80028ea: 697b ldr r3, [r7, #20] - 80028ec: 781b ldrb r3, [r3, #0] - 80028ee: b2db uxtb r3, r3 - 80028f0: 607b str r3, [r7, #4] + 800281a: 697b ldr r3, [r7, #20] + 800281c: 781b ldrb r3, [r3, #0] + 800281e: b2db uxtb r3, r3 + 8002820: 607b str r3, [r7, #4] /* Determine the number of priority bits available. First write to all possible bits. */ *pucFirstUserPriorityRegister = portMAX_8_BIT_VALUE; - 80028f2: 697b ldr r3, [r7, #20] - 80028f4: 22ff movs r2, #255 ; 0xff - 80028f6: 701a strb r2, [r3, #0] + 8002822: 697b ldr r3, [r7, #20] + 8002824: 22ff movs r2, #255 ; 0xff + 8002826: 701a strb r2, [r3, #0] /* Read the value back to see how many bits stuck. */ ucMaxPriorityValue = *pucFirstUserPriorityRegister; - 80028f8: 697b ldr r3, [r7, #20] - 80028fa: 781b ldrb r3, [r3, #0] - 80028fc: b2db uxtb r3, r3 - 80028fe: 70fb strb r3, [r7, #3] + 8002828: 697b ldr r3, [r7, #20] + 800282a: 781b ldrb r3, [r3, #0] + 800282c: b2db uxtb r3, r3 + 800282e: 70fb strb r3, [r7, #3] /* Use the same mask on the maximum system call priority. */ ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; - 8002900: 78fb ldrb r3, [r7, #3] - 8002902: b2db uxtb r3, r3 - 8002904: f003 0350 and.w r3, r3, #80 ; 0x50 - 8002908: b2da uxtb r2, r3 - 800290a: 4b31 ldr r3, [pc, #196] ; (80029d0 ) - 800290c: 701a strb r2, [r3, #0] + 8002830: 78fb ldrb r3, [r7, #3] + 8002832: b2db uxtb r3, r3 + 8002834: f003 0350 and.w r3, r3, #80 ; 0x50 + 8002838: b2da uxtb r2, r3 + 800283a: 4b31 ldr r3, [pc, #196] ; (8002900 ) + 800283c: 701a strb r2, [r3, #0] /* Calculate the maximum acceptable priority group value for the number of bits read back. */ ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; - 800290e: 4b31 ldr r3, [pc, #196] ; (80029d4 ) - 8002910: 2207 movs r2, #7 - 8002912: 601a str r2, [r3, #0] + 800283e: 4b31 ldr r3, [pc, #196] ; (8002904 ) + 8002840: 2207 movs r2, #7 + 8002842: 601a str r2, [r3, #0] while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) - 8002914: e009 b.n 800292a + 8002844: e009 b.n 800285a { ulMaxPRIGROUPValue--; - 8002916: 4b2f ldr r3, [pc, #188] ; (80029d4 ) - 8002918: 681b ldr r3, [r3, #0] - 800291a: 3b01 subs r3, #1 - 800291c: 4a2d ldr r2, [pc, #180] ; (80029d4 ) - 800291e: 6013 str r3, [r2, #0] + 8002846: 4b2f ldr r3, [pc, #188] ; (8002904 ) + 8002848: 681b ldr r3, [r3, #0] + 800284a: 3b01 subs r3, #1 + 800284c: 4a2d ldr r2, [pc, #180] ; (8002904 ) + 800284e: 6013 str r3, [r2, #0] ucMaxPriorityValue <<= ( uint8_t ) 0x01; - 8002920: 78fb ldrb r3, [r7, #3] - 8002922: b2db uxtb r3, r3 - 8002924: 005b lsls r3, r3, #1 - 8002926: b2db uxtb r3, r3 - 8002928: 70fb strb r3, [r7, #3] + 8002850: 78fb ldrb r3, [r7, #3] + 8002852: b2db uxtb r3, r3 + 8002854: 005b lsls r3, r3, #1 + 8002856: b2db uxtb r3, r3 + 8002858: 70fb strb r3, [r7, #3] while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) - 800292a: 78fb ldrb r3, [r7, #3] - 800292c: b2db uxtb r3, r3 - 800292e: f003 0380 and.w r3, r3, #128 ; 0x80 - 8002932: 2b80 cmp r3, #128 ; 0x80 - 8002934: d0ef beq.n 8002916 + 800285a: 78fb ldrb r3, [r7, #3] + 800285c: b2db uxtb r3, r3 + 800285e: f003 0380 and.w r3, r3, #128 ; 0x80 + 8002862: 2b80 cmp r3, #128 ; 0x80 + 8002864: d0ef beq.n 8002846 #ifdef configPRIO_BITS { /* Check the FreeRTOS configuration that defines the number of priority bits matches the number of priority bits actually queried from the hardware. */ configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS ); - 8002936: 4b27 ldr r3, [pc, #156] ; (80029d4 ) - 8002938: 681b ldr r3, [r3, #0] - 800293a: f1c3 0307 rsb r3, r3, #7 - 800293e: 2b04 cmp r3, #4 - 8002940: d00a beq.n 8002958 + 8002866: 4b27 ldr r3, [pc, #156] ; (8002904 ) + 8002868: 681b ldr r3, [r3, #0] + 800286a: f1c3 0307 rsb r3, r3, #7 + 800286e: 2b04 cmp r3, #4 + 8002870: d00a beq.n 8002888 __asm volatile - 8002942: f04f 0350 mov.w r3, #80 ; 0x50 - 8002946: f383 8811 msr BASEPRI, r3 - 800294a: f3bf 8f6f isb sy - 800294e: f3bf 8f4f dsb sy - 8002952: 60bb str r3, [r7, #8] + 8002872: f04f 0350 mov.w r3, #80 ; 0x50 + 8002876: f383 8811 msr BASEPRI, r3 + 800287a: f3bf 8f6f isb sy + 800287e: f3bf 8f4f dsb sy + 8002882: 60bb str r3, [r7, #8] } - 8002954: bf00 nop - 8002956: e7fe b.n 8002956 + 8002884: bf00 nop + 8002886: e7fe b.n 8002886 } #endif /* Shift the priority group value back to its position within the AIRCR register. */ ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; - 8002958: 4b1e ldr r3, [pc, #120] ; (80029d4 ) - 800295a: 681b ldr r3, [r3, #0] - 800295c: 021b lsls r3, r3, #8 - 800295e: 4a1d ldr r2, [pc, #116] ; (80029d4 ) - 8002960: 6013 str r3, [r2, #0] + 8002888: 4b1e ldr r3, [pc, #120] ; (8002904 ) + 800288a: 681b ldr r3, [r3, #0] + 800288c: 021b lsls r3, r3, #8 + 800288e: 4a1d ldr r2, [pc, #116] ; (8002904 ) + 8002890: 6013 str r3, [r2, #0] ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; - 8002962: 4b1c ldr r3, [pc, #112] ; (80029d4 ) - 8002964: 681b ldr r3, [r3, #0] - 8002966: f403 63e0 and.w r3, r3, #1792 ; 0x700 - 800296a: 4a1a ldr r2, [pc, #104] ; (80029d4 ) - 800296c: 6013 str r3, [r2, #0] + 8002892: 4b1c ldr r3, [pc, #112] ; (8002904 ) + 8002894: 681b ldr r3, [r3, #0] + 8002896: f403 63e0 and.w r3, r3, #1792 ; 0x700 + 800289a: 4a1a ldr r2, [pc, #104] ; (8002904 ) + 800289c: 6013 str r3, [r2, #0] /* Restore the clobbered interrupt priority register to its original value. */ *pucFirstUserPriorityRegister = ulOriginalPriority; - 800296e: 687b ldr r3, [r7, #4] - 8002970: b2da uxtb r2, r3 - 8002972: 697b ldr r3, [r7, #20] - 8002974: 701a strb r2, [r3, #0] + 800289e: 687b ldr r3, [r7, #4] + 80028a0: b2da uxtb r2, r3 + 80028a2: 697b ldr r3, [r7, #20] + 80028a4: 701a strb r2, [r3, #0] } #endif /* conifgASSERT_DEFINED */ /* Make PendSV and SysTick the lowest priority interrupts. */ portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; - 8002976: 4b18 ldr r3, [pc, #96] ; (80029d8 ) - 8002978: 681b ldr r3, [r3, #0] - 800297a: 4a17 ldr r2, [pc, #92] ; (80029d8 ) - 800297c: f443 0370 orr.w r3, r3, #15728640 ; 0xf00000 - 8002980: 6013 str r3, [r2, #0] + 80028a6: 4b18 ldr r3, [pc, #96] ; (8002908 ) + 80028a8: 681b ldr r3, [r3, #0] + 80028aa: 4a17 ldr r2, [pc, #92] ; (8002908 ) + 80028ac: f443 0370 orr.w r3, r3, #15728640 ; 0xf00000 + 80028b0: 6013 str r3, [r2, #0] portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; - 8002982: 4b15 ldr r3, [pc, #84] ; (80029d8 ) - 8002984: 681b ldr r3, [r3, #0] - 8002986: 4a14 ldr r2, [pc, #80] ; (80029d8 ) - 8002988: f043 4370 orr.w r3, r3, #4026531840 ; 0xf0000000 - 800298c: 6013 str r3, [r2, #0] + 80028b2: 4b15 ldr r3, [pc, #84] ; (8002908 ) + 80028b4: 681b ldr r3, [r3, #0] + 80028b6: 4a14 ldr r2, [pc, #80] ; (8002908 ) + 80028b8: f043 4370 orr.w r3, r3, #4026531840 ; 0xf0000000 + 80028bc: 6013 str r3, [r2, #0] /* Start the timer that generates the tick ISR. Interrupts are disabled here already. */ vPortSetupTimerInterrupt(); - 800298e: f000 f8dd bl 8002b4c + 80028be: f000 f8dd bl 8002a7c /* Initialise the critical nesting count ready for the first task. */ uxCriticalNesting = 0; - 8002992: 4b12 ldr r3, [pc, #72] ; (80029dc ) - 8002994: 2200 movs r2, #0 - 8002996: 601a str r2, [r3, #0] + 80028c2: 4b12 ldr r3, [pc, #72] ; (800290c ) + 80028c4: 2200 movs r2, #0 + 80028c6: 601a str r2, [r3, #0] /* Ensure the VFP is enabled - it should be anyway. */ vPortEnableVFP(); - 8002998: f000 f8fc bl 8002b94 + 80028c8: f000 f8fc bl 8002ac4 /* Lazy save always. */ *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; - 800299c: 4b10 ldr r3, [pc, #64] ; (80029e0 ) - 800299e: 681b ldr r3, [r3, #0] - 80029a0: 4a0f ldr r2, [pc, #60] ; (80029e0 ) - 80029a2: f043 4340 orr.w r3, r3, #3221225472 ; 0xc0000000 - 80029a6: 6013 str r3, [r2, #0] + 80028cc: 4b10 ldr r3, [pc, #64] ; (8002910 ) + 80028ce: 681b ldr r3, [r3, #0] + 80028d0: 4a0f ldr r2, [pc, #60] ; (8002910 ) + 80028d2: f043 4340 orr.w r3, r3, #3221225472 ; 0xc0000000 + 80028d6: 6013 str r3, [r2, #0] /* Start the first task. */ prvPortStartFirstTask(); - 80029a8: f7ff ff66 bl 8002878 + 80028d8: f7ff ff66 bl 80027a8 exit error function to prevent compiler warnings about a static function not being called in the case that the application writer overrides this functionality by defining configTASK_RETURN_ADDRESS. Call vTaskSwitchContext() so link time optimisation does not remove the symbol. */ vTaskSwitchContext(); - 80029ac: f7ff fd34 bl 8002418 + 80028dc: f7ff fd3a bl 8002354 prvTaskExitError(); - 80029b0: f7ff ff1c bl 80027ec + 80028e0: f7ff ff22 bl 8002728 /* Should not get here! */ return 0; - 80029b4: 2300 movs r3, #0 + 80028e4: 2300 movs r3, #0 } - 80029b6: 4618 mov r0, r3 - 80029b8: 3718 adds r7, #24 - 80029ba: 46bd mov sp, r7 - 80029bc: bd80 pop {r7, pc} - 80029be: bf00 nop - 80029c0: e000ed00 .word 0xe000ed00 - 80029c4: 410fc271 .word 0x410fc271 - 80029c8: 410fc270 .word 0x410fc270 - 80029cc: e000e400 .word 0xe000e400 - 80029d0: 200003b8 .word 0x200003b8 - 80029d4: 200003bc .word 0x200003bc - 80029d8: e000ed20 .word 0xe000ed20 - 80029dc: 2000000c .word 0x2000000c - 80029e0: e000ef34 .word 0xe000ef34 - -080029e4 : + 80028e6: 4618 mov r0, r3 + 80028e8: 3718 adds r7, #24 + 80028ea: 46bd mov sp, r7 + 80028ec: bd80 pop {r7, pc} + 80028ee: bf00 nop + 80028f0: e000ed00 .word 0xe000ed00 + 80028f4: 410fc271 .word 0x410fc271 + 80028f8: 410fc270 .word 0x410fc270 + 80028fc: e000e400 .word 0xe000e400 + 8002900: 200003b8 .word 0x200003b8 + 8002904: 200003bc .word 0x200003bc + 8002908: e000ed20 .word 0xe000ed20 + 800290c: 2000000c .word 0x2000000c + 8002910: e000ef34 .word 0xe000ef34 + +08002914 : configASSERT( uxCriticalNesting == 1000UL ); } /*-----------------------------------------------------------*/ void vPortEnterCritical( void ) { - 80029e4: b480 push {r7} - 80029e6: b083 sub sp, #12 - 80029e8: af00 add r7, sp, #0 + 8002914: b480 push {r7} + 8002916: b083 sub sp, #12 + 8002918: af00 add r7, sp, #0 __asm volatile - 80029ea: f04f 0350 mov.w r3, #80 ; 0x50 - 80029ee: f383 8811 msr BASEPRI, r3 - 80029f2: f3bf 8f6f isb sy - 80029f6: f3bf 8f4f dsb sy - 80029fa: 607b str r3, [r7, #4] + 800291a: f04f 0350 mov.w r3, #80 ; 0x50 + 800291e: f383 8811 msr BASEPRI, r3 + 8002922: f3bf 8f6f isb sy + 8002926: f3bf 8f4f dsb sy + 800292a: 607b str r3, [r7, #4] } - 80029fc: bf00 nop + 800292c: bf00 nop portDISABLE_INTERRUPTS(); uxCriticalNesting++; - 80029fe: 4b0f ldr r3, [pc, #60] ; (8002a3c ) - 8002a00: 681b ldr r3, [r3, #0] - 8002a02: 3301 adds r3, #1 - 8002a04: 4a0d ldr r2, [pc, #52] ; (8002a3c ) - 8002a06: 6013 str r3, [r2, #0] + 800292e: 4b0f ldr r3, [pc, #60] ; (800296c ) + 8002930: 681b ldr r3, [r3, #0] + 8002932: 3301 adds r3, #1 + 8002934: 4a0d ldr r2, [pc, #52] ; (800296c ) + 8002936: 6013 str r3, [r2, #0] /* This is not the interrupt safe version of the enter critical function so assert() if it is being called from an interrupt context. Only API functions that end in "FromISR" can be used in an interrupt. Only assert if the critical nesting count is 1 to protect against recursive calls if the assert function also uses a critical section. */ if( uxCriticalNesting == 1 ) - 8002a08: 4b0c ldr r3, [pc, #48] ; (8002a3c ) - 8002a0a: 681b ldr r3, [r3, #0] - 8002a0c: 2b01 cmp r3, #1 - 8002a0e: d10f bne.n 8002a30 + 8002938: 4b0c ldr r3, [pc, #48] ; (800296c ) + 800293a: 681b ldr r3, [r3, #0] + 800293c: 2b01 cmp r3, #1 + 800293e: d10f bne.n 8002960 { configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == 0 ); - 8002a10: 4b0b ldr r3, [pc, #44] ; (8002a40 ) - 8002a12: 681b ldr r3, [r3, #0] - 8002a14: b2db uxtb r3, r3 - 8002a16: 2b00 cmp r3, #0 - 8002a18: d00a beq.n 8002a30 + 8002940: 4b0b ldr r3, [pc, #44] ; (8002970 ) + 8002942: 681b ldr r3, [r3, #0] + 8002944: b2db uxtb r3, r3 + 8002946: 2b00 cmp r3, #0 + 8002948: d00a beq.n 8002960 __asm volatile - 8002a1a: f04f 0350 mov.w r3, #80 ; 0x50 - 8002a1e: f383 8811 msr BASEPRI, r3 - 8002a22: f3bf 8f6f isb sy - 8002a26: f3bf 8f4f dsb sy - 8002a2a: 603b str r3, [r7, #0] + 800294a: f04f 0350 mov.w r3, #80 ; 0x50 + 800294e: f383 8811 msr BASEPRI, r3 + 8002952: f3bf 8f6f isb sy + 8002956: f3bf 8f4f dsb sy + 800295a: 603b str r3, [r7, #0] } - 8002a2c: bf00 nop - 8002a2e: e7fe b.n 8002a2e + 800295c: bf00 nop + 800295e: e7fe b.n 800295e } } - 8002a30: bf00 nop - 8002a32: 370c adds r7, #12 - 8002a34: 46bd mov sp, r7 - 8002a36: f85d 7b04 ldr.w r7, [sp], #4 - 8002a3a: 4770 bx lr - 8002a3c: 2000000c .word 0x2000000c - 8002a40: e000ed04 .word 0xe000ed04 - -08002a44 : + 8002960: bf00 nop + 8002962: 370c adds r7, #12 + 8002964: 46bd mov sp, r7 + 8002966: f85d 7b04 ldr.w r7, [sp], #4 + 800296a: 4770 bx lr + 800296c: 2000000c .word 0x2000000c + 8002970: e000ed04 .word 0xe000ed04 + +08002974 : /*-----------------------------------------------------------*/ void vPortExitCritical( void ) { - 8002a44: b480 push {r7} - 8002a46: b083 sub sp, #12 - 8002a48: af00 add r7, sp, #0 + 8002974: b480 push {r7} + 8002976: b083 sub sp, #12 + 8002978: af00 add r7, sp, #0 configASSERT( uxCriticalNesting ); - 8002a4a: 4b12 ldr r3, [pc, #72] ; (8002a94 ) - 8002a4c: 681b ldr r3, [r3, #0] - 8002a4e: 2b00 cmp r3, #0 - 8002a50: d10a bne.n 8002a68 + 800297a: 4b12 ldr r3, [pc, #72] ; (80029c4 ) + 800297c: 681b ldr r3, [r3, #0] + 800297e: 2b00 cmp r3, #0 + 8002980: d10a bne.n 8002998 __asm volatile - 8002a52: f04f 0350 mov.w r3, #80 ; 0x50 - 8002a56: f383 8811 msr BASEPRI, r3 - 8002a5a: f3bf 8f6f isb sy - 8002a5e: f3bf 8f4f dsb sy - 8002a62: 607b str r3, [r7, #4] + 8002982: f04f 0350 mov.w r3, #80 ; 0x50 + 8002986: f383 8811 msr BASEPRI, r3 + 800298a: f3bf 8f6f isb sy + 800298e: f3bf 8f4f dsb sy + 8002992: 607b str r3, [r7, #4] } - 8002a64: bf00 nop - 8002a66: e7fe b.n 8002a66 + 8002994: bf00 nop + 8002996: e7fe b.n 8002996 uxCriticalNesting--; - 8002a68: 4b0a ldr r3, [pc, #40] ; (8002a94 ) - 8002a6a: 681b ldr r3, [r3, #0] - 8002a6c: 3b01 subs r3, #1 - 8002a6e: 4a09 ldr r2, [pc, #36] ; (8002a94 ) - 8002a70: 6013 str r3, [r2, #0] + 8002998: 4b0a ldr r3, [pc, #40] ; (80029c4 ) + 800299a: 681b ldr r3, [r3, #0] + 800299c: 3b01 subs r3, #1 + 800299e: 4a09 ldr r2, [pc, #36] ; (80029c4 ) + 80029a0: 6013 str r3, [r2, #0] if( uxCriticalNesting == 0 ) - 8002a72: 4b08 ldr r3, [pc, #32] ; (8002a94 ) - 8002a74: 681b ldr r3, [r3, #0] - 8002a76: 2b00 cmp r3, #0 - 8002a78: d105 bne.n 8002a86 - 8002a7a: 2300 movs r3, #0 - 8002a7c: 603b str r3, [r7, #0] + 80029a2: 4b08 ldr r3, [pc, #32] ; (80029c4 ) + 80029a4: 681b ldr r3, [r3, #0] + 80029a6: 2b00 cmp r3, #0 + 80029a8: d105 bne.n 80029b6 + 80029aa: 2300 movs r3, #0 + 80029ac: 603b str r3, [r7, #0] } /*-----------------------------------------------------------*/ portFORCE_INLINE static void vPortSetBASEPRI( uint32_t ulNewMaskValue ) { __asm volatile - 8002a7e: 683b ldr r3, [r7, #0] - 8002a80: f383 8811 msr BASEPRI, r3 + 80029ae: 683b ldr r3, [r7, #0] + 80029b0: f383 8811 msr BASEPRI, r3 ( " msr basepri, %0 " :: "r" ( ulNewMaskValue ) : "memory" ); } - 8002a84: bf00 nop + 80029b4: bf00 nop { portENABLE_INTERRUPTS(); } } - 8002a86: bf00 nop - 8002a88: 370c adds r7, #12 - 8002a8a: 46bd mov sp, r7 - 8002a8c: f85d 7b04 ldr.w r7, [sp], #4 - 8002a90: 4770 bx lr - 8002a92: bf00 nop - 8002a94: 2000000c .word 0x2000000c + 80029b6: bf00 nop + 80029b8: 370c adds r7, #12 + 80029ba: 46bd mov sp, r7 + 80029bc: f85d 7b04 ldr.w r7, [sp], #4 + 80029c0: 4770 bx lr + 80029c2: bf00 nop + 80029c4: 2000000c .word 0x2000000c ... -08002aa0 : +080029d0 : void xPortPendSVHandler( void ) { /* This is a naked function. */ __asm volatile - 8002aa0: f3ef 8009 mrs r0, PSP - 8002aa4: f3bf 8f6f isb sy - 8002aa8: 4b15 ldr r3, [pc, #84] ; (8002b00 ) - 8002aaa: 681a ldr r2, [r3, #0] - 8002aac: f01e 0f10 tst.w lr, #16 - 8002ab0: bf08 it eq - 8002ab2: ed20 8a10 vstmdbeq r0!, {s16-s31} - 8002ab6: e920 4ff0 stmdb r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - 8002aba: 6010 str r0, [r2, #0] - 8002abc: e92d 0009 stmdb sp!, {r0, r3} - 8002ac0: f04f 0050 mov.w r0, #80 ; 0x50 - 8002ac4: f380 8811 msr BASEPRI, r0 - 8002ac8: f3bf 8f4f dsb sy - 8002acc: f3bf 8f6f isb sy - 8002ad0: f7ff fca2 bl 8002418 - 8002ad4: f04f 0000 mov.w r0, #0 - 8002ad8: f380 8811 msr BASEPRI, r0 - 8002adc: bc09 pop {r0, r3} - 8002ade: 6819 ldr r1, [r3, #0] - 8002ae0: 6808 ldr r0, [r1, #0] - 8002ae2: e8b0 4ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - 8002ae6: f01e 0f10 tst.w lr, #16 - 8002aea: bf08 it eq - 8002aec: ecb0 8a10 vldmiaeq r0!, {s16-s31} - 8002af0: f380 8809 msr PSP, r0 - 8002af4: f3bf 8f6f isb sy - 8002af8: 4770 bx lr - 8002afa: bf00 nop - 8002afc: f3af 8000 nop.w - -08002b00 : - 8002b00: 2000028c .word 0x2000028c + 80029d0: f3ef 8009 mrs r0, PSP + 80029d4: f3bf 8f6f isb sy + 80029d8: 4b15 ldr r3, [pc, #84] ; (8002a30 ) + 80029da: 681a ldr r2, [r3, #0] + 80029dc: f01e 0f10 tst.w lr, #16 + 80029e0: bf08 it eq + 80029e2: ed20 8a10 vstmdbeq r0!, {s16-s31} + 80029e6: e920 4ff0 stmdb r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 80029ea: 6010 str r0, [r2, #0] + 80029ec: e92d 0009 stmdb sp!, {r0, r3} + 80029f0: f04f 0050 mov.w r0, #80 ; 0x50 + 80029f4: f380 8811 msr BASEPRI, r0 + 80029f8: f3bf 8f4f dsb sy + 80029fc: f3bf 8f6f isb sy + 8002a00: f7ff fca8 bl 8002354 + 8002a04: f04f 0000 mov.w r0, #0 + 8002a08: f380 8811 msr BASEPRI, r0 + 8002a0c: bc09 pop {r0, r3} + 8002a0e: 6819 ldr r1, [r3, #0] + 8002a10: 6808 ldr r0, [r1, #0] + 8002a12: e8b0 4ff0 ldmia.w r0!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 8002a16: f01e 0f10 tst.w lr, #16 + 8002a1a: bf08 it eq + 8002a1c: ecb0 8a10 vldmiaeq r0!, {s16-s31} + 8002a20: f380 8809 msr PSP, r0 + 8002a24: f3bf 8f6f isb sy + 8002a28: 4770 bx lr + 8002a2a: bf00 nop + 8002a2c: f3af 8000 nop.w + +08002a30 : + 8002a30: 2000028c .word 0x2000028c " \n" " .align 4 \n" "pxCurrentTCBConst: .word pxCurrentTCB \n" ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) ); } - 8002b04: bf00 nop - 8002b06: bf00 nop + 8002a34: bf00 nop + 8002a36: bf00 nop -08002b08 : +08002a38 : /*-----------------------------------------------------------*/ void xPortSysTickHandler( void ) { - 8002b08: b580 push {r7, lr} - 8002b0a: b082 sub sp, #8 - 8002b0c: af00 add r7, sp, #0 + 8002a38: b580 push {r7, lr} + 8002a3a: b082 sub sp, #8 + 8002a3c: af00 add r7, sp, #0 __asm volatile - 8002b0e: f04f 0350 mov.w r3, #80 ; 0x50 - 8002b12: f383 8811 msr BASEPRI, r3 - 8002b16: f3bf 8f6f isb sy - 8002b1a: f3bf 8f4f dsb sy - 8002b1e: 607b str r3, [r7, #4] + 8002a3e: f04f 0350 mov.w r3, #80 ; 0x50 + 8002a42: f383 8811 msr BASEPRI, r3 + 8002a46: f3bf 8f6f isb sy + 8002a4a: f3bf 8f4f dsb sy + 8002a4e: 607b str r3, [r7, #4] } - 8002b20: bf00 nop + 8002a50: bf00 nop save and then restore the interrupt mask value as its value is already known. */ portDISABLE_INTERRUPTS(); { /* Increment the RTOS tick. */ if( xTaskIncrementTick() != pdFALSE ) - 8002b22: f7ff fbc1 bl 80022a8 - 8002b26: 4603 mov r3, r0 - 8002b28: 2b00 cmp r3, #0 - 8002b2a: d003 beq.n 8002b34 + 8002a52: f7ff fbc7 bl 80021e4 + 8002a56: 4603 mov r3, r0 + 8002a58: 2b00 cmp r3, #0 + 8002a5a: d003 beq.n 8002a64 { /* A context switch is required. Context switching is performed in the PendSV interrupt. Pend the PendSV interrupt. */ portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; - 8002b2c: 4b06 ldr r3, [pc, #24] ; (8002b48 ) - 8002b2e: f04f 5280 mov.w r2, #268435456 ; 0x10000000 - 8002b32: 601a str r2, [r3, #0] - 8002b34: 2300 movs r3, #0 - 8002b36: 603b str r3, [r7, #0] + 8002a5c: 4b06 ldr r3, [pc, #24] ; (8002a78 ) + 8002a5e: f04f 5280 mov.w r2, #268435456 ; 0x10000000 + 8002a62: 601a str r2, [r3, #0] + 8002a64: 2300 movs r3, #0 + 8002a66: 603b str r3, [r7, #0] __asm volatile - 8002b38: 683b ldr r3, [r7, #0] - 8002b3a: f383 8811 msr BASEPRI, r3 + 8002a68: 683b ldr r3, [r7, #0] + 8002a6a: f383 8811 msr BASEPRI, r3 } - 8002b3e: bf00 nop + 8002a6e: bf00 nop } } portENABLE_INTERRUPTS(); } - 8002b40: bf00 nop - 8002b42: 3708 adds r7, #8 - 8002b44: 46bd mov sp, r7 - 8002b46: bd80 pop {r7, pc} - 8002b48: e000ed04 .word 0xe000ed04 + 8002a70: bf00 nop + 8002a72: 3708 adds r7, #8 + 8002a74: 46bd mov sp, r7 + 8002a76: bd80 pop {r7, pc} + 8002a78: e000ed04 .word 0xe000ed04 -08002b4c : +08002a7c : /* * Setup the systick timer to generate the tick interrupts at the required * frequency. */ __attribute__(( weak )) void vPortSetupTimerInterrupt( void ) { - 8002b4c: b480 push {r7} - 8002b4e: af00 add r7, sp, #0 + 8002a7c: b480 push {r7} + 8002a7e: af00 add r7, sp, #0 ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); } #endif /* configUSE_TICKLESS_IDLE */ /* Stop and clear the SysTick. */ portNVIC_SYSTICK_CTRL_REG = 0UL; - 8002b50: 4b0b ldr r3, [pc, #44] ; (8002b80 ) - 8002b52: 2200 movs r2, #0 - 8002b54: 601a str r2, [r3, #0] + 8002a80: 4b0b ldr r3, [pc, #44] ; (8002ab0 ) + 8002a82: 2200 movs r2, #0 + 8002a84: 601a str r2, [r3, #0] portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; - 8002b56: 4b0b ldr r3, [pc, #44] ; (8002b84 ) - 8002b58: 2200 movs r2, #0 - 8002b5a: 601a str r2, [r3, #0] + 8002a86: 4b0b ldr r3, [pc, #44] ; (8002ab4 ) + 8002a88: 2200 movs r2, #0 + 8002a8a: 601a str r2, [r3, #0] /* Configure SysTick to interrupt at the requested rate. */ portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; - 8002b5c: 4b0a ldr r3, [pc, #40] ; (8002b88 ) - 8002b5e: 681b ldr r3, [r3, #0] - 8002b60: 4a0a ldr r2, [pc, #40] ; (8002b8c ) - 8002b62: fba2 2303 umull r2, r3, r2, r3 - 8002b66: 099b lsrs r3, r3, #6 - 8002b68: 4a09 ldr r2, [pc, #36] ; (8002b90 ) - 8002b6a: 3b01 subs r3, #1 - 8002b6c: 6013 str r3, [r2, #0] + 8002a8c: 4b0a ldr r3, [pc, #40] ; (8002ab8 ) + 8002a8e: 681b ldr r3, [r3, #0] + 8002a90: 4a0a ldr r2, [pc, #40] ; (8002abc ) + 8002a92: fba2 2303 umull r2, r3, r2, r3 + 8002a96: 099b lsrs r3, r3, #6 + 8002a98: 4a09 ldr r2, [pc, #36] ; (8002ac0 ) + 8002a9a: 3b01 subs r3, #1 + 8002a9c: 6013 str r3, [r2, #0] portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT ); - 8002b6e: 4b04 ldr r3, [pc, #16] ; (8002b80 ) - 8002b70: 2207 movs r2, #7 - 8002b72: 601a str r2, [r3, #0] + 8002a9e: 4b04 ldr r3, [pc, #16] ; (8002ab0 ) + 8002aa0: 2207 movs r2, #7 + 8002aa2: 601a str r2, [r3, #0] } - 8002b74: bf00 nop - 8002b76: 46bd mov sp, r7 - 8002b78: f85d 7b04 ldr.w r7, [sp], #4 - 8002b7c: 4770 bx lr - 8002b7e: bf00 nop - 8002b80: e000e010 .word 0xe000e010 - 8002b84: e000e018 .word 0xe000e018 - 8002b88: 20000000 .word 0x20000000 - 8002b8c: 10624dd3 .word 0x10624dd3 - 8002b90: e000e014 .word 0xe000e014 - -08002b94 : + 8002aa4: bf00 nop + 8002aa6: 46bd mov sp, r7 + 8002aa8: f85d 7b04 ldr.w r7, [sp], #4 + 8002aac: 4770 bx lr + 8002aae: bf00 nop + 8002ab0: e000e010 .word 0xe000e010 + 8002ab4: e000e018 .word 0xe000e018 + 8002ab8: 20000000 .word 0x20000000 + 8002abc: 10624dd3 .word 0x10624dd3 + 8002ac0: e000e014 .word 0xe000e014 + +08002ac4 : /*-----------------------------------------------------------*/ /* This is a naked function. */ static void vPortEnableVFP( void ) { __asm volatile - 8002b94: f8df 000c ldr.w r0, [pc, #12] ; 8002ba4 - 8002b98: 6801 ldr r1, [r0, #0] - 8002b9a: f441 0170 orr.w r1, r1, #15728640 ; 0xf00000 - 8002b9e: 6001 str r1, [r0, #0] - 8002ba0: 4770 bx lr + 8002ac4: f8df 000c ldr.w r0, [pc, #12] ; 8002ad4 + 8002ac8: 6801 ldr r1, [r0, #0] + 8002aca: f441 0170 orr.w r1, r1, #15728640 ; 0xf00000 + 8002ace: 6001 str r1, [r0, #0] + 8002ad0: 4770 bx lr " \n" " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ " str r1, [r0] \n" " bx r14 " ); } - 8002ba2: bf00 nop - 8002ba4: e000ed88 .word 0xe000ed88 + 8002ad2: bf00 nop + 8002ad4: e000ed88 .word 0xe000ed88 -08002ba8 : +08002ad8 : static size_t xBlockAllocatedBit = 0; /*-----------------------------------------------------------*/ void *pvPortMalloc( size_t xWantedSize ) { - 8002ba8: b580 push {r7, lr} - 8002baa: b08a sub sp, #40 ; 0x28 - 8002bac: af00 add r7, sp, #0 - 8002bae: 6078 str r0, [r7, #4] + 8002ad8: b580 push {r7, lr} + 8002ada: b08a sub sp, #40 ; 0x28 + 8002adc: af00 add r7, sp, #0 + 8002ade: 6078 str r0, [r7, #4] BlockLink_t *pxBlock, *pxPreviousBlock, *pxNewBlockLink; void *pvReturn = NULL; - 8002bb0: 2300 movs r3, #0 - 8002bb2: 61fb str r3, [r7, #28] + 8002ae0: 2300 movs r3, #0 + 8002ae2: 61fb str r3, [r7, #28] vTaskSuspendAll(); - 8002bb4: f7ff face bl 8002154 + 8002ae4: f7ff fad4 bl 8002090 { /* If this is the first call to malloc then the heap will require initialisation to setup the list of free blocks. */ if( pxEnd == NULL ) - 8002bb8: 4b5b ldr r3, [pc, #364] ; (8002d28 ) - 8002bba: 681b ldr r3, [r3, #0] - 8002bbc: 2b00 cmp r3, #0 - 8002bbe: d101 bne.n 8002bc4 + 8002ae8: 4b5b ldr r3, [pc, #364] ; (8002c58 ) + 8002aea: 681b ldr r3, [r3, #0] + 8002aec: 2b00 cmp r3, #0 + 8002aee: d101 bne.n 8002af4 { prvHeapInit(); - 8002bc0: f000 f920 bl 8002e04 + 8002af0: f000 f920 bl 8002d34 /* Check the requested block size is not so large that the top bit is set. The top bit of the block size member of the BlockLink_t structure is used to determine who owns the block - the application or the kernel, so it must be free. */ if( ( xWantedSize & xBlockAllocatedBit ) == 0 ) - 8002bc4: 4b59 ldr r3, [pc, #356] ; (8002d2c ) - 8002bc6: 681a ldr r2, [r3, #0] - 8002bc8: 687b ldr r3, [r7, #4] - 8002bca: 4013 ands r3, r2 - 8002bcc: 2b00 cmp r3, #0 - 8002bce: f040 8093 bne.w 8002cf8 + 8002af4: 4b59 ldr r3, [pc, #356] ; (8002c5c ) + 8002af6: 681a ldr r2, [r3, #0] + 8002af8: 687b ldr r3, [r7, #4] + 8002afa: 4013 ands r3, r2 + 8002afc: 2b00 cmp r3, #0 + 8002afe: f040 8093 bne.w 8002c28 { /* The wanted size is increased so it can contain a BlockLink_t structure in addition to the requested amount of bytes. */ if( xWantedSize > 0 ) - 8002bd2: 687b ldr r3, [r7, #4] - 8002bd4: 2b00 cmp r3, #0 - 8002bd6: d01d beq.n 8002c14 + 8002b02: 687b ldr r3, [r7, #4] + 8002b04: 2b00 cmp r3, #0 + 8002b06: d01d beq.n 8002b44 { xWantedSize += xHeapStructSize; - 8002bd8: 2208 movs r2, #8 - 8002bda: 687b ldr r3, [r7, #4] - 8002bdc: 4413 add r3, r2 - 8002bde: 607b str r3, [r7, #4] + 8002b08: 2208 movs r2, #8 + 8002b0a: 687b ldr r3, [r7, #4] + 8002b0c: 4413 add r3, r2 + 8002b0e: 607b str r3, [r7, #4] /* Ensure that blocks are always aligned to the required number of bytes. */ if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 ) - 8002be0: 687b ldr r3, [r7, #4] - 8002be2: f003 0307 and.w r3, r3, #7 - 8002be6: 2b00 cmp r3, #0 - 8002be8: d014 beq.n 8002c14 + 8002b10: 687b ldr r3, [r7, #4] + 8002b12: f003 0307 and.w r3, r3, #7 + 8002b16: 2b00 cmp r3, #0 + 8002b18: d014 beq.n 8002b44 { /* Byte alignment required. */ xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); - 8002bea: 687b ldr r3, [r7, #4] - 8002bec: f023 0307 bic.w r3, r3, #7 - 8002bf0: 3308 adds r3, #8 - 8002bf2: 607b str r3, [r7, #4] + 8002b1a: 687b ldr r3, [r7, #4] + 8002b1c: f023 0307 bic.w r3, r3, #7 + 8002b20: 3308 adds r3, #8 + 8002b22: 607b str r3, [r7, #4] configASSERT( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) == 0 ); - 8002bf4: 687b ldr r3, [r7, #4] - 8002bf6: f003 0307 and.w r3, r3, #7 - 8002bfa: 2b00 cmp r3, #0 - 8002bfc: d00a beq.n 8002c14 + 8002b24: 687b ldr r3, [r7, #4] + 8002b26: f003 0307 and.w r3, r3, #7 + 8002b2a: 2b00 cmp r3, #0 + 8002b2c: d00a beq.n 8002b44 __asm volatile - 8002bfe: f04f 0350 mov.w r3, #80 ; 0x50 - 8002c02: f383 8811 msr BASEPRI, r3 - 8002c06: f3bf 8f6f isb sy - 8002c0a: f3bf 8f4f dsb sy - 8002c0e: 617b str r3, [r7, #20] + 8002b2e: f04f 0350 mov.w r3, #80 ; 0x50 + 8002b32: f383 8811 msr BASEPRI, r3 + 8002b36: f3bf 8f6f isb sy + 8002b3a: f3bf 8f4f dsb sy + 8002b3e: 617b str r3, [r7, #20] } - 8002c10: bf00 nop - 8002c12: e7fe b.n 8002c12 + 8002b40: bf00 nop + 8002b42: e7fe b.n 8002b42 else { mtCOVERAGE_TEST_MARKER(); } if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) ) - 8002c14: 687b ldr r3, [r7, #4] - 8002c16: 2b00 cmp r3, #0 - 8002c18: d06e beq.n 8002cf8 - 8002c1a: 4b45 ldr r3, [pc, #276] ; (8002d30 ) - 8002c1c: 681b ldr r3, [r3, #0] - 8002c1e: 687a ldr r2, [r7, #4] - 8002c20: 429a cmp r2, r3 - 8002c22: d869 bhi.n 8002cf8 + 8002b44: 687b ldr r3, [r7, #4] + 8002b46: 2b00 cmp r3, #0 + 8002b48: d06e beq.n 8002c28 + 8002b4a: 4b45 ldr r3, [pc, #276] ; (8002c60 ) + 8002b4c: 681b ldr r3, [r3, #0] + 8002b4e: 687a ldr r2, [r7, #4] + 8002b50: 429a cmp r2, r3 + 8002b52: d869 bhi.n 8002c28 { /* Traverse the list from the start (lowest address) block until one of adequate size is found. */ pxPreviousBlock = &xStart; - 8002c24: 4b43 ldr r3, [pc, #268] ; (8002d34 ) - 8002c26: 623b str r3, [r7, #32] + 8002b54: 4b43 ldr r3, [pc, #268] ; (8002c64 ) + 8002b56: 623b str r3, [r7, #32] pxBlock = xStart.pxNextFreeBlock; - 8002c28: 4b42 ldr r3, [pc, #264] ; (8002d34 ) - 8002c2a: 681b ldr r3, [r3, #0] - 8002c2c: 627b str r3, [r7, #36] ; 0x24 + 8002b58: 4b42 ldr r3, [pc, #264] ; (8002c64 ) + 8002b5a: 681b ldr r3, [r3, #0] + 8002b5c: 627b str r3, [r7, #36] ; 0x24 while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) - 8002c2e: e004 b.n 8002c3a + 8002b5e: e004 b.n 8002b6a { pxPreviousBlock = pxBlock; - 8002c30: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002c32: 623b str r3, [r7, #32] + 8002b60: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002b62: 623b str r3, [r7, #32] pxBlock = pxBlock->pxNextFreeBlock; - 8002c34: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002c36: 681b ldr r3, [r3, #0] - 8002c38: 627b str r3, [r7, #36] ; 0x24 + 8002b64: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002b66: 681b ldr r3, [r3, #0] + 8002b68: 627b str r3, [r7, #36] ; 0x24 while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) - 8002c3a: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002c3c: 685b ldr r3, [r3, #4] - 8002c3e: 687a ldr r2, [r7, #4] - 8002c40: 429a cmp r2, r3 - 8002c42: d903 bls.n 8002c4c - 8002c44: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002c46: 681b ldr r3, [r3, #0] - 8002c48: 2b00 cmp r3, #0 - 8002c4a: d1f1 bne.n 8002c30 + 8002b6a: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002b6c: 685b ldr r3, [r3, #4] + 8002b6e: 687a ldr r2, [r7, #4] + 8002b70: 429a cmp r2, r3 + 8002b72: d903 bls.n 8002b7c + 8002b74: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002b76: 681b ldr r3, [r3, #0] + 8002b78: 2b00 cmp r3, #0 + 8002b7a: d1f1 bne.n 8002b60 } /* If the end marker was reached then a block of adequate size was not found. */ if( pxBlock != pxEnd ) - 8002c4c: 4b36 ldr r3, [pc, #216] ; (8002d28 ) - 8002c4e: 681b ldr r3, [r3, #0] - 8002c50: 6a7a ldr r2, [r7, #36] ; 0x24 - 8002c52: 429a cmp r2, r3 - 8002c54: d050 beq.n 8002cf8 + 8002b7c: 4b36 ldr r3, [pc, #216] ; (8002c58 ) + 8002b7e: 681b ldr r3, [r3, #0] + 8002b80: 6a7a ldr r2, [r7, #36] ; 0x24 + 8002b82: 429a cmp r2, r3 + 8002b84: d050 beq.n 8002c28 { /* Return the memory space pointed to - jumping over the BlockLink_t structure at its start. */ pvReturn = ( void * ) ( ( ( uint8_t * ) pxPreviousBlock->pxNextFreeBlock ) + xHeapStructSize ); - 8002c56: 6a3b ldr r3, [r7, #32] - 8002c58: 681b ldr r3, [r3, #0] - 8002c5a: 2208 movs r2, #8 - 8002c5c: 4413 add r3, r2 - 8002c5e: 61fb str r3, [r7, #28] + 8002b86: 6a3b ldr r3, [r7, #32] + 8002b88: 681b ldr r3, [r3, #0] + 8002b8a: 2208 movs r2, #8 + 8002b8c: 4413 add r3, r2 + 8002b8e: 61fb str r3, [r7, #28] /* This block is being returned for use so must be taken out of the list of free blocks. */ pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; - 8002c60: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002c62: 681a ldr r2, [r3, #0] - 8002c64: 6a3b ldr r3, [r7, #32] - 8002c66: 601a str r2, [r3, #0] + 8002b90: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002b92: 681a ldr r2, [r3, #0] + 8002b94: 6a3b ldr r3, [r7, #32] + 8002b96: 601a str r2, [r3, #0] /* If the block is larger than required it can be split into two. */ if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) - 8002c68: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002c6a: 685a ldr r2, [r3, #4] - 8002c6c: 687b ldr r3, [r7, #4] - 8002c6e: 1ad2 subs r2, r2, r3 - 8002c70: 2308 movs r3, #8 - 8002c72: 005b lsls r3, r3, #1 - 8002c74: 429a cmp r2, r3 - 8002c76: d91f bls.n 8002cb8 + 8002b98: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002b9a: 685a ldr r2, [r3, #4] + 8002b9c: 687b ldr r3, [r7, #4] + 8002b9e: 1ad2 subs r2, r2, r3 + 8002ba0: 2308 movs r3, #8 + 8002ba2: 005b lsls r3, r3, #1 + 8002ba4: 429a cmp r2, r3 + 8002ba6: d91f bls.n 8002be8 { /* This block is to be split into two. Create a new block following the number of bytes requested. The void cast is used to prevent byte alignment warnings from the compiler. */ pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize ); - 8002c78: 6a7a ldr r2, [r7, #36] ; 0x24 - 8002c7a: 687b ldr r3, [r7, #4] - 8002c7c: 4413 add r3, r2 - 8002c7e: 61bb str r3, [r7, #24] + 8002ba8: 6a7a ldr r2, [r7, #36] ; 0x24 + 8002baa: 687b ldr r3, [r7, #4] + 8002bac: 4413 add r3, r2 + 8002bae: 61bb str r3, [r7, #24] configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 ); - 8002c80: 69bb ldr r3, [r7, #24] - 8002c82: f003 0307 and.w r3, r3, #7 - 8002c86: 2b00 cmp r3, #0 - 8002c88: d00a beq.n 8002ca0 + 8002bb0: 69bb ldr r3, [r7, #24] + 8002bb2: f003 0307 and.w r3, r3, #7 + 8002bb6: 2b00 cmp r3, #0 + 8002bb8: d00a beq.n 8002bd0 __asm volatile - 8002c8a: f04f 0350 mov.w r3, #80 ; 0x50 - 8002c8e: f383 8811 msr BASEPRI, r3 - 8002c92: f3bf 8f6f isb sy - 8002c96: f3bf 8f4f dsb sy - 8002c9a: 613b str r3, [r7, #16] + 8002bba: f04f 0350 mov.w r3, #80 ; 0x50 + 8002bbe: f383 8811 msr BASEPRI, r3 + 8002bc2: f3bf 8f6f isb sy + 8002bc6: f3bf 8f4f dsb sy + 8002bca: 613b str r3, [r7, #16] } - 8002c9c: bf00 nop - 8002c9e: e7fe b.n 8002c9e + 8002bcc: bf00 nop + 8002bce: e7fe b.n 8002bce /* Calculate the sizes of two blocks split from the single block. */ pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; - 8002ca0: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002ca2: 685a ldr r2, [r3, #4] - 8002ca4: 687b ldr r3, [r7, #4] - 8002ca6: 1ad2 subs r2, r2, r3 - 8002ca8: 69bb ldr r3, [r7, #24] - 8002caa: 605a str r2, [r3, #4] + 8002bd0: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002bd2: 685a ldr r2, [r3, #4] + 8002bd4: 687b ldr r3, [r7, #4] + 8002bd6: 1ad2 subs r2, r2, r3 + 8002bd8: 69bb ldr r3, [r7, #24] + 8002bda: 605a str r2, [r3, #4] pxBlock->xBlockSize = xWantedSize; - 8002cac: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002cae: 687a ldr r2, [r7, #4] - 8002cb0: 605a str r2, [r3, #4] + 8002bdc: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002bde: 687a ldr r2, [r7, #4] + 8002be0: 605a str r2, [r3, #4] /* Insert the new block into the list of free blocks. */ prvInsertBlockIntoFreeList( pxNewBlockLink ); - 8002cb2: 69b8 ldr r0, [r7, #24] - 8002cb4: f000 f908 bl 8002ec8 + 8002be2: 69b8 ldr r0, [r7, #24] + 8002be4: f000 f908 bl 8002df8 else { mtCOVERAGE_TEST_MARKER(); } xFreeBytesRemaining -= pxBlock->xBlockSize; - 8002cb8: 4b1d ldr r3, [pc, #116] ; (8002d30 ) - 8002cba: 681a ldr r2, [r3, #0] - 8002cbc: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002cbe: 685b ldr r3, [r3, #4] - 8002cc0: 1ad3 subs r3, r2, r3 - 8002cc2: 4a1b ldr r2, [pc, #108] ; (8002d30 ) - 8002cc4: 6013 str r3, [r2, #0] + 8002be8: 4b1d ldr r3, [pc, #116] ; (8002c60 ) + 8002bea: 681a ldr r2, [r3, #0] + 8002bec: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002bee: 685b ldr r3, [r3, #4] + 8002bf0: 1ad3 subs r3, r2, r3 + 8002bf2: 4a1b ldr r2, [pc, #108] ; (8002c60 ) + 8002bf4: 6013 str r3, [r2, #0] if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining ) - 8002cc6: 4b1a ldr r3, [pc, #104] ; (8002d30 ) - 8002cc8: 681a ldr r2, [r3, #0] - 8002cca: 4b1b ldr r3, [pc, #108] ; (8002d38 ) - 8002ccc: 681b ldr r3, [r3, #0] - 8002cce: 429a cmp r2, r3 - 8002cd0: d203 bcs.n 8002cda + 8002bf6: 4b1a ldr r3, [pc, #104] ; (8002c60 ) + 8002bf8: 681a ldr r2, [r3, #0] + 8002bfa: 4b1b ldr r3, [pc, #108] ; (8002c68 ) + 8002bfc: 681b ldr r3, [r3, #0] + 8002bfe: 429a cmp r2, r3 + 8002c00: d203 bcs.n 8002c0a { xMinimumEverFreeBytesRemaining = xFreeBytesRemaining; - 8002cd2: 4b17 ldr r3, [pc, #92] ; (8002d30 ) - 8002cd4: 681b ldr r3, [r3, #0] - 8002cd6: 4a18 ldr r2, [pc, #96] ; (8002d38 ) - 8002cd8: 6013 str r3, [r2, #0] + 8002c02: 4b17 ldr r3, [pc, #92] ; (8002c60 ) + 8002c04: 681b ldr r3, [r3, #0] + 8002c06: 4a18 ldr r2, [pc, #96] ; (8002c68 ) + 8002c08: 6013 str r3, [r2, #0] mtCOVERAGE_TEST_MARKER(); } /* The block is being returned - it is allocated and owned by the application and has no "next" block. */ pxBlock->xBlockSize |= xBlockAllocatedBit; - 8002cda: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002cdc: 685a ldr r2, [r3, #4] - 8002cde: 4b13 ldr r3, [pc, #76] ; (8002d2c ) - 8002ce0: 681b ldr r3, [r3, #0] - 8002ce2: 431a orrs r2, r3 - 8002ce4: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002ce6: 605a str r2, [r3, #4] + 8002c0a: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c0c: 685a ldr r2, [r3, #4] + 8002c0e: 4b13 ldr r3, [pc, #76] ; (8002c5c ) + 8002c10: 681b ldr r3, [r3, #0] + 8002c12: 431a orrs r2, r3 + 8002c14: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c16: 605a str r2, [r3, #4] pxBlock->pxNextFreeBlock = NULL; - 8002ce8: 6a7b ldr r3, [r7, #36] ; 0x24 - 8002cea: 2200 movs r2, #0 - 8002cec: 601a str r2, [r3, #0] + 8002c18: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c1a: 2200 movs r2, #0 + 8002c1c: 601a str r2, [r3, #0] xNumberOfSuccessfulAllocations++; - 8002cee: 4b13 ldr r3, [pc, #76] ; (8002d3c ) - 8002cf0: 681b ldr r3, [r3, #0] - 8002cf2: 3301 adds r3, #1 - 8002cf4: 4a11 ldr r2, [pc, #68] ; (8002d3c ) - 8002cf6: 6013 str r3, [r2, #0] + 8002c1e: 4b13 ldr r3, [pc, #76] ; (8002c6c ) + 8002c20: 681b ldr r3, [r3, #0] + 8002c22: 3301 adds r3, #1 + 8002c24: 4a11 ldr r2, [pc, #68] ; (8002c6c ) + 8002c26: 6013 str r3, [r2, #0] mtCOVERAGE_TEST_MARKER(); } traceMALLOC( pvReturn, xWantedSize ); } ( void ) xTaskResumeAll(); - 8002cf8: f7ff fa3a bl 8002170 + 8002c28: f7ff fa40 bl 80020ac mtCOVERAGE_TEST_MARKER(); } } #endif configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 ); - 8002cfc: 69fb ldr r3, [r7, #28] - 8002cfe: f003 0307 and.w r3, r3, #7 - 8002d02: 2b00 cmp r3, #0 - 8002d04: d00a beq.n 8002d1c + 8002c2c: 69fb ldr r3, [r7, #28] + 8002c2e: f003 0307 and.w r3, r3, #7 + 8002c32: 2b00 cmp r3, #0 + 8002c34: d00a beq.n 8002c4c __asm volatile - 8002d06: f04f 0350 mov.w r3, #80 ; 0x50 - 8002d0a: f383 8811 msr BASEPRI, r3 - 8002d0e: f3bf 8f6f isb sy - 8002d12: f3bf 8f4f dsb sy - 8002d16: 60fb str r3, [r7, #12] + 8002c36: f04f 0350 mov.w r3, #80 ; 0x50 + 8002c3a: f383 8811 msr BASEPRI, r3 + 8002c3e: f3bf 8f6f isb sy + 8002c42: f3bf 8f4f dsb sy + 8002c46: 60fb str r3, [r7, #12] } - 8002d18: bf00 nop - 8002d1a: e7fe b.n 8002d1a + 8002c48: bf00 nop + 8002c4a: e7fe b.n 8002c4a return pvReturn; - 8002d1c: 69fb ldr r3, [r7, #28] + 8002c4c: 69fb ldr r3, [r7, #28] } - 8002d1e: 4618 mov r0, r3 - 8002d20: 3728 adds r7, #40 ; 0x28 - 8002d22: 46bd mov sp, r7 - 8002d24: bd80 pop {r7, pc} - 8002d26: bf00 nop - 8002d28: 20003fc8 .word 0x20003fc8 - 8002d2c: 20003fdc .word 0x20003fdc - 8002d30: 20003fcc .word 0x20003fcc - 8002d34: 20003fc0 .word 0x20003fc0 - 8002d38: 20003fd0 .word 0x20003fd0 - 8002d3c: 20003fd4 .word 0x20003fd4 - -08002d40 : + 8002c4e: 4618 mov r0, r3 + 8002c50: 3728 adds r7, #40 ; 0x28 + 8002c52: 46bd mov sp, r7 + 8002c54: bd80 pop {r7, pc} + 8002c56: bf00 nop + 8002c58: 20003fc8 .word 0x20003fc8 + 8002c5c: 20003fdc .word 0x20003fdc + 8002c60: 20003fcc .word 0x20003fcc + 8002c64: 20003fc0 .word 0x20003fc0 + 8002c68: 20003fd0 .word 0x20003fd0 + 8002c6c: 20003fd4 .word 0x20003fd4 + +08002c70 : /*-----------------------------------------------------------*/ void vPortFree( void *pv ) { - 8002d40: b580 push {r7, lr} - 8002d42: b086 sub sp, #24 - 8002d44: af00 add r7, sp, #0 - 8002d46: 6078 str r0, [r7, #4] + 8002c70: b580 push {r7, lr} + 8002c72: b086 sub sp, #24 + 8002c74: af00 add r7, sp, #0 + 8002c76: 6078 str r0, [r7, #4] uint8_t *puc = ( uint8_t * ) pv; - 8002d48: 687b ldr r3, [r7, #4] - 8002d4a: 617b str r3, [r7, #20] + 8002c78: 687b ldr r3, [r7, #4] + 8002c7a: 617b str r3, [r7, #20] BlockLink_t *pxLink; if( pv != NULL ) - 8002d4c: 687b ldr r3, [r7, #4] - 8002d4e: 2b00 cmp r3, #0 - 8002d50: d04d beq.n 8002dee + 8002c7c: 687b ldr r3, [r7, #4] + 8002c7e: 2b00 cmp r3, #0 + 8002c80: d04d beq.n 8002d1e { /* The memory being freed will have an BlockLink_t structure immediately before it. */ puc -= xHeapStructSize; - 8002d52: 2308 movs r3, #8 - 8002d54: 425b negs r3, r3 - 8002d56: 697a ldr r2, [r7, #20] - 8002d58: 4413 add r3, r2 - 8002d5a: 617b str r3, [r7, #20] + 8002c82: 2308 movs r3, #8 + 8002c84: 425b negs r3, r3 + 8002c86: 697a ldr r2, [r7, #20] + 8002c88: 4413 add r3, r2 + 8002c8a: 617b str r3, [r7, #20] /* This casting is to keep the compiler from issuing warnings. */ pxLink = ( void * ) puc; - 8002d5c: 697b ldr r3, [r7, #20] - 8002d5e: 613b str r3, [r7, #16] + 8002c8c: 697b ldr r3, [r7, #20] + 8002c8e: 613b str r3, [r7, #16] /* Check the block is actually allocated. */ configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); - 8002d60: 693b ldr r3, [r7, #16] - 8002d62: 685a ldr r2, [r3, #4] - 8002d64: 4b24 ldr r3, [pc, #144] ; (8002df8 ) - 8002d66: 681b ldr r3, [r3, #0] - 8002d68: 4013 ands r3, r2 - 8002d6a: 2b00 cmp r3, #0 - 8002d6c: d10a bne.n 8002d84 + 8002c90: 693b ldr r3, [r7, #16] + 8002c92: 685a ldr r2, [r3, #4] + 8002c94: 4b24 ldr r3, [pc, #144] ; (8002d28 ) + 8002c96: 681b ldr r3, [r3, #0] + 8002c98: 4013 ands r3, r2 + 8002c9a: 2b00 cmp r3, #0 + 8002c9c: d10a bne.n 8002cb4 __asm volatile - 8002d6e: f04f 0350 mov.w r3, #80 ; 0x50 - 8002d72: f383 8811 msr BASEPRI, r3 - 8002d76: f3bf 8f6f isb sy - 8002d7a: f3bf 8f4f dsb sy - 8002d7e: 60fb str r3, [r7, #12] + 8002c9e: f04f 0350 mov.w r3, #80 ; 0x50 + 8002ca2: f383 8811 msr BASEPRI, r3 + 8002ca6: f3bf 8f6f isb sy + 8002caa: f3bf 8f4f dsb sy + 8002cae: 60fb str r3, [r7, #12] } - 8002d80: bf00 nop - 8002d82: e7fe b.n 8002d82 + 8002cb0: bf00 nop + 8002cb2: e7fe b.n 8002cb2 configASSERT( pxLink->pxNextFreeBlock == NULL ); - 8002d84: 693b ldr r3, [r7, #16] - 8002d86: 681b ldr r3, [r3, #0] - 8002d88: 2b00 cmp r3, #0 - 8002d8a: d00a beq.n 8002da2 + 8002cb4: 693b ldr r3, [r7, #16] + 8002cb6: 681b ldr r3, [r3, #0] + 8002cb8: 2b00 cmp r3, #0 + 8002cba: d00a beq.n 8002cd2 __asm volatile - 8002d8c: f04f 0350 mov.w r3, #80 ; 0x50 - 8002d90: f383 8811 msr BASEPRI, r3 - 8002d94: f3bf 8f6f isb sy - 8002d98: f3bf 8f4f dsb sy - 8002d9c: 60bb str r3, [r7, #8] + 8002cbc: f04f 0350 mov.w r3, #80 ; 0x50 + 8002cc0: f383 8811 msr BASEPRI, r3 + 8002cc4: f3bf 8f6f isb sy + 8002cc8: f3bf 8f4f dsb sy + 8002ccc: 60bb str r3, [r7, #8] } - 8002d9e: bf00 nop - 8002da0: e7fe b.n 8002da0 + 8002cce: bf00 nop + 8002cd0: e7fe b.n 8002cd0 if( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ) - 8002da2: 693b ldr r3, [r7, #16] - 8002da4: 685a ldr r2, [r3, #4] - 8002da6: 4b14 ldr r3, [pc, #80] ; (8002df8 ) - 8002da8: 681b ldr r3, [r3, #0] - 8002daa: 4013 ands r3, r2 - 8002dac: 2b00 cmp r3, #0 - 8002dae: d01e beq.n 8002dee + 8002cd2: 693b ldr r3, [r7, #16] + 8002cd4: 685a ldr r2, [r3, #4] + 8002cd6: 4b14 ldr r3, [pc, #80] ; (8002d28 ) + 8002cd8: 681b ldr r3, [r3, #0] + 8002cda: 4013 ands r3, r2 + 8002cdc: 2b00 cmp r3, #0 + 8002cde: d01e beq.n 8002d1e { if( pxLink->pxNextFreeBlock == NULL ) - 8002db0: 693b ldr r3, [r7, #16] - 8002db2: 681b ldr r3, [r3, #0] - 8002db4: 2b00 cmp r3, #0 - 8002db6: d11a bne.n 8002dee + 8002ce0: 693b ldr r3, [r7, #16] + 8002ce2: 681b ldr r3, [r3, #0] + 8002ce4: 2b00 cmp r3, #0 + 8002ce6: d11a bne.n 8002d1e { /* The block is being returned to the heap - it is no longer allocated. */ pxLink->xBlockSize &= ~xBlockAllocatedBit; - 8002db8: 693b ldr r3, [r7, #16] - 8002dba: 685a ldr r2, [r3, #4] - 8002dbc: 4b0e ldr r3, [pc, #56] ; (8002df8 ) - 8002dbe: 681b ldr r3, [r3, #0] - 8002dc0: 43db mvns r3, r3 - 8002dc2: 401a ands r2, r3 - 8002dc4: 693b ldr r3, [r7, #16] - 8002dc6: 605a str r2, [r3, #4] + 8002ce8: 693b ldr r3, [r7, #16] + 8002cea: 685a ldr r2, [r3, #4] + 8002cec: 4b0e ldr r3, [pc, #56] ; (8002d28 ) + 8002cee: 681b ldr r3, [r3, #0] + 8002cf0: 43db mvns r3, r3 + 8002cf2: 401a ands r2, r3 + 8002cf4: 693b ldr r3, [r7, #16] + 8002cf6: 605a str r2, [r3, #4] vTaskSuspendAll(); - 8002dc8: f7ff f9c4 bl 8002154 + 8002cf8: f7ff f9ca bl 8002090 { /* Add this block to the list of free blocks. */ xFreeBytesRemaining += pxLink->xBlockSize; - 8002dcc: 693b ldr r3, [r7, #16] - 8002dce: 685a ldr r2, [r3, #4] - 8002dd0: 4b0a ldr r3, [pc, #40] ; (8002dfc ) - 8002dd2: 681b ldr r3, [r3, #0] - 8002dd4: 4413 add r3, r2 - 8002dd6: 4a09 ldr r2, [pc, #36] ; (8002dfc ) - 8002dd8: 6013 str r3, [r2, #0] + 8002cfc: 693b ldr r3, [r7, #16] + 8002cfe: 685a ldr r2, [r3, #4] + 8002d00: 4b0a ldr r3, [pc, #40] ; (8002d2c ) + 8002d02: 681b ldr r3, [r3, #0] + 8002d04: 4413 add r3, r2 + 8002d06: 4a09 ldr r2, [pc, #36] ; (8002d2c ) + 8002d08: 6013 str r3, [r2, #0] traceFREE( pv, pxLink->xBlockSize ); prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) ); - 8002dda: 6938 ldr r0, [r7, #16] - 8002ddc: f000 f874 bl 8002ec8 + 8002d0a: 6938 ldr r0, [r7, #16] + 8002d0c: f000 f874 bl 8002df8 xNumberOfSuccessfulFrees++; - 8002de0: 4b07 ldr r3, [pc, #28] ; (8002e00 ) - 8002de2: 681b ldr r3, [r3, #0] - 8002de4: 3301 adds r3, #1 - 8002de6: 4a06 ldr r2, [pc, #24] ; (8002e00 ) - 8002de8: 6013 str r3, [r2, #0] + 8002d10: 4b07 ldr r3, [pc, #28] ; (8002d30 ) + 8002d12: 681b ldr r3, [r3, #0] + 8002d14: 3301 adds r3, #1 + 8002d16: 4a06 ldr r2, [pc, #24] ; (8002d30 ) + 8002d18: 6013 str r3, [r2, #0] } ( void ) xTaskResumeAll(); - 8002dea: f7ff f9c1 bl 8002170 + 8002d1a: f7ff f9c7 bl 80020ac else { mtCOVERAGE_TEST_MARKER(); } } } - 8002dee: bf00 nop - 8002df0: 3718 adds r7, #24 - 8002df2: 46bd mov sp, r7 - 8002df4: bd80 pop {r7, pc} - 8002df6: bf00 nop - 8002df8: 20003fdc .word 0x20003fdc - 8002dfc: 20003fcc .word 0x20003fcc - 8002e00: 20003fd8 .word 0x20003fd8 - -08002e04 : + 8002d1e: bf00 nop + 8002d20: 3718 adds r7, #24 + 8002d22: 46bd mov sp, r7 + 8002d24: bd80 pop {r7, pc} + 8002d26: bf00 nop + 8002d28: 20003fdc .word 0x20003fdc + 8002d2c: 20003fcc .word 0x20003fcc + 8002d30: 20003fd8 .word 0x20003fd8 + +08002d34 : /* This just exists to keep the linker quiet. */ } /*-----------------------------------------------------------*/ static void prvHeapInit( void ) { - 8002e04: b480 push {r7} - 8002e06: b085 sub sp, #20 - 8002e08: af00 add r7, sp, #0 + 8002d34: b480 push {r7} + 8002d36: b085 sub sp, #20 + 8002d38: af00 add r7, sp, #0 BlockLink_t *pxFirstFreeBlock; uint8_t *pucAlignedHeap; size_t uxAddress; size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; - 8002e0a: f44f 5370 mov.w r3, #15360 ; 0x3c00 - 8002e0e: 60bb str r3, [r7, #8] + 8002d3a: f44f 5370 mov.w r3, #15360 ; 0x3c00 + 8002d3e: 60bb str r3, [r7, #8] /* Ensure the heap starts on a correctly aligned boundary. */ uxAddress = ( size_t ) ucHeap; - 8002e10: 4b27 ldr r3, [pc, #156] ; (8002eb0 ) - 8002e12: 60fb str r3, [r7, #12] + 8002d40: 4b27 ldr r3, [pc, #156] ; (8002de0 ) + 8002d42: 60fb str r3, [r7, #12] if( ( uxAddress & portBYTE_ALIGNMENT_MASK ) != 0 ) - 8002e14: 68fb ldr r3, [r7, #12] - 8002e16: f003 0307 and.w r3, r3, #7 - 8002e1a: 2b00 cmp r3, #0 - 8002e1c: d00c beq.n 8002e38 + 8002d44: 68fb ldr r3, [r7, #12] + 8002d46: f003 0307 and.w r3, r3, #7 + 8002d4a: 2b00 cmp r3, #0 + 8002d4c: d00c beq.n 8002d68 { uxAddress += ( portBYTE_ALIGNMENT - 1 ); - 8002e1e: 68fb ldr r3, [r7, #12] - 8002e20: 3307 adds r3, #7 - 8002e22: 60fb str r3, [r7, #12] + 8002d4e: 68fb ldr r3, [r7, #12] + 8002d50: 3307 adds r3, #7 + 8002d52: 60fb str r3, [r7, #12] uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); - 8002e24: 68fb ldr r3, [r7, #12] - 8002e26: f023 0307 bic.w r3, r3, #7 - 8002e2a: 60fb str r3, [r7, #12] + 8002d54: 68fb ldr r3, [r7, #12] + 8002d56: f023 0307 bic.w r3, r3, #7 + 8002d5a: 60fb str r3, [r7, #12] xTotalHeapSize -= uxAddress - ( size_t ) ucHeap; - 8002e2c: 68ba ldr r2, [r7, #8] - 8002e2e: 68fb ldr r3, [r7, #12] - 8002e30: 1ad3 subs r3, r2, r3 - 8002e32: 4a1f ldr r2, [pc, #124] ; (8002eb0 ) - 8002e34: 4413 add r3, r2 - 8002e36: 60bb str r3, [r7, #8] + 8002d5c: 68ba ldr r2, [r7, #8] + 8002d5e: 68fb ldr r3, [r7, #12] + 8002d60: 1ad3 subs r3, r2, r3 + 8002d62: 4a1f ldr r2, [pc, #124] ; (8002de0 ) + 8002d64: 4413 add r3, r2 + 8002d66: 60bb str r3, [r7, #8] } pucAlignedHeap = ( uint8_t * ) uxAddress; - 8002e38: 68fb ldr r3, [r7, #12] - 8002e3a: 607b str r3, [r7, #4] + 8002d68: 68fb ldr r3, [r7, #12] + 8002d6a: 607b str r3, [r7, #4] /* xStart is used to hold a pointer to the first item in the list of free blocks. The void cast is used to prevent compiler warnings. */ xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; - 8002e3c: 4a1d ldr r2, [pc, #116] ; (8002eb4 ) - 8002e3e: 687b ldr r3, [r7, #4] - 8002e40: 6013 str r3, [r2, #0] + 8002d6c: 4a1d ldr r2, [pc, #116] ; (8002de4 ) + 8002d6e: 687b ldr r3, [r7, #4] + 8002d70: 6013 str r3, [r2, #0] xStart.xBlockSize = ( size_t ) 0; - 8002e42: 4b1c ldr r3, [pc, #112] ; (8002eb4 ) - 8002e44: 2200 movs r2, #0 - 8002e46: 605a str r2, [r3, #4] + 8002d72: 4b1c ldr r3, [pc, #112] ; (8002de4 ) + 8002d74: 2200 movs r2, #0 + 8002d76: 605a str r2, [r3, #4] /* pxEnd is used to mark the end of the list of free blocks and is inserted at the end of the heap space. */ uxAddress = ( ( size_t ) pucAlignedHeap ) + xTotalHeapSize; - 8002e48: 687b ldr r3, [r7, #4] - 8002e4a: 68ba ldr r2, [r7, #8] - 8002e4c: 4413 add r3, r2 - 8002e4e: 60fb str r3, [r7, #12] + 8002d78: 687b ldr r3, [r7, #4] + 8002d7a: 68ba ldr r2, [r7, #8] + 8002d7c: 4413 add r3, r2 + 8002d7e: 60fb str r3, [r7, #12] uxAddress -= xHeapStructSize; - 8002e50: 2208 movs r2, #8 - 8002e52: 68fb ldr r3, [r7, #12] - 8002e54: 1a9b subs r3, r3, r2 - 8002e56: 60fb str r3, [r7, #12] + 8002d80: 2208 movs r2, #8 + 8002d82: 68fb ldr r3, [r7, #12] + 8002d84: 1a9b subs r3, r3, r2 + 8002d86: 60fb str r3, [r7, #12] uxAddress &= ~( ( size_t ) portBYTE_ALIGNMENT_MASK ); - 8002e58: 68fb ldr r3, [r7, #12] - 8002e5a: f023 0307 bic.w r3, r3, #7 - 8002e5e: 60fb str r3, [r7, #12] + 8002d88: 68fb ldr r3, [r7, #12] + 8002d8a: f023 0307 bic.w r3, r3, #7 + 8002d8e: 60fb str r3, [r7, #12] pxEnd = ( void * ) uxAddress; - 8002e60: 68fb ldr r3, [r7, #12] - 8002e62: 4a15 ldr r2, [pc, #84] ; (8002eb8 ) - 8002e64: 6013 str r3, [r2, #0] + 8002d90: 68fb ldr r3, [r7, #12] + 8002d92: 4a15 ldr r2, [pc, #84] ; (8002de8 ) + 8002d94: 6013 str r3, [r2, #0] pxEnd->xBlockSize = 0; - 8002e66: 4b14 ldr r3, [pc, #80] ; (8002eb8 ) - 8002e68: 681b ldr r3, [r3, #0] - 8002e6a: 2200 movs r2, #0 - 8002e6c: 605a str r2, [r3, #4] + 8002d96: 4b14 ldr r3, [pc, #80] ; (8002de8 ) + 8002d98: 681b ldr r3, [r3, #0] + 8002d9a: 2200 movs r2, #0 + 8002d9c: 605a str r2, [r3, #4] pxEnd->pxNextFreeBlock = NULL; - 8002e6e: 4b12 ldr r3, [pc, #72] ; (8002eb8 ) - 8002e70: 681b ldr r3, [r3, #0] - 8002e72: 2200 movs r2, #0 - 8002e74: 601a str r2, [r3, #0] + 8002d9e: 4b12 ldr r3, [pc, #72] ; (8002de8 ) + 8002da0: 681b ldr r3, [r3, #0] + 8002da2: 2200 movs r2, #0 + 8002da4: 601a str r2, [r3, #0] /* To start with there is a single free block that is sized to take up the entire heap space, minus the space taken by pxEnd. */ pxFirstFreeBlock = ( void * ) pucAlignedHeap; - 8002e76: 687b ldr r3, [r7, #4] - 8002e78: 603b str r3, [r7, #0] + 8002da6: 687b ldr r3, [r7, #4] + 8002da8: 603b str r3, [r7, #0] pxFirstFreeBlock->xBlockSize = uxAddress - ( size_t ) pxFirstFreeBlock; - 8002e7a: 683b ldr r3, [r7, #0] - 8002e7c: 68fa ldr r2, [r7, #12] - 8002e7e: 1ad2 subs r2, r2, r3 - 8002e80: 683b ldr r3, [r7, #0] - 8002e82: 605a str r2, [r3, #4] + 8002daa: 683b ldr r3, [r7, #0] + 8002dac: 68fa ldr r2, [r7, #12] + 8002dae: 1ad2 subs r2, r2, r3 + 8002db0: 683b ldr r3, [r7, #0] + 8002db2: 605a str r2, [r3, #4] pxFirstFreeBlock->pxNextFreeBlock = pxEnd; - 8002e84: 4b0c ldr r3, [pc, #48] ; (8002eb8 ) - 8002e86: 681a ldr r2, [r3, #0] - 8002e88: 683b ldr r3, [r7, #0] - 8002e8a: 601a str r2, [r3, #0] + 8002db4: 4b0c ldr r3, [pc, #48] ; (8002de8 ) + 8002db6: 681a ldr r2, [r3, #0] + 8002db8: 683b ldr r3, [r7, #0] + 8002dba: 601a str r2, [r3, #0] /* Only one block exists - and it covers the entire usable heap space. */ xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; - 8002e8c: 683b ldr r3, [r7, #0] - 8002e8e: 685b ldr r3, [r3, #4] - 8002e90: 4a0a ldr r2, [pc, #40] ; (8002ebc ) - 8002e92: 6013 str r3, [r2, #0] + 8002dbc: 683b ldr r3, [r7, #0] + 8002dbe: 685b ldr r3, [r3, #4] + 8002dc0: 4a0a ldr r2, [pc, #40] ; (8002dec ) + 8002dc2: 6013 str r3, [r2, #0] xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize; - 8002e94: 683b ldr r3, [r7, #0] - 8002e96: 685b ldr r3, [r3, #4] - 8002e98: 4a09 ldr r2, [pc, #36] ; (8002ec0 ) - 8002e9a: 6013 str r3, [r2, #0] + 8002dc4: 683b ldr r3, [r7, #0] + 8002dc6: 685b ldr r3, [r3, #4] + 8002dc8: 4a09 ldr r2, [pc, #36] ; (8002df0 ) + 8002dca: 6013 str r3, [r2, #0] /* Work out the position of the top bit in a size_t variable. */ xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ); - 8002e9c: 4b09 ldr r3, [pc, #36] ; (8002ec4 ) - 8002e9e: f04f 4200 mov.w r2, #2147483648 ; 0x80000000 - 8002ea2: 601a str r2, [r3, #0] + 8002dcc: 4b09 ldr r3, [pc, #36] ; (8002df4 ) + 8002dce: f04f 4200 mov.w r2, #2147483648 ; 0x80000000 + 8002dd2: 601a str r2, [r3, #0] } - 8002ea4: bf00 nop - 8002ea6: 3714 adds r7, #20 - 8002ea8: 46bd mov sp, r7 - 8002eaa: f85d 7b04 ldr.w r7, [sp], #4 - 8002eae: 4770 bx lr - 8002eb0: 200003c0 .word 0x200003c0 - 8002eb4: 20003fc0 .word 0x20003fc0 - 8002eb8: 20003fc8 .word 0x20003fc8 - 8002ebc: 20003fd0 .word 0x20003fd0 - 8002ec0: 20003fcc .word 0x20003fcc - 8002ec4: 20003fdc .word 0x20003fdc - -08002ec8 : + 8002dd4: bf00 nop + 8002dd6: 3714 adds r7, #20 + 8002dd8: 46bd mov sp, r7 + 8002dda: f85d 7b04 ldr.w r7, [sp], #4 + 8002dde: 4770 bx lr + 8002de0: 200003c0 .word 0x200003c0 + 8002de4: 20003fc0 .word 0x20003fc0 + 8002de8: 20003fc8 .word 0x20003fc8 + 8002dec: 20003fd0 .word 0x20003fd0 + 8002df0: 20003fcc .word 0x20003fcc + 8002df4: 20003fdc .word 0x20003fdc + +08002df8 : /*-----------------------------------------------------------*/ static void prvInsertBlockIntoFreeList( BlockLink_t *pxBlockToInsert ) { - 8002ec8: b480 push {r7} - 8002eca: b085 sub sp, #20 - 8002ecc: af00 add r7, sp, #0 - 8002ece: 6078 str r0, [r7, #4] + 8002df8: b480 push {r7} + 8002dfa: b085 sub sp, #20 + 8002dfc: af00 add r7, sp, #0 + 8002dfe: 6078 str r0, [r7, #4] BlockLink_t *pxIterator; uint8_t *puc; /* Iterate through the list until a block is found that has a higher address than the block being inserted. */ for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) - 8002ed0: 4b28 ldr r3, [pc, #160] ; (8002f74 ) - 8002ed2: 60fb str r3, [r7, #12] - 8002ed4: e002 b.n 8002edc - 8002ed6: 68fb ldr r3, [r7, #12] - 8002ed8: 681b ldr r3, [r3, #0] - 8002eda: 60fb str r3, [r7, #12] - 8002edc: 68fb ldr r3, [r7, #12] - 8002ede: 681b ldr r3, [r3, #0] - 8002ee0: 687a ldr r2, [r7, #4] - 8002ee2: 429a cmp r2, r3 - 8002ee4: d8f7 bhi.n 8002ed6 + 8002e00: 4b28 ldr r3, [pc, #160] ; (8002ea4 ) + 8002e02: 60fb str r3, [r7, #12] + 8002e04: e002 b.n 8002e0c + 8002e06: 68fb ldr r3, [r7, #12] + 8002e08: 681b ldr r3, [r3, #0] + 8002e0a: 60fb str r3, [r7, #12] + 8002e0c: 68fb ldr r3, [r7, #12] + 8002e0e: 681b ldr r3, [r3, #0] + 8002e10: 687a ldr r2, [r7, #4] + 8002e12: 429a cmp r2, r3 + 8002e14: d8f7 bhi.n 8002e06 /* Nothing to do here, just iterate to the right position. */ } /* Do the block being inserted, and the block it is being inserted after make a contiguous block of memory? */ puc = ( uint8_t * ) pxIterator; - 8002ee6: 68fb ldr r3, [r7, #12] - 8002ee8: 60bb str r3, [r7, #8] + 8002e16: 68fb ldr r3, [r7, #12] + 8002e18: 60bb str r3, [r7, #8] if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) - 8002eea: 68fb ldr r3, [r7, #12] - 8002eec: 685b ldr r3, [r3, #4] - 8002eee: 68ba ldr r2, [r7, #8] - 8002ef0: 4413 add r3, r2 - 8002ef2: 687a ldr r2, [r7, #4] - 8002ef4: 429a cmp r2, r3 - 8002ef6: d108 bne.n 8002f0a + 8002e1a: 68fb ldr r3, [r7, #12] + 8002e1c: 685b ldr r3, [r3, #4] + 8002e1e: 68ba ldr r2, [r7, #8] + 8002e20: 4413 add r3, r2 + 8002e22: 687a ldr r2, [r7, #4] + 8002e24: 429a cmp r2, r3 + 8002e26: d108 bne.n 8002e3a { pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; - 8002ef8: 68fb ldr r3, [r7, #12] - 8002efa: 685a ldr r2, [r3, #4] - 8002efc: 687b ldr r3, [r7, #4] - 8002efe: 685b ldr r3, [r3, #4] - 8002f00: 441a add r2, r3 - 8002f02: 68fb ldr r3, [r7, #12] - 8002f04: 605a str r2, [r3, #4] + 8002e28: 68fb ldr r3, [r7, #12] + 8002e2a: 685a ldr r2, [r3, #4] + 8002e2c: 687b ldr r3, [r7, #4] + 8002e2e: 685b ldr r3, [r3, #4] + 8002e30: 441a add r2, r3 + 8002e32: 68fb ldr r3, [r7, #12] + 8002e34: 605a str r2, [r3, #4] pxBlockToInsert = pxIterator; - 8002f06: 68fb ldr r3, [r7, #12] - 8002f08: 607b str r3, [r7, #4] + 8002e36: 68fb ldr r3, [r7, #12] + 8002e38: 607b str r3, [r7, #4] mtCOVERAGE_TEST_MARKER(); } /* Do the block being inserted, and the block it is being inserted before make a contiguous block of memory? */ puc = ( uint8_t * ) pxBlockToInsert; - 8002f0a: 687b ldr r3, [r7, #4] - 8002f0c: 60bb str r3, [r7, #8] + 8002e3a: 687b ldr r3, [r7, #4] + 8002e3c: 60bb str r3, [r7, #8] if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) - 8002f0e: 687b ldr r3, [r7, #4] - 8002f10: 685b ldr r3, [r3, #4] - 8002f12: 68ba ldr r2, [r7, #8] - 8002f14: 441a add r2, r3 - 8002f16: 68fb ldr r3, [r7, #12] - 8002f18: 681b ldr r3, [r3, #0] - 8002f1a: 429a cmp r2, r3 - 8002f1c: d118 bne.n 8002f50 + 8002e3e: 687b ldr r3, [r7, #4] + 8002e40: 685b ldr r3, [r3, #4] + 8002e42: 68ba ldr r2, [r7, #8] + 8002e44: 441a add r2, r3 + 8002e46: 68fb ldr r3, [r7, #12] + 8002e48: 681b ldr r3, [r3, #0] + 8002e4a: 429a cmp r2, r3 + 8002e4c: d118 bne.n 8002e80 { if( pxIterator->pxNextFreeBlock != pxEnd ) - 8002f1e: 68fb ldr r3, [r7, #12] - 8002f20: 681a ldr r2, [r3, #0] - 8002f22: 4b15 ldr r3, [pc, #84] ; (8002f78 ) - 8002f24: 681b ldr r3, [r3, #0] - 8002f26: 429a cmp r2, r3 - 8002f28: d00d beq.n 8002f46 + 8002e4e: 68fb ldr r3, [r7, #12] + 8002e50: 681a ldr r2, [r3, #0] + 8002e52: 4b15 ldr r3, [pc, #84] ; (8002ea8 ) + 8002e54: 681b ldr r3, [r3, #0] + 8002e56: 429a cmp r2, r3 + 8002e58: d00d beq.n 8002e76 { /* Form one big block from the two blocks. */ pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; - 8002f2a: 687b ldr r3, [r7, #4] - 8002f2c: 685a ldr r2, [r3, #4] - 8002f2e: 68fb ldr r3, [r7, #12] - 8002f30: 681b ldr r3, [r3, #0] - 8002f32: 685b ldr r3, [r3, #4] - 8002f34: 441a add r2, r3 - 8002f36: 687b ldr r3, [r7, #4] - 8002f38: 605a str r2, [r3, #4] + 8002e5a: 687b ldr r3, [r7, #4] + 8002e5c: 685a ldr r2, [r3, #4] + 8002e5e: 68fb ldr r3, [r7, #12] + 8002e60: 681b ldr r3, [r3, #0] + 8002e62: 685b ldr r3, [r3, #4] + 8002e64: 441a add r2, r3 + 8002e66: 687b ldr r3, [r7, #4] + 8002e68: 605a str r2, [r3, #4] pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; - 8002f3a: 68fb ldr r3, [r7, #12] - 8002f3c: 681b ldr r3, [r3, #0] - 8002f3e: 681a ldr r2, [r3, #0] - 8002f40: 687b ldr r3, [r7, #4] - 8002f42: 601a str r2, [r3, #0] - 8002f44: e008 b.n 8002f58 + 8002e6a: 68fb ldr r3, [r7, #12] + 8002e6c: 681b ldr r3, [r3, #0] + 8002e6e: 681a ldr r2, [r3, #0] + 8002e70: 687b ldr r3, [r7, #4] + 8002e72: 601a str r2, [r3, #0] + 8002e74: e008 b.n 8002e88 } else { pxBlockToInsert->pxNextFreeBlock = pxEnd; - 8002f46: 4b0c ldr r3, [pc, #48] ; (8002f78 ) - 8002f48: 681a ldr r2, [r3, #0] - 8002f4a: 687b ldr r3, [r7, #4] - 8002f4c: 601a str r2, [r3, #0] - 8002f4e: e003 b.n 8002f58 + 8002e76: 4b0c ldr r3, [pc, #48] ; (8002ea8 ) + 8002e78: 681a ldr r2, [r3, #0] + 8002e7a: 687b ldr r3, [r7, #4] + 8002e7c: 601a str r2, [r3, #0] + 8002e7e: e003 b.n 8002e88 } } else { pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; - 8002f50: 68fb ldr r3, [r7, #12] - 8002f52: 681a ldr r2, [r3, #0] - 8002f54: 687b ldr r3, [r7, #4] - 8002f56: 601a str r2, [r3, #0] + 8002e80: 68fb ldr r3, [r7, #12] + 8002e82: 681a ldr r2, [r3, #0] + 8002e84: 687b ldr r3, [r7, #4] + 8002e86: 601a str r2, [r3, #0] /* If the block being inserted plugged a gab, so was merged with the block before and the block after, then it's pxNextFreeBlock pointer will have already been set, and should not be set here as that would make it point to itself. */ if( pxIterator != pxBlockToInsert ) - 8002f58: 68fa ldr r2, [r7, #12] - 8002f5a: 687b ldr r3, [r7, #4] - 8002f5c: 429a cmp r2, r3 - 8002f5e: d002 beq.n 8002f66 + 8002e88: 68fa ldr r2, [r7, #12] + 8002e8a: 687b ldr r3, [r7, #4] + 8002e8c: 429a cmp r2, r3 + 8002e8e: d002 beq.n 8002e96 { pxIterator->pxNextFreeBlock = pxBlockToInsert; - 8002f60: 68fb ldr r3, [r7, #12] - 8002f62: 687a ldr r2, [r7, #4] - 8002f64: 601a str r2, [r3, #0] + 8002e90: 68fb ldr r3, [r7, #12] + 8002e92: 687a ldr r2, [r7, #4] + 8002e94: 601a str r2, [r3, #0] } else { mtCOVERAGE_TEST_MARKER(); } } - 8002f66: bf00 nop - 8002f68: 3714 adds r7, #20 - 8002f6a: 46bd mov sp, r7 - 8002f6c: f85d 7b04 ldr.w r7, [sp], #4 - 8002f70: 4770 bx lr - 8002f72: bf00 nop - 8002f74: 20003fc0 .word 0x20003fc0 - 8002f78: 20003fc8 .word 0x20003fc8 - -08002f7c <__libc_init_array>: - 8002f7c: b570 push {r4, r5, r6, lr} - 8002f7e: 4d0d ldr r5, [pc, #52] ; (8002fb4 <__libc_init_array+0x38>) - 8002f80: 4c0d ldr r4, [pc, #52] ; (8002fb8 <__libc_init_array+0x3c>) - 8002f82: 1b64 subs r4, r4, r5 - 8002f84: 10a4 asrs r4, r4, #2 - 8002f86: 2600 movs r6, #0 - 8002f88: 42a6 cmp r6, r4 - 8002f8a: d109 bne.n 8002fa0 <__libc_init_array+0x24> - 8002f8c: 4d0b ldr r5, [pc, #44] ; (8002fbc <__libc_init_array+0x40>) - 8002f8e: 4c0c ldr r4, [pc, #48] ; (8002fc0 <__libc_init_array+0x44>) - 8002f90: f000 f820 bl 8002fd4 <_init> - 8002f94: 1b64 subs r4, r4, r5 - 8002f96: 10a4 asrs r4, r4, #2 - 8002f98: 2600 movs r6, #0 - 8002f9a: 42a6 cmp r6, r4 - 8002f9c: d105 bne.n 8002faa <__libc_init_array+0x2e> - 8002f9e: bd70 pop {r4, r5, r6, pc} - 8002fa0: f855 3b04 ldr.w r3, [r5], #4 - 8002fa4: 4798 blx r3 - 8002fa6: 3601 adds r6, #1 - 8002fa8: e7ee b.n 8002f88 <__libc_init_array+0xc> - 8002faa: f855 3b04 ldr.w r3, [r5], #4 - 8002fae: 4798 blx r3 - 8002fb0: 3601 adds r6, #1 - 8002fb2: e7f2 b.n 8002f9a <__libc_init_array+0x1e> - 8002fb4: 0800305c .word 0x0800305c - 8002fb8: 0800305c .word 0x0800305c - 8002fbc: 0800305c .word 0x0800305c - 8002fc0: 08003060 .word 0x08003060 - -08002fc4 : - 8002fc4: 4402 add r2, r0 - 8002fc6: 4603 mov r3, r0 - 8002fc8: 4293 cmp r3, r2 - 8002fca: d100 bne.n 8002fce - 8002fcc: 4770 bx lr - 8002fce: f803 1b01 strb.w r1, [r3], #1 - 8002fd2: e7f9 b.n 8002fc8 - -08002fd4 <_init>: - 8002fd4: b5f8 push {r3, r4, r5, r6, r7, lr} - 8002fd6: bf00 nop - 8002fd8: bcf8 pop {r3, r4, r5, r6, r7} - 8002fda: bc08 pop {r3} - 8002fdc: 469e mov lr, r3 - 8002fde: 4770 bx lr - -08002fe0 <_fini>: - 8002fe0: b5f8 push {r3, r4, r5, r6, r7, lr} - 8002fe2: bf00 nop - 8002fe4: bcf8 pop {r3, r4, r5, r6, r7} - 8002fe6: bc08 pop {r3} - 8002fe8: 469e mov lr, r3 - 8002fea: 4770 bx lr + 8002e96: bf00 nop + 8002e98: 3714 adds r7, #20 + 8002e9a: 46bd mov sp, r7 + 8002e9c: f85d 7b04 ldr.w r7, [sp], #4 + 8002ea0: 4770 bx lr + 8002ea2: bf00 nop + 8002ea4: 20003fc0 .word 0x20003fc0 + 8002ea8: 20003fc8 .word 0x20003fc8 + +08002eac <__libc_init_array>: + 8002eac: b570 push {r4, r5, r6, lr} + 8002eae: 4d0d ldr r5, [pc, #52] ; (8002ee4 <__libc_init_array+0x38>) + 8002eb0: 4c0d ldr r4, [pc, #52] ; (8002ee8 <__libc_init_array+0x3c>) + 8002eb2: 1b64 subs r4, r4, r5 + 8002eb4: 10a4 asrs r4, r4, #2 + 8002eb6: 2600 movs r6, #0 + 8002eb8: 42a6 cmp r6, r4 + 8002eba: d109 bne.n 8002ed0 <__libc_init_array+0x24> + 8002ebc: 4d0b ldr r5, [pc, #44] ; (8002eec <__libc_init_array+0x40>) + 8002ebe: 4c0c ldr r4, [pc, #48] ; (8002ef0 <__libc_init_array+0x44>) + 8002ec0: f000 f820 bl 8002f04 <_init> + 8002ec4: 1b64 subs r4, r4, r5 + 8002ec6: 10a4 asrs r4, r4, #2 + 8002ec8: 2600 movs r6, #0 + 8002eca: 42a6 cmp r6, r4 + 8002ecc: d105 bne.n 8002eda <__libc_init_array+0x2e> + 8002ece: bd70 pop {r4, r5, r6, pc} + 8002ed0: f855 3b04 ldr.w r3, [r5], #4 + 8002ed4: 4798 blx r3 + 8002ed6: 3601 adds r6, #1 + 8002ed8: e7ee b.n 8002eb8 <__libc_init_array+0xc> + 8002eda: f855 3b04 ldr.w r3, [r5], #4 + 8002ede: 4798 blx r3 + 8002ee0: 3601 adds r6, #1 + 8002ee2: e7f2 b.n 8002eca <__libc_init_array+0x1e> + 8002ee4: 08002f8c .word 0x08002f8c + 8002ee8: 08002f8c .word 0x08002f8c + 8002eec: 08002f8c .word 0x08002f8c + 8002ef0: 08002f90 .word 0x08002f90 + +08002ef4 : + 8002ef4: 4402 add r2, r0 + 8002ef6: 4603 mov r3, r0 + 8002ef8: 4293 cmp r3, r2 + 8002efa: d100 bne.n 8002efe + 8002efc: 4770 bx lr + 8002efe: f803 1b01 strb.w r1, [r3], #1 + 8002f02: e7f9 b.n 8002ef8 + +08002f04 <_init>: + 8002f04: b5f8 push {r3, r4, r5, r6, r7, lr} + 8002f06: bf00 nop + 8002f08: bcf8 pop {r3, r4, r5, r6, r7} + 8002f0a: bc08 pop {r3} + 8002f0c: 469e mov lr, r3 + 8002f0e: 4770 bx lr + +08002f10 <_fini>: + 8002f10: b5f8 push {r3, r4, r5, r6, r7, lr} + 8002f12: bf00 nop + 8002f14: bcf8 pop {r3, r4, r5, r6, r7} + 8002f16: bc08 pop {r3} + 8002f18: 469e mov lr, r3 + 8002f1a: 4770 bx lr diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map index 9898438..4f2df7c 100644 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map @@ -33,6 +33,60 @@ Discarded input sections .ARM.exidx 0x0000000000000000 0x10 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o .ARM.attributes 0x0000000000000000 0x1c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .group 0x0000000000000000 0xc ./Core/Src/app.o + .text 0x0000000000000000 0x0 ./Core/Src/app.o + .data 0x0000000000000000 0x0 ./Core/Src/app.o + .bss 0x0000000000000000 0x0 ./Core/Src/app.o .group 0x0000000000000000 0xc ./Core/Src/freertos.o .group 0x0000000000000000 0xc ./Core/Src/freertos.o .group 0x0000000000000000 0xc ./Core/Src/freertos.o @@ -82,6 +136,52 @@ Discarded input sections .text 0x0000000000000000 0x0 ./Core/Src/freertos.o .data 0x0000000000000000 0x0 ./Core/Src/freertos.o .bss 0x0000000000000000 0x0 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0xe4 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x15a ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0xde ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x26 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x504 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0xb5 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0xaa ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x16749 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x367e ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x5c ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0xc90 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x9fe ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x115 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x1a0 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x16d ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x287 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x5f ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x132 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x29c ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x11a ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0xe8 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x89 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x295 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x126 ./Core/Src/freertos.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/freertos.o .group 0x0000000000000000 0xc ./Core/Src/main.o .group 0x0000000000000000 0xc ./Core/Src/main.o .group 0x0000000000000000 0xc ./Core/Src/main.o @@ -181,6 +281,11 @@ Discarded input sections .debug_macro 0x0000000000000000 0x504 ./Core/Src/main.o .debug_macro 0x0000000000000000 0xb5 ./Core/Src/main.o .debug_macro 0x0000000000000000 0xaa ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x91 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x8d ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x7e ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x19 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xf2 ./Core/Src/main.o .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o .group 0x0000000000000000 0xc ./Core/Src/stm32f4xx_hal_msp.o @@ -687,6 +792,8 @@ Discarded input sections 0x0000000000000000 0x50 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o .text.HAL_GetTickFreq 0x0000000000000000 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .text.HAL_Delay + 0x0000000000000000 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o .text.HAL_SuspendTick 0x0000000000000000 0x20 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o .text.HAL_ResumeTick @@ -3553,6 +3660,7 @@ Linker script and memory map LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +LOAD ./Core/Src/app.o LOAD ./Core/Src/freertos.o LOAD ./Core/Src/main.o LOAD ./Core/Src/stm32f4xx_hal_msp.o @@ -3618,7 +3726,7 @@ LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.ext 0x0000000008000000 g_pfnVectors 0x00000000080001c4 . = ALIGN (0x4) -.text 0x00000000080001d0 0x2e1c +.text 0x00000000080001d0 0x2d4c 0x00000000080001d0 . = ALIGN (0x4) *(.text) .text 0x00000000080001d0 0x40 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o @@ -3630,400 +3738,394 @@ LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.ext 0x0000000008000510 __aeabi_idiv0 0x0000000008000510 __aeabi_ldiv0 *(.text*) - .text.vApplicationGetIdleTaskMemory - 0x0000000008000514 0x34 ./Core/Src/freertos.o - 0x0000000008000514 vApplicationGetIdleTaskMemory - .text.main 0x0000000008000548 0x70 ./Core/Src/main.o - 0x0000000008000548 main .text.SystemClock_Config - 0x00000000080005b8 0xdc ./Core/Src/main.o - 0x00000000080005b8 SystemClock_Config + 0x0000000008000514 0xdc ./Core/Src/app.o + 0x0000000008000514 SystemClock_Config + .text.vApplicationGetIdleTaskMemory + 0x00000000080005f0 0x34 ./Core/Src/freertos.o + 0x00000000080005f0 vApplicationGetIdleTaskMemory + .text.main 0x0000000008000624 0x70 ./Core/Src/main.o + 0x0000000008000624 main .text.MX_GPIO_Init - 0x0000000008000694 0xdc ./Core/Src/main.o + 0x0000000008000694 0x64 ./Core/Src/main.o .text.StartDefaultTask - 0x0000000008000770 0x10 ./Core/Src/main.o - 0x0000000008000770 StartDefaultTask + 0x00000000080006f8 0x10 ./Core/Src/main.o + 0x00000000080006f8 StartDefaultTask .text.StartTask02 - 0x0000000008000780 0xe ./Core/Src/main.o - 0x0000000008000780 StartTask02 - *fill* 0x000000000800078e 0x2 + 0x0000000008000708 0xe ./Core/Src/main.o + 0x0000000008000708 StartTask02 + *fill* 0x0000000008000716 0x2 .text.blinkaled - 0x0000000008000790 0x30 ./Core/Src/main.o - 0x0000000008000790 blinkaled - .text.Error_Handler - 0x00000000080007c0 0xa ./Core/Src/main.o - 0x00000000080007c0 Error_Handler - *fill* 0x00000000080007ca 0x2 + 0x0000000008000718 0x30 ./Core/Src/main.o + 0x0000000008000718 blinkaled .text.HAL_MspInit - 0x00000000080007cc 0x58 ./Core/Src/stm32f4xx_hal_msp.o - 0x00000000080007cc HAL_MspInit + 0x0000000008000748 0x58 ./Core/Src/stm32f4xx_hal_msp.o + 0x0000000008000748 HAL_MspInit .text.NMI_Handler - 0x0000000008000824 0x6 ./Core/Src/stm32f4xx_it.o - 0x0000000008000824 NMI_Handler + 0x00000000080007a0 0x6 ./Core/Src/stm32f4xx_it.o + 0x00000000080007a0 NMI_Handler .text.HardFault_Handler - 0x000000000800082a 0x6 ./Core/Src/stm32f4xx_it.o - 0x000000000800082a HardFault_Handler + 0x00000000080007a6 0x6 ./Core/Src/stm32f4xx_it.o + 0x00000000080007a6 HardFault_Handler .text.MemManage_Handler - 0x0000000008000830 0x6 ./Core/Src/stm32f4xx_it.o - 0x0000000008000830 MemManage_Handler + 0x00000000080007ac 0x6 ./Core/Src/stm32f4xx_it.o + 0x00000000080007ac MemManage_Handler .text.BusFault_Handler - 0x0000000008000836 0x6 ./Core/Src/stm32f4xx_it.o - 0x0000000008000836 BusFault_Handler + 0x00000000080007b2 0x6 ./Core/Src/stm32f4xx_it.o + 0x00000000080007b2 BusFault_Handler .text.UsageFault_Handler - 0x000000000800083c 0x6 ./Core/Src/stm32f4xx_it.o - 0x000000000800083c UsageFault_Handler + 0x00000000080007b8 0x6 ./Core/Src/stm32f4xx_it.o + 0x00000000080007b8 UsageFault_Handler .text.DebugMon_Handler - 0x0000000008000842 0xe ./Core/Src/stm32f4xx_it.o - 0x0000000008000842 DebugMon_Handler + 0x00000000080007be 0xe ./Core/Src/stm32f4xx_it.o + 0x00000000080007be DebugMon_Handler + .text.Error_Handler + 0x00000000080007cc 0xa ./Core/Src/stm32f4xx_it.o + 0x00000000080007cc Error_Handler .text.SysTick_Handler - 0x0000000008000850 0x1a ./Core/Src/stm32f4xx_it.o - 0x0000000008000850 SysTick_Handler - *fill* 0x000000000800086a 0x2 + 0x00000000080007d6 0x1a ./Core/Src/stm32f4xx_it.o + 0x00000000080007d6 SysTick_Handler .text.SystemInit - 0x000000000800086c 0x24 ./Core/Src/system_stm32f4xx.o - 0x000000000800086c SystemInit + 0x00000000080007f0 0x24 ./Core/Src/system_stm32f4xx.o + 0x00000000080007f0 SystemInit .text.Reset_Handler - 0x0000000008000890 0x50 ./Core/Startup/startup_stm32f446retx.o - 0x0000000008000890 Reset_Handler + 0x0000000008000814 0x50 ./Core/Startup/startup_stm32f446retx.o + 0x0000000008000814 Reset_Handler .text.Default_Handler - 0x00000000080008e0 0x2 ./Core/Startup/startup_stm32f446retx.o - 0x00000000080008e0 RTC_Alarm_IRQHandler - 0x00000000080008e0 EXTI2_IRQHandler - 0x00000000080008e0 TIM8_CC_IRQHandler - 0x00000000080008e0 FMPI2C1_EV_IRQHandler - 0x00000000080008e0 SPI4_IRQHandler - 0x00000000080008e0 TIM1_CC_IRQHandler - 0x00000000080008e0 DMA2_Stream5_IRQHandler - 0x00000000080008e0 DMA1_Stream5_IRQHandler - 0x00000000080008e0 PVD_IRQHandler - 0x00000000080008e0 SDIO_IRQHandler - 0x00000000080008e0 TAMP_STAMP_IRQHandler - 0x00000000080008e0 CAN2_RX1_IRQHandler - 0x00000000080008e0 EXTI3_IRQHandler - 0x00000000080008e0 TIM8_TRG_COM_TIM14_IRQHandler - 0x00000000080008e0 TIM1_UP_TIM10_IRQHandler - 0x00000000080008e0 TIM8_UP_TIM13_IRQHandler - 0x00000000080008e0 I2C3_ER_IRQHandler - 0x00000000080008e0 EXTI0_IRQHandler - 0x00000000080008e0 I2C2_EV_IRQHandler - 0x00000000080008e0 DMA1_Stream2_IRQHandler - 0x00000000080008e0 CAN1_RX0_IRQHandler - 0x00000000080008e0 FPU_IRQHandler - 0x00000000080008e0 OTG_HS_WKUP_IRQHandler - 0x00000000080008e0 CAN2_SCE_IRQHandler - 0x00000000080008e0 DMA2_Stream2_IRQHandler - 0x00000000080008e0 SPI1_IRQHandler - 0x00000000080008e0 TIM6_DAC_IRQHandler - 0x00000000080008e0 TIM1_BRK_TIM9_IRQHandler - 0x00000000080008e0 DCMI_IRQHandler - 0x00000000080008e0 CAN2_RX0_IRQHandler - 0x00000000080008e0 DMA2_Stream3_IRQHandler - 0x00000000080008e0 SAI2_IRQHandler - 0x00000000080008e0 USART6_IRQHandler - 0x00000000080008e0 USART3_IRQHandler - 0x00000000080008e0 CAN1_RX1_IRQHandler - 0x00000000080008e0 UART5_IRQHandler - 0x00000000080008e0 DMA2_Stream0_IRQHandler - 0x00000000080008e0 TIM4_IRQHandler - 0x00000000080008e0 QUADSPI_IRQHandler - 0x00000000080008e0 I2C1_EV_IRQHandler - 0x00000000080008e0 DMA1_Stream6_IRQHandler - 0x00000000080008e0 DMA1_Stream1_IRQHandler - 0x00000000080008e0 UART4_IRQHandler - 0x00000000080008e0 TIM3_IRQHandler - 0x00000000080008e0 RCC_IRQHandler - 0x00000000080008e0 TIM8_BRK_TIM12_IRQHandler - 0x00000000080008e0 Default_Handler - 0x00000000080008e0 CEC_IRQHandler - 0x00000000080008e0 EXTI15_10_IRQHandler - 0x00000000080008e0 ADC_IRQHandler - 0x00000000080008e0 DMA1_Stream7_IRQHandler - 0x00000000080008e0 TIM7_IRQHandler - 0x00000000080008e0 CAN2_TX_IRQHandler - 0x00000000080008e0 TIM5_IRQHandler - 0x00000000080008e0 DMA2_Stream7_IRQHandler - 0x00000000080008e0 I2C3_EV_IRQHandler - 0x00000000080008e0 EXTI9_5_IRQHandler - 0x00000000080008e0 RTC_WKUP_IRQHandler - 0x00000000080008e0 SPDIF_RX_IRQHandler - 0x00000000080008e0 SPI2_IRQHandler - 0x00000000080008e0 OTG_HS_EP1_IN_IRQHandler - 0x00000000080008e0 DMA1_Stream0_IRQHandler - 0x00000000080008e0 CAN1_TX_IRQHandler - 0x00000000080008e0 FMPI2C1_ER_IRQHandler - 0x00000000080008e0 EXTI4_IRQHandler - 0x00000000080008e0 OTG_HS_EP1_OUT_IRQHandler - 0x00000000080008e0 WWDG_IRQHandler - 0x00000000080008e0 TIM2_IRQHandler - 0x00000000080008e0 OTG_FS_WKUP_IRQHandler - 0x00000000080008e0 TIM1_TRG_COM_TIM11_IRQHandler - 0x00000000080008e0 OTG_HS_IRQHandler - 0x00000000080008e0 EXTI1_IRQHandler - 0x00000000080008e0 USART2_IRQHandler - 0x00000000080008e0 I2C2_ER_IRQHandler - 0x00000000080008e0 DMA2_Stream1_IRQHandler - 0x00000000080008e0 CAN1_SCE_IRQHandler - 0x00000000080008e0 FLASH_IRQHandler - 0x00000000080008e0 DMA2_Stream4_IRQHandler - 0x00000000080008e0 USART1_IRQHandler - 0x00000000080008e0 OTG_FS_IRQHandler - 0x00000000080008e0 SPI3_IRQHandler - 0x00000000080008e0 DMA1_Stream4_IRQHandler - 0x00000000080008e0 I2C1_ER_IRQHandler - 0x00000000080008e0 FMC_IRQHandler - 0x00000000080008e0 DMA2_Stream6_IRQHandler - 0x00000000080008e0 SAI1_IRQHandler - 0x00000000080008e0 DMA1_Stream3_IRQHandler - *fill* 0x00000000080008e2 0x2 + 0x0000000008000864 0x2 ./Core/Startup/startup_stm32f446retx.o + 0x0000000008000864 RTC_Alarm_IRQHandler + 0x0000000008000864 EXTI2_IRQHandler + 0x0000000008000864 TIM8_CC_IRQHandler + 0x0000000008000864 FMPI2C1_EV_IRQHandler + 0x0000000008000864 SPI4_IRQHandler + 0x0000000008000864 TIM1_CC_IRQHandler + 0x0000000008000864 DMA2_Stream5_IRQHandler + 0x0000000008000864 DMA1_Stream5_IRQHandler + 0x0000000008000864 PVD_IRQHandler + 0x0000000008000864 SDIO_IRQHandler + 0x0000000008000864 TAMP_STAMP_IRQHandler + 0x0000000008000864 CAN2_RX1_IRQHandler + 0x0000000008000864 EXTI3_IRQHandler + 0x0000000008000864 TIM8_TRG_COM_TIM14_IRQHandler + 0x0000000008000864 TIM1_UP_TIM10_IRQHandler + 0x0000000008000864 TIM8_UP_TIM13_IRQHandler + 0x0000000008000864 I2C3_ER_IRQHandler + 0x0000000008000864 EXTI0_IRQHandler + 0x0000000008000864 I2C2_EV_IRQHandler + 0x0000000008000864 DMA1_Stream2_IRQHandler + 0x0000000008000864 CAN1_RX0_IRQHandler + 0x0000000008000864 FPU_IRQHandler + 0x0000000008000864 OTG_HS_WKUP_IRQHandler + 0x0000000008000864 CAN2_SCE_IRQHandler + 0x0000000008000864 DMA2_Stream2_IRQHandler + 0x0000000008000864 SPI1_IRQHandler + 0x0000000008000864 TIM6_DAC_IRQHandler + 0x0000000008000864 TIM1_BRK_TIM9_IRQHandler + 0x0000000008000864 DCMI_IRQHandler + 0x0000000008000864 CAN2_RX0_IRQHandler + 0x0000000008000864 DMA2_Stream3_IRQHandler + 0x0000000008000864 SAI2_IRQHandler + 0x0000000008000864 USART6_IRQHandler + 0x0000000008000864 USART3_IRQHandler + 0x0000000008000864 CAN1_RX1_IRQHandler + 0x0000000008000864 UART5_IRQHandler + 0x0000000008000864 DMA2_Stream0_IRQHandler + 0x0000000008000864 TIM4_IRQHandler + 0x0000000008000864 QUADSPI_IRQHandler + 0x0000000008000864 I2C1_EV_IRQHandler + 0x0000000008000864 DMA1_Stream6_IRQHandler + 0x0000000008000864 DMA1_Stream1_IRQHandler + 0x0000000008000864 UART4_IRQHandler + 0x0000000008000864 TIM3_IRQHandler + 0x0000000008000864 RCC_IRQHandler + 0x0000000008000864 TIM8_BRK_TIM12_IRQHandler + 0x0000000008000864 Default_Handler + 0x0000000008000864 CEC_IRQHandler + 0x0000000008000864 EXTI15_10_IRQHandler + 0x0000000008000864 ADC_IRQHandler + 0x0000000008000864 DMA1_Stream7_IRQHandler + 0x0000000008000864 TIM7_IRQHandler + 0x0000000008000864 CAN2_TX_IRQHandler + 0x0000000008000864 TIM5_IRQHandler + 0x0000000008000864 DMA2_Stream7_IRQHandler + 0x0000000008000864 I2C3_EV_IRQHandler + 0x0000000008000864 EXTI9_5_IRQHandler + 0x0000000008000864 RTC_WKUP_IRQHandler + 0x0000000008000864 SPDIF_RX_IRQHandler + 0x0000000008000864 SPI2_IRQHandler + 0x0000000008000864 OTG_HS_EP1_IN_IRQHandler + 0x0000000008000864 DMA1_Stream0_IRQHandler + 0x0000000008000864 CAN1_TX_IRQHandler + 0x0000000008000864 FMPI2C1_ER_IRQHandler + 0x0000000008000864 EXTI4_IRQHandler + 0x0000000008000864 OTG_HS_EP1_OUT_IRQHandler + 0x0000000008000864 WWDG_IRQHandler + 0x0000000008000864 TIM2_IRQHandler + 0x0000000008000864 OTG_FS_WKUP_IRQHandler + 0x0000000008000864 TIM1_TRG_COM_TIM11_IRQHandler + 0x0000000008000864 OTG_HS_IRQHandler + 0x0000000008000864 EXTI1_IRQHandler + 0x0000000008000864 USART2_IRQHandler + 0x0000000008000864 I2C2_ER_IRQHandler + 0x0000000008000864 DMA2_Stream1_IRQHandler + 0x0000000008000864 CAN1_SCE_IRQHandler + 0x0000000008000864 FLASH_IRQHandler + 0x0000000008000864 DMA2_Stream4_IRQHandler + 0x0000000008000864 USART1_IRQHandler + 0x0000000008000864 OTG_FS_IRQHandler + 0x0000000008000864 SPI3_IRQHandler + 0x0000000008000864 DMA1_Stream4_IRQHandler + 0x0000000008000864 I2C1_ER_IRQHandler + 0x0000000008000864 FMC_IRQHandler + 0x0000000008000864 DMA2_Stream6_IRQHandler + 0x0000000008000864 SAI1_IRQHandler + 0x0000000008000864 DMA1_Stream3_IRQHandler + *fill* 0x0000000008000866 0x2 .text.HAL_Init - 0x00000000080008e4 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - 0x00000000080008e4 HAL_Init + 0x0000000008000868 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x0000000008000868 HAL_Init .text.HAL_InitTick - 0x0000000008000928 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - 0x0000000008000928 HAL_InitTick + 0x00000000080008ac 0x60 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x00000000080008ac HAL_InitTick .text.HAL_IncTick - 0x0000000008000988 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - 0x0000000008000988 HAL_IncTick + 0x000000000800090c 0x28 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x000000000800090c HAL_IncTick .text.HAL_GetTick - 0x00000000080009b0 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - 0x00000000080009b0 HAL_GetTick - .text.HAL_Delay - 0x00000000080009c8 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - 0x00000000080009c8 HAL_Delay + 0x0000000008000934 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x0000000008000934 HAL_GetTick .text.__NVIC_SetPriorityGrouping - 0x0000000008000a10 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x000000000800094c 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o .text.__NVIC_GetPriorityGrouping - 0x0000000008000a58 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x0000000008000994 0x1c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o .text.__NVIC_SetPriority - 0x0000000008000a74 0x54 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x00000000080009b0 0x54 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o .text.NVIC_EncodePriority - 0x0000000008000ac8 0x66 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - *fill* 0x0000000008000b2e 0x2 + 0x0000000008000a04 0x66 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + *fill* 0x0000000008000a6a 0x2 .text.SysTick_Config - 0x0000000008000b30 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x0000000008000a6c 0x44 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o .text.HAL_NVIC_SetPriorityGrouping - 0x0000000008000b74 0x16 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - 0x0000000008000b74 HAL_NVIC_SetPriorityGrouping + 0x0000000008000ab0 0x16 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x0000000008000ab0 HAL_NVIC_SetPriorityGrouping .text.HAL_NVIC_SetPriority - 0x0000000008000b8a 0x38 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - 0x0000000008000b8a HAL_NVIC_SetPriority + 0x0000000008000ac6 0x38 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x0000000008000ac6 HAL_NVIC_SetPriority .text.HAL_SYSTICK_Config - 0x0000000008000bc2 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - 0x0000000008000bc2 HAL_SYSTICK_Config - *fill* 0x0000000008000bda 0x2 + 0x0000000008000afe 0x18 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x0000000008000afe HAL_SYSTICK_Config + *fill* 0x0000000008000b16 0x2 .text.HAL_GPIO_Init - 0x0000000008000bdc 0x328 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o - 0x0000000008000bdc HAL_GPIO_Init + 0x0000000008000b18 0x328 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + 0x0000000008000b18 HAL_GPIO_Init .text.HAL_GPIO_WritePin - 0x0000000008000f04 0x32 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o - 0x0000000008000f04 HAL_GPIO_WritePin - *fill* 0x0000000008000f36 0x2 + 0x0000000008000e40 0x32 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + 0x0000000008000e40 HAL_GPIO_WritePin + *fill* 0x0000000008000e72 0x2 .text.HAL_RCC_ClockConfig - 0x0000000008000f38 0x1cc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o - 0x0000000008000f38 HAL_RCC_ClockConfig + 0x0000000008000e74 0x1cc ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + 0x0000000008000e74 HAL_RCC_ClockConfig .text.HAL_RCC_GetSysClockFreq - 0x0000000008001104 0x460 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o - 0x0000000008001104 HAL_RCC_GetSysClockFreq + 0x0000000008001040 0x460 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + 0x0000000008001040 HAL_RCC_GetSysClockFreq .text.HAL_RCC_OscConfig - 0x0000000008001564 0x53c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o - 0x0000000008001564 HAL_RCC_OscConfig + 0x00000000080014a0 0x53c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + 0x00000000080014a0 HAL_RCC_OscConfig .text.makeFreeRtosPriority - 0x0000000008001aa0 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0x00000000080019dc 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o .text.osKernelStart - 0x0000000008001ad0 0xe ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - 0x0000000008001ad0 osKernelStart + 0x0000000008001a0c 0xe ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0x0000000008001a0c osKernelStart .text.osThreadCreate - 0x0000000008001ade 0x98 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - 0x0000000008001ade osThreadCreate - .text.osDelay 0x0000000008001b76 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - 0x0000000008001b76 osDelay + 0x0000000008001a1a 0x98 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0x0000000008001a1a osThreadCreate + .text.osDelay 0x0000000008001ab2 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0x0000000008001ab2 osDelay .text.vListInitialise - 0x0000000008001b9e 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - 0x0000000008001b9e vListInitialise + 0x0000000008001ada 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001ada vListInitialise .text.vListInitialiseItem - 0x0000000008001bde 0x1a ./Middlewares/Third_Party/FreeRTOS/Source/list.o - 0x0000000008001bde vListInitialiseItem + 0x0000000008001b1a 0x1a ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001b1a vListInitialiseItem .text.vListInsertEnd - 0x0000000008001bf8 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - 0x0000000008001bf8 vListInsertEnd + 0x0000000008001b34 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001b34 vListInsertEnd .text.vListInsert - 0x0000000008001c40 0x72 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - 0x0000000008001c40 vListInsert + 0x0000000008001b7c 0x72 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001b7c vListInsert .text.uxListRemove - 0x0000000008001cb2 0x54 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - 0x0000000008001cb2 uxListRemove + 0x0000000008001bee 0x54 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000008001bee uxListRemove .text.xTaskCreateStatic - 0x0000000008001d06 0xba ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - 0x0000000008001d06 xTaskCreateStatic + 0x0000000008001c42 0xba ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008001c42 xTaskCreateStatic .text.xTaskCreate - 0x0000000008001dc0 0x8a ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - 0x0000000008001dc0 xTaskCreate + 0x0000000008001cfc 0x8a ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008001cfc xTaskCreate .text.prvInitialiseNewTask - 0x0000000008001e4a 0x10e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008001d86 0x10e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o .text.prvAddNewTaskToReadyList - 0x0000000008001f58 0xd4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008001e94 0xd4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o .text.vTaskDelay - 0x000000000800202c 0x68 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - 0x000000000800202c vTaskDelay + 0x0000000008001f68 0x68 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008001f68 vTaskDelay .text.vTaskStartScheduler - 0x0000000008002094 0xc0 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - 0x0000000008002094 vTaskStartScheduler + 0x0000000008001fd0 0xc0 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008001fd0 vTaskStartScheduler .text.vTaskSuspendAll - 0x0000000008002154 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - 0x0000000008002154 vTaskSuspendAll + 0x0000000008002090 0x1c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008002090 vTaskSuspendAll .text.xTaskResumeAll - 0x0000000008002170 0x138 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - 0x0000000008002170 xTaskResumeAll + 0x00000000080020ac 0x138 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x00000000080020ac xTaskResumeAll .text.xTaskIncrementTick - 0x00000000080022a8 0x170 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - 0x00000000080022a8 xTaskIncrementTick + 0x00000000080021e4 0x170 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x00000000080021e4 xTaskIncrementTick .text.vTaskSwitchContext - 0x0000000008002418 0xb8 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - 0x0000000008002418 vTaskSwitchContext + 0x0000000008002354 0xb8 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008002354 vTaskSwitchContext .text.prvIdleTask - 0x00000000080024d0 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x000000000800240c 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o .text.prvInitialiseTaskLists - 0x0000000008002500 0x80 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x000000000800243c 0x80 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o .text.prvCheckTasksWaitingTermination - 0x0000000008002580 0x5c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x00000000080024bc 0x5c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o .text.prvDeleteTCB - 0x00000000080025dc 0x5e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - *fill* 0x000000000800263a 0x2 + 0x0000000008002518 0x5e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + *fill* 0x0000000008002576 0x2 .text.prvResetNextTaskUnblockTime - 0x000000000800263c 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x0000000008002578 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o .text.xTaskGetSchedulerState - 0x000000000800267c 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - 0x000000000800267c xTaskGetSchedulerState + 0x00000000080025b8 0x3c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x00000000080025b8 xTaskGetSchedulerState .text.prvAddCurrentTaskToDelayedList - 0x00000000080026b8 0xcc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x00000000080025f4 0xcc ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o .text.pxPortInitialiseStack - 0x0000000008002784 0x68 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - 0x0000000008002784 pxPortInitialiseStack + 0x00000000080026c0 0x68 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x00000000080026c0 pxPortInitialiseStack .text.prvTaskExitError - 0x00000000080027ec 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - *fill* 0x0000000008002844 0xc + 0x0000000008002728 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o .text.SVC_Handler - 0x0000000008002850 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - 0x0000000008002850 SVC_Handler + 0x0000000008002780 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002780 SVC_Handler .text.prvPortStartFirstTask - 0x0000000008002878 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x00000000080027a8 0x28 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o .text.xPortStartScheduler - 0x00000000080028a0 0x144 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - 0x00000000080028a0 xPortStartScheduler + 0x00000000080027d0 0x144 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x00000000080027d0 xPortStartScheduler .text.vPortEnterCritical - 0x00000000080029e4 0x60 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - 0x00000000080029e4 vPortEnterCritical + 0x0000000008002914 0x60 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002914 vPortEnterCritical .text.vPortExitCritical - 0x0000000008002a44 0x54 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - 0x0000000008002a44 vPortExitCritical - *fill* 0x0000000008002a98 0x8 + 0x0000000008002974 0x54 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002974 vPortExitCritical + *fill* 0x00000000080029c8 0x8 .text.PendSV_Handler - 0x0000000008002aa0 0x68 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - 0x0000000008002aa0 PendSV_Handler + 0x00000000080029d0 0x68 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x00000000080029d0 PendSV_Handler .text.xPortSysTickHandler - 0x0000000008002b08 0x44 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - 0x0000000008002b08 xPortSysTickHandler + 0x0000000008002a38 0x44 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002a38 xPortSysTickHandler .text.vPortSetupTimerInterrupt - 0x0000000008002b4c 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - 0x0000000008002b4c vPortSetupTimerInterrupt + 0x0000000008002a7c 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002a7c vPortSetupTimerInterrupt .text.vPortEnableVFP - 0x0000000008002b94 0x14 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000008002ac4 0x14 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o .text.pvPortMalloc - 0x0000000008002ba8 0x198 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o - 0x0000000008002ba8 pvPortMalloc + 0x0000000008002ad8 0x198 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + 0x0000000008002ad8 pvPortMalloc .text.vPortFree - 0x0000000008002d40 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o - 0x0000000008002d40 vPortFree + 0x0000000008002c70 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + 0x0000000008002c70 vPortFree .text.prvHeapInit - 0x0000000008002e04 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + 0x0000000008002d34 0xc4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o .text.prvInsertBlockIntoFreeList - 0x0000000008002ec8 0xb4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + 0x0000000008002df8 0xb4 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o .text.__libc_init_array - 0x0000000008002f7c 0x48 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) - 0x0000000008002f7c __libc_init_array - .text.memset 0x0000000008002fc4 0x10 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) - 0x0000000008002fc4 memset + 0x0000000008002eac 0x48 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + 0x0000000008002eac __libc_init_array + .text.memset 0x0000000008002ef4 0x10 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + 0x0000000008002ef4 memset *(.glue_7) - .glue_7 0x0000000008002fd4 0x0 linker stubs + .glue_7 0x0000000008002f04 0x0 linker stubs *(.glue_7t) - .glue_7t 0x0000000008002fd4 0x0 linker stubs + .glue_7t 0x0000000008002f04 0x0 linker stubs *(.eh_frame) - .eh_frame 0x0000000008002fd4 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + .eh_frame 0x0000000008002f04 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o *(.init) - .init 0x0000000008002fd4 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o - 0x0000000008002fd4 _init - .init 0x0000000008002fd8 0x8 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + .init 0x0000000008002f04 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + 0x0000000008002f04 _init + .init 0x0000000008002f08 0x8 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o *(.fini) - .fini 0x0000000008002fe0 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o - 0x0000000008002fe0 _fini - .fini 0x0000000008002fe4 0x8 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o - 0x0000000008002fec . = ALIGN (0x4) - 0x0000000008002fec _etext = . + .fini 0x0000000008002f10 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + 0x0000000008002f10 _fini + .fini 0x0000000008002f14 0x8 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + 0x0000000008002f1c . = ALIGN (0x4) + 0x0000000008002f1c _etext = . -.vfp11_veneer 0x0000000008002fec 0x0 - .vfp11_veneer 0x0000000008002fec 0x0 linker stubs +.vfp11_veneer 0x0000000008002f1c 0x0 + .vfp11_veneer 0x0000000008002f1c 0x0 linker stubs -.v4_bx 0x0000000008002fec 0x0 - .v4_bx 0x0000000008002fec 0x0 linker stubs +.v4_bx 0x0000000008002f1c 0x0 + .v4_bx 0x0000000008002f1c 0x0 linker stubs -.iplt 0x0000000008002fec 0x0 - .iplt 0x0000000008002fec 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o +.iplt 0x0000000008002f1c 0x0 + .iplt 0x0000000008002f1c 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o -.rodata 0x0000000008002fec 0x68 - 0x0000000008002fec . = ALIGN (0x4) +.rodata 0x0000000008002f1c 0x68 + 0x0000000008002f1c . = ALIGN (0x4) *(.rodata) - .rodata 0x0000000008002fec 0x50 ./Core/Src/main.o - .rodata 0x000000000800303c 0x5 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .rodata 0x0000000008002f1c 0x50 ./Core/Src/main.o + .rodata 0x0000000008002f6c 0x5 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o *(.rodata*) - *fill* 0x0000000008003041 0x3 + *fill* 0x0000000008002f71 0x3 .rodata.AHBPrescTable - 0x0000000008003044 0x10 ./Core/Src/system_stm32f4xx.o - 0x0000000008003044 AHBPrescTable - 0x0000000008003054 . = ALIGN (0x4) + 0x0000000008002f74 0x10 ./Core/Src/system_stm32f4xx.o + 0x0000000008002f74 AHBPrescTable + 0x0000000008002f84 . = ALIGN (0x4) -.ARM.extab 0x0000000008003054 0x0 - 0x0000000008003054 . = ALIGN (0x4) +.ARM.extab 0x0000000008002f84 0x0 + 0x0000000008002f84 . = ALIGN (0x4) *(.ARM.extab* .gnu.linkonce.armextab.*) - 0x0000000008003054 . = ALIGN (0x4) + 0x0000000008002f84 . = ALIGN (0x4) -.ARM 0x0000000008003054 0x8 - 0x0000000008003054 . = ALIGN (0x4) - 0x0000000008003054 __exidx_start = . +.ARM 0x0000000008002f84 0x8 + 0x0000000008002f84 . = ALIGN (0x4) + 0x0000000008002f84 __exidx_start = . *(.ARM.exidx*) - .ARM.exidx 0x0000000008003054 0x8 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) - 0x000000000800305c __exidx_end = . - 0x000000000800305c . = ALIGN (0x4) + .ARM.exidx 0x0000000008002f84 0x8 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) + 0x0000000008002f8c __exidx_end = . + 0x0000000008002f8c . = ALIGN (0x4) -.rel.dyn 0x000000000800305c 0x0 - .rel.iplt 0x000000000800305c 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o +.rel.dyn 0x0000000008002f8c 0x0 + .rel.iplt 0x0000000008002f8c 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o -.preinit_array 0x000000000800305c 0x0 - 0x000000000800305c . = ALIGN (0x4) - 0x000000000800305c PROVIDE (__preinit_array_start = .) +.preinit_array 0x0000000008002f8c 0x0 + 0x0000000008002f8c . = ALIGN (0x4) + 0x0000000008002f8c PROVIDE (__preinit_array_start = .) *(.preinit_array*) - 0x000000000800305c PROVIDE (__preinit_array_end = .) - 0x000000000800305c . = ALIGN (0x4) + 0x0000000008002f8c PROVIDE (__preinit_array_end = .) + 0x0000000008002f8c . = ALIGN (0x4) -.init_array 0x000000000800305c 0x4 - 0x000000000800305c . = ALIGN (0x4) - 0x000000000800305c PROVIDE (__init_array_start = .) +.init_array 0x0000000008002f8c 0x4 + 0x0000000008002f8c . = ALIGN (0x4) + 0x0000000008002f8c PROVIDE (__init_array_start = .) *(SORT_BY_NAME(.init_array.*)) *(.init_array*) - .init_array 0x000000000800305c 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o - 0x0000000008003060 PROVIDE (__init_array_end = .) - 0x0000000008003060 . = ALIGN (0x4) + .init_array 0x0000000008002f8c 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + 0x0000000008002f90 PROVIDE (__init_array_end = .) + 0x0000000008002f90 . = ALIGN (0x4) -.fini_array 0x0000000008003060 0x4 - 0x0000000008003060 . = ALIGN (0x4) +.fini_array 0x0000000008002f90 0x4 + 0x0000000008002f90 . = ALIGN (0x4) [!provide] PROVIDE (__fini_array_start = .) *(SORT_BY_NAME(.fini_array.*)) *(.fini_array*) - .fini_array 0x0000000008003060 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + .fini_array 0x0000000008002f90 0x4 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o [!provide] PROVIDE (__fini_array_end = .) - 0x0000000008003064 . = ALIGN (0x4) - 0x0000000008003064 _sidata = LOADADDR (.data) + 0x0000000008002f94 . = ALIGN (0x4) + 0x0000000008002f94 _sidata = LOADADDR (.data) -.data 0x0000000020000000 0x10 load address 0x0000000008003064 +.data 0x0000000020000000 0x10 load address 0x0000000008002f94 0x0000000020000000 . = ALIGN (0x4) 0x0000000020000000 _sdata = . *(.data) @@ -4045,11 +4147,11 @@ LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.ext 0x0000000020000010 . = ALIGN (0x4) 0x0000000020000010 _edata = . -.igot.plt 0x0000000020000010 0x0 load address 0x0000000008003074 +.igot.plt 0x0000000020000010 0x0 load address 0x0000000008002fa4 .igot.plt 0x0000000020000010 0x0 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o 0x0000000020000010 . = ALIGN (0x4) -.bss 0x0000000020000010 0x3fd0 load address 0x0000000008003074 +.bss 0x0000000020000010 0x3fd0 load address 0x0000000008002fa4 0x0000000020000010 _sbss = . 0x0000000020000010 __bss_start__ = _sbss *(.bss) @@ -4134,7 +4236,7 @@ LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.ext 0x0000000020003fe0 __bss_end__ = _ebss ._user_heap_stack - 0x0000000020003fe0 0x600 load address 0x0000000008003074 + 0x0000000020003fe0 0x600 load address 0x0000000008002fa4 0x0000000020003fe0 . = ALIGN (0x8) [!provide] PROVIDE (end = .) 0x0000000020003fe0 PROVIDE (_end = .) @@ -4157,271 +4259,283 @@ LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.ext .ARM.attributes 0x000000000000001e 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o .ARM.attributes - 0x0000000000000052 0x34 ./Core/Src/freertos.o + 0x0000000000000052 0x34 ./Core/Src/app.o .ARM.attributes - 0x0000000000000086 0x34 ./Core/Src/main.o + 0x0000000000000086 0x34 ./Core/Src/freertos.o .ARM.attributes - 0x00000000000000ba 0x34 ./Core/Src/stm32f4xx_hal_msp.o + 0x00000000000000ba 0x34 ./Core/Src/main.o .ARM.attributes - 0x00000000000000ee 0x34 ./Core/Src/stm32f4xx_it.o + 0x00000000000000ee 0x34 ./Core/Src/stm32f4xx_hal_msp.o .ARM.attributes - 0x0000000000000122 0x34 ./Core/Src/system_stm32f4xx.o + 0x0000000000000122 0x34 ./Core/Src/stm32f4xx_it.o .ARM.attributes - 0x0000000000000156 0x21 ./Core/Startup/startup_stm32f446retx.o + 0x0000000000000156 0x34 ./Core/Src/system_stm32f4xx.o .ARM.attributes - 0x0000000000000177 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x000000000000018a 0x21 ./Core/Startup/startup_stm32f446retx.o .ARM.attributes - 0x00000000000001ab 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x00000000000001ab 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o .ARM.attributes - 0x00000000000001df 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + 0x00000000000001df 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o .ARM.attributes - 0x0000000000000213 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + 0x0000000000000213 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o .ARM.attributes - 0x0000000000000247 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + 0x0000000000000247 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o .ARM.attributes - 0x000000000000027b 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0x000000000000027b 0x34 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o .ARM.attributes - 0x00000000000002af 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x00000000000002af 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o .ARM.attributes - 0x00000000000002e3 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x00000000000002e3 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/list.o .ARM.attributes - 0x0000000000000317 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000000000317 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o .ARM.attributes - 0x000000000000034b 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + 0x000000000000034b 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o .ARM.attributes - 0x000000000000037f 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + 0x000000000000037f 0x34 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o .ARM.attributes - 0x00000000000003b3 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + 0x00000000000003b3 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) .ARM.attributes - 0x00000000000003e7 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) + 0x00000000000003e7 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) .ARM.attributes - 0x0000000000000405 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) + 0x000000000000041b 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) .ARM.attributes - 0x0000000000000439 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_dvmd_tls.o) + 0x0000000000000439 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) .ARM.attributes - 0x0000000000000457 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + 0x000000000000046d 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_dvmd_tls.o) + .ARM.attributes + 0x000000000000048b 0x1e c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o OUTPUT(FreeRTOS_LED.elf elf32-littlearm) LOAD linker stubs LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc.a LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libm.a LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a -.debug_info 0x0000000000000000 0x9aed - .debug_info 0x0000000000000000 0x294 ./Core/Src/freertos.o - .debug_info 0x0000000000000294 0xb40 ./Core/Src/main.o - .debug_info 0x0000000000000dd4 0xc0f ./Core/Src/stm32f4xx_hal_msp.o - .debug_info 0x00000000000019e3 0x125 ./Core/Src/stm32f4xx_it.o - .debug_info 0x0000000000001b08 0x55b ./Core/Src/system_stm32f4xx.o - .debug_info 0x0000000000002063 0x22 ./Core/Startup/startup_stm32f446retx.o - .debug_info 0x0000000000002085 0x9d2 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - .debug_info 0x0000000000002a57 0xe39 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - .debug_info 0x0000000000003890 0x7be ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o - .debug_info 0x000000000000404e 0x9ab ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o - .debug_info 0x00000000000049f9 0x9ec ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o - .debug_info 0x00000000000053e5 0x1c41 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - .debug_info 0x0000000000007026 0x2d1 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - .debug_info 0x00000000000072f7 0x1de4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - .debug_info 0x00000000000090db 0x507 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - .debug_info 0x00000000000095e2 0x50b ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o +.debug_info 0x0000000000000000 0x9d75 + .debug_info 0x0000000000000000 0x506 ./Core/Src/app.o + .debug_info 0x0000000000000506 0x294 ./Core/Src/freertos.o + .debug_info 0x000000000000079a 0x892 ./Core/Src/main.o + .debug_info 0x000000000000102c 0xc0f ./Core/Src/stm32f4xx_hal_msp.o + .debug_info 0x0000000000001c3b 0x155 ./Core/Src/stm32f4xx_it.o + .debug_info 0x0000000000001d90 0x55b ./Core/Src/system_stm32f4xx.o + .debug_info 0x00000000000022eb 0x22 ./Core/Startup/startup_stm32f446retx.o + .debug_info 0x000000000000230d 0x9d2 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_info 0x0000000000002cdf 0xe39 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_info 0x0000000000003b18 0x7be ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_info 0x00000000000042d6 0x9ab ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_info 0x0000000000004c81 0x9ec ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_info 0x000000000000566d 0x1c41 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_info 0x00000000000072ae 0x2d1 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_info 0x000000000000757f 0x1de4 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_info 0x0000000000009363 0x507 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_info 0x000000000000986a 0x50b ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o -.debug_abbrev 0x0000000000000000 0x1e9d - .debug_abbrev 0x0000000000000000 0xcd ./Core/Src/freertos.o - .debug_abbrev 0x00000000000000cd 0x285 ./Core/Src/main.o - .debug_abbrev 0x0000000000000352 0x1b9 ./Core/Src/stm32f4xx_hal_msp.o - .debug_abbrev 0x000000000000050b 0x98 ./Core/Src/stm32f4xx_it.o - .debug_abbrev 0x00000000000005a3 0x116 ./Core/Src/system_stm32f4xx.o - .debug_abbrev 0x00000000000006b9 0x12 ./Core/Startup/startup_stm32f446retx.o - .debug_abbrev 0x00000000000006cb 0x20d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - .debug_abbrev 0x00000000000008d8 0x316 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - .debug_abbrev 0x0000000000000bee 0x1c4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o - .debug_abbrev 0x0000000000000db2 0x2aa ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o - .debug_abbrev 0x000000000000105c 0x1fb ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o - .debug_abbrev 0x0000000000001257 0x39b ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - .debug_abbrev 0x00000000000015f2 0xf2 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - .debug_abbrev 0x00000000000016e4 0x34e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - .debug_abbrev 0x0000000000001a32 0x259 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - .debug_abbrev 0x0000000000001c8b 0x212 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o +.debug_abbrev 0x0000000000000000 0x1ffe + .debug_abbrev 0x0000000000000000 0x15b ./Core/Src/app.o + .debug_abbrev 0x000000000000015b 0xcd ./Core/Src/freertos.o + .debug_abbrev 0x0000000000000228 0x24d ./Core/Src/main.o + .debug_abbrev 0x0000000000000475 0x1b9 ./Core/Src/stm32f4xx_hal_msp.o + .debug_abbrev 0x000000000000062e 0xd6 ./Core/Src/stm32f4xx_it.o + .debug_abbrev 0x0000000000000704 0x116 ./Core/Src/system_stm32f4xx.o + .debug_abbrev 0x000000000000081a 0x12 ./Core/Startup/startup_stm32f446retx.o + .debug_abbrev 0x000000000000082c 0x20d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_abbrev 0x0000000000000a39 0x316 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_abbrev 0x0000000000000d4f 0x1c4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_abbrev 0x0000000000000f13 0x2aa ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_abbrev 0x00000000000011bd 0x1fb ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_abbrev 0x00000000000013b8 0x39b ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_abbrev 0x0000000000001753 0xf2 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_abbrev 0x0000000000001845 0x34e ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_abbrev 0x0000000000001b93 0x259 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_abbrev 0x0000000000001dec 0x212 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o -.debug_aranges 0x0000000000000000 0x948 +.debug_aranges 0x0000000000000000 0x960 + .debug_aranges + 0x0000000000000000 0x20 ./Core/Src/app.o .debug_aranges - 0x0000000000000000 0x20 ./Core/Src/freertos.o + 0x0000000000000020 0x20 ./Core/Src/freertos.o .debug_aranges - 0x0000000000000020 0x50 ./Core/Src/main.o + 0x0000000000000040 0x40 ./Core/Src/main.o .debug_aranges - 0x0000000000000070 0x30 ./Core/Src/stm32f4xx_hal_msp.o + 0x0000000000000080 0x30 ./Core/Src/stm32f4xx_hal_msp.o .debug_aranges - 0x00000000000000a0 0x50 ./Core/Src/stm32f4xx_it.o + 0x00000000000000b0 0x58 ./Core/Src/stm32f4xx_it.o .debug_aranges - 0x00000000000000f0 0x28 ./Core/Src/system_stm32f4xx.o + 0x0000000000000108 0x28 ./Core/Src/system_stm32f4xx.o .debug_aranges - 0x0000000000000118 0x28 ./Core/Startup/startup_stm32f446retx.o + 0x0000000000000130 0x28 ./Core/Startup/startup_stm32f446retx.o .debug_aranges - 0x0000000000000140 0xf0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + 0x0000000000000158 0xf0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o .debug_aranges - 0x0000000000000230 0x118 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + 0x0000000000000248 0x118 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o .debug_aranges - 0x0000000000000348 0x58 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + 0x0000000000000360 0x58 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o .debug_aranges - 0x00000000000003a0 0x88 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + 0x00000000000003b8 0x88 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o .debug_aranges - 0x0000000000000428 0x78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + 0x0000000000000440 0x78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o .debug_aranges - 0x00000000000004a0 0x1d8 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + 0x00000000000004b8 0x1d8 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o .debug_aranges - 0x0000000000000678 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + 0x0000000000000690 0x40 ./Middlewares/Third_Party/FreeRTOS/Source/list.o .debug_aranges - 0x00000000000006b8 0x1b8 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + 0x00000000000006d0 0x1b8 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o .debug_aranges - 0x0000000000000870 0x80 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + 0x0000000000000888 0x80 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o .debug_aranges - 0x00000000000008f0 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + 0x0000000000000908 0x58 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o -.debug_ranges 0x0000000000000000 0x850 - .debug_ranges 0x0000000000000000 0x10 ./Core/Src/freertos.o - .debug_ranges 0x0000000000000010 0x40 ./Core/Src/main.o +.debug_ranges 0x0000000000000000 0x858 + .debug_ranges 0x0000000000000000 0x10 ./Core/Src/app.o + .debug_ranges 0x0000000000000010 0x10 ./Core/Src/freertos.o + .debug_ranges 0x0000000000000020 0x30 ./Core/Src/main.o .debug_ranges 0x0000000000000050 0x20 ./Core/Src/stm32f4xx_hal_msp.o - .debug_ranges 0x0000000000000070 0x40 ./Core/Src/stm32f4xx_it.o - .debug_ranges 0x00000000000000b0 0x18 ./Core/Src/system_stm32f4xx.o - .debug_ranges 0x00000000000000c8 0x20 ./Core/Startup/startup_stm32f446retx.o - .debug_ranges 0x00000000000000e8 0xe0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - .debug_ranges 0x00000000000001c8 0x108 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - .debug_ranges 0x00000000000002d0 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o - .debug_ranges 0x0000000000000318 0x78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o - .debug_ranges 0x0000000000000390 0x68 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o - .debug_ranges 0x00000000000003f8 0x1c8 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - .debug_ranges 0x00000000000005c0 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - .debug_ranges 0x00000000000005f0 0x1a8 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - .debug_ranges 0x0000000000000798 0x70 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - .debug_ranges 0x0000000000000808 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_ranges 0x0000000000000070 0x48 ./Core/Src/stm32f4xx_it.o + .debug_ranges 0x00000000000000b8 0x18 ./Core/Src/system_stm32f4xx.o + .debug_ranges 0x00000000000000d0 0x20 ./Core/Startup/startup_stm32f446retx.o + .debug_ranges 0x00000000000000f0 0xe0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_ranges 0x00000000000001d0 0x108 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_ranges 0x00000000000002d8 0x48 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_ranges 0x0000000000000320 0x78 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_ranges 0x0000000000000398 0x68 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_ranges 0x0000000000000400 0x1c8 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_ranges 0x00000000000005c8 0x30 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_ranges 0x00000000000005f8 0x1a8 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_ranges 0x00000000000007a0 0x70 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_ranges 0x0000000000000810 0x48 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o -.debug_macro 0x0000000000000000 0x21a4e - .debug_macro 0x0000000000000000 0x231 ./Core/Src/freertos.o - .debug_macro 0x0000000000000231 0xa78 ./Core/Src/freertos.o - .debug_macro 0x0000000000000ca9 0x174 ./Core/Src/freertos.o - .debug_macro 0x0000000000000e1d 0x22 ./Core/Src/freertos.o - .debug_macro 0x0000000000000e3f 0x8e ./Core/Src/freertos.o - .debug_macro 0x0000000000000ecd 0x51 ./Core/Src/freertos.o - .debug_macro 0x0000000000000f1e 0x103 ./Core/Src/freertos.o - .debug_macro 0x0000000000001021 0x6a ./Core/Src/freertos.o - .debug_macro 0x000000000000108b 0x1df ./Core/Src/freertos.o - .debug_macro 0x000000000000126a 0xe4 ./Core/Src/freertos.o - .debug_macro 0x000000000000134e 0x15a ./Core/Src/freertos.o - .debug_macro 0x00000000000014a8 0xde ./Core/Src/freertos.o - .debug_macro 0x0000000000001586 0x1c ./Core/Src/freertos.o - .debug_macro 0x00000000000015a2 0x26 ./Core/Src/freertos.o - .debug_macro 0x00000000000015c8 0x504 ./Core/Src/freertos.o - .debug_macro 0x0000000000001acc 0xb5 ./Core/Src/freertos.o - .debug_macro 0x0000000000001b81 0xaa ./Core/Src/freertos.o - .debug_macro 0x0000000000001c2b 0x295 ./Core/Src/freertos.o - .debug_macro 0x0000000000001ec0 0x2e ./Core/Src/freertos.o - .debug_macro 0x0000000000001eee 0x28 ./Core/Src/freertos.o - .debug_macro 0x0000000000001f16 0x1c ./Core/Src/freertos.o - .debug_macro 0x0000000000001f32 0x22 ./Core/Src/freertos.o - .debug_macro 0x0000000000001f54 0xd9 ./Core/Src/freertos.o - .debug_macro 0x000000000000202d 0x102d ./Core/Src/freertos.o - .debug_macro 0x000000000000305a 0x11f ./Core/Src/freertos.o - .debug_macro 0x0000000000003179 0x16749 ./Core/Src/freertos.o - .debug_macro 0x00000000000198c2 0x6d ./Core/Src/freertos.o - .debug_macro 0x000000000001992f 0x367e ./Core/Src/freertos.o - .debug_macro 0x000000000001cfad 0x5c ./Core/Src/freertos.o - .debug_macro 0x000000000001d009 0xc90 ./Core/Src/freertos.o - .debug_macro 0x000000000001dc99 0x9fe ./Core/Src/freertos.o - .debug_macro 0x000000000001e697 0x115 ./Core/Src/freertos.o - .debug_macro 0x000000000001e7ac 0x1a0 ./Core/Src/freertos.o - .debug_macro 0x000000000001e94c 0xa5 ./Core/Src/freertos.o - .debug_macro 0x000000000001e9f1 0x16d ./Core/Src/freertos.o - .debug_macro 0x000000000001eb5e 0x287 ./Core/Src/freertos.o - .debug_macro 0x000000000001ede5 0x5f ./Core/Src/freertos.o - .debug_macro 0x000000000001ee44 0x236 ./Core/Src/freertos.o - .debug_macro 0x000000000001f07a 0x132 ./Core/Src/freertos.o - .debug_macro 0x000000000001f1ac 0x29c ./Core/Src/freertos.o - .debug_macro 0x000000000001f448 0x2e ./Core/Src/freertos.o - .debug_macro 0x000000000001f476 0x11a ./Core/Src/freertos.o - .debug_macro 0x000000000001f590 0xe8 ./Core/Src/freertos.o - .debug_macro 0x000000000001f678 0x89 ./Core/Src/freertos.o - .debug_macro 0x000000000001f701 0x295 ./Core/Src/freertos.o - .debug_macro 0x000000000001f996 0x126 ./Core/Src/freertos.o - .debug_macro 0x000000000001fabc 0x58 ./Core/Src/freertos.o - .debug_macro 0x000000000001fb14 0x27c ./Core/Src/main.o - .debug_macro 0x000000000001fd90 0xe4 ./Core/Src/main.o - .debug_macro 0x000000000001fe74 0x91 ./Core/Src/main.o - .debug_macro 0x000000000001ff05 0x8d ./Core/Src/main.o - .debug_macro 0x000000000001ff92 0x7e ./Core/Src/main.o - .debug_macro 0x0000000000020010 0x19 ./Core/Src/main.o - .debug_macro 0x0000000000020029 0xf2 ./Core/Src/main.o - .debug_macro 0x000000000002011b 0x1c9 ./Core/Src/stm32f4xx_hal_msp.o - .debug_macro 0x00000000000202e4 0x23b ./Core/Src/stm32f4xx_it.o - .debug_macro 0x000000000002051f 0x1ba ./Core/Src/system_stm32f4xx.o - .debug_macro 0x00000000000206d9 0x21a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - .debug_macro 0x00000000000208f3 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - .debug_macro 0x0000000000020aad 0x1c0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o - .debug_macro 0x0000000000020c6d 0x1de ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o - .debug_macro 0x0000000000020e4b 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o - .debug_macro 0x0000000000021005 0x1fe ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - .debug_macro 0x0000000000021203 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - .debug_macro 0x0000000000021213 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - .debug_macro 0x0000000000021233 0xc7 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - .debug_macro 0x00000000000212fa 0x187 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - .debug_macro 0x0000000000021481 0x279 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - .debug_macro 0x00000000000216fa 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - .debug_macro 0x000000000002170a 0x196 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - .debug_macro 0x00000000000218a0 0x1ae ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o +.debug_macro 0x0000000000000000 0x21cde + .debug_macro 0x0000000000000000 0x286 ./Core/Src/app.o + .debug_macro 0x0000000000000286 0xa78 ./Core/Src/app.o + .debug_macro 0x0000000000000cfe 0x174 ./Core/Src/app.o + .debug_macro 0x0000000000000e72 0x22 ./Core/Src/app.o + .debug_macro 0x0000000000000e94 0x8e ./Core/Src/app.o + .debug_macro 0x0000000000000f22 0x51 ./Core/Src/app.o + .debug_macro 0x0000000000000f73 0x103 ./Core/Src/app.o + .debug_macro 0x0000000000001076 0x6a ./Core/Src/app.o + .debug_macro 0x00000000000010e0 0x1df ./Core/Src/app.o + .debug_macro 0x00000000000012bf 0xe4 ./Core/Src/app.o + .debug_macro 0x00000000000013a3 0x15a ./Core/Src/app.o + .debug_macro 0x00000000000014fd 0xde ./Core/Src/app.o + .debug_macro 0x00000000000015db 0x1c ./Core/Src/app.o + .debug_macro 0x00000000000015f7 0x26 ./Core/Src/app.o + .debug_macro 0x000000000000161d 0x504 ./Core/Src/app.o + .debug_macro 0x0000000000001b21 0xb5 ./Core/Src/app.o + .debug_macro 0x0000000000001bd6 0xaa ./Core/Src/app.o + .debug_macro 0x0000000000001c80 0x91 ./Core/Src/app.o + .debug_macro 0x0000000000001d11 0x8d ./Core/Src/app.o + .debug_macro 0x0000000000001d9e 0x7e ./Core/Src/app.o + .debug_macro 0x0000000000001e1c 0x19 ./Core/Src/app.o + .debug_macro 0x0000000000001e35 0xf2 ./Core/Src/app.o + .debug_macro 0x0000000000001f27 0x295 ./Core/Src/app.o + .debug_macro 0x00000000000021bc 0x2e ./Core/Src/app.o + .debug_macro 0x00000000000021ea 0x28 ./Core/Src/app.o + .debug_macro 0x0000000000002212 0x1c ./Core/Src/app.o + .debug_macro 0x000000000000222e 0x22 ./Core/Src/app.o + .debug_macro 0x0000000000002250 0xd9 ./Core/Src/app.o + .debug_macro 0x0000000000002329 0x102d ./Core/Src/app.o + .debug_macro 0x0000000000003356 0x11f ./Core/Src/app.o + .debug_macro 0x0000000000003475 0x16749 ./Core/Src/app.o + .debug_macro 0x0000000000019bbe 0x6d ./Core/Src/app.o + .debug_macro 0x0000000000019c2b 0x367e ./Core/Src/app.o + .debug_macro 0x000000000001d2a9 0x5c ./Core/Src/app.o + .debug_macro 0x000000000001d305 0xc90 ./Core/Src/app.o + .debug_macro 0x000000000001df95 0x9fe ./Core/Src/app.o + .debug_macro 0x000000000001e993 0x115 ./Core/Src/app.o + .debug_macro 0x000000000001eaa8 0x1a0 ./Core/Src/app.o + .debug_macro 0x000000000001ec48 0xa5 ./Core/Src/app.o + .debug_macro 0x000000000001eced 0x16d ./Core/Src/app.o + .debug_macro 0x000000000001ee5a 0x287 ./Core/Src/app.o + .debug_macro 0x000000000001f0e1 0x5f ./Core/Src/app.o + .debug_macro 0x000000000001f140 0x236 ./Core/Src/app.o + .debug_macro 0x000000000001f376 0x132 ./Core/Src/app.o + .debug_macro 0x000000000001f4a8 0x29c ./Core/Src/app.o + .debug_macro 0x000000000001f744 0x2e ./Core/Src/app.o + .debug_macro 0x000000000001f772 0x11a ./Core/Src/app.o + .debug_macro 0x000000000001f88c 0xe8 ./Core/Src/app.o + .debug_macro 0x000000000001f974 0x89 ./Core/Src/app.o + .debug_macro 0x000000000001f9fd 0x295 ./Core/Src/app.o + .debug_macro 0x000000000001fc92 0x126 ./Core/Src/app.o + .debug_macro 0x000000000001fdb8 0x58 ./Core/Src/app.o + .debug_macro 0x000000000001fe10 0x231 ./Core/Src/freertos.o + .debug_macro 0x0000000000020041 0x286 ./Core/Src/main.o + .debug_macro 0x00000000000202c7 0xe4 ./Core/Src/main.o + .debug_macro 0x00000000000203ab 0x1c9 ./Core/Src/stm32f4xx_hal_msp.o + .debug_macro 0x0000000000020574 0x23b ./Core/Src/stm32f4xx_it.o + .debug_macro 0x00000000000207af 0x1ba ./Core/Src/system_stm32f4xx.o + .debug_macro 0x0000000000020969 0x21a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_macro 0x0000000000020b83 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_macro 0x0000000000020d3d 0x1c0 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_macro 0x0000000000020efd 0x1de ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_macro 0x00000000000210db 0x1ba ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_macro 0x0000000000021295 0x1fe ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x0000000000021493 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x00000000000214a3 0x20 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x00000000000214c3 0xc7 ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_macro 0x000000000002158a 0x187 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_macro 0x0000000000021711 0x279 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x000000000002198a 0x10 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_macro 0x000000000002199a 0x196 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_macro 0x0000000000021b30 0x1ae ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o -.debug_line 0x0000000000000000 0xab30 - .debug_line 0x0000000000000000 0x791 ./Core/Src/freertos.o - .debug_line 0x0000000000000791 0x915 ./Core/Src/main.o - .debug_line 0x00000000000010a6 0x6e0 ./Core/Src/stm32f4xx_hal_msp.o - .debug_line 0x0000000000001786 0x83b ./Core/Src/stm32f4xx_it.o - .debug_line 0x0000000000001fc1 0x714 ./Core/Src/system_stm32f4xx.o - .debug_line 0x00000000000026d5 0x88 ./Core/Startup/startup_stm32f446retx.o - .debug_line 0x000000000000275d 0x97a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - .debug_line 0x00000000000030d7 0xc29 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - .debug_line 0x0000000000003d00 0xada ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o - .debug_line 0x00000000000047da 0xd02 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o - .debug_line 0x00000000000054dc 0x138d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o - .debug_line 0x0000000000006869 0x11cc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - .debug_line 0x0000000000007a35 0x707 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - .debug_line 0x000000000000813c 0x1917 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - .debug_line 0x0000000000009a53 0x7ac ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - .debug_line 0x000000000000a1ff 0x931 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o +.debug_line 0x0000000000000000 0xb31c + .debug_line 0x0000000000000000 0x842 ./Core/Src/app.o + .debug_line 0x0000000000000842 0x791 ./Core/Src/freertos.o + .debug_line 0x0000000000000fd3 0x898 ./Core/Src/main.o + .debug_line 0x000000000000186b 0x6e0 ./Core/Src/stm32f4xx_hal_msp.o + .debug_line 0x0000000000001f4b 0x862 ./Core/Src/stm32f4xx_it.o + .debug_line 0x00000000000027ad 0x714 ./Core/Src/system_stm32f4xx.o + .debug_line 0x0000000000002ec1 0x88 ./Core/Startup/startup_stm32f446retx.o + .debug_line 0x0000000000002f49 0x97a ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_line 0x00000000000038c3 0xc29 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_line 0x00000000000044ec 0xada ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_line 0x0000000000004fc6 0xd02 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_line 0x0000000000005cc8 0x138d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_line 0x0000000000007055 0x11cc ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_line 0x0000000000008221 0x707 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_line 0x0000000000008928 0x1917 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_line 0x000000000000a23f 0x7ac ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_line 0x000000000000a9eb 0x931 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o -.debug_str 0x0000000000000000 0xcf5d0 - .debug_str 0x0000000000000000 0xc5c10 ./Core/Src/freertos.o +.debug_str 0x0000000000000000 0xcf5eb + .debug_str 0x0000000000000000 0xc7f50 ./Core/Src/app.o + 0xc81ed (size before relaxing) + .debug_str 0x00000000000c7f50 0x13d ./Core/Src/freertos.o 0xc5ed2 (size before relaxing) - .debug_str 0x00000000000c5c10 0x2818 ./Core/Src/main.o - 0xc8676 (size before relaxing) - .debug_str 0x00000000000c8428 0x965 ./Core/Src/stm32f4xx_hal_msp.o + .debug_str 0x00000000000c808d 0x39e ./Core/Src/main.o + 0xc8514 (size before relaxing) + .debug_str 0x00000000000c842b 0x965 ./Core/Src/stm32f4xx_hal_msp.o 0xc2b4a (size before relaxing) - .debug_str 0x00000000000c8d8d 0xd9 ./Core/Src/stm32f4xx_it.o - 0xc5e33 (size before relaxing) - .debug_str 0x00000000000c8e66 0xdb ./Core/Src/system_stm32f4xx.o + .debug_str 0x00000000000c8d90 0xe7 ./Core/Src/stm32f4xx_it.o + 0xc5e4f (size before relaxing) + .debug_str 0x00000000000c8e77 0xdb ./Core/Src/system_stm32f4xx.o 0xc208f (size before relaxing) - .debug_str 0x00000000000c8f41 0x36 ./Core/Startup/startup_stm32f446retx.o + .debug_str 0x00000000000c8f52 0x36 ./Core/Startup/startup_stm32f446retx.o 0x69 (size before relaxing) - .debug_str 0x00000000000c8f77 0x60d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_str 0x00000000000c8f88 0x617 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o 0xc2c54 (size before relaxing) - .debug_str 0x00000000000c9584 0x344 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_str 0x00000000000c959f 0x344 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o 0xc2962 (size before relaxing) - .debug_str 0x00000000000c98c8 0x121 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_str 0x00000000000c98e3 0x121 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o 0xc220a (size before relaxing) - .debug_str 0x00000000000c99e9 0x233 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_str 0x00000000000c9a04 0x233 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o 0xc24c8 (size before relaxing) - .debug_str 0x00000000000c9c1c 0x324 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_str 0x00000000000c9c37 0x324 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o 0xc24fb (size before relaxing) - .debug_str 0x00000000000c9f40 0x38ab ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_str 0x00000000000c9f5b 0x38ab ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o 0xe352 (size before relaxing) - .debug_str 0x00000000000cd7eb 0x20f ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_str 0x00000000000cd806 0x20f ./Middlewares/Third_Party/FreeRTOS/Source/list.o 0xa651 (size before relaxing) - .debug_str 0x00000000000cd9fa 0x1126 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_str 0x00000000000cda15 0x1126 ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o 0xc9bc (size before relaxing) - .debug_str 0x00000000000ceb20 0x783 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_str 0x00000000000ceb3b 0x783 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o 0x85c2 (size before relaxing) - .debug_str 0x00000000000cf2a3 0x32d ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_str 0x00000000000cf2be 0x32d ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o 0xaf93 (size before relaxing) .comment 0x0000000000000000 0x50 - .comment 0x0000000000000000 0x50 ./Core/Src/freertos.o + .comment 0x0000000000000000 0x50 ./Core/Src/app.o 0x51 (size before relaxing) + .comment 0x0000000000000050 0x51 ./Core/Src/freertos.o .comment 0x0000000000000050 0x51 ./Core/Src/main.o .comment 0x0000000000000050 0x51 ./Core/Src/stm32f4xx_hal_msp.o .comment 0x0000000000000050 0x51 ./Core/Src/stm32f4xx_it.o @@ -4437,23 +4551,24 @@ LOAD c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.ext .comment 0x0000000000000050 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o .comment 0x0000000000000050 0x51 ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o -.debug_frame 0x0000000000000000 0x23d4 - .debug_frame 0x0000000000000000 0x38 ./Core/Src/freertos.o - .debug_frame 0x0000000000000038 0xf0 ./Core/Src/main.o - .debug_frame 0x0000000000000128 0x7c ./Core/Src/stm32f4xx_hal_msp.o - .debug_frame 0x00000000000001a4 0xc4 ./Core/Src/stm32f4xx_it.o - .debug_frame 0x0000000000000268 0x58 ./Core/Src/system_stm32f4xx.o - .debug_frame 0x00000000000002c0 0x374 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o - .debug_frame 0x0000000000000634 0x498 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o - .debug_frame 0x0000000000000acc 0x14c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o - .debug_frame 0x0000000000000c18 0x1f4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o - .debug_frame 0x0000000000000e0c 0x1e8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o - .debug_frame 0x0000000000000ff4 0x80c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o - .debug_frame 0x0000000000001800 0xd8 ./Middlewares/Third_Party/FreeRTOS/Source/list.o - .debug_frame 0x00000000000018d8 0x77c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o - .debug_frame 0x0000000000002054 0x1a8 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o - .debug_frame 0x00000000000021fc 0x12c ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o - .debug_frame 0x0000000000002328 0x2c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) - .debug_frame 0x0000000000002354 0x20 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) - .debug_frame 0x0000000000002374 0x2c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) - .debug_frame 0x00000000000023a0 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) +.debug_frame 0x0000000000000000 0x23e4 + .debug_frame 0x0000000000000000 0x34 ./Core/Src/app.o + .debug_frame 0x0000000000000034 0x38 ./Core/Src/freertos.o + .debug_frame 0x000000000000006c 0xb4 ./Core/Src/main.o + .debug_frame 0x0000000000000120 0x7c ./Core/Src/stm32f4xx_hal_msp.o + .debug_frame 0x000000000000019c 0xdc ./Core/Src/stm32f4xx_it.o + .debug_frame 0x0000000000000278 0x58 ./Core/Src/system_stm32f4xx.o + .debug_frame 0x00000000000002d0 0x374 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o + .debug_frame 0x0000000000000644 0x498 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o + .debug_frame 0x0000000000000adc 0x14c ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o + .debug_frame 0x0000000000000c28 0x1f4 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o + .debug_frame 0x0000000000000e1c 0x1e8 ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o + .debug_frame 0x0000000000001004 0x80c ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o + .debug_frame 0x0000000000001810 0xd8 ./Middlewares/Third_Party/FreeRTOS/Source/list.o + .debug_frame 0x00000000000018e8 0x77c ./Middlewares/Third_Party/FreeRTOS/Source/tasks.o + .debug_frame 0x0000000000002064 0x1a8 ./Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o + .debug_frame 0x000000000000220c 0x12c ./Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o + .debug_frame 0x0000000000002338 0x2c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-init.o) + .debug_frame 0x0000000000002364 0x20 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-memset.o) + .debug_frame 0x0000000000002384 0x2c c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_aeabi_uldivmod.o) + .debug_frame 0x00000000000023b0 0x34 c:/st/stm32cubeide_1.11.2/stm32cubeide/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.win32_1.0.100.202210260954/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard\libgcc.a(_udivmoddi4.o) diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list index 46ec73f..18ef8c2 100644 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list @@ -1,3 +1,4 @@ +"./Core/Src/app.o" "./Core/Src/freertos.o" "./Core/Src/main.o" "./Core/Src/stm32f4xx_hal_msp.o" From 4d2f63a97d7380c4b8a8500c725cc4a382e6af56 Mon Sep 17 00:00:00 2001 From: Olivia Linden Date: Sun, 19 Mar 2023 17:59:03 +0100 Subject: [PATCH 5/7] modified the file name --- .../.gitignore | 0 .../.metadata/.lock | 0 .../.metadata/.log4j.xml | 0 .../2.1.500.202211100823 | 0 .../FreeRTOS_LED.1679135758468.pdom | Bin .../FreeRTOS_LED.language.settings.xml | 0 .../.plugins/org.eclipse.cdt.make.core/specs.c | 0 .../.plugins/org.eclipse.cdt.make.core/specs.cpp | 0 .../org.eclipse.cdt.managedbuilder.core/spec.c | 0 .../org.eclipse.cdt.managedbuilder.core/spec.cpp | 0 .../.history/39/30e46b3185c5001d13d6fe58f0709e0f | 0 .../.history/3e/e05e38db7ac5001d13d6fe58f0709e0f | 0 .../.history/48/c0c0109d80c5001d13d6fe58f0709e0f | 0 .../.history/52/80848b7d7ec5001d13d6fe58f0709e0f | 0 .../.history/52/a059856480c5001d13d6fe58f0709e0f | 0 .../.history/57/00b38daf78c5001d13d6fe58f0709e0f | 0 .../.history/5c/e082ac857ec5001d13d6fe58f0709e0f | 0 .../.history/73/9026441f7cc5001d13d6fe58f0709e0f | 0 .../.history/8f/709053d17ac5001d13d6fe58f0709e0f | 0 .../.history/9/a06a581285c5001d13d6fe58f0709e0f | 0 .../.history/a1/90e171dc80c5001d13d6fe58f0709e0f | 0 .../.history/a5/70e720af78c5001d13d6fe58f0709e0f | 0 .../.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f | 0 .../.history/bd/a0bac3217ec5001d13d6fe58f0709e0f | 0 .../.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f | 0 .../.history/ff/b0366ba17fc5001d13d6fe58f0709e0f | 0 .../.indexes/1/ce/ce/c5/ae/properties.index | Bin .../FreeRTOS_LED/.indexes/af/history.index | Bin .../FreeRTOS_LED/.indexes/bf/c4/properties.index | Bin .../FreeRTOS_LED/.indexes/d5/7a/c4/properties.index | Bin .../FreeRTOS_LED/.indexes/properties.index | Bin .../.projects/FreeRTOS_LED/.location | Bin .../.projects/FreeRTOS_LED/.markers.snap | Bin .../.projects/FreeRTOS_LED/.syncinfo.snap | Bin .../.root/.indexes/properties.index | Bin .../org.eclipse.core.resources/.root/.markers.snap | Bin .../.safetable/org.eclipse.core.resources | Bin .../.plugins/org.eclipse.core.resources/0.snap | Bin .../com.st.stm32cube.ide.mcu.ide.oss.prefs | 0 .../org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs | 0 .../.settings/org.eclipse.cdt.debug.core.prefs | 0 .../org.eclipse.cdt.managedbuilder.core.prefs | 0 .../.settings/org.eclipse.core.resources.prefs | 0 .../.settings/org.eclipse.debug.core.prefs | 0 .../.settings/org.eclipse.debug.ui.prefs | 0 .../.settings/org.eclipse.launchbar.core.prefs | 0 .../.settings/org.eclipse.ui.navigator.prefs | 0 .../.settings/org.eclipse.ui.prefs | 0 .../.settings/org.eclipse.ui.workbench.prefs | 0 .../.settings/org.eclipse.urischeme.prefs | 0 .../launchConfigurationHistory.xml | 0 .../.plugins/org.eclipse.e4.workbench/workbench.xmi | 0 .../.plugins/org.eclipse.ui.ide/dialog_settings.xml | 0 .../org.eclipse.ui.workbench/workingsets.xml | 0 .../.metadata/version.ini | 0 .../README.md | 0 .../.cproject | 0 .../.gitmodules | 0 .../.mxproject | 0 .../.project | 0 .../.settings/language.settings.xml | 0 .../.settings/stm32cubeide.project.prefs | 0 .../CMakeLists.txt | 0 .../Core/Inc/FreeRTOSConfig.h | 0 .../Core/Inc/app.h | 0 .../Core/Inc/main.h | 0 .../Core/Inc/stm32f4xx_hal_conf.h | 0 .../Core/Inc/stm32f4xx_it.h | 0 .../Core/Src/app.c | 0 .../Core/Src/freertos.c | 0 .../Core/Src/main.c | 0 .../Core/Src/stm32f4xx_hal_msp.c | 0 .../Core/Src/stm32f4xx_it.c | 0 .../Core/Src/syscalls.c | 0 .../Core/Src/sysmem.c | 0 .../Core/Src/system_stm32f4xx.c | 0 .../Core/Startup/startup_stm32f446retx.s | 0 .../Debug/Core/Src/app.d | 0 .../Debug/Core/Src/app.o | Bin .../Debug/Core/Src/app.su | 0 .../Debug/Core/Src/freertos.d | 0 .../Debug/Core/Src/freertos.o | Bin .../Debug/Core/Src/freertos.su | 0 .../Debug/Core/Src/main.d | 0 .../Debug/Core/Src/main.o | Bin .../Debug/Core/Src/main.su | 0 .../Debug/Core/Src/stm32f4xx_hal_msp.d | 0 .../Debug/Core/Src/stm32f4xx_hal_msp.o | Bin .../Debug/Core/Src/stm32f4xx_hal_msp.su | 0 .../Debug/Core/Src/stm32f4xx_it.d | 0 .../Debug/Core/Src/stm32f4xx_it.o | Bin .../Debug/Core/Src/stm32f4xx_it.su | 0 .../Debug/Core/Src/subdir.mk | 0 .../Debug/Core/Src/syscalls.d | 0 .../Debug/Core/Src/syscalls.o | Bin .../Debug/Core/Src/syscalls.su | 0 .../Debug/Core/Src/sysmem.d | 0 .../Debug/Core/Src/sysmem.o | Bin .../Debug/Core/Src/sysmem.su | 0 .../Debug/Core/Src/system_stm32f4xx.d | 0 .../Debug/Core/Src/system_stm32f4xx.o | Bin .../Debug/Core/Src/system_stm32f4xx.su | 0 .../Debug/Core/Startup/startup_stm32f446retx.d | 0 .../Debug/Core/Startup/startup_stm32f446retx.o | Bin .../Debug/Core/Startup/subdir.mk | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o | Bin .../Src/stm32f4xx_hal_cortex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o | Bin .../Src/stm32f4xx_hal_dma_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su | 0 .../Src/stm32f4xx_hal_flash_ex.d | 0 .../Src/stm32f4xx_hal_flash_ex.o | Bin .../Src/stm32f4xx_hal_flash_ex.su | 0 .../Src/stm32f4xx_hal_flash_ramfunc.d | 0 .../Src/stm32f4xx_hal_flash_ramfunc.o | Bin .../Src/stm32f4xx_hal_flash_ramfunc.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o | Bin .../Src/stm32f4xx_hal_pwr_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o | Bin .../Src/stm32f4xx_hal_rcc_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o | Bin .../Src/stm32f4xx_hal_tim_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su | 0 .../Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk | 0 .../Debug/FreeRTOS_LED.elf | Bin .../Debug/FreeRTOS_LED.list | 0 .../Debug/FreeRTOS_LED.map | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o | Bin .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su | 0 .../FreeRTOS/Source/CMSIS_RTOS/subdir.mk | 0 .../Third_Party/FreeRTOS/Source/croutine.d | 0 .../Third_Party/FreeRTOS/Source/croutine.o | Bin .../Third_Party/FreeRTOS/Source/croutine.su | 0 .../Third_Party/FreeRTOS/Source/event_groups.d | 0 .../Third_Party/FreeRTOS/Source/event_groups.o | Bin .../Third_Party/FreeRTOS/Source/event_groups.su | 0 .../Middlewares/Third_Party/FreeRTOS/Source/list.d | 0 .../Middlewares/Third_Party/FreeRTOS/Source/list.o | Bin .../Middlewares/Third_Party/FreeRTOS/Source/list.su | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o | Bin .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk | 0 .../FreeRTOS/Source/portable/MemMang/heap_4.d | 0 .../FreeRTOS/Source/portable/MemMang/heap_4.o | Bin .../FreeRTOS/Source/portable/MemMang/heap_4.su | 0 .../FreeRTOS/Source/portable/MemMang/subdir.mk | 0 .../Middlewares/Third_Party/FreeRTOS/Source/queue.d | 0 .../Middlewares/Third_Party/FreeRTOS/Source/queue.o | Bin .../Third_Party/FreeRTOS/Source/queue.su | 0 .../Third_Party/FreeRTOS/Source/stream_buffer.d | 0 .../Third_Party/FreeRTOS/Source/stream_buffer.o | Bin .../Third_Party/FreeRTOS/Source/stream_buffer.su | 0 .../Third_Party/FreeRTOS/Source/subdir.mk | 0 .../Middlewares/Third_Party/FreeRTOS/Source/tasks.d | 0 .../Middlewares/Third_Party/FreeRTOS/Source/tasks.o | Bin .../Third_Party/FreeRTOS/Source/tasks.su | 0 .../Third_Party/FreeRTOS/Source/timers.d | 0 .../Third_Party/FreeRTOS/Source/timers.o | Bin .../Third_Party/FreeRTOS/Source/timers.su | 0 .../Debug/makefile | 0 .../Debug/objects.list | 0 .../Debug/objects.mk | 0 .../Debug/sources.mk | 0 .../CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h | 0 .../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h | 0 .../Device/ST/STM32F4xx/Include/system_stm32f4xx.h | 0 .../Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt | 0 .../Drivers/CMSIS/Include/cmsis_armcc.h | 0 .../Drivers/CMSIS/Include/cmsis_armclang.h | 0 .../Drivers/CMSIS/Include/cmsis_compiler.h | 0 .../Drivers/CMSIS/Include/cmsis_gcc.h | 0 .../Drivers/CMSIS/Include/cmsis_iccarm.h | 0 .../Drivers/CMSIS/Include/cmsis_version.h | 0 .../Drivers/CMSIS/Include/core_armv8mbl.h | 0 .../Drivers/CMSIS/Include/core_armv8mml.h | 0 .../Drivers/CMSIS/Include/core_cm0.h | 0 .../Drivers/CMSIS/Include/core_cm0plus.h | 0 .../Drivers/CMSIS/Include/core_cm1.h | 0 .../Drivers/CMSIS/Include/core_cm23.h | 0 .../Drivers/CMSIS/Include/core_cm3.h | 0 .../Drivers/CMSIS/Include/core_cm33.h | 0 .../Drivers/CMSIS/Include/core_cm4.h | 0 .../Drivers/CMSIS/Include/core_cm7.h | 0 .../Drivers/CMSIS/Include/core_sc000.h | 0 .../Drivers/CMSIS/Include/core_sc300.h | 0 .../Drivers/CMSIS/Include/mpu_armv7.h | 0 .../Drivers/CMSIS/Include/mpu_armv8.h | 0 .../Drivers/CMSIS/Include/tz_context.h | 0 .../Drivers/CMSIS/LICENSE.txt | 0 .../Inc/Legacy/stm32_hal_legacy.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h | 0 .../Inc/stm32f4xx_hal_flash_ex.h | 0 .../Inc/stm32f4xx_hal_flash_ramfunc.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h | 0 .../Inc/stm32f4xx_hal_gpio_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h | 0 .../Drivers/STM32F4xx_HAL_Driver/LICENSE.txt | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c | 0 .../Src/stm32f4xx_hal_flash_ex.c | 0 .../Src/stm32f4xx_hal_flash_ramfunc.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c | 0 .../FreeRTOS_LED.ioc | 0 .../FreeRTOS_LED.launch | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h | 0 .../Middlewares/Third_Party/FreeRTOS/Source/LICENSE | 0 .../Third_Party/FreeRTOS/Source/croutine.c | 0 .../Third_Party/FreeRTOS/Source/event_groups.c | 0 .../Third_Party/FreeRTOS/Source/include/FreeRTOS.h | 0 .../FreeRTOS/Source/include/StackMacros.h | 0 .../Third_Party/FreeRTOS/Source/include/atomic.h | 0 .../Third_Party/FreeRTOS/Source/include/croutine.h | 0 .../Source/include/deprecated_definitions.h | 0 .../FreeRTOS/Source/include/event_groups.h | 0 .../Third_Party/FreeRTOS/Source/include/list.h | 0 .../FreeRTOS/Source/include/message_buffer.h | 0 .../FreeRTOS/Source/include/mpu_prototypes.h | 0 .../FreeRTOS/Source/include/mpu_wrappers.h | 0 .../Third_Party/FreeRTOS/Source/include/portable.h | 0 .../Third_Party/FreeRTOS/Source/include/projdefs.h | 0 .../Third_Party/FreeRTOS/Source/include/queue.h | 0 .../Third_Party/FreeRTOS/Source/include/semphr.h | 0 .../FreeRTOS/Source/include/stack_macros.h | 0 .../FreeRTOS/Source/include/stream_buffer.h | 0 .../Third_Party/FreeRTOS/Source/include/task.h | 0 .../Third_Party/FreeRTOS/Source/include/timers.h | 0 .../Middlewares/Third_Party/FreeRTOS/Source/list.c | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c | 0 .../Source/portable/GCC/ARM_CM4F/portmacro.h | 0 .../FreeRTOS/Source/portable/MemMang/heap_4.c | 0 .../Middlewares/Third_Party/FreeRTOS/Source/queue.c | 0 .../Third_Party/FreeRTOS/Source/stream_buffer.c | 0 .../Middlewares/Third_Party/FreeRTOS/Source/tasks.c | 0 .../Third_Party/FreeRTOS/Source/timers.c | 0 .../STM32F446RETX_FLASH.ld | 0 .../STM32F446RETX_RAM.ld | 0 .../croutine.c | 0 .../event_groups.c | 0 .../include/FreeRTOS.h | 0 .../include/StackMacros.h | 0 .../include/atomic.h | 0 .../include/croutine.h | 0 .../include/deprecated_definitions.h | 0 .../include/event_groups.h | 0 .../include/list.h | 0 .../include/message_buffer.h | 0 .../include/mpu_prototypes.h | 0 .../include/mpu_wrappers.h | 0 .../include/portable.h | 0 .../include/projdefs.h | 0 .../include/queue.h | 0 .../include/semphr.h | 0 .../include/stack_macros.h | 0 .../include/stdint.readme | 0 .../include/stream_buffer.h | 0 .../include/task.h | 0 .../include/timers.h | 0 .../tutorial01-stm32-pio-01-02_files_olivia}/list.c | 0 .../manifest.yml | 0 .../portable/ARMClang/Use-the-GCC-ports.txt | 0 .../portable/ARMv8M/ReadMe.txt | 0 .../portable/ARMv8M/copy_files.py | 0 .../portable/ARMv8M/non_secure/ReadMe.txt | 0 .../portable/ARMv8M/non_secure/port.c | 0 .../non_secure/portable/GCC/ARM_CM23/portasm.c | 0 .../non_secure/portable/GCC/ARM_CM23/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c | 0 .../portable/GCC/ARM_CM23_NTZ/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM33/portasm.c | 0 .../non_secure/portable/GCC/ARM_CM33/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c | 0 .../portable/GCC/ARM_CM33_NTZ/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM55/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM85/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM23/portasm.s | 0 .../non_secure/portable/IAR/ARM_CM23/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s | 0 .../portable/IAR/ARM_CM23_NTZ/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM33/portasm.s | 0 .../non_secure/portable/IAR/ARM_CM33/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s | 0 .../portable/IAR/ARM_CM33_NTZ/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM55/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM85/portmacro.h | 0 .../portable/ARMv8M/non_secure/portasm.h | 0 .../portable/ARMv8M/non_secure/portmacrocommon.h | 0 .../portable/ARMv8M/secure/ReadMe.txt | 0 .../portable/GCC/ARM_CM23/secure_context_port.c | 0 .../portable/GCC/ARM_CM33/secure_context_port.c | 0 .../portable/IAR/ARM_CM23/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM33/secure_context_port_asm.s | 0 .../portable/ARMv8M/secure/context/secure_context.c | 0 .../portable/ARMv8M/secure/context/secure_context.h | 0 .../portable/ARMv8M/secure/heap/secure_heap.c | 0 .../portable/ARMv8M/secure/heap/secure_heap.h | 0 .../portable/ARMv8M/secure/init/secure_init.c | 0 .../portable/ARMv8M/secure/init/secure_init.h | 0 .../ARMv8M/secure/macros/secure_port_macros.h | 0 .../portable/BCC/16BitDOS/Flsh186/port.c | 0 .../portable/BCC/16BitDOS/Flsh186/prtmacro.h | 0 .../portable/BCC/16BitDOS/PC/port.c | 0 .../portable/BCC/16BitDOS/PC/prtmacro.h | 0 .../portable/BCC/16BitDOS/common/portasm.h | 0 .../portable/BCC/16BitDOS/common/portcomn.c | 0 .../portable/CCS/ARM_CM3/port.c | 0 .../portable/CCS/ARM_CM3/portasm.asm | 0 .../portable/CCS/ARM_CM3/portmacro.h | 0 .../portable/CCS/ARM_CM4F/port.c | 0 .../portable/CCS/ARM_CM4F/portasm.asm | 0 .../portable/CCS/ARM_CM4F/portmacro.h | 0 .../portable/CCS/ARM_Cortex-R4/port.c | 0 .../portable/CCS/ARM_Cortex-R4/portASM.asm | 0 .../portable/CCS/ARM_Cortex-R4/portmacro.h | 0 .../portable/CCS/MSP430X/data_model.h | 0 .../portable/CCS/MSP430X/port.c | 0 .../portable/CCS/MSP430X/portext.asm | 0 .../portable/CCS/MSP430X/portmacro.h | 0 .../portable/CMakeLists.txt | 0 .../portable/CodeWarrior/ColdFire_V1/port.c | 0 .../portable/CodeWarrior/ColdFire_V1/portasm.S | 0 .../portable/CodeWarrior/ColdFire_V1/portmacro.h | 0 .../portable/CodeWarrior/ColdFire_V2/port.c | 0 .../portable/CodeWarrior/ColdFire_V2/portasm.S | 0 .../portable/CodeWarrior/ColdFire_V2/portmacro.h | 0 .../portable/CodeWarrior/HCS12/port.c | 0 .../portable/CodeWarrior/HCS12/portmacro.h | 0 .../portable/Common/mpu_wrappers.c | 0 .../portable/GCC/ARM7_AT91FR40008/port.c | 0 .../portable/GCC/ARM7_AT91FR40008/portISR.c | 0 .../portable/GCC/ARM7_AT91FR40008/portmacro.h | 0 .../portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h | 0 .../portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h | 0 .../portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c | 0 .../portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h | 0 .../portable/GCC/ARM7_AT91SAM7S/port.c | 0 .../portable/GCC/ARM7_AT91SAM7S/portISR.c | 0 .../portable/GCC/ARM7_AT91SAM7S/portmacro.h | 0 .../portable/GCC/ARM7_LPC2000/port.c | 0 .../portable/GCC/ARM7_LPC2000/portISR.c | 0 .../portable/GCC/ARM7_LPC2000/portmacro.h | 0 .../portable/GCC/ARM7_LPC23xx/port.c | 0 .../portable/GCC/ARM7_LPC23xx/portISR.c | 0 .../portable/GCC/ARM7_LPC23xx/portmacro.h | 0 .../portable/GCC/ARM_CA53_64_BIT/port.c | 0 .../portable/GCC/ARM_CA53_64_BIT/portASM.S | 0 .../portable/GCC/ARM_CA53_64_BIT/portmacro.h | 0 .../portable/GCC/ARM_CA53_64_BIT_SRE/port.c | 0 .../portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S | 0 .../portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h | 0 .../portable/GCC/ARM_CA9/port.c | 0 .../portable/GCC/ARM_CA9/portASM.S | 0 .../portable/GCC/ARM_CA9/portmacro.h | 0 .../portable/GCC/ARM_CM0/port.c | 0 .../portable/GCC/ARM_CM0/portmacro.h | 0 .../portable/GCC/ARM_CM23/non_secure/port.c | 0 .../portable/GCC/ARM_CM23/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM23/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM23/non_secure/portmacro.h | 0 .../GCC/ARM_CM23/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM23/secure/secure_context.c | 0 .../portable/GCC/ARM_CM23/secure/secure_context.h | 0 .../GCC/ARM_CM23/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM23/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM23/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM23/secure/secure_init.c | 0 .../portable/GCC/ARM_CM23/secure/secure_init.h | 0 .../GCC/ARM_CM23/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM23_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM23_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM3/port.c | 0 .../portable/GCC/ARM_CM3/portmacro.h | 0 .../portable/GCC/ARM_CM33/non_secure/port.c | 0 .../portable/GCC/ARM_CM33/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM33/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM33/non_secure/portmacro.h | 0 .../GCC/ARM_CM33/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM33/secure/secure_context.c | 0 .../portable/GCC/ARM_CM33/secure/secure_context.h | 0 .../GCC/ARM_CM33/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM33/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM33/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM33/secure/secure_init.c | 0 .../portable/GCC/ARM_CM33/secure/secure_init.h | 0 .../GCC/ARM_CM33/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM33_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM33_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM3_MPU/port.c | 0 .../portable/GCC/ARM_CM3_MPU/portmacro.h | 0 .../portable/GCC/ARM_CM4F/port.c | 0 .../portable/GCC/ARM_CM4F/portmacro.h | 0 .../portable/GCC/ARM_CM4_MPU/port.c | 0 .../portable/GCC/ARM_CM4_MPU/portmacro.h | 0 .../portable/GCC/ARM_CM55/non_secure/port.c | 0 .../portable/GCC/ARM_CM55/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM55/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM55/non_secure/portmacro.h | 0 .../GCC/ARM_CM55/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM55/secure/secure_context.c | 0 .../portable/GCC/ARM_CM55/secure/secure_context.h | 0 .../GCC/ARM_CM55/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM55/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM55/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM55/secure/secure_init.c | 0 .../portable/GCC/ARM_CM55/secure/secure_init.h | 0 .../GCC/ARM_CM55/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM55_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM55_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM7/ReadMe.txt | 0 .../portable/GCC/ARM_CM7/r0p1/port.c | 0 .../portable/GCC/ARM_CM7/r0p1/portmacro.h | 0 .../portable/GCC/ARM_CM85/non_secure/port.c | 0 .../portable/GCC/ARM_CM85/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM85/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM85/non_secure/portmacro.h | 0 .../GCC/ARM_CM85/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM85/secure/secure_context.c | 0 .../portable/GCC/ARM_CM85/secure/secure_context.h | 0 .../GCC/ARM_CM85/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM85/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM85/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM85/secure/secure_init.c | 0 .../portable/GCC/ARM_CM85/secure/secure_init.h | 0 .../GCC/ARM_CM85/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM85_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM85_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CR5/port.c | 0 .../portable/GCC/ARM_CR5/portASM.S | 0 .../portable/GCC/ARM_CR5/portmacro.h | 0 .../portable/GCC/ARM_CRx_No_GIC/port.c | 0 .../portable/GCC/ARM_CRx_No_GIC/portASM.S | 0 .../portable/GCC/ARM_CRx_No_GIC/portmacro.h | 0 .../portable/GCC/ATMega323/port.c | 0 .../portable/GCC/ATMega323/portmacro.h | 0 .../portable/GCC/AVR32_UC3/exception.S | 0 .../portable/GCC/AVR32_UC3/port.c | 0 .../portable/GCC/AVR32_UC3/portmacro.h | 0 .../portable/GCC/AVR_AVRDx/README.md | 0 .../portable/GCC/AVR_Mega0/README.md | 0 .../portable/GCC/CORTUS_APS3/port.c | 0 .../portable/GCC/CORTUS_APS3/portmacro.h | 0 .../portable/GCC/ColdFire_V2/port.c | 0 .../portable/GCC/ColdFire_V2/portasm.S | 0 .../portable/GCC/ColdFire_V2/portmacro.h | 0 .../portable/GCC/H8S2329/port.c | 0 .../portable/GCC/H8S2329/portmacro.h | 0 .../portable/GCC/HCS12/port.c | 0 .../portable/GCC/HCS12/portmacro.h | 0 .../portable/GCC/IA32_flat/ISR_Support.h | 0 .../portable/GCC/IA32_flat/port.c | 0 .../portable/GCC/IA32_flat/portASM.S | 0 .../portable/GCC/IA32_flat/portmacro.h | 0 .../portable/GCC/MCF5235/readme.md | 0 .../portable/GCC/MSP430F449/port.c | 0 .../portable/GCC/MSP430F449/portmacro.h | 0 .../portable/GCC/MicroBlaze/port.c | 0 .../portable/GCC/MicroBlaze/portasm.s | 0 .../portable/GCC/MicroBlaze/portmacro.h | 0 .../portable/GCC/MicroBlazeV8/port.c | 0 .../portable/GCC/MicroBlazeV8/port_exceptions.c | 0 .../portable/GCC/MicroBlazeV8/portasm.S | 0 .../portable/GCC/MicroBlazeV8/portmacro.h | 0 .../portable/GCC/MicroBlazeV9/port.c | 0 .../portable/GCC/MicroBlazeV9/port_exceptions.c | 0 .../portable/GCC/MicroBlazeV9/portasm.S | 0 .../portable/GCC/MicroBlazeV9/portmacro.h | 0 .../portable/GCC/NiosII/port.c | 0 .../portable/GCC/NiosII/port_asm.S | 0 .../portable/GCC/NiosII/portmacro.h | 0 .../portable/GCC/PPC405_Xilinx/FPU_Macros.h | 0 .../portable/GCC/PPC405_Xilinx/port.c | 0 .../portable/GCC/PPC405_Xilinx/portasm.S | 0 .../portable/GCC/PPC405_Xilinx/portmacro.h | 0 .../portable/GCC/PPC440_Xilinx/FPU_Macros.h | 0 .../portable/GCC/PPC440_Xilinx/port.c | 0 .../portable/GCC/PPC440_Xilinx/portasm.S | 0 .../portable/GCC/PPC440_Xilinx/portmacro.h | 0 .../portable/GCC/RISC-V/Documentation.url | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../GCC/RISC-V/chip_specific_extensions/readme.txt | 0 .../portable/GCC/RISC-V/port.c | 0 .../portable/GCC/RISC-V/portASM.S | 0 .../portable/GCC/RISC-V/portContext.h | 0 .../portable/GCC/RISC-V/portmacro.h | 0 .../portable/GCC/RISC-V/readme.txt | 0 .../portable/GCC/RL78/isr_support.h | 0 .../portable/GCC/RL78/port.c | 0 .../portable/GCC/RL78/portasm.S | 0 .../portable/GCC/RL78/portmacro.h | 0 .../portable/GCC/RX100/port.c | 0 .../portable/GCC/RX100/portmacro.h | 0 .../portable/GCC/RX100/readme.txt | 0 .../portable/GCC/RX200/port.c | 0 .../portable/GCC/RX200/portmacro.h | 0 .../portable/GCC/RX600/port.c | 0 .../portable/GCC/RX600/portmacro.h | 0 .../portable/GCC/RX600/readme.txt | 0 .../portable/GCC/RX600v2/port.c | 0 .../portable/GCC/RX600v2/portmacro.h | 0 .../portable/GCC/RX600v2/readme.txt | 0 .../portable/GCC/RX700v3_DPFPU/port.c | 0 .../portable/GCC/RX700v3_DPFPU/portmacro.h | 0 .../portable/GCC/RX700v3_DPFPU/readme.txt | 0 .../portable/GCC/STR75x/port.c | 0 .../portable/GCC/STR75x/portISR.c | 0 .../portable/GCC/STR75x/portmacro.h | 0 .../portable/GCC/TriCore_1782/port.c | 0 .../portable/GCC/TriCore_1782/portmacro.h | 0 .../portable/GCC/TriCore_1782/porttrap.c | 0 .../portable/IAR/78K0R/ISR_Support.h | 0 .../portable/IAR/78K0R/port.c | 0 .../portable/IAR/78K0R/portasm.s26 | 0 .../portable/IAR/78K0R/portmacro.h | 0 .../portable/IAR/ARM_CA5_No_GIC/port.c | 0 .../portable/IAR/ARM_CA5_No_GIC/portASM.h | 0 .../portable/IAR/ARM_CA5_No_GIC/portASM.s | 0 .../portable/IAR/ARM_CA5_No_GIC/portmacro.h | 0 .../portable/IAR/ARM_CA9/port.c | 0 .../portable/IAR/ARM_CA9/portASM.h | 0 .../portable/IAR/ARM_CA9/portASM.s | 0 .../portable/IAR/ARM_CA9/portmacro.h | 0 .../portable/IAR/ARM_CM0/port.c | 0 .../portable/IAR/ARM_CM0/portasm.s | 0 .../portable/IAR/ARM_CM0/portmacro.h | 0 .../portable/IAR/ARM_CM23/non_secure/port.c | 0 .../portable/IAR/ARM_CM23/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM23/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM23/non_secure/portmacro.h | 0 .../IAR/ARM_CM23/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM23/secure/secure_context.c | 0 .../portable/IAR/ARM_CM23/secure/secure_context.h | 0 .../IAR/ARM_CM23/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM23/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM23/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM23/secure/secure_init.c | 0 .../portable/IAR/ARM_CM23/secure/secure_init.h | 0 .../IAR/ARM_CM23/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM23_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM23_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM3/port.c | 0 .../portable/IAR/ARM_CM3/portasm.s | 0 .../portable/IAR/ARM_CM3/portmacro.h | 0 .../portable/IAR/ARM_CM33/non_secure/port.c | 0 .../portable/IAR/ARM_CM33/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM33/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM33/non_secure/portmacro.h | 0 .../IAR/ARM_CM33/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM33/secure/secure_context.c | 0 .../portable/IAR/ARM_CM33/secure/secure_context.h | 0 .../IAR/ARM_CM33/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM33/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM33/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM33/secure/secure_init.c | 0 .../portable/IAR/ARM_CM33/secure/secure_init.h | 0 .../IAR/ARM_CM33/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM33_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM33_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM4F/port.c | 0 .../portable/IAR/ARM_CM4F/portasm.s | 0 .../portable/IAR/ARM_CM4F/portmacro.h | 0 .../portable/IAR/ARM_CM4F_MPU/port.c | 0 .../portable/IAR/ARM_CM4F_MPU/portasm.s | 0 .../portable/IAR/ARM_CM4F_MPU/portmacro.h | 0 .../portable/IAR/ARM_CM55/non_secure/port.c | 0 .../portable/IAR/ARM_CM55/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM55/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM55/non_secure/portmacro.h | 0 .../IAR/ARM_CM55/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM55/secure/secure_context.c | 0 .../portable/IAR/ARM_CM55/secure/secure_context.h | 0 .../IAR/ARM_CM55/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM55/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM55/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM55/secure/secure_init.c | 0 .../portable/IAR/ARM_CM55/secure/secure_init.h | 0 .../IAR/ARM_CM55/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM55_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM55_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM7/ReadMe.txt | 0 .../portable/IAR/ARM_CM7/r0p1/port.c | 0 .../portable/IAR/ARM_CM7/r0p1/portasm.s | 0 .../portable/IAR/ARM_CM7/r0p1/portmacro.h | 0 .../portable/IAR/ARM_CM85/non_secure/port.c | 0 .../portable/IAR/ARM_CM85/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM85/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM85/non_secure/portmacro.h | 0 .../IAR/ARM_CM85/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM85/secure/secure_context.c | 0 .../portable/IAR/ARM_CM85/secure/secure_context.h | 0 .../IAR/ARM_CM85/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM85/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM85/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM85/secure/secure_init.c | 0 .../portable/IAR/ARM_CM85/secure/secure_init.h | 0 .../IAR/ARM_CM85/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM85_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM85_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CRx_No_GIC/port.c | 0 .../portable/IAR/ARM_CRx_No_GIC/portASM.s | 0 .../portable/IAR/ARM_CRx_No_GIC/portmacro.h | 0 .../portable/IAR/ATMega323/port.c | 0 .../portable/IAR/ATMega323/portmacro.h | 0 .../portable/IAR/ATMega323/portmacro.s90 | 0 .../portable/IAR/AVR32_UC3/exception.s82 | 0 .../portable/IAR/AVR32_UC3/port.c | 0 .../portable/IAR/AVR32_UC3/portmacro.h | 0 .../portable/IAR/AVR32_UC3/read.c | 0 .../portable/IAR/AVR32_UC3/write.c | 0 .../portable/IAR/AVR_AVRDx/port.c | 0 .../portable/IAR/AVR_AVRDx/porthardware.h | 0 .../portable/IAR/AVR_AVRDx/portmacro.h | 0 .../portable/IAR/AVR_AVRDx/portmacro.s90 | 0 .../portable/IAR/AVR_Mega0/port.c | 0 .../portable/IAR/AVR_Mega0/porthardware.h | 0 .../portable/IAR/AVR_Mega0/portmacro.h | 0 .../portable/IAR/AVR_Mega0/portmacro.s90 | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7S64.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X128.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X256.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h | 0 .../portable/IAR/AtmelSAM7S64/ISR_Support.h | 0 .../portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h | 0 .../portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h | 0 .../portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h | 0 .../portable/IAR/AtmelSAM7S64/port.c | 0 .../portable/IAR/AtmelSAM7S64/portasm.s79 | 0 .../portable/IAR/AtmelSAM7S64/portmacro.h | 0 .../portable/IAR/AtmelSAM9XE/ISR_Support.h | 0 .../portable/IAR/AtmelSAM9XE/port.c | 0 .../portable/IAR/AtmelSAM9XE/portasm.s79 | 0 .../portable/IAR/AtmelSAM9XE/portmacro.h | 0 .../portable/IAR/LPC2000/ISR_Support.h | 0 .../portable/IAR/LPC2000/port.c | 0 .../portable/IAR/LPC2000/portasm.s79 | 0 .../portable/IAR/LPC2000/portmacro.h | 0 .../portable/IAR/MSP430/port.c | 0 .../portable/IAR/MSP430/portasm.h | 0 .../portable/IAR/MSP430/portext.s43 | 0 .../portable/IAR/MSP430/portmacro.h | 0 .../portable/IAR/MSP430X/data_model.h | 0 .../portable/IAR/MSP430X/port.c | 0 .../portable/IAR/MSP430X/portext.s43 | 0 .../portable/IAR/MSP430X/portmacro.h | 0 .../portable/IAR/RISC-V/Documentation.url | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../IAR/RISC-V/chip_specific_extensions/readme.txt | 0 .../portable/IAR/RISC-V/port.c | 0 .../portable/IAR/RISC-V/portASM.s | 0 .../portable/IAR/RISC-V/portContext.h | 0 .../portable/IAR/RISC-V/portmacro.h | 0 .../portable/IAR/RISC-V/readme.txt | 0 .../portable/IAR/RL78/port.c | 0 .../portable/IAR/RL78/portasm.s | 0 .../portable/IAR/RL78/portmacro.h | 0 .../portable/IAR/RX100/port.c | 0 .../portable/IAR/RX100/port_asm.s | 0 .../portable/IAR/RX100/portmacro.h | 0 .../portable/IAR/RX100/readme.txt | 0 .../portable/IAR/RX600/port.c | 0 .../portable/IAR/RX600/port_asm.s | 0 .../portable/IAR/RX600/portmacro.h | 0 .../portable/IAR/RX600/readme.txt | 0 .../portable/IAR/RX700v3_DPFPU/port.c | 0 .../portable/IAR/RX700v3_DPFPU/portmacro.h | 0 .../portable/IAR/RX700v3_DPFPU/readme.txt | 0 .../portable/IAR/RXv2/port.c | 0 .../portable/IAR/RXv2/port_asm.s | 0 .../portable/IAR/RXv2/portmacro.h | 0 .../portable/IAR/RXv2/readme.txt | 0 .../portable/IAR/STR71x/ISR_Support.h | 0 .../portable/IAR/STR71x/port.c | 0 .../portable/IAR/STR71x/portasm.s79 | 0 .../portable/IAR/STR71x/portmacro.h | 0 .../portable/IAR/STR75x/ISR_Support.h | 0 .../portable/IAR/STR75x/port.c | 0 .../portable/IAR/STR75x/portasm.s79 | 0 .../portable/IAR/STR75x/portmacro.h | 0 .../portable/IAR/STR91x/ISR_Support.h | 0 .../portable/IAR/STR91x/port.c | 0 .../portable/IAR/STR91x/portasm.s79 | 0 .../portable/IAR/STR91x/portmacro.h | 0 .../portable/IAR/V850ES/ISR_Support.h | 0 .../portable/IAR/V850ES/port.c | 0 .../portable/IAR/V850ES/portasm.s85 | 0 .../portable/IAR/V850ES/portasm_Fx3.s85 | 0 .../portable/IAR/V850ES/portasm_Hx2.s85 | 0 .../portable/IAR/V850ES/portmacro.h | 0 .../portable/Keil/See-also-the-RVDS-directory.txt | 0 .../portable/MPLAB/PIC18F/port.c | 0 .../portable/MPLAB/PIC18F/portmacro.h | 0 .../portable/MPLAB/PIC18F/stdio.h | 0 .../portable/MPLAB/PIC24_dsPIC/port.c | 0 .../portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S | 0 .../portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S | 0 .../portable/MPLAB/PIC24_dsPIC/portmacro.h | 0 .../portable/MPLAB/PIC32MEC14xx/ISR_Support.h | 0 .../portable/MPLAB/PIC32MEC14xx/port.c | 0 .../portable/MPLAB/PIC32MEC14xx/port_asm.S | 0 .../portable/MPLAB/PIC32MEC14xx/portmacro.h | 0 .../portable/MPLAB/PIC32MX/ISR_Support.h | 0 .../portable/MPLAB/PIC32MX/port.c | 0 .../portable/MPLAB/PIC32MX/port_asm.S | 0 .../portable/MPLAB/PIC32MX/portmacro.h | 0 .../portable/MPLAB/PIC32MZ/ISR_Support.h | 0 .../portable/MPLAB/PIC32MZ/port.c | 0 .../portable/MPLAB/PIC32MZ/port_asm.S | 0 .../portable/MPLAB/PIC32MZ/portmacro.h | 0 .../portable/MSVC-MingW/port.c | 0 .../portable/MSVC-MingW/portmacro.h | 0 .../portable/MemMang/ReadMe.url | 0 .../portable/MemMang/heap_1.c | 0 .../portable/MemMang/heap_2.c | 0 .../portable/MemMang/heap_3.c | 0 .../portable/MemMang/heap_4.c | 0 .../portable/MemMang/heap_5.c | 0 .../portable/MikroC/ARM_CM4F/port.c | 0 .../portable/MikroC/ARM_CM4F/portmacro.h | 0 .../portable/Paradigm/Tern_EE/large_untested/port.c | 0 .../Paradigm/Tern_EE/large_untested/portasm.h | 0 .../Paradigm/Tern_EE/large_untested/portmacro.h | 0 .../portable/Paradigm/Tern_EE/small/port.c | 0 .../portable/Paradigm/Tern_EE/small/portasm.h | 0 .../portable/Paradigm/Tern_EE/small/portmacro.h | 0 .../portable/RVDS/ARM7_LPC21xx/port.c | 0 .../portable/RVDS/ARM7_LPC21xx/portASM.s | 0 .../portable/RVDS/ARM7_LPC21xx/portmacro.h | 0 .../portable/RVDS/ARM7_LPC21xx/portmacro.inc | 0 .../portable/RVDS/ARM_CA9/port.c | 0 .../portable/RVDS/ARM_CA9/portASM.s | 0 .../portable/RVDS/ARM_CA9/portmacro.h | 0 .../portable/RVDS/ARM_CA9/portmacro.inc | 0 .../portable/RVDS/ARM_CM0/port.c | 0 .../portable/RVDS/ARM_CM0/portmacro.h | 0 .../portable/RVDS/ARM_CM3/port.c | 0 .../portable/RVDS/ARM_CM3/portmacro.h | 0 .../portable/RVDS/ARM_CM4F/port.c | 0 .../portable/RVDS/ARM_CM4F/portmacro.h | 0 .../portable/RVDS/ARM_CM4_MPU/port.c | 0 .../portable/RVDS/ARM_CM4_MPU/portmacro.h | 0 .../portable/RVDS/ARM_CM7/ReadMe.txt | 0 .../portable/RVDS/ARM_CM7/r0p1/port.c | 0 .../portable/RVDS/ARM_CM7/r0p1/portmacro.h | 0 .../portable/Renesas/RX100/port.c | 0 .../portable/Renesas/RX100/port_asm.src | 0 .../portable/Renesas/RX100/portmacro.h | 0 .../portable/Renesas/RX100/readme.txt | 0 .../portable/Renesas/RX200/port.c | 0 .../portable/Renesas/RX200/port_asm.src | 0 .../portable/Renesas/RX200/portmacro.h | 0 .../portable/Renesas/RX200/readme.txt | 0 .../portable/Renesas/RX600/port.c | 0 .../portable/Renesas/RX600/port_asm.src | 0 .../portable/Renesas/RX600/portmacro.h | 0 .../portable/Renesas/RX600/readme.txt | 0 .../portable/Renesas/RX600v2/port.c | 0 .../portable/Renesas/RX600v2/port_asm.src | 0 .../portable/Renesas/RX600v2/portmacro.h | 0 .../portable/Renesas/RX600v2/readme.txt | 0 .../portable/Renesas/RX700v3_DPFPU/port.c | 0 .../portable/Renesas/RX700v3_DPFPU/port_asm.src | 0 .../portable/Renesas/RX700v3_DPFPU/portmacro.h | 0 .../portable/Renesas/RX700v3_DPFPU/readme.txt | 0 .../portable/Renesas/SH2A_FPU/ISR_Support.inc | 0 .../portable/Renesas/SH2A_FPU/port.c | 0 .../portable/Renesas/SH2A_FPU/portasm.src | 0 .../portable/Renesas/SH2A_FPU/portmacro.h | 0 .../portable/Rowley/ARM7/readme.txt | 0 .../portable/Rowley/MSP430F449/port.c | 0 .../portable/Rowley/MSP430F449/portasm.h | 0 .../portable/Rowley/MSP430F449/portext.asm | 0 .../portable/Rowley/MSP430F449/portmacro.h | 0 .../portable/SDCC/Cygnal/port.c | 0 .../portable/SDCC/Cygnal/portmacro.h | 0 .../portable/Softune/MB91460/__STD_LIB_sbrk.c | 0 .../portable/Softune/MB91460/port.c | 0 .../portable/Softune/MB91460/portmacro.h | 0 .../portable/Softune/MB96340/__STD_LIB_sbrk.c | 0 .../portable/Softune/MB96340/port.c | 0 .../portable/Softune/MB96340/portmacro.h | 0 .../portable/Tasking/ARM_CM4F/port.c | 0 .../portable/Tasking/ARM_CM4F/port_asm.asm | 0 .../portable/Tasking/ARM_CM4F/portmacro.h | 0 .../portable/ThirdParty/CDK/T-HEAD_CK802/port.c | 0 .../portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S | 0 .../ThirdParty/CDK/T-HEAD_CK802/portmacro.h | 0 .../.github/CODE_OF_CONDUCT.md | 0 .../.github/CONTRIBUTING.md | 0 .../Community-Supported-Ports/.github/SECURITY.md | 0 .../.github/pull_request_template.md | 0 .../CCS/C2000_C28x/README.md | 0 .../Community-Supported-Ports/CCS/C2000_C28x/port.c | 0 .../CCS/C2000_C28x/portasm.asm | 0 .../CCS/C2000_C28x/portmacro.h | 0 .../GCC/MSP430FR5969/port.c | 0 .../GCC/MSP430FR5969/portmacro.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../GCC/TriCore_38xa/port.c | 0 .../GCC/TriCore_38xa/port.h | 0 .../GCC/TriCore_38xa/portmacro.h | 0 .../GCC/TriCore_38xa/porttrap.c | 0 .../GCC/TriCore_38xa/readme.txt | 0 .../ThirdParty/Community-Supported-Ports/LICENSE | 0 .../ThirdParty/Community-Supported-Ports/README.md | 0 .../Community-Supported-Ports/Z88DK/Z180/port.c | 0 .../Z88DK/Z180/portmacro.h | 0 .../Community-Supported-Ports/Z88DK/Z180/readme.md | 0 .../GCC/ARC_EM_HS/arc_freertos_exceptions.c | 0 .../GCC/ARC_EM_HS/arc_freertos_exceptions.h | 0 .../portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s | 0 .../ThirdParty/GCC/ARC_EM_HS/freertos_tls.c | 0 .../portable/ThirdParty/GCC/ARC_EM_HS/port.c | 0 .../portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h | 0 .../ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c | 0 .../ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h | 0 .../portable/ThirdParty/GCC/ARC_v1/arc_support.s | 0 .../portable/ThirdParty/GCC/ARC_v1/port.c | 0 .../portable/ThirdParty/GCC/ARC_v1/portmacro.h | 0 .../portable/ThirdParty/GCC/ARM_TFM/README.md | 0 .../ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c | 0 .../portable/ThirdParty/GCC/ATmega/port.c | 0 .../portable/ThirdParty/GCC/ATmega/portmacro.h | 0 .../portable/ThirdParty/GCC/ATmega/readme.md | 0 .../GCC/Posix/FreeRTOS-simulator-for-Linux.url | 0 .../portable/ThirdParty/GCC/Posix/port.c | 0 .../portable/ThirdParty/GCC/Posix/portmacro.h | 0 .../ThirdParty/GCC/Posix/utils/wait_for_event.c | 0 .../ThirdParty/GCC/Posix/utils/wait_for_event.h | 0 ...README-for-info-on-official-MIT-license-port.txt | 0 .../portable/ThirdParty/GCC/RP2040/.gitignore | 0 .../portable/ThirdParty/GCC/RP2040/CMakeLists.txt | 0 .../GCC/RP2040/FreeRTOS_Kernel_import.cmake | 0 .../portable/ThirdParty/GCC/RP2040/LICENSE.md | 0 .../portable/ThirdParty/GCC/RP2040/README.md | 0 .../ThirdParty/GCC/RP2040/idle_task_static_memory.c | 0 .../GCC/RP2040/include/freertos_sdk_config.h | 0 .../ThirdParty/GCC/RP2040/include/portmacro.h | 0 .../ThirdParty/GCC/RP2040/include/rp2040_config.h | 0 .../portable/ThirdParty/GCC/RP2040/library.cmake | 0 .../ThirdParty/GCC/RP2040/pico_sdk_import.cmake | 0 .../portable/ThirdParty/GCC/RP2040/port.c | 0 .../ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c | 0 .../GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h | 0 .../GCC/Xtensa_ESP32/include/port_systick.h | 0 .../GCC/Xtensa_ESP32/include/portbenchmark.h | 0 .../ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h | 0 .../GCC/Xtensa_ESP32/include/xt_asm_utils.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_api.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_config.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_context.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_rtos.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_timer.h | 0 .../portable/ThirdParty/GCC/Xtensa_ESP32/port.c | 0 .../ThirdParty/GCC/Xtensa_ESP32/port_common.c | 0 .../ThirdParty/GCC/Xtensa_ESP32/port_systick.c | 0 .../portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S | 0 .../ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h | 0 .../ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h | 0 .../ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S | 0 .../ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c | 0 .../GCC/Xtensa_ESP32/xtensa_loadstore_handler.S | 0 .../GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c | 0 .../GCC/Xtensa_ESP32/xtensa_vector_defaults.S | 0 .../ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S | 0 .../portable/ThirdParty/KnownIssues.md | 0 .../.github/CODE_OF_CONDUCT.md | 0 .../Partner-Supported-Ports/.github/CONTRIBUTING.md | 0 .../Partner-Supported-Ports/.github/SECURITY.md | 0 .../.github/pull_request_template.md | 0 .../Partner-Supported-Ports/GCC/AVR_AVRDx/port.c | 0 .../GCC/AVR_AVRDx/porthardware.h | 0 .../GCC/AVR_AVRDx/portmacro.h | 0 .../Partner-Supported-Ports/GCC/AVR_Mega0/port.c | 0 .../GCC/AVR_Mega0/porthardware.h | 0 .../GCC/AVR_Mega0/portmacro.h | 0 .../ThirdParty/Partner-Supported-Ports/LICENSE | 0 .../ThirdParty/Partner-Supported-Ports/README.md | 0 .../portable/ThirdParty/README.md | 0 .../portable/ThirdParty/XCC/Xtensa/Makefile | 0 .../portable/ThirdParty/XCC/Xtensa/port.c | 0 .../portable/ThirdParty/XCC/Xtensa/portasm.S | 0 .../portable/ThirdParty/XCC/Xtensa/portbenchmark.h | 0 .../portable/ThirdParty/XCC/Xtensa/portclib.c | 0 .../portable/ThirdParty/XCC/Xtensa/portmacro.h | 0 .../portable/ThirdParty/XCC/Xtensa/porttrace.h | 0 .../ThirdParty/XCC/Xtensa/readme_xtensa.txt | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_api.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_config.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_context.S | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_context.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_init.c | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_intr.c | 0 .../ThirdParty/XCC/Xtensa/xtensa_intr_asm.S | 0 .../ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_timer.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S | 0 .../portable/WizC/PIC18/Drivers/Tick/Tick.c | 0 .../portable/WizC/PIC18/Drivers/Tick/isrTick.c | 0 .../portable/WizC/PIC18/Install.bat | 0 .../portable/WizC/PIC18/addFreeRTOS.h | 0 .../portable/WizC/PIC18/port.c | 0 .../portable/WizC/PIC18/portmacro.h | 0 .../portable/oWatcom/16BitDOS/Flsh186/port.c | 0 .../portable/oWatcom/16BitDOS/Flsh186/portmacro.h | 0 .../portable/oWatcom/16BitDOS/PC/port.c | 0 .../portable/oWatcom/16BitDOS/PC/portmacro.h | 0 .../portable/oWatcom/16BitDOS/common/portasm.h | 0 .../portable/oWatcom/16BitDOS/common/portcomn.c | 0 .../portable/readme.txt | 0 .../queue.c | 0 .../sbom.spdx | 0 .../stream_buffer.c | 0 .../tasks.c | 0 .../timers.c | 0 .../tutorial01-stm32-pio-01-02_files_olivia/readme | 1 - 1009 files changed, 1 deletion(-) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.gitignore (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.lock (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.log4j.xml (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.resources/0.snap (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/.metadata/version.ini (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia => pio-01-02_files_olivia}/README.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/.cproject (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/.gitmodules (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/.mxproject (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/.project (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/.settings/language.settings.xml (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/.settings/stm32cubeide.project.prefs (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/CMakeLists.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Inc/FreeRTOSConfig.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Inc/app.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Inc/main.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Inc/stm32f4xx_hal_conf.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Inc/stm32f4xx_it.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Src/app.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Src/freertos.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Src/main.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Src/stm32f4xx_hal_msp.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Src/stm32f4xx_it.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Src/syscalls.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Src/sysmem.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Src/system_stm32f4xx.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Core/Startup/startup_stm32f446retx.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/app.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/app.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/app.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/freertos.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/freertos.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/freertos.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/main.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/main.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/main.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/stm32f4xx_hal_msp.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/stm32f4xx_hal_msp.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/stm32f4xx_hal_msp.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/stm32f4xx_it.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/stm32f4xx_it.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/stm32f4xx_it.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/subdir.mk (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/syscalls.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/syscalls.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/syscalls.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/sysmem.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/sysmem.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/sysmem.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/system_stm32f4xx.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/system_stm32f4xx.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Src/system_stm32f4xx.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Startup/startup_stm32f446retx.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Startup/startup_stm32f446retx.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Core/Startup/subdir.mk (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/FreeRTOS_LED.elf (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/FreeRTOS_LED.list (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/FreeRTOS_LED.map (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/makefile (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/objects.list (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/objects.mk (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Debug/sources.mk (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/cmsis_armcc.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/cmsis_armclang.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/cmsis_compiler.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/cmsis_gcc.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/cmsis_iccarm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/cmsis_version.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_armv8mbl.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_armv8mml.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_cm0.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_cm0plus.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_cm1.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_cm23.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_cm3.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_cm33.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_cm4.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_cm7.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_sc000.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/core_sc300.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/mpu_armv7.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/mpu_armv8.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/Include/tz_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/CMSIS/LICENSE.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/FreeRTOS_LED.ioc (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/FreeRTOS_LED.launch (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/LICENSE (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/croutine.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/list.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/task.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/list.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/queue.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/tasks.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/Middlewares/Third_Party/FreeRTOS/Source/timers.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/STM32F446RETX_FLASH.ld (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/STM32F446RETX_RAM.ld (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/croutine.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/event_groups.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/FreeRTOS.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/StackMacros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/atomic.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/croutine.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/deprecated_definitions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/event_groups.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/list.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/message_buffer.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/mpu_prototypes.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/mpu_wrappers.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/portable.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/projdefs.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/queue.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/semphr.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/stack_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/stdint.readme (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/stream_buffer.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/task.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/include/timers.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/list.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/manifest.yml (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMClang/Use-the-GCC-ports.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/copy_files.py (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/context/secure_context.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/context/secure_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/heap/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/heap/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/init/secure_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/init/secure_init.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ARMv8M/secure/macros/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/BCC/16BitDOS/Flsh186/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/BCC/16BitDOS/Flsh186/prtmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/BCC/16BitDOS/PC/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/BCC/16BitDOS/PC/prtmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/BCC/16BitDOS/common/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/BCC/16BitDOS/common/portcomn.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/ARM_CM3/portasm.asm (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/ARM_CM4F/portasm.asm (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/ARM_Cortex-R4/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/ARM_Cortex-R4/portASM.asm (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/ARM_Cortex-R4/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/MSP430X/data_model.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/MSP430X/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/MSP430X/portext.asm (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CCS/MSP430X/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CMakeLists.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CodeWarrior/ColdFire_V1/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CodeWarrior/ColdFire_V1/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CodeWarrior/ColdFire_V1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CodeWarrior/ColdFire_V2/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CodeWarrior/ColdFire_V2/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CodeWarrior/ColdFire_V2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CodeWarrior/HCS12/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/CodeWarrior/HCS12/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Common/mpu_wrappers.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91FR40008/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91FR40008/portISR.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91FR40008/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91SAM7S/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91SAM7S/portISR.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_AT91SAM7S/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_LPC2000/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_LPC2000/portISR.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_LPC2000/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_LPC23xx/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_LPC23xx/portISR.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM7_LPC23xx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CA53_64_BIT/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CA53_64_BIT/portASM.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CA53_64_BIT/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CA53_64_BIT_SRE/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CA9/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CA9/portASM.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CA9/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM0/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM3_MPU/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM3_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM4_MPU/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM4_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM7/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM7/r0p1/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM7/r0p1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CR5/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CR5/portASM.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CR5/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CRx_No_GIC/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CRx_No_GIC/portASM.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ARM_CRx_No_GIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ATMega323/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ATMega323/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/AVR32_UC3/exception.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/AVR32_UC3/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/AVR32_UC3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/AVR_AVRDx/README.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/AVR_Mega0/README.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/CORTUS_APS3/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/CORTUS_APS3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ColdFire_V2/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ColdFire_V2/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/ColdFire_V2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/H8S2329/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/H8S2329/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/HCS12/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/HCS12/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/IA32_flat/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/IA32_flat/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/IA32_flat/portASM.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/IA32_flat/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MCF5235/readme.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MSP430F449/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MSP430F449/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlaze/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlaze/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlaze/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlazeV8/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlazeV8/port_exceptions.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlazeV8/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlazeV8/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlazeV9/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlazeV9/port_exceptions.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlazeV9/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/MicroBlazeV9/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/NiosII/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/NiosII/port_asm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/NiosII/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/PPC405_Xilinx/FPU_Macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/PPC405_Xilinx/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/PPC405_Xilinx/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/PPC405_Xilinx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/PPC440_Xilinx/FPU_Macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/PPC440_Xilinx/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/PPC440_Xilinx/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/PPC440_Xilinx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/Documentation.url (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/chip_specific_extensions/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/portASM.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/portContext.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RISC-V/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RL78/isr_support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RL78/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RL78/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RL78/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX100/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX100/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX100/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX200/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX200/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX600/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX600/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX600/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX600v2/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX600v2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX600v2/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX700v3_DPFPU/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX700v3_DPFPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/RX700v3_DPFPU/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/STR75x/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/STR75x/portISR.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/STR75x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/TriCore_1782/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/TriCore_1782/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/GCC/TriCore_1782/porttrap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/78K0R/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/78K0R/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/78K0R/portasm.s26 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/78K0R/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CA5_No_GIC/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CA5_No_GIC/portASM.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CA5_No_GIC/portASM.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CA5_No_GIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CA9/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CA9/portASM.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CA9/portASM.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CA9/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM0/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM0/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM3/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM4F/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM4F_MPU/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM4F_MPU/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM4F_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM7/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM7/r0p1/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM7/r0p1/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM7/r0p1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CRx_No_GIC/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CRx_No_GIC/portASM.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ARM_CRx_No_GIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ATMega323/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ATMega323/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/ATMega323/portmacro.s90 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR32_UC3/exception.s82 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR32_UC3/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR32_UC3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR32_UC3/read.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR32_UC3/write.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR_AVRDx/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR_AVRDx/porthardware.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR_AVRDx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR_AVRDx/portmacro.s90 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR_Mega0/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR_Mega0/porthardware.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR_Mega0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AVR_Mega0/portmacro.s90 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM7S64/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM9XE/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM9XE/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM9XE/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/AtmelSAM9XE/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/LPC2000/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/LPC2000/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/LPC2000/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/LPC2000/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/MSP430/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/MSP430/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/MSP430/portext.s43 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/MSP430/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/MSP430X/data_model.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/MSP430X/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/MSP430X/portext.s43 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/MSP430X/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RISC-V/Documentation.url (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RISC-V/chip_specific_extensions/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RISC-V/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RISC-V/portASM.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RISC-V/portContext.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RISC-V/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RISC-V/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RL78/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RL78/portasm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RL78/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX100/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX100/port_asm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX100/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX100/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX600/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX600/port_asm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX600/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX600/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX700v3_DPFPU/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX700v3_DPFPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RX700v3_DPFPU/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RXv2/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RXv2/port_asm.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RXv2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/RXv2/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR71x/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR71x/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR71x/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR71x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR75x/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR75x/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR75x/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR75x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR91x/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR91x/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR91x/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/STR91x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/V850ES/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/V850ES/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/V850ES/portasm.s85 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/V850ES/portasm_Fx3.s85 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/V850ES/portasm_Hx2.s85 (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/IAR/V850ES/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Keil/See-also-the-RVDS-directory.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC18F/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC18F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC18F/stdio.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC24_dsPIC/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC24_dsPIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MEC14xx/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MEC14xx/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MEC14xx/port_asm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MEC14xx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MX/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MX/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MX/port_asm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MX/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MZ/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MZ/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MZ/port_asm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MPLAB/PIC32MZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MSVC-MingW/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MSVC-MingW/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MemMang/ReadMe.url (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MemMang/heap_1.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MemMang/heap_2.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MemMang/heap_3.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MemMang/heap_4.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MemMang/heap_5.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MikroC/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/MikroC/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Paradigm/Tern_EE/large_untested/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Paradigm/Tern_EE/large_untested/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Paradigm/Tern_EE/large_untested/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Paradigm/Tern_EE/small/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Paradigm/Tern_EE/small/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Paradigm/Tern_EE/small/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM7_LPC21xx/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM7_LPC21xx/portASM.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM7_LPC21xx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM7_LPC21xx/portmacro.inc (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CA9/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CA9/portASM.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CA9/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CA9/portmacro.inc (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM0/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM4_MPU/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM4_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM7/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM7/r0p1/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/RVDS/ARM_CM7/r0p1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX100/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX100/port_asm.src (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX100/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX100/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX200/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX200/port_asm.src (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX200/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX200/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX600/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX600/port_asm.src (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX600/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX600/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX600v2/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX600v2/port_asm.src (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX600v2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX600v2/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX700v3_DPFPU/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX700v3_DPFPU/port_asm.src (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX700v3_DPFPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/RX700v3_DPFPU/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/SH2A_FPU/ISR_Support.inc (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/SH2A_FPU/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/SH2A_FPU/portasm.src (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Renesas/SH2A_FPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Rowley/ARM7/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Rowley/MSP430F449/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Rowley/MSP430F449/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Rowley/MSP430F449/portext.asm (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Rowley/MSP430F449/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/SDCC/Cygnal/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/SDCC/Cygnal/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Softune/MB91460/__STD_LIB_sbrk.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Softune/MB91460/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Softune/MB91460/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Softune/MB96340/__STD_LIB_sbrk.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Softune/MB96340/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Softune/MB96340/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Tasking/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Tasking/ARM_CM4F/port_asm.asm (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/Tasking/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/CDK/T-HEAD_CK802/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/LICENSE (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/README.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_EM_HS/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_v1/arc_support.s (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_v1/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARC_v1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARM_TFM/README.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ATmega/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ATmega/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/ATmega/readme.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Posix/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Posix/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/.gitignore (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/CMakeLists.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/LICENSE.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/README.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/include/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/library.cmake (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/RP2040/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/KnownIssues.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/LICENSE (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/Partner-Supported-Ports/README.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/README.md (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/Makefile (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/portasm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/portbenchmark.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/portclib.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/porttrace.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_api.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_config.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_context.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_context.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_init.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/WizC/PIC18/Drivers/Tick/Tick.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/WizC/PIC18/Drivers/Tick/isrTick.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/WizC/PIC18/Install.bat (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/WizC/PIC18/addFreeRTOS.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/WizC/PIC18/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/WizC/PIC18/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/oWatcom/16BitDOS/Flsh186/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/oWatcom/16BitDOS/Flsh186/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/oWatcom/16BitDOS/PC/port.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/oWatcom/16BitDOS/PC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/oWatcom/16BitDOS/common/portasm.h (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/oWatcom/16BitDOS/common/portcomn.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/portable/readme.txt (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/queue.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/sbom.spdx (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/stream_buffer.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/tasks.c (100%) rename tutorial01-stm32-pio-01/{tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED => pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia}/timers.c (100%) delete mode 100644 tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_files_olivia/readme diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.gitignore b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.gitignore similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.gitignore rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.gitignore diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.lock b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.lock similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.lock rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.lock diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.log4j.xml b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.log4j.xml similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.log4j.xml rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.log4j.xml diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/version.ini b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/version.ini similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/.metadata/version.ini rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/version.ini diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/README.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/README.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/README.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.cproject b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.cproject similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.cproject rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.cproject diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.gitmodules b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.gitmodules similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.gitmodules rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.gitmodules diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.mxproject b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.mxproject similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.mxproject rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.mxproject diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.project b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.project similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.project rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.project diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/language.settings.xml b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/language.settings.xml similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/language.settings.xml rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/language.settings.xml diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/stm32cubeide.project.prefs b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/stm32cubeide.project.prefs similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/.settings/stm32cubeide.project.prefs rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/stm32cubeide.project.prefs diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/CMakeLists.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/CMakeLists.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/CMakeLists.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/CMakeLists.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/FreeRTOSConfig.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/FreeRTOSConfig.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/FreeRTOSConfig.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/FreeRTOSConfig.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/app.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/app.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/app.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/app.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/main.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/main.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/main.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/main.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_hal_conf.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_hal_conf.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_hal_conf.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_hal_conf.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_it.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Inc/stm32f4xx_it.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_it.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/app.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/app.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/app.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/app.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/freertos.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/freertos.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/freertos.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/freertos.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/main.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/main.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/main.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_hal_msp.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_hal_msp.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_hal_msp.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_hal_msp.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_it.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/stm32f4xx_it.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_it.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/syscalls.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/syscalls.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/syscalls.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/syscalls.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/sysmem.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/sysmem.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/sysmem.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/sysmem.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/system_stm32f4xx.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/system_stm32f4xx.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Src/system_stm32f4xx.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/system_stm32f4xx.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Startup/startup_stm32f446retx.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Startup/startup_stm32f446retx.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Core/Startup/startup_stm32f446retx.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Startup/startup_stm32f446retx.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/app.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/freertos.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/main.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_hal_msp.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/stm32f4xx_it.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/subdir.mk diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/syscalls.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/sysmem.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Src/system_stm32f4xx.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/startup_stm32f446retx.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Core/Startup/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/subdir.mk diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.elf b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.elf similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.elf rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.elf diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.list b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.list similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.list rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.list diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.map similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.map rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.map diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/makefile b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/makefile similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/makefile rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/makefile diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.list similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.list rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.list diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.mk b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.mk similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/objects.mk rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.mk diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/sources.mk b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/sources.mk similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/sources.mk rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/sources.mk diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_armcc.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armcc.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_armcc.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armcc.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_armclang.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armclang.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_armclang.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armclang.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_compiler.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_compiler.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_compiler.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_compiler.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_gcc.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_gcc.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_gcc.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_gcc.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_iccarm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_iccarm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_version.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_version.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/cmsis_version.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_version.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mbl.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mbl.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mbl.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mbl.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mml.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mml.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_armv8mml.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mml.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0plus.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0plus.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm0plus.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0plus.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm1.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm1.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm1.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm1.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm23.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm23.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm23.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm23.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm3.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm3.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm3.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm3.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm33.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm33.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm33.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm33.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm4.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm4.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm4.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm4.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm7.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm7.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_cm7.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm7.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc000.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc000.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc000.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc000.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc300.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc300.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/core_sc300.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc300.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv7.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv7.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv7.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv7.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv8.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv8.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/mpu_armv8.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv8.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/tz_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/tz_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/Include/tz_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/tz_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/LICENSE.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/LICENSE.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/CMSIS/LICENSE.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/LICENSE.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.ioc b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.ioc similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.ioc rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.ioc diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.launch b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.launch similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/FreeRTOS_LED.launch rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.launch diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/LICENSE b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/LICENSE rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/croutine.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/croutine.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/list.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/list.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/task.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/task.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/list.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/list.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/queue.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/queue.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/tasks.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/tasks.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/timers.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Middlewares/Third_Party/FreeRTOS/Source/timers.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_FLASH.ld b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_FLASH.ld similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_FLASH.ld rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_FLASH.ld diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_RAM.ld b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_RAM.ld similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/STM32F446RETX_RAM.ld rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_RAM.ld diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/croutine.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/croutine.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/croutine.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/croutine.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/event_groups.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/event_groups.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/event_groups.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/event_groups.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/FreeRTOS.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/FreeRTOS.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/FreeRTOS.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/FreeRTOS.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/StackMacros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/StackMacros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/StackMacros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/StackMacros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/atomic.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/atomic.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/atomic.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/atomic.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/croutine.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/croutine.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/croutine.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/croutine.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/deprecated_definitions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/deprecated_definitions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/deprecated_definitions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/deprecated_definitions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/event_groups.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/event_groups.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/event_groups.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/event_groups.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/list.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/list.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/list.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/list.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/message_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/message_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/message_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/message_buffer.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_prototypes.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_prototypes.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_prototypes.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_prototypes.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_wrappers.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_wrappers.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/mpu_wrappers.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_wrappers.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/portable.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/portable.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/portable.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/portable.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/projdefs.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/projdefs.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/projdefs.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/projdefs.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/queue.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/queue.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/queue.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/queue.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/semphr.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/semphr.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/semphr.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/semphr.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stack_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stack_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stack_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stack_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stdint.readme b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stdint.readme similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stdint.readme rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stdint.readme diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stream_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stream_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/stream_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stream_buffer.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/task.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/task.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/task.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/task.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/timers.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/timers.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/include/timers.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/timers.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/list.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/list.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/list.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/list.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/manifest.yml b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/manifest.yml similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/manifest.yml rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/manifest.yml diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMClang/Use-the-GCC-ports.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMClang/Use-the-GCC-ports.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMClang/Use-the-GCC-ports.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMClang/Use-the-GCC-ports.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/copy_files.py b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/copy_files.py similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/copy_files.py rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/copy_files.py diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/context/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/heap/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/init/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/macros/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ARMv8M/secure/macros/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/prtmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/Flsh186/prtmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/prtmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/prtmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/PC/prtmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/prtmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portcomn.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portcomn.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/BCC/16BitDOS/common/portcomn.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portcomn.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portasm.asm b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portasm.asm similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portasm.asm rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portasm.asm diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portasm.asm b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portasm.asm similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portasm.asm rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portasm.asm diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portASM.asm b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portASM.asm rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/ARM_Cortex-R4/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/data_model.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/data_model.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/data_model.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/data_model.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portext.asm b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portext.asm similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portext.asm rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portext.asm diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CCS/MSP430X/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CMakeLists.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CMakeLists.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CMakeLists.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CMakeLists.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/ColdFire_V2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/CodeWarrior/HCS12/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Common/mpu_wrappers.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Common/mpu_wrappers.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Common/mpu_wrappers.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Common/mpu_wrappers.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91FR40008/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_AT91SAM7S/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portISR.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC2000/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portISR.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM7_LPC23xx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portASM.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CA9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM3_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM4_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM7/r0p1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portASM.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CR5/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ARM_CRx_No_GIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ATMega323/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/exception.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/exception.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/exception.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/exception.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR32_UC3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_AVRDx/README.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_AVRDx/README.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_AVRDx/README.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_AVRDx/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_Mega0/README.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_Mega0/README.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/AVR_Mega0/README.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_Mega0/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/CORTUS_APS3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/ColdFire_V2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/H8S2329/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/HCS12/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portASM.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/IA32_flat/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MCF5235/readme.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MCF5235/readme.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MCF5235/readme.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MCF5235/readme.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MSP430F449/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlaze/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/port_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV8/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/port_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/MicroBlazeV9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port_asm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/NiosII/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/FPU_Macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/FPU_Macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC405_Xilinx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/FPU_Macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/FPU_Macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/PPC440_Xilinx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/Documentation.url b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/Documentation.url similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/Documentation.url rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/Documentation.url diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/chip_specific_extensions/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portASM.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portContext.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portContext.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portContext.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portContext.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RISC-V/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/isr_support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/isr_support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/isr_support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/isr_support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RL78/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX100/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX200/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX600v2/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/RX700v3_DPFPU/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portISR.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/STR75x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/porttrap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/porttrap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/GCC/TriCore_1782/porttrap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/porttrap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portasm.s26 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portasm.s26 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portasm.s26 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portasm.s26 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/78K0R/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA5_No_GIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CA9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM4F_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM7/r0p1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ARM_CRx_No_GIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.s90 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.s90 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/ATMega323/portmacro.s90 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.s90 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/exception.s82 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/exception.s82 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/exception.s82 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/exception.s82 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/read.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/read.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/read.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/read.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/write.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/write.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR32_UC3/write.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/write.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/porthardware.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.s90 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_AVRDx/portmacro.s90 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/porthardware.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.s90 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.s90 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AVR_Mega0/portmacro.s90 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.s90 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM7S64/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/AtmelSAM9XE/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portasm.s79 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/LPC2000/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portext.s43 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portext.s43 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portext.s43 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portext.s43 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/data_model.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/data_model.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/data_model.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/data_model.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portext.s43 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portext.s43 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portext.s43 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portext.s43 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/MSP430X/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/Documentation.url b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/Documentation.url similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/Documentation.url rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/Documentation.url diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/chip_specific_extensions/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portASM.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portContext.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portContext.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portContext.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portContext.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RISC-V/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portasm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RL78/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port_asm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX100/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port_asm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX600/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RX700v3_DPFPU/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port_asm.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/RXv2/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portasm.s79 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR71x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portasm.s79 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR75x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portasm.s79 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/STR91x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm.s85 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm.s85 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm.s85 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm.s85 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Fx3.s85 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Fx3.s85 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Fx3.s85 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Fx3.s85 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Hx2.s85 b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Hx2.s85 similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portasm_Hx2.s85 rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Hx2.s85 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/IAR/V850ES/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Keil/See-also-the-RVDS-directory.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Keil/See-also-the-RVDS-directory.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Keil/See-also-the-RVDS-directory.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Keil/See-also-the-RVDS-directory.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/stdio.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/stdio.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC18F/stdio.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/stdio.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC24_dsPIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MEC14xx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port_asm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MX/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port_asm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MPLAB/PIC32MZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MSVC-MingW/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/ReadMe.url b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/ReadMe.url similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/ReadMe.url rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/ReadMe.url diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_1.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_1.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_1.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_1.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_2.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_2.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_2.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_2.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_3.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_3.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_3.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_3.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_4.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_4.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_4.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_4.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_5.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_5.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MemMang/heap_5.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_5.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/MikroC/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/large_untested/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Paradigm/Tern_EE/small/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.inc b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM7_LPC21xx/portmacro.inc rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portASM.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.inc b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.inc similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CA9/portmacro.inc rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.inc diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM4_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/RVDS/ARM_CM7/r0p1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port_asm.src diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX100/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port_asm.src diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX200/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port_asm.src diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port_asm.src diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX600v2/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/RX700v3_DPFPU/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/ISR_Support.inc b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/ISR_Support.inc rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portasm.src b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portasm.src similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portasm.src rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portasm.src diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Renesas/SH2A_FPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/ARM7/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/ARM7/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/ARM7/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/ARM7/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portext.asm b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portext.asm similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portext.asm rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portext.asm diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Rowley/MSP430F449/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/SDCC/Cygnal/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/__STD_LIB_sbrk.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/__STD_LIB_sbrk.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB91460/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/__STD_LIB_sbrk.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/__STD_LIB_sbrk.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Softune/MB96340/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port_asm.asm b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port_asm.asm similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/port_asm.asm rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port_asm.asm diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/Tasking/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/LICENSE b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/LICENSE rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/README.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/README.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/README.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_support.s b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/arc_support.s rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARC_v1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/README.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/README.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/readme.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/readme.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/ATmega/readme.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/readme.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/.gitignore b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/.gitignore similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/.gitignore rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/.gitignore diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/CMakeLists.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/CMakeLists.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/LICENSE.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/LICENSE.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/README.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/README.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/README.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/library.cmake b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/library.cmake similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/library.cmake rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/library.cmake diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/RP2040/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/KnownIssues.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/KnownIssues.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/KnownIssues.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/KnownIssues.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/LICENSE b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/LICENSE rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/README.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/Partner-Supported-Ports/README.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/README.md b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/README.md similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/README.md rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/README.md diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/Makefile b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/Makefile similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/Makefile rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/Makefile diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portbenchmark.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portbenchmark.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portclib.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portclib.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/porttrace.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/porttrace.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_api.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_api.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_config.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_config.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_context.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_init.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_init.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/Tick.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/Tick.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/isrTick.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Drivers/Tick/isrTick.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Install.bat b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Install.bat similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/Install.bat rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Install.bat diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/addFreeRTOS.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/addFreeRTOS.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/addFreeRTOS.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/addFreeRTOS.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/WizC/PIC18/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/Flsh186/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/port.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/port.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/PC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portasm.h diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portcomn.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portcomn.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/oWatcom/16BitDOS/common/portcomn.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portcomn.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/portable/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/readme.txt diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/queue.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/queue.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/queue.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/queue.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/sbom.spdx b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/sbom.spdx similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/sbom.spdx rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/sbom.spdx diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/stream_buffer.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/stream_buffer.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/stream_buffer.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/stream_buffer.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/tasks.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/tasks.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/tasks.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/tasks.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/timers.c b/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/timers.c similarity index 100% rename from tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/timers.c rename to tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/timers.c diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_files_olivia/readme b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_files_olivia/readme deleted file mode 100644 index 892e0d5..0000000 --- a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_files_olivia/readme +++ /dev/null @@ -1 +0,0 @@ -# hihi From 011d1d158da02eb207c6c1ebd494aafbecbebed8 Mon Sep 17 00:00:00 2001 From: Olivia Linden Date: Sun, 19 Mar 2023 18:33:46 +0100 Subject: [PATCH 6/7] modified name --- .../.gitignore | 0 .../.metadata/.lock | 0 .../.metadata/.log4j.xml | 0 .../2.1.500.202211100823 | 0 .../FreeRTOS_LED.1679135758468.pdom | Bin .../FreeRTOS_LED.language.settings.xml | 0 .../.plugins/org.eclipse.cdt.make.core/specs.c | 0 .../.plugins/org.eclipse.cdt.make.core/specs.cpp | 0 .../org.eclipse.cdt.managedbuilder.core/spec.c | 0 .../org.eclipse.cdt.managedbuilder.core/spec.cpp | 0 .../.history/39/30e46b3185c5001d13d6fe58f0709e0f | 0 .../.history/3e/e05e38db7ac5001d13d6fe58f0709e0f | 0 .../.history/48/c0c0109d80c5001d13d6fe58f0709e0f | 0 .../.history/52/80848b7d7ec5001d13d6fe58f0709e0f | 0 .../.history/52/a059856480c5001d13d6fe58f0709e0f | 0 .../.history/57/00b38daf78c5001d13d6fe58f0709e0f | 0 .../.history/5c/e082ac857ec5001d13d6fe58f0709e0f | 0 .../.history/73/9026441f7cc5001d13d6fe58f0709e0f | 0 .../.history/8f/709053d17ac5001d13d6fe58f0709e0f | 0 .../.history/9/a06a581285c5001d13d6fe58f0709e0f | 0 .../.history/a1/90e171dc80c5001d13d6fe58f0709e0f | 0 .../.history/a5/70e720af78c5001d13d6fe58f0709e0f | 0 .../.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f | 0 .../.history/bd/a0bac3217ec5001d13d6fe58f0709e0f | 0 .../.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f | 0 .../.history/ff/b0366ba17fc5001d13d6fe58f0709e0f | 0 .../.indexes/1/ce/ce/c5/ae/properties.index | Bin .../FreeRTOS_LED/.indexes/af/history.index | Bin .../FreeRTOS_LED/.indexes/bf/c4/properties.index | Bin .../FreeRTOS_LED/.indexes/d5/7a/c4/properties.index | Bin .../FreeRTOS_LED/.indexes/properties.index | Bin .../.projects/FreeRTOS_LED/.location | Bin .../.projects/FreeRTOS_LED/.markers.snap | Bin .../.projects/FreeRTOS_LED/.syncinfo.snap | Bin .../.root/.indexes/properties.index | Bin .../org.eclipse.core.resources/.root/.markers.snap | Bin .../.safetable/org.eclipse.core.resources | Bin .../.plugins/org.eclipse.core.resources/0.snap | Bin .../com.st.stm32cube.ide.mcu.ide.oss.prefs | 0 .../org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs | 0 .../.settings/org.eclipse.cdt.debug.core.prefs | 0 .../org.eclipse.cdt.managedbuilder.core.prefs | 0 .../.settings/org.eclipse.core.resources.prefs | 0 .../.settings/org.eclipse.debug.core.prefs | 0 .../.settings/org.eclipse.debug.ui.prefs | 0 .../.settings/org.eclipse.launchbar.core.prefs | 0 .../.settings/org.eclipse.ui.navigator.prefs | 0 .../.settings/org.eclipse.ui.prefs | 0 .../.settings/org.eclipse.ui.workbench.prefs | 0 .../.settings/org.eclipse.urischeme.prefs | 0 .../launchConfigurationHistory.xml | 0 .../.plugins/org.eclipse.e4.workbench/workbench.xmi | 0 .../.plugins/org.eclipse.ui.ide/dialog_settings.xml | 0 .../org.eclipse.ui.workbench/workingsets.xml | 0 .../.metadata/version.ini | 0 .../README.md | 0 .../.cproject | 0 .../.gitmodules | 0 .../.mxproject | 0 .../.project | 0 .../.settings/language.settings.xml | 0 .../.settings/stm32cubeide.project.prefs | 0 .../CMakeLists.txt | 0 .../Core/Inc/FreeRTOSConfig.h | 0 .../Core/Inc/app.h | 0 .../Core/Inc/main.h | 0 .../Core/Inc/stm32f4xx_hal_conf.h | 0 .../Core/Inc/stm32f4xx_it.h | 0 .../Core/Src/app.c | 0 .../Core/Src/freertos.c | 0 .../Core/Src/main.c | 0 .../Core/Src/stm32f4xx_hal_msp.c | 0 .../Core/Src/stm32f4xx_it.c | 0 .../Core/Src/syscalls.c | 0 .../Core/Src/sysmem.c | 0 .../Core/Src/system_stm32f4xx.c | 0 .../Core/Startup/startup_stm32f446retx.s | 0 .../Debug/Core/Src/app.d | 0 .../Debug/Core/Src/app.o | Bin .../Debug/Core/Src/app.su | 0 .../Debug/Core/Src/freertos.d | 0 .../Debug/Core/Src/freertos.o | Bin .../Debug/Core/Src/freertos.su | 0 .../Debug/Core/Src/main.d | 0 .../Debug/Core/Src/main.o | Bin .../Debug/Core/Src/main.su | 0 .../Debug/Core/Src/stm32f4xx_hal_msp.d | 0 .../Debug/Core/Src/stm32f4xx_hal_msp.o | Bin .../Debug/Core/Src/stm32f4xx_hal_msp.su | 0 .../Debug/Core/Src/stm32f4xx_it.d | 0 .../Debug/Core/Src/stm32f4xx_it.o | Bin .../Debug/Core/Src/stm32f4xx_it.su | 0 .../Debug/Core/Src/subdir.mk | 0 .../Debug/Core/Src/syscalls.d | 0 .../Debug/Core/Src/syscalls.o | Bin .../Debug/Core/Src/syscalls.su | 0 .../Debug/Core/Src/sysmem.d | 0 .../Debug/Core/Src/sysmem.o | Bin .../Debug/Core/Src/sysmem.su | 0 .../Debug/Core/Src/system_stm32f4xx.d | 0 .../Debug/Core/Src/system_stm32f4xx.o | Bin .../Debug/Core/Src/system_stm32f4xx.su | 0 .../Debug/Core/Startup/startup_stm32f446retx.d | 0 .../Debug/Core/Startup/startup_stm32f446retx.o | Bin .../Debug/Core/Startup/subdir.mk | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o | Bin .../Src/stm32f4xx_hal_cortex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o | Bin .../Src/stm32f4xx_hal_dma_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su | 0 .../Src/stm32f4xx_hal_flash_ex.d | 0 .../Src/stm32f4xx_hal_flash_ex.o | Bin .../Src/stm32f4xx_hal_flash_ex.su | 0 .../Src/stm32f4xx_hal_flash_ramfunc.d | 0 .../Src/stm32f4xx_hal_flash_ramfunc.o | Bin .../Src/stm32f4xx_hal_flash_ramfunc.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o | Bin .../Src/stm32f4xx_hal_pwr_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o | Bin .../Src/stm32f4xx_hal_rcc_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o | Bin .../Src/stm32f4xx_hal_tim_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su | 0 .../Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk | 0 .../Debug/FreeRTOS_LED.elf | Bin .../Debug/FreeRTOS_LED.list | 0 .../Debug/FreeRTOS_LED.map | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o | Bin .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su | 0 .../FreeRTOS/Source/CMSIS_RTOS/subdir.mk | 0 .../Third_Party/FreeRTOS/Source/croutine.d | 0 .../Third_Party/FreeRTOS/Source/croutine.o | Bin .../Third_Party/FreeRTOS/Source/croutine.su | 0 .../Third_Party/FreeRTOS/Source/event_groups.d | 0 .../Third_Party/FreeRTOS/Source/event_groups.o | Bin .../Third_Party/FreeRTOS/Source/event_groups.su | 0 .../Middlewares/Third_Party/FreeRTOS/Source/list.d | 0 .../Middlewares/Third_Party/FreeRTOS/Source/list.o | Bin .../Middlewares/Third_Party/FreeRTOS/Source/list.su | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o | Bin .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk | 0 .../FreeRTOS/Source/portable/MemMang/heap_4.d | 0 .../FreeRTOS/Source/portable/MemMang/heap_4.o | Bin .../FreeRTOS/Source/portable/MemMang/heap_4.su | 0 .../FreeRTOS/Source/portable/MemMang/subdir.mk | 0 .../Middlewares/Third_Party/FreeRTOS/Source/queue.d | 0 .../Middlewares/Third_Party/FreeRTOS/Source/queue.o | Bin .../Third_Party/FreeRTOS/Source/queue.su | 0 .../Third_Party/FreeRTOS/Source/stream_buffer.d | 0 .../Third_Party/FreeRTOS/Source/stream_buffer.o | Bin .../Third_Party/FreeRTOS/Source/stream_buffer.su | 0 .../Third_Party/FreeRTOS/Source/subdir.mk | 0 .../Middlewares/Third_Party/FreeRTOS/Source/tasks.d | 0 .../Middlewares/Third_Party/FreeRTOS/Source/tasks.o | Bin .../Third_Party/FreeRTOS/Source/tasks.su | 0 .../Third_Party/FreeRTOS/Source/timers.d | 0 .../Third_Party/FreeRTOS/Source/timers.o | Bin .../Third_Party/FreeRTOS/Source/timers.su | 0 .../Debug/makefile | 0 .../Debug/objects.list | 0 .../Debug/objects.mk | 0 .../Debug/sources.mk | 0 .../CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h | 0 .../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h | 0 .../Device/ST/STM32F4xx/Include/system_stm32f4xx.h | 0 .../Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt | 0 .../Drivers/CMSIS/Include/cmsis_armcc.h | 0 .../Drivers/CMSIS/Include/cmsis_armclang.h | 0 .../Drivers/CMSIS/Include/cmsis_compiler.h | 0 .../Drivers/CMSIS/Include/cmsis_gcc.h | 0 .../Drivers/CMSIS/Include/cmsis_iccarm.h | 0 .../Drivers/CMSIS/Include/cmsis_version.h | 0 .../Drivers/CMSIS/Include/core_armv8mbl.h | 0 .../Drivers/CMSIS/Include/core_armv8mml.h | 0 .../Drivers/CMSIS/Include/core_cm0.h | 0 .../Drivers/CMSIS/Include/core_cm0plus.h | 0 .../Drivers/CMSIS/Include/core_cm1.h | 0 .../Drivers/CMSIS/Include/core_cm23.h | 0 .../Drivers/CMSIS/Include/core_cm3.h | 0 .../Drivers/CMSIS/Include/core_cm33.h | 0 .../Drivers/CMSIS/Include/core_cm4.h | 0 .../Drivers/CMSIS/Include/core_cm7.h | 0 .../Drivers/CMSIS/Include/core_sc000.h | 0 .../Drivers/CMSIS/Include/core_sc300.h | 0 .../Drivers/CMSIS/Include/mpu_armv7.h | 0 .../Drivers/CMSIS/Include/mpu_armv8.h | 0 .../Drivers/CMSIS/Include/tz_context.h | 0 .../Drivers/CMSIS/LICENSE.txt | 0 .../Inc/Legacy/stm32_hal_legacy.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h | 0 .../Inc/stm32f4xx_hal_flash_ex.h | 0 .../Inc/stm32f4xx_hal_flash_ramfunc.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h | 0 .../Inc/stm32f4xx_hal_gpio_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h | 0 .../Drivers/STM32F4xx_HAL_Driver/LICENSE.txt | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c | 0 .../Src/stm32f4xx_hal_flash_ex.c | 0 .../Src/stm32f4xx_hal_flash_ramfunc.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c | 0 .../FreeRTOS_LED.ioc | 0 .../FreeRTOS_LED.launch | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h | 0 .../Middlewares/Third_Party/FreeRTOS/Source/LICENSE | 0 .../Third_Party/FreeRTOS/Source/croutine.c | 0 .../Third_Party/FreeRTOS/Source/event_groups.c | 0 .../Third_Party/FreeRTOS/Source/include/FreeRTOS.h | 0 .../FreeRTOS/Source/include/StackMacros.h | 0 .../Third_Party/FreeRTOS/Source/include/atomic.h | 0 .../Third_Party/FreeRTOS/Source/include/croutine.h | 0 .../Source/include/deprecated_definitions.h | 0 .../FreeRTOS/Source/include/event_groups.h | 0 .../Third_Party/FreeRTOS/Source/include/list.h | 0 .../FreeRTOS/Source/include/message_buffer.h | 0 .../FreeRTOS/Source/include/mpu_prototypes.h | 0 .../FreeRTOS/Source/include/mpu_wrappers.h | 0 .../Third_Party/FreeRTOS/Source/include/portable.h | 0 .../Third_Party/FreeRTOS/Source/include/projdefs.h | 0 .../Third_Party/FreeRTOS/Source/include/queue.h | 0 .../Third_Party/FreeRTOS/Source/include/semphr.h | 0 .../FreeRTOS/Source/include/stack_macros.h | 0 .../FreeRTOS/Source/include/stream_buffer.h | 0 .../Third_Party/FreeRTOS/Source/include/task.h | 0 .../Third_Party/FreeRTOS/Source/include/timers.h | 0 .../Middlewares/Third_Party/FreeRTOS/Source/list.c | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c | 0 .../Source/portable/GCC/ARM_CM4F/portmacro.h | 0 .../FreeRTOS/Source/portable/MemMang/heap_4.c | 0 .../Middlewares/Third_Party/FreeRTOS/Source/queue.c | 0 .../Third_Party/FreeRTOS/Source/stream_buffer.c | 0 .../Middlewares/Third_Party/FreeRTOS/Source/tasks.c | 0 .../Third_Party/FreeRTOS/Source/timers.c | 0 .../STM32F446RETX_FLASH.ld | 0 .../STM32F446RETX_RAM.ld | 0 .../croutine.c | 0 .../event_groups.c | 0 .../include/FreeRTOS.h | 0 .../include/StackMacros.h | 0 .../include/atomic.h | 0 .../include/croutine.h | 0 .../include/deprecated_definitions.h | 0 .../include/event_groups.h | 0 .../include/list.h | 0 .../include/message_buffer.h | 0 .../include/mpu_prototypes.h | 0 .../include/mpu_wrappers.h | 0 .../include/portable.h | 0 .../include/projdefs.h | 0 .../include/queue.h | 0 .../include/semphr.h | 0 .../include/stack_macros.h | 0 .../include/stdint.readme | 0 .../include/stream_buffer.h | 0 .../include/task.h | 0 .../include/timers.h | 0 .../tutorial01-stm32-pio-01-02_files_olivia/list.c | 0 .../manifest.yml | 0 .../portable/ARMClang/Use-the-GCC-ports.txt | 0 .../portable/ARMv8M/ReadMe.txt | 0 .../portable/ARMv8M/copy_files.py | 0 .../portable/ARMv8M/non_secure/ReadMe.txt | 0 .../portable/ARMv8M/non_secure/port.c | 0 .../non_secure/portable/GCC/ARM_CM23/portasm.c | 0 .../non_secure/portable/GCC/ARM_CM23/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c | 0 .../portable/GCC/ARM_CM23_NTZ/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM33/portasm.c | 0 .../non_secure/portable/GCC/ARM_CM33/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c | 0 .../portable/GCC/ARM_CM33_NTZ/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM55/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM85/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM23/portasm.s | 0 .../non_secure/portable/IAR/ARM_CM23/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s | 0 .../portable/IAR/ARM_CM23_NTZ/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM33/portasm.s | 0 .../non_secure/portable/IAR/ARM_CM33/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s | 0 .../portable/IAR/ARM_CM33_NTZ/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM55/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM85/portmacro.h | 0 .../portable/ARMv8M/non_secure/portasm.h | 0 .../portable/ARMv8M/non_secure/portmacrocommon.h | 0 .../portable/ARMv8M/secure/ReadMe.txt | 0 .../portable/GCC/ARM_CM23/secure_context_port.c | 0 .../portable/GCC/ARM_CM33/secure_context_port.c | 0 .../portable/IAR/ARM_CM23/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM33/secure_context_port_asm.s | 0 .../portable/ARMv8M/secure/context/secure_context.c | 0 .../portable/ARMv8M/secure/context/secure_context.h | 0 .../portable/ARMv8M/secure/heap/secure_heap.c | 0 .../portable/ARMv8M/secure/heap/secure_heap.h | 0 .../portable/ARMv8M/secure/init/secure_init.c | 0 .../portable/ARMv8M/secure/init/secure_init.h | 0 .../ARMv8M/secure/macros/secure_port_macros.h | 0 .../portable/BCC/16BitDOS/Flsh186/port.c | 0 .../portable/BCC/16BitDOS/Flsh186/prtmacro.h | 0 .../portable/BCC/16BitDOS/PC/port.c | 0 .../portable/BCC/16BitDOS/PC/prtmacro.h | 0 .../portable/BCC/16BitDOS/common/portasm.h | 0 .../portable/BCC/16BitDOS/common/portcomn.c | 0 .../portable/CCS/ARM_CM3/port.c | 0 .../portable/CCS/ARM_CM3/portasm.asm | 0 .../portable/CCS/ARM_CM3/portmacro.h | 0 .../portable/CCS/ARM_CM4F/port.c | 0 .../portable/CCS/ARM_CM4F/portasm.asm | 0 .../portable/CCS/ARM_CM4F/portmacro.h | 0 .../portable/CCS/ARM_Cortex-R4/port.c | 0 .../portable/CCS/ARM_Cortex-R4/portASM.asm | 0 .../portable/CCS/ARM_Cortex-R4/portmacro.h | 0 .../portable/CCS/MSP430X/data_model.h | 0 .../portable/CCS/MSP430X/port.c | 0 .../portable/CCS/MSP430X/portext.asm | 0 .../portable/CCS/MSP430X/portmacro.h | 0 .../portable/CMakeLists.txt | 0 .../portable/CodeWarrior/ColdFire_V1/port.c | 0 .../portable/CodeWarrior/ColdFire_V1/portasm.S | 0 .../portable/CodeWarrior/ColdFire_V1/portmacro.h | 0 .../portable/CodeWarrior/ColdFire_V2/port.c | 0 .../portable/CodeWarrior/ColdFire_V2/portasm.S | 0 .../portable/CodeWarrior/ColdFire_V2/portmacro.h | 0 .../portable/CodeWarrior/HCS12/port.c | 0 .../portable/CodeWarrior/HCS12/portmacro.h | 0 .../portable/Common/mpu_wrappers.c | 0 .../portable/GCC/ARM7_AT91FR40008/port.c | 0 .../portable/GCC/ARM7_AT91FR40008/portISR.c | 0 .../portable/GCC/ARM7_AT91FR40008/portmacro.h | 0 .../portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h | 0 .../portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h | 0 .../portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c | 0 .../portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h | 0 .../portable/GCC/ARM7_AT91SAM7S/port.c | 0 .../portable/GCC/ARM7_AT91SAM7S/portISR.c | 0 .../portable/GCC/ARM7_AT91SAM7S/portmacro.h | 0 .../portable/GCC/ARM7_LPC2000/port.c | 0 .../portable/GCC/ARM7_LPC2000/portISR.c | 0 .../portable/GCC/ARM7_LPC2000/portmacro.h | 0 .../portable/GCC/ARM7_LPC23xx/port.c | 0 .../portable/GCC/ARM7_LPC23xx/portISR.c | 0 .../portable/GCC/ARM7_LPC23xx/portmacro.h | 0 .../portable/GCC/ARM_CA53_64_BIT/port.c | 0 .../portable/GCC/ARM_CA53_64_BIT/portASM.S | 0 .../portable/GCC/ARM_CA53_64_BIT/portmacro.h | 0 .../portable/GCC/ARM_CA53_64_BIT_SRE/port.c | 0 .../portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S | 0 .../portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h | 0 .../portable/GCC/ARM_CA9/port.c | 0 .../portable/GCC/ARM_CA9/portASM.S | 0 .../portable/GCC/ARM_CA9/portmacro.h | 0 .../portable/GCC/ARM_CM0/port.c | 0 .../portable/GCC/ARM_CM0/portmacro.h | 0 .../portable/GCC/ARM_CM23/non_secure/port.c | 0 .../portable/GCC/ARM_CM23/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM23/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM23/non_secure/portmacro.h | 0 .../GCC/ARM_CM23/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM23/secure/secure_context.c | 0 .../portable/GCC/ARM_CM23/secure/secure_context.h | 0 .../GCC/ARM_CM23/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM23/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM23/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM23/secure/secure_init.c | 0 .../portable/GCC/ARM_CM23/secure/secure_init.h | 0 .../GCC/ARM_CM23/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM23_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM23_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM3/port.c | 0 .../portable/GCC/ARM_CM3/portmacro.h | 0 .../portable/GCC/ARM_CM33/non_secure/port.c | 0 .../portable/GCC/ARM_CM33/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM33/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM33/non_secure/portmacro.h | 0 .../GCC/ARM_CM33/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM33/secure/secure_context.c | 0 .../portable/GCC/ARM_CM33/secure/secure_context.h | 0 .../GCC/ARM_CM33/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM33/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM33/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM33/secure/secure_init.c | 0 .../portable/GCC/ARM_CM33/secure/secure_init.h | 0 .../GCC/ARM_CM33/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM33_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM33_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM3_MPU/port.c | 0 .../portable/GCC/ARM_CM3_MPU/portmacro.h | 0 .../portable/GCC/ARM_CM4F/port.c | 0 .../portable/GCC/ARM_CM4F/portmacro.h | 0 .../portable/GCC/ARM_CM4_MPU/port.c | 0 .../portable/GCC/ARM_CM4_MPU/portmacro.h | 0 .../portable/GCC/ARM_CM55/non_secure/port.c | 0 .../portable/GCC/ARM_CM55/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM55/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM55/non_secure/portmacro.h | 0 .../GCC/ARM_CM55/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM55/secure/secure_context.c | 0 .../portable/GCC/ARM_CM55/secure/secure_context.h | 0 .../GCC/ARM_CM55/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM55/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM55/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM55/secure/secure_init.c | 0 .../portable/GCC/ARM_CM55/secure/secure_init.h | 0 .../GCC/ARM_CM55/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM55_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM55_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM7/ReadMe.txt | 0 .../portable/GCC/ARM_CM7/r0p1/port.c | 0 .../portable/GCC/ARM_CM7/r0p1/portmacro.h | 0 .../portable/GCC/ARM_CM85/non_secure/port.c | 0 .../portable/GCC/ARM_CM85/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM85/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM85/non_secure/portmacro.h | 0 .../GCC/ARM_CM85/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM85/secure/secure_context.c | 0 .../portable/GCC/ARM_CM85/secure/secure_context.h | 0 .../GCC/ARM_CM85/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM85/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM85/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM85/secure/secure_init.c | 0 .../portable/GCC/ARM_CM85/secure/secure_init.h | 0 .../GCC/ARM_CM85/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM85_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM85_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CR5/port.c | 0 .../portable/GCC/ARM_CR5/portASM.S | 0 .../portable/GCC/ARM_CR5/portmacro.h | 0 .../portable/GCC/ARM_CRx_No_GIC/port.c | 0 .../portable/GCC/ARM_CRx_No_GIC/portASM.S | 0 .../portable/GCC/ARM_CRx_No_GIC/portmacro.h | 0 .../portable/GCC/ATMega323/port.c | 0 .../portable/GCC/ATMega323/portmacro.h | 0 .../portable/GCC/AVR32_UC3/exception.S | 0 .../portable/GCC/AVR32_UC3/port.c | 0 .../portable/GCC/AVR32_UC3/portmacro.h | 0 .../portable/GCC/AVR_AVRDx/README.md | 0 .../portable/GCC/AVR_Mega0/README.md | 0 .../portable/GCC/CORTUS_APS3/port.c | 0 .../portable/GCC/CORTUS_APS3/portmacro.h | 0 .../portable/GCC/ColdFire_V2/port.c | 0 .../portable/GCC/ColdFire_V2/portasm.S | 0 .../portable/GCC/ColdFire_V2/portmacro.h | 0 .../portable/GCC/H8S2329/port.c | 0 .../portable/GCC/H8S2329/portmacro.h | 0 .../portable/GCC/HCS12/port.c | 0 .../portable/GCC/HCS12/portmacro.h | 0 .../portable/GCC/IA32_flat/ISR_Support.h | 0 .../portable/GCC/IA32_flat/port.c | 0 .../portable/GCC/IA32_flat/portASM.S | 0 .../portable/GCC/IA32_flat/portmacro.h | 0 .../portable/GCC/MCF5235/readme.md | 0 .../portable/GCC/MSP430F449/port.c | 0 .../portable/GCC/MSP430F449/portmacro.h | 0 .../portable/GCC/MicroBlaze/port.c | 0 .../portable/GCC/MicroBlaze/portasm.s | 0 .../portable/GCC/MicroBlaze/portmacro.h | 0 .../portable/GCC/MicroBlazeV8/port.c | 0 .../portable/GCC/MicroBlazeV8/port_exceptions.c | 0 .../portable/GCC/MicroBlazeV8/portasm.S | 0 .../portable/GCC/MicroBlazeV8/portmacro.h | 0 .../portable/GCC/MicroBlazeV9/port.c | 0 .../portable/GCC/MicroBlazeV9/port_exceptions.c | 0 .../portable/GCC/MicroBlazeV9/portasm.S | 0 .../portable/GCC/MicroBlazeV9/portmacro.h | 0 .../portable/GCC/NiosII/port.c | 0 .../portable/GCC/NiosII/port_asm.S | 0 .../portable/GCC/NiosII/portmacro.h | 0 .../portable/GCC/PPC405_Xilinx/FPU_Macros.h | 0 .../portable/GCC/PPC405_Xilinx/port.c | 0 .../portable/GCC/PPC405_Xilinx/portasm.S | 0 .../portable/GCC/PPC405_Xilinx/portmacro.h | 0 .../portable/GCC/PPC440_Xilinx/FPU_Macros.h | 0 .../portable/GCC/PPC440_Xilinx/port.c | 0 .../portable/GCC/PPC440_Xilinx/portasm.S | 0 .../portable/GCC/PPC440_Xilinx/portmacro.h | 0 .../portable/GCC/RISC-V/Documentation.url | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../GCC/RISC-V/chip_specific_extensions/readme.txt | 0 .../portable/GCC/RISC-V/port.c | 0 .../portable/GCC/RISC-V/portASM.S | 0 .../portable/GCC/RISC-V/portContext.h | 0 .../portable/GCC/RISC-V/portmacro.h | 0 .../portable/GCC/RISC-V/readme.txt | 0 .../portable/GCC/RL78/isr_support.h | 0 .../portable/GCC/RL78/port.c | 0 .../portable/GCC/RL78/portasm.S | 0 .../portable/GCC/RL78/portmacro.h | 0 .../portable/GCC/RX100/port.c | 0 .../portable/GCC/RX100/portmacro.h | 0 .../portable/GCC/RX100/readme.txt | 0 .../portable/GCC/RX200/port.c | 0 .../portable/GCC/RX200/portmacro.h | 0 .../portable/GCC/RX600/port.c | 0 .../portable/GCC/RX600/portmacro.h | 0 .../portable/GCC/RX600/readme.txt | 0 .../portable/GCC/RX600v2/port.c | 0 .../portable/GCC/RX600v2/portmacro.h | 0 .../portable/GCC/RX600v2/readme.txt | 0 .../portable/GCC/RX700v3_DPFPU/port.c | 0 .../portable/GCC/RX700v3_DPFPU/portmacro.h | 0 .../portable/GCC/RX700v3_DPFPU/readme.txt | 0 .../portable/GCC/STR75x/port.c | 0 .../portable/GCC/STR75x/portISR.c | 0 .../portable/GCC/STR75x/portmacro.h | 0 .../portable/GCC/TriCore_1782/port.c | 0 .../portable/GCC/TriCore_1782/portmacro.h | 0 .../portable/GCC/TriCore_1782/porttrap.c | 0 .../portable/IAR/78K0R/ISR_Support.h | 0 .../portable/IAR/78K0R/port.c | 0 .../portable/IAR/78K0R/portasm.s26 | 0 .../portable/IAR/78K0R/portmacro.h | 0 .../portable/IAR/ARM_CA5_No_GIC/port.c | 0 .../portable/IAR/ARM_CA5_No_GIC/portASM.h | 0 .../portable/IAR/ARM_CA5_No_GIC/portASM.s | 0 .../portable/IAR/ARM_CA5_No_GIC/portmacro.h | 0 .../portable/IAR/ARM_CA9/port.c | 0 .../portable/IAR/ARM_CA9/portASM.h | 0 .../portable/IAR/ARM_CA9/portASM.s | 0 .../portable/IAR/ARM_CA9/portmacro.h | 0 .../portable/IAR/ARM_CM0/port.c | 0 .../portable/IAR/ARM_CM0/portasm.s | 0 .../portable/IAR/ARM_CM0/portmacro.h | 0 .../portable/IAR/ARM_CM23/non_secure/port.c | 0 .../portable/IAR/ARM_CM23/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM23/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM23/non_secure/portmacro.h | 0 .../IAR/ARM_CM23/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM23/secure/secure_context.c | 0 .../portable/IAR/ARM_CM23/secure/secure_context.h | 0 .../IAR/ARM_CM23/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM23/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM23/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM23/secure/secure_init.c | 0 .../portable/IAR/ARM_CM23/secure/secure_init.h | 0 .../IAR/ARM_CM23/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM23_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM23_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM3/port.c | 0 .../portable/IAR/ARM_CM3/portasm.s | 0 .../portable/IAR/ARM_CM3/portmacro.h | 0 .../portable/IAR/ARM_CM33/non_secure/port.c | 0 .../portable/IAR/ARM_CM33/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM33/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM33/non_secure/portmacro.h | 0 .../IAR/ARM_CM33/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM33/secure/secure_context.c | 0 .../portable/IAR/ARM_CM33/secure/secure_context.h | 0 .../IAR/ARM_CM33/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM33/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM33/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM33/secure/secure_init.c | 0 .../portable/IAR/ARM_CM33/secure/secure_init.h | 0 .../IAR/ARM_CM33/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM33_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM33_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM4F/port.c | 0 .../portable/IAR/ARM_CM4F/portasm.s | 0 .../portable/IAR/ARM_CM4F/portmacro.h | 0 .../portable/IAR/ARM_CM4F_MPU/port.c | 0 .../portable/IAR/ARM_CM4F_MPU/portasm.s | 0 .../portable/IAR/ARM_CM4F_MPU/portmacro.h | 0 .../portable/IAR/ARM_CM55/non_secure/port.c | 0 .../portable/IAR/ARM_CM55/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM55/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM55/non_secure/portmacro.h | 0 .../IAR/ARM_CM55/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM55/secure/secure_context.c | 0 .../portable/IAR/ARM_CM55/secure/secure_context.h | 0 .../IAR/ARM_CM55/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM55/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM55/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM55/secure/secure_init.c | 0 .../portable/IAR/ARM_CM55/secure/secure_init.h | 0 .../IAR/ARM_CM55/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM55_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM55_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM7/ReadMe.txt | 0 .../portable/IAR/ARM_CM7/r0p1/port.c | 0 .../portable/IAR/ARM_CM7/r0p1/portasm.s | 0 .../portable/IAR/ARM_CM7/r0p1/portmacro.h | 0 .../portable/IAR/ARM_CM85/non_secure/port.c | 0 .../portable/IAR/ARM_CM85/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM85/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM85/non_secure/portmacro.h | 0 .../IAR/ARM_CM85/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM85/secure/secure_context.c | 0 .../portable/IAR/ARM_CM85/secure/secure_context.h | 0 .../IAR/ARM_CM85/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM85/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM85/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM85/secure/secure_init.c | 0 .../portable/IAR/ARM_CM85/secure/secure_init.h | 0 .../IAR/ARM_CM85/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM85_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM85_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CRx_No_GIC/port.c | 0 .../portable/IAR/ARM_CRx_No_GIC/portASM.s | 0 .../portable/IAR/ARM_CRx_No_GIC/portmacro.h | 0 .../portable/IAR/ATMega323/port.c | 0 .../portable/IAR/ATMega323/portmacro.h | 0 .../portable/IAR/ATMega323/portmacro.s90 | 0 .../portable/IAR/AVR32_UC3/exception.s82 | 0 .../portable/IAR/AVR32_UC3/port.c | 0 .../portable/IAR/AVR32_UC3/portmacro.h | 0 .../portable/IAR/AVR32_UC3/read.c | 0 .../portable/IAR/AVR32_UC3/write.c | 0 .../portable/IAR/AVR_AVRDx/port.c | 0 .../portable/IAR/AVR_AVRDx/porthardware.h | 0 .../portable/IAR/AVR_AVRDx/portmacro.h | 0 .../portable/IAR/AVR_AVRDx/portmacro.s90 | 0 .../portable/IAR/AVR_Mega0/port.c | 0 .../portable/IAR/AVR_Mega0/porthardware.h | 0 .../portable/IAR/AVR_Mega0/portmacro.h | 0 .../portable/IAR/AVR_Mega0/portmacro.s90 | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7S64.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X128.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X256.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h | 0 .../portable/IAR/AtmelSAM7S64/ISR_Support.h | 0 .../portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h | 0 .../portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h | 0 .../portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h | 0 .../portable/IAR/AtmelSAM7S64/port.c | 0 .../portable/IAR/AtmelSAM7S64/portasm.s79 | 0 .../portable/IAR/AtmelSAM7S64/portmacro.h | 0 .../portable/IAR/AtmelSAM9XE/ISR_Support.h | 0 .../portable/IAR/AtmelSAM9XE/port.c | 0 .../portable/IAR/AtmelSAM9XE/portasm.s79 | 0 .../portable/IAR/AtmelSAM9XE/portmacro.h | 0 .../portable/IAR/LPC2000/ISR_Support.h | 0 .../portable/IAR/LPC2000/port.c | 0 .../portable/IAR/LPC2000/portasm.s79 | 0 .../portable/IAR/LPC2000/portmacro.h | 0 .../portable/IAR/MSP430/port.c | 0 .../portable/IAR/MSP430/portasm.h | 0 .../portable/IAR/MSP430/portext.s43 | 0 .../portable/IAR/MSP430/portmacro.h | 0 .../portable/IAR/MSP430X/data_model.h | 0 .../portable/IAR/MSP430X/port.c | 0 .../portable/IAR/MSP430X/portext.s43 | 0 .../portable/IAR/MSP430X/portmacro.h | 0 .../portable/IAR/RISC-V/Documentation.url | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../IAR/RISC-V/chip_specific_extensions/readme.txt | 0 .../portable/IAR/RISC-V/port.c | 0 .../portable/IAR/RISC-V/portASM.s | 0 .../portable/IAR/RISC-V/portContext.h | 0 .../portable/IAR/RISC-V/portmacro.h | 0 .../portable/IAR/RISC-V/readme.txt | 0 .../portable/IAR/RL78/port.c | 0 .../portable/IAR/RL78/portasm.s | 0 .../portable/IAR/RL78/portmacro.h | 0 .../portable/IAR/RX100/port.c | 0 .../portable/IAR/RX100/port_asm.s | 0 .../portable/IAR/RX100/portmacro.h | 0 .../portable/IAR/RX100/readme.txt | 0 .../portable/IAR/RX600/port.c | 0 .../portable/IAR/RX600/port_asm.s | 0 .../portable/IAR/RX600/portmacro.h | 0 .../portable/IAR/RX600/readme.txt | 0 .../portable/IAR/RX700v3_DPFPU/port.c | 0 .../portable/IAR/RX700v3_DPFPU/portmacro.h | 0 .../portable/IAR/RX700v3_DPFPU/readme.txt | 0 .../portable/IAR/RXv2/port.c | 0 .../portable/IAR/RXv2/port_asm.s | 0 .../portable/IAR/RXv2/portmacro.h | 0 .../portable/IAR/RXv2/readme.txt | 0 .../portable/IAR/STR71x/ISR_Support.h | 0 .../portable/IAR/STR71x/port.c | 0 .../portable/IAR/STR71x/portasm.s79 | 0 .../portable/IAR/STR71x/portmacro.h | 0 .../portable/IAR/STR75x/ISR_Support.h | 0 .../portable/IAR/STR75x/port.c | 0 .../portable/IAR/STR75x/portasm.s79 | 0 .../portable/IAR/STR75x/portmacro.h | 0 .../portable/IAR/STR91x/ISR_Support.h | 0 .../portable/IAR/STR91x/port.c | 0 .../portable/IAR/STR91x/portasm.s79 | 0 .../portable/IAR/STR91x/portmacro.h | 0 .../portable/IAR/V850ES/ISR_Support.h | 0 .../portable/IAR/V850ES/port.c | 0 .../portable/IAR/V850ES/portasm.s85 | 0 .../portable/IAR/V850ES/portasm_Fx3.s85 | 0 .../portable/IAR/V850ES/portasm_Hx2.s85 | 0 .../portable/IAR/V850ES/portmacro.h | 0 .../portable/Keil/See-also-the-RVDS-directory.txt | 0 .../portable/MPLAB/PIC18F/port.c | 0 .../portable/MPLAB/PIC18F/portmacro.h | 0 .../portable/MPLAB/PIC18F/stdio.h | 0 .../portable/MPLAB/PIC24_dsPIC/port.c | 0 .../portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S | 0 .../portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S | 0 .../portable/MPLAB/PIC24_dsPIC/portmacro.h | 0 .../portable/MPLAB/PIC32MEC14xx/ISR_Support.h | 0 .../portable/MPLAB/PIC32MEC14xx/port.c | 0 .../portable/MPLAB/PIC32MEC14xx/port_asm.S | 0 .../portable/MPLAB/PIC32MEC14xx/portmacro.h | 0 .../portable/MPLAB/PIC32MX/ISR_Support.h | 0 .../portable/MPLAB/PIC32MX/port.c | 0 .../portable/MPLAB/PIC32MX/port_asm.S | 0 .../portable/MPLAB/PIC32MX/portmacro.h | 0 .../portable/MPLAB/PIC32MZ/ISR_Support.h | 0 .../portable/MPLAB/PIC32MZ/port.c | 0 .../portable/MPLAB/PIC32MZ/port_asm.S | 0 .../portable/MPLAB/PIC32MZ/portmacro.h | 0 .../portable/MSVC-MingW/port.c | 0 .../portable/MSVC-MingW/portmacro.h | 0 .../portable/MemMang/ReadMe.url | 0 .../portable/MemMang/heap_1.c | 0 .../portable/MemMang/heap_2.c | 0 .../portable/MemMang/heap_3.c | 0 .../portable/MemMang/heap_4.c | 0 .../portable/MemMang/heap_5.c | 0 .../portable/MikroC/ARM_CM4F/port.c | 0 .../portable/MikroC/ARM_CM4F/portmacro.h | 0 .../portable/Paradigm/Tern_EE/large_untested/port.c | 0 .../Paradigm/Tern_EE/large_untested/portasm.h | 0 .../Paradigm/Tern_EE/large_untested/portmacro.h | 0 .../portable/Paradigm/Tern_EE/small/port.c | 0 .../portable/Paradigm/Tern_EE/small/portasm.h | 0 .../portable/Paradigm/Tern_EE/small/portmacro.h | 0 .../portable/RVDS/ARM7_LPC21xx/port.c | 0 .../portable/RVDS/ARM7_LPC21xx/portASM.s | 0 .../portable/RVDS/ARM7_LPC21xx/portmacro.h | 0 .../portable/RVDS/ARM7_LPC21xx/portmacro.inc | 0 .../portable/RVDS/ARM_CA9/port.c | 0 .../portable/RVDS/ARM_CA9/portASM.s | 0 .../portable/RVDS/ARM_CA9/portmacro.h | 0 .../portable/RVDS/ARM_CA9/portmacro.inc | 0 .../portable/RVDS/ARM_CM0/port.c | 0 .../portable/RVDS/ARM_CM0/portmacro.h | 0 .../portable/RVDS/ARM_CM3/port.c | 0 .../portable/RVDS/ARM_CM3/portmacro.h | 0 .../portable/RVDS/ARM_CM4F/port.c | 0 .../portable/RVDS/ARM_CM4F/portmacro.h | 0 .../portable/RVDS/ARM_CM4_MPU/port.c | 0 .../portable/RVDS/ARM_CM4_MPU/portmacro.h | 0 .../portable/RVDS/ARM_CM7/ReadMe.txt | 0 .../portable/RVDS/ARM_CM7/r0p1/port.c | 0 .../portable/RVDS/ARM_CM7/r0p1/portmacro.h | 0 .../portable/Renesas/RX100/port.c | 0 .../portable/Renesas/RX100/port_asm.src | 0 .../portable/Renesas/RX100/portmacro.h | 0 .../portable/Renesas/RX100/readme.txt | 0 .../portable/Renesas/RX200/port.c | 0 .../portable/Renesas/RX200/port_asm.src | 0 .../portable/Renesas/RX200/portmacro.h | 0 .../portable/Renesas/RX200/readme.txt | 0 .../portable/Renesas/RX600/port.c | 0 .../portable/Renesas/RX600/port_asm.src | 0 .../portable/Renesas/RX600/portmacro.h | 0 .../portable/Renesas/RX600/readme.txt | 0 .../portable/Renesas/RX600v2/port.c | 0 .../portable/Renesas/RX600v2/port_asm.src | 0 .../portable/Renesas/RX600v2/portmacro.h | 0 .../portable/Renesas/RX600v2/readme.txt | 0 .../portable/Renesas/RX700v3_DPFPU/port.c | 0 .../portable/Renesas/RX700v3_DPFPU/port_asm.src | 0 .../portable/Renesas/RX700v3_DPFPU/portmacro.h | 0 .../portable/Renesas/RX700v3_DPFPU/readme.txt | 0 .../portable/Renesas/SH2A_FPU/ISR_Support.inc | 0 .../portable/Renesas/SH2A_FPU/port.c | 0 .../portable/Renesas/SH2A_FPU/portasm.src | 0 .../portable/Renesas/SH2A_FPU/portmacro.h | 0 .../portable/Rowley/ARM7/readme.txt | 0 .../portable/Rowley/MSP430F449/port.c | 0 .../portable/Rowley/MSP430F449/portasm.h | 0 .../portable/Rowley/MSP430F449/portext.asm | 0 .../portable/Rowley/MSP430F449/portmacro.h | 0 .../portable/SDCC/Cygnal/port.c | 0 .../portable/SDCC/Cygnal/portmacro.h | 0 .../portable/Softune/MB91460/__STD_LIB_sbrk.c | 0 .../portable/Softune/MB91460/port.c | 0 .../portable/Softune/MB91460/portmacro.h | 0 .../portable/Softune/MB96340/__STD_LIB_sbrk.c | 0 .../portable/Softune/MB96340/port.c | 0 .../portable/Softune/MB96340/portmacro.h | 0 .../portable/Tasking/ARM_CM4F/port.c | 0 .../portable/Tasking/ARM_CM4F/port_asm.asm | 0 .../portable/Tasking/ARM_CM4F/portmacro.h | 0 .../portable/ThirdParty/CDK/T-HEAD_CK802/port.c | 0 .../portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S | 0 .../ThirdParty/CDK/T-HEAD_CK802/portmacro.h | 0 .../.github/CODE_OF_CONDUCT.md | 0 .../.github/CONTRIBUTING.md | 0 .../Community-Supported-Ports/.github/SECURITY.md | 0 .../.github/pull_request_template.md | 0 .../CCS/C2000_C28x/README.md | 0 .../Community-Supported-Ports/CCS/C2000_C28x/port.c | 0 .../CCS/C2000_C28x/portasm.asm | 0 .../CCS/C2000_C28x/portmacro.h | 0 .../GCC/MSP430FR5969/port.c | 0 .../GCC/MSP430FR5969/portmacro.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../GCC/TriCore_38xa/port.c | 0 .../GCC/TriCore_38xa/port.h | 0 .../GCC/TriCore_38xa/portmacro.h | 0 .../GCC/TriCore_38xa/porttrap.c | 0 .../GCC/TriCore_38xa/readme.txt | 0 .../ThirdParty/Community-Supported-Ports/LICENSE | 0 .../ThirdParty/Community-Supported-Ports/README.md | 0 .../Community-Supported-Ports/Z88DK/Z180/port.c | 0 .../Z88DK/Z180/portmacro.h | 0 .../Community-Supported-Ports/Z88DK/Z180/readme.md | 0 .../GCC/ARC_EM_HS/arc_freertos_exceptions.c | 0 .../GCC/ARC_EM_HS/arc_freertos_exceptions.h | 0 .../portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s | 0 .../ThirdParty/GCC/ARC_EM_HS/freertos_tls.c | 0 .../portable/ThirdParty/GCC/ARC_EM_HS/port.c | 0 .../portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h | 0 .../ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c | 0 .../ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h | 0 .../portable/ThirdParty/GCC/ARC_v1/arc_support.s | 0 .../portable/ThirdParty/GCC/ARC_v1/port.c | 0 .../portable/ThirdParty/GCC/ARC_v1/portmacro.h | 0 .../portable/ThirdParty/GCC/ARM_TFM/README.md | 0 .../ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c | 0 .../portable/ThirdParty/GCC/ATmega/port.c | 0 .../portable/ThirdParty/GCC/ATmega/portmacro.h | 0 .../portable/ThirdParty/GCC/ATmega/readme.md | 0 .../GCC/Posix/FreeRTOS-simulator-for-Linux.url | 0 .../portable/ThirdParty/GCC/Posix/port.c | 0 .../portable/ThirdParty/GCC/Posix/portmacro.h | 0 .../ThirdParty/GCC/Posix/utils/wait_for_event.c | 0 .../ThirdParty/GCC/Posix/utils/wait_for_event.h | 0 ...README-for-info-on-official-MIT-license-port.txt | 0 .../portable/ThirdParty/GCC/RP2040/.gitignore | 0 .../portable/ThirdParty/GCC/RP2040/CMakeLists.txt | 0 .../GCC/RP2040/FreeRTOS_Kernel_import.cmake | 0 .../portable/ThirdParty/GCC/RP2040/LICENSE.md | 0 .../portable/ThirdParty/GCC/RP2040/README.md | 0 .../ThirdParty/GCC/RP2040/idle_task_static_memory.c | 0 .../GCC/RP2040/include/freertos_sdk_config.h | 0 .../ThirdParty/GCC/RP2040/include/portmacro.h | 0 .../ThirdParty/GCC/RP2040/include/rp2040_config.h | 0 .../portable/ThirdParty/GCC/RP2040/library.cmake | 0 .../ThirdParty/GCC/RP2040/pico_sdk_import.cmake | 0 .../portable/ThirdParty/GCC/RP2040/port.c | 0 .../ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c | 0 .../GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h | 0 .../GCC/Xtensa_ESP32/include/port_systick.h | 0 .../GCC/Xtensa_ESP32/include/portbenchmark.h | 0 .../ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h | 0 .../GCC/Xtensa_ESP32/include/xt_asm_utils.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_api.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_config.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_context.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_rtos.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_timer.h | 0 .../portable/ThirdParty/GCC/Xtensa_ESP32/port.c | 0 .../ThirdParty/GCC/Xtensa_ESP32/port_common.c | 0 .../ThirdParty/GCC/Xtensa_ESP32/port_systick.c | 0 .../portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S | 0 .../ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h | 0 .../ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h | 0 .../ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S | 0 .../ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c | 0 .../GCC/Xtensa_ESP32/xtensa_loadstore_handler.S | 0 .../GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c | 0 .../GCC/Xtensa_ESP32/xtensa_vector_defaults.S | 0 .../ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S | 0 .../portable/ThirdParty/KnownIssues.md | 0 .../.github/CODE_OF_CONDUCT.md | 0 .../Partner-Supported-Ports/.github/CONTRIBUTING.md | 0 .../Partner-Supported-Ports/.github/SECURITY.md | 0 .../.github/pull_request_template.md | 0 .../Partner-Supported-Ports/GCC/AVR_AVRDx/port.c | 0 .../GCC/AVR_AVRDx/porthardware.h | 0 .../GCC/AVR_AVRDx/portmacro.h | 0 .../Partner-Supported-Ports/GCC/AVR_Mega0/port.c | 0 .../GCC/AVR_Mega0/porthardware.h | 0 .../GCC/AVR_Mega0/portmacro.h | 0 .../ThirdParty/Partner-Supported-Ports/LICENSE | 0 .../ThirdParty/Partner-Supported-Ports/README.md | 0 .../portable/ThirdParty/README.md | 0 .../portable/ThirdParty/XCC/Xtensa/Makefile | 0 .../portable/ThirdParty/XCC/Xtensa/port.c | 0 .../portable/ThirdParty/XCC/Xtensa/portasm.S | 0 .../portable/ThirdParty/XCC/Xtensa/portbenchmark.h | 0 .../portable/ThirdParty/XCC/Xtensa/portclib.c | 0 .../portable/ThirdParty/XCC/Xtensa/portmacro.h | 0 .../portable/ThirdParty/XCC/Xtensa/porttrace.h | 0 .../ThirdParty/XCC/Xtensa/readme_xtensa.txt | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_api.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_config.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_context.S | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_context.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_init.c | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_intr.c | 0 .../ThirdParty/XCC/Xtensa/xtensa_intr_asm.S | 0 .../ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_timer.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S | 0 .../portable/WizC/PIC18/Drivers/Tick/Tick.c | 0 .../portable/WizC/PIC18/Drivers/Tick/isrTick.c | 0 .../portable/WizC/PIC18/Install.bat | 0 .../portable/WizC/PIC18/addFreeRTOS.h | 0 .../portable/WizC/PIC18/port.c | 0 .../portable/WizC/PIC18/portmacro.h | 0 .../portable/oWatcom/16BitDOS/Flsh186/port.c | 0 .../portable/oWatcom/16BitDOS/Flsh186/portmacro.h | 0 .../portable/oWatcom/16BitDOS/PC/port.c | 0 .../portable/oWatcom/16BitDOS/PC/portmacro.h | 0 .../portable/oWatcom/16BitDOS/common/portasm.h | 0 .../portable/oWatcom/16BitDOS/common/portcomn.c | 0 .../portable/readme.txt | 0 .../tutorial01-stm32-pio-01-02_files_olivia/queue.c | 0 .../sbom.spdx | 0 .../stream_buffer.c | 0 .../tutorial01-stm32-pio-01-02_files_olivia/tasks.c | 0 .../timers.c | 0 1008 files changed, 0 insertions(+), 0 deletions(-) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.gitignore (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.lock (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.log4j.xml (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.resources/0.snap (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/.metadata/version.ini (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/README.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/.cproject (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/.gitmodules (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/.mxproject (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/.project (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/.settings/language.settings.xml (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/.settings/stm32cubeide.project.prefs (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/CMakeLists.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/FreeRTOSConfig.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/app.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/main.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_hal_conf.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_it.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/app.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/freertos.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/main.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_hal_msp.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_it.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/syscalls.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/sysmem.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/system_stm32f4xx.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Core/Startup/startup_stm32f446retx.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/subdir.mk (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/subdir.mk (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.elf (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.list (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.map (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/makefile (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.list (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.mk (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Debug/sources.mk (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armcc.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armclang.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_compiler.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_gcc.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_version.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mbl.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mml.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0plus.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm1.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm23.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm3.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm33.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm4.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm7.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc000.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc300.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv7.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv8.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/tz_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/LICENSE.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.ioc (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.launch (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_FLASH.ld (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_RAM.ld (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/croutine.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/event_groups.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/FreeRTOS.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/StackMacros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/atomic.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/croutine.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/deprecated_definitions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/event_groups.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/list.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/message_buffer.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_prototypes.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_wrappers.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/portable.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/projdefs.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/queue.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/semphr.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/stack_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/stdint.readme (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/stream_buffer.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/task.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/include/timers.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/list.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/manifest.yml (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMClang/Use-the-GCC-ports.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/copy_files.py (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/prtmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portcomn.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portasm.asm (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portasm.asm (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/data_model.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portext.asm (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CMakeLists.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Common/mpu_wrappers.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portISR.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portISR.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portASM.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portASM.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/exception.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_AVRDx/README.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_Mega0/README.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portASM.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MCF5235/readme.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port_asm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/Documentation.url (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portASM.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portContext.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/isr_support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portISR.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/porttrap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portasm.s26 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.s90 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/exception.s82 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/read.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/write.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/porthardware.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/porthardware.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.s90 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portext.s43 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/data_model.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portext.s43 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/Documentation.url (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portASM.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portContext.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portasm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port_asm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port_asm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port_asm.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portasm.s79 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm.s85 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Fx3.s85 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Hx2.s85 (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Keil/See-also-the-RVDS-directory.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/stdio.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port_asm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port_asm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/ReadMe.url (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_1.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_2.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_3.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_4.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_5.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portASM.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.inc (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port_asm.src (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port_asm.src (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port_asm.src (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port_asm.src (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portasm.src (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/ARM7/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portext.asm (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port_asm.asm (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/README.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/readme.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/.gitignore (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/README.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/library.cmake (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/KnownIssues.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/README.md (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/Makefile (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Install.bat (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/addFreeRTOS.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/port.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portasm.h (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portcomn.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/portable/readme.txt (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/queue.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/sbom.spdx (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/stream_buffer.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/tasks.c (100%) rename tutorial01-stm32-pio-01/{pio-01-02_files_olivia => pio-01-02_olivia}/tutorial01-stm32-pio-01-02_files_olivia/timers.c (100%) diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.gitignore b/tutorial01-stm32-pio-01/pio-01-02_olivia/.gitignore similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.gitignore rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.gitignore diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.lock b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.lock similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.lock rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.lock diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.log4j.xml b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.log4j.xml similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.log4j.xml rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.log4j.xml diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/com.st.stm32cube.ide.mcu.informationcenter/2.1.500.202211100823 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.1679135758468.pdom diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.core/FreeRTOS_LED.language.settings.xml diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.cpp diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/39/30e46b3185c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/3e/e05e38db7ac5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/48/c0c0109d80c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/80848b7d7ec5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/52/a059856480c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/57/00b38daf78c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/5c/e082ac857ec5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/73/9026441f7cc5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/8f/709053d17ac5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/9/a06a581285c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a1/90e171dc80c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/a5/70e720af78c5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/7075fe0d7cc5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/bd/a0bac3217ec5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/f2/a03d30fb7dc5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.history/ff/b0366ba17fc5001d13d6fe58f0709e0f diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/1/ce/ce/c5/ae/properties.index diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/af/history.index diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/bf/c4/properties.index diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/d5/7a/c4/properties.index diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.indexes/properties.index diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.location diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.markers.snap diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.projects/FreeRTOS_LED/.syncinfo.snap diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.resources/0.snap diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.st.stm32cube.ide.mcu.ide.oss.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.core.prj-FreeRTOS_LED.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.navigator.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.urischeme.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.ide/dialog_settings.xml diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/version.ini b/tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/version.ini similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/.metadata/version.ini rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.metadata/version.ini diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.cproject b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.cproject similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.cproject rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.cproject diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.gitmodules b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.gitmodules similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.gitmodules rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.gitmodules diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.mxproject b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.mxproject similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.mxproject rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.mxproject diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.project b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.project similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.project rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.project diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/language.settings.xml b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/language.settings.xml similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/language.settings.xml rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/language.settings.xml diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/stm32cubeide.project.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/stm32cubeide.project.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/stm32cubeide.project.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/stm32cubeide.project.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/CMakeLists.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/CMakeLists.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/CMakeLists.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/CMakeLists.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/FreeRTOSConfig.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/FreeRTOSConfig.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/FreeRTOSConfig.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/FreeRTOSConfig.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/app.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/app.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/app.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/app.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/main.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/main.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/main.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/main.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_hal_conf.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_hal_conf.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_hal_conf.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_hal_conf.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_it.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_it.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_it.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_it.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/app.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/app.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/app.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/app.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/freertos.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/freertos.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/freertos.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/freertos.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/main.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/main.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/main.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/main.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_hal_msp.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_hal_msp.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_hal_msp.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_hal_msp.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_it.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_it.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_it.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_it.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/syscalls.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/syscalls.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/syscalls.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/syscalls.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/sysmem.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/sysmem.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/sysmem.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/sysmem.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/system_stm32f4xx.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/system_stm32f4xx.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/system_stm32f4xx.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/system_stm32f4xx.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Startup/startup_stm32f446retx.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Startup/startup_stm32f446retx.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Startup/startup_stm32f446retx.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Startup/startup_stm32f446retx.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.elf b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.elf similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.elf rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.elf diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.list b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.list similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.list rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.list diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.map b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.map similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.map rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.map diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/makefile b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/makefile similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/makefile rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/makefile diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.list b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.list similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.list rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.list diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/sources.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/sources.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/sources.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/sources.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armcc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armcc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armcc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armcc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armclang.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armclang.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armclang.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armclang.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_compiler.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_compiler.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_compiler.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_compiler.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_gcc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_gcc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_gcc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_gcc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_version.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_version.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_version.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_version.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mbl.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mbl.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mbl.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mbl.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mml.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mml.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mml.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mml.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0plus.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0plus.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0plus.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0plus.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm1.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm1.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm1.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm1.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm23.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm23.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm23.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm23.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm3.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm3.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm3.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm3.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm33.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm33.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm33.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm33.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm4.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm4.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm4.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm4.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm7.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm7.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm7.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm7.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc000.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc000.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc000.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc000.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc300.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc300.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc300.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc300.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv7.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv7.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv7.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv7.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv8.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv8.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv8.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv8.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/tz_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/tz_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/tz_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/tz_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/LICENSE.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/LICENSE.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/LICENSE.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/LICENSE.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.ioc b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.ioc similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.ioc rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.ioc diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.launch b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.launch similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.launch rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.launch diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_FLASH.ld b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_FLASH.ld similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_FLASH.ld rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_FLASH.ld diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_RAM.ld b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_RAM.ld similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_RAM.ld rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_RAM.ld diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/croutine.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/croutine.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/croutine.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/croutine.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/event_groups.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/event_groups.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/event_groups.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/event_groups.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/FreeRTOS.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/FreeRTOS.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/FreeRTOS.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/FreeRTOS.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/StackMacros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/StackMacros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/StackMacros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/StackMacros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/atomic.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/atomic.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/atomic.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/atomic.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/croutine.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/croutine.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/croutine.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/croutine.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/deprecated_definitions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/deprecated_definitions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/deprecated_definitions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/deprecated_definitions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/event_groups.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/event_groups.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/event_groups.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/event_groups.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/list.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/list.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/list.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/list.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/message_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/message_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/message_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/message_buffer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_prototypes.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_prototypes.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_prototypes.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_prototypes.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_wrappers.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_wrappers.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_wrappers.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_wrappers.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/portable.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/portable.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/portable.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/portable.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/projdefs.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/projdefs.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/projdefs.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/projdefs.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/queue.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/queue.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/queue.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/queue.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/semphr.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/semphr.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/semphr.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/semphr.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stack_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stack_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stack_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stack_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stdint.readme b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stdint.readme similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stdint.readme rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stdint.readme diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stream_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stream_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stream_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stream_buffer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/task.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/task.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/task.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/task.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/timers.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/timers.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/timers.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/timers.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/list.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/list.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/list.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/list.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/manifest.yml b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/manifest.yml similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/manifest.yml rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/manifest.yml diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMClang/Use-the-GCC-ports.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMClang/Use-the-GCC-ports.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMClang/Use-the-GCC-ports.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMClang/Use-the-GCC-ports.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/copy_files.py b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/copy_files.py similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/copy_files.py rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/copy_files.py diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/prtmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/prtmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/prtmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/prtmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portcomn.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portcomn.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portcomn.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portcomn.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portasm.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portasm.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portasm.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portasm.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portasm.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portasm.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portasm.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portasm.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/data_model.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/data_model.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/data_model.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/data_model.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portext.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portext.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portext.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portext.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CMakeLists.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CMakeLists.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CMakeLists.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CMakeLists.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Common/mpu_wrappers.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Common/mpu_wrappers.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Common/mpu_wrappers.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Common/mpu_wrappers.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/exception.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/exception.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/exception.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/exception.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_AVRDx/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_AVRDx/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_AVRDx/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_AVRDx/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_Mega0/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_Mega0/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_Mega0/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_Mega0/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MCF5235/readme.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MCF5235/readme.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MCF5235/readme.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MCF5235/readme.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/Documentation.url b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/Documentation.url similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/Documentation.url rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/Documentation.url diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portContext.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portContext.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portContext.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portContext.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/isr_support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/isr_support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/isr_support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/isr_support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/porttrap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/porttrap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/porttrap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/porttrap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portasm.s26 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portasm.s26 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portasm.s26 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portasm.s26 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.s90 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.s90 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.s90 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.s90 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/exception.s82 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/exception.s82 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/exception.s82 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/exception.s82 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/read.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/read.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/read.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/read.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/write.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/write.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/write.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/write.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/porthardware.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/porthardware.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.s90 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.s90 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.s90 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.s90 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portext.s43 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portext.s43 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portext.s43 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portext.s43 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/data_model.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/data_model.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/data_model.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/data_model.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portext.s43 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portext.s43 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portext.s43 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portext.s43 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/Documentation.url b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/Documentation.url similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/Documentation.url rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/Documentation.url diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portContext.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portContext.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portContext.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portContext.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm.s85 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm.s85 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm.s85 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm.s85 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Fx3.s85 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Fx3.s85 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Fx3.s85 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Fx3.s85 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Hx2.s85 b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Hx2.s85 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Hx2.s85 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Hx2.s85 diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Keil/See-also-the-RVDS-directory.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Keil/See-also-the-RVDS-directory.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Keil/See-also-the-RVDS-directory.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Keil/See-also-the-RVDS-directory.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/stdio.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/stdio.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/stdio.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/stdio.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/ReadMe.url b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/ReadMe.url similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/ReadMe.url rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/ReadMe.url diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_1.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_1.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_1.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_1.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_2.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_2.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_2.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_2.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_3.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_3.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_3.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_3.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_4.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_4.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_4.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_4.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_5.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_5.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_5.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_5.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.inc b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.inc similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.inc rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.inc diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portasm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portasm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portasm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portasm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/ARM7/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/ARM7/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/ARM7/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/ARM7/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portext.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portext.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portext.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portext.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port_asm.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port_asm.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port_asm.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port_asm.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/readme.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/readme.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/readme.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/readme.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/.gitignore b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/.gitignore similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/.gitignore rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/.gitignore diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/library.cmake b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/library.cmake similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/library.cmake rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/library.cmake diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/KnownIssues.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/KnownIssues.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/KnownIssues.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/KnownIssues.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/Makefile b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/Makefile similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/Makefile rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/Makefile diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Install.bat b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Install.bat similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Install.bat rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Install.bat diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/addFreeRTOS.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/addFreeRTOS.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/addFreeRTOS.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/addFreeRTOS.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portcomn.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portcomn.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portcomn.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portcomn.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/queue.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/queue.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/queue.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/queue.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/sbom.spdx b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/sbom.spdx similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/sbom.spdx rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/sbom.spdx diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/stream_buffer.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/stream_buffer.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/stream_buffer.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/stream_buffer.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/tasks.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/tasks.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/tasks.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/tasks.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/timers.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/timers.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_files_olivia/tutorial01-stm32-pio-01-02_files_olivia/timers.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/timers.c From cedd047f7097a295083b9032cc5ccc658ae389bc Mon Sep 17 00:00:00 2001 From: Olivia Linden Date: Sat, 25 Mar 2023 10:57:50 +0100 Subject: [PATCH 7/7] modified the files --- .../.cproject | 0 .../.gitmodules | 0 .../.mxproject | 0 .../.project | 0 .../.settings/language.settings.xml | 0 .../.settings/stm32cubeide.project.prefs | 0 .../CMakeLists.txt | 0 .../Core/Inc/FreeRTOSConfig.h | 0 .../Core/Inc/app.h | 0 .../Core/Inc/main.h | 0 .../Core/Inc/stm32f4xx_hal_conf.h | 0 .../Core/Inc/stm32f4xx_it.h | 0 .../Core/Src/app.c | 0 .../Core/Src/freertos.c | 0 .../Core/Src/main.c | 0 .../Core/Src/stm32f4xx_hal_msp.c | 0 .../Core/Src/stm32f4xx_it.c | 0 .../Core/Src/syscalls.c | 0 .../Core/Src/sysmem.c | 0 .../Core/Src/system_stm32f4xx.c | 0 .../Core/Startup/startup_stm32f446retx.s | 0 .../Debug/Core/Src/app.d | 0 .../Debug/Core/Src/app.o | Bin .../Debug/Core/Src/app.su | 0 .../Debug/Core/Src/freertos.d | 0 .../Debug/Core/Src/freertos.o | Bin .../Debug/Core/Src/freertos.su | 0 .../Debug/Core/Src/main.d | 0 .../Debug/Core/Src/main.o | Bin .../Debug/Core/Src/main.su | 0 .../Debug/Core/Src/stm32f4xx_hal_msp.d | 0 .../Debug/Core/Src/stm32f4xx_hal_msp.o | Bin .../Debug/Core/Src/stm32f4xx_hal_msp.su | 0 .../Debug/Core/Src/stm32f4xx_it.d | 0 .../Debug/Core/Src/stm32f4xx_it.o | Bin .../Debug/Core/Src/stm32f4xx_it.su | 0 .../Debug/Core/Src/subdir.mk | 0 .../Debug/Core/Src/syscalls.d | 0 .../Debug/Core/Src/syscalls.o | Bin .../Debug/Core/Src/syscalls.su | 0 .../Debug/Core/Src/sysmem.d | 0 .../Debug/Core/Src/sysmem.o | Bin .../Debug/Core/Src/sysmem.su | 0 .../Debug/Core/Src/system_stm32f4xx.d | 0 .../Debug/Core/Src/system_stm32f4xx.o | Bin .../Debug/Core/Src/system_stm32f4xx.su | 0 .../Debug/Core/Startup/startup_stm32f446retx.d | 0 .../Debug/Core/Startup/startup_stm32f446retx.o | Bin .../Debug/Core/Startup/subdir.mk | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o | Bin .../Src/stm32f4xx_hal_cortex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o | Bin .../Src/stm32f4xx_hal_dma_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su | 0 .../Src/stm32f4xx_hal_flash_ex.d | 0 .../Src/stm32f4xx_hal_flash_ex.o | Bin .../Src/stm32f4xx_hal_flash_ex.su | 0 .../Src/stm32f4xx_hal_flash_ramfunc.d | 0 .../Src/stm32f4xx_hal_flash_ramfunc.o | Bin .../Src/stm32f4xx_hal_flash_ramfunc.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o | Bin .../Src/stm32f4xx_hal_pwr_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o | Bin .../Src/stm32f4xx_hal_rcc_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o | Bin .../Src/stm32f4xx_hal_tim_ex.su | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o | Bin .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su | 0 .../Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk | 0 .../Debug/FreeRTOS_LED.elf | Bin .../Debug/FreeRTOS_LED.list | 0 .../Debug/FreeRTOS_LED.map | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o | Bin .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su | 0 .../FreeRTOS/Source/CMSIS_RTOS/subdir.mk | 0 .../Third_Party/FreeRTOS/Source/croutine.d | 0 .../Third_Party/FreeRTOS/Source/croutine.o | Bin .../Third_Party/FreeRTOS/Source/croutine.su | 0 .../Third_Party/FreeRTOS/Source/event_groups.d | 0 .../Third_Party/FreeRTOS/Source/event_groups.o | Bin .../Third_Party/FreeRTOS/Source/event_groups.su | 0 .../Middlewares/Third_Party/FreeRTOS/Source/list.d | 0 .../Middlewares/Third_Party/FreeRTOS/Source/list.o | Bin .../Middlewares/Third_Party/FreeRTOS/Source/list.su | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o | Bin .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk | 0 .../FreeRTOS/Source/portable/MemMang/heap_4.d | 0 .../FreeRTOS/Source/portable/MemMang/heap_4.o | Bin .../FreeRTOS/Source/portable/MemMang/heap_4.su | 0 .../FreeRTOS/Source/portable/MemMang/subdir.mk | 0 .../Middlewares/Third_Party/FreeRTOS/Source/queue.d | 0 .../Middlewares/Third_Party/FreeRTOS/Source/queue.o | Bin .../Third_Party/FreeRTOS/Source/queue.su | 0 .../Third_Party/FreeRTOS/Source/stream_buffer.d | 0 .../Third_Party/FreeRTOS/Source/stream_buffer.o | Bin .../Third_Party/FreeRTOS/Source/stream_buffer.su | 0 .../Third_Party/FreeRTOS/Source/subdir.mk | 0 .../Middlewares/Third_Party/FreeRTOS/Source/tasks.d | 0 .../Middlewares/Third_Party/FreeRTOS/Source/tasks.o | Bin .../Third_Party/FreeRTOS/Source/tasks.su | 0 .../Third_Party/FreeRTOS/Source/timers.d | 0 .../Third_Party/FreeRTOS/Source/timers.o | Bin .../Third_Party/FreeRTOS/Source/timers.su | 0 .../Debug/makefile | 0 .../Debug/objects.list | 0 .../Debug/objects.mk | 0 .../Debug/sources.mk | 0 .../CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h | 0 .../CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h | 0 .../Device/ST/STM32F4xx/Include/system_stm32f4xx.h | 0 .../Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt | 0 .../Drivers/CMSIS/Include/cmsis_armcc.h | 0 .../Drivers/CMSIS/Include/cmsis_armclang.h | 0 .../Drivers/CMSIS/Include/cmsis_compiler.h | 0 .../Drivers/CMSIS/Include/cmsis_gcc.h | 0 .../Drivers/CMSIS/Include/cmsis_iccarm.h | 0 .../Drivers/CMSIS/Include/cmsis_version.h | 0 .../Drivers/CMSIS/Include/core_armv8mbl.h | 0 .../Drivers/CMSIS/Include/core_armv8mml.h | 0 .../Drivers/CMSIS/Include/core_cm0.h | 0 .../Drivers/CMSIS/Include/core_cm0plus.h | 0 .../Drivers/CMSIS/Include/core_cm1.h | 0 .../Drivers/CMSIS/Include/core_cm23.h | 0 .../Drivers/CMSIS/Include/core_cm3.h | 0 .../Drivers/CMSIS/Include/core_cm33.h | 0 .../Drivers/CMSIS/Include/core_cm4.h | 0 .../Drivers/CMSIS/Include/core_cm7.h | 0 .../Drivers/CMSIS/Include/core_sc000.h | 0 .../Drivers/CMSIS/Include/core_sc300.h | 0 .../Drivers/CMSIS/Include/mpu_armv7.h | 0 .../Drivers/CMSIS/Include/mpu_armv8.h | 0 .../Drivers/CMSIS/Include/tz_context.h | 0 .../Drivers/CMSIS/LICENSE.txt | 0 .../Inc/Legacy/stm32_hal_legacy.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h | 0 .../Inc/stm32f4xx_hal_flash_ex.h | 0 .../Inc/stm32f4xx_hal_flash_ramfunc.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h | 0 .../Inc/stm32f4xx_hal_gpio_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h | 0 .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h | 0 .../Drivers/STM32F4xx_HAL_Driver/LICENSE.txt | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c | 0 .../Src/stm32f4xx_hal_flash_ex.c | 0 .../Src/stm32f4xx_hal_flash_ramfunc.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c | 0 .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c | 0 .../FreeRTOS_LED.ioc | 0 .../FreeRTOS_LED.launch | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c | 0 .../FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h | 0 .../Middlewares/Third_Party/FreeRTOS/Source/LICENSE | 0 .../Third_Party/FreeRTOS/Source/croutine.c | 0 .../Third_Party/FreeRTOS/Source/event_groups.c | 0 .../Third_Party/FreeRTOS/Source/include/FreeRTOS.h | 0 .../FreeRTOS/Source/include/StackMacros.h | 0 .../Third_Party/FreeRTOS/Source/include/atomic.h | 0 .../Third_Party/FreeRTOS/Source/include/croutine.h | 0 .../Source/include/deprecated_definitions.h | 0 .../FreeRTOS/Source/include/event_groups.h | 0 .../Third_Party/FreeRTOS/Source/include/list.h | 0 .../FreeRTOS/Source/include/message_buffer.h | 0 .../FreeRTOS/Source/include/mpu_prototypes.h | 0 .../FreeRTOS/Source/include/mpu_wrappers.h | 0 .../Third_Party/FreeRTOS/Source/include/portable.h | 0 .../Third_Party/FreeRTOS/Source/include/projdefs.h | 0 .../Third_Party/FreeRTOS/Source/include/queue.h | 0 .../Third_Party/FreeRTOS/Source/include/semphr.h | 0 .../FreeRTOS/Source/include/stack_macros.h | 0 .../FreeRTOS/Source/include/stream_buffer.h | 0 .../Third_Party/FreeRTOS/Source/include/task.h | 0 .../Third_Party/FreeRTOS/Source/include/timers.h | 0 .../Middlewares/Third_Party/FreeRTOS/Source/list.c | 0 .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c | 0 .../Source/portable/GCC/ARM_CM4F/portmacro.h | 0 .../FreeRTOS/Source/portable/MemMang/heap_4.c | 0 .../Middlewares/Third_Party/FreeRTOS/Source/queue.c | 0 .../Third_Party/FreeRTOS/Source/stream_buffer.c | 0 .../Middlewares/Third_Party/FreeRTOS/Source/tasks.c | 0 .../Third_Party/FreeRTOS/Source/timers.c | 0 .../STM32F446RETX_FLASH.ld | 0 .../STM32F446RETX_RAM.ld | 0 .../croutine.c | 0 .../event_groups.c | 0 .../include/FreeRTOS.h | 0 .../include/StackMacros.h | 0 .../include/atomic.h | 0 .../include/croutine.h | 0 .../include/deprecated_definitions.h | 0 .../include/event_groups.h | 0 .../include/list.h | 0 .../include/message_buffer.h | 0 .../include/mpu_prototypes.h | 0 .../include/mpu_wrappers.h | 0 .../include/portable.h | 0 .../include/projdefs.h | 0 .../include/queue.h | 0 .../include/semphr.h | 0 .../include/stack_macros.h | 0 .../include/stdint.readme | 0 .../include/stream_buffer.h | 0 .../include/task.h | 0 .../include/timers.h | 0 .../list.c | 0 .../manifest.yml | 0 .../portable/ARMClang/Use-the-GCC-ports.txt | 0 .../portable/ARMv8M/ReadMe.txt | 0 .../portable/ARMv8M/copy_files.py | 0 .../portable/ARMv8M/non_secure/ReadMe.txt | 0 .../portable/ARMv8M/non_secure/port.c | 0 .../non_secure/portable/GCC/ARM_CM23/portasm.c | 0 .../non_secure/portable/GCC/ARM_CM23/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c | 0 .../portable/GCC/ARM_CM23_NTZ/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM33/portasm.c | 0 .../non_secure/portable/GCC/ARM_CM33/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c | 0 .../portable/GCC/ARM_CM33_NTZ/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM55/portmacro.h | 0 .../non_secure/portable/GCC/ARM_CM85/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM23/portasm.s | 0 .../non_secure/portable/IAR/ARM_CM23/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s | 0 .../portable/IAR/ARM_CM23_NTZ/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM33/portasm.s | 0 .../non_secure/portable/IAR/ARM_CM33/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s | 0 .../portable/IAR/ARM_CM33_NTZ/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM55/portmacro.h | 0 .../non_secure/portable/IAR/ARM_CM85/portmacro.h | 0 .../portable/ARMv8M/non_secure/portasm.h | 0 .../portable/ARMv8M/non_secure/portmacrocommon.h | 0 .../portable/ARMv8M/secure/ReadMe.txt | 0 .../portable/GCC/ARM_CM23/secure_context_port.c | 0 .../portable/GCC/ARM_CM33/secure_context_port.c | 0 .../portable/IAR/ARM_CM23/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM33/secure_context_port_asm.s | 0 .../portable/ARMv8M/secure/context/secure_context.c | 0 .../portable/ARMv8M/secure/context/secure_context.h | 0 .../portable/ARMv8M/secure/heap/secure_heap.c | 0 .../portable/ARMv8M/secure/heap/secure_heap.h | 0 .../portable/ARMv8M/secure/init/secure_init.c | 0 .../portable/ARMv8M/secure/init/secure_init.h | 0 .../ARMv8M/secure/macros/secure_port_macros.h | 0 .../portable/BCC/16BitDOS/Flsh186/port.c | 0 .../portable/BCC/16BitDOS/Flsh186/prtmacro.h | 0 .../portable/BCC/16BitDOS/PC/port.c | 0 .../portable/BCC/16BitDOS/PC/prtmacro.h | 0 .../portable/BCC/16BitDOS/common/portasm.h | 0 .../portable/BCC/16BitDOS/common/portcomn.c | 0 .../portable/CCS/ARM_CM3/port.c | 0 .../portable/CCS/ARM_CM3/portasm.asm | 0 .../portable/CCS/ARM_CM3/portmacro.h | 0 .../portable/CCS/ARM_CM4F/port.c | 0 .../portable/CCS/ARM_CM4F/portasm.asm | 0 .../portable/CCS/ARM_CM4F/portmacro.h | 0 .../portable/CCS/ARM_Cortex-R4/port.c | 0 .../portable/CCS/ARM_Cortex-R4/portASM.asm | 0 .../portable/CCS/ARM_Cortex-R4/portmacro.h | 0 .../portable/CCS/MSP430X/data_model.h | 0 .../portable/CCS/MSP430X/port.c | 0 .../portable/CCS/MSP430X/portext.asm | 0 .../portable/CCS/MSP430X/portmacro.h | 0 .../portable/CMakeLists.txt | 0 .../portable/CodeWarrior/ColdFire_V1/port.c | 0 .../portable/CodeWarrior/ColdFire_V1/portasm.S | 0 .../portable/CodeWarrior/ColdFire_V1/portmacro.h | 0 .../portable/CodeWarrior/ColdFire_V2/port.c | 0 .../portable/CodeWarrior/ColdFire_V2/portasm.S | 0 .../portable/CodeWarrior/ColdFire_V2/portmacro.h | 0 .../portable/CodeWarrior/HCS12/port.c | 0 .../portable/CodeWarrior/HCS12/portmacro.h | 0 .../portable/Common/mpu_wrappers.c | 0 .../portable/GCC/ARM7_AT91FR40008/port.c | 0 .../portable/GCC/ARM7_AT91FR40008/portISR.c | 0 .../portable/GCC/ARM7_AT91FR40008/portmacro.h | 0 .../portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h | 0 .../portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h | 0 .../portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c | 0 .../portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h | 0 .../portable/GCC/ARM7_AT91SAM7S/port.c | 0 .../portable/GCC/ARM7_AT91SAM7S/portISR.c | 0 .../portable/GCC/ARM7_AT91SAM7S/portmacro.h | 0 .../portable/GCC/ARM7_LPC2000/port.c | 0 .../portable/GCC/ARM7_LPC2000/portISR.c | 0 .../portable/GCC/ARM7_LPC2000/portmacro.h | 0 .../portable/GCC/ARM7_LPC23xx/port.c | 0 .../portable/GCC/ARM7_LPC23xx/portISR.c | 0 .../portable/GCC/ARM7_LPC23xx/portmacro.h | 0 .../portable/GCC/ARM_CA53_64_BIT/port.c | 0 .../portable/GCC/ARM_CA53_64_BIT/portASM.S | 0 .../portable/GCC/ARM_CA53_64_BIT/portmacro.h | 0 .../portable/GCC/ARM_CA53_64_BIT_SRE/port.c | 0 .../portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S | 0 .../portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h | 0 .../portable/GCC/ARM_CA9/port.c | 0 .../portable/GCC/ARM_CA9/portASM.S | 0 .../portable/GCC/ARM_CA9/portmacro.h | 0 .../portable/GCC/ARM_CM0/port.c | 0 .../portable/GCC/ARM_CM0/portmacro.h | 0 .../portable/GCC/ARM_CM23/non_secure/port.c | 0 .../portable/GCC/ARM_CM23/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM23/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM23/non_secure/portmacro.h | 0 .../GCC/ARM_CM23/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM23/secure/secure_context.c | 0 .../portable/GCC/ARM_CM23/secure/secure_context.h | 0 .../GCC/ARM_CM23/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM23/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM23/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM23/secure/secure_init.c | 0 .../portable/GCC/ARM_CM23/secure/secure_init.h | 0 .../GCC/ARM_CM23/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM23_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM23_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM3/port.c | 0 .../portable/GCC/ARM_CM3/portmacro.h | 0 .../portable/GCC/ARM_CM33/non_secure/port.c | 0 .../portable/GCC/ARM_CM33/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM33/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM33/non_secure/portmacro.h | 0 .../GCC/ARM_CM33/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM33/secure/secure_context.c | 0 .../portable/GCC/ARM_CM33/secure/secure_context.h | 0 .../GCC/ARM_CM33/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM33/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM33/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM33/secure/secure_init.c | 0 .../portable/GCC/ARM_CM33/secure/secure_init.h | 0 .../GCC/ARM_CM33/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM33_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM33_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM3_MPU/port.c | 0 .../portable/GCC/ARM_CM3_MPU/portmacro.h | 0 .../portable/GCC/ARM_CM4F/port.c | 0 .../portable/GCC/ARM_CM4F/portmacro.h | 0 .../portable/GCC/ARM_CM4_MPU/port.c | 0 .../portable/GCC/ARM_CM4_MPU/portmacro.h | 0 .../portable/GCC/ARM_CM55/non_secure/port.c | 0 .../portable/GCC/ARM_CM55/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM55/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM55/non_secure/portmacro.h | 0 .../GCC/ARM_CM55/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM55/secure/secure_context.c | 0 .../portable/GCC/ARM_CM55/secure/secure_context.h | 0 .../GCC/ARM_CM55/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM55/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM55/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM55/secure/secure_init.c | 0 .../portable/GCC/ARM_CM55/secure/secure_init.h | 0 .../GCC/ARM_CM55/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM55_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM55_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM7/ReadMe.txt | 0 .../portable/GCC/ARM_CM7/r0p1/port.c | 0 .../portable/GCC/ARM_CM7/r0p1/portmacro.h | 0 .../portable/GCC/ARM_CM85/non_secure/port.c | 0 .../portable/GCC/ARM_CM85/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM85/non_secure/portasm.h | 0 .../portable/GCC/ARM_CM85/non_secure/portmacro.h | 0 .../GCC/ARM_CM85/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CM85/secure/secure_context.c | 0 .../portable/GCC/ARM_CM85/secure/secure_context.h | 0 .../GCC/ARM_CM85/secure/secure_context_port.c | 0 .../portable/GCC/ARM_CM85/secure/secure_heap.c | 0 .../portable/GCC/ARM_CM85/secure/secure_heap.h | 0 .../portable/GCC/ARM_CM85/secure/secure_init.c | 0 .../portable/GCC/ARM_CM85/secure/secure_init.h | 0 .../GCC/ARM_CM85/secure/secure_port_macros.h | 0 .../portable/GCC/ARM_CM85_NTZ/non_secure/port.c | 0 .../portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c | 0 .../portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h | 0 .../GCC/ARM_CM85_NTZ/non_secure/portmacro.h | 0 .../GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h | 0 .../portable/GCC/ARM_CR5/port.c | 0 .../portable/GCC/ARM_CR5/portASM.S | 0 .../portable/GCC/ARM_CR5/portmacro.h | 0 .../portable/GCC/ARM_CRx_No_GIC/port.c | 0 .../portable/GCC/ARM_CRx_No_GIC/portASM.S | 0 .../portable/GCC/ARM_CRx_No_GIC/portmacro.h | 0 .../portable/GCC/ATMega323/port.c | 0 .../portable/GCC/ATMega323/portmacro.h | 0 .../portable/GCC/AVR32_UC3/exception.S | 0 .../portable/GCC/AVR32_UC3/port.c | 0 .../portable/GCC/AVR32_UC3/portmacro.h | 0 .../portable/GCC/AVR_AVRDx/README.md | 0 .../portable/GCC/AVR_Mega0/README.md | 0 .../portable/GCC/CORTUS_APS3/port.c | 0 .../portable/GCC/CORTUS_APS3/portmacro.h | 0 .../portable/GCC/ColdFire_V2/port.c | 0 .../portable/GCC/ColdFire_V2/portasm.S | 0 .../portable/GCC/ColdFire_V2/portmacro.h | 0 .../portable/GCC/H8S2329/port.c | 0 .../portable/GCC/H8S2329/portmacro.h | 0 .../portable/GCC/HCS12/port.c | 0 .../portable/GCC/HCS12/portmacro.h | 0 .../portable/GCC/IA32_flat/ISR_Support.h | 0 .../portable/GCC/IA32_flat/port.c | 0 .../portable/GCC/IA32_flat/portASM.S | 0 .../portable/GCC/IA32_flat/portmacro.h | 0 .../portable/GCC/MCF5235/readme.md | 0 .../portable/GCC/MSP430F449/port.c | 0 .../portable/GCC/MSP430F449/portmacro.h | 0 .../portable/GCC/MicroBlaze/port.c | 0 .../portable/GCC/MicroBlaze/portasm.s | 0 .../portable/GCC/MicroBlaze/portmacro.h | 0 .../portable/GCC/MicroBlazeV8/port.c | 0 .../portable/GCC/MicroBlazeV8/port_exceptions.c | 0 .../portable/GCC/MicroBlazeV8/portasm.S | 0 .../portable/GCC/MicroBlazeV8/portmacro.h | 0 .../portable/GCC/MicroBlazeV9/port.c | 0 .../portable/GCC/MicroBlazeV9/port_exceptions.c | 0 .../portable/GCC/MicroBlazeV9/portasm.S | 0 .../portable/GCC/MicroBlazeV9/portmacro.h | 0 .../portable/GCC/NiosII/port.c | 0 .../portable/GCC/NiosII/port_asm.S | 0 .../portable/GCC/NiosII/portmacro.h | 0 .../portable/GCC/PPC405_Xilinx/FPU_Macros.h | 0 .../portable/GCC/PPC405_Xilinx/port.c | 0 .../portable/GCC/PPC405_Xilinx/portasm.S | 0 .../portable/GCC/PPC405_Xilinx/portmacro.h | 0 .../portable/GCC/PPC440_Xilinx/FPU_Macros.h | 0 .../portable/GCC/PPC440_Xilinx/port.c | 0 .../portable/GCC/PPC440_Xilinx/portasm.S | 0 .../portable/GCC/PPC440_Xilinx/portmacro.h | 0 .../portable/GCC/RISC-V/Documentation.url | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../GCC/RISC-V/chip_specific_extensions/readme.txt | 0 .../portable/GCC/RISC-V/port.c | 0 .../portable/GCC/RISC-V/portASM.S | 0 .../portable/GCC/RISC-V/portContext.h | 0 .../portable/GCC/RISC-V/portmacro.h | 0 .../portable/GCC/RISC-V/readme.txt | 0 .../portable/GCC/RL78/isr_support.h | 0 .../portable/GCC/RL78/port.c | 0 .../portable/GCC/RL78/portasm.S | 0 .../portable/GCC/RL78/portmacro.h | 0 .../portable/GCC/RX100/port.c | 0 .../portable/GCC/RX100/portmacro.h | 0 .../portable/GCC/RX100/readme.txt | 0 .../portable/GCC/RX200/port.c | 0 .../portable/GCC/RX200/portmacro.h | 0 .../portable/GCC/RX600/port.c | 0 .../portable/GCC/RX600/portmacro.h | 0 .../portable/GCC/RX600/readme.txt | 0 .../portable/GCC/RX600v2/port.c | 0 .../portable/GCC/RX600v2/portmacro.h | 0 .../portable/GCC/RX600v2/readme.txt | 0 .../portable/GCC/RX700v3_DPFPU/port.c | 0 .../portable/GCC/RX700v3_DPFPU/portmacro.h | 0 .../portable/GCC/RX700v3_DPFPU/readme.txt | 0 .../portable/GCC/STR75x/port.c | 0 .../portable/GCC/STR75x/portISR.c | 0 .../portable/GCC/STR75x/portmacro.h | 0 .../portable/GCC/TriCore_1782/port.c | 0 .../portable/GCC/TriCore_1782/portmacro.h | 0 .../portable/GCC/TriCore_1782/porttrap.c | 0 .../portable/IAR/78K0R/ISR_Support.h | 0 .../portable/IAR/78K0R/port.c | 0 .../portable/IAR/78K0R/portasm.s26 | 0 .../portable/IAR/78K0R/portmacro.h | 0 .../portable/IAR/ARM_CA5_No_GIC/port.c | 0 .../portable/IAR/ARM_CA5_No_GIC/portASM.h | 0 .../portable/IAR/ARM_CA5_No_GIC/portASM.s | 0 .../portable/IAR/ARM_CA5_No_GIC/portmacro.h | 0 .../portable/IAR/ARM_CA9/port.c | 0 .../portable/IAR/ARM_CA9/portASM.h | 0 .../portable/IAR/ARM_CA9/portASM.s | 0 .../portable/IAR/ARM_CA9/portmacro.h | 0 .../portable/IAR/ARM_CM0/port.c | 0 .../portable/IAR/ARM_CM0/portasm.s | 0 .../portable/IAR/ARM_CM0/portmacro.h | 0 .../portable/IAR/ARM_CM23/non_secure/port.c | 0 .../portable/IAR/ARM_CM23/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM23/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM23/non_secure/portmacro.h | 0 .../IAR/ARM_CM23/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM23/secure/secure_context.c | 0 .../portable/IAR/ARM_CM23/secure/secure_context.h | 0 .../IAR/ARM_CM23/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM23/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM23/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM23/secure/secure_init.c | 0 .../portable/IAR/ARM_CM23/secure/secure_init.h | 0 .../IAR/ARM_CM23/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM23_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM23_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM3/port.c | 0 .../portable/IAR/ARM_CM3/portasm.s | 0 .../portable/IAR/ARM_CM3/portmacro.h | 0 .../portable/IAR/ARM_CM33/non_secure/port.c | 0 .../portable/IAR/ARM_CM33/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM33/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM33/non_secure/portmacro.h | 0 .../IAR/ARM_CM33/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM33/secure/secure_context.c | 0 .../portable/IAR/ARM_CM33/secure/secure_context.h | 0 .../IAR/ARM_CM33/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM33/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM33/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM33/secure/secure_init.c | 0 .../portable/IAR/ARM_CM33/secure/secure_init.h | 0 .../IAR/ARM_CM33/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM33_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM33_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM4F/port.c | 0 .../portable/IAR/ARM_CM4F/portasm.s | 0 .../portable/IAR/ARM_CM4F/portmacro.h | 0 .../portable/IAR/ARM_CM4F_MPU/port.c | 0 .../portable/IAR/ARM_CM4F_MPU/portasm.s | 0 .../portable/IAR/ARM_CM4F_MPU/portmacro.h | 0 .../portable/IAR/ARM_CM55/non_secure/port.c | 0 .../portable/IAR/ARM_CM55/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM55/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM55/non_secure/portmacro.h | 0 .../IAR/ARM_CM55/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM55/secure/secure_context.c | 0 .../portable/IAR/ARM_CM55/secure/secure_context.h | 0 .../IAR/ARM_CM55/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM55/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM55/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM55/secure/secure_init.c | 0 .../portable/IAR/ARM_CM55/secure/secure_init.h | 0 .../IAR/ARM_CM55/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM55_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM55_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM7/ReadMe.txt | 0 .../portable/IAR/ARM_CM7/r0p1/port.c | 0 .../portable/IAR/ARM_CM7/r0p1/portasm.s | 0 .../portable/IAR/ARM_CM7/r0p1/portmacro.h | 0 .../portable/IAR/ARM_CM85/non_secure/port.c | 0 .../portable/IAR/ARM_CM85/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM85/non_secure/portasm.s | 0 .../portable/IAR/ARM_CM85/non_secure/portmacro.h | 0 .../IAR/ARM_CM85/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CM85/secure/secure_context.c | 0 .../portable/IAR/ARM_CM85/secure/secure_context.h | 0 .../IAR/ARM_CM85/secure/secure_context_port_asm.s | 0 .../portable/IAR/ARM_CM85/secure/secure_heap.c | 0 .../portable/IAR/ARM_CM85/secure/secure_heap.h | 0 .../portable/IAR/ARM_CM85/secure/secure_init.c | 0 .../portable/IAR/ARM_CM85/secure/secure_init.h | 0 .../IAR/ARM_CM85/secure/secure_port_macros.h | 0 .../portable/IAR/ARM_CM85_NTZ/non_secure/port.c | 0 .../portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h | 0 .../portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s | 0 .../IAR/ARM_CM85_NTZ/non_secure/portmacro.h | 0 .../IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h | 0 .../portable/IAR/ARM_CRx_No_GIC/port.c | 0 .../portable/IAR/ARM_CRx_No_GIC/portASM.s | 0 .../portable/IAR/ARM_CRx_No_GIC/portmacro.h | 0 .../portable/IAR/ATMega323/port.c | 0 .../portable/IAR/ATMega323/portmacro.h | 0 .../portable/IAR/ATMega323/portmacro.s90 | 0 .../portable/IAR/AVR32_UC3/exception.s82 | 0 .../portable/IAR/AVR32_UC3/port.c | 0 .../portable/IAR/AVR32_UC3/portmacro.h | 0 .../portable/IAR/AVR32_UC3/read.c | 0 .../portable/IAR/AVR32_UC3/write.c | 0 .../portable/IAR/AVR_AVRDx/port.c | 0 .../portable/IAR/AVR_AVRDx/porthardware.h | 0 .../portable/IAR/AVR_AVRDx/portmacro.h | 0 .../portable/IAR/AVR_AVRDx/portmacro.s90 | 0 .../portable/IAR/AVR_Mega0/port.c | 0 .../portable/IAR/AVR_Mega0/porthardware.h | 0 .../portable/IAR/AVR_Mega0/portmacro.h | 0 .../portable/IAR/AVR_Mega0/portmacro.s90 | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7S64.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X128.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X256.h | 0 .../portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h | 0 .../portable/IAR/AtmelSAM7S64/ISR_Support.h | 0 .../portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h | 0 .../portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h | 0 .../portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h | 0 .../portable/IAR/AtmelSAM7S64/port.c | 0 .../portable/IAR/AtmelSAM7S64/portasm.s79 | 0 .../portable/IAR/AtmelSAM7S64/portmacro.h | 0 .../portable/IAR/AtmelSAM9XE/ISR_Support.h | 0 .../portable/IAR/AtmelSAM9XE/port.c | 0 .../portable/IAR/AtmelSAM9XE/portasm.s79 | 0 .../portable/IAR/AtmelSAM9XE/portmacro.h | 0 .../portable/IAR/LPC2000/ISR_Support.h | 0 .../portable/IAR/LPC2000/port.c | 0 .../portable/IAR/LPC2000/portasm.s79 | 0 .../portable/IAR/LPC2000/portmacro.h | 0 .../portable/IAR/MSP430/port.c | 0 .../portable/IAR/MSP430/portasm.h | 0 .../portable/IAR/MSP430/portext.s43 | 0 .../portable/IAR/MSP430/portmacro.h | 0 .../portable/IAR/MSP430X/data_model.h | 0 .../portable/IAR/MSP430X/port.c | 0 .../portable/IAR/MSP430X/portext.s43 | 0 .../portable/IAR/MSP430X/portmacro.h | 0 .../portable/IAR/RISC-V/Documentation.url | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../IAR/RISC-V/chip_specific_extensions/readme.txt | 0 .../portable/IAR/RISC-V/port.c | 0 .../portable/IAR/RISC-V/portASM.s | 0 .../portable/IAR/RISC-V/portContext.h | 0 .../portable/IAR/RISC-V/portmacro.h | 0 .../portable/IAR/RISC-V/readme.txt | 0 .../portable/IAR/RL78/port.c | 0 .../portable/IAR/RL78/portasm.s | 0 .../portable/IAR/RL78/portmacro.h | 0 .../portable/IAR/RX100/port.c | 0 .../portable/IAR/RX100/port_asm.s | 0 .../portable/IAR/RX100/portmacro.h | 0 .../portable/IAR/RX100/readme.txt | 0 .../portable/IAR/RX600/port.c | 0 .../portable/IAR/RX600/port_asm.s | 0 .../portable/IAR/RX600/portmacro.h | 0 .../portable/IAR/RX600/readme.txt | 0 .../portable/IAR/RX700v3_DPFPU/port.c | 0 .../portable/IAR/RX700v3_DPFPU/portmacro.h | 0 .../portable/IAR/RX700v3_DPFPU/readme.txt | 0 .../portable/IAR/RXv2/port.c | 0 .../portable/IAR/RXv2/port_asm.s | 0 .../portable/IAR/RXv2/portmacro.h | 0 .../portable/IAR/RXv2/readme.txt | 0 .../portable/IAR/STR71x/ISR_Support.h | 0 .../portable/IAR/STR71x/port.c | 0 .../portable/IAR/STR71x/portasm.s79 | 0 .../portable/IAR/STR71x/portmacro.h | 0 .../portable/IAR/STR75x/ISR_Support.h | 0 .../portable/IAR/STR75x/port.c | 0 .../portable/IAR/STR75x/portasm.s79 | 0 .../portable/IAR/STR75x/portmacro.h | 0 .../portable/IAR/STR91x/ISR_Support.h | 0 .../portable/IAR/STR91x/port.c | 0 .../portable/IAR/STR91x/portasm.s79 | 0 .../portable/IAR/STR91x/portmacro.h | 0 .../portable/IAR/V850ES/ISR_Support.h | 0 .../portable/IAR/V850ES/port.c | 0 .../portable/IAR/V850ES/portasm.s85 | 0 .../portable/IAR/V850ES/portasm_Fx3.s85 | 0 .../portable/IAR/V850ES/portasm_Hx2.s85 | 0 .../portable/IAR/V850ES/portmacro.h | 0 .../portable/Keil/See-also-the-RVDS-directory.txt | 0 .../portable/MPLAB/PIC18F/port.c | 0 .../portable/MPLAB/PIC18F/portmacro.h | 0 .../portable/MPLAB/PIC18F/stdio.h | 0 .../portable/MPLAB/PIC24_dsPIC/port.c | 0 .../portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S | 0 .../portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S | 0 .../portable/MPLAB/PIC24_dsPIC/portmacro.h | 0 .../portable/MPLAB/PIC32MEC14xx/ISR_Support.h | 0 .../portable/MPLAB/PIC32MEC14xx/port.c | 0 .../portable/MPLAB/PIC32MEC14xx/port_asm.S | 0 .../portable/MPLAB/PIC32MEC14xx/portmacro.h | 0 .../portable/MPLAB/PIC32MX/ISR_Support.h | 0 .../portable/MPLAB/PIC32MX/port.c | 0 .../portable/MPLAB/PIC32MX/port_asm.S | 0 .../portable/MPLAB/PIC32MX/portmacro.h | 0 .../portable/MPLAB/PIC32MZ/ISR_Support.h | 0 .../portable/MPLAB/PIC32MZ/port.c | 0 .../portable/MPLAB/PIC32MZ/port_asm.S | 0 .../portable/MPLAB/PIC32MZ/portmacro.h | 0 .../portable/MSVC-MingW/port.c | 0 .../portable/MSVC-MingW/portmacro.h | 0 .../portable/MemMang/ReadMe.url | 0 .../portable/MemMang/heap_1.c | 0 .../portable/MemMang/heap_2.c | 0 .../portable/MemMang/heap_3.c | 0 .../portable/MemMang/heap_4.c | 0 .../portable/MemMang/heap_5.c | 0 .../portable/MikroC/ARM_CM4F/port.c | 0 .../portable/MikroC/ARM_CM4F/portmacro.h | 0 .../portable/Paradigm/Tern_EE/large_untested/port.c | 0 .../Paradigm/Tern_EE/large_untested/portasm.h | 0 .../Paradigm/Tern_EE/large_untested/portmacro.h | 0 .../portable/Paradigm/Tern_EE/small/port.c | 0 .../portable/Paradigm/Tern_EE/small/portasm.h | 0 .../portable/Paradigm/Tern_EE/small/portmacro.h | 0 .../portable/RVDS/ARM7_LPC21xx/port.c | 0 .../portable/RVDS/ARM7_LPC21xx/portASM.s | 0 .../portable/RVDS/ARM7_LPC21xx/portmacro.h | 0 .../portable/RVDS/ARM7_LPC21xx/portmacro.inc | 0 .../portable/RVDS/ARM_CA9/port.c | 0 .../portable/RVDS/ARM_CA9/portASM.s | 0 .../portable/RVDS/ARM_CA9/portmacro.h | 0 .../portable/RVDS/ARM_CA9/portmacro.inc | 0 .../portable/RVDS/ARM_CM0/port.c | 0 .../portable/RVDS/ARM_CM0/portmacro.h | 0 .../portable/RVDS/ARM_CM3/port.c | 0 .../portable/RVDS/ARM_CM3/portmacro.h | 0 .../portable/RVDS/ARM_CM4F/port.c | 0 .../portable/RVDS/ARM_CM4F/portmacro.h | 0 .../portable/RVDS/ARM_CM4_MPU/port.c | 0 .../portable/RVDS/ARM_CM4_MPU/portmacro.h | 0 .../portable/RVDS/ARM_CM7/ReadMe.txt | 0 .../portable/RVDS/ARM_CM7/r0p1/port.c | 0 .../portable/RVDS/ARM_CM7/r0p1/portmacro.h | 0 .../portable/Renesas/RX100/port.c | 0 .../portable/Renesas/RX100/port_asm.src | 0 .../portable/Renesas/RX100/portmacro.h | 0 .../portable/Renesas/RX100/readme.txt | 0 .../portable/Renesas/RX200/port.c | 0 .../portable/Renesas/RX200/port_asm.src | 0 .../portable/Renesas/RX200/portmacro.h | 0 .../portable/Renesas/RX200/readme.txt | 0 .../portable/Renesas/RX600/port.c | 0 .../portable/Renesas/RX600/port_asm.src | 0 .../portable/Renesas/RX600/portmacro.h | 0 .../portable/Renesas/RX600/readme.txt | 0 .../portable/Renesas/RX600v2/port.c | 0 .../portable/Renesas/RX600v2/port_asm.src | 0 .../portable/Renesas/RX600v2/portmacro.h | 0 .../portable/Renesas/RX600v2/readme.txt | 0 .../portable/Renesas/RX700v3_DPFPU/port.c | 0 .../portable/Renesas/RX700v3_DPFPU/port_asm.src | 0 .../portable/Renesas/RX700v3_DPFPU/portmacro.h | 0 .../portable/Renesas/RX700v3_DPFPU/readme.txt | 0 .../portable/Renesas/SH2A_FPU/ISR_Support.inc | 0 .../portable/Renesas/SH2A_FPU/port.c | 0 .../portable/Renesas/SH2A_FPU/portasm.src | 0 .../portable/Renesas/SH2A_FPU/portmacro.h | 0 .../portable/Rowley/ARM7/readme.txt | 0 .../portable/Rowley/MSP430F449/port.c | 0 .../portable/Rowley/MSP430F449/portasm.h | 0 .../portable/Rowley/MSP430F449/portext.asm | 0 .../portable/Rowley/MSP430F449/portmacro.h | 0 .../portable/SDCC/Cygnal/port.c | 0 .../portable/SDCC/Cygnal/portmacro.h | 0 .../portable/Softune/MB91460/__STD_LIB_sbrk.c | 0 .../portable/Softune/MB91460/port.c | 0 .../portable/Softune/MB91460/portmacro.h | 0 .../portable/Softune/MB96340/__STD_LIB_sbrk.c | 0 .../portable/Softune/MB96340/port.c | 0 .../portable/Softune/MB96340/portmacro.h | 0 .../portable/Tasking/ARM_CM4F/port.c | 0 .../portable/Tasking/ARM_CM4F/port_asm.asm | 0 .../portable/Tasking/ARM_CM4F/portmacro.h | 0 .../portable/ThirdParty/CDK/T-HEAD_CK802/port.c | 0 .../portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S | 0 .../ThirdParty/CDK/T-HEAD_CK802/portmacro.h | 0 .../.github/CODE_OF_CONDUCT.md | 0 .../.github/CONTRIBUTING.md | 0 .../Community-Supported-Ports/.github/SECURITY.md | 0 .../.github/pull_request_template.md | 0 .../CCS/C2000_C28x/README.md | 0 .../Community-Supported-Ports/CCS/C2000_C28x/port.c | 0 .../CCS/C2000_C28x/portasm.asm | 0 .../CCS/C2000_C28x/portmacro.h | 0 .../GCC/MSP430FR5969/port.c | 0 .../GCC/MSP430FR5969/portmacro.h | 0 .../freertos_risc_v_chip_specific_extensions.h | 0 .../GCC/TriCore_38xa/port.c | 0 .../GCC/TriCore_38xa/port.h | 0 .../GCC/TriCore_38xa/portmacro.h | 0 .../GCC/TriCore_38xa/porttrap.c | 0 .../GCC/TriCore_38xa/readme.txt | 0 .../ThirdParty/Community-Supported-Ports/LICENSE | 0 .../ThirdParty/Community-Supported-Ports/README.md | 0 .../Community-Supported-Ports/Z88DK/Z180/port.c | 0 .../Z88DK/Z180/portmacro.h | 0 .../Community-Supported-Ports/Z88DK/Z180/readme.md | 0 .../GCC/ARC_EM_HS/arc_freertos_exceptions.c | 0 .../GCC/ARC_EM_HS/arc_freertos_exceptions.h | 0 .../portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s | 0 .../ThirdParty/GCC/ARC_EM_HS/freertos_tls.c | 0 .../portable/ThirdParty/GCC/ARC_EM_HS/port.c | 0 .../portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h | 0 .../ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c | 0 .../ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h | 0 .../portable/ThirdParty/GCC/ARC_v1/arc_support.s | 0 .../portable/ThirdParty/GCC/ARC_v1/port.c | 0 .../portable/ThirdParty/GCC/ARC_v1/portmacro.h | 0 .../portable/ThirdParty/GCC/ARM_TFM/README.md | 0 .../ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c | 0 .../portable/ThirdParty/GCC/ATmega/port.c | 0 .../portable/ThirdParty/GCC/ATmega/portmacro.h | 0 .../portable/ThirdParty/GCC/ATmega/readme.md | 0 .../GCC/Posix/FreeRTOS-simulator-for-Linux.url | 0 .../portable/ThirdParty/GCC/Posix/port.c | 0 .../portable/ThirdParty/GCC/Posix/portmacro.h | 0 .../ThirdParty/GCC/Posix/utils/wait_for_event.c | 0 .../ThirdParty/GCC/Posix/utils/wait_for_event.h | 0 ...README-for-info-on-official-MIT-license-port.txt | 0 .../portable/ThirdParty/GCC/RP2040/.gitignore | 0 .../portable/ThirdParty/GCC/RP2040/CMakeLists.txt | 0 .../GCC/RP2040/FreeRTOS_Kernel_import.cmake | 0 .../portable/ThirdParty/GCC/RP2040/LICENSE.md | 0 .../portable/ThirdParty/GCC/RP2040/README.md | 0 .../ThirdParty/GCC/RP2040/idle_task_static_memory.c | 0 .../GCC/RP2040/include/freertos_sdk_config.h | 0 .../ThirdParty/GCC/RP2040/include/portmacro.h | 0 .../ThirdParty/GCC/RP2040/include/rp2040_config.h | 0 .../portable/ThirdParty/GCC/RP2040/library.cmake | 0 .../ThirdParty/GCC/RP2040/pico_sdk_import.cmake | 0 .../portable/ThirdParty/GCC/RP2040/port.c | 0 .../ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c | 0 .../GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h | 0 .../GCC/Xtensa_ESP32/include/port_systick.h | 0 .../GCC/Xtensa_ESP32/include/portbenchmark.h | 0 .../ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h | 0 .../GCC/Xtensa_ESP32/include/xt_asm_utils.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_api.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_config.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_context.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_rtos.h | 0 .../GCC/Xtensa_ESP32/include/xtensa_timer.h | 0 .../portable/ThirdParty/GCC/Xtensa_ESP32/port.c | 0 .../ThirdParty/GCC/Xtensa_ESP32/port_common.c | 0 .../ThirdParty/GCC/Xtensa_ESP32/port_systick.c | 0 .../portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S | 0 .../ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h | 0 .../ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h | 0 .../ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S | 0 .../ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c | 0 .../GCC/Xtensa_ESP32/xtensa_loadstore_handler.S | 0 .../GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c | 0 .../GCC/Xtensa_ESP32/xtensa_vector_defaults.S | 0 .../ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S | 0 .../portable/ThirdParty/KnownIssues.md | 0 .../.github/CODE_OF_CONDUCT.md | 0 .../Partner-Supported-Ports/.github/CONTRIBUTING.md | 0 .../Partner-Supported-Ports/.github/SECURITY.md | 0 .../.github/pull_request_template.md | 0 .../Partner-Supported-Ports/GCC/AVR_AVRDx/port.c | 0 .../GCC/AVR_AVRDx/porthardware.h | 0 .../GCC/AVR_AVRDx/portmacro.h | 0 .../Partner-Supported-Ports/GCC/AVR_Mega0/port.c | 0 .../GCC/AVR_Mega0/porthardware.h | 0 .../GCC/AVR_Mega0/portmacro.h | 0 .../ThirdParty/Partner-Supported-Ports/LICENSE | 0 .../ThirdParty/Partner-Supported-Ports/README.md | 0 .../portable/ThirdParty/README.md | 0 .../portable/ThirdParty/XCC/Xtensa/Makefile | 0 .../portable/ThirdParty/XCC/Xtensa/port.c | 0 .../portable/ThirdParty/XCC/Xtensa/portasm.S | 0 .../portable/ThirdParty/XCC/Xtensa/portbenchmark.h | 0 .../portable/ThirdParty/XCC/Xtensa/portclib.c | 0 .../portable/ThirdParty/XCC/Xtensa/portmacro.h | 0 .../portable/ThirdParty/XCC/Xtensa/porttrace.h | 0 .../ThirdParty/XCC/Xtensa/readme_xtensa.txt | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_api.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_config.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_context.S | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_context.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_init.c | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_intr.c | 0 .../ThirdParty/XCC/Xtensa/xtensa_intr_asm.S | 0 .../ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_timer.h | 0 .../portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S | 0 .../portable/WizC/PIC18/Drivers/Tick/Tick.c | 0 .../portable/WizC/PIC18/Drivers/Tick/isrTick.c | 0 .../portable/WizC/PIC18/Install.bat | 0 .../portable/WizC/PIC18/addFreeRTOS.h | 0 .../portable/WizC/PIC18/port.c | 0 .../portable/WizC/PIC18/portmacro.h | 0 .../portable/oWatcom/16BitDOS/Flsh186/port.c | 0 .../portable/oWatcom/16BitDOS/Flsh186/portmacro.h | 0 .../portable/oWatcom/16BitDOS/PC/port.c | 0 .../portable/oWatcom/16BitDOS/PC/portmacro.h | 0 .../portable/oWatcom/16BitDOS/common/portasm.h | 0 .../portable/oWatcom/16BitDOS/common/portcomn.c | 0 .../portable/readme.txt | 0 .../queue.c | 0 .../sbom.spdx | 0 .../stream_buffer.c | 0 .../tasks.c | 0 .../timers.c | 0 952 files changed, 0 insertions(+), 0 deletions(-) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/.cproject (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/.gitmodules (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/.mxproject (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/.project (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/.settings/language.settings.xml (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/.settings/stm32cubeide.project.prefs (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/CMakeLists.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Inc/FreeRTOSConfig.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Inc/app.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Inc/main.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Inc/stm32f4xx_hal_conf.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Inc/stm32f4xx_it.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Src/app.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Src/freertos.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Src/main.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Src/stm32f4xx_hal_msp.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Src/stm32f4xx_it.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Src/syscalls.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Src/sysmem.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Src/system_stm32f4xx.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Core/Startup/startup_stm32f446retx.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/app.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/app.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/app.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/freertos.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/freertos.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/freertos.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/main.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/main.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/main.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/stm32f4xx_hal_msp.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/stm32f4xx_hal_msp.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/stm32f4xx_hal_msp.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/stm32f4xx_it.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/stm32f4xx_it.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/stm32f4xx_it.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/subdir.mk (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/syscalls.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/syscalls.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/syscalls.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/sysmem.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/sysmem.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/sysmem.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/system_stm32f4xx.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/system_stm32f4xx.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Src/system_stm32f4xx.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Startup/startup_stm32f446retx.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Startup/startup_stm32f446retx.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Core/Startup/subdir.mk (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/FreeRTOS_LED.elf (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/FreeRTOS_LED.list (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/FreeRTOS_LED.map (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/makefile (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/objects.list (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/objects.mk (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Debug/sources.mk (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/cmsis_armcc.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/cmsis_armclang.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/cmsis_compiler.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/cmsis_gcc.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/cmsis_iccarm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/cmsis_version.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_armv8mbl.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_armv8mml.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_cm0.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_cm0plus.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_cm1.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_cm23.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_cm3.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_cm33.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_cm4.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_cm7.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_sc000.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/core_sc300.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/mpu_armv7.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/mpu_armv8.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/Include/tz_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/CMSIS/LICENSE.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/FreeRTOS_LED.ioc (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/FreeRTOS_LED.launch (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/LICENSE (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/croutine.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/list.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/task.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/list.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/queue.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/tasks.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/Middlewares/Third_Party/FreeRTOS/Source/timers.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/STM32F446RETX_FLASH.ld (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/STM32F446RETX_RAM.ld (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/croutine.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/event_groups.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/FreeRTOS.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/StackMacros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/atomic.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/croutine.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/deprecated_definitions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/event_groups.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/list.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/message_buffer.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/mpu_prototypes.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/mpu_wrappers.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/portable.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/projdefs.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/queue.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/semphr.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/stack_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/stdint.readme (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/stream_buffer.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/task.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/include/timers.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/list.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/manifest.yml (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMClang/Use-the-GCC-ports.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/copy_files.py (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/context/secure_context.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/context/secure_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/heap/secure_heap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/heap/secure_heap.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/init/secure_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/init/secure_init.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ARMv8M/secure/macros/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/BCC/16BitDOS/Flsh186/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/BCC/16BitDOS/Flsh186/prtmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/BCC/16BitDOS/PC/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/BCC/16BitDOS/PC/prtmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/BCC/16BitDOS/common/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/BCC/16BitDOS/common/portcomn.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/ARM_CM3/portasm.asm (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/ARM_CM4F/portasm.asm (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/ARM_Cortex-R4/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/ARM_Cortex-R4/portASM.asm (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/ARM_Cortex-R4/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/MSP430X/data_model.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/MSP430X/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/MSP430X/portext.asm (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CCS/MSP430X/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CMakeLists.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CodeWarrior/ColdFire_V1/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CodeWarrior/ColdFire_V1/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CodeWarrior/ColdFire_V1/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CodeWarrior/ColdFire_V2/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CodeWarrior/ColdFire_V2/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CodeWarrior/ColdFire_V2/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CodeWarrior/HCS12/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/CodeWarrior/HCS12/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Common/mpu_wrappers.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91FR40008/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91FR40008/portISR.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91FR40008/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91SAM7S/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91SAM7S/portISR.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_AT91SAM7S/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_LPC2000/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_LPC2000/portISR.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_LPC2000/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_LPC23xx/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_LPC23xx/portISR.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM7_LPC23xx/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CA53_64_BIT/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CA53_64_BIT/portASM.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CA53_64_BIT/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CA53_64_BIT_SRE/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CA9/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CA9/portASM.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CA9/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM0/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM0/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM3_MPU/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM3_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM4_MPU/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM4_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM7/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM7/r0p1/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM7/r0p1/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/secure/secure_context_port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CR5/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CR5/portASM.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CR5/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CRx_No_GIC/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CRx_No_GIC/portASM.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ARM_CRx_No_GIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ATMega323/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ATMega323/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/AVR32_UC3/exception.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/AVR32_UC3/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/AVR32_UC3/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/AVR_AVRDx/README.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/AVR_Mega0/README.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/CORTUS_APS3/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/CORTUS_APS3/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ColdFire_V2/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ColdFire_V2/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/ColdFire_V2/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/H8S2329/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/H8S2329/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/HCS12/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/HCS12/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/IA32_flat/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/IA32_flat/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/IA32_flat/portASM.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/IA32_flat/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MCF5235/readme.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MSP430F449/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MSP430F449/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlaze/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlaze/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlaze/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlazeV8/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlazeV8/port_exceptions.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlazeV8/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlazeV8/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlazeV9/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlazeV9/port_exceptions.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlazeV9/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/MicroBlazeV9/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/NiosII/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/NiosII/port_asm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/NiosII/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/PPC405_Xilinx/FPU_Macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/PPC405_Xilinx/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/PPC405_Xilinx/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/PPC405_Xilinx/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/PPC440_Xilinx/FPU_Macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/PPC440_Xilinx/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/PPC440_Xilinx/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/PPC440_Xilinx/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/Documentation.url (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/chip_specific_extensions/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/portASM.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/portContext.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RISC-V/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RL78/isr_support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RL78/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RL78/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RL78/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX100/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX100/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX100/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX200/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX200/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX600/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX600/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX600/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX600v2/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX600v2/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX600v2/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX700v3_DPFPU/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX700v3_DPFPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/RX700v3_DPFPU/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/STR75x/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/STR75x/portISR.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/STR75x/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/TriCore_1782/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/TriCore_1782/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/GCC/TriCore_1782/porttrap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/78K0R/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/78K0R/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/78K0R/portasm.s26 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/78K0R/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CA5_No_GIC/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CA5_No_GIC/portASM.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CA5_No_GIC/portASM.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CA5_No_GIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CA9/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CA9/portASM.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CA9/portASM.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CA9/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM0/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM0/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM0/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM3/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM4F/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM4F_MPU/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM4F_MPU/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM4F_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM7/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM7/r0p1/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM7/r0p1/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM7/r0p1/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/secure/secure_context.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/secure/secure_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/secure/secure_heap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/secure/secure_heap.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/secure/secure_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/secure/secure_init.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85/secure/secure_port_macros.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85_NTZ/non_secure/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CRx_No_GIC/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CRx_No_GIC/portASM.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ARM_CRx_No_GIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ATMega323/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ATMega323/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/ATMega323/portmacro.s90 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR32_UC3/exception.s82 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR32_UC3/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR32_UC3/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR32_UC3/read.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR32_UC3/write.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR_AVRDx/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR_AVRDx/porthardware.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR_AVRDx/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR_AVRDx/portmacro.s90 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR_Mega0/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR_Mega0/porthardware.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR_Mega0/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AVR_Mega0/portmacro.s90 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/portasm.s79 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM7S64/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM9XE/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM9XE/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM9XE/portasm.s79 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/AtmelSAM9XE/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/LPC2000/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/LPC2000/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/LPC2000/portasm.s79 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/LPC2000/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/MSP430/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/MSP430/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/MSP430/portext.s43 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/MSP430/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/MSP430X/data_model.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/MSP430X/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/MSP430X/portext.s43 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/MSP430X/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RISC-V/Documentation.url (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RISC-V/chip_specific_extensions/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RISC-V/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RISC-V/portASM.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RISC-V/portContext.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RISC-V/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RISC-V/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RL78/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RL78/portasm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RL78/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX100/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX100/port_asm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX100/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX100/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX600/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX600/port_asm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX600/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX600/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX700v3_DPFPU/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX700v3_DPFPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RX700v3_DPFPU/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RXv2/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RXv2/port_asm.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RXv2/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/RXv2/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR71x/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR71x/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR71x/portasm.s79 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR71x/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR75x/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR75x/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR75x/portasm.s79 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR75x/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR91x/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR91x/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR91x/portasm.s79 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/STR91x/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/V850ES/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/V850ES/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/V850ES/portasm.s85 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/V850ES/portasm_Fx3.s85 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/V850ES/portasm_Hx2.s85 (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/IAR/V850ES/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Keil/See-also-the-RVDS-directory.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC18F/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC18F/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC18F/stdio.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC24_dsPIC/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC24_dsPIC/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MEC14xx/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MEC14xx/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MEC14xx/port_asm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MEC14xx/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MX/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MX/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MX/port_asm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MX/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MZ/ISR_Support.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MZ/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MZ/port_asm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MPLAB/PIC32MZ/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MSVC-MingW/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MSVC-MingW/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MemMang/ReadMe.url (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MemMang/heap_1.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MemMang/heap_2.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MemMang/heap_3.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MemMang/heap_4.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MemMang/heap_5.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MikroC/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/MikroC/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Paradigm/Tern_EE/large_untested/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Paradigm/Tern_EE/large_untested/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Paradigm/Tern_EE/large_untested/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Paradigm/Tern_EE/small/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Paradigm/Tern_EE/small/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Paradigm/Tern_EE/small/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM7_LPC21xx/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM7_LPC21xx/portASM.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM7_LPC21xx/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM7_LPC21xx/portmacro.inc (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CA9/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CA9/portASM.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CA9/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CA9/portmacro.inc (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM0/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM0/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM3/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM3/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM4_MPU/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM4_MPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM7/ReadMe.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM7/r0p1/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/RVDS/ARM_CM7/r0p1/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX100/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX100/port_asm.src (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX100/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX100/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX200/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX200/port_asm.src (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX200/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX200/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX600/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX600/port_asm.src (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX600/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX600/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX600v2/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX600v2/port_asm.src (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX600v2/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX600v2/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX700v3_DPFPU/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX700v3_DPFPU/port_asm.src (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX700v3_DPFPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/RX700v3_DPFPU/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/SH2A_FPU/ISR_Support.inc (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/SH2A_FPU/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/SH2A_FPU/portasm.src (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Renesas/SH2A_FPU/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Rowley/ARM7/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Rowley/MSP430F449/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Rowley/MSP430F449/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Rowley/MSP430F449/portext.asm (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Rowley/MSP430F449/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/SDCC/Cygnal/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/SDCC/Cygnal/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Softune/MB91460/__STD_LIB_sbrk.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Softune/MB91460/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Softune/MB91460/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Softune/MB96340/__STD_LIB_sbrk.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Softune/MB96340/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Softune/MB96340/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Tasking/ARM_CM4F/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Tasking/ARM_CM4F/port_asm.asm (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/Tasking/ARM_CM4F/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/CDK/T-HEAD_CK802/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/LICENSE (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/README.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_EM_HS/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_v1/arc_support.s (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_v1/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARC_v1/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARM_TFM/README.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ATmega/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ATmega/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/ATmega/readme.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Posix/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Posix/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/.gitignore (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/CMakeLists.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/LICENSE.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/README.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/include/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/library.cmake (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/RP2040/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/KnownIssues.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/LICENSE (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/Partner-Supported-Ports/README.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/README.md (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/Makefile (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/portasm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/portbenchmark.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/portclib.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/porttrace.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_api.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_config.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_context.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_context.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_init.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/WizC/PIC18/Drivers/Tick/Tick.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/WizC/PIC18/Drivers/Tick/isrTick.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/WizC/PIC18/Install.bat (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/WizC/PIC18/addFreeRTOS.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/WizC/PIC18/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/WizC/PIC18/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/oWatcom/16BitDOS/Flsh186/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/oWatcom/16BitDOS/Flsh186/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/oWatcom/16BitDOS/PC/port.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/oWatcom/16BitDOS/PC/portmacro.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/oWatcom/16BitDOS/common/portasm.h (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/oWatcom/16BitDOS/common/portcomn.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/portable/readme.txt (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/queue.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/sbom.spdx (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/stream_buffer.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/tasks.c (100%) rename tutorial01-stm32-pio-01/pio-01-02_olivia/{tutorial01-stm32-pio-01-02_files_olivia => }/timers.c (100%) diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.cproject b/tutorial01-stm32-pio-01/pio-01-02_olivia/.cproject similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.cproject rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.cproject diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.gitmodules b/tutorial01-stm32-pio-01/pio-01-02_olivia/.gitmodules similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.gitmodules rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.gitmodules diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.mxproject b/tutorial01-stm32-pio-01/pio-01-02_olivia/.mxproject similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.mxproject rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.mxproject diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.project b/tutorial01-stm32-pio-01/pio-01-02_olivia/.project similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.project rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.project diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/language.settings.xml b/tutorial01-stm32-pio-01/pio-01-02_olivia/.settings/language.settings.xml similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/language.settings.xml rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.settings/language.settings.xml diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/stm32cubeide.project.prefs b/tutorial01-stm32-pio-01/pio-01-02_olivia/.settings/stm32cubeide.project.prefs similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/.settings/stm32cubeide.project.prefs rename to tutorial01-stm32-pio-01/pio-01-02_olivia/.settings/stm32cubeide.project.prefs diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/CMakeLists.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/CMakeLists.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/CMakeLists.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/CMakeLists.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/FreeRTOSConfig.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/FreeRTOSConfig.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/FreeRTOSConfig.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/FreeRTOSConfig.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/app.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/app.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/app.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/app.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/main.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/main.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/main.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/main.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_hal_conf.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/stm32f4xx_hal_conf.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_hal_conf.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/stm32f4xx_hal_conf.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_it.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/stm32f4xx_it.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Inc/stm32f4xx_it.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Inc/stm32f4xx_it.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/app.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/app.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/app.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/app.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/freertos.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/freertos.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/freertos.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/freertos.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/main.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/main.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/main.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/main.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_hal_msp.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/stm32f4xx_hal_msp.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_hal_msp.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/stm32f4xx_hal_msp.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_it.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/stm32f4xx_it.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/stm32f4xx_it.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/stm32f4xx_it.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/syscalls.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/syscalls.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/syscalls.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/syscalls.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/sysmem.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/sysmem.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/sysmem.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/sysmem.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/system_stm32f4xx.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/system_stm32f4xx.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Src/system_stm32f4xx.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Src/system_stm32f4xx.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Startup/startup_stm32f446retx.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Startup/startup_stm32f446retx.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Core/Startup/startup_stm32f446retx.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Core/Startup/startup_stm32f446retx.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/app.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/app.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/app.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/app.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/app.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/app.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/app.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/freertos.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/freertos.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/freertos.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/freertos.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/freertos.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/freertos.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/freertos.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/main.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/main.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/main.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/main.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/main.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/main.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/main.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_hal_msp.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_hal_msp.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_hal_msp.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_it.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_it.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_it.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_it.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_it.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/stm32f4xx_it.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/stm32f4xx_it.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/syscalls.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/syscalls.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/syscalls.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/syscalls.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/syscalls.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/syscalls.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/syscalls.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/sysmem.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/sysmem.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/sysmem.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/sysmem.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/sysmem.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/sysmem.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/sysmem.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/system_stm32f4xx.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/system_stm32f4xx.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/system_stm32f4xx.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/system_stm32f4xx.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/system_stm32f4xx.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Src/system_stm32f4xx.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Src/system_stm32f4xx.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Startup/startup_stm32f446retx.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Startup/startup_stm32f446retx.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Startup/startup_stm32f446retx.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/startup_stm32f446retx.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Startup/startup_stm32f446retx.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Startup/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Core/Startup/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Core/Startup/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.elf b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/FreeRTOS_LED.elf similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.elf rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/FreeRTOS_LED.elf diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.list b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/FreeRTOS_LED.list similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.list rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/FreeRTOS_LED.list diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.map b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/FreeRTOS_LED.map similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/FreeRTOS_LED.map rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/FreeRTOS_LED.map diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/croutine.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/event_groups.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/list.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/queue.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/subdir.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/tasks.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.d diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.o diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/Middlewares/Third_Party/FreeRTOS/Source/timers.su diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/makefile b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/makefile similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/makefile rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/makefile diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.list b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/objects.list similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.list rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/objects.list diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/objects.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/objects.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/objects.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/sources.mk b/tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/sources.mk similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Debug/sources.mk rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Debug/sources.mk diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Device/ST/STM32F4xx/LICENSE.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armcc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_armcc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armcc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_armcc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armclang.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_armclang.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_armclang.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_armclang.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_compiler.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_compiler.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_compiler.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_compiler.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_gcc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_gcc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_gcc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_gcc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_iccarm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_version.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_version.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/cmsis_version.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/cmsis_version.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mbl.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_armv8mbl.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mbl.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_armv8mbl.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mml.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_armv8mml.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_armv8mml.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_armv8mml.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm0.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm0.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0plus.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm0plus.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm0plus.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm0plus.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm1.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm1.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm1.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm1.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm23.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm23.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm23.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm23.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm3.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm3.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm3.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm3.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm33.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm33.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm33.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm33.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm4.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm4.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm4.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm4.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm7.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm7.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_cm7.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_cm7.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc000.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_sc000.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc000.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_sc000.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc300.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_sc300.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/core_sc300.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/core_sc300.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv7.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/mpu_armv7.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv7.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/mpu_armv7.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv8.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/mpu_armv8.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/mpu_armv8.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/mpu_armv8.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/tz_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/tz_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/Include/tz_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/Include/tz_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/LICENSE.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/LICENSE.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/CMSIS/LICENSE.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/CMSIS/LICENSE.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_bus.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_cortex.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_dma.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_exti.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_gpio.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_pwr.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_rcc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_system.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_usart.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_utils.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/LICENSE.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.ioc b/tutorial01-stm32-pio-01/pio-01-02_olivia/FreeRTOS_LED.ioc similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.ioc rename to tutorial01-stm32-pio-01/pio-01-02_olivia/FreeRTOS_LED.ioc diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.launch b/tutorial01-stm32-pio-01/pio-01-02_olivia/FreeRTOS_LED.launch similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/FreeRTOS_LED.launch rename to tutorial01-stm32-pio-01/pio-01-02_olivia/FreeRTOS_LED.launch diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/LICENSE diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/croutine.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/StackMacros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/atomic.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/croutine.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/deprecated_definitions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/event_groups.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/list.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/message_buffer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_prototypes.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/mpu_wrappers.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/portable.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/projdefs.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/queue.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/semphr.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stack_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/task.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/include/timers.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/list.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/queue.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/tasks.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/Middlewares/Third_Party/FreeRTOS/Source/timers.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_FLASH.ld b/tutorial01-stm32-pio-01/pio-01-02_olivia/STM32F446RETX_FLASH.ld similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_FLASH.ld rename to tutorial01-stm32-pio-01/pio-01-02_olivia/STM32F446RETX_FLASH.ld diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_RAM.ld b/tutorial01-stm32-pio-01/pio-01-02_olivia/STM32F446RETX_RAM.ld similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/STM32F446RETX_RAM.ld rename to tutorial01-stm32-pio-01/pio-01-02_olivia/STM32F446RETX_RAM.ld diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/croutine.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/croutine.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/croutine.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/croutine.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/event_groups.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/event_groups.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/event_groups.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/event_groups.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/FreeRTOS.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/FreeRTOS.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/FreeRTOS.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/FreeRTOS.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/StackMacros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/StackMacros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/StackMacros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/StackMacros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/atomic.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/atomic.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/atomic.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/atomic.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/croutine.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/croutine.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/croutine.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/croutine.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/deprecated_definitions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/deprecated_definitions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/deprecated_definitions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/deprecated_definitions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/event_groups.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/event_groups.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/event_groups.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/event_groups.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/list.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/list.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/list.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/list.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/message_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/message_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/message_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/message_buffer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_prototypes.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/mpu_prototypes.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_prototypes.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/mpu_prototypes.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_wrappers.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/mpu_wrappers.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/mpu_wrappers.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/mpu_wrappers.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/portable.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/portable.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/portable.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/portable.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/projdefs.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/projdefs.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/projdefs.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/projdefs.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/queue.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/queue.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/queue.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/queue.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/semphr.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/semphr.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/semphr.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/semphr.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stack_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/stack_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stack_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/stack_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stdint.readme b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/stdint.readme similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stdint.readme rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/stdint.readme diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stream_buffer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/stream_buffer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/stream_buffer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/stream_buffer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/task.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/task.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/task.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/task.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/timers.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/include/timers.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/include/timers.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/include/timers.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/list.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/list.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/list.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/list.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/manifest.yml b/tutorial01-stm32-pio-01/pio-01-02_olivia/manifest.yml similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/manifest.yml rename to tutorial01-stm32-pio-01/pio-01-02_olivia/manifest.yml diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMClang/Use-the-GCC-ports.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMClang/Use-the-GCC-ports.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMClang/Use-the-GCC-ports.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMClang/Use-the-GCC-ports.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/copy_files.py b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/copy_files.py similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/copy_files.py rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/copy_files.py diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM23_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM55/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/GCC/ARM_CM85/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM23_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM33_NTZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM55/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portable/IAR/ARM_CM85/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM23/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/portable/GCC/ARM_CM33/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM23/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/portable/IAR/ARM_CM33/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/context/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/context/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/heap/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/heap/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/heap/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/heap/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/heap/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/init/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/init/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/init/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/init/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/init/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ARMv8M/secure/macros/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/Flsh186/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/Flsh186/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/Flsh186/prtmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/PC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/PC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/prtmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/PC/prtmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/PC/prtmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/PC/prtmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/common/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/common/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portcomn.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/common/portcomn.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/BCC/16BitDOS/common/portcomn.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/BCC/16BitDOS/common/portcomn.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portasm.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM3/portasm.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portasm.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM3/portasm.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portasm.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM4F/portasm.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portasm.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM4F/portasm.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_Cortex-R4/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_Cortex-R4/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_Cortex-R4/portASM.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/ARM_Cortex-R4/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/data_model.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/MSP430X/data_model.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/data_model.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/MSP430X/data_model.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/MSP430X/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/MSP430X/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portext.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/MSP430X/portext.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portext.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/MSP430X/portext.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/MSP430X/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CCS/MSP430X/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CCS/MSP430X/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CMakeLists.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CMakeLists.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CMakeLists.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CMakeLists.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V1/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V2/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/ColdFire_V2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/HCS12/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/HCS12/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/HCS12/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/CodeWarrior/HCS12/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/CodeWarrior/HCS12/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Common/mpu_wrappers.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Common/mpu_wrappers.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Common/mpu_wrappers.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Common/mpu_wrappers.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91FR40008/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91FR40008/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91FR40008/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91FR40008/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/ioat91sam7x256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/lib_AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_AT91SAM7S/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC2000/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC2000/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC2000/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC2000/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC2000/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC2000/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC2000/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC23xx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC23xx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC23xx/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC23xx/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM7_LPC23xx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA53_64_BIT_SRE/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA9/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA9/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA9/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CA9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CA9/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM23_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM3_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM3_MPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM3_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM4_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM4_MPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM4_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM55_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM7/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM7/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM7/r0p1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM7/r0p1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM7/r0p1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_context_port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CM85_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CR5/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CR5/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CR5/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CR5/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CR5/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CR5/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CR5/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CRx_No_GIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CRx_No_GIC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CRx_No_GIC/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ARM_CRx_No_GIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ATMega323/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ATMega323/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ATMega323/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ATMega323/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ATMega323/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/exception.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR32_UC3/exception.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/exception.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR32_UC3/exception.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR32_UC3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR32_UC3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR32_UC3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR32_UC3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR32_UC3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_AVRDx/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR_AVRDx/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_AVRDx/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR_AVRDx/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_Mega0/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR_Mega0/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/AVR_Mega0/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/AVR_Mega0/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/CORTUS_APS3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/CORTUS_APS3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/CORTUS_APS3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/CORTUS_APS3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/CORTUS_APS3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ColdFire_V2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ColdFire_V2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ColdFire_V2/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ColdFire_V2/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ColdFire_V2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/ColdFire_V2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/ColdFire_V2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/H8S2329/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/H8S2329/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/H8S2329/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/H8S2329/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/H8S2329/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/HCS12/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/HCS12/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/HCS12/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/HCS12/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/HCS12/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/IA32_flat/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/IA32_flat/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/IA32_flat/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/IA32_flat/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/IA32_flat/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/IA32_flat/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/IA32_flat/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/IA32_flat/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/IA32_flat/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MCF5235/readme.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MCF5235/readme.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MCF5235/readme.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MCF5235/readme.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MSP430F449/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MSP430F449/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MSP430F449/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MSP430F449/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MSP430F449/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlaze/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlaze/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlaze/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlaze/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlaze/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlaze/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlaze/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV8/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV8/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV8/port_exceptions.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV8/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV8/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV8/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV8/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV8/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV9/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV9/port_exceptions.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV9/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV9/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/MicroBlazeV9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/MicroBlazeV9/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/NiosII/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/NiosII/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/NiosII/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/NiosII/port_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/NiosII/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/NiosII/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/NiosII/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC405_Xilinx/FPU_Macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC405_Xilinx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC405_Xilinx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC405_Xilinx/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC405_Xilinx/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC405_Xilinx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC405_Xilinx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC405_Xilinx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC440_Xilinx/FPU_Macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC440_Xilinx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC440_Xilinx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC440_Xilinx/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC440_Xilinx/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC440_Xilinx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/PPC440_Xilinx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/PPC440_Xilinx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/Documentation.url b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/Documentation.url similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/Documentation.url rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/Documentation.url diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/Pulpino_Vega_RV32M1RM/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_MTIME_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/RISCV_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/chip_specific_extensions/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portASM.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/portASM.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portASM.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/portASM.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portContext.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/portContext.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portContext.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/portContext.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RISC-V/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RISC-V/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/isr_support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RL78/isr_support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/isr_support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RL78/isr_support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RL78/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RL78/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RL78/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RL78/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RL78/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RL78/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RL78/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX100/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX100/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX100/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX100/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX100/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX100/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX100/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX200/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX200/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX200/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX200/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX200/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600v2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600v2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600v2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600v2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600v2/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX600v2/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX600v2/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX700v3_DPFPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX700v3_DPFPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX700v3_DPFPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX700v3_DPFPU/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/RX700v3_DPFPU/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/RX700v3_DPFPU/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/STR75x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/STR75x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portISR.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/STR75x/portISR.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portISR.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/STR75x/portISR.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/STR75x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/STR75x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/STR75x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/TriCore_1782/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/TriCore_1782/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/TriCore_1782/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/TriCore_1782/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/porttrap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/TriCore_1782/porttrap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/GCC/TriCore_1782/porttrap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/GCC/TriCore_1782/porttrap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/78K0R/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/78K0R/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/78K0R/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/78K0R/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portasm.s26 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/78K0R/portasm.s26 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portasm.s26 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/78K0R/portasm.s26 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/78K0R/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/78K0R/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/78K0R/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA5_No_GIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA5_No_GIC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA5_No_GIC/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA5_No_GIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA9/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA9/portASM.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA9/portASM.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA9/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA9/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CA9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CA9/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM0/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM0/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM23_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM3/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM3/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM33_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F_MPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F_MPU/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM4F_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM55_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM7/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM7/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM7/r0p1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM7/r0p1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM7/r0p1/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM7/r0p1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_context.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_context.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_context_port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_heap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_heap.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_init.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_init.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_init.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85/secure/secure_port_macros.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CM85_NTZ/non_secure/portmacrocommon.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CRx_No_GIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CRx_No_GIC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CRx_No_GIC/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ARM_CRx_No_GIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ATMega323/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ATMega323/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ATMega323/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ATMega323/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.s90 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ATMega323/portmacro.s90 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/ATMega323/portmacro.s90 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/ATMega323/portmacro.s90 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/exception.s82 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/exception.s82 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/exception.s82 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/exception.s82 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/read.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/read.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/read.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/read.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/write.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/write.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR32_UC3/write.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR32_UC3/write.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_AVRDx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_AVRDx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_AVRDx/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_AVRDx/porthardware.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_AVRDx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_AVRDx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_AVRDx/portmacro.s90 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_Mega0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_Mega0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_Mega0/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_Mega0/porthardware.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_Mega0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_Mega0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.s90 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_Mega0/portmacro.s90 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AVR_Mega0/portmacro.s90 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AVR_Mega0/portmacro.s90 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7S64_inc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X128_inc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/AT91SAM7X256_inc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7S64.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X128.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/lib_AT91SAM7X256.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM7S64/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM7S64/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM9XE/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM9XE/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM9XE/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM9XE/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM9XE/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/AtmelSAM9XE/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/AtmelSAM9XE/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/LPC2000/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/LPC2000/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/LPC2000/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/LPC2000/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/LPC2000/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/LPC2000/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/LPC2000/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/LPC2000/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/LPC2000/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portext.s43 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430/portext.s43 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portext.s43 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430/portext.s43 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/data_model.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430X/data_model.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/data_model.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430X/data_model.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430X/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430X/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portext.s43 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430X/portext.s43 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portext.s43 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430X/portext.s43 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430X/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/MSP430X/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/MSP430X/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/Documentation.url b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/Documentation.url similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/Documentation.url rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/Documentation.url diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/chip_specific_extensions/RV32I_CLINT_no_extensions/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/chip_specific_extensions/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portContext.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/portContext.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portContext.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/portContext.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RISC-V/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RISC-V/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RL78/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RL78/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portasm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RL78/portasm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portasm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RL78/portasm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RL78/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RL78/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RL78/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX100/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX100/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX100/port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX100/port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX100/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX100/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX100/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX100/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX100/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX600/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX600/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX600/port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX600/port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX600/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX600/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX600/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX600/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX600/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX700v3_DPFPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX700v3_DPFPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX700v3_DPFPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX700v3_DPFPU/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RX700v3_DPFPU/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RX700v3_DPFPU/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RXv2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RXv2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port_asm.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RXv2/port_asm.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/port_asm.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RXv2/port_asm.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RXv2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RXv2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RXv2/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/RXv2/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/RXv2/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR71x/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR71x/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR71x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR71x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR71x/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR71x/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR71x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR71x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR71x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR75x/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR75x/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR75x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR75x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR75x/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR75x/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR75x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR75x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR75x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR91x/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR91x/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR91x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR91x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portasm.s79 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR91x/portasm.s79 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portasm.s79 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR91x/portasm.s79 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR91x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/STR91x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/STR91x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm.s85 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/portasm.s85 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm.s85 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/portasm.s85 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Fx3.s85 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/portasm_Fx3.s85 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Fx3.s85 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/portasm_Fx3.s85 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Hx2.s85 b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/portasm_Hx2.s85 similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portasm_Hx2.s85 rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/portasm_Hx2.s85 diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/IAR/V850ES/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/IAR/V850ES/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Keil/See-also-the-RVDS-directory.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Keil/See-also-the-RVDS-directory.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Keil/See-also-the-RVDS-directory.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Keil/See-also-the-RVDS-directory.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC18F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC18F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC18F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC18F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/stdio.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC18F/stdio.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC18F/stdio.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC18F/stdio.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC24_dsPIC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC24_dsPIC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC24_dsPIC/portasm_PIC24.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC24_dsPIC/portasm_dsPIC.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC24_dsPIC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MEC14xx/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MEC14xx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MEC14xx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MEC14xx/port_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MEC14xx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MX/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MX/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MX/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MX/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MX/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MX/port_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MX/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MX/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MX/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MZ/ISR_Support.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MZ/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MZ/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MZ/port_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/port_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MZ/port_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MZ/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MPLAB/PIC32MZ/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MPLAB/PIC32MZ/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MSVC-MingW/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MSVC-MingW/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MSVC-MingW/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MSVC-MingW/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MSVC-MingW/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/ReadMe.url b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/ReadMe.url similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/ReadMe.url rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/ReadMe.url diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_1.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_1.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_1.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_1.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_2.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_2.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_2.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_2.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_3.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_3.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_3.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_3.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_4.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_4.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_4.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_4.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_5.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_5.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MemMang/heap_5.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MemMang/heap_5.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MikroC/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MikroC/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MikroC/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/MikroC/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/MikroC/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/large_untested/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/large_untested/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/large_untested/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/large_untested/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/small/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/small/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/small/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/small/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/small/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Paradigm/Tern_EE/small/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Paradigm/Tern_EE/small/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM7_LPC21xx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM7_LPC21xx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM7_LPC21xx/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM7_LPC21xx/portmacro.inc diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CA9/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CA9/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portASM.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CA9/portASM.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portASM.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CA9/portASM.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CA9/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CA9/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.inc b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CA9/portmacro.inc similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CA9/portmacro.inc rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CA9/portmacro.inc diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM3/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM3/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM3/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM3/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM3/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM4_MPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM4_MPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM4_MPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/ReadMe.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM7/ReadMe.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/ReadMe.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM7/ReadMe.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM7/r0p1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM7/r0p1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/RVDS/ARM_CM7/r0p1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX100/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX100/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX100/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX100/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX100/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX100/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX100/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX100/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX100/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX200/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX200/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX200/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX200/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX200/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX200/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX200/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX200/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX200/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600v2/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600v2/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600v2/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600v2/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600v2/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600v2/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600v2/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX600v2/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX600v2/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX700v3_DPFPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX700v3_DPFPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX700v3_DPFPU/port_asm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX700v3_DPFPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/RX700v3_DPFPU/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/SH2A_FPU/ISR_Support.inc diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/SH2A_FPU/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/SH2A_FPU/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portasm.src b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/SH2A_FPU/portasm.src similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portasm.src rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/SH2A_FPU/portasm.src diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/SH2A_FPU/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Renesas/SH2A_FPU/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Renesas/SH2A_FPU/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/ARM7/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/ARM7/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/ARM7/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/ARM7/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/MSP430F449/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/MSP430F449/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/MSP430F449/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/MSP430F449/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portext.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/MSP430F449/portext.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portext.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/MSP430F449/portext.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/MSP430F449/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Rowley/MSP430F449/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Rowley/MSP430F449/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/SDCC/Cygnal/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/SDCC/Cygnal/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/SDCC/Cygnal/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/SDCC/Cygnal/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/SDCC/Cygnal/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB91460/__STD_LIB_sbrk.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB91460/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB91460/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB91460/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB91460/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB91460/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB96340/__STD_LIB_sbrk.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB96340/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB96340/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB96340/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Softune/MB96340/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Softune/MB96340/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Tasking/ARM_CM4F/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Tasking/ARM_CM4F/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port_asm.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Tasking/ARM_CM4F/port_asm.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/port_asm.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Tasking/ARM_CM4F/port_asm.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Tasking/ARM_CM4F/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/Tasking/ARM_CM4F/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/Tasking/ARM_CM4F/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/CDK/T-HEAD_CK802/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CODE_OF_CONDUCT.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/.github/CONTRIBUTING.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/.github/SECURITY.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/.github/pull_request_template.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portasm.asm diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/CCS/C2000_C28x/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/MSP430FR5969/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/RISC-V/chip_specific_extensions/THEAD_RV32/freertos_risc_v_chip_specific_extensions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/port.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/porttrap.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/GCC/TriCore_38xa/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/LICENSE diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Community-Supported-Ports/Z88DK/Z180/readme.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_freertos_exceptions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/freertos_tls.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_EM_HS/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/arc_freertos_exceptions.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/arc_support.s diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARC_v1/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARM_TFM/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ARM_TFM/os_wrapper_freertos.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ATmega/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ATmega/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ATmega/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/readme.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ATmega/readme.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/ATmega/readme.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/ATmega/readme.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/FreeRTOS-simulator-for-Linux.url diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Posix/utils/wait_for_event.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RISC-V/README-for-info-on-official-MIT-license-port.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/.gitignore b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/.gitignore similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/.gitignore rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/.gitignore diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/CMakeLists.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/FreeRTOS_Kernel_import.cmake diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/LICENSE.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/idle_task_static_memory.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/include/freertos_sdk_config.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/include/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/include/rp2040_config.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/library.cmake b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/library.cmake similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/library.cmake rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/library.cmake diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/pico_sdk_import.cmake diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/RP2040/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/RP2040/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/FreeRTOS-openocd.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/FreeRTOSConfig_arch.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/port_systick.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portbenchmark.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_api.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_config.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_rtos.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_timer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_common.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/port_systick.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_loadstore_handler.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_overlay_os_hook.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/KnownIssues.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/KnownIssues.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/KnownIssues.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/KnownIssues.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CODE_OF_CONDUCT.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/CONTRIBUTING.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/SECURITY.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/.github/pull_request_template.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/porthardware.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_AVRDx/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/porthardware.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/GCC/AVR_Mega0/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/LICENSE diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/Partner-Supported-Ports/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/README.md b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/README.md similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/README.md rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/README.md diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/Makefile b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/Makefile similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/Makefile rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/Makefile diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/portasm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/portbenchmark.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/portclib.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/porttrace.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/readme_xtensa.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_api.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_config.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_context.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_init.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_intr_asm.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_overlay_os_hook.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_rtos.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_timer.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/ThirdParty/XCC/Xtensa/xtensa_vectors.S diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/Drivers/Tick/Tick.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/Drivers/Tick/isrTick.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Install.bat b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/Install.bat similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/Install.bat rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/Install.bat diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/addFreeRTOS.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/addFreeRTOS.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/addFreeRTOS.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/addFreeRTOS.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/WizC/PIC18/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/WizC/PIC18/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/Flsh186/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/Flsh186/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/port.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/PC/port.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/port.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/PC/port.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/PC/portmacro.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portasm.h b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/common/portasm.h similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portasm.h rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/common/portasm.h diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portcomn.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/common/portcomn.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/oWatcom/16BitDOS/common/portcomn.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/oWatcom/16BitDOS/common/portcomn.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/readme.txt b/tutorial01-stm32-pio-01/pio-01-02_olivia/portable/readme.txt similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/portable/readme.txt rename to tutorial01-stm32-pio-01/pio-01-02_olivia/portable/readme.txt diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/queue.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/queue.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/queue.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/queue.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/sbom.spdx b/tutorial01-stm32-pio-01/pio-01-02_olivia/sbom.spdx similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/sbom.spdx rename to tutorial01-stm32-pio-01/pio-01-02_olivia/sbom.spdx diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/stream_buffer.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/stream_buffer.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/stream_buffer.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/stream_buffer.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/tasks.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/tasks.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/tasks.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/tasks.c diff --git a/tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/timers.c b/tutorial01-stm32-pio-01/pio-01-02_olivia/timers.c similarity index 100% rename from tutorial01-stm32-pio-01/pio-01-02_olivia/tutorial01-stm32-pio-01-02_files_olivia/timers.c rename to tutorial01-stm32-pio-01/pio-01-02_olivia/timers.c

    pRi3xPfy~THMfiE-h~4WG41i9c^PLFD-83%u0)! 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 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su new file mode 100644 index 0000000..75d1e86 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su @@ -0,0 +1,61 @@ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:357:19:HAL_UART_Init 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:434:19:HAL_HalfDuplex_Init 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:507:19:HAL_LIN_Init 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:588:19:HAL_MultiProcessor_Init 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:665:19:HAL_UART_DeInit 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:710:13:HAL_UART_MspInit 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:725:13:HAL_UART_MspDeInit 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1136:19:HAL_UART_Transmit 48 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1224:19:HAL_UART_Receive 48 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1315:19:HAL_UART_Transmit_IT 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1360:19:HAL_UART_Receive_IT 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1395:19:HAL_UART_Transmit_DMA 56 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1463:19:HAL_UART_Receive_DMA 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1493:19:HAL_UART_DMAPause 120 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1530:19:HAL_UART_DMAResume 120 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1569:19:HAL_UART_DMAStop 72 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1624:19:HAL_UARTEx_ReceiveToIdle 40 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1751:19:HAL_UARTEx_ReceiveToIdle_IT 56 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1812:19:HAL_UARTEx_ReceiveToIdle_DMA 56 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1869:19:HAL_UART_Abort 136 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:1958:19:HAL_UART_AbortTransmit 64 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2009:19:HAL_UART_AbortReceive 112 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2070:19:HAL_UART_Abort_IT 144 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2205:19:HAL_UART_AbortTransmit_IT 64 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2282:19:HAL_UART_AbortReceive_IT 112 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2360:6:HAL_UART_IRQHandler 240 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2592:13:HAL_UART_TxCpltCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2607:13:HAL_UART_TxHalfCpltCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2622:13:HAL_UART_RxCpltCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2637:13:HAL_UART_RxHalfCpltCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2652:13:HAL_UART_ErrorCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2666:13:HAL_UART_AbortCpltCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2681:13:HAL_UART_AbortTransmitCpltCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2696:13:HAL_UART_AbortReceiveCpltCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2713:13:HAL_UARTEx_RxEventCallback 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2753:19:HAL_LIN_SendBreak 40 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2780:19:HAL_MultiProcessor_EnterMuteMode 40 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2807:19:HAL_MultiProcessor_ExitMuteMode 40 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2834:19:HAL_HalfDuplex_EnableTransmitter 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2869:19:HAL_HalfDuplex_EnableReceiver 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2926:23:HAL_UART_GetState 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2941:10:HAL_UART_GetError 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:2986:13:UART_DMATransmitCplt 72 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3021:13:UART_DMATxHalfCplt 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3040:13:UART_DMAReceiveCplt 120 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3097:13:UART_DMARxHalfCplt 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3132:13:UART_DMAError 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3174:26:UART_WaitOnFlagUntilTimeout 72 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3213:19:UART_Start_Receive_IT 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3251:19:UART_Start_Receive_DMA 104 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3304:13:UART_EndTxTransfer 40 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3318:13:UART_EndRxTransfer 88 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3342:13:UART_DMAAbortOnError 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3366:13:UART_DMATxAbortCallback 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3412:13:UART_DMARxAbortCallback 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3458:13:UART_DMATxOnlyAbortCallback 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3486:13:UART_DMARxOnlyAbortCallback 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3512:26:UART_Transmit_IT 24 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3552:26:UART_EndTransmit_IT 16 static +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3577:26:UART_Receive_IT 56 static,ignoring_inline_asm +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c:3675:13:UART_SetConfig 288 static diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk new file mode 100644 index 0000000..de94547 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk @@ -0,0 +1,72 @@ +################################################################################ +# Automatically-generated file. Do not edit! +# Toolchain: GNU Tools for STM32 (10.3-2021.10) +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c \ +../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c + +OBJS += \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o + +C_DEPS += \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d \ +./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d + + +# Each subdirectory must supply rules for building sources it contributes +Drivers/STM32F4xx_HAL_Driver/Src/%.o Drivers/STM32F4xx_HAL_Driver/Src/%.su: ../Drivers/STM32F4xx_HAL_Driver/Src/%.c Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk + arm-none-eabi-gcc "$<" -mcpu=cortex-m4 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F446xx -c -I../Core/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I../Drivers/CMSIS/Include -I../Middlewares/Third_Party/FreeRTOS/Source/include -I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS -I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"$(@:%.o=%.d)" -MT"$@" --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "$@" + +clean: clean-Drivers-2f-STM32F4xx_HAL_Driver-2f-Src + +clean-Drivers-2f-STM32F4xx_HAL_Driver-2f-Src: + -$(RM) ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o ./Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.su + +.PHONY: clean-Drivers-2f-STM32F4xx_HAL_Driver-2f-Src + diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.elf b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/FreeRTOS_LED.elf new file mode 100644 index 0000000000000000000000000000000000000000..3b615db7db96ea0d65f6b62638c4f32d0e2bcff4 GIT binary patch literal 1237148 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

    PwZg5E>bH>@iIHUhP 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 literal 0 HcmV?d00001 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.su new file mode 100644 index 0000000..e69de29 diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d new file mode 100644 index 0000000..dd6a601 --- /dev/null +++ b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.d @@ -0,0 +1,54 @@ +Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o: \ + ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h \ + ../Core/Inc/stm32f4xx_hal_conf.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h \ + ../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h: +../Core/Inc/stm32f4xx_hal_conf.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_exti.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h: +../Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h: diff --git a/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o b/tutorial01-stm32-pio-01/tutorial01-stm32-pio-01-02_olivia/FreeRTOS_LED/Debug/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.o new file mode 100644 index 0000000000000000000000000000000000000000..d8e30b7080a1b2ed9c1dc15ae6b4ebd01d05a5b7 GIT binary patch literal 1139088 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

    YWnto< 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ΜZ~6bx$Q`%RrGZKUmBrorO<@ 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⩔l7KHv7~3j=z|>Ke`tVhChfHOmtC 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

oqu%-v}EwxePBJ4|2FN& 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